From 7434b789faa2579a23d524e0ce88af820fac260c Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 10:47:08 +0200 Subject: [PATCH 01/26] Bumped dependencies to latest --- package-lock.json | 7299 ++++++++++++++++++++++++++++++++++----------- package.json | 23 +- 2 files changed, 5619 insertions(+), 1703 deletions(-) diff --git a/package-lock.json b/package-lock.json index eb8269b..4fb4fde 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,66 +1,4575 @@ { "name": "cypress-commands", "version": "2.0.0", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "version": "2.0.0", + "license": "MIT", + "devDependencies": { + "chai-string": "^1.5.0", + "cypress": "^8.3.1", + "eslint": "^7.32.0", + "eslint-config-google": "^0.14.0", + "eslint-plugin-cypress": "^2.11.3", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-sonarjs": "^0.10.0", + "request": "^2.88.2", + "rollup": "^2.56.3", + "rollup-plugin-commonjs": "^10.1.0", + "rollup-plugin-copy": "^3.4.0", + "rollup-plugin-delete": "^2.0.0", + "rollup-plugin-json": "^4.0.0", + "start-server-and-test": "^1.14.0", + "static-server": "^2.2.1", + "typescript": "^4.4.2" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@cypress/request": { + "version": "2.88.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz", + "integrity": "sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@eslint/eslintrc/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/@hapi/hoek": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", + "dev": true + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", + "dev": true + }, + "node_modules/@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 + }, + "node_modules/@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true + }, + "node_modules/@types/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "dev": true, + "dependencies": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "14.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz", + "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==", + "dev": true + }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.3.tgz", + "integrity": "sha512-E1dU4fzC9wN2QK2Cr1MLCfyHM8BoNnRFvuf45LYMPNDA+WqbNzC45S4UzPxvp1fFJ1rvSGU0bPvdd35VLmXG8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.2.tgz", + "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", + "dev": true + }, + "node_modules/@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-includes": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", + "is-string": "^1.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", + "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==", + "dev": true + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", + "dev": true + }, + "node_modules/axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.10.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "node_modules/chai-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chai-string/-/chai-string-1.5.0.tgz", + "integrity": "sha512-sydDC3S3pNAQMYwJrs6dQX0oBQ6KfIPuOZ78n7rocW0eJJlsHPh2t3kwW7xfwYA/1Bf6/arGtSUo16rxR2JFlw==", + "dev": true + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/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/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha1-FCD/sQ/URNz8ebQ4kbv//TKoRgA=", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-table3": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.0.tgz", + "integrity": "sha512-gnB85c3MGC7Nm9I/FkiasNBOKjOiO1RNuXXarQms37q4QMpWdlbBgD/VnOStA2faG1dpXMv31RFApjX1/QdgWQ==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "colors": "^1.1.2" + } + }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colorette": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", + "dev": true + }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "node_modules/common-tags": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", + "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cypress": { + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.3.1.tgz", + "integrity": "sha512-1v6pfx+/5cXhaT5T6QKOvnkawmEHWHLiVzm3MYMoQN1fkX2Ma1C32STd3jBStE9qT5qPSTILjGzypVRxCBi40g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.6", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "^6.0.2", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.0", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.5", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "ramda": "~0.27.1", + "request-progress": "^3.0.0", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "url": "^0.11.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cypress/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "dependencies": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob/node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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=", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", + "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", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "functional-red-black-tree": "^1.0.1", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", + "ignore": "^4.0.6", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.0.4", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "progress": "^2.0.0", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-google": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz", + "integrity": "sha512-WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "pkg-dir": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-cypress": { + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz", + "integrity": "sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q==", + "dev": true, + "dependencies": { + "globals": "^11.12.0" + }, + "peerDependencies": { + "eslint": ">= 3.2.1" + } + }, + "node_modules/eslint-plugin-cypress/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", + "has": "^1.0.3", + "is-core-module": "^2.6.0", + "minimatch": "^3.0.4", + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/eslint-plugin-sonarjs": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.10.0.tgz", + "integrity": "sha512-FBRIBmWQh2UAfuLSnuYEfmle33jIup9hfkR0X8pkfjeCKNpHUG8qyZI63ahs3aw8CJrv47QJ9ccdK3ZxKH016A==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/eslint-scope": { + "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, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" + } + }, + "node_modules/eventemitter2": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz", + "integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==", + "dev": true + }, + "node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "node_modules/fastq": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.1.tgz", + "integrity": "sha512-mpIH5sKYueh3YyeJwqtVo8sORi0CgtmkVbK6kZStpQlZBYQuTzG2CZ7idSiJuA7bY0SFCWUc5WIs+oYumGCQNw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-size": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/file-size/-/file-size-0.0.5.tgz", + "integrity": "sha1-BX1Dw6Ptc12j+Q1gUqs4Dx5tXjs=", + "dev": true + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "node_modules/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globals": { + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", + "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", + "dev": true + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, + "dependencies": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/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, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", + "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.1.1" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "dev": true, + "dependencies": { + "isobject": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", + "integrity": "sha512-W1iHHv/oyBb2pPxkBxtaewxa1BC58Pn5J0hogyCdefwUIvb6R+TGbAcIa4qPNYLqLhb3EnOgUf2MQkkF76BcKw==", + "dev": true, + "dependencies": { + "@types/estree": "0.0.39" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "node_modules/joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "dev": true, + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/listr2": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.1.tgz", + "integrity": "sha512-ZXQvQfmH9iWLlb4n3hh31yicXDxlzB0pE7MM1zu6kgbVL4ivEsO4H8IPh4E682sC8RjnYO9anose+zT52rrpyg==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + } + }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", + "dev": true + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", + "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "node_modules/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==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.26", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", + "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", + "dev": true, + "dependencies": { + "mime-db": "1.43.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/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/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha1-EnZjl3Sj+O8lcvf+QoDg6kVQwHs=", + "dev": true + }, + "node_modules/p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "dependencies": { + "p-try": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "engines": { + "node": ">=4" + } + }, + "node_modules/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=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "dev": true, + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/path-type/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", + "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "dev": true, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "dependencies": { + "find-up": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ps-tree": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.2.0.tgz", + "integrity": "sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==", + "dev": true, + "dependencies": { + "event-stream": "=3.3.4" + }, + "bin": { + "ps-tree": "bin/ps-tree.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/psl": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", + "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true, + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/ramda": { + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", + "dev": true + }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "dev": true, + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha1-TKdUCBx/7GP1BeT6qCWqBs1mnb4=", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dev": true, + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.56.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz", + "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-commonjs": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-10.1.0.tgz", + "integrity": "sha512-jlXbjZSQg8EIeAAvepNwhJj++qJWNJw1Cl0YnOqKtP5Djx+fFGkp3WRh+W0ASCaFG5w1jhmzDxgu3SJuVxPF4Q==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1", + "is-reference": "^1.1.2", + "magic-string": "^0.25.2", + "resolve": "^1.11.0", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-copy": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", + "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", + "dev": true, + "dependencies": { + "@types/fs-extra": "^8.0.1", + "colorette": "^1.1.0", + "fs-extra": "^8.1.0", + "globby": "10.0.1", + "is-plain-object": "^3.0.0" + }, + "engines": { + "node": ">=8.3" + } + }, + "node_modules/rollup-plugin-delete": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", + "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", + "dev": true, + "dependencies": { + "del": "^5.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/rollup-plugin-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-4.0.0.tgz", + "integrity": "sha512-hgb8N7Cgfw5SZAkb3jf0QXii6QX/FOkiIq2M7BAQIEydjHvTyxXHQiIzZaTFgx1GK0cRCHOCBHIyEkkLdWKxow==", + "dev": true, + "dependencies": { + "rollup-pluginutils": "^2.5.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.1.tgz", + "integrity": "sha512-J5oAoysWar6GuZo0s+3bZ6sVZAC0pfqKz68De7ZgDi5z63jOVZn1uJL/+z1jeKHNbGII8kAyHF5q8LnxSX5lQg==", + "dev": true, + "dependencies": { + "estree-walker": "^0.6.1" + } + }, + "node_modules/run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "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/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.6.tgz", + "integrity": "sha512-1ZooVLYFxC448piVLBbtOxFcXwnymH9oUF8nRd3CuYDVvkRBxRl6pB4Mtas5a4drtL+E8LDgFkQNcgIw6tc8Hg==", + "dev": true + }, + "node_modules/spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", + "dev": true + }, + "node_modules/split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "dependencies": { + "through": "2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/start-server-and-test": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz", + "integrity": "sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==", + "dev": true, + "dependencies": { + "bluebird": "3.7.2", + "check-more-types": "2.24.0", + "debug": "4.3.2", + "execa": "5.1.1", + "lazy-ass": "1.6.0", + "ps-tree": "1.2.0", + "wait-on": "6.0.0" + }, + "bin": { + "server-test": "src/bin/start.js", + "start-server-and-test": "src/bin/start.js", + "start-test": "src/bin/start.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/start-server-and-test/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/start-server-and-test/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/start-server-and-test/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/static-server": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/static-server/-/static-server-2.2.1.tgz", + "integrity": "sha512-j5eeW6higxYNmXMIT8iHjsdiViTpQDthg7o+SHsRtqdbxscdHqBHXwrXjHC8hL3F0Tsu34ApUpDkwzMBPBsrLw==", + "dev": true, + "dependencies": { + "chalk": "^0.5.1", + "commander": "^2.3.0", + "file-size": "0.0.5", + "mime": "^1.2.11", + "opn": "^5.2.0" + }, + "bin": { + "static-server": "bin/static-server.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/static-server/node_modules/ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-server/node_modules/ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-server/node_modules/chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "dependencies": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-server/node_modules/has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "dependencies": { + "ansi-regex": "^0.2.0" + }, + "bin": { + "has-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-server/node_modules/strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "dependencies": { + "ansi-regex": "^0.2.1" + }, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-server/node_modules/supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true, + "bin": { + "supports-color": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "dependencies": { + "duplexer": "~0.1.1" + } + }, + "node_modules/string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/table": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/wait-on": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", + "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", + "dev": true, + "dependencies": { + "axios": "^0.21.1", + "joi": "^17.4.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.1.0" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/wait-on/node_modules/rxjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", + "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", + "dev": true, + "dependencies": { + "tslib": "~2.1.0" + } + }, + "node_modules/wait-on/node_modules/tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + } + }, "dependencies": { "@babel/code-frame": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", - "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", "dev": true, "requires": { - "@babel/highlight": "^7.8.3" + "@babel/highlight": "^7.10.4" } }, + "@babel/helper-validator-identifier": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz", + "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==", + "dev": true + }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.14.5", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" - } - }, - "@cypress/listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@cypress/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-p3SS9LEdzHxEajSz4ochr9M8ZCo=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "cli-cursor": "^1.0.2", - "date-fns": "^1.27.2", - "figures": "^1.7.0" }, "dependencies": { + "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==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "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": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "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==", + "dev": true, + "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=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, "@cypress/request": { - "version": "2.88.5", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.5.tgz", - "integrity": "sha512-TzEC1XMi1hJkywWpRfD2clreTa/Z+lOrXDCxxBTBPEcY5azdPi56A6Xw+O4tWJnaJH3iIE7G5aDXZC6JgRZLcA==", + "version": "2.88.6", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.6.tgz", + "integrity": "sha512-z0UxBE/+qaESAHY9p9sM2h8Y4XqtsbDCt0/DPOrqA/RZgKi4PkxdpXyK4wCCnSk1xHqWHZZAE+gV6aDAR6+caQ==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -76,13 +4585,20 @@ "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "uuid": "^8.3.2" + }, + "dependencies": { + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + } } }, "@cypress/xvfb": { @@ -106,52 +4622,75 @@ } } }, - "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==", - "dev": true - }, - "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==", - "dev": true + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + } + } }, "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.0.tgz", + "integrity": "sha512-sqKVVVOe5ivCaXDWivIJYVSaEgdQK9ul7a4Kity5Iw7u9+wBAPbX1RMSnLLmp7O4Vzj0WOWwMAJsTL00xwaNug==", "dev": true }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" + "@hapi/hoek": "^9.0.0" } }, - "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==", - "dev": true - }, - "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "requires": { - "@hapi/hoek": "^8.3.0" + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" } }, + "@humanwhocodes/object-schema": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", + "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "dev": true + }, "@nodelib/fs.scandir": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", @@ -178,19 +4717,25 @@ "fastq": "^1.6.0" } }, - "@samverschueren/stream-to-observable": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.1.tgz", - "integrity": "sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==", + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", "dev": true, "requires": { - "any-observable": "^0.3.0" + "@hapi/hoek": "^9.0.0" } }, - "@types/color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==", + "dev": true + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true }, "@types/estree": { @@ -225,6 +4770,12 @@ "@types/node": "*" } }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "dev": true + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -232,15 +4783,15 @@ "dev": true }, "@types/node": { - "version": "12.0.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.10.tgz", - "integrity": "sha512-LcsGbPomWsad6wmMNv7nBLw7YYYyfdYcz6xryKYQhx89c3XXan+8Q6AJ43G5XDIaklaVkK3mE4fCb0SBvMiPSQ==", + "version": "14.17.14", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.14.tgz", + "integrity": "sha512-rsAj2u8Xkqfc332iXV12SqIsjVi07H479bOP4q94NAcjzmAvapumEhuVIt53koEf7JFrpjgNKjBga5Pnn/GL8A==", "dev": true }, "@types/sinonjs__fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.1.tgz", - "integrity": "sha512-yYezQwGWty8ziyYLdZjwxyMb0CZR49h8JALHGrxjQHWlqGgc8kLdHEgWrgL0uZ29DMvEVBDnHU2Wg36zKSIUtA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-6.0.3.tgz", + "integrity": "sha512-E1dU4fzC9wN2QK2Cr1MLCfyHM8BoNnRFvuf45LYMPNDA+WqbNzC45S4UzPxvp1fFJ1rvSGU0bPvdd35VLmXG8g==", "dev": true }, "@types/sizzle": { @@ -249,17 +4800,38 @@ "integrity": "sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==", "dev": true }, + "@types/yauzl": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.9.2.tgz", + "integrity": "sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==", - "dev": true + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, + "aggregate-error": { + "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", + "indent-string": "^4.0.0" + } }, "ajv": { "version": "6.10.0", @@ -273,34 +4845,48 @@ "uri-js": "^4.2.2" } }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", "dev": true }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + } + } + }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "any-observable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", - "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", - "dev": true + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } }, "arch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/arch/-/arch-2.1.2.tgz", - "integrity": "sha512-NTBIIbAfkJeIletyABbVtdPgeKfDafR+1mZV/AyyfC1UkVkp9iUjV+wwmqtUgphHYajbI86jejBJp5e+jkGTiQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", "dev": true }, "argparse": { @@ -313,13 +4899,15 @@ } }, "array-includes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.1.tgz", - "integrity": "sha512-c2VXaCHl7zPsvpkFsw4nxvFie4fh1ur9bpcgsVkIjqn0H/Xwdg+7fv3n2r/isyS8EBj5b06M9kHyZuIr4El6WQ==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz", + "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0", + "es-abstract": "^1.18.0-next.2", + "get-intrinsic": "^1.1.1", "is-string": "^1.0.5" } }, @@ -329,20 +4917,15 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, "array.prototype.flat": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz", - "integrity": "sha512-gBlRZV0VSmfPIeWfuuy56XZMvbVfbEUnOXUvt3F/eUUUSyzlgLxhEX4YAEpxNAogRGehPSnfXyPtYyKAhkzQhQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz", + "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==", "dev": true, "requires": { + "call-bind": "^1.0.0", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" + "es-abstract": "^1.18.0-next.1" } }, "asn1": { @@ -361,9 +4944,9 @@ "dev": true }, "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true }, "async": { @@ -396,6 +4979,15 @@ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", "dev": true }, + "axios": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", + "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", + "dev": true, + "requires": { + "follow-redirects": "^1.10.0" + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -448,18 +5040,22 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "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==", - "dev": true - }, "cachedir": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", "dev": true }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -479,33 +5075,26 @@ "dev": true }, "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "dependencies": { - "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==", + "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": { - "color-convert": "^1.9.0" + "has-flag": "^4.0.0" } } } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, "check-more-types": { "version": "2.24.0", "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", @@ -513,18 +5102,24 @@ "dev": true }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", "dev": true }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "^1.0.1" + "restore-cursor": "^3.1.0" } }, "cli-table3": { @@ -539,68 +5134,34 @@ } }, "cli-truncate": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", - "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "requires": { - "slice-ansi": "0.0.4", - "string-width": "^1.0.1" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" } }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, "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==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "colorette": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.1.0.tgz", - "integrity": "sha512-6S062WDQUXi6hOfkO/sBPVwE5ASXY4G2+b4atvhJfSsuUUhIaUKlkjLe9692Ipyt5/a+IPF5aVTu3V5gvXq5cg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz", + "integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==", "dev": true }, "colors": { @@ -637,24 +5198,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -662,136 +5205,95 @@ "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dev": true, "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "cypress": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-5.0.0.tgz", - "integrity": "sha512-jhPd0PMO1dPSBNpx6pHVLkmnnaTfMy3wCoacHAKJ9LJG06y16zqUNSFri64N4BjuGe8y6mNMt8TdgKnmy9muCg==", + "version": "8.3.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-8.3.1.tgz", + "integrity": "sha512-1v6pfx+/5cXhaT5T6QKOvnkawmEHWHLiVzm3MYMoQN1fkX2Ma1C32STd3jBStE9qT5qPSTILjGzypVRxCBi40g==", "dev": true, "requires": { - "@cypress/listr-verbose-renderer": "^0.4.1", - "@cypress/request": "^2.88.5", + "@cypress/request": "^2.88.6", "@cypress/xvfb": "^1.2.4", - "@types/sinonjs__fake-timers": "^6.0.1", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "^6.0.2", "@types/sizzle": "^2.3.2", - "arch": "^2.1.2", - "blob-util": "2.0.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", "bluebird": "^3.7.2", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", "cli-table3": "~0.6.0", - "commander": "^4.1.1", + "commander": "^5.1.0", "common-tags": "^1.8.0", - "debug": "^4.1.1", - "eventemitter2": "^6.4.2", - "execa": "^4.0.2", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", "executable": "^4.1.1", - "extract-zip": "^1.7.0", - "fs-extra": "^9.0.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.3.2", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", - "listr": "^0.14.3", - "lodash": "^4.17.19", + "listr2": "^3.8.3", + "lodash": "^4.17.21", "log-symbols": "^4.0.0", "minimist": "^1.2.5", - "moment": "^2.27.0", "ospath": "^1.2.2", - "pretty-bytes": "^5.3.0", - "ramda": "~0.26.1", + "pretty-bytes": "^5.6.0", + "ramda": "~0.27.1", "request-progress": "^3.0.0", - "supports-color": "^7.1.0", + "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", "url": "^0.11.0", "yauzl": "^2.10.0" }, "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true }, "fs-extra": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz", - "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", "dev": true, "requires": { "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, - "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 - }, "jsonfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz", - "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "requires": { "graceful-fs": "^4.1.6", - "universalify": "^1.0.0" + "universalify": "^2.0.0" } }, "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "version": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { @@ -799,9 +5301,9 @@ } }, "universalify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz", - "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } @@ -815,19 +5317,19 @@ "assert-plus": "^1.0.0" } }, - "date-fns": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", - "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dayjs": { + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.10.6.tgz", + "integrity": "sha512-AztC/IOW4L1Q41A86phW5Thhcrco3xuAA+YX/BLpLWWjRcTj5TOt/QImBLmCKlrF7u7k47arTnOyL6GnbG8Hvw==", "dev": true }, "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", "dev": true, "requires": { - "ms": "^2.1.1" + "ms": "2.1.2" } }, "deep-is": { @@ -845,56 +5347,30 @@ "object-keys": "^1.0.12" } }, - "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "dependencies": { - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "del": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" + }, + "dependencies": { + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "aggregate-error": "^3.0.0" } - }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true } } }, @@ -946,12 +5422,6 @@ "safer-buffer": "^2.1.0" } }, - "elegant-spinner": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", - "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", - "dev": true - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -967,6 +5437,15 @@ "once": "^1.4.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + } + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -977,22 +5456,28 @@ } }, "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", + "version": "1.18.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz", + "integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==", "dev": true, "requires": { + "call-bind": "^1.0.2", "es-to-primitive": "^1.2.1", "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.3", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.3", + "is-string": "^1.0.6", + "object-inspect": "^1.11.0", "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" } }, "es-to-primitive": { @@ -1013,79 +5498,64 @@ "dev": true }, "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@babel/code-frame": "^7.0.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", "debug": "^4.0.1", "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", + "enquirer": "^2.3.5", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", + "esquery": "^1.4.0", "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", + "glob-parent": "^5.1.2", + "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", - "optionator": "^0.8.3", + "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", + "regexpp": "^3.1.0", + "semver": "^7.2.1", + "strip-ansi": "^6.0.0", + "strip-json-comments": "^3.1.0", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "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 }, - "debug": { - "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" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } } } }, @@ -1096,72 +5566,51 @@ "dev": true }, "eslint-import-resolver-node": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.3.tgz", - "integrity": "sha512-b8crLDo0M5RSe5YG8Pu2DYBj71tSB6OvXkfzwbJU2w7y8P4/yo0MyF8jU26IEuEuHF2K5/gcAJE3LhQGqBBbVg==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", "dev": true, "requires": { - "debug": "^2.6.9", - "resolve": "^1.13.1" + "debug": "^3.2.7", + "resolve": "^1.20.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "path-parse": "^1.0.6" + "ms": "^2.1.1" } } } }, "eslint-module-utils": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.5.2.tgz", - "integrity": "sha512-LGScZ/JSlqGKiT8OC+cYRxseMjyqt6QO54nl281CK93unD89ijSeRV6An8Ci/2nvWVKe8K/Tqdm75RQoIOCr+Q==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz", + "integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==", "dev": true, "requires": { - "debug": "^2.6.9", + "debug": "^3.2.7", "pkg-dir": "^2.0.0" }, "dependencies": { "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, "eslint-plugin-cypress": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.10.3.tgz", - "integrity": "sha512-CvFeoCquShfO8gHNIKA1VpUTz78WtknMebLemBd1lRbcmJNjwpqCqpQYUG/XVja8GjdX/e2TJXYa+EUBxehtUg==", + "version": "2.11.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.11.3.tgz", + "integrity": "sha512-hOoAid+XNFtpvOzZSNWP5LDrQBEJwbZwjib4XJ1KcRYKjeVj0mAmPmucG4Egli4j/aruv+Ow/acacoloWWCl9Q==", "dev": true, "requires": { "globals": "^11.12.0" @@ -1176,23 +5625,26 @@ } }, "eslint-plugin-import": { - "version": "2.20.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.20.1.tgz", - "integrity": "sha512-qQHgFOTjguR+LnYRoToeZWT62XM55MBVXObHM6SKFd1VzDcX/vqT1kAz8ssqigh5eMj8qXcRoXXGZpPP6RfdCw==", + "version": "2.24.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz", + "integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==", "dev": true, "requires": { - "array-includes": "^3.0.3", - "array.prototype.flat": "^1.2.1", - "contains-path": "^0.1.0", + "array-includes": "^3.1.3", + "array.prototype.flat": "^1.2.4", "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.4.1", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.6.2", + "find-up": "^2.0.0", "has": "^1.0.3", + "is-core-module": "^2.6.0", "minimatch": "^3.0.4", - "object.values": "^1.1.0", - "read-pkg-up": "^2.0.0", - "resolve": "^1.12.0" + "object.values": "^1.1.4", + "pkg-up": "^2.0.0", + "read-pkg-up": "^3.0.0", + "resolve": "^1.20.0", + "tsconfig-paths": "^3.11.0" }, "dependencies": { "debug": { @@ -1205,13 +5657,12 @@ } }, "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" + "esutils": "^2.0.2" } }, "ms": { @@ -1219,58 +5670,66 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "resolve": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", - "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } } } }, "eslint-plugin-sonarjs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.5.0.tgz", - "integrity": "sha512-XW5MnzlRjhXpIdbULC/qAdJYHWw3rRLws/DyawdlPU/IdVr9AmRK1r2LaCvabwKOAW2XYYSo3kDX58E4MrB7PQ==", - "dev": true + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-sonarjs/-/eslint-plugin-sonarjs-0.10.0.tgz", + "integrity": "sha512-FBRIBmWQh2UAfuLSnuYEfmle33jIup9hfkR0X8pkfjeCKNpHUG8qyZI63ahs3aw8CJrv47QJ9ccdK3ZxKH016A==", + "dev": true, + "requires": {} }, "eslint-scope": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", - "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "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" } }, "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { "eslint-visitor-keys": "^1.1.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "eslint-visitor-keys": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", - "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", - "eslint-visitor-keys": "^1.1.0" + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -1280,21 +5739,37 @@ "dev": true }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { - "estraverse": "^4.0.0" + "estraverse": "^5.1.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 + } } }, "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": { @@ -1337,9 +5812,9 @@ "dev": true }, "execa": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz", - "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -1351,58 +5826,6 @@ "onetime": "^5.1.0", "signal-exit": "^3.0.2", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "executable": { @@ -1414,67 +5837,22 @@ "pify": "^2.2.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - }, - "dependencies": { - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - } - } - }, "extract-zip": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", - "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "dev": true, "requires": { - "concat-stream": "^1.6.2", - "debug": "^2.6.9", - "mkdirp": "^0.5.4", + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", "yauzl": "^2.10.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } } }, "extsprintf": { @@ -1534,22 +5912,21 @@ } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "flat-cache": "^3.0.4" } }, "file-size": { @@ -1577,20 +5954,25 @@ } }, "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "flatted": "^3.1.0", + "rimraf": "^3.0.2" } }, "flatted": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", - "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", + "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.3.tgz", + "integrity": "sha512-3MkHxknWMUtb23apkgz/83fDoe+y+qr0TdgacGIA7bew+QLBo3vdgEN2xEsuXNivpFy4CyDhBBZnNZOtalmenw==", "dev": true }, "forever-agent": { @@ -1634,9 +6016,9 @@ "dev": true }, "fsevents": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz", - "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "dev": true, "optional": true }, @@ -1652,6 +6034,17 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, "get-stream": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", @@ -1703,21 +6096,21 @@ } }, "global-dirs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", - "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "dev": true, "requires": { - "ini": "^1.3.5" + "ini": "2.0.0" } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "13.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", + "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.20.2" } }, "globby": { @@ -1775,27 +6168,33 @@ "function-bind": "^1.1.1" } }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true }, "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "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==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", "dev": true }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -1819,15 +6218,6 @@ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", "dev": true }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -1851,9 +6241,9 @@ "dev": true }, "indent-string": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", - "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true }, "inflight": { @@ -1873,138 +6263,20 @@ "dev": true }, "ini": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.7.tgz", - "integrity": "sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==", - "dev": true - }, - "inquirer": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.3.tgz", - "integrity": "sha512-+OiOVeVydu4hnCGLCSX+wedovR/Yzskv9BFqUNNKq9uU2qg7LCcCo3R86S2E7WLo0y/x2pnEZfZe1CoYnORUAw==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", - "cli-cursor": "^3.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.15", - "mute-stream": "0.0.8", - "run-async": "^2.2.0", - "rxjs": "^6.5.3", - "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "dependencies": { - "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "requires": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - } - }, - "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "string-width": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", - "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - } - } - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" } }, "is-arrayish": { @@ -2013,26 +6285,57 @@ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", "dev": true }, "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.0.tgz", + "integrity": "sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==", + "dev": true, + "requires": { + "ci-info": "^3.1.1" + } + }, + "is-core-module": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", + "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", "dev": true, "requires": { - "ci-info": "^2.0.0" + "has": "^1.0.3" } }, "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-extglob": { "version": "2.1.1", @@ -2056,28 +6359,34 @@ } }, "is-installed-globally": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz", - "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", "dev": true, "requires": { - "global-dirs": "^2.0.1", - "is-path-inside": "^3.0.1" + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" } }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", - "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", "dev": true, "requires": { - "symbol-observable": "^1.1.0" + "has-tostringtag": "^1.0.0" } }, "is-path-cwd": { @@ -2086,30 +6395,10 @@ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - }, - "dependencies": { - "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } - } - } - }, "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true }, "is-plain-object": { @@ -2121,12 +6410,6 @@ "isobject": "^4.0.0" } }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-reference": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.3.tgz", @@ -2137,33 +6420,37 @@ } }, "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "dev": true, "requires": { - "has": "^1.0.3" + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz", - "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==", - "dev": true + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } }, "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "has-symbols": "^1.0.2" } }, "is-typedarray": { @@ -2178,12 +6465,6 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2202,6 +6483,19 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "dev": true, + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2224,6 +6518,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -2248,6 +6548,15 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "jsonfile": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", @@ -2276,161 +6585,50 @@ "dev": true }, "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "listr": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", - "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { - "@samverschueren/stream-to-observable": "^0.3.0", - "is-observable": "^1.1.0", - "is-promise": "^2.1.0", - "is-stream": "^1.1.0", - "listr-silent-renderer": "^1.1.1", - "listr-update-renderer": "^0.5.0", - "listr-verbose-renderer": "^0.5.0", - "p-map": "^2.0.0", - "rxjs": "^6.3.3" - }, - "dependencies": { - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - } + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" } }, - "listr-silent-renderer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", - "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", - "dev": true - }, - "listr-update-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", - "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "listr2": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.11.1.tgz", + "integrity": "sha512-ZXQvQfmH9iWLlb4n3hh31yicXDxlzB0pE7MM1zu6kgbVL4ivEsO4H8IPh4E682sC8RjnYO9anose+zT52rrpyg==", "dev": true, "requires": { - "chalk": "^1.1.3", - "cli-truncate": "^0.2.1", - "elegant-spinner": "^1.0.1", - "figures": "^1.7.0", - "indent-string": "^3.0.0", - "log-symbols": "^1.0.2", - "log-update": "^2.3.0", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", - "dev": true, - "requires": { - "chalk": "^1.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } + "cli-truncate": "^2.1.0", + "colorette": "^1.2.2", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rxjs": "^6.6.7", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" } }, - "listr-verbose-renderer": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", - "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "chalk": "^2.4.1", - "cli-cursor": "^2.1.0", - "date-fns": "^1.27.2", - "figures": "^2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } } } }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", @@ -2447,12 +6645,30 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", + "dev": true + }, "log-symbols": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", @@ -2460,107 +6676,53 @@ "dev": true, "requires": { "chalk": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", - "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", - "dev": true, - "requires": { - "@types/color-name": "^1.1.1", - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "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 - }, - "supports-color": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", - "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } } }, "log-update": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", - "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "requires": { - "ansi-escapes": "^3.0.0", - "cli-cursor": "^2.0.0", - "wrap-ansi": "^3.0.1" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } } } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "magic-string": { "version": "0.25.3", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", @@ -2640,45 +6802,18 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - }, - "moment": { - "version": "2.27.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.27.0.tgz", - "integrity": "sha512-al0MUK7cpIcglMv3YF13qSgdAIqxHTO7brRtaz3DlSULbqfazqkc5kEjNrLDOM7fsjshoFIihnU8snrP7zUvhQ==", - "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 }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -2689,6 +6824,14 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } } }, "npm-run-path": { @@ -2698,22 +6841,8 @@ "dev": true, "requires": { "path-key": "^3.0.0" - }, - "dependencies": { - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - } } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -2727,9 +6856,9 @@ "dev": true }, "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", "dev": true }, "object-keys": { @@ -2739,27 +6868,26 @@ "dev": true }, "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.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" } }, "object.values": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", - "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz", + "integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==", "dev": true, "requires": { + "call-bind": "^1.0.2", "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1", - "function-bind": "^1.1.1", - "has": "^1.0.3" + "es-abstract": "^1.18.2" } }, "once": { @@ -2772,10 +6900,13 @@ } }, "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } }, "opn": { "version": "5.5.0", @@ -2787,25 +6918,19 @@ } }, "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" } }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, "ospath": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", @@ -2831,10 +6956,13 @@ } }, "p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } }, "p-try": { "version": "1.0.0", @@ -2852,12 +6980,13 @@ } }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, "path-exists": { @@ -2872,16 +7001,10 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { @@ -2891,12 +7014,20 @@ "dev": true }, "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "^2.0.0" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "pause-stream": { @@ -2932,46 +7063,34 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { - "pinkie": "^2.0.0" + "find-up": "^2.1.0" } }, - "pkg-dir": { + "pkg-up": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", "dev": true, "requires": { "find-up": "^2.1.0" } }, "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "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==", - "dev": true - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", "dev": true }, "progress": { @@ -3024,51 +7143,36 @@ "dev": true }, "ramda": { - "version": "0.26.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.26.1.tgz", - "integrity": "sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ==", + "version": "0.27.1", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.1.tgz", + "integrity": "sha512-PgIdVpn5y5Yns8vqb8FzBUEYn98V3xcPgawAkkgj0YJ0qDsnHCiNmZYfOGMgOvoB0eWFLpYbhxUR3mxfDIMvpw==", "dev": true }, "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "^2.0.0", + "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" + "path-type": "^3.0.0" } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "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" + "read-pkg": "^3.0.0" } }, "regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, "request": { @@ -3108,32 +7212,19 @@ "throttleit": "^1.0.0" } }, - "request-promise-core": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz", - "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==", - "dev": true, - "requires": { - "lodash": "^4.17.15" - } - }, - "request-promise-native": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz", - "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==", - "dev": true, - "requires": { - "request-promise-core": "1.1.3", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } + "require-from-string": { + "version": "2.0.2", + "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==", + "dev": true }, "resolve": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", - "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "dev": true, "requires": { + "is-core-module": "^2.2.0", "path-parse": "^1.0.6" } }, @@ -3144,13 +7235,13 @@ "dev": true }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "exit-hook": "^1.0.0", - "onetime": "^1.0.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, "reusify": { @@ -3160,21 +7251,21 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "rollup": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.2.0.tgz", - "integrity": "sha512-iAu/j9/WJ0i+zT0sAMuQnsEbmOKzdQ4Yxu5rbPs9aUCyqveI1Kw3H4Fi9NWfCOpb8luEySD2lDyFWL9CrLE8iw==", + "version": "2.56.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.56.3.tgz", + "integrity": "sha512-Au92NuznFklgQCUcV96iXlxUbHuB1vQMaH76DHl5M11TotjOHwqk9CwcrT78+Tnv4FN9uTBxq6p4EJoYkpyekg==", "dev": true, "requires": { - "fsevents": "~2.1.2" + "fsevents": "~2.3.2" } }, "rollup-plugin-commonjs": { @@ -3191,9 +7282,9 @@ } }, "rollup-plugin-copy": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.3.0.tgz", - "integrity": "sha512-euDjCUSBXZa06nqnwCNADbkAcYDfzwowfZQkto9K/TFhiH+QG7I4PUsEMwM9tDgomGWJc//z7KLW8t+tZwxADA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.4.0.tgz", + "integrity": "sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==", "dev": true, "requires": { "@types/fs-extra": "^8.0.1", @@ -3204,12 +7295,12 @@ } }, "rollup-plugin-delete": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-1.2.0.tgz", - "integrity": "sha512-k2vHnECLSVpT1OqK2wblt+ZIxJ7dmnaaYdb6AsBRpl4Ilpy10ibSnXVD7nJTRaB7KRP02XDRt0SCZ8vWi+VPdQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz", + "integrity": "sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA==", "dev": true, "requires": { - "del": "^4.1.1" + "del": "^5.1.0" } }, "rollup-plugin-json": { @@ -3230,15 +7321,6 @@ "estree-walker": "^0.6.1" } }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, "run-parallel": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", @@ -3246,9 +7328,9 @@ "dev": true }, "rxjs": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz", - "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==", + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", "dev": true, "requires": { "tslib": "^1.9.0" @@ -3267,30 +7349,44 @@ "dev": true }, "semver": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", - "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", - "dev": true + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "slash": { @@ -3300,10 +7396,15 @@ "dev": true }, "slice-ansi": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", - "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } }, "sourcemap-codec": { "version": "1.4.6", @@ -3312,9 +7413,9 @@ "dev": true }, "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -3322,15 +7423,15 @@ } }, "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", @@ -3338,9 +7439,9 @@ } }, "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.10", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", + "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==", "dev": true }, "split": { @@ -3376,117 +7477,48 @@ } }, "start-server-and-test": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.10.11.tgz", - "integrity": "sha512-CZilaj293uQWdD4vgOxTOuzlCWxOyBm6bzmH1r6OGLG/q5zcBmGYevLfOimkg0kSn9jLHwYSXLuoKG/DDQJhww==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-1.14.0.tgz", + "integrity": "sha512-on5ELuxO2K0t8EmNj9MtVlFqwBMxfWOhu4U7uZD1xccVpFlOQKR93CSe0u98iQzfNxRyaNTb/CdadbNllplTsw==", "dev": true, "requires": { "bluebird": "3.7.2", "check-more-types": "2.24.0", - "debug": "4.1.1", - "execa": "3.4.0", + "debug": "4.3.2", + "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "4.0.0" + "wait-on": "6.0.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", - "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "execa": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-3.4.0.tgz", - "integrity": "sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "get-stream": "^5.0.0", - "human-signals": "^1.1.1", + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.0", - "onetime": "^5.1.0", - "p-finally": "^2.0.0", - "signal-exit": "^3.0.2", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "get-stream": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", - "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "is-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", - "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", - "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-finally": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", - "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -3554,12 +7586,6 @@ } } }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", @@ -3578,61 +7604,35 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", - "dev": true - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" } }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", "dev": true, "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, - "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==", + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" } }, "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "^5.0.0" } }, "strip-bom": { @@ -3648,106 +7648,58 @@ "dev": true }, "strip-json-comments": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", - "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "symbol-observable": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", - "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz", + "integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==", "dev": true, "requires": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" + "ajv": "^8.0.1", + "lodash.clonedeep": "^4.5.0", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0" }, "dependencies": { "ajv": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", - "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz", + "integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==", "dev": true, "requires": { - "fast-deep-equal": "^2.0.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", "uri-js": "^4.2.2" } }, - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "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==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "requires": { - "ansi-regex": "^4.1.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" } } } @@ -3777,17 +7729,6 @@ "dev": true, "requires": { "rimraf": "^3.0.0" - }, - "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - } } }, "to-regex-range": { @@ -3809,10 +7750,22 @@ "punycode": "^2.1.1" } }, + "tsconfig-paths": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz", + "integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.0", + "strip-bom": "^3.0.0" + } + }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, "tunnel-agent": { @@ -3831,32 +7784,38 @@ "dev": true }, "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { - "prelude-ls": "~1.1.2" + "prelude-ls": "^1.2.1" } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, "typescript": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", - "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.2.tgz", + "integrity": "sha512-gzP+t5W4hdy4c+68bfcv0t400HVJMMd2+H9B7gae1nQlBzCqvrXX+6GL/b3GAgyTH966pzrZ70/fRjwAtZksSQ==", "dev": true }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -3896,12 +7855,6 @@ } } }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -3936,58 +7889,57 @@ } }, "wait-on": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-4.0.0.tgz", - "integrity": "sha512-QrW3J8LzS5ADPfD9Rx5S6KJck66xkqyiFKQs9jmUTkIhiEOmkzU7WRZc+MjsnmkrgjitS2xQ4bb13hnlQnKBUQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz", + "integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==", "dev": true, "requires": { - "@hapi/joi": "^16.1.8", - "lodash": "^4.17.15", - "minimist": "^1.2.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.8", - "rxjs": "^6.5.4" + "axios": "^0.21.1", + "joi": "^17.4.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^7.1.0" }, "dependencies": { - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "rxjs": { + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.3.0.tgz", + "integrity": "sha512-p2yuGIg9S1epc3vrjKf6iVb3RCaAYjYskkO+jHIaV0IjOPlJop4UnodOoFb2xeNwlguqLYvGw1b1McillYb5Gw==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "tslib": "~2.1.0" } + }, + "tslib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz", + "integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==", + "dev": true } } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -3995,46 +7947,14 @@ "dev": true }, "wrap-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", - "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" } }, "wrappy": { @@ -4043,14 +7963,11 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true }, "yauzl": { "version": "2.10.0", diff --git a/package.json b/package.json index 9832834..38ac89c 100644 --- a/package.json +++ b/package.json @@ -46,21 +46,20 @@ ], "devDependencies": { "chai-string": "^1.5.0", - "cypress": "^5.0.0", - "eslint": "^6.8.0", + "cypress": "^8.3.1", + "eslint": "^7.32.0", "eslint-config-google": "^0.14.0", - "eslint-plugin-cypress": "^2.10.3", - "eslint-plugin-import": "^2.20.1", - "eslint-plugin-sonarjs": "^0.5.0", + "eslint-plugin-cypress": "^2.11.3", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-sonarjs": "^0.10.0", "request": "^2.88.2", - "rollup": "^2.2.0", + "rollup": "^2.56.3", "rollup-plugin-commonjs": "^10.1.0", - "rollup-plugin-copy": "^3.3.0", - "rollup-plugin-delete": "^1.2.0", + "rollup-plugin-copy": "^3.4.0", + "rollup-plugin-delete": "^2.0.0", "rollup-plugin-json": "^4.0.0", - "start-server-and-test": "^1.10.11", + "start-server-and-test": "^1.14.0", "static-server": "^2.2.1", - "typescript": "^3.8.3" - }, - "dependencies": {} + "typescript": "^4.4.2" + } } From efed79f6786c06ff7c378ec4ff47037c47a7703f Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 10:47:25 +0200 Subject: [PATCH 02/26] Implemented fix for commands using command queue utils --- src/utils/commandQueue.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/utils/commandQueue.js b/src/utils/commandQueue.js index d6f8210..b6f1001 100644 --- a/src/utils/commandQueue.js +++ b/src/utils/commandQueue.js @@ -8,8 +8,10 @@ import { notInProduction } from './errorMessages'; export function markCurrentCommand(commandName) { const queue = Cypress.cy.queue; const currentCommand = queue - .filter({ name: commandName }) - .filter((command) => !command.get('invoked')) + .get() + .filter((command) => { + return command.get('name') === commandName && !command.get('invoked'); + }) .shift(); // The mark From 15f020becf4bce4d8ce762dcd225e46131dc5b8b Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 10:51:33 +0200 Subject: [PATCH 03/26] Fixed broken tests --- cypress/integration/copied/request.js | 20 -------------------- cypress/integration/then.js | 3 ++- 2 files changed, 2 insertions(+), 21 deletions(-) diff --git a/cypress/integration/copied/request.js b/cypress/integration/copied/request.js index 07ba1c5..6c86d65 100644 --- a/cypress/integration/copied/request.js +++ b/cypress/integration/copied/request.js @@ -435,26 +435,6 @@ describe('src/cy/commands/request', function() { }) }) - describe('failOnStatus', function() { - it('is deprecated but does not fail even on 500 when failOnStatus=false', function() { - const warning = cy.spy(Cypress.utils, 'warning') - - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: false, status: 500 }) - - cy.request({ - url: 'http://localhost:1234/foo', - failOnStatus: false, - }) - .then((resp) => { - // make sure it really was 500! - expect(resp.status).to.eq(500) - expect(warning.lastCall.args[0]).to.include('The `cy.request()` `failOnStatus` option has been renamed to `failOnStatusCode`. Please update your code. This option will be removed at a later time.') - }) - }) - }) - describe('failOnStatusCode', function() { it('does not fail on status 401', function() { Cypress.backend diff --git a/cypress/integration/then.js b/cypress/integration/then.js index 78c1a8d..9263fbe 100644 --- a/cypress/integration/then.js +++ b/cypress/integration/then.js @@ -317,7 +317,8 @@ describe('The overwritten command `then`', function() { expect(__logs.length).to.eq(2); expect(err.message).to.contain(lastLog.get('error').message); - expect(err.message).to.equal('Timed out retrying: expected 5 to equal 4'); + expect(err.message) + .to.equal('Timed out retrying after 50ms: expected 5 to equal 4'); done(); }); From 15de7639d121751ebf79a757f83d8dc17d9bdf28 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 11:13:39 +0200 Subject: [PATCH 04/26] Updated docs to specify which version to use --- README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8b20611..c5e0a82 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,12 @@ This repository is not maintained by the Cypress developers. This means we can c Documentation is a cornerstone of Cypress, the commands in this repository will try to keep these documentation standards. +## Cypress version + +`cypress-commands@2` requires version 8.3.0 or higher. + +For previous versions of Cypress, use `cypress-commands@1` instead. + ## Installation Install the module. @@ -50,7 +56,7 @@ These commands do not exist in Cypress by default. ## Contributing -Contributors are always welcome! I really don't care if you are a beginner or an expert, all help is welcome. +Contributors are always welcome! I don't care if you are a beginner or an expert, all help is welcome. ## Running tests From ba1c9e768ec80cb7e36adcae925d2f90906313a8 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 11:16:47 +0200 Subject: [PATCH 05/26] Added github actions CI Will replace Travis --- .github/workflows/ci.yaml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..f67133a --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,33 @@ +# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions + +name: Node.js CI + +on: + push: + branches: [ develop ] + pull_request: + branches: [ develop ] + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [10.x, 12.x, 14.x, 16.x] + # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run lint + - run: npm run test:source + - run: npm run bundle + - run: npm run test:bundle From da7531ad9738350d61e9399ad9550be66029edaf Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 11:49:41 +0200 Subject: [PATCH 06/26] Switched code formatter to prettier --- .editorconfig | 30 ++++++++++++++++++++++++++++++ .jsbeautifyrc | 26 -------------------------- .prettierrc | 9 +++++++++ .vscode/extentions.json | 3 +++ .vscode/settings.json | 4 ++++ 5 files changed, 46 insertions(+), 26 deletions(-) create mode 100644 .editorconfig delete mode 100644 .jsbeautifyrc create mode 100644 .prettierrc create mode 100644 .vscode/extentions.json create mode 100644 .vscode/settings.json diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..00ea6a7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,30 @@ +# Editor configuration, see https://editorconfig.org +# Used by various tools. Among which: VS Code, Prettier +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true +end_of_line = lf + +[*.ts] +quote_type = single + +[*.js] +quote_type = single + +[*.md] +trim_trailing_whitespace = false +indent_style = space +indent_size = 2 + +[*.yaml] +indent_style = space +indent_size = 2 + +[{package.json,package-lock.json}] +indent_style = space +indent_size = 2 diff --git a/.jsbeautifyrc b/.jsbeautifyrc deleted file mode 100644 index 9293cd1..0000000 --- a/.jsbeautifyrc +++ /dev/null @@ -1,26 +0,0 @@ -{ - "indent_size": 4, - "indent_char": " ", - "indent_with_tabs": false, - "editorconfig": false, - "eol": "\n", - "end_with_newline": true, - "indent_level": 0, - "preserve_newlines": true, - "max_preserve_newlines": 3, - "space_in_paren": false, - "space_in_empty_paren": false, - "jslint_happy": false, - "space_after_anon_function": false, - "space_after_named_function": false, - "brace_style": "end-expand,preserve-inline", - "unindent_chained_methods": false, - "break_chained_methods": false, - "keep_array_indentation": false, - "unescape_strings": false, - "wrap_line_length": 0, - "e4x": false, - "comma_first": false, - "operator_position": "after-newline", - "keep_function_indentation": false -} diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..baeb98d --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "singleQuote": true, + "semi": true, + "bracketSpacing": true, + "trailingComma": "es5", + "proseWrap": "always", + "printWidth": 100, + "quoteProps": "consistent" +} diff --git a/.vscode/extentions.json b/.vscode/extentions.json new file mode 100644 index 0000000..974188b --- /dev/null +++ b/.vscode/extentions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..6b73662 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,4 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode" +} From 06967cd29f0cb59ddb00edcc09fe44cd3d126ebb Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 11:49:56 +0200 Subject: [PATCH 07/26] Formatted code --- .eslintrc.js | 96 +++++++++++----------- .github/workflows/ci.yaml | 32 ++++---- DEVELOP.md | 33 ++++---- README.md | 26 +++--- app/index.html | 113 +++++++++++++------------- app/index.js | 5 +- rollup.config.js | 10 +-- src/attribute.js | 152 +++++++++++++++++------------------ src/request.js | 23 +++--- src/text.js | 50 +++++------- src/then.js | 19 ++--- src/to.js | 25 ++---- src/utils/commandQueue.js | 14 ++-- src/utils/errorMessages.js | 41 ++++++---- src/utils/isJquery.js | 2 +- src/utils/optionValidator.js | 16 ++-- src/utils/whitespace.js | 5 +- types/attribute.d.ts | 26 +++--- types/text.d.ts | 4 +- types/then.d.ts | 42 +++++++--- types/to.d.ts | 9 ++- 21 files changed, 378 insertions(+), 365 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 56d0964..d1f6f10 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,58 +1,54 @@ +/* eslint-disable sonarjs/no-duplicate-string */ module.exports = { - "plugins": [ - "sonarjs", - "cypress", - ], - "extends": [ - "google", - "plugin:sonarjs/recommended", - "plugin:cypress/recommended", - ], - "parserOptions": { - "sourceType": "module", - "ecmaVersion": 8 + plugins: ['sonarjs', 'cypress'], + extends: ['google', 'plugin:sonarjs/recommended', 'plugin:cypress/recommended'], + parserOptions: { + sourceType: 'module', + ecmaVersion: 8, }, - "env": { - "node": true, - "es6": true, + env: { + node: true, + es6: true, }, - "rules": { - "indent": [ - "error", - 4, - ], - "max-len": [ - "error", - 100, - ], - "linebreak-style": "off", - "no-multi-spaces": [ - "error", { - "exceptions": { - "VariableDeclarator": true, - } - } + rules: { + 'indent': ['error', 4], + 'max-len': ['error', 100], + 'linebreak-style': 'off', + 'no-multi-spaces': [ + 'error', + { + exceptions: { + VariableDeclarator: true, + }, + }, ], - "brace-style": [ - "error", - "stroustrup", + 'object-curly-spacing': ['error', 'always'], + 'comma-dangle': [ + 'error', + { + arrays: 'always-multiline', + objects: 'always-multiline', + imports: 'always-multiline', + exports: 'always-multiline', + functions: 'never', + }, ], - "object-curly-spacing": ["error", "always"], - "operator-linebreak": ["error", "before"], }, - "overrides": [{ - "files": ["lib/**/*"], - "rules": { - // This is fine as long as you know what you're doing - "cypress/no-assigning-return-values": "warn", - } - }, - { - "files": ["cypress/integration/**/*"], - "rules": { - "sonarjs/no-identical-functions": "warn", - "sonarjs/no-duplicate-string": ["warn", 5], - "no-invalid-this": "off", + overrides: [ + { + files: ['lib/**/*'], + rules: { + // This is fine as long as you know what you're doing + 'cypress/no-assigning-return-values': 'warn', + }, + }, + { + files: ['cypress/integration/**/*'], + rules: { + 'sonarjs/no-identical-functions': 'warn', + 'sonarjs/no-duplicate-string': ['warn', 5], + 'no-invalid-this': 'off', + }, }, - }], + ], }; diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f67133a..7b2da16 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,13 +5,12 @@ name: Node.js CI on: push: - branches: [ develop ] + branches: [develop] pull_request: - branches: [ develop ] + branches: [develop] jobs: build: - runs-on: ubuntu-latest strategy: @@ -20,14 +19,19 @@ jobs: # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ steps: - - uses: actions/checkout@v2 - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v2 - with: - node-version: ${{ matrix.node-version }} - cache: 'npm' - - run: npm ci - - run: npm run lint - - run: npm run test:source - - run: npm run bundle - - run: npm run test:bundle + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + cache: 'npm' + - run: npm ci + - run: npm run lint + - run: npm run test:source + - run: npm run bundle + - run: npm run test:bundle +# addons: +# apt: +# packages: +# # Ubuntu 16+ does not install this dependency by default, so we need to install it ourselves +# - libgconf-2-4 diff --git a/DEVELOP.md b/DEVELOP.md index 5b02559..b85153b 100644 --- a/DEVELOP.md +++ b/DEVELOP.md @@ -8,22 +8,23 @@ Anything above Node 8 There are many ways to run tests. Here is a list -| Command | Headless | Starts server | Code under test | -|---------|----------|---------------|-----------------| -| `npm test` | :heavy_check_mark: | :heavy_check_mark: | Source files | -| `npm run test:source` | :heavy_check_mark: | :heavy_check_mark: | Source files | -| `npm run test:bundle` | :heavy_check_mark: | :heavy_check_mark: | Distribution bundle | -| `npm run run:cypress` | :heavy_check_mark: | :x: | Source files | -| `npm run run:cypress:source` | :heavy_check_mark: | :x: | Source files | -| `npm run run:cypress:bundle` | :heavy_check_mark: | :x: | Distribution bundle | -| `npm start` | :x: | :heavy_check_mark: | Source files | -| `npm run start:source` | :x: | :heavy_check_mark: | Source files | -| `npm run start:bundle` | :x: | :heavy_check_mark: | Distribution bundle | -| `npm run start:cypress` | :x: | :x: | Source files | -| `npm run start:cypress:source` | :x: | :x: | Source files | -| `npm run start:cypress:bundle` | :x: | :x: | Distribution bundle | - -For commands that don't start their own server you'll need to run `npm run start:server` in a second command line. +| Command | Headless | Starts server | Code under test | +| ------------------------------ | ------------------ | ------------------ | ------------------- | +| `npm test` | :heavy_check_mark: | :heavy_check_mark: | Source files | +| `npm run test:source` | :heavy_check_mark: | :heavy_check_mark: | Source files | +| `npm run test:bundle` | :heavy_check_mark: | :heavy_check_mark: | Distribution bundle | +| `npm run run:cypress` | :heavy_check_mark: | :x: | Source files | +| `npm run run:cypress:source` | :heavy_check_mark: | :x: | Source files | +| `npm run run:cypress:bundle` | :heavy_check_mark: | :x: | Distribution bundle | +| `npm start` | :x: | :heavy_check_mark: | Source files | +| `npm run start:source` | :x: | :heavy_check_mark: | Source files | +| `npm run start:bundle` | :x: | :heavy_check_mark: | Distribution bundle | +| `npm run start:cypress` | :x: | :x: | Source files | +| `npm run start:cypress:source` | :x: | :x: | Source files | +| `npm run start:cypress:bundle` | :x: | :x: | Distribution bundle | + +For commands that don't start their own server you'll need to run `npm run start:server` in a second +command line. ## Publishing diff --git a/README.md b/README.md index c5e0a82..bc5bc31 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,11 @@ A collection of high-quality Cypress commands to complement and extend the defaults. -This repository is not maintained by the Cypress developers. This means we can choose to ignore parts of their vision. +This repository is not maintained by the Cypress developers. This means we can choose to ignore +parts of their vision. -Documentation is a cornerstone of Cypress, the commands in this repository will try to keep these documentation standards. +Documentation is a cornerstone of Cypress, the commands in this repository will try to keep these +documentation standards. ## Cypress version @@ -30,7 +32,8 @@ require('cypress-commands'); ### Type definitions -Import typescript definitions by adding them to your `tsconfig.json`. Add the cypress-commands types before the Cypress types so intellisense will prefer the cypress-commands versions. +Import typescript definitions by adding them to your `tsconfig.json`. Add the cypress-commands types +before the Cypress types so intellisense will prefer the cypress-commands versions. ```json "types": [ @@ -41,22 +44,25 @@ Import typescript definitions by adding them to your `tsconfig.json`. Add the cy ## Extended commands -These commands have been extended to be able to do more than originally intended. For these commands, all tests that exist in the Cypress repository are copied to make sure the default behaviour stays identical unless we want it changed. +These commands have been extended to be able to do more than originally intended. For these +commands, all tests that exist in the Cypress repository are copied to make sure the default +behaviour stays identical unless we want it changed. -* [`.request()`](./docs/request.md) -* [`.then()`](./docs/then.md) +- [`.request()`](./docs/request.md) +- [`.then()`](./docs/then.md) ## Added commands These commands do not exist in Cypress by default. -* [`.attribute()`](./docs/attribute.md) -* [`.text()`](./docs/text.md) -* [`.to()`](./docs/to.md) +- [`.attribute()`](./docs/attribute.md) +- [`.text()`](./docs/text.md) +- [`.to()`](./docs/to.md) ## Contributing -Contributors are always welcome! I don't care if you are a beginner or an expert, all help is welcome. +Contributors are always welcome! I don't care if you are a beginner or an expert, all help is +welcome. ## Running tests diff --git a/app/index.html b/app/index.html index d912c57..17dfc03 100644 --- a/app/index.html +++ b/app/index.html @@ -1,62 +1,63 @@ - - jQuery 3.2.1 Fixture - - - - - - foo -
div
+ + jQuery 3.2.1 Fixture + + + + + + foo +
div
-
- - - -
+
+ + + +
-
0
-
    -
- a -
- div - cont​aining    some
complex whitespace -
-
- Some text with inline formatting
applied to it.
-
-
-
- parent div top -
- child div -
- grandchild div -
- great-grandchild div -
- great-great-grandchild div -
-
+
0
+
    + a +
    + div cont​aining    some
    + complex whitespace +
    +
    + Some text with inline + formatting
    applied to it.
    -
    - parent div middle -
    - second-child div -
    - second-grand-child div +
    +
    + parent div top +
    + child div +
    + grandchild div +
    + great-grandchild div +
    + great-great-grandchild div +
    +
    +
    +
    + parent div middle +
    + second-child div +
    second-grand-child div
    +
    + parent div bottom
    -
    - parent div bottom -
    - - \ No newline at end of file + + diff --git a/app/index.js b/app/index.js index 8c8cb92..4ad317f 100644 --- a/app/index.js +++ b/app/index.js @@ -4,10 +4,7 @@ setInterval(() => { $('#list').append(`
  • li ${count}
  • `); } - const elems = [ - $('.counter'), - $('input'), - ]; + const elems = [$('.counter'), $('input')]; elems.forEach((elem) => { const val = +elem.text(); diff --git a/rollup.config.js b/rollup.config.js index 74f32ad..34e97a1 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -4,7 +4,6 @@ import commonjs from 'rollup-plugin-commonjs'; import json from 'rollup-plugin-json'; import copy from 'rollup-plugin-copy'; - const config = [ { input: './src/index.js', @@ -32,9 +31,7 @@ const config = [ // Copy type definitions to target folder copy({ - targets: [ - { src: './types/**/*.d.ts', dest: './dist/types' }, - ], + targets: [{ src: './types/**/*.d.ts', dest: './dist/types' }], }), ], @@ -45,10 +42,7 @@ const config = [ * have to download the exact same code multiple times, once * in this bundle and also as a dependency of another package. */ - external: [ - ...Object.keys(pkg.dependencies), - 'path', - ], + external: [...Object.keys(pkg.dependencies), 'path'], }, ]; diff --git a/src/attribute.js b/src/attribute.js index 2db97de..af79f15 100644 --- a/src/attribute.js +++ b/src/attribute.js @@ -22,97 +22,96 @@ const validator = new OptionValidator('attribute'); * @yields {string|string[]} * @since 0.2.0 */ -Cypress.Commands.add('attribute', { prevSubject: 'element' }, (subject, attribute, options={}) => { - subject = $(subject); - - // Make sure the order of input can be flipped - if (_.isObject(attribute)) { - [attribute, options] = [options, attribute]; - } +Cypress.Commands.add( + 'attribute', + { prevSubject: 'element' }, + (subject, attribute, options = {}) => { + subject = $(subject); + + // Make sure the order of input can be flipped + if (_.isObject(attribute)) { + [attribute, options] = [options, attribute]; + } - // Handle options - validator.check('log', options.log, [true, false]); - validator.check('whitespace', options.whitespace, ['simplify', 'keep', 'keep-newline']); - validator.check('strict', options.strict, [true, false]); - _.defaults(options, { - log: true, - strict: true, - whitespace: 'keep', - }); - - options._whitespace = whitespace(options.whitespace); - - const consoleProps = { - 'Applied to': subject, - }; - if (options.log) { - options._log = Cypress.log({ - $el: subject, - name: 'attribute', - message: attribute, - consoleProps: () => consoleProps, + // Handle options + validator.check('log', options.log, [true, false]); + validator.check('whitespace', options.whitespace, ['simplify', 'keep', 'keep-newline']); + validator.check('strict', options.strict, [true, false]); + _.defaults(options, { + log: true, + strict: true, + whitespace: 'keep', }); - } - // Mark this newly invoked command in the command queue to be able to find it later. - markCurrentCommand('attribute'); + options._whitespace = whitespace(options.whitespace); - /** - * @param {Array.|string} result - */ - function updateLog(result) { - consoleProps.Yielded = result; - } + const consoleProps = { + 'Applied to': subject, + }; + if (options.log) { + options._log = Cypress.log({ + $el: subject, + name: 'attribute', + message: attribute, + consoleProps: () => consoleProps, + }); + } - /** - * Get the attribute and do the upcoming assertion - * @return {Promise} - */ - function resolveAttribute() { - let attr = subject.map((i, element) => { - return $(element).attr(attribute); - }); + // Mark this newly invoked command in the command queue to be able to find it later. + markCurrentCommand('attribute'); - if (attr.length === 1) { - attr = options._whitespace(attr.get(0)); - } - else if (attr.length > 1) { - // Deconstruct jQuery object to normal array - attr = attr - .toArray() - .map(options._whitespace); + /** + * @param {Array.|string} result + */ + function updateLog(result) { + consoleProps.Yielded = result; } - if (options.log) { - updateLog(attr); - } + /** + * Get the attribute and do the upcoming assertion + * @return {Promise} + */ + function resolveAttribute() { + let attr = subject.map((i, element) => { + return $(element).attr(attribute); + }); + + if (attr.length === 1) { + attr = options._whitespace(attr.get(0)); + } else if (attr.length > 1) { + // Deconstruct jQuery object to normal array + attr = attr.toArray().map(options._whitespace); + } - let result = attr; - if (options.strict && attr.length && subject.length > attr.length) { - const negate = upcomingAssertionNegatesExistence(); + if (options.log) { + updateLog(attr); + } + + let result = attr; + if (options.strict && attr.length && subject.length > attr.length) { + const negate = upcomingAssertionNegatesExistence(); - if (!negate) { - result = $([]); + if (!negate) { + result = $([]); + } } - } - return cy.verifyUpcomingAssertions(result, options, { - onFail: (err) => onFail(err, subject, attribute, attr), - // Retry untill the upcoming assertion passes - onRetry: resolveAttribute, - }); - } + return cy.verifyUpcomingAssertions(result, options, { + onFail: (err) => onFail(err, subject, attribute, attr), + // Retry untill the upcoming assertion passes + onRetry: resolveAttribute, + }); + } - return resolveAttribute() - .then(function(attribute) { + return resolveAttribute().then((attribute) => { // The upcoming assertion passed, finish up the log if (options.log) { options._log.snapshot().end(); } return attribute; }); -}); - + } +); /** * Overwrite the error message of implicit assertions @@ -129,18 +128,15 @@ function onFail(err, subject, attribute, result) { if (negate) { err.displayMessage = errorMessage.negated(attribute); - } - else { + } else { err.displayMessage = errorMessage.normal(attribute); } - } - else if (err.type === 'existence' && subject.length > 1) { + } else if (err.type === 'existence' && subject.length > 1) { const errorMessage = errMsg.existence.multiple; if (negate) { err.displayMessage = errorMessage.negated(attribute, subject.length, result.length); - } - else { + } else { err.displayMessage = errorMessage.normal(attribute, subject.length, result.length); } diff --git a/src/request.js b/src/request.js index a871195..ab3d86d 100644 --- a/src/request.js +++ b/src/request.js @@ -39,21 +39,17 @@ Cypress.Commands.overwrite('request', (originalCommand, ...args) => { if (_.isObject(args[0])) { _.extend(options, args[0]); - } - else if (args.length === 1) { + } else if (args.length === 1) { options.url = args[0]; - } - else if (args.length === 2) { + } else if (args.length === 2) { if (methods.includes(args[0].toUpperCase())) { options.method = args[0]; options.url = args[1]; - } - else { + } else { options.url = args[0]; options.body = args[1]; } - } - else if (args.length === 3) { + } else if (args.length === 3) { options.method = args[0]; options.url = args[1]; options.body = args[2]; @@ -64,16 +60,17 @@ Cypress.Commands.overwrite('request', (originalCommand, ...args) => { return originalCommand(options); }); - /** * @param {string} url * @return {string} */ function parseUrl(url) { - if (typeof url === 'string' - && !url.includes('://') - && !url.startsWith('localhost') - && !url.startsWith('www.')) { + if ( + typeof url === 'string' && + !url.includes('://') && + !url.startsWith('localhost') && + !url.startsWith('www.') + ) { // It's a relative url const config = Cypress.config(); const requestBaseUrl = config.requestBaseUrl; diff --git a/src/text.js b/src/text.js index f22787a..73132ae 100644 --- a/src/text.js +++ b/src/text.js @@ -50,7 +50,6 @@ Cypress.Commands.add('text', { prevSubject: 'element' }, (element, options = {}) }); } - /** * @param {Array.|string} result */ @@ -58,8 +57,7 @@ Cypress.Commands.add('text', { prevSubject: 'element' }, (element, options = {}) consoleProps.Yielded = result; if (_.isArray(result)) { options._log.set('message', JSON.stringify(result)); - } - else { + } else { options._log.set('message', result); } } @@ -88,17 +86,15 @@ Cypress.Commands.add('text', { prevSubject: 'element' }, (element, options = {}) }); } - return resolveText() - .then((text) => { - // The upcoming assertion passed, finish up the log - if (options.log) { - options._log.snapshot().end(); - } - return text; - }); + return resolveText().then((text) => { + // The upcoming assertion passed, finish up the log + if (options.log) { + options._log.snapshot().end(); + } + return text; + }); }); - /** * @param {JQuery} element * @param {number} depth @@ -106,27 +102,25 @@ Cypress.Commands.add('text', { prevSubject: 'element' }, (element, options = {}) */ function getTextOfElement(element, depth) { const TAG_REPLACEMENT = { - 'WBR': '\u200B', - 'BR': ' ', + WBR: '\u200B', + BR: ' ', }; let text = ''; - element - .contents() - .each((i, content) => { - if (content.nodeType === Node.TEXT_NODE) { - return text += content.data; + element.contents().each((i, content) => { + if (content.nodeType === Node.TEXT_NODE) { + return (text += content.data); + } + if (content.nodeType === Node.ELEMENT_NODE) { + if (_.has(TAG_REPLACEMENT, content.nodeName)) { + return (text += TAG_REPLACEMENT[content.nodeName]); } - if (content.nodeType === Node.ELEMENT_NODE) { - if (_.has(TAG_REPLACEMENT, content.nodeName)) { - return text += TAG_REPLACEMENT[content.nodeName]; - } - - if (depth > 0) { - return text += getTextOfElement($(content), depth - 1); - } + + if (depth > 0) { + return (text += getTextOfElement($(content), depth - 1)); } - }); + } + }); return text; } diff --git a/src/then.js b/src/then.js index bb708e0..004b5f8 100644 --- a/src/then.js +++ b/src/then.js @@ -27,7 +27,7 @@ Cypress.Commands.overwrite('then', (originalCommand, subject, fn, options = {}) if (_.isFunction(options)) { // Flip the values of `fn` and `options` [fn, options] = [options, fn]; - }; + } validator.check('log', options.log, [true, false]); validator.check('retry', options.retry, [true, false]); @@ -54,8 +54,7 @@ Cypress.Commands.overwrite('then', (originalCommand, subject, fn, options = {}) // Link the DOM element to the logger options._log.set('$el', $(subject)); consoleProps['Applied to'] = $(subject); - } - else { + } else { consoleProps['Applied to'] = String(subject); } @@ -86,14 +85,12 @@ Cypress.Commands.overwrite('then', (originalCommand, subject, fn, options = {}) */ async function executeFn() { // Execute using the original `then` to not reinvent the wheel - return await originalCommand(subject, options, fn) - .then((value) => { - if (options.log) { - consoleProps.Yielded = value; - } - - return value; - }); + return await originalCommand(subject, options, fn).then((value) => { + if (options.log) { + consoleProps.Yielded = value; + } + return value; + }); } if (options.retry) { diff --git a/src/to.js b/src/to.js index dc868ca..1ea0cf7 100644 --- a/src/to.js +++ b/src/to.js @@ -6,7 +6,6 @@ const errMsg = command.to; import OptionValidator from './utils/optionValidator'; const validator = new OptionValidator('to'); - const types = { array: castArray, string: castString, @@ -44,7 +43,6 @@ Cypress.Commands.add('to', { prevSubject: true }, (subject, type, options = {}) throw new Error(`${errMsg.cantCast('subject', type)} ${errMsg.expected(_.keys(types))}`); } - const consoleProps = { 'Applied to': subject, }; @@ -56,7 +54,6 @@ Cypress.Commands.add('to', { prevSubject: true }, (subject, type, options = {}) }); } - /** * Cast the subject and do the upcoming assertion * @return {Promise} @@ -67,23 +64,20 @@ Cypress.Commands.add('to', { prevSubject: true }, (subject, type, options = {}) // Retry untill the upcoming assertion passes onRetry: castSubject, }); - } - catch (err) { + } catch (err) { // The casting function threw an error, let's try again options.error = err; return cy.retry(castSubject, options, options._log); } } - return castSubject() - .then((result) => { - // Everything passed, finish up the log - consoleProps.Yielded = result; - return result; - }); + return castSubject().then((result) => { + // Everything passed, finish up the log + consoleProps.Yielded = result; + return result; + }); }); - /** * @param {any|any[]} subject * @return {any[]} @@ -95,7 +89,6 @@ function castArray(subject) { return [subject]; } - /** * @param {any|any[]} subject * @return {string} @@ -110,7 +103,6 @@ function castString(subject) { return `${subject}`; } - /** * @param {any|any[]} subject * @return {number|number[]} @@ -118,14 +110,13 @@ function castString(subject) { function castNumber(subject) { if (_.isArrayLikeObject(subject)) { return subject.map(castNumber); - } - else if (_.isObject(subject)) { + } else if (_.isObject(subject)) { throw new Error(errMsg.cantCastType('object', 'number')); } const casted = Number(subject); if (isNaN(casted)) { throw new Error(errMsg.cantCastVal(subject, 'number')); - }; + } return casted; } diff --git a/src/utils/commandQueue.js b/src/utils/commandQueue.js index b6f1001..cfc87c4 100644 --- a/src/utils/commandQueue.js +++ b/src/utils/commandQueue.js @@ -18,7 +18,6 @@ export function markCurrentCommand(commandName) { currentCommand.attributes.invoked = true; } - /** * Find out of the last marked command in the command queue has upcoming * assertions that negate existence. @@ -42,20 +41,22 @@ export function upcomingAssertionNegatesExistence() { }); } - /** * @return {Command|false} */ function getLastMarkedCommand() { const queue = Cypress.cy.queue; - const cmd = queue.get() + const cmd = queue + .get() .filter((command) => command.get('invoked')) .pop(); if (cmd === undefined) { - console.error(`Could not find any marked commands in the queue. ` - + `Did you forget to mark the command during its invokation?` - + `\n\n${notInProduction}`); + console.error( + `Could not find any marked commands in the queue. ` + + `Did you forget to mark the command during its invokation?` + + `\n\n${notInProduction}` + ); return false; } @@ -63,7 +64,6 @@ function getLastMarkedCommand() { return cmd; } - /** * Recursively find all direct upcoming assertions * @param {Command} command diff --git a/src/utils/errorMessages.js b/src/utils/errorMessages.js index 174eccc..fadc400 100644 --- a/src/utils/errorMessages.js +++ b/src/utils/errorMessages.js @@ -1,35 +1,44 @@ import { repository } from '../../package.json'; - -export const notInProduction = `This message should never show ` - + `if you're a user of cypress-commands. If it does, please open ` - + `an issue at ${repository.url}.`; +export const notInProduction = + `This message should never show ` + + `if you're a user of cypress-commands. If it does, please open ` + + `an issue at ${repository.url}.`; export const command = { attribute: { - disable_strict: `This behaviour can be disabled by calling ` - + `'.attribute()' with the option 'strict: false'.`, + disable_strict: + `This behaviour can be disabled by calling ` + + `'.attribute()' with the option 'strict: false'.`, existence: { single: { negated: (attribute) => { - return `Expected element to not have attribute ` - + `'${attribute}', but it was continuously found.`; + return ( + `Expected element to not have attribute ` + + `'${attribute}', but it was continuously found.` + ); }, normal: (attribute) => { - return `Expected element to have attribute ` - + `'${attribute}', but never found it.`; + return ( + `Expected element to have attribute ` + + `'${attribute}', but never found it.` + ); }, }, multiple: { negated: (attribute, inputCount, outputCount) => { - return `Expected all ${inputCount} elements to not have ` - + `attribute '${attribute}', but it was continuously found on ` - + `${outputCount} elements.`; + return ( + `Expected all ${inputCount} elements to not have ` + + `attribute '${attribute}', but it was continuously found on ` + + `${outputCount} elements.` + ); }, normal: (attribute, inputCount, outputCount) => { - return `Expected all ${inputCount} elements to have ` - + `attribute '${attribute}', but never found it on ` - + `${inputCount - outputCount} elements.`; + return ( + `Expected all ${inputCount} elements to have ` + + `attribute '${attribute}', but never found it on ` + + `${inputCount - outputCount} elements.` + ); }, }, }, diff --git a/src/utils/isJquery.js b/src/utils/isJquery.js index c8dbd6b..ba536fa 100644 --- a/src/utils/isJquery.js +++ b/src/utils/isJquery.js @@ -10,4 +10,4 @@ export default function isJquery(value) { return false; } return !!value.jquery; -}; +} diff --git a/src/utils/optionValidator.js b/src/utils/optionValidator.js index 0752bae..aaea469 100644 --- a/src/utils/optionValidator.js +++ b/src/utils/optionValidator.js @@ -51,8 +51,7 @@ export default class OptionValidator { errMessage.end, ]); } - } - else if (_.isString(expected)) { + } else if (_.isString(expected)) { if (!eval(`'${actual}' ${expected}`)) { throw new CommandError([ errMessage.start, @@ -61,12 +60,13 @@ export default class OptionValidator { errMessage.end, ]); } - } - else { - throw new CommandError(`Not sure how to validate ` - + `the option "${option}" of the command "${this.command}".\n\n` - + `If you see this message in the wild, please create an issue ` - + `so this error can be resolved.\n${repoUrl}`); + } else { + throw new CommandError( + `Not sure how to validate ` + + `the option "${option}" of the command "${this.command}".\n\n` + + `If you see this message in the wild, please create an issue ` + + `so this error can be resolved.\n${repoUrl}` + ); } } } diff --git a/src/utils/whitespace.js b/src/utils/whitespace.js index 2d4d03a..30fb03c 100644 --- a/src/utils/whitespace.js +++ b/src/utils/whitespace.js @@ -7,10 +7,7 @@ export default function whitespace(mode) { if (mode === 'simplify') { return (input) => { - return input - .replace(zeroWidthWhitespace, '') - .replace(/\s+/g, ' ') - .trim(); + return input.replace(zeroWidthWhitespace, '').replace(/\s+/g, ' ').trim(); }; } diff --git a/types/attribute.d.ts b/types/attribute.d.ts index b64d3a4..767d1f7 100644 --- a/types/attribute.d.ts +++ b/types/attribute.d.ts @@ -5,21 +5,27 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/attribute.md */ - attribute(attribute: string, options?: { - log?: boolean; - whitespace?: 'simplify'|'keep-newline'|'keep'; - strict?: boolean; - }): Chainable + attribute( + attribute: string, + options?: { + log?: boolean; + whitespace?: 'simplify' | 'keep-newline' | 'keep'; + strict?: boolean; + } + ): Chainable; /** * Get the value of an attribute of a DOM element. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/attribute.md */ - attribute(options: { - log?: boolean; - whitespace?: 'simplify'|'keep-newline'|'keep'; - strict?: boolean; - }, attribute: string): Chainable + attribute( + options: { + log?: boolean; + whitespace?: 'simplify' | 'keep-newline' | 'keep'; + strict?: boolean; + }, + attribute: string + ): Chainable; } } diff --git a/types/text.d.ts b/types/text.d.ts index 913bf91..0947d12 100644 --- a/types/text.d.ts +++ b/types/text.d.ts @@ -7,8 +7,8 @@ declare namespace Cypress { */ text(options?: { log?: boolean; - whitespace?: 'simplify'|'keep-newline'|'keep'; + whitespace?: 'simplify' | 'keep-newline' | 'keep'; depth?: number; - }): Chainable + }): Chainable; } } diff --git a/types/then.d.ts b/types/then.d.ts index 0a3a9a8..9806c1e 100644 --- a/types/then.d.ts +++ b/types/then.d.ts @@ -5,19 +5,28 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/then.md */ - then(options: Partial, fn: (this: ObjectLike, currentSubject: Subject) => Chainable): Chainable + then( + options: Partial, + fn: (this: ObjectLike, currentSubject: Subject) => Chainable + ): Chainable; /** * Enables you to work with the subject yielded from the previous command / promise. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/then.md */ - then(options: Partial, fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike): Chainable + then( + options: Partial, + fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike + ): Chainable; /** * Enables you to work with the subject yielded from the previous command / promise. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/then.md */ - then(options: Partial, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable + then( + options: Partial, + fn: (this: ObjectLike, currentSubject: Subject) => S + ): Chainable; /** * Enables you to work with the subject yielded from the previous command. * @@ -26,26 +35,38 @@ declare namespace Cypress { * cy.get('.nav').then(($nav) => {}) // Yields .nav as first arg * cy.location().then((loc) => {}) // Yields location object as first arg */ - then(options: Partial, fn: (this: ObjectLike, currentSubject: Subject) => void): Chainable + then( + options: Partial, + fn: (this: ObjectLike, currentSubject: Subject) => void + ): Chainable; /** * Enables you to work with the subject yielded from the previous command. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/then.md */ - then(fn: (this: ObjectLike, currentSubject: Subject) => Chainable, options: Partial): Chainable + then( + fn: (this: ObjectLike, currentSubject: Subject) => Chainable, + options: Partial + ): Chainable; /** * Enables you to work with the subject yielded from the previous command / promise. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/then.md */ - then(fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike, options: Partial): Chainable + then( + fn: (this: ObjectLike, currentSubject: Subject) => PromiseLike, + options: Partial + ): Chainable; /** * Enables you to work with the subject yielded from the previous command / promise. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/then.md */ - then(fn: (this: ObjectLike, currentSubject: Subject) => S, options: Partial): Chainable + then( + fn: (this: ObjectLike, currentSubject: Subject) => S, + options: Partial + ): Chainable; /** * Enables you to work with the subject yielded from the previous command. * @@ -54,7 +75,10 @@ declare namespace Cypress { * cy.get('.nav').then(($nav) => {}) // Yields .nav as first arg * cy.location().then((loc) => {}) // Yields location object as first arg */ - then(fn: (this: ObjectLike, currentSubject: Subject) => void, options: Partial): Chainable + then( + fn: (this: ObjectLike, currentSubject: Subject) => void, + options: Partial + ): Chainable; } /** @@ -68,6 +92,6 @@ declare namespace Cypress { * * @default false */ - retry: boolean + retry: boolean; } } diff --git a/types/to.d.ts b/types/to.d.ts index a24b3cd..f9140dc 100644 --- a/types/to.d.ts +++ b/types/to.d.ts @@ -8,8 +8,11 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md */ - to(type: 'string'|'number'|'array', options?: { - log?: boolean; - }): Chainable + to( + type: 'string' | 'number' | 'array', + options?: { + log?: boolean; + } + ): Chainable; } } From 00aa3517fbac90b4fad2169209c2471af09715db Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 11:50:03 +0200 Subject: [PATCH 08/26] Removed Travis CI --- .travis.yml | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 2aa3b2a..0000000 --- a/.travis.yml +++ /dev/null @@ -1,22 +0,0 @@ -language: node_js -node_js: - - "10" - - "12" - - "14" -addons: - apt: - packages: - # Ubuntu 16+ does not install this dependency by default, so we need to install it ourselves - - libgconf-2-4 -cache: - # Caches $HOME/.npm when npm ci is default script command - # Caches node_modules in all other cases - npm: true - directories: - # we also need to cache folder with Cypress binary - - ~/.cache -script: - - npm run lint - - npm run test:source - - npm run bundle - - npm run test:bundle From 16bb62d0ce7e1682fed99a511de532ccc76afd6e Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 12:01:19 +0200 Subject: [PATCH 09/26] Some more formatting --- .eslintrc.js | 8 + cypress/integration/attribute.js | 261 ++- cypress/integration/copied/request.js | 2386 ++++++++++++----------- cypress/integration/request.js | 141 +- cypress/integration/text.js | 214 +- cypress/integration/then.js | 177 +- cypress/integration/to.js | 163 +- cypress/integration/utils/whitespace.js | 115 +- 8 files changed, 1729 insertions(+), 1736 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index d1f6f10..596f274 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -33,6 +33,14 @@ module.exports = { functions: 'never', }, ], + 'space-before-function-paren': [ + 'error', + { + anonymous: 'always', + named: 'never', + asyncArrow: 'always', + }, + ], }, overrides: [ { diff --git a/cypress/integration/attribute.js b/cypress/integration/attribute.js index 10e3dd1..3b7dace 100644 --- a/cypress/integration/attribute.js +++ b/cypress/integration/attribute.js @@ -2,18 +2,16 @@ const COMMAND_TIMEOUT = 4000; -describe('The added command `attribute`', function() { - before(function() { +describe('The added command `attribute`', function () { + before(function () { cy.visit('/'); }); - - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', COMMAND_TIMEOUT); }); - - it('considers empty attributes to be existing, but empty', function() { + it('considers empty attributes to be existing, but empty', function () { cy.get('.parent') .attribute('data-foo') .should('equal', '') @@ -21,17 +19,15 @@ describe('The added command `attribute`', function() { .should('be.empty'); }); - it('retries', function() { - cy.get('form input') - .attribute('data-attr') - .should('equal', '5'); + it('retries', function () { + cy.get('form input').attribute('data-attr').should('equal', '5'); }); - describe('handles implicit assertions correctly', function() { + describe('handles implicit assertions correctly', function () { let __logs; let __lastLog; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', 50); __logs = []; @@ -44,76 +40,67 @@ describe('The added command `attribute`', function() { return null; }); - describe('implicit assertion `to.exist`', function() { - it('throws when the attribute does not exist', function(done) { + describe('implicit assertion `to.exist`', function () { + it('throws when the attribute does not exist', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; expect(__logs.length).to.eq(2); expect(lastLog.get('error')).to.eq(err); - expect(err.message) - .to.include('Expected element to have attribute \'id\', ' - + 'but never found it.'); + expect(err.message).to.include( + `Expected element to have attribute 'id', but never found it.` + ); done(); }); - cy.get('.whitespace') - .attribute('id'); + cy.get('.whitespace').attribute('id'); }); - it('does not throw when the attribute does exist', function() { - cy.get('.whitespace') - .attribute('class'); + it('does not throw when the attribute does exist', function () { + cy.get('.whitespace').attribute('class'); }); }); - describe('Overwriting implicit assertions', function() { - it('can explicitly assert existence', function(done) { + describe('Overwriting implicit assertions', function () { + it('can explicitly assert existence', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(3); - expect(err.message) - .to.include('Expected element to have attribute \'id\', ' - + 'but never found it.'); + expect(err.message).to.include( + `Expected element to have attribute 'id', but never found it.` + ); done(); }); - cy.get('.whitespace') - .attribute('id') - .should('exist'); + cy.get('.whitespace').attribute('id').should('exist'); }); - it('overwrites implicit assertion when testing for non-existence', function(done) { + it('overwrites implicit assertion when testing for non-existence', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(3); - expect(err.message) - .to.include('Expected element to not have attribute \'class\', ' - + 'but it was continuously found.'); + expect(err.message).to.include( + `Expected element to not have attribute 'class', ` + + 'but it was continuously found.' + ); done(); }); - cy.get('.whitespace') - .attribute('class') - .should('not.exist'); + cy.get('.whitespace').attribute('class').should('not.exist'); }); }); }); - describe('The attribute of a single element', function() { - it('yields a string', function() { - cy.get('.whitespace') - .attribute('class') - .should('equal', 'whitespace'); + describe('The attribute of a single element', function () { + it('yields a string', function () { + cy.get('.whitespace').attribute('class').should('equal', 'whitespace'); }); - it('yields the first when an attribute exists twice', function() { - cy.get('.great-great-grandchild') - .attribute('data-foo') - .should('equal', 'bar'); + it('yields the first when an attribute exists twice', function () { + cy.get('.great-great-grandchild').attribute('data-foo').should('equal', 'bar'); }); }); - describe('The attribute of a multiple elements', function() { - it('yields an array of strings', function() { + describe('The attribute of a multiple elements', function () { + it('yields an array of strings', function () { cy.get('.parent > div') .attribute('data-relation') .should('have.lengthOf', 2) @@ -121,11 +108,11 @@ describe('The added command `attribute`', function() { }); }); - describe('options', function() { + describe('options', function () { let __logs; let __lastLog; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', 50); __logs = []; @@ -138,17 +125,13 @@ describe('The added command `attribute`', function() { return null; }); - it('does not mind flipping the order of properties', function() { - cy.get('.whitespace') - .attribute({}, 'class') - .should('equal', 'whitespace'); + it('does not mind flipping the order of properties', function () { + cy.get('.whitespace').attribute({}, 'class').should('equal', 'whitespace'); - cy.get('.whitespace') - .attribute('class', {}) - .should('equal', 'whitespace'); + cy.get('.whitespace').attribute('class', {}).should('equal', 'whitespace'); }); - it('does not log with `log: false`', function() { + it('does not log with `log: false`', function () { cy.get('.whitespace') .attribute('class', { log: false }) .then(() => { @@ -160,46 +143,48 @@ describe('The added command `attribute`', function() { .should('equal', 'whitespace'); }); - describe('strict', function() { - it('throws when not all subjects have the attribute', function(done) { + describe('strict', function () { + it('throws when not all subjects have the attribute', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include('Expected all 4 elements to have attribute ' - + '\'data-relation\', but never found it on 1 elements.'); + expect(err.message).to.include( + 'Expected all 4 elements to have attribute ' + + `'data-relation', but never found it on 1 elements.` + ); done(); }); cy.get('.parent > div > div, .parent > div') - .attribute('data-relation', {}); // strict: true is default + // strict: true is default + .attribute('data-relation', {}); }); - it('does not throw when not all subjects have the attribute ' - + 'and `strict: false`', function() { - cy.get('.parent div') - .attribute('data-relation', { strict: false }); - }); - - it('only yields the values of elements with the attribute when' - + '`strict: false`', function() { - cy.get('.parent div') - .attribute('data-relation', { strict: false }) - .should('be.lengthOf', 3) - .and('deep.equal', [ - 'child', - 'grandchild', - 'child', - ]); - }); - - context('Upcoming assertions', function() { - describe('should exist', function() { - it('throws when not all subjects have the attribute', function(done) { + it( + 'does not throw when not all subjects have the attribute ' + 'and `strict: false`', + function () { + cy.get('.parent div').attribute('data-relation', { strict: false }); + } + ); + + it( + 'only yields the values of elements with the attribute when' + '`strict: false`', + function () { + cy.get('.parent div') + .attribute('data-relation', { strict: false }) + .should('be.lengthOf', 3) + .and('deep.equal', ['child', 'grandchild', 'child']); + } + ); + + context('Upcoming assertions', function () { + describe('should exist', function () { + it('throws when not all subjects have the attribute', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(3); - expect(err.message) - .to.include('Expected all 4 elements to have attribute ' - + '\'data-relation\', but never found it on 1 elements.'); + expect(err.message).to.include( + 'Expected all 4 elements to have attribute ' + + `'data-relation', but never found it on 1 elements.` + ); done(); }); @@ -208,27 +193,28 @@ describe('The added command `attribute`', function() { .should('exist'); }); - it('does not throw when all subjects have the attribute', function() { + it('does not throw when all subjects have the attribute', function () { cy.get('.parent > div') .attribute('data-relation', { strict: true }) .should('exist'); }); }); - describe('should not exist', function() { - it('does not throw when none of the subjects have attribute', function() { + describe('should not exist', function () { + it('does not throw when none of the subjects have attribute', function () { cy.get('.parent > div > div, .parent > div') .attribute('data-nonExistent', { strict: true }) .should('not.exist'); }); - it('throws when some of the subjects have attribute', function(done) { + it('throws when some of the subjects have attribute', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(3); - expect(err.message) - .to.include('Expected all 4 elements to not have attribute ' - + '\'data-relation\', but it was continuously found on 3 ' - + 'elements.'); + expect(err.message).to.include( + 'Expected all 4 elements to not have attribute ' + + `'data-relation', but it was continuously found on 3 ` + + 'elements.' + ); done(); }); @@ -241,67 +227,74 @@ describe('The added command `attribute`', function() { * Initial support for negating existence in strict mode depended on Cypress' * logging framework. This resulted in unexpected behaviour when `log: false`. */ - it('throws when some of the subjects have attribute and ' - + '`log: false`', function(done) { - cy.on('fail', (err) => { - expect(__logs.length).to.eq(2); - expect(err.message) - .to.include('Expected all 4 elements to not have attribute ' - + '\'data-relation\', but it was continuously found on 3 ' - + 'elements.'); - done(); - }); - - cy.get('.parent > div > div, .parent > div') - .attribute('data-relation', { strict: true, log: false }) - .should('not.exist'); - }); + it( + 'throws when some of the subjects have attribute and ' + '`log: false`', + function (done) { + cy.on('fail', (err) => { + expect(__logs.length).to.eq(2); + expect(err.message).to.include( + 'Expected all 4 elements to not have attribute ' + + `'data-relation', but it was continuously found on 3 ` + + 'elements.' + ); + done(); + }); + + cy.get('.parent > div > div, .parent > div') + .attribute('data-relation', { strict: true, log: false }) + .should('not.exist'); + } + ); /** * Bug with checking if the upcoming assertions negate existence */ - it('throws when in the second call to attribute some of ' - + 'the subjects have attribute', function(done) { - cy.on('fail', (err) => { - expect(__logs.length).to.eq(6); - expect(err.message) - .to.include('Expected all 4 elements to have attribute ' - + '\'data-relation\', but never found it on 1 elements'); - done(); - }); - - cy.get('.parent > div > div, .parent > div') - .attribute('data-rel', { strict: true }) - .should('not.exist'); - - cy.get('.parent > div > div, .parent > div') - .attribute('data-relation', { strict: true }) - .should('exist'); - }); + it( + 'throws when in the second call to attribute some of ' + + 'the subjects have attribute', + function (done) { + cy.on('fail', (err) => { + expect(__logs.length).to.eq(6); + expect(err.message).to.include( + 'Expected all 4 elements to have attribute ' + + `'data-relation', but never found it on 1 elements` + ); + done(); + }); + + cy.get('.parent > div > div, .parent > div') + .attribute('data-rel', { strict: true }) + .should('not.exist'); + + cy.get('.parent > div > div, .parent > div') + .attribute('data-relation', { strict: true }) + .should('exist'); + } + ); }); }); }); - describe('whitespace', function() { - it('`keep` is the default value', function() { + describe('whitespace', function () { + it('`keep` is the default value', function () { cy.get('div.whitespace') .attribute('data-complex') .should('equal', ' some    \t very\n complex\twhitespace'); }); - it('`simplify` simplifies all whitespace', function() { + it('`simplify` simplifies all whitespace', function () { cy.get('div.whitespace') .attribute('data-complex', { whitespace: 'simplify' }) .should('equal', 'some very complex whitespace'); }); - it('`keep-newline` simplifies all whitespace except newlines', function() { + it('`keep-newline` simplifies all whitespace except newlines', function () { cy.get('div.whitespace') .attribute('data-complex', { whitespace: 'keep-newline' }) .should('equal', 'some very\ncomplex whitespace'); }); - it('`keep` does not change whitespace at all', function() { + it('`keep` does not change whitespace at all', function () { cy.get('div.whitespace') .attribute('data-complex', { whitespace: 'keep' }) .should('equal', ' some    \t very\n complex\twhitespace'); diff --git a/cypress/integration/copied/request.js b/cypress/integration/copied/request.js index 6c86d65..6f0e876 100644 --- a/cypress/integration/copied/request.js +++ b/cypress/integration/copied/request.js @@ -1,1000 +1,1047 @@ /* eslint-disable */ -const { stripIndent } = require('common-tags') -const { _, Promise } = Cypress +const { stripIndent } = require('common-tags'); +const { _, Promise } = Cypress; -const RESPONSE_TIMEOUT = 22222 +const RESPONSE_TIMEOUT = 22222; // Tests copied from develop branch of cypress@4.12.1 -describe('src/cy/commands/request', function() { - context('#request', { - responseTimeout: RESPONSE_TIMEOUT, - }, function() { - beforeEach(function() { - cy.stub(Cypress, 'backend').callThrough() - }) - - describe('argument signature', function() { - beforeEach(function () { - const backend = Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 200 }) - - this.expectOptionsToBe = function (opts) { - _.defaults(opts, { - failOnStatusCode: true, - retryOnNetworkFailure: true, - retryOnStatusCodeFailure: false, - encoding: 'utf8', - gzip: true, - followRedirect: true, - timeout: RESPONSE_TIMEOUT, - method: 'GET', - }) - - const options = backend.firstCall.args[1] - - _.each(options, (value, key) => { - expect(options[key]).to.deep.eq(opts[key], `failed on property: (${key})`) - }) - - _.each(opts, (value, key) => { - expect(opts[key]).to.deep.eq(options[key], `failed on property: (${key})`) - }) - } - }) - - it('accepts object with url', function() { - cy.request({ url: 'http://localhost:8000/foo' }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8000/foo', - }) - }) - }) - - it('accepts object with url, method, headers, body', function() { - cy.request({ - url: 'http://github.com/users', - method: 'POST', - body: { name: 'brian' }, - headers: { - 'x-token': 'abc123', - }, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://github.com/users', - method: 'POST', - json: true, - body: { name: 'brian' }, - headers: { - 'x-token': 'abc123', - }, - }) - }) - }) - - it('accepts object with url + timeout', function() { - cy.request({ url: 'http://localhost:8000/foo', timeout: 23456 }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8000/foo', - timeout: 23456, - }) - }) - }) - - it('accepts string url', function() { - cy.request('http://localhost:8080/status').then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/status', - }) - }) - }) - - it('accepts method + url', function() { - cy.request('DELETE', 'http://localhost:1234/users/1').then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/users/1', - method: 'DELETE', - }) - }) - }) - - it('accepts method + url + body', function() { - cy.request('POST', 'http://localhost:8080/users', { name: 'brian' }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/users', - method: 'POST', - body: { name: 'brian' }, - json: true, - }) - }) - }) - - it('accepts url + body', function() { - cy.request('http://www.github.com/projects/foo', { commits: true }).then(() => { - this.expectOptionsToBe({ - url: 'http://www.github.com/projects/foo', - body: { commits: true }, - json: true, - }) - }) - }) - - it('accepts url + string body', function() { - cy.request('http://www.github.com/projects/foo', 'foo').then(() => { - this.expectOptionsToBe({ - url: 'http://www.github.com/projects/foo', - body: 'foo', - }) - }) - }) - - context('method normalization', function() { - it('uppercases method', function() { - cy.request('post', 'https://www.foo.com').then(() => { - this.expectOptionsToBe({ - url: 'https://www.foo.com/', - method: 'POST', - }) - }) - }) - }) - - context('url normalization', function() { - it('uses absolute urls and adds trailing slash', { - baseUrl: 'http://localhost:8080/app', - }, function() { - cy.request('https://www.foo.com').then(() => { - this.expectOptionsToBe({ - url: 'https://www.foo.com/', - }) - }) - }) - - it('uses localhost urls', function() { - cy.request('localhost:1234').then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/', - }) - }) - }) - - it('uses www urls', function() { - cy.request('www.foo.com').then(() => { - this.expectOptionsToBe({ - url: 'http://www.foo.com/', - }) - }) - }) - - it('prefixes with baseUrl when origin is empty', { - baseUrl: 'http://localhost:8080/app', - requestBaseUrl: null, - }, function() { - cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns('') - - cy.request('/foo/bar?cat=1').then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/app/foo/bar?cat=1', - }) - }) - }) - - it('prefixes with baseUrl over current origin', { - baseUrl: 'http://localhost:8080/app', - requestBaseUrl: null, - }, function() { - cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns('http://localhost:1234') - - cy.request('foobar?cat=1').then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/app/foobar?cat=1', - }) - }) - }) - - // https://github.com/cypress-io/cypress/issues/5274 - it('encode url with ’ character in pathname', function() { - cy.request({ url: 'http://localhost:1234/’' }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/%E2%80%99', - }) - }) - }) - - it('dont re-encode url with ’ escaped in pathname', function() { - cy.request({ url: encodeURI('http://localhost:1234/’') }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/%E2%80%99', - }) - }) - }) - - it('encode url with % character in pathname', function() { - cy.request({ url: 'http://localhost:1234/%' }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/%', - }) - }) - }) - - it('dont re-encode url with % escaped in pathname', function() { - cy.request({ url: encodeURI('http://localhost:1234/%') }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/%25', - }) - }) - }) - - it('encode url with Astral Plane Unicode in pathname', function() { - cy.request({ url: 'http://localhost:1234/😀' }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/%F0%9F%98%80', - }) - }) - }) - - it('dont re-encode url with Astral Plane Unicode escaped character in pathname', function() { - cy.request({ url: encodeURI('http://localhost:1234/😀') }).then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:1234/%F0%9F%98%80', - }) - }) - }) - - it('should percent escape Unicode in pathname and convert Unicode in domain name properly', function() { - cy.request({ url: 'http://localhost😀:1234/😀' }).then(() => { - this.expectOptionsToBe({ - url: 'http://xn--localhost-ob26h:1234/%F0%9F%98%80', - }) - }) - }) - - it('should percent escape Unicode in pathname and convert Unicode in domain name with URI encoded URL', function() { - cy.request({ url: encodeURI('http://localhost😀:1234/😀') }).then(() => { - this.expectOptionsToBe({ - url: 'http://xn--localhost-ob26h:1234/%F0%9F%98%80', - }) - }) - }) - }) - - context('encoding', function() { - it('lowercases encoding', function() { - cy.request({ - url: 'http://localhost:8080/', - encoding: 'UtF8', - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/', - encoding: 'utf8', - }) - }) - }) - - it('defaults encoding to `utf8`', function() { - cy.request({ - url: 'http://localhost:8080/', - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/', - encoding: 'utf8', - }) - }) - }) - }) - - context('gzip', function() { - it('can turn off gzipping', function() { - cy.request({ - url: 'http://localhost:8080', - gzip: false, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/', - gzip: false, - }) - }) - }) - }) - - context('auth', function() { - it('sends auth when it is an object', function() { - cy.request({ - url: 'http://localhost:8888', - auth: { - user: 'brian', - pass: 'password', - }, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - auth: { - user: 'brian', - pass: 'password', - }, - }) - }) - }) - }) - - context('followRedirect', function() { - it('is true by default', function() { - cy.request('http://localhost:8888') - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - }) - }) - }) - - it('can be set to false', function() { - cy.request({ - url: 'http://localhost:8888', - followRedirect: false, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - followRedirect: false, - }) - }) - }) - - it('normalizes followRedirects -> followRedirect', function() { - cy.request({ - url: 'http://localhost:8888', - followRedirects: false, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - followRedirect: false, - }) - }) - }) - }) - - context('qs', function() { - it('accepts an object literal', function() { - cy.request({ - url: 'http://localhost:8888', - qs: { - foo: 'bar', - }, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - qs: { foo: 'bar' }, - }) - }) - }) - }) - - context('form', function() { - it('accepts an object literal for body', function() { - cy.request({ - url: 'http://localhost:8888', - form: true, - body: { - foo: 'bar', - }, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - form: true, - body: { foo: 'bar' }, - }) - }) - }) - - it('accepts a string for body', function() { - cy.request({ - url: 'http://localhost:8888', - form: true, - body: 'foo=bar&baz=quux', - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - form: true, - body: 'foo=bar&baz=quux', - }) - }) - }) - - // https://github.com/cypress-io/cypress/issues/2923 - it('application/x-www-form-urlencoded w/ an object body uses form: true', function() { - cy.request({ - url: 'http://localhost:8888', - headers: { - 'a': 'b', - 'Content-type': 'application/x-www-form-urlencoded', - }, - body: { foo: 'bar' }, - }) - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8888/', - form: true, - headers: { - 'a': 'b', - 'Content-type': 'application/x-www-form-urlencoded', - }, - body: { foo: 'bar' }, - }) - }) - }) - }) - }) - - describe('failOnStatusCode', function() { - it('does not fail on status 401', function() { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: false, status: 401 }) - - cy.request({ - url: 'http://localhost:1234/foo', - failOnStatusCode: false, - }) - .then((resp) => { - // make sure it really was 500! - expect(resp.status).to.eq(401) - }) - }) - }) - - describe('method', function() { - it.skip('can use M-SEARCH method', function() { - cy.request({ - url: 'http://localhost:3500/dump-method', - method: 'm-Search', - }) - .then((res) => { - expect(res.body).to.contain('M-SEARCH') - }) - }) - }) - - describe('headers', function() { - it.skip('can send user-agent header', function() { - cy.request({ - url: 'http://localhost:3500/dump-headers', - headers: { - 'user-agent': 'something special', - }, - }) - .then((res) => { - expect(res.body).to.contain('"user-agent":"something special"') - }) - }) - }) - - describe('subjects', function() { - it('resolves with response obj', function() { - const resp = { - status: 200, - isOkStatusCode: true, - body: 'foo', - headers: { foo: 'bar' }, - } - - Cypress.backend - .withArgs('http:request') - .resolves(resp) - - cy.request('http://www.foo.com').then((subject) => { - expect(subject).to.deep.eq(resp) - }) - }) - }) - - describe('timeout', function() { - beforeEach(function() { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 200 }) - }) - - it('sets timeout to Cypress.config(responseTimeout)', { - responseTimeout: 2500, - }, function() { - const timeout = cy.spy(Promise.prototype, 'timeout') - - cy.request('http://www.foo.com').then(function() { - expect(timeout).to.be.calledWith(2500) - }) - }) - - it('can override timeout', function() { - const timeout = cy.spy(Promise.prototype, 'timeout') - - cy.request({ url: 'http://www.foo.com', timeout: 1000 }).then(function() { - expect(timeout).to.be.calledWith(1000) - }) - }) - - it('clears the current timeout and restores after success', function() { - cy.timeout(100) - - cy.spy(cy, 'clearTimeout') - - cy.request('http://www.foo.com').then(function() { - expect(cy.clearTimeout).to.be.calledWith('http:request') - - // restores the timeout afterwards - expect(cy.timeout()).to.eq(100) - }) - }) - }) - - describe('.log', function() { - beforeEach(function () { - this.lastLog = undefined; - cy.on('log:added', (attrs, log) => { - if (attrs.name === 'request') { - this.lastLog = log - } - }) - }) - - it('can turn off logging', function() { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 200 }) - - cy.request({ - url: 'http://localhost:8080', - log: false, - }) - .then(() => { - expect(this.lastLog).to.be.undefined - }) - }) - - it('logs immediately before resolving', function(done) { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 200 }) - - cy.on('log:added', (attrs, log) => { - if (log.get('name') === 'request') { - expect(log.get('state')).to.eq('pending') - expect(log.get('message')).to.eq('') - - done() - } - }) - - cy.request('http://localhost:8080') - }) - - // SKIP: only passes in cypress open, not in cypress run - it.skip('snapshots after clicking', function() { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 200 }) - - cy.request('http://localhost:8080').then(() => { - const { lastLog } = this - - expect(lastLog.get('snapshots').length).to.eq(1) - expect(lastLog.get('snapshots')[0]).to.be.an('object') - }) - }) - - it('.consoleProps', function() { - const allRequestResponse = { - 'Request URL': 'http://localhost:8080/foo', - 'Request Headers': { 'x-token': 'ab123' }, - 'Request Body': { first: 'brian' }, - 'Response Headers': { - 'Content-Type': 'application/json', - }, - 'Response Body': { id: 123 }, - } - - Cypress.backend - .withArgs('http:request') - .resolves({ - duration: 10, - status: 201, - isOkStatusCode: true, - body: { id: 123 }, - headers: { - 'Content-Type': 'application/json', - }, - requestHeaders: { 'x-token': 'ab123' }, - requestBody: { first: 'brian' }, - allRequestResponses: [allRequestResponse], - }); - - cy.request({ - url: 'http://localhost:8080/foo', - headers: { 'x-token': 'abc123' }, - method: 'POST', - body: { first: 'brian' }, - }) - .then(() => { - const consoleProps = this.lastLog.invoke('consoleProps'); - expect(consoleProps.Command).to.eq('request'); - expect(consoleProps.Request).to.deep.eq(allRequestResponse); - expect(consoleProps.Yielded).to.deep.eq({ - duration: 10, - status: 201, - body: { id: 123 }, - headers: { - 'Content-Type': 'application/json', - }, - }); - }) - }) - - it('.consoleProps with array of allRequestResponses', function() { - const allRequestResponses = [{ - 'Request URL': 'http://localhost:8080/foo', - 'Request Headers': { 'x-token': 'ab123' }, - 'Request Body': { first: 'brian' }, - 'Response Headers': { - 'Content-Type': 'application/json', - }, - 'Response Body': { id: 123 }, - }, { - 'Request URL': 'http://localhost:8080/foo', - 'Request Headers': { 'x-token': 'ab123' }, - 'Request Body': { first: 'brian' }, - 'Response Headers': { - 'Content-Type': 'application/json', - }, - 'Response Body': { id: 123 }, - }] - - Cypress.backend - .withArgs('http:request') - .resolves({ - duration: 10, - status: 201, - isOkStatusCode: true, - body: { id: 123 }, - headers: { - 'Content-Type': 'application/json', - }, - requestHeaders: { 'x-token': 'ab123' }, - requestBody: { first: 'brian' }, - allRequestResponses, - }) - - cy.request({ - url: 'http://localhost:8080/foo', - headers: { 'x-token': 'abc123' }, - method: 'POST', - body: { first: 'brian' }, - }) - .then(() => { - const consoleProps = this.lastLog.invoke('consoleProps'); - expect(consoleProps.Command).to.eq('request'); - expect(consoleProps.Requests).to.deep.eq(allRequestResponses); - expect(consoleProps.Yielded).to.deep.eq({ - duration: 10, - status: 201, - body: { id: 123 }, - headers: { - 'Content-Type': 'application/json', - }, - }); - }) - }) - - describe('.renderProps', function() { - describe('in any case', function() { - it('sends correct message', function() { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 201 }) - - cy.request('http://localhost:8080/foo').then(() => { - expect(this.lastLog.invoke('renderProps').message).to.equal('GET 201 http://localhost:8080/foo') - }) - }) - }) - - describe('when response is successful', function() { - it('sends correct indicator', function() { - Cypress.backend - .withArgs('http:request') - .resolves({ isOkStatusCode: true, status: 201 }) - - cy.request('http://localhost:8080/foo').then(() => { - expect(this.lastLog.invoke('renderProps').indicator).to.equal('successful') - }) - }) - }) - - describe('when response is outside 200 range', function() { - it('sends correct indicator', function (done) { - cy.on('fail', (err) => { - expect(this.lastLog.invoke('renderProps').indicator).to.equal('bad') - - done() - }) - - Cypress.backend - .withArgs('http:request') - .resolves({ status: 500 }) - - cy.request('http://localhost:8080/foo') - }) - }) - }) - }) - - describe('errors', { - defaultCommandTimeout: 50, - }, function() { - beforeEach(function () { - this.logs = [] - - cy.on('log:added', (attrs, log) => { - if (attrs.name === 'request') { - this.lastLog = log - this.logs.push(log) - } - }) - - return null - }) - - it('throws when no url is passed', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` requires a `url`. You did not provide a `url`.') - - done() - }) - - cy.request() - }) - - it('throws when url is not FQDN', { - baseUrl: '', - requestBaseUrl: null, - }, function (done) { - cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns('') - - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` must be provided a fully qualified `url` - one that begins with `http`. By default `cy.request()` will use either the current window\'s origin or the `baseUrl` in `cypress.json`. Neither of those values were present.') - - done() - }) - - cy.request('/foo/bar') - }) - - it('throws when url is not FQDN, notes that configFile is disabled', { - baseUrl: '', - requestBaseUrl: null, - configFile: false, - }, function (done) { - cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns('') - - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` must be provided a fully qualified `url` - one that begins with `http`. By default `cy.request()` will use either the current window\'s origin or the `baseUrl` in `cypress.json` (currently disabled by --config-file=false). Neither of those values were present.') - - done() - }) - - cy.request('/foo/bar') - }) - - it('throws when url is not FQDN, notes that configFile is non-default', { - baseUrl: '', - requestBaseUrl: null, - configFile: 'foo.json', - }, function (done) { - cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns('') - - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` must be provided a fully qualified `url` - one that begins with `http`. By default `cy.request()` will use either the current window\'s origin or the `baseUrl` in `foo.json`. Neither of those values were present.') - - done() - }) - - cy.request('/foo/bar') - }) - - it('throws when url isnt a string', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` requires the `url` to be a string.') - - done() - }) - - cy.request({ - url: [], - }) - }) - - it('throws when auth is truthy but not an object', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` must be passed an object literal for the `auth` option.') - - done() - }) - - cy.request({ - url: 'http://localhost:1234/foo', - auth: 'foobar', - }) - }) - - it('throws when headers is truthy but not an object', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` requires the `headers` option to be an object literal.') - - done() - }) - - cy.request({ - url: 'http://localhost:1234/foo', - headers: 'foo=bar', - }) - }) - - it('throws on invalid method', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` was called with an invalid method: `FOO`. Method can be: `GET`, `POST`, `PUT`, `DELETE`, `PATCH`, `HEAD`, `OPTIONS`, or any other method supported by Node\'s HTTP parser.') - - done() - }) - - cy.request({ - url: 'http://localhost:1234/foo', - method: 'FOO', - }) - }) - - it('throws when gzip is not boolean', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` requires the `gzip` option to be a boolean.') - - done() - }) - - cy.request({ - url: 'http://localhost:1234/foo', - gzip: {}, - }) - }) - - it('throws when encoding is not valid', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` was called with invalid encoding: `binaryX`. Encoding can be: `utf8`, `utf16le`, `latin1`, `base64`, `hex`, `ascii`, `binary`, `latin1`, `ucs2`, `utf16le`, or any other encoding supported by Node\'s Buffer encoding.') - - done() - }) - - cy.request({ - url: 'http://localhost:1234/foo', - encoding: 'binaryX', - }) - }) - - it('throws when form isnt a boolean', function (done) { - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith('`cy.request()` requires the `form` option to be a boolean.\n\nIf you\'re trying to send a `x-www-form-urlencoded` request then pass either a string or object literal to the `body` property.') - - done() - }) - - cy.request({ - url: 'http://localhost:1234/foo', - form: { foo: 'bar' }, - }) - }) - - it('throws when failOnStatusCode is false and retryOnStatusCodeFailure is true', function(done) { - cy.on('fail', (err) => { - expect(err.message).to.contain('`cy.request()` was invoked with `{ failOnStatusCode: false, retryOnStatusCodeFailure: true }`.') - - done() - }) - - cy.request({ - url: 'http://foobarbaz', - failOnStatusCode: false, - retryOnStatusCodeFailure: true, - }) - }) - - it('throws when status code doesnt start with 2 and failOnStatusCode is true', function (done) { - Cypress.backend - .withArgs('http:request') - .resolves({ - isOkStatusCode: false, - status: 500, - statusText: 'Server Error', - headers: { - baz: 'quux', - }, - body: 'response body', - requestHeaders: { - foo: 'bar', - }, - requestBody: 'request body', - redirects: [ - '301: http://www.google.com', - ], - }) - - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.include(stripIndent`\ +describe('src/cy/commands/request', function () { + context( + '#request', + { + responseTimeout: RESPONSE_TIMEOUT, + }, + function () { + beforeEach(function () { + cy.stub(Cypress, 'backend').callThrough(); + }); + + describe('argument signature', function () { + beforeEach(function () { + const backend = Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 200 }); + + this.expectOptionsToBe = function (opts) { + _.defaults(opts, { + failOnStatusCode: true, + retryOnNetworkFailure: true, + retryOnStatusCodeFailure: false, + encoding: 'utf8', + gzip: true, + followRedirect: true, + timeout: RESPONSE_TIMEOUT, + method: 'GET', + }); + + const options = backend.firstCall.args[1]; + + _.each(options, (value, key) => { + expect(options[key]).to.deep.eq( + opts[key], + `failed on property: (${key})` + ); + }); + + _.each(opts, (value, key) => { + expect(opts[key]).to.deep.eq( + options[key], + `failed on property: (${key})` + ); + }); + }; + }); + + it('accepts object with url', function () { + cy.request({ url: 'http://localhost:8000/foo' }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8000/foo', + }); + }); + }); + + it('accepts object with url, method, headers, body', function () { + cy.request({ + url: 'http://github.com/users', + method: 'POST', + body: { name: 'brian' }, + headers: { + 'x-token': 'abc123', + }, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://github.com/users', + method: 'POST', + json: true, + body: { name: 'brian' }, + headers: { + 'x-token': 'abc123', + }, + }); + }); + }); + + it('accepts object with url + timeout', function () { + cy.request({ url: 'http://localhost:8000/foo', timeout: 23456 }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8000/foo', + timeout: 23456, + }); + }); + }); + + it('accepts string url', function () { + cy.request('http://localhost:8080/status').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/status', + }); + }); + }); + + it('accepts method + url', function () { + cy.request('DELETE', 'http://localhost:1234/users/1').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/users/1', + method: 'DELETE', + }); + }); + }); + + it('accepts method + url + body', function () { + cy.request('POST', 'http://localhost:8080/users', { name: 'brian' }).then( + () => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/users', + method: 'POST', + body: { name: 'brian' }, + json: true, + }); + } + ); + }); + + it('accepts url + body', function () { + cy.request('http://www.github.com/projects/foo', { commits: true }).then(() => { + this.expectOptionsToBe({ + url: 'http://www.github.com/projects/foo', + body: { commits: true }, + json: true, + }); + }); + }); + + it('accepts url + string body', function () { + cy.request('http://www.github.com/projects/foo', 'foo').then(() => { + this.expectOptionsToBe({ + url: 'http://www.github.com/projects/foo', + body: 'foo', + }); + }); + }); + + context('method normalization', function () { + it('uppercases method', function () { + cy.request('post', 'https://www.foo.com').then(() => { + this.expectOptionsToBe({ + url: 'https://www.foo.com/', + method: 'POST', + }); + }); + }); + }); + + context('url normalization', function () { + it( + 'uses absolute urls and adds trailing slash', + { + baseUrl: 'http://localhost:8080/app', + }, + function () { + cy.request('https://www.foo.com').then(() => { + this.expectOptionsToBe({ + url: 'https://www.foo.com/', + }); + }); + } + ); + + it('uses localhost urls', function () { + cy.request('localhost:1234').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/', + }); + }); + }); + + it('uses www urls', function () { + cy.request('www.foo.com').then(() => { + this.expectOptionsToBe({ + url: 'http://www.foo.com/', + }); + }); + }); + + it( + 'prefixes with baseUrl when origin is empty', + { + baseUrl: 'http://localhost:8080/app', + requestBaseUrl: null, + }, + function () { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); + + cy.request('/foo/bar?cat=1').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/app/foo/bar?cat=1', + }); + }); + } + ); + + it( + 'prefixes with baseUrl over current origin', + { + baseUrl: 'http://localhost:8080/app', + requestBaseUrl: null, + }, + function () { + cy.stub(cy, 'getRemoteLocation') + .withArgs('origin') + .returns('http://localhost:1234'); + + cy.request('foobar?cat=1').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/app/foobar?cat=1', + }); + }); + } + ); + + // https://github.com/cypress-io/cypress/issues/5274 + it('encode url with ’ character in pathname', function () { + cy.request({ url: 'http://localhost:1234/’' }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/%E2%80%99', + }); + }); + }); + + it('dont re-encode url with ’ escaped in pathname', function () { + cy.request({ url: encodeURI('http://localhost:1234/’') }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/%E2%80%99', + }); + }); + }); + + it('encode url with % character in pathname', function () { + cy.request({ url: 'http://localhost:1234/%' }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/%', + }); + }); + }); + + it('dont re-encode url with % escaped in pathname', function () { + cy.request({ url: encodeURI('http://localhost:1234/%') }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/%25', + }); + }); + }); + + it('encode url with Astral Plane Unicode in pathname', function () { + cy.request({ url: 'http://localhost:1234/😀' }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/%F0%9F%98%80', + }); + }); + }); + + it('dont re-encode url with Astral Plane Unicode escaped character in pathname', function () { + cy.request({ url: encodeURI('http://localhost:1234/😀') }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:1234/%F0%9F%98%80', + }); + }); + }); + + it('should percent escape Unicode in pathname and convert Unicode in domain name properly', function () { + cy.request({ url: 'http://localhost😀:1234/😀' }).then(() => { + this.expectOptionsToBe({ + url: 'http://xn--localhost-ob26h:1234/%F0%9F%98%80', + }); + }); + }); + + it('should percent escape Unicode in pathname and convert Unicode in domain name with URI encoded URL', function () { + cy.request({ url: encodeURI('http://localhost😀:1234/😀') }).then(() => { + this.expectOptionsToBe({ + url: 'http://xn--localhost-ob26h:1234/%F0%9F%98%80', + }); + }); + }); + }); + + context('encoding', function () { + it('lowercases encoding', function () { + cy.request({ + url: 'http://localhost:8080/', + encoding: 'UtF8', + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/', + encoding: 'utf8', + }); + }); + }); + + it('defaults encoding to `utf8`', function () { + cy.request({ + url: 'http://localhost:8080/', + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/', + encoding: 'utf8', + }); + }); + }); + }); + + context('gzip', function () { + it('can turn off gzipping', function () { + cy.request({ + url: 'http://localhost:8080', + gzip: false, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/', + gzip: false, + }); + }); + }); + }); + + context('auth', function () { + it('sends auth when it is an object', function () { + cy.request({ + url: 'http://localhost:8888', + auth: { + user: 'brian', + pass: 'password', + }, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + auth: { + user: 'brian', + pass: 'password', + }, + }); + }); + }); + }); + + context('followRedirect', function () { + it('is true by default', function () { + cy.request('http://localhost:8888').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + }); + }); + }); + + it('can be set to false', function () { + cy.request({ + url: 'http://localhost:8888', + followRedirect: false, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + followRedirect: false, + }); + }); + }); + + it('normalizes followRedirects -> followRedirect', function () { + cy.request({ + url: 'http://localhost:8888', + followRedirects: false, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + followRedirect: false, + }); + }); + }); + }); + + context('qs', function () { + it('accepts an object literal', function () { + cy.request({ + url: 'http://localhost:8888', + qs: { + foo: 'bar', + }, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + qs: { foo: 'bar' }, + }); + }); + }); + }); + + context('form', function () { + it('accepts an object literal for body', function () { + cy.request({ + url: 'http://localhost:8888', + form: true, + body: { + foo: 'bar', + }, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + form: true, + body: { foo: 'bar' }, + }); + }); + }); + + it('accepts a string for body', function () { + cy.request({ + url: 'http://localhost:8888', + form: true, + body: 'foo=bar&baz=quux', + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + form: true, + body: 'foo=bar&baz=quux', + }); + }); + }); + + // https://github.com/cypress-io/cypress/issues/2923 + it('application/x-www-form-urlencoded w/ an object body uses form: true', function () { + cy.request({ + url: 'http://localhost:8888', + headers: { + 'a': 'b', + 'Content-type': 'application/x-www-form-urlencoded', + }, + body: { foo: 'bar' }, + }).then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8888/', + form: true, + headers: { + 'a': 'b', + 'Content-type': 'application/x-www-form-urlencoded', + }, + body: { foo: 'bar' }, + }); + }); + }); + }); + }); + + describe('failOnStatusCode', function () { + it('does not fail on status 401', function () { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: false, status: 401 }); + + cy.request({ + url: 'http://localhost:1234/foo', + failOnStatusCode: false, + }).then((resp) => { + // make sure it really was 500! + expect(resp.status).to.eq(401); + }); + }); + }); + + describe('method', function () { + it.skip('can use M-SEARCH method', function () { + cy.request({ + url: 'http://localhost:3500/dump-method', + method: 'm-Search', + }).then((res) => { + expect(res.body).to.contain('M-SEARCH'); + }); + }); + }); + + describe('headers', function () { + it.skip('can send user-agent header', function () { + cy.request({ + url: 'http://localhost:3500/dump-headers', + headers: { + 'user-agent': 'something special', + }, + }).then((res) => { + expect(res.body).to.contain('"user-agent":"something special"'); + }); + }); + }); + + describe('subjects', function () { + it('resolves with response obj', function () { + const resp = { + status: 200, + isOkStatusCode: true, + body: 'foo', + headers: { foo: 'bar' }, + }; + + Cypress.backend.withArgs('http:request').resolves(resp); + + cy.request('http://www.foo.com').then((subject) => { + expect(subject).to.deep.eq(resp); + }); + }); + }); + + describe('timeout', function () { + beforeEach(function () { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 200 }); + }); + + it( + 'sets timeout to Cypress.config(responseTimeout)', + { + responseTimeout: 2500, + }, + function () { + const timeout = cy.spy(Promise.prototype, 'timeout'); + + cy.request('http://www.foo.com').then(function () { + expect(timeout).to.be.calledWith(2500); + }); + } + ); + + it('can override timeout', function () { + const timeout = cy.spy(Promise.prototype, 'timeout'); + + cy.request({ url: 'http://www.foo.com', timeout: 1000 }).then(function () { + expect(timeout).to.be.calledWith(1000); + }); + }); + + it('clears the current timeout and restores after success', function () { + cy.timeout(100); + + cy.spy(cy, 'clearTimeout'); + + cy.request('http://www.foo.com').then(function () { + expect(cy.clearTimeout).to.be.calledWith('http:request'); + + // restores the timeout afterwards + expect(cy.timeout()).to.eq(100); + }); + }); + }); + + describe('.log', function () { + beforeEach(function () { + this.lastLog = undefined; + cy.on('log:added', (attrs, log) => { + if (attrs.name === 'request') { + this.lastLog = log; + } + }); + }); + + it('can turn off logging', function () { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 200 }); + + cy.request({ + url: 'http://localhost:8080', + log: false, + }).then(() => { + expect(this.lastLog).to.be.undefined; + }); + }); + + it('logs immediately before resolving', function (done) { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 200 }); + + cy.on('log:added', (attrs, log) => { + if (log.get('name') === 'request') { + expect(log.get('state')).to.eq('pending'); + expect(log.get('message')).to.eq(''); + + done(); + } + }); + + cy.request('http://localhost:8080'); + }); + + // SKIP: only passes in cypress open, not in cypress run + it.skip('snapshots after clicking', function () { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 200 }); + + cy.request('http://localhost:8080').then(() => { + const { lastLog } = this; + + expect(lastLog.get('snapshots').length).to.eq(1); + expect(lastLog.get('snapshots')[0]).to.be.an('object'); + }); + }); + + it('.consoleProps', function () { + const allRequestResponse = { + 'Request URL': 'http://localhost:8080/foo', + 'Request Headers': { 'x-token': 'ab123' }, + 'Request Body': { first: 'brian' }, + 'Response Headers': { + 'Content-Type': 'application/json', + }, + 'Response Body': { id: 123 }, + }; + + Cypress.backend.withArgs('http:request').resolves({ + duration: 10, + status: 201, + isOkStatusCode: true, + body: { id: 123 }, + headers: { + 'Content-Type': 'application/json', + }, + requestHeaders: { 'x-token': 'ab123' }, + requestBody: { first: 'brian' }, + allRequestResponses: [allRequestResponse], + }); + + cy.request({ + url: 'http://localhost:8080/foo', + headers: { 'x-token': 'abc123' }, + method: 'POST', + body: { first: 'brian' }, + }).then(() => { + const consoleProps = this.lastLog.invoke('consoleProps'); + expect(consoleProps.Command).to.eq('request'); + expect(consoleProps.Request).to.deep.eq(allRequestResponse); + expect(consoleProps.Yielded).to.deep.eq({ + duration: 10, + status: 201, + body: { id: 123 }, + headers: { + 'Content-Type': 'application/json', + }, + }); + }); + }); + + it('.consoleProps with array of allRequestResponses', function () { + const allRequestResponses = [ + { + 'Request URL': 'http://localhost:8080/foo', + 'Request Headers': { 'x-token': 'ab123' }, + 'Request Body': { first: 'brian' }, + 'Response Headers': { + 'Content-Type': 'application/json', + }, + 'Response Body': { id: 123 }, + }, + { + 'Request URL': 'http://localhost:8080/foo', + 'Request Headers': { 'x-token': 'ab123' }, + 'Request Body': { first: 'brian' }, + 'Response Headers': { + 'Content-Type': 'application/json', + }, + 'Response Body': { id: 123 }, + }, + ]; + + Cypress.backend.withArgs('http:request').resolves({ + duration: 10, + status: 201, + isOkStatusCode: true, + body: { id: 123 }, + headers: { + 'Content-Type': 'application/json', + }, + requestHeaders: { 'x-token': 'ab123' }, + requestBody: { first: 'brian' }, + allRequestResponses, + }); + + cy.request({ + url: 'http://localhost:8080/foo', + headers: { 'x-token': 'abc123' }, + method: 'POST', + body: { first: 'brian' }, + }).then(() => { + const consoleProps = this.lastLog.invoke('consoleProps'); + expect(consoleProps.Command).to.eq('request'); + expect(consoleProps.Requests).to.deep.eq(allRequestResponses); + expect(consoleProps.Yielded).to.deep.eq({ + duration: 10, + status: 201, + body: { id: 123 }, + headers: { + 'Content-Type': 'application/json', + }, + }); + }); + }); + + describe('.renderProps', function () { + describe('in any case', function () { + it('sends correct message', function () { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 201 }); + + cy.request('http://localhost:8080/foo').then(() => { + expect(this.lastLog.invoke('renderProps').message).to.equal( + 'GET 201 http://localhost:8080/foo' + ); + }); + }); + }); + + describe('when response is successful', function () { + it('sends correct indicator', function () { + Cypress.backend + .withArgs('http:request') + .resolves({ isOkStatusCode: true, status: 201 }); + + cy.request('http://localhost:8080/foo').then(() => { + expect(this.lastLog.invoke('renderProps').indicator).to.equal( + 'successful' + ); + }); + }); + }); + + describe('when response is outside 200 range', function () { + it('sends correct indicator', function (done) { + cy.on('fail', (err) => { + expect(this.lastLog.invoke('renderProps').indicator).to.equal( + 'bad' + ); + + done(); + }); + + Cypress.backend.withArgs('http:request').resolves({ status: 500 }); + + cy.request('http://localhost:8080/foo'); + }); + }); + }); + }); + + describe( + 'errors', + { + defaultCommandTimeout: 50, + }, + function () { + beforeEach(function () { + this.logs = []; + + cy.on('log:added', (attrs, log) => { + if (attrs.name === 'request') { + this.lastLog = log; + this.logs.push(log); + } + }); + + return null; + }); + + it('throws when no url is passed', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + '`cy.request()` requires a `url`. You did not provide a `url`.' + ); + + done(); + }); + + cy.request(); + }); + + it( + 'throws when url is not FQDN', + { + baseUrl: '', + requestBaseUrl: null, + }, + function (done) { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); + + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + "`cy.request()` must be provided a fully qualified `url` - one that begins with `http`. By default `cy.request()` will use either the current window's origin or the `baseUrl` in `cypress.json`. Neither of those values were present." + ); + + done(); + }); + + cy.request('/foo/bar'); + } + ); + + it( + 'throws when url is not FQDN, notes that configFile is disabled', + { + baseUrl: '', + requestBaseUrl: null, + configFile: false, + }, + function (done) { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); + + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + "`cy.request()` must be provided a fully qualified `url` - one that begins with `http`. By default `cy.request()` will use either the current window's origin or the `baseUrl` in `cypress.json` (currently disabled by --config-file=false). Neither of those values were present." + ); + + done(); + }); + + cy.request('/foo/bar'); + } + ); + + it( + 'throws when url is not FQDN, notes that configFile is non-default', + { + baseUrl: '', + requestBaseUrl: null, + configFile: 'foo.json', + }, + function (done) { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); + + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + "`cy.request()` must be provided a fully qualified `url` - one that begins with `http`. By default `cy.request()` will use either the current window's origin or the `baseUrl` in `foo.json`. Neither of those values were present." + ); + + done(); + }); + + cy.request('/foo/bar'); + } + ); + + it('throws when url isnt a string', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + '`cy.request()` requires the `url` to be a string.' + ); + + done(); + }); + + cy.request({ + url: [], + }); + }); + + it('throws when auth is truthy but not an object', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + '`cy.request()` must be passed an object literal for the `auth` option.' + ); + + done(); + }); + + cy.request({ + url: 'http://localhost:1234/foo', + auth: 'foobar', + }); + }); + + it('throws when headers is truthy but not an object', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + '`cy.request()` requires the `headers` option to be an object literal.' + ); + + done(); + }); + + cy.request({ + url: 'http://localhost:1234/foo', + headers: 'foo=bar', + }); + }); + + it('throws on invalid method', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + "`cy.request()` was called with an invalid method: `FOO`. Method can be: `GET`, `POST`, `PUT`, `DELETE`, `PATCH`, `HEAD`, `OPTIONS`, or any other method supported by Node's HTTP parser." + ); + + done(); + }); + + cy.request({ + url: 'http://localhost:1234/foo', + method: 'FOO', + }); + }); + + it('throws when gzip is not boolean', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + '`cy.request()` requires the `gzip` option to be a boolean.' + ); + + done(); + }); + + cy.request({ + url: 'http://localhost:1234/foo', + gzip: {}, + }); + }); + + it('throws when encoding is not valid', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + "`cy.request()` was called with invalid encoding: `binaryX`. Encoding can be: `utf8`, `utf16le`, `latin1`, `base64`, `hex`, `ascii`, `binary`, `latin1`, `ucs2`, `utf16le`, or any other encoding supported by Node's Buffer encoding." + ); + + done(); + }); + + cy.request({ + url: 'http://localhost:1234/foo', + encoding: 'binaryX', + }); + }); + + it('throws when form isnt a boolean', function (done) { + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith( + "`cy.request()` requires the `form` option to be a boolean.\n\nIf you're trying to send a `x-www-form-urlencoded` request then pass either a string or object literal to the `body` property." + ); + + done(); + }); + + cy.request({ + url: 'http://localhost:1234/foo', + form: { foo: 'bar' }, + }); + }); + + it('throws when failOnStatusCode is false and retryOnStatusCodeFailure is true', function (done) { + cy.on('fail', (err) => { + expect(err.message).to.contain( + '`cy.request()` was invoked with `{ failOnStatusCode: false, retryOnStatusCodeFailure: true }`.' + ); + + done(); + }); + + cy.request({ + url: 'http://foobarbaz', + failOnStatusCode: false, + retryOnStatusCodeFailure: true, + }); + }); + + it('throws when status code doesnt start with 2 and failOnStatusCode is true', function (done) { + Cypress.backend.withArgs('http:request').resolves({ + isOkStatusCode: false, + status: 500, + statusText: 'Server Error', + headers: { + baz: 'quux', + }, + body: 'response body', + requestHeaders: { + foo: 'bar', + }, + requestBody: 'request body', + redirects: ['301: http://www.google.com'], + }); + + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.include(stripIndent`\ \`cy.request()\` failed on: http://localhost:1234/foo @@ -1029,88 +1076,85 @@ describe('src/cy/commands/request', function() { Headers: { \"baz\": \"quux\" } - Body: response body`) - - done() - }) - - cy.request({ - method: 'POST', - url: 'http://localhost:1234/foo', - body: { - username: 'cypress', - }, - }) - }) - - // https://github.com/cypress-io/cypress/issues/4346 - it('throws on network failure when nested', function(done) { - cy.request('http://localhost:3500/dump-method') - .then(function() { - cy.request('http://0.0.0.0:12345') - }) - - cy.on('fail', (err) => { - expect(err.message).to.include('`cy.request()` failed trying to load:') - - done() - }) - }) - - it('displays body_circular when body is circular', function (done) { - const foo = { - bar: { - baz: {}, - }, - } - - foo.bar.baz.quux = foo - - cy.request({ - method: 'POST', - url: 'http://foo.invalid/', - body: foo, - }) - - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith(stripIndent`\ + Body: response body`); + + done(); + }); + + cy.request({ + method: 'POST', + url: 'http://localhost:1234/foo', + body: { + username: 'cypress', + }, + }); + }); + + // https://github.com/cypress-io/cypress/issues/4346 + it('throws on network failure when nested', function (done) { + cy.request('http://localhost:3500/dump-method').then(function () { + cy.request('http://0.0.0.0:12345'); + }); + + cy.on('fail', (err) => { + expect(err.message).to.include('`cy.request()` failed trying to load:'); + + done(); + }); + }); + + it('displays body_circular when body is circular', function (done) { + const foo = { + bar: { + baz: {}, + }, + }; + + foo.bar.baz.quux = foo; + + cy.request({ + method: 'POST', + url: 'http://foo.invalid/', + body: foo, + }); + + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith(stripIndent`\ The \`body\` parameter supplied to \`cy.request()\` contained a circular reference at the path "bar.baz.quux". - \`body\` can only be a string or an object with no circular references.`) - - done() - }) - }) - - it('does not include redirects when there were no redirects', function (done) { - Cypress.backend - .withArgs('http:request') - .resolves({ - isOkStatusCode: false, - status: 500, - statusText: 'Server Error', - headers: { - baz: 'quux', - }, - body: 'response body', - requestHeaders: { - foo: 'bar', - }, - requestBody: 'request body', - }) - - cy.on('fail', (err) => { - const { lastLog } = this - - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.include(stripIndent`\ + \`body\` can only be a string or an object with no circular references.`); + + done(); + }); + }); + + it('does not include redirects when there were no redirects', function (done) { + Cypress.backend.withArgs('http:request').resolves({ + isOkStatusCode: false, + status: 500, + statusText: 'Server Error', + headers: { + baz: 'quux', + }, + body: 'response body', + requestHeaders: { + foo: 'bar', + }, + requestBody: 'request body', + }); + + cy.on('fail', (err) => { + const { lastLog } = this; + + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.include(stripIndent`\ \`cy.request()\` failed on: http://localhost:1234/foo @@ -1142,110 +1186,106 @@ describe('src/cy/commands/request', function() { Headers: { \"baz\": \"quux\" } - Body: response body`) + Body: response body`); - done() - }) + done(); + }); - cy.request({ - method: 'POST', - url: 'http://localhost:1234/foo', - body: { - username: 'cypress', - }, - }) - }) + cy.request({ + method: 'POST', + url: 'http://localhost:1234/foo', + body: { + username: 'cypress', + }, + }); + }); - it('logs once on error', function (done) { - const error = new Error('request failed') + it('logs once on error', function (done) { + const error = new Error('request failed'); - error.backend = true + error.backend = true; - Cypress.backend - .withArgs('http:request') - .rejects(error) + Cypress.backend.withArgs('http:request').rejects(error); - cy.on('fail', (err) => { - const { lastLog } = this + cy.on('fail', (err) => { + const { lastLog } = this; - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); - done() - }) + done(); + }); - cy.request('http://localhost:1234/foo') - }) + cy.request('http://localhost:1234/foo'); + }); - // https://github.com/cypress-io/cypress/issues/5274 - it('dont throw UNESCAPED_CHARACTERS error for url with ’ character in pathname', function(done) { - cy.on('fail', (err) => { - expect(err.message).to.contain('`cy.request()` failed trying to load:') - expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS') + // https://github.com/cypress-io/cypress/issues/5274 + it('dont throw UNESCAPED_CHARACTERS error for url with ’ character in pathname', function (done) { + cy.on('fail', (err) => { + expect(err.message).to.contain('`cy.request()` failed trying to load:'); + expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS'); - done() - }) + done(); + }); - cy.request('http://localhost:1234/’') - }) + cy.request('http://localhost:1234/’'); + }); - it('dont throw UNESCAPED_CHARACTERS error for url with % character in pathname', function(done) { - cy.on('fail', (err) => { - expect(err.message).to.contain('`cy.request()` failed trying to load:') - expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS') + it('dont throw UNESCAPED_CHARACTERS error for url with % character in pathname', function (done) { + cy.on('fail', (err) => { + expect(err.message).to.contain('`cy.request()` failed trying to load:'); + expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS'); - done() - }) + done(); + }); - cy.request('http://localhost:1234/%') - }) + cy.request('http://localhost:1234/%'); + }); - it('dont throw UNESCAPED_CHARACTERS error for url with ’ escaped in pathname', function(done) { - cy.on('fail', (err) => { - expect(err.message).to.contain('`cy.request()` failed trying to load:') - expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS') + it('dont throw UNESCAPED_CHARACTERS error for url with ’ escaped in pathname', function (done) { + cy.on('fail', (err) => { + expect(err.message).to.contain('`cy.request()` failed trying to load:'); + expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS'); - done() - }) + done(); + }); - cy.request(encodeURI('http://localhost:1234/’')) - }) + cy.request(encodeURI('http://localhost:1234/’')); + }); - it('dont throw UNESCAPED_CHARACTERS error for url with Unicode in pathname from BMP to Astral Plane', function(done) { - cy.on('fail', (err) => { - expect(err.message).to.contain('`cy.request()` failed trying to load:') - expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS') + it('dont throw UNESCAPED_CHARACTERS error for url with Unicode in pathname from BMP to Astral Plane', function (done) { + cy.on('fail', (err) => { + expect(err.message).to.contain('`cy.request()` failed trying to load:'); + expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS'); - done() - }) + done(); + }); - cy.request('http://localhost:1234/😀') - }) + cy.request('http://localhost:1234/😀'); + }); - it('dont throw UNESCAPED_CHARACTERS error for url with any Unicode escaped character in pathname', function(done) { - cy.on('fail', (err) => { - expect(err.message).to.contain('`cy.request()` failed trying to load:') - expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS') + it('dont throw UNESCAPED_CHARACTERS error for url with any Unicode escaped character in pathname', function (done) { + cy.on('fail', (err) => { + expect(err.message).to.contain('`cy.request()` failed trying to load:'); + expect(err.message).to.not.contain('ERR_UNESCAPED_CHARACTERS'); - done() - }) + done(); + }); - cy.request(encodeURI('http://localhost:1234/😀')) - }) + cy.request(encodeURI('http://localhost:1234/😀')); + }); - context('displays error', function() { - it('displays method and url in error', function(done) { - const error = new Error('request failed') + context('displays error', function () { + it('displays method and url in error', function (done) { + const error = new Error('request failed'); - error.backend = true + error.backend = true; - Cypress.backend - .withArgs('http:request') - .rejects(error) + Cypress.backend.withArgs('http:request').rejects(error); - cy.on('fail', (err) => { - expect(err.message).to.include(stripIndent`\ + cy.on('fail', (err) => { + expect(err.message).to.include(stripIndent`\ \`cy.request()\` failed trying to load: http://localhost:1234/foo @@ -1269,28 +1309,24 @@ describe('src/cy/commands/request', function() { - you don't have internet access - you forgot to run / boot your web server - your web server isn't accessible - - you have weird network configuration settings on your computer`) + - you have weird network configuration settings on your computer`); - done() - }) + done(); + }); - cy.request('http://localhost:1234/foo') - }) + cy.request('http://localhost:1234/foo'); + }); - it('throws after timing out', function (done) { - Cypress.backend - .withArgs('http:request') - .resolves(Promise.delay(1000)) + it('throws after timing out', function (done) { + Cypress.backend.withArgs('http:request').resolves(Promise.delay(1000)); - cy.on('fail', (err) => { - const { - lastLog, - } = this + cy.on('fail', (err) => { + const { lastLog } = this; - expect(this.logs.length).to.eq(1) - expect(lastLog.get('error')).to.eq(err) - expect(lastLog.get('state')).to.eq('failed') - expect(err.message).to.startWith(stripIndent`\ + expect(this.logs.length).to.eq(1); + expect(lastLog.get('error')).to.eq(err); + expect(lastLog.get('state')).to.eq('failed'); + expect(err.message).to.startWith(stripIndent`\ \`cy.request()\` timed out waiting \`50ms\` for a response from your server. The request we sent was: @@ -1298,14 +1334,16 @@ describe('src/cy/commands/request', function() { Method: GET URL: http://localhost:1234/foo - No response was received within the timeout.`) + No response was received within the timeout.`); - done() - }) + done(); + }); - cy.request({ url: 'http://localhost:1234/foo', timeout: 50 }) - }) - }) - }) - }) -}) + cy.request({ url: 'http://localhost:1234/foo', timeout: 50 }); + }); + }); + } + ); + } + ); +}); diff --git a/cypress/integration/request.js b/cypress/integration/request.js index cef0a73..2ff4860 100644 --- a/cypress/integration/request.js +++ b/cypress/integration/request.js @@ -2,24 +2,24 @@ const _ = Cypress._; const RESPONSE_TIMEOUT = 22222; const initialBaseUrl = Cypress.config().baseUrl; -describe('Overwritten command request', function() { - after(function() { +describe('Overwritten command request', function () { + after(function () { Cypress.config('baseUrl', initialBaseUrl); }); - beforeEach(function() { + beforeEach(function () { cy.stub(Cypress, 'backend').callThrough(); Cypress.config('responseTimeout', RESPONSE_TIMEOUT); }); - describe('argument signature', function() { - beforeEach(function() { + describe('argument signature', function () { + beforeEach(function () { const backend = Cypress.backend.withArgs('http:request').resolves({ isOkStatusCode: true, status: 200, }); - this.expectOptionsToBe = function(opts) { + this.expectOptionsToBe = function (opts) { _.defaults(opts, { failOnStatusCode: true, retryOnNetworkFailure: true, @@ -33,97 +33,82 @@ describe('Overwritten command request', function() { const options = backend.firstCall.args[1]; - _.each(options, function(value, key) { + _.each(options, function (value, key) { expect(options[key]).to.deep.eq(opts[key], `failed on property: (${key})`); }); - _.each(opts, function(value, key) { + _.each(opts, function (value, key) { expect(opts[key]).to.deep.eq(options[key], `failed on property: (${key})`); }); }; }); - it('prefixes with requestBaseUrl when origin url is empty', function() { - cy.stub(cy, 'getRemoteLocation') - .withArgs('origin') - .returns(''); + it('prefixes with requestBaseUrl when origin url is empty', function () { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); Cypress.config('requestBaseUrl', 'http://api.localhost:8080/app'); Cypress.config('baseUrl', 'http://localhost:8080/app'); - cy.request('/foo/bar?cat=1') - .then(() => { - this.expectOptionsToBe({ - url: 'http://api.localhost:8080/app/foo/bar?cat=1', - method: 'GET', - gzip: true, - followRedirect: true, - timeout: RESPONSE_TIMEOUT, - }); + cy.request('/foo/bar?cat=1').then(() => { + this.expectOptionsToBe({ + url: 'http://api.localhost:8080/app/foo/bar?cat=1', + method: 'GET', + gzip: true, + followRedirect: true, + timeout: RESPONSE_TIMEOUT, }); + }); }); - it('prefixes with baseUrl when origin url is empty and the requestBaseUrl is empty', - function() { - cy.stub(cy, 'getRemoteLocation') - .withArgs('origin') - .returns(''); - - Cypress.config('requestBaseUrl', ''); - Cypress.config('baseUrl', 'http://localhost:8080/app'); - - cy.request('/foo/bar?cat=1') - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/app/foo/bar?cat=1', - method: 'GET', - gzip: true, - followRedirect: true, - timeout: RESPONSE_TIMEOUT, - }); - }); + it('prefixes baseUrl when originUrl is empty and the requestBaseUrl is empty', function () { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); + + Cypress.config('requestBaseUrl', ''); + Cypress.config('baseUrl', 'http://localhost:8080/app'); + + cy.request('/foo/bar?cat=1').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/app/foo/bar?cat=1', + method: 'GET', + gzip: true, + followRedirect: true, + timeout: RESPONSE_TIMEOUT, + }); }); + }); + + it('prefixes baseUrl when originUrl is empty and the requestBaseUrl is null', function () { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); + + Cypress.config('requestBaseUrl', null); + Cypress.config('baseUrl', 'http://localhost:8080/app'); - it('prefixes with baseUrl when origin url is empty and the requestBaseUrl is null', - function() { - cy.stub(cy, 'getRemoteLocation') - .withArgs('origin') - .returns(''); - - Cypress.config('requestBaseUrl', null); - Cypress.config('baseUrl', 'http://localhost:8080/app'); - - cy.request('/foo/bar?cat=1') - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/app/foo/bar?cat=1', - method: 'GET', - gzip: true, - followRedirect: true, - timeout: RESPONSE_TIMEOUT, - }); - }); + cy.request('/foo/bar?cat=1').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/app/foo/bar?cat=1', + method: 'GET', + gzip: true, + followRedirect: true, + timeout: RESPONSE_TIMEOUT, + }); }); + }); + + it('prefixes baseUrl when originUrl is empty and requestBaseUrl is undefined', function () { + cy.stub(cy, 'getRemoteLocation').withArgs('origin').returns(''); - it('prefixes with baseUrl when origin url is empty and the requestBaseUrl is undefined', - function() { - cy.stub(cy, 'getRemoteLocation') - .withArgs('origin') - .returns(''); - - Cypress.config('requestBaseUrl', undefined); - Cypress.config('baseUrl', 'http://localhost:8080/app'); - - cy.request('/foo/bar?cat=1') - .then(() => { - this.expectOptionsToBe({ - url: 'http://localhost:8080/app/foo/bar?cat=1', - method: 'GET', - gzip: true, - followRedirect: true, - timeout: RESPONSE_TIMEOUT, - }); - }); + Cypress.config('requestBaseUrl', undefined); + Cypress.config('baseUrl', 'http://localhost:8080/app'); + + cy.request('/foo/bar?cat=1').then(() => { + this.expectOptionsToBe({ + url: 'http://localhost:8080/app/foo/bar?cat=1', + method: 'GET', + gzip: true, + followRedirect: true, + timeout: RESPONSE_TIMEOUT, + }); }); + }); }); }); diff --git a/cypress/integration/text.js b/cypress/integration/text.js index 4191bf3..e47a0c8 100644 --- a/cypress/integration/text.js +++ b/cypress/integration/text.js @@ -3,62 +3,48 @@ const $ = Cypress.$; const COMMAND_TIMEOUT = 4000; -describe('The added command `text`', function() { +describe('The added command `text`', function () { let body; - before(function() { - cy.visit('/') - .then((win) => { - body = win.document.body.outerHTML; - }); + before(function () { + cy.visit('/').then((win) => { + body = win.document.body.outerHTML; + }); }); - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', COMMAND_TIMEOUT); const doc = cy.state('document'); $(doc.body).empty().html(body); }); - it('yields text from a generic DOM element', function() { - cy.get('div') - .first() - .text() - .should('equal', 'div'); + it('yields text from a generic DOM element', function () { + cy.get('div').first().text().should('equal', 'div'); }); - it('yields the value of a button element', function() { - cy.get('button') - .text() - .should('equal', 'Some button'); + it('yields the value of a button element', function () { + cy.get('button').text().should('equal', 'Some button'); }); - it('yields the value of a textarea element', function() { - cy.get('textarea') - .text() - .should('equal', 'A filled textarea'); + it('yields the value of a textarea element', function () { + cy.get('textarea').text().should('equal', 'A filled textarea'); }); - it('retries the value of a generic DOM element', function() { - cy.get('.counter') - .text() - .should('equal', '5'); + it('retries the value of a generic DOM element', function () { + cy.get('.counter').text().should('equal', '5'); }); - it('retries the value of an input element', function() { - cy.get('input') - .text() - .should('equal', '5'); + it('retries the value of an input element', function () { + cy.get('input').text().should('equal', '5'); }); - describe('returns', function() { - it('returns a string if the input is a single element', function() { - cy.get('#foo') - .text() - .should('equal', 'foo'); + describe('returns', function () { + it('returns a string if the input is a single element', function () { + cy.get('#foo').text().should('equal', 'foo'); }); - it('returns an array if the input is multiple elements', function() { + it('returns an array if the input is multiple elements', function () { cy.get('.parent') .children() .text() @@ -70,78 +56,83 @@ describe('The added command `text`', function() { }); }); - describe('The option `depth`', function() { - it('`0` is the default value', function() { + describe('The option `depth`', function () { + it('`0` is the default value', function () { cy.get('div.parent') .text() - .should('equal', [ - 'parent div top', - 'parent div middle', - 'parent div bottom', - ].join(' ')); + .should( + 'equal', + ['parent div top', 'parent div middle', 'parent div bottom'].join(' ') + ); }); - it('`0` results in only the contents of the element itself', function() { + it('`0` results in only the contents of the element itself', function () { cy.get('div.parent') .text({ depth: 0 }) - .should('equal', [ - 'parent div top', - 'parent div middle', - 'parent div bottom', - ].join(' ')); + .should( + 'equal', + ['parent div top', 'parent div middle', 'parent div bottom'].join(' ') + ); }); - it('`1` results in the contents of the element and its direct children', function() { + it('`1` results in the contents of the element and its direct children', function () { cy.get('div.parent') .text({ depth: 1 }) - .should('equal', [ - 'parent div top', - 'child div', - 'parent div middle', - 'second-child div', - 'parent div bottom', - ].join(' ')); + .should( + 'equal', + [ + 'parent div top', + 'child div', + 'parent div middle', + 'second-child div', + 'parent div bottom', + ].join(' ') + ); }); - it('`2` results in the contents of the element and its direct children', function() { + it('`2` results in the contents of the element and its direct children', function () { cy.get('div.parent') .text({ depth: 2 }) - .should('equal', [ - 'parent div top', - 'child div', - 'grandchild div', - 'parent div middle', - 'second-child div', - 'second-grand-child div', - 'parent div bottom', - ].join(' ')); + .should( + 'equal', + [ + 'parent div top', + 'child div', + 'grandchild div', + 'parent div middle', + 'second-child div', + 'second-grand-child div', + 'parent div bottom', + ].join(' ') + ); }); - it('`Infinity` results in the contents of the element and all its children', function() { + it('`Infinity` results in the contents of the element and all its children', function () { cy.get('div.parent') .text({ depth: Infinity }) - .should('equal', [ - 'parent div top', - 'child div', - 'grandchild div', - 'great-grandchild div', - 'great-great-grandchild div', - 'parent div middle', - 'second-child div', - 'second-grand-child div', - 'parent div bottom', - ].join(' ')); + .should( + 'equal', + [ + 'parent div top', + 'child div', + 'grandchild div', + 'great-grandchild div', + 'great-great-grandchild div', + 'parent div middle', + 'second-child div', + 'second-grand-child div', + 'parent div bottom', + ].join(' ') + ); }); - it('gets all values of form elements', function() { - cy.get('form') - .text({ depth: 1 }) - .should('equal', '5 A filled textarea Some button'); + it('gets all values of form elements', function () { + cy.get('form').text({ depth: 1 }).should('equal', '5 A filled textarea Some button'); }); }); - describe('The option `whitespace`', function() { - it('`simplify` is the default value', function() { + describe('The option `whitespace`', function () { + it('`simplify` is the default value', function () { cy.get('div.whitespace') .text() .should('equal', 'div containing some complex whitespace'); @@ -151,7 +142,7 @@ describe('The added command `text`', function() { .should('equal', 'Some text with inline formatting applied to it.'); }); - it('`simplify` simplifies all whitespace', function() { + it('`simplify` simplifies all whitespace', function () { cy.get('div.whitespace') .text({ whitespace: 'simplify' }) .should('equal', 'div containing some complex whitespace'); @@ -161,7 +152,7 @@ describe('The added command `text`', function() { .should('equal', 'Some text with inline formatting applied to it.'); }); - it('`keep-newline` simplifies all whitespace except newlines', function() { + it('`keep-newline` simplifies all whitespace except newlines', function () { cy.get('div.whitespace') .text({ whitespace: 'keep-newline' }) .should('equal', 'div\ncontaining some complex whitespace'); @@ -171,31 +162,31 @@ describe('The added command `text`', function() { .should('equal', 'Some text with inline formatting applied to it.'); }); - it('`keep` does not change whitespace at all', function() { + it('`keep` does not change whitespace at all', function () { cy.get('div.whitespace') .text({ whitespace: 'keep' }) .should((text) => { const lines = text.split('\n'); expect(lines[0]).to.equal('div'); - expect(lines[1].trim()) - .to.equal('cont\u200Baining\xa0 \xa0 \t some complex\twhite\u200Bspace'); + expect(lines[1].trim()).to.equal( + 'cont\u200Baining\xa0 \xa0 \t some complex\twhite\u200Bspace' + ); }); cy.get('div.formatted') .text({ depth: 9, whitespace: 'keep' }) .should((text) => { - expect(text.trim()) - .to.equal('Some text with inline formatting applied to it.'); + expect(text.trim()).to.equal('Some text with inline formatting applied to it.'); }); }); }); - describe('errors', function() { + describe('errors', function () { let __logs; let __lastLog; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', 50); __logs = []; @@ -208,52 +199,53 @@ describe('The added command `text`', function() { return null; }); - it('is called as a parent command', function(done) { + it('is called as a parent command', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; expect(__logs.length).to.eq(1); expect(lastLog.get('error')).to.eq(err); - expect(err.message) - .to.include('Oops, it looks like you are trying to call a child ' - + 'command before running a parent command.'); + expect(err.message).to.include( + 'Oops, it looks like you are trying to call a child ' + + 'command before running a parent command.' + ); done(); }); cy.text(); }); - it('not preceded with an element', function(done) { + it('not preceded with an element', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; expect(__logs.length).to.eq(2); expect(lastLog.get('error')).to.eq(err); - expect(err.message) - .to.include('`cy.text()` failed because it requires a DOM element.'); + expect(err.message).to.include( + '`cy.text()` failed because it requires a DOM element.' + ); done(); }); - cy.wrap('foo') - .text(); + cy.wrap('foo').text(); }); - it('wrong value for the option `depth`', function(done) { + it('wrong value for the option `depth`', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; expect(__logs.length).to.eq(2); expect(lastLog.get('error')).to.eq(err); - expect(err.message) - .to.include('Bad value for the option "depth" of the command "text"'); + expect(err.message).to.include( + 'Bad value for the option "depth" of the command "text"' + ); done(); }); - cy.get('#foo') - .text({ depth: -1 }); + cy.get('#foo').text({ depth: -1 }); }); - it('wrong value for the option `whitespace`', function(done) { + it('wrong value for the option `whitespace`', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; @@ -265,11 +257,10 @@ describe('The added command `text`', function() { done(); }); - cy.get('#foo') - .text({ whitespace: 1 }); + cy.get('#foo').text({ whitespace: 1 }); }); - it('wrong value for the option `log`', function(done) { + it('wrong value for the option `log`', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; @@ -281,8 +272,7 @@ describe('The added command `text`', function() { done(); }); - cy.get('#foo') - .text({ log: 1 }); + cy.get('#foo').text({ log: 1 }); }); }); }); diff --git a/cypress/integration/then.js b/cypress/integration/then.js index 9263fbe..d32a7f7 100644 --- a/cypress/integration/then.js +++ b/cypress/integration/then.js @@ -4,48 +4,44 @@ const $ = Cypress.$; const Promise = Cypress.Promise; - -describe('The overwritten command `then`', function() { +describe('The overwritten command `then`', function () { let body; - before(function() { - cy.visit('/') - .then((win) => { - body = win.document.body.outerHTML; - }); + before(function () { + cy.visit('/').then((win) => { + body = win.document.body.outerHTML; + }); }); - describe('Tests copied from Cypress repo', function() { - beforeEach(function() { + describe('Tests copied from Cypress repo', function () { + beforeEach(function () { const doc = cy.state('document'); $(doc.body).empty().html(body); }); - it('converts raw DOM elements', function() { + it('converts raw DOM elements', function () { const div = cy.$$('div:first').get(0); - cy.wrap(div) - .then(($div) => { - expect($div.get(0)).to.eq(div); - }); + cy.wrap(div).then(($div) => { + expect($div.get(0)).to.eq(div); + }); }); - it('does not insert a mocha callback', function() { - cy.noop() - .then(() => { - expect(cy.queue.length).to.eq(2); - }); + it('does not insert a mocha callback', function () { + cy.noop().then(() => { + expect(cy.queue.length).to.eq(2); + }); }); - it('passes timeout option to then', function() { + it('passes timeout option to then', function () { cy.timeout(50); - cy.then({ timeout: 150 }, function() { + cy.then({ timeout: 150 }, function () { return Promise.delay(100); }); }); - it('can resolve nested thens', function() { + it('can resolve nested thens', function () { cy.get('div:first').then(() => { cy.get('div:first').then(() => { cy.get('div:first'); @@ -53,49 +49,45 @@ describe('The overwritten command `then`', function() { }); }); - it('can resolve cypress commands inside of a promise', function() { + it('can resolve cypress commands inside of a promise', function () { let _then = false; cy.wrap(null) .then(() => { - return Promise.delay(10) - .then(() => { - cy.then(() => { - _then = true; - }); + return Promise.delay(10).then(() => { + cy.then(() => { + _then = true; }); + }); }) .then(() => { expect(_then).to.be.true; }); }); - it('can resolve chained cypress commands inside of a promise', function() { + it('can resolve chained cypress commands inside of a promise', function () { let _then = false; cy.wrap(null) .then(() => { - return Promise.delay(10) - .then(() => { - cy.get('div:first') - .then(() => { - _then = true; - }); + return Promise.delay(10).then(() => { + cy.get('div:first').then(() => { + _then = true; }); + }); }) .then(() => { expect(_then).to.be.true; }); }); - it('can resolve cypress instance inside of a promise', function() { + it('can resolve cypress instance inside of a promise', function () { cy.then(() => { - Promise.delay(10) - .then(() => cy); + Promise.delay(10).then(() => cy); }); }); - it('passes values to the next command', function() { + it('passes values to the next command', function () { cy.wrap({ foo: 'bar' }) .then((obj) => obj.foo) .then((val) => { @@ -103,18 +95,17 @@ describe('The overwritten command `then`', function() { }); }); - it('does not throw when returning thenables with cy command', function() { - cy.wrap({ foo: 'bar' }) - .then((obj) => { - return new Promise((resolve) => { - cy.wait(10); + it('does not throw when returning thenables with cy command', function () { + cy.wrap({ foo: 'bar' }).then((obj) => { + return new Promise((resolve) => { + cy.wait(10); - resolve(obj.foo); - }); + resolve(obj.foo); }); + }); }); - it('should pass the eventual resolved thenable value downstream', function() { + it('should pass the eventual resolved thenable value downstream', function () { cy.wrap({ foo: 'bar' }) .then((obj) => { cy.wait(10) @@ -130,10 +121,11 @@ describe('The overwritten command `then`', function() { }); }); - it('should not pass the eventual resolve thenable value downstream because ' - +'thens are not connected', function() { - cy.wrap({ foo: 'bar' }) - .then((obj) => { + it( + 'should not pass the eventual resolve thenable value downstream because ' + + 'thens are not connected', + function () { + cy.wrap({ foo: 'bar' }).then((obj) => { cy.wait(10) .then(() => obj.foo) .then((value) => { @@ -142,12 +134,13 @@ describe('The overwritten command `then`', function() { return value; }); }); - cy.then((val) => { - expect(val).to.be.undefined; - }); - }); + cy.then((val) => { + expect(val).to.be.undefined; + }); + } + ); - it('passes the existing subject if ret is undefined', function() { + it('passes the existing subject if ret is undefined', function () { cy.wrap({ foo: 'bar' }) .then(() => undefined) .then((obj) => { @@ -155,7 +148,7 @@ describe('The overwritten command `then`', function() { }); }); - it('sets the subject to null when given null', function() { + it('sets the subject to null when given null', function () { cy.wrap({ foo: 'bar' }) .then(() => null) .then((obj) => { @@ -163,11 +156,11 @@ describe('The overwritten command `then`', function() { }); }); - describe('errors', function() { + describe('errors', function () { let __logs; let __lastLog; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', 50); __logs = []; @@ -180,7 +173,7 @@ describe('The overwritten command `then`', function() { return null; }); - it('throws when promise timeout', function(done) { + it('throws when promise timeout', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; @@ -195,14 +188,15 @@ describe('The overwritten command `then`', function() { }); }); - it('throws when mixing up async + sync return values', function(done) { + it('throws when mixing up async + sync return values', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; expect(__logs.length).to.eq(1); expect(lastLog.get('error')).to.eq(err); expect(err.message).to.include( - '`cy.then()` failed because you are mixing up async and sync code.'); + '`cy.then()` failed because you are mixing up async and sync code.' + ); done(); }); @@ -212,7 +206,7 @@ describe('The overwritten command `then`', function() { }); }); - it('unbinds command:enqueued in the case of an error thrown', function(done) { + it('unbinds command:enqueued in the case of an error thrown', function (done) { const listeners = []; cy.on('fail', () => { @@ -231,13 +225,13 @@ describe('The overwritten command `then`', function() { }); }); - describe('yields to remote jQuery subject', function() { + describe('yields to remote jQuery subject', function () { let __remoteWindow; - beforeEach(function() { + beforeEach(function () { __remoteWindow = cy.state('window'); }); - it('calls the callback function with the remote jQuery subject', function() { + it('calls the callback function with the remote jQuery subject', function () { __remoteWindow.$.fn.foo = () => {}; cy.get('div:first') @@ -250,7 +244,7 @@ describe('The overwritten command `then`', function() { }); }); - it('does not store the remote jQuery object as the subject', function() { + it('does not store the remote jQuery object as the subject', function () { cy.get('div:first') .then(($div) => { expect($div).to.be.instanceof(__remoteWindow.$); @@ -263,45 +257,47 @@ describe('The overwritten command `then`', function() { }); }); - describe('Retryability', function() { - before(function() { + describe('Retryability', function () { + before(function () { Cypress.config('defaultCommandTimeout', 1000); }); - beforeEach(function() { + beforeEach(function () { const doc = cy.state('document'); $(doc.body).empty().html(body); }); - it('retries until the upcoming assertion passes', function() { + it('retries until the upcoming assertion passes', function () { let c = 0; - cy.then(() => ++c, { retry: true }) - .should('equal', 5); + cy.then(() => ++c, { retry: true }).should('equal', 5); }); - it('retries correctly when handling dom elements', function() { + it('retries correctly when handling dom elements', function () { let initalResult = null; cy.get('ul#list') - .then((list) => { - const result = list.children().length; - if (initalResult === null) { - initalResult = result; - } - return result; - }, { retry: true }) + .then( + (list) => { + const result = list.children().length; + if (initalResult === null) { + initalResult = result; + } + return result; + }, + { retry: true } + ) .should('equal', 3) .then((result) => { expect(initalResult).to.below(result); }); }); - describe('errors', function() { + describe('errors', function () { let __logs; let __lastLog; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', 50); __logs = []; @@ -311,22 +307,22 @@ describe('The overwritten command `then`', function() { }); }); - it('throws on timeout', function(done) { + it('throws on timeout', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; expect(__logs.length).to.eq(2); expect(err.message).to.contain(lastLog.get('error').message); - expect(err.message) - .to.equal('Timed out retrying after 50ms: expected 5 to equal 4'); + expect(err.message).to.equal( + 'Timed out retrying after 50ms: expected 5 to equal 4' + ); done(); }); - cy.then({ retry: true }, () => 5) - .should('equal', 4); + cy.then({ retry: true }, () => 5).should('equal', 4); }); - it('logs and fails on a thrown error', function(done) { + it('logs and fails on a thrown error', function (done) { cy.on('fail', (err) => { const lastLog = __lastLog; @@ -338,8 +334,7 @@ describe('The overwritten command `then`', function() { cy.then({ retry: true }, () => { throw new Error('foo'); - }) - .should('equal', 4); + }).should('equal', 4); }); }); }); diff --git a/cypress/integration/to.js b/cypress/integration/to.js index 8e66ef4..e16ea35 100644 --- a/cypress/integration/to.js +++ b/cypress/integration/to.js @@ -1,19 +1,19 @@ const COMMAND_TIMEOUT = 4000; const COMMAND_TIMEOUT_FAST = 100; -describe('The added command `to`', function() { - before(function() { +describe('The added command `to`', function () { + before(function () { cy.visit('/'); }); - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', COMMAND_TIMEOUT); }); - context('Input validation', function() { + context('Input validation', function () { let __logs; - beforeEach(function() { + beforeEach(function () { __logs = []; cy.on('log:added', (_, log) => { @@ -21,70 +21,62 @@ describe('The added command `to`', function() { }); }); - it('throws when the subject is undefined', function(done) { + it('throws when the subject is undefined', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include(`Can't cast subject of type undefined`); + expect(err.message).to.include(`Can't cast subject of type undefined`); done(); }); - cy.wrap(undefined) - .to('string'); + cy.wrap(undefined).to('string'); }); - it('throws when the subject is null', function(done) { + it('throws when the subject is null', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include(`Can't cast subject of type null`); + expect(err.message).to.include(`Can't cast subject of type null`); done(); }); - cy.wrap(null) - .to('string'); + cy.wrap(null).to('string'); }); - it('throws when the subject is NaN', function(done) { + it('throws when the subject is NaN', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include(`Can't cast subject of type NaN`); + expect(err.message).to.include(`Can't cast subject of type NaN`); done(); }); - cy.wrap(NaN) - .to('string'); + cy.wrap(NaN).to('string'); }); - it('throws when a faulty value is provided for the option `log`', function(done) { + it('throws when a faulty value is provided for the option `log`', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include('Bad value for the option "log" of the command "to".'); + expect(err.message).to.include( + 'Bad value for the option "log" of the command "to".' + ); done(); }); - cy.wrap(123) - .to('string', { log: 'foo' }); + cy.wrap(123).to('string', { log: 'foo' }); }); - it('throws when a faulty type is provided', function(done) { + it('throws when a faulty type is provided', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include('Can\'t cast subject to type badType.'); + expect(err.message).to.include(`Can't cast subject to type badType.`); done(); }); cy.wrap(123).to('badType'); }); - it('requires types to be case sensitive', function(done) { + it('requires types to be case sensitive', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include('Can\'t cast subject to type STRing.'); + expect(err.message).to.include(`Can't cast subject to type STRing.`); done(); }); @@ -92,12 +84,12 @@ describe('The added command `to`', function() { }); }); - context('String', function() { - describe('In isolation', function() { + context('String', function () { + describe('In isolation', function () { /* eslint-disable-next-line sonarjs/no-unused-collection */ let __logs; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', COMMAND_TIMEOUT_FAST); __logs = []; @@ -106,25 +98,21 @@ describe('The added command `to`', function() { }); }); - it('casts a number', function() { - cy.wrap(123456) - .to('string') - .should('equal', '123456'); + it('casts a number', function () { + cy.wrap(123456).to('string').should('equal', '123456'); }); - it('passes a string unmodified', function() { - cy.wrap('foo bar baz') - .to('string') - .should('equal', 'foo bar baz'); + it('passes a string unmodified', function () { + cy.wrap('foo bar baz').to('string').should('equal', 'foo bar baz'); }); - it('casts all items in an array', function() { + it('casts all items in an array', function () { cy.wrap([132, 7, { foo: 'bar' }]) .to('string') .should('deep.equal', ['132', '7', '{"foo":"bar"}']); }); - it('casts an object to JSON', function() { + it('casts an object to JSON', function () { cy.wrap({ foo: 'bar', baz: true }) .to('string') .should('equal', '{"foo":"bar","baz":true}'); @@ -132,11 +120,11 @@ describe('The added command `to`', function() { }); }); - context('Number', function() { - describe('In isolation', function() { + context('Number', function () { + describe('In isolation', function () { let __logs; - beforeEach(function() { + beforeEach(function () { Cypress.config('defaultCommandTimeout', COMMAND_TIMEOUT_FAST); __logs = []; @@ -145,97 +133,81 @@ describe('The added command `to`', function() { }); }); - it('casts a numberlike string', function() { - cy.wrap('007') - .to('number') - .should('equal', 7); + it('casts a numberlike string', function () { + cy.wrap('007').to('number').should('equal', 7); }); - it('throws on a non-numberlike string', function(done) { + it('throws on a non-numberlike string', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include(`Can't cast 'Five' to type number`); + expect(err.message).to.include(`Can't cast 'Five' to type number`); done(); }); - cy.wrap('Five') - .to('number'); + cy.wrap('Five').to('number'); }); - it('throws on a non-array object', function(done) { + it('throws on a non-array object', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include(`Can't cast subject of type object to type number`); + expect(err.message).to.include( + `Can't cast subject of type object to type number` + ); done(); }); - cy.wrap({ number: '123' }) - .to('number'); + cy.wrap({ number: '123' }).to('number'); }); - it('passes a subject of type number without modification', function() { - cy.wrap(7) - .to('number') - .should('equal', 7); + it('passes a subject of type number without modification', function () { + cy.wrap(7).to('number').should('equal', 7); }); - it('casts all items in an array of numberlike strings', function() { + it('casts all items in an array of numberlike strings', function () { cy.wrap(['1234', '009', '564864']) .to('number') .should('deep.equal', [1234, 9, 564864]); }); - it('throws on an array containing a non-numberlike string', function(done) { + it('throws on an array containing a non-numberlike string', function (done) { cy.on('fail', (err) => { expect(__logs.length).to.eq(2); - expect(err.message) - .to.include(`Can't cast 'foo' to type number`); + expect(err.message).to.include(`Can't cast 'foo' to type number`); done(); }); - cy.wrap(['foo', '1234', '009', 'a125']) - .to('number'); + cy.wrap(['foo', '1234', '009', 'a125']).to('number'); }); }); }); - context('Array', function() { - describe('In isolation', function() { - it('does not cast an Array', function() { - cy.wrap(['lorum', 'ipsum']) - .to('array') - .should('deep.equal', ['lorum', 'ipsum']); + context('Array', function () { + describe('In isolation', function () { + it('does not cast an Array', function () { + cy.wrap(['lorum', 'ipsum']).to('array').should('deep.equal', ['lorum', 'ipsum']); }); - it('casts a string', function() { - cy.wrap('foo') - .to('array') - .should('deep.equal', ['foo']); + it('casts a string', function () { + cy.wrap('foo').to('array').should('deep.equal', ['foo']); }); - it('casts a number', function() { - cy.wrap(123) - .to('array') - .should('deep.equal', [123]); + it('casts a number', function () { + cy.wrap(123).to('array').should('deep.equal', [123]); }); - it('casts an object', function() { + it('casts an object', function () { cy.wrap({ foo: 123 }) .to('array') .should('deep.equal', [{ foo: 123 }]); }); }); - describe('When interacting with page', function() { - beforeEach(function() { - cy.get('#list > *') - .as('list') - .should('have.length', 5); + describe('When interacting with page', function () { + beforeEach(function () { + cy.get('#list > *').as('list').should('have.length', 5); }); - it('does not cast a single element', function() { + it('does not cast a single element', function () { // Elements are jQuery objects, which are iterable. cy.get('@list') .first() @@ -249,7 +221,7 @@ describe('The added command `to`', function() { }); }); - it('does not cast multiple elements', function() { + it('does not cast multiple elements', function () { // Elements are jQuery objects, which are iterable. cy.get('@list') .to('array') @@ -262,7 +234,7 @@ describe('The added command `to`', function() { }); }); - it('does cast the text result of a single element', function() { + it('does cast the text result of a single element', function () { cy.get('@list') .first() .text() @@ -276,7 +248,7 @@ describe('The added command `to`', function() { }); }); - it('does not cast the text result of multiple elements', function() { + it('does not cast the text result of multiple elements', function () { cy.get('@list') .text() .to('array') @@ -291,4 +263,3 @@ describe('The added command `to`', function() { }); }); }); - diff --git a/cypress/integration/utils/whitespace.js b/cypress/integration/utils/whitespace.js index c28cf7d..d36e86e 100644 --- a/cypress/integration/utils/whitespace.js +++ b/cypress/integration/utils/whitespace.js @@ -1,96 +1,109 @@ import whitespace from '../../../src/utils/whitespace'; const _ = Cypress._; -describe('Whitespace options for commands yielding strings', function() { - it('returns a function', function() { +describe('Whitespace options for commands yielding strings', function () { + it('returns a function', function () { expect(_.isFunction(whitespace('mode'))).to.be.true; }); - context('mode = `simplify`', function() { - beforeEach(function() { + context('mode = `simplify`', function () { + beforeEach(function () { this.ws = whitespace('simplify'); }); - it('simplifies whitespace in the middle of the string', function() { - expect(this.ws('Lorum ipsum\n\xa0dolor\tsit \r \n\tamet')) - .to.equal('Lorum ipsum dolor sit amet'); + it('simplifies whitespace in the middle of the string', function () { + expect(this.ws('Lorum ipsum\n\xa0dolor\tsit \r \n\tamet')).to.equal( + 'Lorum ipsum dolor sit amet' + ); }); - it('removes whitespace at the ends of the string', function() { - expect(this.ws(' Lorum ipsum dolor sit amet\n')) - .to.equal('Lorum ipsum dolor sit amet'); + it('removes whitespace at the ends of the string', function () { + expect(this.ws(' Lorum ipsum dolor sit amet\n')).to.equal('Lorum ipsum dolor sit amet'); - expect(this.ws('\tLorum ipsum dolor sit amet\r')) - .to.equal('Lorum ipsum dolor sit amet'); + expect(this.ws('\tLorum ipsum dolor sit amet\r')).to.equal( + 'Lorum ipsum dolor sit amet' + ); - expect(this.ws('\t \r \n\xa0 Lorum ipsum dolor sit amet')) - .to.equal('Lorum ipsum dolor sit amet'); + expect(this.ws('\t \r \n\xa0 Lorum ipsum dolor sit amet')).to.equal( + 'Lorum ipsum dolor sit amet' + ); }); - it('removes zero-width whitespace', function() { - expect(this.ws('Lorum\u200Bipsum dol\uFEFFor sit amet')) - .to.equal('Lorumipsum dolor sit amet'); + it('removes zero-width whitespace', function () { + expect(this.ws('Lorum\u200Bipsum dol\uFEFFor sit amet')).to.equal( + 'Lorumipsum dolor sit amet' + ); - expect(this.ws('Lorum\u200Cips\uFEFFum dolor sit amet')) - .to.equal('Lorumipsum dolor sit amet'); + expect(this.ws('Lorum\u200Cips\uFEFFum dolor sit amet')).to.equal( + 'Lorumipsum dolor sit amet' + ); - expect(this.ws('Lorum\u200Dipsum dolor sit am\uFEFFet')) - .to.equal('Lorumipsum dolor sit amet'); + expect(this.ws('Lorum\u200Dipsum dolor sit am\uFEFFet')).to.equal( + 'Lorumipsum dolor sit amet' + ); }); }); - context('mode = `keep-newline`', function() { - beforeEach(function() { + context('mode = `keep-newline`', function () { + beforeEach(function () { this.ws = whitespace('keep-newline'); }); - it('simplifies non-newline whitespace in the middle of the string', function() { - expect(this.ws('Lorum ipsum dolor\tsit \r \tamet')) - .to.equal('Lorum ipsum dolor sit amet'); + it('simplifies non-newline whitespace in the middle of the string', function () { + expect(this.ws('Lorum ipsum dolor\tsit \r \tamet')).to.equal( + 'Lorum ipsum dolor sit amet' + ); }); - it('keeps newline characters in the middle of a string', function() { - expect(this.ws('Lorum \n ipsum\xa0 dolor\tsit \r \n\tamet')) - .to.equal('Lorum\nipsum dolor sit\namet'); + it('keeps newline characters in the middle of a string', function () { + expect(this.ws('Lorum \n ipsum\xa0 dolor\tsit \r \n\tamet')).to.equal( + 'Lorum\nipsum dolor sit\namet' + ); }); - it('removes non-newline whitespace at the ends of the string', function() { - expect(this.ws(' Lorum ipsum dolor sit amet')) - .to.equal('Lorum ipsum dolor sit amet'); + it('removes non-newline whitespace at the ends of the string', function () { + expect(this.ws(' Lorum ipsum dolor sit amet')).to.equal('Lorum ipsum dolor sit amet'); - expect(this.ws('\tLorum ipsum dolor sit amet\r')) - .to.equal('Lorum ipsum dolor sit amet'); + expect(this.ws('\tLorum ipsum dolor sit amet\r')).to.equal( + 'Lorum ipsum dolor sit amet' + ); - expect(this.ws('\t\xa0 \r Lorum ipsum dolor sit amet')) - .to.equal('Lorum ipsum dolor sit amet'); + expect(this.ws('\t\xa0 \r Lorum ipsum dolor sit amet')).to.equal( + 'Lorum ipsum dolor sit amet' + ); }); - it('keeps newline characters at the ends of a string', function() { - expect(this.ws(' \n Lorum ipsum dolor sit amet\t\n')) - .to.equal('\nLorum ipsum dolor sit amet\n'); + it('keeps newline characters at the ends of a string', function () { + expect(this.ws(' \n Lorum ipsum dolor sit amet\t\n')).to.equal( + '\nLorum ipsum dolor sit amet\n' + ); - expect(this.ws('\nLorum ipsum dolor sit amet')) - .to.equal('\nLorum ipsum dolor sit amet'); + expect(this.ws('\nLorum ipsum dolor sit amet')).to.equal( + '\nLorum ipsum dolor sit amet' + ); }); - it('removes zero-width whitespace', function() { - expect(this.ws('Lorum\u200Bipsum dol\uFEFFor sit amet')) - .to.equal('Lorumipsum dolor sit amet'); + it('removes zero-width whitespace', function () { + expect(this.ws('Lorum\u200Bipsum dol\uFEFFor sit amet')).to.equal( + 'Lorumipsum dolor sit amet' + ); - expect(this.ws('Lorum\u200Cips\uFEFFum dolor sit amet')) - .to.equal('Lorumipsum dolor sit amet'); + expect(this.ws('Lorum\u200Cips\uFEFFum dolor sit amet')).to.equal( + 'Lorumipsum dolor sit amet' + ); - expect(this.ws('Lorum\u200Dipsum dolor sit am\uFEFFet')) - .to.equal('Lorumipsum dolor sit amet'); + expect(this.ws('Lorum\u200Dipsum dolor sit am\uFEFFet')).to.equal( + 'Lorumipsum dolor sit amet' + ); }); }); - context('mode = `keep`', function() { - beforeEach(function() { + context('mode = `keep`', function () { + beforeEach(function () { this.ws = whitespace('keep'); }); - it('does not change the string at all', function() { + it('does not change the string at all', function () { const string = 'Lorum \t\r\xa0 ipsum dolor \n\nsit amet\n\r'; expect(this.ws(string)).to.equal(string); From bed12448ff2364502a4496f756083118e6f0e2b9 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 13:03:38 +0200 Subject: [PATCH 10/26] Formatted docs --- docs/attribute.md | 64 +++++++-------- docs/request.md | 205 +++++++++++++++++++++++++--------------------- docs/text.md | 72 ++++++++-------- docs/then.md | 164 +++++++++++++++++++++---------------- docs/to.md | 49 +++++------ 5 files changed, 297 insertions(+), 257 deletions(-) diff --git a/docs/attribute.md b/docs/attribute.md index 15d0d22..0671324 100644 --- a/docs/attribute.md +++ b/docs/attribute.md @@ -2,11 +2,12 @@ This is a command that does not exist as a default command. ----- +--- Enables you to get the value of an elements attributes. -> **Note:** When using `.attribute()` you should be aware about how Cypress [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). +> **Note:** When using `.attribute()` you should be aware about how Cypress +> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). ## Syntax @@ -20,44 +21,44 @@ Enables you to get the value of an elements attributes. ### :heavy_check_mark: Correct Usage ```javascript -cy.get('a').attribute('href') // Yields the value of the `href` attribute +cy.get('a').attribute('href'); // Yields the value of the `href` attribute ``` ### :x: Incorrect Usage ```javascript -cy.attribute('foo') // Errors, cannot be chained off 'cy' -cy.location().attribute('foo') // Errors, 'location' does not yield DOM element +cy.attribute('foo'); // Errors, cannot be chained off 'cy' +cy.location().attribute('foo'); // Errors, 'location' does not yield DOM element ``` ## Arguments -**> attribute** ***(String)*** +**> attribute** **_(String)_** The name of the attribute to be yielded by `.attribute()` -**> options** ***(Object)*** +**> options** **_(Object)_** Pass in an options object to change the default behavior of `.attribute()`. -Option | Default | Description ---- | --- | --- -`timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.attribute()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) -`log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) -`whitespace` | `keep` | Replace complex whitespace with a single regular space.
    Accepted values: `simplify`, `keep-newline` & `keep` -`strict` | `true` | Implicitly assert that all subjects have the requested attribute +| Option | Default | Description | +| ------------ | ------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- | +| `timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.attribute()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) | +| `log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | +| `whitespace` | `keep` | Replace complex whitespace with a single regular space.
    Accepted values: `simplify`, `keep-newline` & `keep` | +| `strict` | `true` | Implicitly assert that all subjects have the requested attribute | ## Yields -* `.attribute()` yields the value of a subjects given attribute. -* `.attribute()` yields an array of the values of multiple subjects given attribute. +- `.attribute()` yields the value of a subjects given attribute. +- `.attribute()` yields an array of the values of multiple subjects given attribute. ## Examples ### An alt attribute ```html -Teriffic tiger +Teriffic tiger ``` ```javascript @@ -68,8 +69,7 @@ cy.get('img').attribute('alt'); ### Multiple subjects ```html - - + ``` ```javascript @@ -85,8 +85,10 @@ cy.get('input').attribute('type'); By default all whitespace will be kept intact. ```html -
    +
    ``` #### Simplify whitespace @@ -119,11 +121,11 @@ cy.get('div').attribute('data-attribute', { whitespace: 'keep' }); ### Strict mode -Strict mode comes into play when using `.attribute()` with multiple subjects. By default strict mode is enabled. +Strict mode comes into play when using `.attribute()` with multiple subjects. By default strict mode +is enabled. ```html -Amazing armadillo -Everlasting eel +Amazing armadillo Everlasting eel ``` #### Strict mode `true` @@ -147,7 +149,8 @@ cy.get('a').attribute('href'); #### Strict mode `false` -Does not throw an error because it is possible to yield a value, even if not all subjects have a `target` attribute. Any subject that does not have the `target` attribute is simply ignored. +Does not throw an error because it is possible to yield a value, even if not all subjects have a +`target` attribute. Any subject that does not have the `target` attribute is simply ignored. ```javascript // yields "_blank" @@ -165,26 +168,23 @@ cy.get('a').attribute('target', { strict: false }); ``` ```javascript -cy.get('p') - .attribute('hidden') - .should('exist') - .should('be.empty'); +cy.get('p').attribute('hidden').should('exist').should('be.empty'); ``` ## Rules ### Requirements -* `.attribute()` requires being chained off a command that yields DOM element(s). +- `.attribute()` requires being chained off a command that yields DOM element(s). ### Assertions -* `.attribute()` will automatically retry until the attribute exist on the subject(s). -* `.attribute()` will automatically retry itself until assertions you've chained all pass. +- `.attribute()` will automatically retry until the attribute exist on the subject(s). +- `.attribute()` will automatically retry itself until assertions you've chained all pass. ### Timeouts -* `.attribute()` can time out waiting for a chained assertion to pass. +- `.attribute()` can time out waiting for a chained assertion to pass. ## Command Log diff --git a/docs/request.md b/docs/request.md index 27a3779..c3ac4e7 100644 --- a/docs/request.md +++ b/docs/request.md @@ -6,18 +6,18 @@ This command has been extended with See [original documentation](https://docs.cypress.io/api/commands/request.html) ----- +--- Make an HTTP request. ## Syntax ```javascript -cy.request(url) -cy.request(url, body) -cy.request(method, url) -cy.request(method, url, body) -cy.request(options) +cy.request(url); +cy.request(url, body); +cy.request(method, url); +cy.request(method, url, body); +cy.request(options); ``` ## Usage @@ -25,56 +25,61 @@ cy.request(options) ### :heavy_check_mark: Correct Usage ```javascript -cy.request('http://dev.local/seed') +cy.request('http://dev.local/seed'); ``` ## Arguments -**> url** ***(string)*** +**> url** **_(string)_** The `url` to make the request to. -If you provide a non fully qualified domain name (FQDN), Cypress will make its best guess as to which host you want `cy.request()` to use in the url. +If you provide a non fully qualified domain name (FQDN), Cypress will make its best guess as to +which host you want `cy.request()` to use in the url. -1. If you make a `cy.request()` after visiting a page, Cypress assumes the url used for the `cy.visit()` is the host. +1. If you make a `cy.request()` after visiting a page, Cypress assumes the url used for the + `cy.visit()` is the host. - ``` javascript - cy.visit('http://localhost:8080/app') - cy.request('users/1.json') // url is http://localhost:8080/users/1.json - ``` +```javascript +cy.visit('http://localhost:8080/app'); +cy.request('users/1.json'); // url is http://localhost:8080/users/1.json +``` -2. If you make a `cy.request()` prior to visiting a page, Cypress uses the host configured as the `requestBaseUrl` property inside of `cypress.json`. +2. If you make a `cy.request()` prior to visiting a page, Cypress uses the host configured as the + `requestBaseUrl` property inside of `cypress.json`. - ```javascript - // cypress.json +```javascript +// cypress.json - { - "requestBaseUrl": "http://localhost:1234" - } - cy.request('seed/admin') // url is http://localhost:1234/seed/admin - ``` +{ +"requestBaseUrl": "http://localhost:1234" +} +cy.request('seed/admin') // url is http://localhost:1234/seed/admin +``` - If the `requestBaseUrl` is empty Cypress will use `baseUrl` instead. +If the `requestBaseUrl` is empty Cypress will use `baseUrl` instead. - ```javascript - // cypress.json +```javascript +// cypress.json - { - "requestBaseUrl": "" - "baseUrl": "http://localhost:1234" - } - cy.request('seed/admin') // url is http://localhost:1234/seed/admin - ``` +{ +"requestBaseUrl": "" +"baseUrl": "http://localhost:1234" +} +cy.request('seed/admin') // url is http://localhost:1234/seed/admin +``` 3. If Cypress cannot determine the host it will throw an error. -**> body** ***(String, Object)*** +**> body** **_(String, Object)_** -A request `body` to be sent in the request. Cypress sets the `Accepts` request header and serializes the response body by its `Content-Type`. +A request `body` to be sent in the request. Cypress sets the `Accepts` request header and serializes +the response body by its `Content-Type`. -**> method** ***(String)*** +**> method** **_(String)_** -Make a request using a specific method. If no method is defined, Cypress uses the `GET` method by default. +Make a request using a specific method. If no method is defined, Cypress uses the `GET` method by +default. Supported methods include: @@ -105,26 +110,27 @@ Supported methods include: - `SEARCH` - `CONNECT` -**> options** ***(Object)*** +**> options** **_(Object)_** Pass in an options object to change the default behavior of `cy.request`. -Option | Default | Description ---- | --- | --- -`log` | `true` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) -`url` | `null` | The URL to make the request to -`method` | `GET` | The HTTP method to use in the request -`auth` | `null` | Adds Authorization headers. ['Accepts these options.'](https://github.com/request/request#http-authentication) -`body` | `null` | Body to send along with the request -`failOnStatusCode` | `true` | Whether to fail on response codes other than `2xx` and `3xx` -`followRedirect` | `true` | Whether to automatically follow redirects -`form` | `false` | Whether to convert the `body` values to url encoded content and set the `x-www-form-urlencoded` header -`gzip` | `true` | Whether to accept the `gzip` encoding -`headers` | `null` | Additional headers to send; Accepts object literal -`qs` | `null` | Query parameters to append to the `url` of the request -`timeout` | [`responseTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `cy.request()` to resolve before [timing out](https://docs.cypress.io/api/commands/request.html#Timeouts) - -You can also set options for `cy.request`'s `requestBaseUrl`, `baseUrl` and `responseTimeout` globally in [configuration](https://docs.cypress.io/guides/references/configuration.html). +| Option | Default | Description | +| ------------------ | ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------- | +| `log` | `true` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | +| `url` | `null` | The URL to make the request to | +| `method` | `GET` | The HTTP method to use in the request | +| `auth` | `null` | Adds Authorization headers. ['Accepts these options.'](https://github.com/request/request#http-authentication) | +| `body` | `null` | Body to send along with the request | +| `failOnStatusCode` | `true` | Whether to fail on response codes other than `2xx` and `3xx` | +| `followRedirect` | `true` | Whether to automatically follow redirects | +| `form` | `false` | Whether to convert the `body` values to url encoded content and set the `x-www-form-urlencoded` header | +| `gzip` | `true` | Whether to accept the `gzip` encoding | +| `headers` | `null` | Additional headers to send; Accepts object literal | +| `qs` | `null` | Query parameters to append to the `url` of the request | +| `timeout` | [`responseTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `cy.request()` to resolve before [timing out](https://docs.cypress.io/api/commands/request.html#Timeouts) | + +You can also set options for `cy.request`'s `requestBaseUrl`, `baseUrl` and `responseTimeout` +globally in [configuration](https://docs.cypress.io/guides/references/configuration.html). ## Yields @@ -145,16 +151,18 @@ You can also set options for `cy.request`'s `requestBaseUrl`, `baseUrl` and `res ```javascript beforeEach(function () { - cy.request('http://localhost:8080/db/seed') -}) + cy.request('http://localhost:8080/db/seed'); +}); ``` #### Issue a simple HTTP request -Sometimes it's quicker to simply test the contents of a page rather than [`cy.visit()`](https://docs.cypress.io/api/commands/visit.html) and wait for the entire page and all of its resources to load. +Sometimes it's quicker to simply test the contents of a page rather than +[`cy.visit()`](https://docs.cypress.io/api/commands/visit.html) and wait for the entire page and all +of its resources to load. ```javascript -cy.request('/admin').its('body').should('include', '

    Admin

    ') +cy.request('/admin').its('body').should('include', '

    Admin

    '); ``` ### Method and URL @@ -162,7 +170,7 @@ cy.request('/admin').its('body').should('include', '

    Admin

    ') #### Send a `DELETE` request ```javascript -cy.request('DELETE', 'http://localhost:8888/users/827') +cy.request('DELETE', 'http://localhost:8888/users/827'); ``` ### Method, URL, and Body @@ -170,39 +178,41 @@ cy.request('DELETE', 'http://localhost:8888/users/827') #### Send a `POST` request with a JSON body ```javascript -cy - .request('POST', 'http://localhost:8888/users/admin', { name: 'Jane' }) - .then((response) => { - // response.body is automatically serialized into JSON - expect(response.body).to.have.property('name', 'Jane') // true - }) +cy.request('POST', 'http://localhost:8888/users/admin', { name: 'Jane' }).then((response) => { + // response.body is automatically serialized into JSON + expect(response.body).to.have.property('name', 'Jane'); // true +}); ``` ### Options #### Request a page while disabling auto redirect -To test the redirection behavior of a login without a session, `cy.request` can be used to check the `status` and `redirectedToUrl` property. +To test the redirection behavior of a login without a session, `cy.request` can be used to check the +`status` and `redirectedToUrl` property. -The `redirectedToUrl` property is a special Cypress property that normalizes the `url` the browser would normally follow during a redirect. +The `redirectedToUrl` property is a special Cypress property that normalizes the `url` the browser +would normally follow during a redirect. ```javascript cy.request({ url: '/dashboard', - followRedirect: false // turn off following redirects -}) - .then((resp) => { - // redirect status code is 302 - expect(resp.status).to.eq(302) - expect(resp.redirectedToUrl).to.eq('http://localhost:8082/unauthorized') - }) + followRedirect: false, // turn off following redirects +}).then((resp) => { + // redirect status code is 302 + expect(resp.status).to.eq(302); + expect(resp.redirectedToUrl).to.eq('http://localhost:8082/unauthorized'); +}); ``` #### HTML form submissions using form option -Oftentimes, once you have a proper e2e test around logging in, there's no reason to continue to `cy.visit()` the login and wait for the entire page to load all associated resources before running any other commands. Doing so can slow down our entire test suite. +Oftentimes, once you have a proper e2e test around logging in, there's no reason to continue to +`cy.visit()` the login and wait for the entire page to load all associated resources before running +any other commands. Doing so can slow down our entire test suite. -Using `cy.request()`, we can bypass all of this because it automatically gets and sets cookies just as if the requests had come from the browser. +Using `cy.request()`, we can bypass all of this because it automatically gets and sets cookies just +as if the requests had come from the browser. ```javascript cy.request({ @@ -211,12 +221,12 @@ cy.request({ form: true, // indicates the body should be form urlencoded and sets Content-Type: application/x-www-form-urlencoded headers body: { username: 'jane.lane', - password: 'password123' - } -}) + password: 'password123', + }, +}); // just to prove we have a session -cy.getCookie('cypress-session-cookie').should('exist') +cy.getCookie('cypress-session-cookie').should('exist'); ``` #### Using cy.request for HTML Forms @@ -263,33 +273,41 @@ cy #### Request is not displayed in the Network Tab of Developer Tools -Cypress does not *actually* make an XHR request from the browser. We are actually making the HTTP request from the Cypress Test Runner (in Node.js). So, you won't see the request inside of your Developer Tools. +Cypress does not _actually_ make an XHR request from the browser. We are actually making the HTTP +request from the Cypress Test Runner (in Node.js). So, you won't see the request inside of your +Developer Tools. ### Cors #### CORS is bypassed -Normally when the browser detects a cross-origin HTTP request, it will send an `OPTIONS` preflight check to ensure the server allows cross-origin requests, but `cy.request()` bypasses CORS entirely. +Normally when the browser detects a cross-origin HTTP request, it will send an `OPTIONS` preflight +check to ensure the server allows cross-origin requests, but `cy.request()` bypasses CORS entirely. ```javascript // we can make requests to any external server, no problem. cy.request('https://www.google.com/webhp?#q=cypress.io+cors') - .its('body').should('include', 'Testing, the way it should be') // true + .its('body') + .should('include', 'Testing, the way it should be'); // true ``` ### Cookies #### Cookies are automatically sent and received -Before sending the HTTP request, we automatically attach cookies that would have otherwise been attached had the request come from the browser. Additionally, if a response has a `Set-Cookie` header, these are automatically set back on the browser cookies. +Before sending the HTTP request, we automatically attach cookies that would have otherwise been +attached had the request come from the browser. Additionally, if a response has a `Set-Cookie` +header, these are automatically set back on the browser cookies. -In other words, `cy.request()` transparently performs all of the underlying functions as if it came from the browser. +In other words, `cy.request()` transparently performs all of the underlying functions as if it came +from the browser. ### `cy.request()` cannot be used to debug `cy.server()` and `cy.route()` #### `cy.request()` sends requests to actual endpoints, bypassing those defined using `cy.route()` -The intention of `cy.request()` is to be used for checking endpoints on an actual, running server without having to start the front end application. +The intention of `cy.request()` is to be used for checking endpoints on an actual, running server +without having to start the front end application. ## Rules @@ -297,7 +315,8 @@ The intention of `cy.request()` is to be used for checking endpoints on an actua - `cy.request()` requires being chained off of `cy`. - `cy.request()` requires that the server send a response. -- `cy.request()` requires that the response status code be `2xx` or `3xx` when `failOnStatusCode` is `true`. +- `cy.request()` requires that the response status code be `2xx` or `3xx` when `failOnStatusCode` is + `true`. ### Assertions @@ -313,11 +332,11 @@ The intention of `cy.request()` is to be used for checking endpoints on an actua ```javascript cy.request('https://jsonplaceholder.typicode.com/comments').then((response) => { - expect(response.status).to.eq(200) - expect(response.body).to.have.length(500) - expect(response).to.have.property('headers') - expect(response).to.have.property('duration') -}) + expect(response.status).to.eq(200); + expect(response.body).to.have.length(500); + expect(response).to.have.property('headers'); + expect(response).to.have.property('duration'); +}); ``` The commands above will display in the Command Log as: @@ -330,9 +349,9 @@ When clicking on `request` within the command log, the console outputs the follo ## History -|   |   | -|--------|--------| -| 3.2.0 | Added support for any valid HTTP `method` argument including `TRACE`, `COPY`, `LOCK`, `MKCOL`, `MOVE`, `PURGE`, `PROPFIND`, `PROPPATCH`, `UNLOCK`, `REPORT`, `MKACTIVITY`, `CHECKOUT`, `MERGE`, `M-SEARCH`, `NOTIFY`, `SUBSCRIBE`, `UNSUBSCRIBE`, `SEARCH`, and `CONNECT`. +|   |   | +| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 3.2.0 | Added support for any valid HTTP `method` argument including `TRACE`, `COPY`, `LOCK`, `MKCOL`, `MOVE`, `PURGE`, `PROPFIND`, `PROPPATCH`, `UNLOCK`, `REPORT`, `MKACTIVITY`, `CHECKOUT`, `MERGE`, `M-SEARCH`, `NOTIFY`, `SUBSCRIBE`, `UNSUBSCRIBE`, `SEARCH`, and `CONNECT`. | ## See also diff --git a/docs/text.md b/docs/text.md index e0b0152..4397d0b 100644 --- a/docs/text.md +++ b/docs/text.md @@ -2,13 +2,14 @@ This is a command that does not exist as a default command. ----- +--- Enables you to get the text contents of the subject yielded from the previous command. `.text()` allows you to be more specific than you can be with `.contains()` or `.should('contain')`. -> **Note:** When using `.text()` you should be aware about how Cypress [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). +> **Note:** When using `.text()` you should be aware about how Cypress +> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). ## Syntax @@ -22,33 +23,33 @@ Enables you to get the text contents of the subject yielded from the previous co ### :heavy_check_mark: Correct Usage ```javascript -cy.get('nav').text() // Yields the text inside `nav` +cy.get('nav').text(); // Yields the text inside `nav` ``` ### :x: Incorrect Usage ```javascript -cy.text() // Errors, cannot be chained off 'cy' -cy.location().text() // Errors, 'location' does not yield DOM element +cy.text(); // Errors, cannot be chained off 'cy' +cy.location().text(); // Errors, 'location' does not yield DOM element ``` ## Arguments -**> options** ***(Object)*** +**> options** **_(Object)_** Pass in an options object to change the default behavior of `.text()`. -Option | Default | Description ---- | --- | --- -`timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.text()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) -`log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) -`whitespace` | `simplify` | Replace complex whitespace with a single regular space.
    Accepted values: `simplify`, `keep-newline` & `keep` -`depth` | `0` | Include the text contents of child elements upto `n` levels +| Option | Default | Description | +| ------------ | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | +| `timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.text()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) | +| `log` | `true` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | +| `whitespace` | `simplify` | Replace complex whitespace with a single regular space.
    Accepted values: `simplify`, `keep-newline` & `keep` | +| `depth` | `0` | Include the text contents of child elements upto `n` levels | ## Yields -* `.text()` yields the text inside the subject. -* `.text()` yields an array of the texts inside multiple subjects. +- `.text()` yields the text inside the subject. +- `.text()` yields an array of the texts inside multiple subjects. ## Examples @@ -87,8 +88,7 @@ cy.get('div').text(); By default all whitespace will be simplified. ```html -
    Extravagant   - Eagle
    +
    Extravagant   Eagle
    ``` #### Simplify whitespace by default @@ -121,20 +121,17 @@ cy.get('div').text({ whitespace: 'keep' }); ### Depth of elements -By default only the text of the subject itself will be yielded. Use this option to also get the text of underlying elements. +By default only the text of the subject itself will be yielded. Use this option to also get the text +of underlying elements. ```html
    Grandma Gazelle
    Mother Meerkat -
    - Son Scorpion -
    -
    -
    - Father Fox +
    Son Scorpion
    +
    Father Fox
    ``` @@ -142,26 +139,24 @@ By default only the text of the subject itself will be yielded. Use this option ```javascript // yields "Grandma Gazelle" -cy.get('.grandparent') - .text(); +cy.get('.grandparent').text(); ``` The default value of `depth` is `0` so the following yields the same. ```javascript // yields "Grandma Gazelle" -cy.get('.grandparent') - .text({ depth: 0 }); +cy.get('.grandparent').text({ depth: 0 }); ``` #### Include the direct children -The text of the child elements are concatenated and yielded as a single string with a space as delimiter. +The text of the child elements are concatenated and yielded as a single string with a space as +delimiter. ```javascript // yields "Grandma Gazelle Mother Meerkat Father Fox" -cy.get('.grandparent') - .text({ depth: 1 }); +cy.get('.grandparent').text({ depth: 1 }); ``` #### Multiple elements with depth @@ -173,8 +168,7 @@ Selecting multiple elements will yield an array of concatenated strings. // "Mother Meerkat Son Scorpion", // "Father Fox" // ] -cy.get('.parent') - .text({ depth: 1 }); +cy.get('.parent').text({ depth: 1 }); ``` #### Remove all depth limitations @@ -183,8 +177,7 @@ To infinity and beyond! ```javascript // yields "Grandma Gazelle Mother Meerkat Son Scorpion Father Fox" -cy.get('.grandparent') - .text({ depth: Infinity }); +cy.get('.grandparent').text({ depth: Infinity }); ``` ## Notes @@ -194,23 +187,22 @@ cy.get('.grandparent') `.text()` also gets text from form elements like `input` and `textarea`. ```javascript -cy.get('input') - .text(); +cy.get('input').text(); ``` ## Rules ### Requirements -* `.text()` requires being chained off a command that yields DOM element(s). +- `.text()` requires being chained off a command that yields DOM element(s). ### Assertions -* `.text()` will automatically retry itself until assertions you've chained all pass. +- `.text()` will automatically retry itself until assertions you've chained all pass. ### Timeouts -* `.text()` can time out waiting for a chained assertion to pass. +- `.text()` can time out waiting for a chained assertion to pass. ## Command Log @@ -218,4 +210,4 @@ cy.get('input') ## See also -* [`.contains()`](https://docs.cypress.io/api/commands/contains.html) +- [`.contains()`](https://docs.cypress.io/api/commands/contains.html) diff --git a/docs/then.md b/docs/then.md index 2ff69e3..391793a 100644 --- a/docs/then.md +++ b/docs/then.md @@ -7,13 +7,17 @@ This command has been extended with See [original documentation](https://docs.cypress.io/api/commands/then.html) ----- +--- Enables you to work with the subject yielded from the previous command. -> **Note:** `.then()` assumes you are already familiar with core concepts such as [closures](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Closures). +> **Note:** `.then()` assumes you are already familiar with core concepts such as +> [closures](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Closures). -> **Note:** Prefer ['`.should()` with callback](https://docs.cypress.io/api/commands/should.html#Function) over `.then()` for assertions as they are automatically rerun until no assertions throw within it but be aware of [differences](https://docs.cypress.io/api/commands/should.html#Differences). +> **Note:** Prefer +> ['`.should()` with callback](https://docs.cypress.io/api/commands/should.html#Function) over +> `.then()` for assertions as they are automatically rerun until no assertions throw within it but +> be aware of [differences](https://docs.cypress.io/api/commands/should.html#Differences). ## Syntax @@ -27,37 +31,44 @@ Enables you to work with the subject yielded from the previous command. ### :heavy_check_mark: Correct Usage ```javascript -cy.get('.nav').then(($nav) => {}) // Yields .nav as first arg -cy.location().then((loc) => {}) // Yields location object as first arg +cy.get('.nav').then(($nav) => {}); // Yields .nav as first arg +cy.location().then((loc) => {}); // Yields location object as first arg ``` ## Arguments -**> options** ***(Object)*** +**> options** **_(Object)_** Pass in an options object to change the default behavior of `.then()`. -Option | Default | Description ---- | --- | --- -`timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.then()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) -`retry` | `false` | Retry itself until assertions you've chained all pass -`log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) +| Option | Default | Description | +| --------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | +| `timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.then()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) | +| `retry` | `false` | Retry itself until assertions you've chained all pass | +| `log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | -**> callbackFn** ***(Function)*** +**> callbackFn** **_(Function)_** Pass a function that takes the previously yielded subject as its first argument. ## Yields -`.then()` is modeled identically to the way Promises work in JavaScript. Whatever is returned from the callback function becomes the new subject and will flow into the next command (with the exception of `undefined`). +`.then()` is modeled identically to the way Promises work in JavaScript. Whatever is returned from +the callback function becomes the new subject and will flow into the next command (with the +exception of `undefined`). -When `undefined` is returned by the callback function, the subject will not be modified and will instead carry over to the next command. +When `undefined` is returned by the callback function, the subject will not be modified and will +instead carry over to the next command. -Just like Promises, you can return any compatible "thenable" (anything that has a `.then()` interface) and Cypress will wait for that to resolve before continuing forward through the chain of commands. +Just like Promises, you can return any compatible "thenable" (anything that has a `.then()` +interface) and Cypress will wait for that to resolve before continuing forward through the chain of +commands. ## Examples -> We have several more examples in our [Core Concepts Guide](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html) which go into the various ways you can use `.then()` to store, compare, and debug values. +> We have several more examples in our +> [Core Concepts Guide](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html) +> which go into the various ways you can use `.then()` to store, compare, and debug values. ### DOM element @@ -65,10 +76,10 @@ Just like Promises, you can return any compatible "thenable" (anything that has ```javascript cy.get('button').then(($btn) => { - const cls = $btn.class() + const cls = $btn.class(); - cy.wrap($btn).click().should('not.have.class', cls) -}) + cy.wrap($btn).click().should('not.have.class', cls); +}); ``` ### Change subject @@ -76,29 +87,31 @@ cy.get('button').then(($btn) => { #### The subject is changed by returning ```javascript -cy.wrap(null).then(() => { - return { id: 123 } -}) -.then((obj) => { - // subject is now the obj {id: 123} - expect(obj.id).to.eq(123) // true -}) +cy.wrap(null) + .then(() => { + return { id: 123 }; + }) + .then((obj) => { + // subject is now the obj {id: 123} + expect(obj.id).to.eq(123); // true + }); ``` #### Returning `null` or `undefined` will not modify the yielded subject ```javascript cy.get('form') -.then(($form) => { - console.log('form is:', $form) - // undefined is returned here, but $form will be - // yielded to allow for continued chaining -}) -.find('input').then(($input) => { - // we have our $input element here since - // our form element was yielded and we called - // .find('input') on it -}) + .then(($form) => { + console.log('form is:', $form); + // undefined is returned here, but $form will be + // yielded to allow for continued chaining + }) + .find('input') + .then(($input) => { + // we have our $input element here since + // our form element was yielded and we called + // .find('input') on it + }); ``` ### Promises @@ -108,57 +121,65 @@ Cypress waits for Promises to resolve before continuing #### Example using Q ```javascript -cy.get('button').click().then(($button) => { - const p = Q.defer() +cy.get('button') + .click() + .then(($button) => { + const p = Q.defer(); - setTimeout(() => { - p.resolve() - }, 1000) + setTimeout(() => { + p.resolve(); + }, 1000); - return p.promise -}) + return p.promise; + }); ``` #### Example using bluebird ```javascript -cy.get('button').click().then(($button) => { - return Promise.delay(1000) -}) +cy.get('button') + .click() + .then(($button) => { + return Promise.delay(1000); + }); ``` #### Example using jQuery deferred's ```javascript -cy.get('button').click().then(($button) => { - const df = $.Deferred() +cy.get('button') + .click() + .then(($button) => { + const df = $.Deferred(); - setTimeout(() => { - df.resolve() - }, 1000) + setTimeout(() => { + df.resolve(); + }, 1000); - return df -}) + return df; + }); ``` ### Retryability -The default Cypress command has been extended to allow you to retry a function until chained assertions pass. Use this sparsely. If you find yourself using this all the time you are probably doing it wrong. In most cases there are more suitable commands to get what you need. +The default Cypress command has been extended to allow you to retry a function until chained +assertions pass. Use this sparsely. If you find yourself using this all the time you are probably +doing it wrong. In most cases there are more suitable commands to get what you need. ```javascript cy.get('form') -.then({ retry: true }, ($form) => { - // We have acces to the jQuery object describing the form - // here. We can now do some operations on it without using - // Cypress commands, while we maintain retryability. - - // Note that this function might be executed multiple - // times. Keep it light and make sure you know what - // you're doing. - - return 'foo'; -}) -.should('equal', 'foo'); + .then({ retry: true }, ($form) => { + // We have acces to the jQuery object describing the form + // here. We can now do some operations on it without using + // Cypress commands, while we maintain retryability. + + // Note that this function might be executed multiple + // times. Keep it light and make sure you know what + // you're doing. + + return 'foo'; + }) + .should('equal', 'foo'); ``` ## Notes @@ -167,9 +188,13 @@ cy.get('form') What’s the difference between `.then()` and `.should()`/`.and()`? -Using `.then()` simply allows you to use the yielded subject in a callback function and should be used when you need to manipulate some values or do some actions. +Using `.then()` simply allows you to use the yielded subject in a callback function and should be +used when you need to manipulate some values or do some actions. -When using a callback function with `.should()`, `.and()` or `.then({ retry: true })`, on the other hand, there is special logic to rerun the callback function until no assertions throw within it. You should be careful of side affects in a `.should()` or `.and()` callback function that you would not want performed multiple times. +When using a callback function with `.should()`, `.and()` or `.then({ retry: true })`, on the other +hand, there is special logic to rerun the callback function until no assertions throw within it. You +should be careful of side affects in a `.should()` or `.and()` callback function that you would not +want performed multiple times. ## Rules @@ -179,7 +204,8 @@ When using a callback function with `.should()`, `.and()` or `.then({ retry: tru ### Assertions -- `.then()` will only run assertions you've chained once, and will not retry (unless you use the `retry` option). +- `.then()` will only run assertions you've chained once, and will not retry (unless you use the + `retry` option). ### Timeouts diff --git a/docs/to.md b/docs/to.md index 5754928..7f4af0b 100644 --- a/docs/to.md +++ b/docs/to.md @@ -2,11 +2,12 @@ This is a command that does not exist as a default command. ----- +--- Cast the subject to another type. Will do nothing if the subject is already of that type. -> **Note:** When using `.to()` you should be aware about how Cypress [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). +> **Note:** When using `.to()` you should be aware about how Cypress +> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). ## Syntax @@ -35,24 +36,24 @@ cy.wrap('Dangerous dog').to('number'); // Errors, can't string be casted to numb ## Arguments -**> type** ***(string)*** +**> type** **_(string)_** The type you want to cast the subject to. Must be one of `number`, `string` or `array`. -**> options** ***(Object)*** +**> options** **_(Object)_** Pass in an options object to change the default behavior of `.to()`. -Option | Default | Description ---- | --- | --- -`timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.to()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) -`log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) +| Option | Default | Description | +| --------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | +| `timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.to()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) | +| `log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | ## Yields -* `.to('array')` yields an array -* `.to('string')` yields a string or array of strings -* `.to('number')` yields a number or array of numbers +- `.to('array')` yields an array +- `.to('string')` yields a string or array of strings +- `.to('number')` yields a number or array of numbers ## Examples @@ -83,7 +84,7 @@ cy.wrap({ foo: 'bar' }).to('string'); ```javascript // yields [ '123', '456', '789' ] -cy.wrap([ 123, 456, 789 ]).to('string'); +cy.wrap([123, 456, 789]).to('string'); ``` ### Casting an array to an array @@ -92,38 +93,40 @@ When trying to cast to the type of the subject `.to()` will do nothing. ```javascript // yields [ 'foo' ] -cy.wrap([ 'foo' ]).to('array'); +cy.wrap(['foo']).to('array'); ``` ## Notes ### Ensuring iterability -Some commands, like `.text()`, yield a string when there is only a single subject, but an array when there are multiple subjects. You can use `.to('array')` to ensure you can loop over the results of `.text()` without the risk of an error. +Some commands, like `.text()`, yield a string when there is only a single subject, but an array when +there are multiple subjects. You can use `.to('array')` to ensure you can loop over the results of +`.text()` without the risk of an error. ```javascript cy.get('.maybeOneElement') - .text() - .to('array') - .each((text) => { - // ... - }); + .text() + .to('array') + .each((text) => { + // ... + }); ``` ## Rules ### Requirements -* `.to()` requires being chained off a previous command. +- `.to()` requires being chained off a previous command. ### Assertions -* `.to()` will automatically retry itself until the subject can be casted. -* `.to()` will automatically retry itself until assertions you've chained all pass. +- `.to()` will automatically retry itself until the subject can be casted. +- `.to()` will automatically retry itself until assertions you've chained all pass. ### Timeouts -* `.to()` can time out waiting for a chained assertion to pass. +- `.to()` can time out waiting for a chained assertion to pass. ## Command Log From 7d7843929c25dd9a5fd02b8a196c960bc7a91707 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 13:04:06 +0200 Subject: [PATCH 11/26] Improved type definitions --- tsconfig.json | 20 +++++++------------- types/attribute.d.ts | 34 +++++++++++++++++++++------------- types/generic.d.ts | 29 +++++++++++++++++++++++++++++ types/index.d.ts | 1 + types/text.d.ts | 24 ++++++++++++++++++------ types/then.d.ts | 18 +++--------------- types/to.d.ts | 41 ++++++++++++++++++++++++++++++++++------- 7 files changed, 113 insertions(+), 54 deletions(-) create mode 100644 types/generic.d.ts diff --git a/tsconfig.json b/tsconfig.json index 4b0607e..198eb0c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,15 +1,9 @@ { - "compilerOptions": { - "lib": ["es2015", "dom"], - "allowJs": true, - "types": [ - ".", - "cypress" - ], - "outDir": "./dist" - }, - "include": [ - "cypress/**/*.js", - "src/**/*.js" - ] + "compilerOptions": { + "lib": ["es2015", "dom"], + "allowJs": true, + "types": ["./types", "cypress"], + "outDir": "./dist" + }, + "include": ["cypress/**/*.js", "src/**/*.js"] } diff --git a/types/attribute.d.ts b/types/attribute.d.ts index 767d1f7..0f7860d 100644 --- a/types/attribute.d.ts +++ b/types/attribute.d.ts @@ -1,5 +1,7 @@ +/// + declare namespace Cypress { - interface Chainable { + interface Chainable { /** * Get the value of an attribute of a DOM element. * @@ -7,12 +9,8 @@ declare namespace Cypress { */ attribute( attribute: string, - options?: { - log?: boolean; - whitespace?: 'simplify' | 'keep-newline' | 'keep'; - strict?: boolean; - } - ): Chainable; + options: Partial + ): Chainable; /** * Get the value of an attribute of a DOM element. @@ -20,12 +18,22 @@ declare namespace Cypress { * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/attribute.md */ attribute( - options: { - log?: boolean; - whitespace?: 'simplify' | 'keep-newline' | 'keep'; - strict?: boolean; - }, + options: Partial, attribute: string - ): Chainable; + ): Chainable; + } + + interface AttributeOptions extends Loggable, WhitespaceOptions { + /** + * If true, implicitly assert that all subjects have the requested attribute. + * + * @default true + */ + strict: boolean; + + /** + * @default 'keep' + */ + whitespace: WhitespaceOptions['whitespace']; } } diff --git a/types/generic.d.ts b/types/generic.d.ts new file mode 100644 index 0000000..4ea6c64 --- /dev/null +++ b/types/generic.d.ts @@ -0,0 +1,29 @@ +/// + +declare namespace Cypress { + interface WhitespaceOptions { + /** + * How to handle whitespace in the string. + * + * - 'simplify': Replace all whitespace with a single space. + * - 'keep-newline': Replace all whitespace except for newline characters (`\n`) with a + * single space. + * - 'keep': Don't replace any whitespace. + */ + whitespace: 'simplify' | 'keep-newline' | 'keep'; + } + + /** + * Options that controls if the command can will be retried when it fails. + * + * A command should only be retryable when the command does not retry by default. + */ + interface Retryable { + /** + * Retry the command when it fails + * + * @default false + */ + retry: boolean; + } +} diff --git a/types/index.d.ts b/types/index.d.ts index 1b2c16b..3d6635e 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,3 +1,4 @@ +import './generic'; import './attribute'; import './then'; import './text'; diff --git a/types/text.d.ts b/types/text.d.ts index 0947d12..f728fea 100644 --- a/types/text.d.ts +++ b/types/text.d.ts @@ -1,14 +1,26 @@ +/// + declare namespace Cypress { - interface Chainable { + interface Chainable { /** * Get the text contents of a DOM element. * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/text.md */ - text(options?: { - log?: boolean; - whitespace?: 'simplify' | 'keep-newline' | 'keep'; - depth?: number; - }): Chainable; + text(options?: Partial): Chainable; + } + + interface TextOptions extends Loggable, WhitespaceOptions { + /** + * Include the text contents of child elements upto `n` levels. + * + * @default 0 + */ + depth: number; + + /** + * @default 'simplify' + */ + whitespace: WhitespaceOptions['whitespace']; } } diff --git a/types/then.d.ts b/types/then.d.ts index 9806c1e..865bdb6 100644 --- a/types/then.d.ts +++ b/types/then.d.ts @@ -1,5 +1,7 @@ +/// + declare namespace Cypress { - interface Chainable { + interface Chainable { /** * Enables you to work with the subject yielded from the previous command. * @@ -80,18 +82,4 @@ declare namespace Cypress { options: Partial ): Chainable; } - - /** - * Options that controls if the command can will be retried when it fails. - * - * A command should only be retryable when the command does not retry by default. - */ - interface Retryable { - /** - * Retry the command when it fails - * - * @default false - */ - retry: boolean; - } } diff --git a/types/to.d.ts b/types/to.d.ts index f9140dc..27ef0ae 100644 --- a/types/to.d.ts +++ b/types/to.d.ts @@ -1,5 +1,7 @@ +/// + declare namespace Cypress { - interface Chainable { + interface Chainable { /** * Cast the subject to a given type * @@ -8,11 +10,36 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md */ - to( - type: 'string' | 'number' | 'array', - options?: { - log?: boolean; - } - ): Chainable; + to(type: 'string' | 'number' | 'array', options?: Partial): Chainable; + + /** + * Cast the subject to a given type + * + * - When the subject is an array it will cast all items in the array instead + * - When the subject is already the given type it will do nothing + * + * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md + */ + to(type: 'string', options?: Partial): Chainable; + + /** + * Cast the subject to a given type + * + * - When the subject is an array it will cast all items in the array instead + * - When the subject is already the given type it will do nothing + * + * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md + */ + to(type: 'number', options?: Partial): Chainable; + + /** + * Cast the subject to a given type + * + * - When the subject is an array it will cast all items in the array instead + * - When the subject is already the given type it will do nothing + * + * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md + */ + to(type: 'array', options?: Partial): Chainable; } } From 60165091596ca2a86556d2beb2e8368982a18658 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 13:14:57 +0200 Subject: [PATCH 12/26] Fixed tests that broke due to formatting changes Whitespace handling :) --- cypress/integration/attribute.js | 4 ++-- cypress/integration/text.js | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/cypress/integration/attribute.js b/cypress/integration/attribute.js index 3b7dace..f45c111 100644 --- a/cypress/integration/attribute.js +++ b/cypress/integration/attribute.js @@ -279,7 +279,7 @@ describe('The added command `attribute`', function () { it('`keep` is the default value', function () { cy.get('div.whitespace') .attribute('data-complex') - .should('equal', ' some    \t very\n complex\twhitespace'); + .should('equal', ' some    \t very\n complex\twhitespace'); }); it('`simplify` simplifies all whitespace', function () { @@ -297,7 +297,7 @@ describe('The added command `attribute`', function () { it('`keep` does not change whitespace at all', function () { cy.get('div.whitespace') .attribute('data-complex', { whitespace: 'keep' }) - .should('equal', ' some    \t very\n complex\twhitespace'); + .should('equal', ' some    \t very\n complex\twhitespace'); }); }); }); diff --git a/cypress/integration/text.js b/cypress/integration/text.js index e47a0c8..af93c73 100644 --- a/cypress/integration/text.js +++ b/cypress/integration/text.js @@ -155,11 +155,11 @@ describe('The added command `text`', function () { it('`keep-newline` simplifies all whitespace except newlines', function () { cy.get('div.whitespace') .text({ whitespace: 'keep-newline' }) - .should('equal', 'div\ncontaining some complex whitespace'); + .should('equal', 'div containing some\ncomplex whitespace'); cy.get('div.formatted') .text({ depth: 9, whitespace: 'keep-newline' }) - .should('equal', 'Some text with inline formatting applied to it.'); + .should('equal', 'Some text with inline\nformatting applied to it.'); }); it('`keep` does not change whitespace at all', function () { @@ -167,17 +167,18 @@ describe('The added command `text`', function () { .text({ whitespace: 'keep' }) .should((text) => { const lines = text.split('\n'); + console.log(lines); - expect(lines[0]).to.equal('div'); - expect(lines[1].trim()).to.equal( - 'cont\u200Baining\xa0 \xa0 \t some complex\twhite\u200Bspace' - ); + expect(lines[0]).to.equal('div cont\u200Baining\xa0 \xa0 \t some '); + expect(lines[1]).to.equal(' complex\twhite\u200Bspace'); }); cy.get('div.formatted') .text({ depth: 9, whitespace: 'keep' }) .should((text) => { - expect(text.trim()).to.equal('Some text with inline formatting applied to it.'); + expect(text.trim()).to.equal( + 'Some text with inline\n formatting applied to it.' + ); }); }); }); From 8f4a5c7b6449c61584790c24e6bed049cc5eb725 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 13:26:07 +0200 Subject: [PATCH 13/26] Fixed bundler --- rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rollup.config.js b/rollup.config.js index 34e97a1..75b1bd3 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -42,7 +42,7 @@ const config = [ * have to download the exact same code multiple times, once * in this bundle and also as a dependency of another package. */ - external: [...Object.keys(pkg.dependencies), 'path'], + external: [...Object.keys(pkg.dependencies || {})], }, ]; From e9d8e9236bf9505cc666c88d7469f1f0a6a19f2e Mon Sep 17 00:00:00 2001 From: Lakitna Date: Sat, 4 Sep 2021 13:26:40 +0200 Subject: [PATCH 14/26] Added `path-browserify` to limit config required by users who use TS --- package-lock.json | 13 +++++++++++++ package.json | 3 +++ src/request.js | 2 +- 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 4fb4fde..a569d83 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,9 @@ "": { "version": "2.0.0", "license": "MIT", + "dependencies": { + "path-browserify": "^1.0.1" + }, "devDependencies": { "chai-string": "^1.5.0", "cypress": "^8.3.1", @@ -3210,6 +3213,11 @@ "node": ">=4" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", @@ -6989,6 +6997,11 @@ "json-parse-better-errors": "^1.0.1" } }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", diff --git a/package.json b/package.json index 38ac89c..1210c58 100644 --- a/package.json +++ b/package.json @@ -61,5 +61,8 @@ "start-server-and-test": "^1.14.0", "static-server": "^2.2.1", "typescript": "^4.4.2" + }, + "dependencies": { + "path-browserify": "^1.0.1" } } diff --git a/src/request.js b/src/request.js index ab3d86d..dbdd6a1 100644 --- a/src/request.js +++ b/src/request.js @@ -1,4 +1,4 @@ -import path from 'path'; +import path from 'path-browserify'; const _ = Cypress._; const methods = [ From 1c316282e4b1d7799f310a47806361a09e1d2890 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 13:40:16 +0200 Subject: [PATCH 15/26] Removed redundant eslint override --- .eslintrc.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 596f274..1fd6653 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -43,13 +43,6 @@ module.exports = { ], }, overrides: [ - { - files: ['lib/**/*'], - rules: { - // This is fine as long as you know what you're doing - 'cypress/no-assigning-return-values': 'warn', - }, - }, { files: ['cypress/integration/**/*'], rules: { From 7db3facf6db8f86e85c2c2a2fcc33911e07061a4 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 14:01:13 +0200 Subject: [PATCH 16/26] CI now runs with multiple cypress versions --- .github/workflows/ci.yaml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 7b2da16..dfd841a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -15,8 +15,9 @@ jobs: strategy: matrix: - node-version: [10.x, 12.x, 14.x, 16.x] + node-version: [10.x, 14.x, 16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + cypress-version: [package.json, 8.2, 7, 6, 5] steps: - uses: actions/checkout@v2 @@ -26,12 +27,9 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci + - if: ${{ matrix.cypress-version != package.json }} + run: npm install cypress@${{ matrix.cypress-version }} - run: npm run lint - run: npm run test:source - run: npm run bundle - run: npm run test:bundle -# addons: -# apt: -# packages: -# # Ubuntu 16+ does not install this dependency by default, so we need to install it ourselves -# - libgconf-2-4 From b4571dfda051087083d3a064e6c24082a068e83d Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 14:03:49 +0200 Subject: [PATCH 17/26] CI fix --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index dfd841a..8c9b415 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,7 +27,7 @@ jobs: node-version: ${{ matrix.node-version }} cache: 'npm' - run: npm ci - - if: ${{ matrix.cypress-version != package.json }} + - if: ${{ matrix.cypress-version != 'package.json' }} run: npm install cypress@${{ matrix.cypress-version }} - run: npm run lint - run: npm run test:source From 3f1ac955304597c1f4aa4270eb5460bd0dc49b21 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 14:08:13 +0200 Subject: [PATCH 18/26] CI no longer fails fast --- .github/workflows/ci.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8c9b415..6a00472 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -14,6 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: + fail-fast: false matrix: node-version: [10.x, 14.x, 16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ From 7b2642f723cfb8c9fd8dbae02fc7779fca0c0ca1 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 14:11:21 +0200 Subject: [PATCH 19/26] Reduce amount of Cypress versions in CI --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6a00472..5ea6d34 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: matrix: node-version: [10.x, 14.x, 16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ - cypress-version: [package.json, 8.2, 7, 6, 5] + cypress-version: [package.json, 8.2, 6] steps: - uses: actions/checkout@v2 From 7ff8670af32ee311438b629a6d59ec1a812a58d9 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 14:22:55 +0200 Subject: [PATCH 20/26] Updated docs --- .github/workflows/ci.yaml | 4 +++- README.md | 6 ++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5ea6d34..732c61a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,8 +16,10 @@ jobs: strategy: fail-fast: false matrix: - node-version: [10.x, 14.x, 16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ + node-version: [10.x, 14.x, 16.x] + + # Runs with `package.json` use the version defined in `~/package.lock.json`. cypress-version: [package.json, 8.2, 6] steps: diff --git a/README.md b/README.md index bc5bc31..a0b1c1a 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,11 @@ documentation standards. ## Cypress version -`cypress-commands@2` requires version 8.3.0 or higher. +`cypress-commands` should work with the latest version of Cypress. If this is not the case, please +open an issue. -For previous versions of Cypress, use `cypress-commands@1` instead. +It's tested against multiple versions of Cypress. See the +[CI definition](./.github/workflows/ci.yaml) for the most up-to-date list. ## Installation From e4ea928ff7768968a50495b4acdf7c1295e8cd02 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 14:37:02 +0200 Subject: [PATCH 21/26] Small formatting things in docs --- README.md | 12 +++++++----- docs/attribute.md | 11 +++++++++-- docs/text.md | 13 ++++++++++--- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index a0b1c1a..59348d7 100644 --- a/README.md +++ b/README.md @@ -35,13 +35,15 @@ require('cypress-commands'); ### Type definitions Import typescript definitions by adding them to your `tsconfig.json`. Add the cypress-commands types -before the Cypress types so intellisense will prefer the cypress-commands versions. +before the Cypress types so intellisense will prefer the cypress-commands versions of extended +commands. ```json -"types": [ - "cypress-commands", - "cypress" -] +{ + "compilerOptions": { + "types": ["cypress-commands", "cypress"] + } +} ``` ## Extended commands diff --git a/docs/attribute.md b/docs/attribute.md index 0671324..96ecf92 100644 --- a/docs/attribute.md +++ b/docs/attribute.md @@ -57,6 +57,7 @@ Pass in an options object to change the default behavior of `.attribute()`. ### An alt attribute + ```html Teriffic tiger ``` @@ -68,8 +69,10 @@ cy.get('img').attribute('alt'); ### Multiple subjects + ```html - + + ``` ```javascript @@ -84,6 +87,7 @@ cy.get('input').attribute('type'); By default all whitespace will be kept intact. + ```html
    Amazing armadillo Everlasting eel +Amazing armadillo +Everlasting eel ``` #### Strict mode `true` @@ -163,6 +169,7 @@ cy.get('a').attribute('target', { strict: false }); `.attribute()` considers an empty attribute like below as existing, but empty. + ```html ``` diff --git a/docs/text.md b/docs/text.md index 4397d0b..dec104f 100644 --- a/docs/text.md +++ b/docs/text.md @@ -87,8 +87,10 @@ cy.get('div').text(); By default all whitespace will be simplified. + ```html -
    Extravagant   Eagle
    +
    Extravagant   + Eagle
    ``` #### Simplify whitespace by default @@ -124,14 +126,19 @@ cy.get('div').text({ whitespace: 'keep' }); By default only the text of the subject itself will be yielded. Use this option to also get the text of underlying elements. + ```html
    Grandma Gazelle
    Mother Meerkat -
    Son Scorpion
    +
    + Son Scorpion +
    +
    +
    + Father Fox
    -
    Father Fox
    ``` From 1f4bed8ce873bcd0575302d9720d48118b018288 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 17:56:29 +0200 Subject: [PATCH 22/26] Updated command docs Updated from Cypress docs, improved small things, fixed some small issues --- docs/attribute.md | 20 +++--- docs/request.md | 153 +++++++++++++++++++++++++++++++--------------- docs/text.md | 13 ++-- docs/then.md | 135 ++++++++++++++++++++++++++++------------ docs/to.md | 8 +-- 5 files changed, 222 insertions(+), 107 deletions(-) diff --git a/docs/attribute.md b/docs/attribute.md index 96ecf92..060e7bf 100644 --- a/docs/attribute.md +++ b/docs/attribute.md @@ -7,7 +7,7 @@ This is a command that does not exist as a default command. Enables you to get the value of an elements attributes. > **Note:** When using `.attribute()` you should be aware about how Cypress -> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). +> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability#Only-the-last-command-is-retried). ## Syntax @@ -59,7 +59,7 @@ Pass in an options object to change the default behavior of `.attribute()`. ```html -Teriffic tiger +Teriffic tiger ``` ```javascript @@ -71,8 +71,8 @@ cy.get('img').attribute('alt'); ```html - - + + ``` ```javascript @@ -130,8 +130,8 @@ is enabled. ```html -Amazing armadillo -Everlasting eel +Amazing armadillo +Everlasting eel ``` #### Strict mode `true` @@ -147,16 +147,16 @@ Yields two values because both subjects have the `href` attribute. ```javascript // yields [ -// "#", -// "#" +// "#armadillo", +// "#eel" // ] cy.get('a').attribute('href'); ``` #### Strict mode `false` -Does not throw an error because it is possible to yield a value, even if not all subjects have a -`target` attribute. Any subject that does not have the `target` attribute is simply ignored. +Does not throw an error because it's possible to yield a value, even though not all subjects have a +`target` attribute. Any subject that does not have the `target` attribute is ignored. ```javascript // yields "_blank" diff --git a/docs/request.md b/docs/request.md index c3ac4e7..cd1c908 100644 --- a/docs/request.md +++ b/docs/request.md @@ -1,10 +1,11 @@ # request -This command has been extended with +This command has been extended with: -- `.request()` listens to the global configuration `requestBaseUrl`. [See arguments](#arguments) +- `.request()` uses the global configuration `requestBaseUrl` over `baseUrl`. This allows you to set + a base url for `.request()` that is ignored by `.visit()`. [See arguments](#arguments) -See [original documentation](https://docs.cypress.io/api/commands/request.html) +See [original documentation](https://docs.cypress.io/api/commands/request) --- @@ -40,41 +41,45 @@ which host you want `cy.request()` to use in the url. 1. If you make a `cy.request()` after visiting a page, Cypress assumes the url used for the `cy.visit()` is the host. -```javascript -cy.visit('http://localhost:8080/app'); -cy.request('users/1.json'); // url is http://localhost:8080/users/1.json -``` + ```javascript + cy.visit('http://localhost:8080/app'); + cy.request('users/1.json'); // url is http://localhost:8080/users/1.json + ``` 2. If you make a `cy.request()` prior to visiting a page, Cypress uses the host configured as the `requestBaseUrl` property inside of `cypress.json`. -```javascript -// cypress.json + ```javascript + // cypress.json + { + "requestBaseUrl": "http://localhost:1234" + } + ``` -{ -"requestBaseUrl": "http://localhost:1234" -} -cy.request('seed/admin') // url is http://localhost:1234/seed/admin -``` + ```javascript + cy.request('seed/admin'); // url is http://localhost:1234/seed/admin + ``` -If the `requestBaseUrl` is empty Cypress will use `baseUrl` instead. + If the `requestBaseUrl` is empty Cypress will use `baseUrl` instead. -```javascript -// cypress.json + ```javascript + // cypress.json + { + "requestBaseUrl": "" + "baseUrl": "http://localhost:1234" + } + ``` -{ -"requestBaseUrl": "" -"baseUrl": "http://localhost:1234" -} -cy.request('seed/admin') // url is http://localhost:1234/seed/admin -``` + ```javascript + cy.request('seed/admin'); // url is http://localhost:1234/seed/admin + ``` 3. If Cypress cannot determine the host it will throw an error. **> body** **_(String, Object)_** A request `body` to be sent in the request. Cypress sets the `Accepts` request header and serializes -the response body by its `Content-Type`. +the response body by the encoding option. **> method** **_(String)_** @@ -157,7 +162,7 @@ beforeEach(function () { #### Issue a simple HTTP request -Sometimes it's quicker to simply test the contents of a page rather than +Sometimes it's quicker to test the contents of a page rather than [`cy.visit()`](https://docs.cypress.io/api/commands/visit.html) and wait for the entire page and all of its resources to load. @@ -173,6 +178,18 @@ cy.request('/admin').its('body').should('include', '

    Admin

    '); cy.request('DELETE', 'http://localhost:8888/users/827'); ``` +#### Alias the request using [`.as()`](https://docs.cypress.io/api/commands/as) + +```javascript +cy.request('https://jsonplaceholder.cypress.io/comments').as('comments'); + +cy.get('@comments').should((response) => { + expect(response.body).to.have.length(500); + expect(response).to.have.property('headers'); + expect(response).to.have.property('duration'); +}); +``` + ### Method, URL, and Body #### Send a `POST` request with a JSON body @@ -205,14 +222,48 @@ cy.request({ }); ``` +#### Download a PDF file + +By passing the `encoding: binary` option, the `response.body` will be serialized binary content of +the file. You can use this to access various file types via `.request()` like `.pdf`, `.zip`, or +`.doc` files. + +```javascript +cy.request({ + url: 'http://localhost:8080/some-document.pdf', + encoding: 'binary', +}).then((response) => { + cy.writeFile('path/to/save/document.pdf', response.body, 'binary'); +}); +``` + +#### Get Data URL of an image + +By passing the `encoding: base64` option, the `response.body` will be base64-encoded content of the +image. You can use this to construct a +[Data URI](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs) for use +elsewhere. + +```javascript +cy.request({ + url: 'https://docs.cypress.io/img/logo.png', + encoding: 'base64', +}).then((response) => { + const base64Content = response.body; + const mime = response.headers['content-type']; // or 'image/png' + // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs + const imageDataUrl = `data:${mime};base64,${base64Content}`; +}); +``` + #### HTML form submissions using form option Oftentimes, once you have a proper e2e test around logging in, there's no reason to continue to `cy.visit()` the login and wait for the entire page to load all associated resources before running any other commands. Doing so can slow down our entire test suite. -Using `cy.request()`, we can bypass all of this because it automatically gets and sets cookies just -as if the requests had come from the browser. +Using `cy.request()`, we can bypass all of this because it automatically gets and sets cookies as if +the requests had come from the browser. ```javascript cy.request({ @@ -225,24 +276,24 @@ cy.request({ }, }); -// just to prove we have a session +// to prove we have a session cy.getCookie('cypress-session-cookie').should('exist'); ``` -#### Using cy.request for HTML Forms +#### Using `cy.request()` for HTML Forms -> [Check out our example recipe using `cy.request()` for HTML form submissions](https://docs.cypress.io/examples/examples/recipes.html#HTML-Web-Forms) +> [Check out our example recipe using cy.request() for HTML web forms](https://docs.cypress.io/examples/examples/recipes#Logging-In) ### Request Polling -#### Call `cy.request()` over and over again: +#### Call `cy.request()` over and over again This is useful when you're polling a server for a response that may take awhile to complete. All we're really doing here is creating a recursive function. Nothing more complicated than that. -```js -// just a regular ol' function folks +```javascript +// a regular ol' function folks function req () { cy .request(...) @@ -264,7 +315,6 @@ cy // now start the requests .then(req) - ``` ## Notes @@ -274,7 +324,7 @@ cy #### Request is not displayed in the Network Tab of Developer Tools Cypress does not _actually_ make an XHR request from the browser. We are actually making the HTTP -request from the Cypress Test Runner (in Node.js). So, you won't see the request inside of your +request from the Cypress Test Runner (in Node). So, you won't see the request inside of your Developer Tools. ### Cors @@ -302,9 +352,12 @@ header, these are automatically set back on the browser cookies. In other words, `cy.request()` transparently performs all of the underlying functions as if it came from the browser. -### `cy.request()` cannot be used to debug `cy.server()` and `cy.route()` +### [`cy.intercept()`](https://docs.cypress.io/api/commands/intercept), [`cy.server()`](https://docs.cypress.io/api/commands/server), and [`cy.route()`](https://docs.cypress.io/api/commands/route) + +#### `cy.request()` sends requests to actual endpoints, bypassing those defined using `cy.route()` or `cy.intercept()` -#### `cy.request()` sends requests to actual endpoints, bypassing those defined using `cy.route()` +`cy.server()` and any configuration passed to +[`cy.server()`](https://docs.cypress.io/api/commands/server) has no effect on `cy.request()`. The intention of `cy.request()` is to be used for checking endpoints on an actual, running server without having to start the front end application. @@ -341,24 +394,26 @@ cy.request('https://jsonplaceholder.typicode.com/comments').then((response) => { The commands above will display in the Command Log as: -![Command Log request](https://docs.cypress.io/img/api/request/testing-request-url-and-its-response-body-headers.12ea8bc4.png) +![Command Log request](https://docs.cypress.io/_nuxt/img/testing-request-url-and-its-response-body-headers.765a174.png) When clicking on `request` within the command log, the console outputs the following: -![Console log request](https://docs.cypress.io/img/api/request/console-log-request-response-body-headers-status-url.ec0e58df.png) +![Console log request](https://docs.cypress.io/_nuxt/img/console-log-request-response-body-headers-status-url.de54c8a.png) ## History -|   |   | -| ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 3.2.0 | Added support for any valid HTTP `method` argument including `TRACE`, `COPY`, `LOCK`, `MKCOL`, `MOVE`, `PURGE`, `PROPFIND`, `PROPPATCH`, `UNLOCK`, `REPORT`, `MKACTIVITY`, `CHECKOUT`, `MERGE`, `M-SEARCH`, `NOTIFY`, `SUBSCRIBE`, `UNSUBSCRIBE`, `SEARCH`, and `CONNECT`. | +| Version | Changes | +| ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| 4.7.0 | Added support for `encoding` option. | +| 3.3.0 | Added support for options `retryOnStatusCodeFailure` and `retryOnNetworkFailure`. | +| 3.2.0 | Added support for any valid HTTP `method` argument including `TRACE`, `COPY`, `LOCK`, `MKCOL`, `MOVE`, `PURGE`, `PROPFIND`, `PROPPATCH`, `UNLOCK`, `REPORT`, `MKACTIVITY`, `CHECKOUT`, `MERGE`, `M-SEARCH`, `NOTIFY`, `SUBSCRIBE`, `UNSUBSCRIBE`, `SEARCH`, and `CONNECT`. | ## See also -- [`cy.exec()`](https://docs.cypress.io/api/commands/exec.html) -- [`cy.task()`](https://docs.cypress.io/api/commands/task.html) -- [`cy.visit()`](https://docs.cypress.io/api/commands/visit.html) -- [Recipe: Logging In - Single Sign on](https://docs.cypress.io/examples/examples/recipes.html#Single-Sign-On) -- [Recipe: Logging In - HTML Web Form](https://docs.cypress.io/examples/examples/recipes.html#HTML-Web-Forms) -- [Recipe: Logging In - XHR Web Form](https://docs.cypress.io/examples/examples/recipes.html#XHR-Web-Forms) -- [Recipe: Logging In - CSRF Tokens](https://docs.cypress.io/examples/examples/recipes.html#CSRF-Tokens) +- [`cy.exec()`](https://docs.cypress.io/api/commands/exec) +- [`cy.task()`](https://docs.cypress.io/api/commands/task) +- [`cy.visit()`](https://docs.cypress.io/api/commands/visit) +- [Recipe: Logging In - Single Sign on](https://docs.cypress.io/examples/examples/recipes#Logging-In) +- [Recipe: Logging In - HTML Web Form](https://docs.cypress.io/examples/examples/recipes#Logging-In) +- [Recipe: Logging In - XHR Web Form](https://docs.cypress.io/examples/examples/recipes#Logging-In) +- [Recipe: Logging In - CSRF Tokens](https://docs.cypress.io/examples/examples/recipes#Logging-In) diff --git a/docs/text.md b/docs/text.md index dec104f..b20322a 100644 --- a/docs/text.md +++ b/docs/text.md @@ -9,7 +9,7 @@ Enables you to get the text contents of the subject yielded from the previous co `.text()` allows you to be more specific than you can be with `.contains()` or `.should('contain')`. > **Note:** When using `.text()` you should be aware about how Cypress -> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). +> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability#Only-the-last-command-is-retried). ## Syntax @@ -23,7 +23,7 @@ Enables you to get the text contents of the subject yielded from the previous co ### :heavy_check_mark: Correct Usage ```javascript -cy.get('nav').text(); // Yields the text inside `nav` +cy.get('nav').text(); // Yields the text inside the `nav` element ``` ### :x: Incorrect Usage @@ -57,6 +57,7 @@ Pass in an options object to change the default behavior of `.text()`. #### Get the text of a div + ```html
    Teriffic Tiger
    ``` @@ -68,6 +69,7 @@ cy.get('div').text(); #### Get the text of multiple divs + ```html
    Catastrophic Cat
    Dramatic Dog
    @@ -107,7 +109,7 @@ The default value of `whitespace` is `simplify` so the following yields the same cy.get('div').text({ whitespace: 'simplify' }); ``` -#### Simplify whitespace but keep new line characters +#### Simplify whitespace but keep newline characters ```javascript // yields "Extravagant\nEagle" @@ -121,6 +123,8 @@ cy.get('div').text({ whitespace: 'keep-newline' }); cy.get('div').text({ whitespace: 'keep' }); ``` +Note that the whitespace at the beginning and end of the string is still removed. + ### Depth of elements By default only the text of the subject itself will be yielded. Use this option to also get the text @@ -158,8 +162,7 @@ cy.get('.grandparent').text({ depth: 0 }); #### Include the direct children -The text of the child elements are concatenated and yielded as a single string with a space as -delimiter. +The text of the child elements are concatenated and yielded as a single string. ```javascript // yields "Grandma Gazelle Mother Meerkat Father Fox" diff --git a/docs/then.md b/docs/then.md index 391793a..788a2d5 100644 --- a/docs/then.md +++ b/docs/then.md @@ -1,23 +1,24 @@ # then -This command has been extended with +This command has been extended with: -- The option `retry` -- The option `log` +- The option `retry` which allows you to retry the function passed to `.then()` untill all + assertions pass. +- The option `log` which allows you to output `.then()` to the command log. -See [original documentation](https://docs.cypress.io/api/commands/then.html) +See [original documentation](https://docs.cypress.io/api/commands/then) --- Enables you to work with the subject yielded from the previous command. > **Note:** `.then()` assumes you are already familiar with core concepts such as -> [closures](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Closures). +> [closures](https://docs.cypress.io/guides/core-concepts/variables-and-aliases#Closures). > **Note:** Prefer -> ['`.should()` with callback](https://docs.cypress.io/api/commands/should.html#Function) over -> `.then()` for assertions as they are automatically rerun until no assertions throw within it but -> be aware of [differences](https://docs.cypress.io/api/commands/should.html#Differences). +> ['`.should()` with callback](https://docs.cypress.io/api/commands/should#Function) over `.then()` +> for assertions as they are automatically rerun until no assertions throw within it but be aware of +> [differences](https://docs.cypress.io/api/commands/should#Differences). ## Syntax @@ -44,7 +45,7 @@ Pass in an options object to change the default behavior of `.then()`. | Option | Default | Description | | --------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | | `timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.then()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) | -| `retry` | `false` | Retry itself until assertions you've chained all pass | +| `retry` | `false` | Retry itself until chained assertions pass | | `log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | **> callbackFn** **_(Function)_** @@ -57,6 +58,9 @@ Pass a function that takes the previously yielded subject as its first argument. the callback function becomes the new subject and will flow into the next command (with the exception of `undefined`). +Additionally, the result of the last Cypress command in the callback function will be yielded as the +new subject and flow into the next command if there is no `return`. + When `undefined` is returned by the callback function, the subject will not be modified and will instead carry over to the next command. @@ -67,37 +71,69 @@ commands. ## Examples > We have several more examples in our -> [Core Concepts Guide](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html) -> which go into the various ways you can use `.then()` to store, compare, and debug values. +> [Core Concepts Guide](https://docs.cypress.io/guides/core-concepts/variables-and-aliases) which go +> into the various ways you can use `.then()` to store, compare, and debug values. ### DOM element -#### The element `button` is yielded +#### The `button` element is yielded ```javascript cy.get('button').then(($btn) => { - const cls = $btn.class(); + const cls = $btn.attr('class'); cy.wrap($btn).click().should('not.have.class', cls); }); ``` +#### The number is yielded from previous command + +```javascript +cy.wrap(1) + .then((num) => { + cy.wrap(num).should('equal', 1); // true + }) + .should('equal', 1); // true +``` + ### Change subject -#### The subject is changed by returning +#### The el subject is changed with another command ```javascript -cy.wrap(null) - .then(() => { - return { id: 123 }; +cy.get('button') + .then(($btn) => { + const cls = $btn.attr('class'); + + cy.wrap($btn).click().should('not.have.class', cls).find('i'); + // since there is no explicit return + // the last Cypress command's yield is yielded }) - .then((obj) => { - // subject is now the obj {id: 123} - expect(obj.id).to.eq(123); // true - }); + .should('have.class', 'spin'); // assert on i element ``` -#### Returning `null` or `undefined` will not modify the yielded subject +#### The number subject is changed with another command + +```javascript +cy.wrap(1).then((num) => { + cy.wrap(num)).should('equal', 1) // true + cy.wrap(2) +}).should('equal', 2) // true +``` + +#### The number subject is changed by returning + +```javascript +cy.wrap(1) + .then((num) => { + cy.wrap(num).should('equal', 1); // true + + return 2; + }) + .should('equal', 2); // true +``` + +#### Returning `undefined` will not modify the yielded subject ```javascript cy.get('form') @@ -114,6 +150,18 @@ cy.get('form') }); ``` +### Raw HTMLElements are wrapped with jQuery + +```javascript +cy.get('div') + .then(($div) => { + return $div[0]; // type => HTMLDivElement + }) + .then(($div) => { + $div; // type => JQuery + }); +``` + ### Promises Cypress waits for Promises to resolve before continuing @@ -186,15 +234,15 @@ cy.get('form') ### Differences -What’s the difference between `.then()` and `.should()`/`.and()`? +#### What’s the difference between `.then()` and `.should()`/`.and()`? -Using `.then()` simply allows you to use the yielded subject in a callback function and should be -used when you need to manipulate some values or do some actions. +Using `.then()` allows you to use the yielded subject in a callback function and should be used when +you need to manipulate some values or do some actions. When using a callback function with `.should()`, `.and()` or `.then({ retry: true })`, on the other hand, there is special logic to rerun the callback function until no assertions throw within it. You -should be careful of side affects in a `.should()` or `.and()` callback function that you would not -want performed multiple times. +should be careful of side affects in a `.should()`, `.and()`, or `.then({ retry: true })` callback +function that you would not want performed multiple times. ## Rules @@ -204,27 +252,36 @@ want performed multiple times. ### Assertions -- `.then()` will only run assertions you've chained once, and will not retry (unless you use the - `retry` option). +- `.then()` will only run assertions you've chained once, and will not + [retry](https://docs.cypress.io/guides/core-concepts/retry-ability) (unless you use the + `retry: true` option). ### Timeouts - `.then()` can time out waiting for a promise you've returned to resolve. -- `.then()` can time out waiting for a chained assertion to pass. (when using the `retry` option) +- `.then()` can time out waiting for a chained assertion to pass. (when using the `retry: true` + option) ## Command Log -- `.then()` only logs in the Command Log if +- `.then()` only logs in the Command Log in the following situations: - the option `log` is set to `true` - the option `retry` is set to `true` and the option `log` is not set +## History + +| Version | Changes | +| ------- | ----------------------- | +| 0.14.0 | Added timeout option | +| < 0.3.3 | `.then()` command added | + ## See also -- [`.and()`](https://docs.cypress.io/api/commands/and.html) -- [`.each()`](https://docs.cypress.io/api/commands/each.html) -- [`.invoke()`](https://docs.cypress.io/api/commands/invoke.html) -- [`.its()`](https://docs.cypress.io/api/commands/its.html) -- [`.should()`](https://docs.cypress.io/api/commands/should.html) -- [`.spread()`](https://docs.cypress.io/api/commands/spread.html) -- [Guide: Using Closures to compare values](https://docs.cypress.io/guides/core-concepts/variables-and-aliases.html#Closures) -- [Guide: Chains of Commands](https://docs.cypress.io/guides/core-concepts/introduction-to-cypress.html#Chains-of-Commands) +- [`.and()`](https://docs.cypress.io/api/commands/and) +- [`.each()`](https://docs.cypress.io/api/commands/each) +- [`.invoke()`](https://docs.cypress.io/api/commands/invoke) +- [`.its()`](https://docs.cypress.io/api/commands/its) +- [`.should()`](https://docs.cypress.io/api/commands/should) +- [`.spread()`](https://docs.cypress.io/api/commands/spread) +- [Guide: Using Closures to compare values](https://docs.cypress.io/guides/core-concepts/variables-and-aliases#Closures) +- [Guide: Chains of Commands](https://docs.cypress.io/guides/core-concepts/introduction-to-cypress#Chains-of-Commands) diff --git a/docs/to.md b/docs/to.md index 7f4af0b..4c97499 100644 --- a/docs/to.md +++ b/docs/to.md @@ -7,7 +7,7 @@ This is a command that does not exist as a default command. Cast the subject to another type. Will do nothing if the subject is already of that type. > **Note:** When using `.to()` you should be aware about how Cypress -> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability.html#Only-the-last-command-is-retried). +> [only retries the last command](https://docs.cypress.io/guides/core-concepts/retry-ability#Only-the-last-command-is-retried). ## Syntax @@ -31,7 +31,7 @@ cy.wrap('Underwhelming Uakari').to('array'); // Yields ['Underwhelming Uakari'] ```javascript cy.to('string'); // Errors, cannot be chained off 'cy' -cy.wrap('Dangerous dog').to('number'); // Errors, can't string be casted to number +cy.wrap('Dangerous dog').to('number'); // Errors, string can't be casted to number ``` ## Arguments @@ -47,7 +47,7 @@ Pass in an options object to change the default behavior of `.to()`. | Option | Default | Description | | --------- | ------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------- | | `timeout` | [`defaultCommandTimeout`](https://docs.cypress.io/guides/references/configuration.html#Timeouts) | Time to wait for `.to()` to resolve before [timing out](https://docs.cypress.io/api/commands/then.html#Timeouts) | -| `log` | `false` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | +| `log` | `true` | Displays the command in the [Command log](https://docs.cypress.io/guides/core-concepts/test-runner.html#Command-Log) | ## Yields @@ -61,7 +61,7 @@ Pass in an options object to change the default behavior of `.to()`. ```javascript // yields 42 -cy.wrap('042').to('string'); +cy.wrap('042').to('number'); ``` ### Casting a sring to an array From 3e503fbfe99742e4480f6649919e2b62182b9e50 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 20:24:27 +0200 Subject: [PATCH 23/26] Small doc changes --- docs/attribute.md | 6 ++---- types/generic.d.ts | 2 +- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/attribute.md b/docs/attribute.md index 060e7bf..410cf48 100644 --- a/docs/attribute.md +++ b/docs/attribute.md @@ -89,10 +89,8 @@ By default all whitespace will be kept intact. ```html -
    +
    ``` #### Simplify whitespace diff --git a/types/generic.d.ts b/types/generic.d.ts index 4ea6c64..efec8cf 100644 --- a/types/generic.d.ts +++ b/types/generic.d.ts @@ -20,7 +20,7 @@ declare namespace Cypress { */ interface Retryable { /** - * Retry the command when it fails + * Retry the command when upcoming assertions fail. * * @default false */ From 2cd10c0450657823326d6edf296609a2d258275f Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 20:24:36 +0200 Subject: [PATCH 24/26] Greatly improved types for `.to()` --- types/to.d.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/types/to.d.ts b/types/to.d.ts index 27ef0ae..93a3118 100644 --- a/types/to.d.ts +++ b/types/to.d.ts @@ -10,7 +10,7 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md */ - to(type: 'string' | 'number' | 'array', options?: Partial): Chainable; + to(type: 'string' | 'number' | 'array', options?: Partial): Chainable; /** * Cast the subject to a given type @@ -20,7 +20,10 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md */ - to(type: 'string', options?: Partial): Chainable; + to( + type: 'string', + options?: Partial + ): Chainable; /** * Cast the subject to a given type @@ -30,7 +33,10 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md */ - to(type: 'number', options?: Partial): Chainable; + to( + type: 'number', + options?: Partial + ): Chainable; /** * Cast the subject to a given type @@ -40,6 +46,9 @@ declare namespace Cypress { * * @see https://github.com/Lakitna/cypress-commands/blob/master/docs/to.md */ - to(type: 'array', options?: Partial): Chainable; + to( + type: 'array', + options?: Partial + ): Chainable; } } From 7523a2cf2b8575e3f048d41f92f79c2a7ef21478 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 20:25:14 +0200 Subject: [PATCH 25/26] Fixed bug in `.attribute()`, refactored command in the process --- app/index.html | 2 +- cypress/integration/attribute.js | 15 ++++++++++++ src/attribute.js | 41 +++++++++++++++++++------------- 3 files changed, 40 insertions(+), 18 deletions(-) diff --git a/app/index.html b/app/index.html index 17dfc03..37cbd24 100644 --- a/app/index.html +++ b/app/index.html @@ -53,7 +53,7 @@
    parent div middle -
    +
    second-child div
    second-grand-child div
    diff --git a/cypress/integration/attribute.js b/cypress/integration/attribute.js index f45c111..f1bb964 100644 --- a/cypress/integration/attribute.js +++ b/cypress/integration/attribute.js @@ -159,6 +159,21 @@ describe('The added command `attribute`', function () { .attribute('data-relation', {}); }); + it('throws when only 1 subject has the attribute', function (done) { + cy.on('fail', (err) => { + expect(__logs.length).to.eq(2); + expect(err.message).to.include( + 'Expected all 4 elements to have attribute ' + + `'data-hello', but never found it on 3 elements.` + ); + done(); + }); + + cy.get('.parent > div > div, .parent > div') + // strict: true is default + .attribute('data-hello', {}); + }); + it( 'does not throw when not all subjects have the attribute ' + 'and `strict: false`', function () { diff --git a/src/attribute.js b/src/attribute.js index af79f15..1be4b3c 100644 --- a/src/attribute.js +++ b/src/attribute.js @@ -72,30 +72,36 @@ Cypress.Commands.add( * @return {Promise} */ function resolveAttribute() { - let attr = subject.map((i, element) => { - return $(element).attr(attribute); - }); - - if (attr.length === 1) { - attr = options._whitespace(attr.get(0)); - } else if (attr.length > 1) { + const attr = subject + .map((i, element) => { + return $(element).attr(attribute); + }) // Deconstruct jQuery object to normal array - attr = attr.toArray().map(options._whitespace); - } - - if (options.log) { - updateLog(attr); - } + .toArray() + .map(options._whitespace); let result = attr; - if (options.strict && attr.length && subject.length > attr.length) { - const negate = upcomingAssertionNegatesExistence(); + if (options.strict && subject.length > result.length) { + const negate = upcomingAssertionNegatesExistence(); if (!negate) { - result = $([]); + // Empty result to we fail on missing attributes + result = []; } } + if (result.length === 0) { + // Empty JQuery object is Cypress' way of saying that something does not exist + result = $(); + } else if (result.length === 1) { + // Only one result, so unwrap the array + result = result[0]; + } + + if (options.log) { + updateLog(result); + } + return cy.verifyUpcomingAssertions(result, options, { onFail: (err) => onFail(err, subject, attribute, attr), // Retry untill the upcoming assertion passes @@ -118,10 +124,11 @@ Cypress.Commands.add( * @param {AssertionError} err * @param {jQuery} subject * @param {string} attribute - * @param {jQuery} result + * @param {string | string[]} result */ function onFail(err, subject, attribute, result) { const negate = err.message.includes(' not '); + result = _.isArray(result) ? result : [result]; if (err.type === 'existence' && subject.length == 1) { const errorMessage = errMsg.existence.single; From c8690a44257c7a1097c569c2a7458d7d15ff90e5 Mon Sep 17 00:00:00 2001 From: Lakitna Date: Mon, 13 Sep 2021 20:57:26 +0200 Subject: [PATCH 26/26] Added changelog for v2.0.0 --- CHANGELOG.md | 154 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..70539ab --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,154 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +## 2.0.0 - 2021-09-13 + +### Breaking changes + +#### Whitespace handling for zero-width whitespace in `.text()` and `.attribute()` + +Whitespace handling in `.text()` and `.attribute()` has been changed to no longer consider +zero-width whitespace to be whitespace in modes `{whitespace: 'simplify'}` and +`{whitespace: 'keep-newline'}`. Mode `{whitespace: 'keep'}` has not changed. + + +```html +
    super\u200Bcalifragilistic\u200Bexpialidocious
    +``` + +```javascript +// Old situation +cy.get('div').text().should('equal', 'super califragilistic expialidocious'); +``` + +```javascript +// New situation +cy.get('div').text().should('equal', 'supercalifragilisticexpialidocious'); +``` + +When using `.text()` on elements containing the `` tag: `` is now considered a zero-width +space and will thus be removed with whitespace `simplify` and `keep-newline` as described above. + + +```html +
    supercalifragilisticexpialidocious
    +``` + +```javascript +// Old situation +cy.get('div').text().should('equal', 'super califragilistic expialidocious'); +``` + +```javascript +// New situation +cy.get('div').text().should('equal', 'supercalifragilisticexpialidocious'); +``` + +#### Output order of `.text()` + +When using `.text({ depth: Number })` the order of texts has been changed to better reflect what the +user sees. It will now first traverse all the way to the deepest point, before going sideways. This +will make `.text()` behave much better with inline styling and links. + + +```html +
    + parent div top +
    + child div +
    + parent div middle +
    + second-child div +
    + parent div bottom +
    +``` + +```javascript +// Old situation +// Note how the first part of the string is the various parts of `div.parent` +cy.get('parent') + .text({ depth: 1 }) + .should('equal', 'parent div top parent div middle parent div bottom child div second-child div'); +``` + +```javascript +// New situation +cy.get('div') + .text({ depth: 1 }) + .should('equal', 'parent div top child div parent div middle second-child div parent div bottom'); +``` + +Inline text formatting: + + +```html +
    + Text with some styling and a link. +
    +``` + +```javascript +// Old situation +cy.get('div').text({ depth: 1 }).should('equal', 'Text with styling and . some a link'); +``` + +```javascript +// New situation +cy.get('div').text({ depth: 1 }).should('equal', 'Text with some styling and a link.'); +``` + +#### Stricter types + +Types have been made stricter for `.attribute()`, `text()`, and `.to()`. This is a great improvement +for TypeScript users as it reduces any manual casting. It allows for things like: + +```typescript +cy.get('div') + .text() // yields type 'string | string[]' + .to('array') // yields type 'string[]' + .then((texts: string[]) => ...); +``` + +```typescript +cy.get('div') + .attribute('class') // yields type 'string | string[]' + .to('array') // yields type 'string[]' + .then((texts: string[]) => ...); +``` + +### Fixes + +- Support for Cypress 8.3.0 and above. There was a change in an internal API used for the + `.attribute()` command. This internal API allows us to do some complex stuff with + `{strict: true}`. The fix does not impact versions <= 8.2.0. See #60 for details. + +- `.attribute()` would not work properly in situations where it finds one attribute with a string + length longer than the number of elements. For example: + + + ```html +
    +
    +
    + ``` + + ```javascript + cy.get('div').attribute('data-foo'); // Throws error because `hello`.length > $elements.length + ``` + + This change also prompted some refactoring. + +- Updated docs based on changed made upstream in the Cypress docs. + +- Added config for Prettier/editorconfig and Eslint rules to match them. Reformatted a lot of files + because of this. + +- Moved CI from Travis to Github. Now tests on multiple versions of NodeJS and multiple versions of + Cypress. + +- Updated a lot of dependencies. It was over due. + +- Switched use of `path` to `path-browserify` to reduce config overhead for TypeScript users.