diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000000..9b7b2dd940 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1,26 @@ +# Each line is a file pattern followed by one or more owners. + +# Test Runner team are owners of code within root packages and cli +/cli/ @cypress-io/test-runner +/packages/coffee/ @cypress-io/test-runner +/packages/datetime-utils/ @cypress-io/test-runner +/packages/desktop-gui/ @cypress-io/test-runner +/packages/driver/ @cypress-io/test-runner +/packages/electron/ @cypress-io/test-runner +/packages/example/ @cypress-io/test-runner +/packages/extension/ @cypress-io/test-runner +/packages/https-proxy/ @cypress-io/test-runner +/packages/launcher/ @cypress-io/test-runner +/packages/net-stubbing/ @cypress-io/test-runner +/packages/network/ @cypress-io/test-runner +/packages/proxy/ @cypress-io/test-runner +/packages/reporter/ @cypress-io/test-runner +/packages/rewriter/ @cypress-io/test-runner +/packages/root/ @cypress-io/test-runner +/packages/runner/ @cypress-io/test-runner +/packages/server/ @cypress-io/test-runner +/packages/socket/ @cypress-io/test-runner +/packages/static/ @cypress-io/test-runner +/packages/ts/ @cypress-io/test-runner +/packages/ui-components/ @cypress-io/test-runner +/packages/web-config/ @cypress-io/test-runner \ No newline at end of file diff --git a/.gitignore b/.gitignore index 63ffce2e2a..51c77004f7 100644 --- a/.gitignore +++ b/.gitignore @@ -21,13 +21,17 @@ packages/desktop-gui/src/jsconfig.json packages/driver/cypress/videos packages/driver/cypress/screenshots +# from runner +packages/runner/cypress/videos +packages/runner/cypress/screenshots + # npm packages npm/**/cypress/screenshots # from example packages/example/app packages/example/build -packages/example/cypress +packages/example/cypress/integration # from server packages/server/.cy diff --git a/.node-version b/.node-version index 9cd25a1fec..2a0dc9a810 100644 --- a/.node-version +++ b/.node-version @@ -1 +1 @@ -12.18.3 +14.16.0 diff --git a/appveyor.yml b/appveyor.yml index f75f863183..825cc32c2f 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,14 +2,14 @@ branches: only: - master - develop - - sem-next-ver + - 7.0-release - /win*/ - feature/cross-platform-wizard # https://www.appveyor.com/docs/lang/nodejs-iojs/ environment: # use matching version of Node.js - nodejs_version: "12.18.3" + nodejs_version: "14.16.0" # encode secure variables which will NOT be used # in pull requests # https://www.appveyor.com/docs/build-configuration/#secure-variables @@ -48,7 +48,10 @@ platform: # Install scripts. (runs after repo cloning) install: - - ps: Install-Product node $env:nodejs_version $env:platform + # it is not a given that AppVeyor has the exact version of Node we need predownloaded + # see https://www.appveyor.com/docs/lang/nodejs-iojs/#installing-any-version-of-nodejs-or-iojs + - ps: Update-NodeJsInstallation $env:nodejs_version $env:platform + # - ps: Install-Product node $env:nodejs_version $env:platform # upgrade npm - yarn global add @bahmutov/print-env@1 # Output useful info for debugging. diff --git a/circle.yml b/circle.yml index bc026cd67c..2a35c62653 100644 --- a/circle.yml +++ b/circle.yml @@ -8,7 +8,7 @@ macBuildFilters: &macBuildFilters branches: only: - develop - - fix-next-version + - 7.0-release - include-electron-node-version defaults: &defaults @@ -36,7 +36,7 @@ testBinaryFirefox: &testBinaryFirefox branches: only: - develop - - fix-next-version + - 7.0-release requires: - create-build-artifacts @@ -44,7 +44,7 @@ executors: # the Docker image with Cypress dependencies and Chrome browser cy-doc: docker: - - image: cypress/browsers:node12.18.3-chrome83-ff77 + - image: cypress/browsers:node14.16.0-chrome89-ff77 environment: PLATFORM: linux @@ -58,7 +58,7 @@ executors: # Docker image with non-root "node" user non-root-docker-user: docker: - - image: cypress/browsers:node12.18.3-chrome83-ff77 + - image: cypress/browsers:node14.16.0-chrome89-ff77 user: node environment: PLATFORM: linux @@ -69,7 +69,7 @@ executors: mac: macos: # Executor should have Node >= required version - xcode: "11.3.1" + xcode: "12.2.0" environment: PLATFORM: mac @@ -849,6 +849,8 @@ jobs: - run: yarn test-mocha # test binary build code - run: yarn test-scripts + # check for compile errors with the releaserc scripts + - run: yarn test-npm-package-release-script # make sure our snapshots are compared correctly - run: yarn test-mocha-snapshot # make sure packages with TypeScript can be transpiled to JS @@ -1035,27 +1037,13 @@ jobs: path: /tmp/artifacts - store-npm-logs + desktop-gui-component-tests: <<: *defaults parallelism: 1 steps: - attach_workspace: at: ~/ - - run: - # builds JS and CSS, and we need the app CSS - # to correctly apply component styles - command: | - yarn build-prod - ls -la dist - working_directory: packages/desktop-gui - # for now, because we have baseUrl in cypress.json - # we must start it, even if we don't use it for component tests - # https://github.com/cypress-io/cypress/issues/7800 - - run: - name: Unnecessary Desktop GUI server - command: yarn start - working_directory: packages/desktop-gui - background: true - run: # will use PERCY_TOKEN environment variable if available command: | @@ -1063,7 +1051,7 @@ jobs: PERCY_PARALLEL_NONCE=$CIRCLE_WORKFLOW_ID \ PERCY_PARALLEL_TOTAL=-1 \ yarn percy exec -- \ - yarn cypress:run --spec 'src/**/*_spec.jsx' + yarn cypress:run:ct working_directory: packages/desktop-gui - verify-mocha-results # we don't really need any artifacts - we are only interested in visual screenshots @@ -1176,7 +1164,13 @@ jobs: at: ~/ - run: name: Run tests - command: yarn workspace @cypress/vite-dev-server test + command: yarn test --reporter cypress-circleci-reporter --reporter-options resultsDir=./test_results + working_directory: npm/vite-dev-server + - store_test_results: + path: npm/vite-dev-server/test_results + - store_artifacts: + path: npm/vite-dev-server/cypress/videos + - store-npm-logs npm-rollup-dev-server: <<: *defaults @@ -1206,8 +1200,12 @@ jobs: command: yarn workspace @cypress/vue build - run: name: Run tests - command: yarn test + command: yarn test --reporter cypress-circleci-reporter --reporter-options resultsDir=./test_results working_directory: npm/vue + - store_test_results: + path: npm/vue/test_results + - store_artifacts: + path: npm/vue/test_results - store-npm-logs npm-design-system: @@ -1287,7 +1285,7 @@ jobs: - run: name: Check current branch to persist artifacts command: | - if [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "fix-next-version" ]]; then + if [[ "$CIRCLE_BRANCH" != "develop" && "$CIRCLE_BRANCH" != "7.0-release" ]]; then echo "Not uploading artifacts or posting install comment for this branch." circleci-agent step halt fi @@ -1436,7 +1434,7 @@ jobs: test-npm-module-on-minimum-node-version: <<: *defaults docker: - - image: cypress/base:10.0.0 + - image: cypress/base:12.0.0-libgbm steps: - attach_workspace: at: ~/ @@ -1776,6 +1774,7 @@ linux-workflow: &linux-workflow jobs: - build - lint: + name: Linux lint requires: - build - percy-finalize: @@ -1854,9 +1853,11 @@ linux-workflow: &linux-workflow - npm-webpack-dev-server: requires: - build - - npm-vite-dev-server: - requires: - - build + # TODO: add this back when flake with vite-electron has been resolved + # See branch `fix-branch` + # - npm-vite-dev-server: + # requires: + # - build - npm-rollup-dev-server: requires: - build @@ -1895,13 +1896,12 @@ linux-workflow: &linux-workflow - npm-webpack-batteries-included-preprocessor - npm-webpack-preprocessor - npm-rollup-dev-server - - npm-vite-dev-server + # - npm-vite-dev-server - npm-webpack-dev-server - run-launcher - ui-components-integration-tests - reporter-integration-tests - - lint - - percy-finalize + - Linux lint - desktop-gui-component-tests - desktop-gui-integration-tests-2x - runner-ct-integration-tests-chrome @@ -1927,7 +1927,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - build - test-kitchensink: @@ -1939,7 +1939,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - build - create-build-artifacts: @@ -1989,7 +1989,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - create-build-artifacts - test-npm-module-and-verify-binary: @@ -1997,7 +1997,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - create-build-artifacts - test-binary-against-staging: @@ -2006,7 +2006,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - create-build-artifacts @@ -2032,7 +2032,7 @@ linux-workflow: &linux-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - create-build-artifacts @@ -2095,7 +2095,7 @@ mac-workflow: &mac-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - darwin-create-build-artifacts @@ -2107,7 +2107,7 @@ mac-workflow: &mac-workflow branches: only: - develop - - fix-next-version + - 7.0-release requires: - darwin-create-build-artifacts diff --git a/cli/__snapshots__/cli_spec.js b/cli/__snapshots__/cli_spec.js index c5bdf0d423..475d78d3e2 100644 --- a/cli/__snapshots__/cli_spec.js +++ b/cli/__snapshots__/cli_spec.js @@ -211,8 +211,10 @@ exports['cli help command shows help 1'] = ` Commands: help Shows CLI help and exits version prints Cypress version - run [options] Runs Cypress tests from the CLI without the GUI open [options] Opens Cypress in the interactive GUI. + run [options] Runs Cypress tests from the CLI without the GUI + open-ct [options] Opens Cypress component testing interactive mode. + run-ct [options] Runs all Cypress Component Testing suites install [options] Installs the Cypress executable matching this package's version verify [options] Verifies that Cypress is installed correctly and @@ -247,8 +249,10 @@ exports['cli help command shows help for -h 1'] = ` Commands: help Shows CLI help and exits version prints Cypress version - run [options] Runs Cypress tests from the CLI without the GUI open [options] Opens Cypress in the interactive GUI. + run [options] Runs Cypress tests from the CLI without the GUI + open-ct [options] Opens Cypress component testing interactive mode. + run-ct [options] Runs all Cypress Component Testing suites install [options] Installs the Cypress executable matching this package's version verify [options] Verifies that Cypress is installed correctly and @@ -283,8 +287,10 @@ exports['cli help command shows help for --help 1'] = ` Commands: help Shows CLI help and exits version prints Cypress version - run [options] Runs Cypress tests from the CLI without the GUI open [options] Opens Cypress in the interactive GUI. + run [options] Runs Cypress tests from the CLI without the GUI + open-ct [options] Opens Cypress component testing interactive mode. + run-ct [options] Runs all Cypress Component Testing suites install [options] Installs the Cypress executable matching this package's version verify [options] Verifies that Cypress is installed correctly and @@ -320,8 +326,10 @@ exports['cli unknown command shows usage and exits 1'] = ` Commands: help Shows CLI help and exits version prints Cypress version - run [options] Runs Cypress tests from the CLI without the GUI open [options] Opens Cypress in the interactive GUI. + run [options] Runs Cypress tests from the CLI without the GUI + open-ct [options] Opens Cypress component testing interactive mode. + run-ct [options] Runs all Cypress Component Testing suites install [options] Installs the Cypress executable matching this package's version verify [options] Verifies that Cypress is installed correctly and @@ -443,8 +451,10 @@ exports['cli CYPRESS_INTERNAL_ENV allows and warns when staging environment 1'] Commands: help Shows CLI help and exits version prints Cypress version - run [options] Runs Cypress tests from the CLI without the GUI open [options] Opens Cypress in the interactive GUI. + run [options] Runs Cypress tests from the CLI without the GUI + open-ct [options] Opens Cypress component testing interactive mode. + run-ct [options] Runs all Cypress Component Testing suites install [options] Installs the Cypress executable matching this package's version verify [options] Verifies that Cypress is installed correctly and diff --git a/cli/__snapshots__/spawn_spec.js b/cli/__snapshots__/spawn_spec.js index 6d6052a044..8b1b60f166 100644 --- a/cli/__snapshots__/spawn_spec.js +++ b/cli/__snapshots__/spawn_spec.js @@ -4,8 +4,7 @@ exports['lib/exec/spawn .start forces colors and streams when supported 1'] = { "MOCHA_COLORS": "1", "FORCE_STDIN_TTY": "1", "FORCE_STDOUT_TTY": "1", - "FORCE_STDERR_TTY": "1", - "NODE_OPTIONS": "--max-http-header-size=1048576" + "FORCE_STDERR_TTY": "1" } exports['lib/exec/spawn .start does not force colors and streams when not supported 1'] = { @@ -13,8 +12,7 @@ exports['lib/exec/spawn .start does not force colors and streams when not suppor "DEBUG_COLORS": "0", "FORCE_STDIN_TTY": "0", "FORCE_STDOUT_TTY": "0", - "FORCE_STDERR_TTY": "0", - "NODE_OPTIONS": "--max-http-header-size=1048576" + "FORCE_STDERR_TTY": "0" } exports['lib/exec/spawn .start detects kill signal exits with error on SIGKILL 1'] = ` diff --git a/cli/lib/cli.js b/cli/lib/cli.js index d732a69723..368561082c 100644 --- a/cli/lib/cli.js +++ b/cli/lib/cli.js @@ -137,8 +137,8 @@ const knownCommands = [ '--help', 'install', 'open', - 'open-ct', 'run', + 'open-ct', 'run-ct', 'verify', '-v', @@ -380,6 +380,26 @@ module.exports = { showVersions(args) }) + program + .command('open') + .usage('[options]') + .description('Opens Cypress in the interactive GUI.') + .option('-b, --browser ', text('browserOpenMode')) + .option('-c, --config ', text('config')) + .option('-C, --config-file ', text('configFile')) + .option('-d, --detached [bool]', text('detached'), coerceFalse) + .option('-e, --env ', text('env')) + .option('--global', text('global')) + .option('-p, --port ', text('port')) + .option('-P, --project ', text('project')) + .option('--dev', text('dev'), coerceFalse) + .action((opts) => { + debug('opening Cypress') + require('./exec/open') + .start(util.parseOpts(opts)) + .catch(util.logErrorExit1) + }) + addCypressRunCommand(program) .action((...fnArgs) => { debug('running Cypress with args %o', fnArgs) @@ -390,8 +410,7 @@ module.exports = { }) program - // TODO make this command public once CT will be merged completely - .command('open-ct', { hidden: true }) + .command('open-ct') .usage('[options]') .description('Opens Cypress component testing interactive mode.') .option('-b, --browser ', text('browserOpenMode')) @@ -411,8 +430,7 @@ module.exports = { }) program - // TODO make this command public once CT will be merged completely - .command('run-ct', { hidden: true }) + .command('run-ct') .usage('[options]') .description('Runs all Cypress Component Testing suites') .option('-b, --browser ', text('browserRunMode')) @@ -443,26 +461,6 @@ module.exports = { .catch(util.logErrorExit1) }) - program - .command('open') - .usage('[options]') - .description('Opens Cypress in the interactive GUI.') - .option('-b, --browser ', text('browserOpenMode')) - .option('-c, --config ', text('config')) - .option('-C, --config-file ', text('configFile')) - .option('-d, --detached [bool]', text('detached'), coerceFalse) - .option('-e, --env ', text('env')) - .option('--global', text('global')) - .option('-p, --port ', text('port')) - .option('-P, --project ', text('project')) - .option('--dev', text('dev'), coerceFalse) - .action((opts) => { - debug('opening Cypress') - require('./exec/open') - .start(util.parseOpts(opts)) - .catch(util.logErrorExit1) - }) - program .command('install') .usage('[options]') diff --git a/cli/lib/exec/open.js b/cli/lib/exec/open.js index b95e5732d3..78656854f1 100644 --- a/cli/lib/exec/open.js +++ b/cli/lib/exec/open.js @@ -36,7 +36,7 @@ module.exports = { } if (isComponentTesting) { - args.push('--componentTesting') + args.push('--testing-type', 'component') } debug('opening from options %j', options) diff --git a/cli/lib/exec/run.js b/cli/lib/exec/run.js index a1696166cd..dd8e0fbdfb 100644 --- a/cli/lib/exec/run.js +++ b/cli/lib/exec/run.js @@ -184,7 +184,7 @@ module.exports = { } if (isComponentTesting) { - args.push('--componentTesting') + args.push('--testing-type', 'component') } debug('run to spawn.start args %j', args) diff --git a/cli/lib/util.js b/cli/lib/util.js index a16ebabc6d..a0ceaadc98 100644 --- a/cli/lib/util.js +++ b/cli/lib/util.js @@ -197,7 +197,6 @@ const parseOpts = (opts) => { 'cacheClear', 'cachePrune', 'ciBuildId', - 'componentTesting', 'config', 'configFile', 'cypressVersion', @@ -281,35 +280,9 @@ const util = { .mapValues((value) => { // stringify to 1 or 0 return value ? '1' : '0' }) - .extend(util.getNodeOptions(options)) .value() }, - getNodeOptions (options, nodeVersion) { - if (!nodeVersion) { - nodeVersion = Number(process.versions.node.split('.')[0]) - } - - if (options.dev && nodeVersion < 12) { - // `node` is used instead of Electron when --dev is passed, so this won't work if Node is too old - debug('NODE_OPTIONS=--max-http-header-size could not be set because we\'re in dev mode and Node is < 12.0.0') - - return - } - - // https://github.com/cypress-io/cypress/issues/5431 - const NODE_OPTIONS = `--max-http-header-size=${1024 ** 2}` - - if (_.isString(process.env.NODE_OPTIONS)) { - return { - NODE_OPTIONS: `${NODE_OPTIONS} ${process.env.NODE_OPTIONS}`, - ORIGINAL_NODE_OPTIONS: process.env.NODE_OPTIONS || '', - } - } - - return { NODE_OPTIONS } - }, - getForceTty () { return { FORCE_STDIN_TTY: util.isTty(process.stdin.fd), diff --git a/cli/package.json b/cli/package.json index d9f4c5be27..5c04bdd9a9 100644 --- a/cli/package.json +++ b/cli/package.json @@ -13,7 +13,7 @@ "size": "t=\"cypress-v0.0.0.tgz\"; yarn pack --filename \"${t}\"; wc -c \"${t}\"; tar tvf \"${t}\"; rm \"${t}\";", "test": "yarn test-unit", "test-debug": "node --inspect-brk $(yarn bin mocha)", - "test-dependencies": "dependency-check . --no-dev", + "test-dependencies": "dependency-check . --missing --no-dev --verbose", "test-unit": "yarn unit", "test-watch": "yarn unit --watch", "types": "yarn dtslint", @@ -23,11 +23,11 @@ "@cypress/listr-verbose-renderer": "^0.4.1", "@cypress/request": "^2.88.5", "@cypress/xvfb": "^1.2.4", - "@types/node": "12.12.50", - "@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", @@ -35,66 +35,65 @@ "cli-table3": "~0.6.0", "commander": "^5.1.0", "common-tags": "^1.8.0", - "dayjs": "^1.9.3", + "dayjs": "^1.10.4", "debug": "4.3.2", - "eventemitter2": "^6.4.2", - "execa": "^4.0.2", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", "executable": "^4.1.1", "extract-zip": "^1.7.0", - "fs-extra": "^9.0.1", + "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", + "lodash": "^4.17.21", "log-symbols": "^4.0.0", "minimist": "^1.2.5", - "moment": "^2.29.1", "ospath": "^1.2.2", - "pretty-bytes": "^5.4.1", + "pretty-bytes": "^5.6.0", "ramda": "~0.27.1", "request-progress": "^3.0.0", - "supports-color": "^7.2.0", + "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", "url": "^0.11.0", "yauzl": "^2.10.0" }, "devDependencies": { - "@babel/cli": "7.8.4", - "@babel/preset-env": "7.9.5", + "@babel/cli": "7.13.0", + "@babel/preset-env": "7.13.5", "@cypress/sinon-chai": "2.9.1", "@packages/root": "0.0.0-development", - "@types/bluebird": "3.5.29", - "@types/chai": "4.2.7", + "@types/bluebird": "3.5.33", + "@types/chai": "4.2.15", "@types/chai-jquery": "1.1.40", "@types/jquery": "3.3.31", - "@types/lodash": "4.14.149", + "@types/lodash": "4.14.168", "@types/minimatch": "3.0.3", "@types/mocha": "5.2.7", "@types/sinon": "7.5.1", - "@types/sinon-chai": "3.2.3", + "@types/sinon-chai": "3.2.5", "chai": "3.5.0", "chai-as-promised": "7.1.1", "chai-string": "1.5.0", - "cross-env": "6.0.3", - "dependency-check": "3.4.1", - "dtslint": "0.9.0", + "cross-env": "7.0.3", + "dependency-check": "4.1.0", + "dtslint": "4.0.7", "execa-wrap": "1.4.0", - "hasha": "5.0.0", + "hasha": "5.2.2", "mocha": "6.2.2", - "mock-fs": "4.12.0", - "mocked-env": "1.2.4", - "nock": "12.0.2", - "postinstall-postinstall": "2.0.0", + "mock-fs": "4.13.0", + "mocked-env": "1.3.2", + "nock": "13.0.7", + "postinstall-postinstall": "2.1.0", "proxyquire": "2.1.3", "resolve-pkg": "2.0.0", - "shelljs": "0.8.3", + "shelljs": "0.8.4", "sinon": "7.2.2", - "snap-shot-it": "7.9.3", + "snap-shot-it": "7.9.6", "spawn-mock": "1.0.0", - "strip-ansi": "4.0.0" + "strip-ansi": "6.0.0" }, "files": [ "bin", @@ -107,7 +106,7 @@ "cypress": "bin/cypress" }, "engines": { - "node": ">=10.0.0" + "node": ">=12.0.0" }, "types": "types" } diff --git a/cli/schema/cypress.schema.json b/cli/schema/cypress.schema.json index 7099b4b626..2e22178c55 100644 --- a/cli/schema/cypress.schema.json +++ b/cli/schema/cypress.schema.json @@ -2,280 +2,296 @@ "title": "JSON schema for the https://cypress.io Test Runner's configuration file. Details at https://on.cypress.io/configuration", "$schema": "http://json-schema.org/draft-04/schema#", "type": "object", - "properties": { - "baseUrl": { - "type": "string", - "description": "Url used as prefix for cy.visit() or cy.request() command’s url. Example http://localhost:3030 or https://test.my-domain.com" - }, - "env": { - "type": "object", - "description": "Any values to be set as environment variables. See https://on.cypress.io/environment-variables", - "body": {} - }, - "ignoreTestFiles": { - "type": [ - "string", - "array" - ], - "items": { - "type": "string" - }, - "description": "A String or Array of glob patterns used to ignore test files that would otherwise be shown in your list of tests. Cypress uses minimatch with the options: {dot: true, matchBase: true}. We suggest using http://globtester.com to test what files would match." - }, - "numTestsKeptInMemory": { - "type": "number", - "default": 50, - "description": "The number of tests for which snapshots and command data are kept in memory. Reduce this number if you are experiencing high memory consumption in your browser during a test run." - }, - "port": { - "type": "number", - "default": null, - "description": "Port used to host Cypress. Normally this is a randomly generated port" - }, - "reporter": { - "type": "string", - "default": "spec", - "description": "The reporter used when running headlessly or in CI. See https://on.cypress.io/reporters" - }, - "reporterOptions": { - "type": "object", - "default": null, - "description": "The reporter options used. Supported options depend on the reporter. See https://on.cypress.io/reporters#Reporter-Options" - }, - "testFiles": { - "type": [ - "string", - "array" - ], - "default": "**/*.*", - "description": "A String or Array of string glob patterns of the test files to load. See https://on.cypress.io/configuration#Global" - }, - "watchForFileChanges": { - "type": "boolean", - "default": true, - "description": "Whether Cypress will watch and restart tests on test file changes" - }, - "defaultCommandTimeout": { - "type": "number", - "default": 4000, - "description": "Time, in milliseconds, to wait until most DOM based commands are considered timed out" - }, - "execTimeout": { - "type": "number", - "default": 60000, - "description": "Time, in milliseconds, to wait for a system command to finish executing during a cy.exec() command" - }, - "taskTimeout": { - "type": "number", - "default": 60000, - "description": "Time, in milliseconds, to wait for a task to finish executing during a cy.task() command" - }, - "pageLoadTimeout": { - "type": "number", - "default": 60000, - "description": "Time, in milliseconds, to wait for page transition events or cy.visit(), cy.go(), cy.reload() commands to fire their page load events. Network requests are limited by the underlying operating system, and may still time out if this value is increased." - }, - "requestTimeout": { - "type": "number", - "default": 5000, - "description": "Time, in milliseconds, to wait for an XHR request to go out in a cy.wait() command" - }, - "responseTimeout": { - "type": "number", - "default": 30000, - "description": "Time, in milliseconds, to wait until a response in a cy.request(), cy.wait(), cy.fixture(), cy.getCookie(), cy.getCookies(), cy.setCookie(), cy.clearCookie(), cy.clearCookies(), and cy.screenshot() commands" - }, - "fileServerFolder": { - "type": "string", - "default": "root project folder", - "description": "Path to folder where application files will attempt to be served from" - }, - "fixturesFolder": { - "type": [ - "string", - "boolean" - ], - "default": "cypress/fixtures", - "description": "Path to folder containing fixture files (Pass false to disable)" - }, - "integrationFolder": { - "type": "string", - "default": "cypress/integration", - "description": "Path to folder containing integration test files" - }, - "downloadsFolder": { - "type": "string", - "default": "cypress/downloads", - "description": "Path to folder where files downloaded during a test are saved" - }, - "experimentalComponentTesting": { - "type": "boolean", - "default": false, - "description": "Enabled experimental component testing, see https://github.com/cypress-io/cypress/issues/5922" - }, - "componentFolder": { - "type": [ - "string", - "boolean" - ], - "default": false, - "description": "Path to folder containing component test files (Pass false to disable)" - }, - "pluginsFile": { - "type": [ - "string", - "boolean" - ], - "default": "cypress/plugins/index.js", - "description": "Path to plugins file. (Pass false to disable)" - }, - "screenshotOnRunFailure": { - "type": "boolean", - "default": true, - "description": "Whether Cypress will take a screenshot when a test fails during cypress run" - }, - "screenshotsFolder": { - "type": "string", - "default": "cypress/screenshots", - "description": "Path to folder where screenshots will be saved from cy.screenshot() command or after a test fails during cypress run" - }, - "supportFile": { - "type": [ - "string", - "boolean" - ], - "default": "cypress/support/index.js", - "description": "Path to file to load before test files load. This file is compiled and bundled. (Pass false to disable)" - }, - "videosFolder": { - "type": "string", - "default": "cypress/videos", - "description": "Path to folder where videos will be saved during cypress run" - }, - "trashAssetsBeforeRuns": { - "type": "boolean", - "default": true, - "description": "Whether Cypress will trash assets within the screenshotsFolder and videosFolder before tests run with cypress run" - }, - "videoCompression": { - "type": [ - "number", - "boolean" - ], - "default": 32, - "description": "The quality setting for the video compression, in Constant Rate Factor (CRF). The value can be false to disable compression or a value between 0 and 51, where a lower value results in better quality (at the expense of a higher file size)." - }, - "video": { - "type": "boolean", - "default": true, - "description": "Whether Cypress will capture a video of the tests run with cypress run" - }, - "videoUploadOnPasses": { - "type": "boolean", - "default": true, - "description": "Whether Cypress will process, compress, and upload videos to the Dashboard even when all tests in a spec file are passing. This only applies when recording your runs to the Dashboard. Turn this off if you’d like to only upload the spec file’s video when there are failing tests." - }, - "chromeWebSecurity": { - "type": "boolean", - "default": true, - "description": "Whether Chrome Web Security for same-origin policy and insecure mixed content is enabled. Read more about this at https://on.cypress.io/web-security" - }, - "userAgent": { - "type": "string", - "default": null, - "description": "Enables you to override the default user agent the browser sends in all request headers. User agent values are typically used by servers to help identify the operating system, browser, and browser version. See User-Agent MDN Documentation for example user agent values here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent" - }, - "blockHosts": { - "type": [ - "string", - "array" - ], - "items": { - "type": "string" - }, - "default": null, - "description": "A String or Array of hosts that you wish to block traffic for. Please read the notes for examples on using this https://on.cypress.io/configuration#blockHosts" - }, - "modifyObstructiveCode": { - "type": "boolean", - "default": true, - "description": "Whether Cypress will search for and replace obstructive JS code found in .js or .html files that prevent Cypress from working. Please read the notes for more information on this setting. https://on.cypress.io/configuration#modifyObstructiveCode" - }, - "viewportHeight": { - "type": "number", - "default": 660, - "description": "Default height in pixels for the application under tests’ viewport (Override with cy.viewport() command)" - }, - "viewportWidth": { - "type": "number", - "default": 1000, - "description": "Default width in pixels for the application under tests’ viewport. (Override with cy.viewport() command)" - }, - "animationDistanceThreshold": { - "type": "number", - "default": 5, - "description": "The distance in pixels an element must exceed over time to be considered animating" - }, - "waitForAnimations": { - "type": "boolean", - "default": true, - "description": "Whether to wait for elements to finish animating before executing commands" - }, - "scrollBehavior": { - "enum": [ - false, - "center", - "top", - "bottom", - "nearest" - ], - "default": "top", - "description": "Viewport position to which an element should be scrolled prior to action commands. Setting `false` disables scrolling." - }, - "projectId": { - "type": "string", - "default": null, - "description": "A 6 character string use to identify this project in the Cypress Dashboard. See https://on.cypress.io/dashboard-service#Identification" - }, - "nodeVersion": { - "enum": [ - "system", - "bundled" - ], - "default": "bundled", - "description": "If set to 'system', Cypress will try to find a Node.js executable on your path to use when executing your plugins. Otherwise, Cypress will use the Node version bundled with Cypress." - }, - "experimentalSourceRewriting": { - "type": "boolean", - "default": false, - "description": "Enables AST-based JS/HTML rewriting. This may fix issues caused by the existing regex-based JS/HTML replacement algorithm." - }, - "experimentalFetchPolyfill": { - "type": "boolean", - "default": false, - "description": "Polyfills `window.fetch` to enable Network spying and stubbing" - }, - "experimentalStudio": { - "type": "boolean", - "default": false, - "description": "Generate and save commands directly to your test suite by interacting with your app as an end user would." - }, - "retries": { - "type": [ - "object", - "number", - "null" - ], - "default": { - "runMode": 0, - "openMode": 0 - }, - "description": "The number of times to retry a failing. Can be configured to apply only in runMode or openMode" - }, - "includeShadowDom": { - "type": "boolean", - "default": false, - "description": "Enables including elements within the shadow DOM when using querying commands (e.g. cy.get(), cy.find()). Can be set globally in cypress.json, per-suite or per-test in the test configuration object, or programmatically with Cypress.config()" + "definitions": { + "cypressConfig": { + "properties": { + "baseUrl": { + "type": "string", + "description": "Url used as prefix for cy.visit() or cy.request() command’s url. Example http://localhost:3030 or https://test.my-domain.com" + }, + "env": { + "type": "object", + "description": "Any values to be set as environment variables. See https://on.cypress.io/environment-variables", + "body": {} + }, + "ignoreTestFiles": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + }, + "description": "A String or Array of glob patterns used to ignore test files that would otherwise be shown in your list of tests. Cypress uses minimatch with the options: {dot: true, matchBase: true}. We suggest using http://globtester.com to test what files would match." + }, + "numTestsKeptInMemory": { + "type": "number", + "default": 50, + "description": "The number of tests for which snapshots and command data are kept in memory. Reduce this number if you are experiencing high memory consumption in your browser during a test run." + }, + "port": { + "type": "number", + "default": null, + "description": "Port used to host Cypress. Normally this is a randomly generated port" + }, + "reporter": { + "type": "string", + "default": "spec", + "description": "The reporter used when running headlessly or in CI. See https://on.cypress.io/reporters" + }, + "reporterOptions": { + "type": "object", + "default": null, + "description": "The reporter options used. Supported options depend on the reporter. See https://on.cypress.io/reporters#Reporter-Options" + }, + "testFiles": { + "type": [ + "string", + "array" + ], + "default": "**/*.*", + "description": "A String or Array of string glob patterns of the test files to load. See https://on.cypress.io/configuration#Global" + }, + "watchForFileChanges": { + "type": "boolean", + "default": true, + "description": "Whether Cypress will watch and restart tests on test file changes" + }, + "defaultCommandTimeout": { + "type": "number", + "default": 4000, + "description": "Time, in milliseconds, to wait until most DOM based commands are considered timed out" + }, + "execTimeout": { + "type": "number", + "default": 60000, + "description": "Time, in milliseconds, to wait for a system command to finish executing during a cy.exec() command" + }, + "taskTimeout": { + "type": "number", + "default": 60000, + "description": "Time, in milliseconds, to wait for a task to finish executing during a cy.task() command" + }, + "pageLoadTimeout": { + "type": "number", + "default": 60000, + "description": "Time, in milliseconds, to wait for page transition events or cy.visit(), cy.go(), cy.reload() commands to fire their page load events. Network requests are limited by the underlying operating system, and may still time out if this value is increased." + }, + "requestTimeout": { + "type": "number", + "default": 5000, + "description": "Time, in milliseconds, to wait for an XHR request to go out in a cy.wait() command" + }, + "responseTimeout": { + "type": "number", + "default": 30000, + "description": "Time, in milliseconds, to wait until a response in a cy.request(), cy.wait(), cy.fixture(), cy.getCookie(), cy.getCookies(), cy.setCookie(), cy.clearCookie(), cy.clearCookies(), and cy.screenshot() commands" + }, + "fileServerFolder": { + "type": "string", + "default": "root project folder", + "description": "Path to folder where application files will attempt to be served from" + }, + "fixturesFolder": { + "type": [ + "string", + "boolean" + ], + "default": "cypress/fixtures", + "description": "Path to folder containing fixture files (Pass false to disable)" + }, + "integrationFolder": { + "type": "string", + "default": "cypress/integration", + "description": "Path to folder containing integration test files" + }, + "downloadsFolder": { + "type": "string", + "default": "cypress/downloads", + "description": "Path to folder where files downloaded during a test are saved" + }, + "componentFolder": { + "type": [ + "string", + "boolean" + ], + "default": false, + "description": "Path to folder containing component test files (Pass false to disable)" + }, + "pluginsFile": { + "type": [ + "string", + "boolean" + ], + "default": "cypress/plugins/index.js", + "description": "Path to plugins file. (Pass false to disable)" + }, + "screenshotOnRunFailure": { + "type": "boolean", + "default": true, + "description": "Whether Cypress will take a screenshot when a test fails during cypress run" + }, + "screenshotsFolder": { + "type": "string", + "default": "cypress/screenshots", + "description": "Path to folder where screenshots will be saved from cy.screenshot() command or after a test fails during cypress run" + }, + "supportFile": { + "type": [ + "string", + "boolean" + ], + "default": "cypress/support/index.js", + "description": "Path to file to load before test files load. This file is compiled and bundled. (Pass false to disable)" + }, + "videosFolder": { + "type": "string", + "default": "cypress/videos", + "description": "Path to folder where videos will be saved during cypress run" + }, + "trashAssetsBeforeRuns": { + "type": "boolean", + "default": true, + "description": "Whether Cypress will trash assets within the screenshotsFolder and videosFolder before tests run with cypress run" + }, + "videoCompression": { + "type": [ + "number", + "boolean" + ], + "default": 32, + "description": "The quality setting for the video compression, in Constant Rate Factor (CRF). The value can be false to disable compression or a value between 0 and 51, where a lower value results in better quality (at the expense of a higher file size)." + }, + "video": { + "type": "boolean", + "default": true, + "description": "Whether Cypress will capture a video of the tests run with cypress run" + }, + "videoUploadOnPasses": { + "type": "boolean", + "default": true, + "description": "Whether Cypress will process, compress, and upload videos to the Dashboard even when all tests in a spec file are passing. This only applies when recording your runs to the Dashboard. Turn this off if you’d like to only upload the spec file’s video when there are failing tests." + }, + "chromeWebSecurity": { + "type": "boolean", + "default": true, + "description": "Whether Chrome Web Security for same-origin policy and insecure mixed content is enabled. Read more about this at https://on.cypress.io/web-security" + }, + "userAgent": { + "type": "string", + "default": null, + "description": "Enables you to override the default user agent the browser sends in all request headers. User agent values are typically used by servers to help identify the operating system, browser, and browser version. See User-Agent MDN Documentation for example user agent values here: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent" + }, + "blockHosts": { + "type": [ + "string", + "array" + ], + "items": { + "type": "string" + }, + "default": null, + "description": "A String or Array of hosts that you wish to block traffic for. Please read the notes for examples on using this https://on.cypress.io/configuration#blockHosts" + }, + "modifyObstructiveCode": { + "type": "boolean", + "default": true, + "description": "Whether Cypress will search for and replace obstructive JS code found in .js or .html files that prevent Cypress from working. Please read the notes for more information on this setting. https://on.cypress.io/configuration#modifyObstructiveCode" + }, + "viewportHeight": { + "type": "number", + "default": 660, + "description": "Default height in pixels for the application under tests’ viewport (Override with cy.viewport() command)" + }, + "viewportWidth": { + "type": "number", + "default": 1000, + "description": "Default width in pixels for the application under tests’ viewport. (Override with cy.viewport() command)" + }, + "animationDistanceThreshold": { + "type": "number", + "default": 5, + "description": "The distance in pixels an element must exceed over time to be considered animating" + }, + "waitForAnimations": { + "type": "boolean", + "default": true, + "description": "Whether to wait for elements to finish animating before executing commands" + }, + "scrollBehavior": { + "enum": [ + false, + "center", + "top", + "bottom", + "nearest" + ], + "default": "top", + "description": "Viewport position to which an element should be scrolled prior to action commands. Setting `false` disables scrolling." + }, + "projectId": { + "type": "string", + "default": null, + "description": "A 6 character string use to identify this project in the Cypress Dashboard. See https://on.cypress.io/dashboard-service#Identification" + }, + "nodeVersion": { + "enum": [ + "system", + "bundled" + ], + "default": "bundled", + "description": "If set to 'system', Cypress will try to find a Node.js executable on your path to use when executing your plugins. Otherwise, Cypress will use the Node version bundled with Cypress." + }, + "experimentalSourceRewriting": { + "type": "boolean", + "default": false, + "description": "Enables AST-based JS/HTML rewriting. This may fix issues caused by the existing regex-based JS/HTML replacement algorithm." + }, + "experimentalFetchPolyfill": { + "type": "boolean", + "default": false, + "description": "Polyfills `window.fetch` to enable Network spying and stubbing" + }, + "experimentalStudio": { + "type": "boolean", + "default": false, + "description": "Generate and save commands directly to your test suite by interacting with your app as an end user would." + }, + "retries": { + "type": [ + "object", + "number", + "null" + ], + "default": { + "runMode": 0, + "openMode": 0 + }, + "description": "The number of times to retry a failing. Can be configured to apply only in runMode or openMode" + }, + "includeShadowDom": { + "type": "boolean", + "default": false, + "description": "Enables including elements within the shadow DOM when using querying commands (e.g. cy.get(), cy.find()). Can be set globally in cypress.json, per-suite or per-test in the test configuration object, or programmatically with Cypress.config()" + } + } } - } + }, + "allOf": [ + { + "$ref": "#/definitions/cypressConfig" + }, + { + "properties": { + "component": { + "description": "Any component runner specific overrides", + "$ref": "#/definitions/cypressConfig" + }, + "e2e": { + "description": "Any e2e runner specific overrides", + "$ref": "#/definitions/cypressConfig" + } + } + } + ] } diff --git a/cli/test/lib/cli_spec.js b/cli/test/lib/cli_spec.js index 46ba519627..8821612e16 100644 --- a/cli/test/lib/cli_spec.js +++ b/cli/test/lib/cli_spec.js @@ -630,23 +630,25 @@ describe('cli', () => { it('spawns server with correct args for component-testing', () => { this.exec('open-ct --dev') - expect(spawn.start.firstCall.args[0]).to.include('--componentTesting') + expect(spawn.start.firstCall.args[0]).to.include('--testing-type') + expect(spawn.start.firstCall.args[0]).to.include('component') }) it('runs server with correct args for component-testing', () => { this.exec('run-ct --dev') - expect(spawn.start.firstCall.args[0]).to.include('--componentTesting') + expect(spawn.start.firstCall.args[0]).to.include('--testing-type') + expect(spawn.start.firstCall.args[0]).to.include('component') }) - it('does not display open-ct command in the help', () => { + it('does display open-ct command in the help', () => { return execa('bin/cypress', ['help']).then((result) => { - expect(result).to.not.include('open-ct') + expect(result).to.include('open-ct') }) }) - it('does not display run-ct command in the help', () => { + it('does display run-ct command in the help', () => { return execa('bin/cypress', ['help']).then((result) => { - expect(result).to.not.include('run-ct') + expect(result).to.include('run-ct') }) }) }) diff --git a/cli/test/lib/util_spec.js b/cli/test/lib/util_spec.js index 580e206fef..52b83ef961 100644 --- a/cli/test/lib/util_spec.js +++ b/cli/test/lib/util_spec.js @@ -3,7 +3,6 @@ require('../spec_helper') const os = require('os') const tty = require('tty') const snapshot = require('../support/snapshot') -const mockedEnv = require('mocked-env') const supportsColor = require('supports-color') const proxyquire = require('proxyquire') const hasha = require('hasha') @@ -12,9 +11,6 @@ const la = require('lazy-ass') const util = require(`${lib}/util`) const logger = require(`${lib}/logger`) -// https://github.com/cypress-io/cypress/issues/5431 -const expectedNodeOptions = `--max-http-header-size=${1024 * 1024}` - describe('util', () => { beforeEach(() => { sinon.stub(process, 'exit') @@ -217,7 +213,6 @@ describe('util', () => { FORCE_COLOR: '1', DEBUG_COLORS: '1', MOCHA_COLORS: '1', - NODE_OPTIONS: expectedNodeOptions, }) util.supportsColor.returns(false) @@ -229,49 +224,10 @@ describe('util', () => { FORCE_STDERR_TTY: '0', FORCE_COLOR: '0', DEBUG_COLORS: '0', - NODE_OPTIONS: expectedNodeOptions, }) }) }) - context('.getNodeOptions', () => { - let restoreEnv - - afterEach(() => { - if (restoreEnv) { - restoreEnv() - restoreEnv = null - } - }) - - it('adds required NODE_OPTIONS', () => { - restoreEnv = mockedEnv({ - NODE_OPTIONS: undefined, - }) - - expect(util.getNodeOptions({})).to.deep.eq({ - NODE_OPTIONS: expectedNodeOptions, - }) - }) - - it('includes existing NODE_OPTIONS', () => { - restoreEnv = mockedEnv({ - NODE_OPTIONS: '--foo --bar', - }) - - expect(util.getNodeOptions({})).to.deep.eq({ - NODE_OPTIONS: `${expectedNodeOptions} --foo --bar`, - ORIGINAL_NODE_OPTIONS: '--foo --bar', - }) - }) - - it('does not return if dev is set and version < 12', () => { - expect(util.getNodeOptions({ - dev: true, - }, 11)).to.be.undefined - }) - }) - context('.getForceTty', () => { it('forces when each stream is a tty', () => { sinon.stub(tty, 'isatty') diff --git a/cli/types/cy-moment.d.ts b/cli/types/cy-moment.d.ts deleted file mode 100644 index d68f10b9b5..0000000000 --- a/cli/types/cy-moment.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -import moment = require('moment') -export = Moment -export as namespace Moment - -declare namespace Moment { - type MomentStatic = typeof moment -} diff --git a/cli/types/cypress.d.ts b/cli/types/cypress.d.ts index c52de05772..a50afbaf9f 100644 --- a/cli/types/cypress.d.ts +++ b/cli/types/cypress.d.ts @@ -113,7 +113,7 @@ declare namespace Cypress { /** * Spec type for the given test. "integration" is the default, but - * tests run using experimentalComponentTesting will be "component" + * tests run using `open-ct` will be "component" * * @see https://on.cypress.io/experiments */ @@ -177,18 +177,6 @@ declare namespace Cypress { * @see https://on.cypress.io/minimatch */ minimatch: typeof Minimatch.minimatch - /** - * @deprecated Will be removed in a future version. - * Consider including your own datetime formatter in your tests. - * - * Cypress automatically includes moment.js and exposes it as Cypress.moment. - * - * @see https://on.cypress.io/moment - * @see http://momentjs.com/ - * @example - * const todaysDate = Cypress.moment().format("MMM DD, YYYY") - */ - moment: Moment.MomentStatic /** * Cypress automatically includes Bluebird and exposes it as Cypress.Promise. * @@ -527,6 +515,18 @@ declare namespace Cypress { * @see https://on.cypress.io/catalog-of-events#App-Events */ off: Actions + + /** + * Trigger action + * @private + */ + action: (action: string, ...args: any[]) => void + + /** + * Load files + * @private + */ + onSpecWindow: (window: Window, specList: string[] | Array<() => Promise>) => void } type CanReturnChainable = void | Chainable | Promise @@ -1784,7 +1784,7 @@ declare namespace Cypress { /** * Run a task in Node via the plugins file. * - * @see https://on.cypress.io/task + * @see https://on.cypress.io/api/task */ task(event: string, arg?: any, options?: Partial): Chainable @@ -1812,6 +1812,12 @@ declare namespace Cypress { * @see https://on.cypress.io/then */ 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://on.cypress.io/then + */ + then(fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable> /** * Enables you to work with the subject yielded from the previous command / promise. * @@ -1824,6 +1830,12 @@ declare namespace Cypress { * @see https://on.cypress.io/then */ then(fn: (this: ObjectLike, currentSubject: Subject) => S): ThenReturn + /** + * Enables you to work with the subject yielded from the previous command / promise. + * + * @see https://on.cypress.io/then + */ + then(options: Partial, fn: (this: ObjectLike, currentSubject: Subject) => S): Chainable> /** * Enables you to work with the subject yielded from the previous command / promise. * @@ -1872,7 +1884,7 @@ declare namespace Cypress { * // or use this shortcut * cy.tick(5000).invoke('restore') */ - tick(milliseconds: number): Chainable + tick(milliseconds: number, options?: Partial): Chainable /** * Get the `document.title` property of the page that is currently active. @@ -2138,6 +2150,21 @@ declare namespace Cypress { ``` */ writeFile(filePath: string, contents: C, options?: Partial): Chainable + /** + * Write to a file with the specified encoding and contents. + * + * An `encoding` option in `options` will override the `encoding` argument. + * + * @see https://on.cypress.io/writefile + ``` + cy.writeFile('path/to/ascii.txt', 'Hello World', 'utf8', { + flag: 'a+', + }).then((text) => { + expect(text).to.equal('Hello World') // true + }) + ``` + */ + writeFile(filePath: string, contents: C, encoding: Encodings, options?: Partial): Chainable /** * jQuery library bound to the AUT @@ -2495,6 +2522,11 @@ declare namespace Cypress { * @default "cypress/plugins/index.js" */ pluginsFile: string | false + /** + * The application under test cannot redirect more than this limit. + * @default 20 + */ + redirectionLimit: number /** * If `nodeVersion === 'system'` and a `node` executable is found, this will be the full filesystem path to that executable. * @default null @@ -2608,6 +2640,18 @@ declare namespace Cypress { * @default false */ includeShadowDom: boolean + + /** + * Override default config options for Component Testing runner. + * @default {} + */ + component: ResolvedConfigOptions + + /** + * Override default config options for E2E Testing runner. + * @default {} + */ + e2e: ResolvedConfigOptions } /** @@ -2636,10 +2680,6 @@ declare namespace Cypress { * Path to folder containing component test files. */ componentFolder: string - /** - * Whether component testing is enabled. - */ - experimentalComponentTesting: boolean /** * Hosts mappings to IP addresses. */ @@ -2732,6 +2772,10 @@ declare namespace Cypress { * Absolute path to the root of the project */ projectRoot: string + /** + * Type of test and associated runner that was launched. + */ + testingType: 'e2e' | 'component' /** * Cypress version. */ @@ -5160,7 +5204,7 @@ declare namespace Cypress { */ interface Actions { /** - * Fires when an uncaught exception occurs in your application. + * Fires when an uncaught exception or unhandled rejection occurs in your application. If it's an unhandled rejection, the rejected promise will be the 3rd argument. * Cypress will fail the test when this fires. * Return `false` from this event and Cypress will not fail the test. Also useful for debugging purposes because the actual `error` instance is provided to you. * @see https://on.cypress.io/catalog-of-events#App-Events @@ -5186,7 +5230,7 @@ declare namespace Cypress { }) ``` */ - (action: 'uncaught:exception', fn: (error: Error, runnable: Mocha.Runnable) => false | void): Cypress + (action: 'uncaught:exception', fn: (error: Error, runnable: Mocha.Runnable, promise?: Promise) => false | void): Cypress /** * Fires when your app calls the global `window.confirm()` method. * Cypress will auto accept confirmations. Return `false` from this event and the confirmation will be canceled. @@ -5425,7 +5469,7 @@ declare namespace Cypress { allRequestResponses: any[] body: any duration: number - headers: { [key: string]: string } + headers: { [key: string]: string | string[] } isOkStatusCode: boolean redirects?: string[] redirectedToUrl?: string diff --git a/cli/types/index.d.ts b/cli/types/index.d.ts index c66f78aa11..607d5df14a 100644 --- a/cli/types/index.d.ts +++ b/cli/types/index.d.ts @@ -9,7 +9,6 @@ /// /// -/// /// /// /// diff --git a/cli/types/tests/actions.ts b/cli/types/tests/actions.ts index 977076dba9..e31b294e25 100644 --- a/cli/types/tests/actions.ts +++ b/cli/types/tests/actions.ts @@ -1,6 +1,7 @@ -Cypress.on('uncaught:exception', (error, runnable) => { +Cypress.on('uncaught:exception', (error, runnable, promise) => { error // $ExpectType Error runnable // $ExpectType Runnable + promise // $ExpectType Promise | undefined }) Cypress.on('window:confirm', (text) => { diff --git a/cli/types/tests/chainer-examples.ts b/cli/types/tests/chainer-examples.ts index 6f72b6f5af..1482d69602 100644 --- a/cli/types/tests/chainer-examples.ts +++ b/cli/types/tests/chainer-examples.ts @@ -465,6 +465,10 @@ cy.writeFile('../file.path', '', { flag: 'a+', encoding: 'utf-8' }) +cy.writeFile('../file.path', '', 'ascii', { + flag: 'a+', + encoding: 'utf-8' +}) cy.get('foo').click() cy.get('foo').click({ diff --git a/cli/types/tests/cypress-tests.ts b/cli/types/tests/cypress-tests.ts index b9f7ea17f8..3db26a8535 100644 --- a/cli/types/tests/cypress-tests.ts +++ b/cli/types/tests/cypress-tests.ts @@ -5,14 +5,6 @@ namespace CypressLodashTests { }) } -namespace CypressMomentTests { - Cypress.moment() // $ExpectType Moment - Cypress.moment('1982-08-23') // $ExpectType Moment - Cypress.moment(Date()) // $ExpectType Moment - Cypress.moment(Date()).format() // $ExpectType string - Cypress.moment().startOf('week') // $ExpectType Moment -} - namespace CypressSinonTests { Cypress.sinon // $ExpectType SinonStatic @@ -236,6 +228,26 @@ describe('then', () => { s // $ExpectType string }) }) + + it('HTMLElement', () => { + cy.get('div') + .then(($div) => { + $div // $ExpectType JQuery + return $div[0] + }) + .then(($div) => { + $div // $ExpectType JQuery + }) + + cy.get('p') + .then(($p) => { + $p // $ExpectType JQuery + return $p[0] + }) + .then({timeout: 3000}, ($p) => { + $p // $ExpectType JQuery + }) + }) }) cy.wait(['@foo', '@bar']) @@ -334,14 +346,16 @@ namespace CypressAUTWindowTests { } namespace CypressOnTests { - Cypress.on('uncaught:exception', (error, runnable) => { + Cypress.on('uncaught:exception', (error, runnable, promise) => { error // $ExpectType Error runnable // $ExpectType Runnable + promise // $ExpectType Promise | undefined }) - cy.on('uncaught:exception', (error, runnable) => { + cy.on('uncaught:exception', (error, runnable, promise) => { error // $ExpectType Error runnable // $ExpectType Runnable + promise // $ExpectType Promise | undefined }) // you can chain multiple callbacks diff --git a/cli/types/tests/kitchen-sink.ts b/cli/types/tests/kitchen-sink.ts index 98598e6507..7c81a683b8 100644 --- a/cli/types/tests/kitchen-sink.ts +++ b/cli/types/tests/kitchen-sink.ts @@ -87,7 +87,8 @@ cy.request({ }).then((resp) => { resp // $ExpectType Response resp.redirectedToUrl // $ExpectType string | undefined - resp.redirects // $ExpectTyep string[] | undefined + resp.redirects // $ExpectType string[] | undefined + resp.headers // $ExpectType { [key: string]: string | string[]; } }) // specify query parameters diff --git a/npm/create-cypress-tests/__snapshots__/babel.test.ts.js b/npm/create-cypress-tests/__snapshots__/babel.test.ts.js index 15d56ec7d2..182ba10a2f 100644 --- a/npm/create-cypress-tests/__snapshots__/babel.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/babel.test.ts.js @@ -4,7 +4,10 @@ const injectDevServer = require('@cypress/react/plugins/babel'); const something = require("something"); module.exports = (on, config) => { - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config); + } + + return config; // IMPORTANT to return a config }; ` diff --git a/npm/create-cypress-tests/__snapshots__/init-component-testing.test.ts.js b/npm/create-cypress-tests/__snapshots__/init-component-testing.test.ts.js index df90aa6756..088ae38deb 100644 --- a/npm/create-cypress-tests/__snapshots__/init-component-testing.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/init-component-testing.test.ts.js @@ -1,6 +1,5 @@ exports['Injected overridden webpack template cypress.json'] = ` { - "experimentalComponentTesting": true, "componentFolder": "cypress/component", "testFiles": "**/*.spec.{js,ts,jsx,tsx}" } @@ -10,8 +9,11 @@ exports['Injected overridden webpack template plugins/index.js'] = ` const injectDevServer = require("@cypress/react/plugins/react-scripts"); module.exports = (on, config) => { - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config); + } + + return config; // IMPORTANT to return a config }; ` @@ -22,7 +24,6 @@ import "./commands.js"; exports['injects guessed next.js template cypress.json'] = ` { - "experimentalComponentTesting": true, "componentFolder": "src", "testFiles": "**/*.spec.{js,ts,jsx,tsx}" } @@ -32,8 +33,11 @@ exports['injects guessed next.js template plugins/index.js'] = ` const injectDevServer = require("@cypress/react/plugins/next"); module.exports = (on, config) => { - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config); + } + + return config; // IMPORTANT to return a config }; ` diff --git a/npm/create-cypress-tests/__snapshots__/next.test.ts.js b/npm/create-cypress-tests/__snapshots__/next.test.ts.js index 05528d8477..5d8602de1b 100644 --- a/npm/create-cypress-tests/__snapshots__/next.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/next.test.ts.js @@ -4,7 +4,10 @@ const injectDevServer = require('@cypress/react/plugins/next'); const something = require("something"); module.exports = (on, config) => { - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config); + } + + return config; // IMPORTANT to return a config }; ` diff --git a/npm/create-cypress-tests/__snapshots__/react-scripts.test.ts.js b/npm/create-cypress-tests/__snapshots__/react-scripts.test.ts.js index 7e66be7d73..b960b4be6f 100644 --- a/npm/create-cypress-tests/__snapshots__/react-scripts.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/react-scripts.test.ts.js @@ -4,7 +4,10 @@ const injectDevServer = require('@cypress/react/plugins/react-scripts'); const something = require("something"); module.exports = (on, config) => { - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config); + } + + return config; // IMPORTANT to return a config }; ` diff --git a/npm/create-cypress-tests/__snapshots__/reactWebpackFile.test.ts.js b/npm/create-cypress-tests/__snapshots__/reactWebpackFile.test.ts.js index 644e4ca584..171f0bd0e7 100644 --- a/npm/create-cypress-tests/__snapshots__/reactWebpackFile.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/reactWebpackFile.test.ts.js @@ -4,10 +4,14 @@ const injectDevServer = require("@cypress/react/plugins/load-webpack"); const something = require("something"); module.exports = (on, config) => { - // TODO replace with valid webpack config path - config.env.webpackFilename = './webpack.config.js'; - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config, { + // TODO replace with valid webpack config path + webpackFileName: './webpack.config.js' + }); + } + + return config; // IMPORTANT to return a config }; ` @@ -17,8 +21,12 @@ const injectDevServer = require("@cypress/react/plugins/load-webpack"); const something = require("something"); module.exports = (on, config) => { - config.env.webpackFilename = 'config/webpack.config.js'; - injectDevServer(on, config); - return config; // IMPORTANT to return the config object + if (config.testingType === "component") { + injectDevServer(on, config, { + webpackFileName: 'config/webpack.config.js' + }); + } + + return config; // IMPORTANT to return a config }; ` diff --git a/npm/create-cypress-tests/__snapshots__/rollup.test.ts.js b/npm/create-cypress-tests/__snapshots__/rollup.test.ts.js index 57658498b7..dd34a570cb 100644 --- a/npm/create-cypress-tests/__snapshots__/rollup.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/rollup.test.ts.js @@ -8,14 +8,16 @@ const { const something = require("something"); module.exports = (on, config) => { - on("dev-server:start", async options => { - return startDevServer({ - options, - // TODO replace with valid rollup config path - rollupConfig: path.resolve(__dirname, 'rollup.config.js') + if (config.testingType === "component") { + on("dev-server:start", async options => { + return startDevServer({ + options, + // TODO replace with valid rollup config path + rollupConfig: path.resolve(__dirname, 'rollup.config.js') + }); }); - }); - return config; // IMPORTANT to return the config object + return config; // IMPORTANT to return the config object + } }; ` @@ -29,12 +31,14 @@ const { const something = require("something"); module.exports = (on, config) => { - on("dev-server:start", async options => { - return startDevServer({ - options, - rollupConfig: path.resolve(__dirname, 'config/rollup.config.js') + if (config.testingType === "component") { + on("dev-server:start", async options => { + return startDevServer({ + options, + rollupConfig: path.resolve(__dirname, 'config/rollup.config.js') + }); }); - }); - return config; // IMPORTANT to return the config object + return config; // IMPORTANT to return the config object + } }; ` diff --git a/npm/create-cypress-tests/__snapshots__/vite.test.ts.js b/npm/create-cypress-tests/__snapshots__/vite.test.ts.js index 9fcb7fe621..deb6401a63 100644 --- a/npm/create-cypress-tests/__snapshots__/vite.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/vite.test.ts.js @@ -6,8 +6,10 @@ const { const something = require("something"); module.exports = (on, config) => { - on("dev-server:start", async options => startDevServer({ - options - })); + if (config.testingType === "component") { + on("dev-server:start", async options => startDevServer({ + options + })); + } }; ` diff --git a/npm/create-cypress-tests/__snapshots__/vueCli.test.ts.js b/npm/create-cypress-tests/__snapshots__/vueCli.test.ts.js index 0cb7b24fa9..fe3b61df80 100644 --- a/npm/create-cypress-tests/__snapshots__/vueCli.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/vueCli.test.ts.js @@ -8,9 +8,11 @@ const webpackConfig = require("@vue/cli-service/webpack.config.js"); const something = require("something"); module.exports = (on, config) => { - on('dev-server:start', options => startDevServer({ - options, - webpackConfig - })); + if (config.testingType === "component") { + on('dev-server:start', options => startDevServer({ + options, + webpackConfig + })); + } }; ` diff --git a/npm/create-cypress-tests/__snapshots__/vueWebpackFile.test.ts.js b/npm/create-cypress-tests/__snapshots__/vueWebpackFile.test.ts.js index af69163823..5e199d606f 100644 --- a/npm/create-cypress-tests/__snapshots__/vueWebpackFile.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/vueWebpackFile.test.ts.js @@ -9,10 +9,12 @@ const webpackConfig = require("./webpack.config.js"); // TODO replace with valid const something = require("something"); module.exports = (on, config) => { - on('dev-server:start', options => startDevServer({ - options, - webpackConfig - })); + if (config.testingType === "component") { + on('dev-server:start', options => startDevServer({ + options, + webpackConfig + })); + } }; ` @@ -26,9 +28,11 @@ const webpackConfig = require("build/webpack.config.js"); const something = require("something"); module.exports = (on, config) => { - on('dev-server:start', options => startDevServer({ - options, - webpackConfig - })); + if (config.testingType === "component") { + on('dev-server:start', options => startDevServer({ + options, + webpackConfig + })); + } }; ` diff --git a/npm/create-cypress-tests/__snapshots__/webpackOptions.test.ts.js b/npm/create-cypress-tests/__snapshots__/webpackOptions.test.ts.js index 0ce80e585b..f384e4b912 100644 --- a/npm/create-cypress-tests/__snapshots__/webpackOptions.test.ts.js +++ b/npm/create-cypress-tests/__snapshots__/webpackOptions.test.ts.js @@ -8,31 +8,33 @@ const { const something = require("something"); module.exports = (on, config) => { - /** @type import("webpack").Configuration */ - const webpackConfig = { - resolve: { - extensions: ['.js', '.ts', '.jsx', '.tsx'] - }, - mode: 'development', - devtool: false, - output: { - publicPath: '/', - chunkFilename: '[name].bundle.js' - }, - // TODO: update with valid configuration for your components - module: { - rules: [{ - test: /\\.(js|jsx|mjs|ts|tsx)$/, - loader: 'babel-loader', - options: { - cacheDirectory: path.resolve(__dirname, '.babel-cache') - } - }] - } - }; - on('dev-server:start', options => startDevServer({ - options, - webpackConfig - })); + if (config.testingType === "component") { + /** @type import("webpack").Configuration */ + const webpackConfig = { + resolve: { + extensions: ['.js', '.ts', '.jsx', '.tsx'] + }, + mode: 'development', + devtool: false, + output: { + publicPath: '/', + chunkFilename: '[name].bundle.js' + }, + // TODO: update with valid configuration for your components + module: { + rules: [{ + test: /\\.(js|jsx|mjs|ts|tsx)$/, + loader: 'babel-loader', + options: { + cacheDirectory: path.resolve(__dirname, '.babel-cache') + } + }] + } + }; + on('dev-server:start', options => startDevServer({ + options, + webpackConfig + })); + } }; ` diff --git a/npm/create-cypress-tests/package.json b/npm/create-cypress-tests/package.json index c6705a57b4..25ff3236aa 100644 --- a/npm/create-cypress-tests/package.json +++ b/npm/create-cypress-tests/package.json @@ -30,7 +30,7 @@ "@types/babel__core": "^7.1.2", "@types/inquirer": "7.3.1", "@types/mock-fs": "4.10.0", - "@types/node": "9.6.49", + "@types/node": "14.14.31", "@types/ora": "^3.2.0", "copy": "0.3.2", "mocha": "7.1.1", diff --git a/npm/create-cypress-tests/src/component-testing/babel/babelTransform.test.ts b/npm/create-cypress-tests/src/component-testing/babel/babelTransform.test.ts index 5e86909d54..be1a39d12a 100644 --- a/npm/create-cypress-tests/src/component-testing/babel/babelTransform.test.ts +++ b/npm/create-cypress-tests/src/component-testing/babel/babelTransform.test.ts @@ -6,8 +6,8 @@ describe('babel transform utils', () => { context('Plugins config babel plugin', () => { it('injects code into the plugins file based on ast', () => { const plugin = createTransformPluginsFileBabelPlugin({ - Require: babel.template.ast('require("something")'), - ModuleExportsBody: babel.template.ast('yey()'), + RequireAst: babel.template.ast('require("something")'), + IfComponentTestingPluginsAst: babel.template.ast('yey()'), }) const output = babel.transformSync([ @@ -23,7 +23,10 @@ describe('babel transform utils', () => { '', 'module.exports = (on, config) => {', ' on("do");', - ' yey();', + '', + ' if (config.testingType === "component") {', + ' yey();', + ' }', '};', ].join(`\n`)) }) diff --git a/npm/create-cypress-tests/src/component-testing/babel/babelTransform.ts b/npm/create-cypress-tests/src/component-testing/babel/babelTransform.ts index d2f8c18837..22e5858dca 100644 --- a/npm/create-cypress-tests/src/component-testing/babel/babelTransform.ts +++ b/npm/create-cypress-tests/src/component-testing/babel/babelTransform.ts @@ -3,7 +3,13 @@ import * as fs from 'fs-extra' import * as babel from '@babel/core' import * as babelTypes from '@babel/types' -export type PluginsConfigAst = Record<'Require' | 'ModuleExportsBody', ReturnType> +type AST = ReturnType + +export type PluginsConfigAst = { + RequireAst: AST + IfComponentTestingPluginsAst: AST + requiresReturnConfig?: true +} function tryRequirePrettier () { try { @@ -12,6 +18,13 @@ function tryRequirePrettier () { return null } } +const sharedBabelOptions = { + // disable user config + configFile: false, + babelrc: false, + presets: [], + root: process.env.BABEL_TEST_ROOT, // for testing +} async function transformFileViaPlugin (filePath: string, babelPlugin: babel.PluginObj) { try { @@ -21,7 +34,7 @@ async function transformFileViaPlugin (filePath: string, babelPlugin: babel.Plug filename: path.basename(filePath), filenameRelative: path.relative(process.cwd(), filePath), plugins: [babelPlugin], - presets: [], + ...sharedBabelOptions, }) if (!updatedResult) { @@ -48,11 +61,13 @@ async function transformFileViaPlugin (filePath: string, babelPlugin: babel.Plug } } +const returnConfigAst = babel.template.ast('return config; // IMPORTANT to return a config', { preserveComments: true }) + export function createTransformPluginsFileBabelPlugin (ast: PluginsConfigAst): babel.PluginObj { return { visitor: { Program: (path) => { - path.unshiftContainer('body', ast.Require) + path.unshiftContainer('body', ast.RequireAst) }, Function: (path) => { if (!babelTypes.isAssignmentExpression(path.parent)) { @@ -80,7 +95,24 @@ export function createTransformPluginsFileBabelPlugin (ast: PluginsConfigAst): b path.parent.right.params.push(babelTypes.identifier('config')) } - path.get('body').pushContainer('body' as never, ast.ModuleExportsBody) + const statementToInject = Array.isArray(ast.IfComponentTestingPluginsAst) + ? ast.IfComponentTestingPluginsAst + : [ast.IfComponentTestingPluginsAst] + + const ifComponentMode = babelTypes.ifStatement( + babelTypes.binaryExpression( + '===', + babelTypes.identifier('config.testingType'), + babelTypes.stringLiteral('component'), + ), + babelTypes.blockStatement(statementToInject as babelTypes.Statement[] | babelTypes.Statement[]), + ) + + path.get('body').pushContainer('body' as never, ifComponentMode as babel.Node) + + if (ast.requiresReturnConfig) { + path.get('body').pushContainer('body' as never, returnConfigAst) + } } }, }, @@ -102,7 +134,7 @@ export async function getPluginsSourceExample (ast: PluginsConfigAst) { const babelResult = await babel.transformAsync(exampleCode, { filename: 'nothing.js', plugins: [createTransformPluginsFileBabelPlugin(ast)], - presets: [], + ...sharedBabelOptions, }) if (!babelResult?.code) { diff --git a/npm/create-cypress-tests/src/component-testing/init-component-testing.test.ts b/npm/create-cypress-tests/src/component-testing/init-component-testing.test.ts index 9604cc9ae8..d8593362ba 100644 --- a/npm/create-cypress-tests/src/component-testing/init-component-testing.test.ts +++ b/npm/create-cypress-tests/src/component-testing/init-component-testing.test.ts @@ -32,6 +32,8 @@ describe('init component tests script', () => { await fs.remove(e2eTestOutputPath) await fs.mkdir(e2eTestOutputPath) + + process.env.BABEL_TEST_ROOT = e2eTestOutputPath }) afterEach(() => { @@ -170,7 +172,7 @@ describe('init component tests script', () => { createTempFiles({ '/cypress.json': '{}', '/webpack.config.js': 'module.exports = { }', - '/package.json': JSON.stringify({ dependencies: { react: '*', vue: '*' } }), + '/package.json': JSON.stringify({ dependencies: { react: '*', vue: '^2.4.5' } }), }) promptSpy = sinon.stub(inquirer, 'prompt') @@ -187,12 +189,44 @@ describe('init component tests script', () => { await initComponentTesting({ config: {}, cypressConfigPath, useYarn: true }) expect( - someOfSpyCallsIncludes(global.console.log, `It looks like all these frameworks: ${chalk.yellow('react, vue')} are available from this directory.`), + someOfSpyCallsIncludes(global.console.log, `It looks like all these frameworks: ${chalk.yellow('react, vue@2')} are available from this directory.`), ).to.be.true }) - it('installs the right adapter', () => { + it('installs the right adapter', async () => { + createTempFiles({ + '/cypress.json': '{}', + '/webpack.config.js': 'module.exports = { }', + '/package.json': JSON.stringify({ dependencies: { react: '16.4.5' } }), + }) + promptSpy = sinon.stub(inquirer, 'prompt') + .onCall(0) + .returns(Promise.resolve({ + chosenTemplateName: 'vite', + componentFolder: 'src', + }) as any) + + await initComponentTesting({ config: {}, cypressConfigPath, useYarn: true }) + expect(execStub).to.be.calledWith('yarn add @cypress/react --dev') + }) + + it('installs the right adapter for vue 3', async () => { + createTempFiles({ + '/cypress.json': '{}', + '/vite.config.js': 'module.exports = { }', + '/package.json': JSON.stringify({ dependencies: { vue: '^3.0.0' } }), + }) + + promptSpy = sinon.stub(inquirer, 'prompt') + .onCall(0) + .returns(Promise.resolve({ + chosenTemplateName: 'vite', + componentFolder: 'src', + }) as any) + + await initComponentTesting({ config: {}, cypressConfigPath, useYarn: true }) + expect(execStub).to.be.calledWith('yarn add @cypress/vue@3 --dev') }) it('suggest the right instruction based on user template choice', async () => { @@ -240,7 +274,6 @@ describe('init component tests script', () => { expect(injectedCode).to.equal(JSON.stringify( { - experimentalComponentTesting: true, componentFolder: 'cypress/component', testFiles: '**/*.spec.{js,ts,jsx,tsx}', }, @@ -273,4 +306,36 @@ describe('init component tests script', () => { ), ).to.be.true }) + + it('Doesn\'t affect injected code if user has custom babel.config.js', async () => { + createTempFiles({ + '/cypress/plugins/index.js': 'module.exports = (on, config) => {}', + '/cypress.json': '{}', + 'babel.config.js': `module.exports = ${JSON.stringify({ + presets: [ + '@babel/preset-env', + ], + })}`, + '/package.json': JSON.stringify({ + dependencies: { + babel: '*', + react: '^16.0.0', + }, + }), + }) + + sinon.stub(inquirer, 'prompt').returns(Promise.resolve({ + chosenTemplateName: 'create-react-app', + componentFolder: 'cypress/component', + }) as any) + + await initComponentTesting({ config: {}, cypressConfigPath, useYarn: true }) + const babelPluginsOutput = await fs.readFile( + path.join(e2eTestOutputPath, 'cypress', 'plugins', 'index.js'), + 'utf-8', + ) + + expect(babelPluginsOutput).not.to.contain('use strict') + expect(babelPluginsOutput).to.contain('module.exports = (on, config) => {') + }) }) diff --git a/npm/create-cypress-tests/src/component-testing/init-component-testing.ts b/npm/create-cypress-tests/src/component-testing/init-component-testing.ts index 478a6aaebb..7267470487 100644 --- a/npm/create-cypress-tests/src/component-testing/init-component-testing.ts +++ b/npm/create-cypress-tests/src/component-testing/init-component-testing.ts @@ -56,7 +56,6 @@ async function injectAndShowCypressJsonConfig ( componentFolder: string, ) { const configToInject = { - experimentalComponentTesting: true, componentFolder, testFiles: '**/*.spec.{js,ts,jsx,tsx}', } diff --git a/npm/create-cypress-tests/src/component-testing/installFrameworkAdapter.ts b/npm/create-cypress-tests/src/component-testing/installFrameworkAdapter.ts index c08f0074bc..d93325f8be 100644 --- a/npm/create-cypress-tests/src/component-testing/installFrameworkAdapter.ts +++ b/npm/create-cypress-tests/src/component-testing/installFrameworkAdapter.ts @@ -6,8 +6,9 @@ import { installDependency } from '../utils' async function guessOrAskForFramework (cwd: string): Promise<'react' | 'vue'> { // please sort this alphabetically const frameworks = { - react: () => scanFSForAvailableDependency(cwd, ['react', 'react-dom']), - vue: () => scanFSForAvailableDependency(cwd, ['vue']), + react: () => scanFSForAvailableDependency(cwd, { react: '*', 'react-dom': '*' }), + 'vue@2': () => scanFSForAvailableDependency(cwd, { vue: '2.x' }), + 'vue@3': () => scanFSForAvailableDependency(cwd, { vue: '3.x' }), } const guesses = Object.keys(frameworks).filter((framework) => { diff --git a/npm/create-cypress-tests/src/component-testing/templates/_shared/rollup.ts b/npm/create-cypress-tests/src/component-testing/templates/_shared/rollup.ts index 52d4b65fda..d315000aff 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/_shared/rollup.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/_shared/rollup.ts @@ -34,11 +34,11 @@ export const RollupTemplate: Template<{ rollupConfigPath: string }> = { : 'rollup.config.js' return { - Require: babel.template.ast([ + RequireAst: babel.template.ast([ 'const path = require("path")', 'const { startDevServer } = require("@cypress/rollup-dev-server")', ].join('\n')), - ModuleExportsBody: babel.template.ast([ + IfComponentTestingPluginsAst: babel.template.ast([ `on("dev-server:start", async (options) => {`, ` return startDevServer({`, ` options,`, diff --git a/npm/create-cypress-tests/src/component-testing/templates/_shared/vite.ts b/npm/create-cypress-tests/src/component-testing/templates/_shared/vite.ts index 83e19a70ba..5d7b306fdd 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/_shared/vite.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/_shared/vite.ts @@ -10,17 +10,17 @@ export const ViteTemplate: Template = { dependencies: ['@cypress/vite-dev-server'], getPluginsCodeAst: () => { return { - Require: babel.template.ast( + RequireAst: babel.template.ast( 'const { startDevServer } = require("@cypress/vite-dev-server");', ), - ModuleExportsBody: babel.template.ast([ + IfComponentTestingPluginsAst: babel.template.ast([ 'on("dev-server:start", async (options) => startDevServer({ options }))', ].join('\n'), { preserveComments: true }), } }, test: (root) => { return { - success: scanFSForAvailableDependency(root, ['vite']), + success: scanFSForAvailableDependency(root, { vite: '*' }), } }, } diff --git a/npm/create-cypress-tests/src/component-testing/templates/react/babel.ts b/npm/create-cypress-tests/src/component-testing/templates/react/babel.ts index 210aa14d35..0202d05b44 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/react/babel.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/react/babel.ts @@ -15,10 +15,10 @@ export const BabelTemplate: Template = { getExampleUrl: () => 'https://github.com/cypress-io/cypress/tree/develop/npm/react/examples/babel', getPluginsCodeAst: () => { return { - Require: babel.template.ast('const injectDevServer = require(\'@cypress/react/plugins/babel\')'), - ModuleExportsBody: babel.template.ast([ + requiresReturnConfig: true, + RequireAst: babel.template.ast('const injectDevServer = require(\'@cypress/react/plugins/babel\')'), + IfComponentTestingPluginsAst: babel.template.ast([ 'injectDevServer(on, config)', - 'return config // IMPORTANT to return the config object', ].join('\n'), { preserveComments: true }), } }, diff --git a/npm/create-cypress-tests/src/component-testing/templates/react/next.ts b/npm/create-cypress-tests/src/component-testing/templates/react/next.ts index 7bd7eb0004..2f7ef89adf 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/react/next.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/react/next.ts @@ -13,10 +13,10 @@ export const NextTemplate: Template = { dependencies: ['@cypress/webpack-dev-server'], getPluginsCodeAst: () => { return { - Require: babel.template.ast('const injectDevServer = require(\'@cypress/react/plugins/next\')'), - ModuleExportsBody: babel.template.ast([ + requiresReturnConfig: true, + RequireAst: babel.template.ast('const injectDevServer = require(\'@cypress/react/plugins/next\')'), + IfComponentTestingPluginsAst: babel.template.ast([ 'injectDevServer(on, config)', - 'return config // IMPORTANT to return the config object', ].join('\n'), { preserveComments: true }), } }, diff --git a/npm/create-cypress-tests/src/component-testing/templates/react/react-scripts.ts b/npm/create-cypress-tests/src/component-testing/templates/react/react-scripts.ts index 2cb9616f77..860106b74b 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/react/react-scripts.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/react/react-scripts.ts @@ -16,10 +16,10 @@ export const ReactScriptsTemplate: Template = { }, getPluginsCodeAst: () => { return { - Require: babel.template.ast('const injectDevServer = require(\'@cypress/react/plugins/react-scripts\')'), - ModuleExportsBody: babel.template.ast([ + requiresReturnConfig: true, + RequireAst: babel.template.ast('const injectDevServer = require(\'@cypress/react/plugins/react-scripts\')'), + IfComponentTestingPluginsAst: babel.template.ast([ 'injectDevServer(on, config)', - 'return config // IMPORTANT to return the config object', ].join('\n'), { preserveComments: true }), } }, diff --git a/npm/create-cypress-tests/src/component-testing/templates/react/reactWebpackFile.ts b/npm/create-cypress-tests/src/component-testing/templates/react/reactWebpackFile.ts index e3d82e13e0..eeff51700a 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/react/reactWebpackFile.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/react/reactWebpackFile.ts @@ -18,14 +18,15 @@ export const WebpackTemplate: Template<{ webpackConfigPath: string }> = { : './webpack.config.js' return { - Require: babel.template.ast('const injectDevServer = require("@cypress/react/plugins/load-webpack")'), - ModuleExportsBody: babel.template.ast([ + requiresReturnConfig: true, + RequireAst: babel.template.ast('const injectDevServer = require("@cypress/react/plugins/load-webpack")'), + IfComponentTestingPluginsAst: babel.template.ast([ + 'injectDevServer(on, config, {', includeWarnComment - ? '// TODO replace with valid webpack config path' + ? ' // TODO replace with valid webpack config path' : '', - `config.env.webpackFilename = '${webpackConfigPath}'`, - 'injectDevServer(on, config)', - 'return config // IMPORTANT to return the config object', + ` webpackFileName: '${webpackConfigPath}'`, + '})', ].join('\n'), { preserveComments: true }), } }, diff --git a/npm/create-cypress-tests/src/component-testing/templates/react/webpack-options.ts b/npm/create-cypress-tests/src/component-testing/templates/react/webpack-options.ts index 110f074103..8765be5291 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/react/webpack-options.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/react/webpack-options.ts @@ -15,11 +15,11 @@ export const WebpackOptions: Template = { dependencies: ['webpack', '@cypress/webpack-dev-server'], getPluginsCodeAst: () => { return { - Require: babel.template.ast([ + RequireAst: babel.template.ast([ 'const path = require("path")', 'const { startDevServer } = require("@cypress/webpack-dev-Server")', ].join('\n')), - ModuleExportsBody: babel.template.ast( + IfComponentTestingPluginsAst: babel.template.ast( fs.readFileSync(path.resolve(__dirname, 'webpack-options-module-exports.template.js'), { encoding: 'utf-8' }), { preserveComments: true }, ), diff --git a/npm/create-cypress-tests/src/component-testing/templates/vue/vueCli.ts b/npm/create-cypress-tests/src/component-testing/templates/vue/vueCli.ts index aa66373c52..40be5ec2ce 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/vue/vueCli.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/vue/vueCli.ts @@ -10,17 +10,17 @@ export const VueCliTemplate: Template = { dependencies: ['@cypress/webpack-dev-server'], getPluginsCodeAst: () => { return { - Require: babel.template.ast([ + RequireAst: babel.template.ast([ 'const { startDevServer } = require("@cypress/webpack-dev-server")', `const webpackConfig = require("@vue/cli-service/webpack.config.js")`, ].join('\n')), - ModuleExportsBody: babel.template.ast([ + IfComponentTestingPluginsAst: babel.template.ast([ `on('dev-server:start', (options) => startDevServer({ options, webpackConfig }))`, ].join('\n'), { preserveComments: true }), } }, test: (root) => { - const hasVueCliService = scanFSForAvailableDependency(root, ['@vue/cli-service']) + const hasVueCliService = scanFSForAvailableDependency(root, { '@vue/cli-service': '>=4' }) return { success: hasVueCliService, diff --git a/npm/create-cypress-tests/src/component-testing/templates/vue/vueWebpackFile.ts b/npm/create-cypress-tests/src/component-testing/templates/vue/vueWebpackFile.ts index 979f52a718..5e5fae64da 100644 --- a/npm/create-cypress-tests/src/component-testing/templates/vue/vueWebpackFile.ts +++ b/npm/create-cypress-tests/src/component-testing/templates/vue/vueWebpackFile.ts @@ -16,7 +16,7 @@ export const VueWebpackTemplate: Template<{ webpackConfigPath: string }> = { : './webpack.config.js' return { - Require: babel.template.ast([ + RequireAst: babel.template.ast([ 'const { startDevServer } = require("@cypress/webpack-dev-server")', `const webpackConfig = require("${webpackConfigPath}")`, @@ -24,7 +24,7 @@ export const VueWebpackTemplate: Template<{ webpackConfigPath: string }> = { ? '// TODO replace with valid webpack config path' : '', ].join('\n'), { preserveComments: true }), - ModuleExportsBody: babel.template.ast([ + IfComponentTestingPluginsAst: babel.template.ast([ `on('dev-server:start', (options) => startDevServer({ options, webpackConfig }))`, ].join('\n')), } diff --git a/npm/create-cypress-tests/src/component-testing/versions.ts b/npm/create-cypress-tests/src/component-testing/versions.ts index ce3ac3ae04..734122ff5f 100644 --- a/npm/create-cypress-tests/src/component-testing/versions.ts +++ b/npm/create-cypress-tests/src/component-testing/versions.ts @@ -1,4 +1,4 @@ export const MIN_SUPPORTED_VERSION = { 'react-scripts': '^=3.x || ^=4.x', - next: '^=9.x', + next: '^=9.x || ^=10.x', } diff --git a/npm/create-cypress-tests/src/findPackageJson.ts b/npm/create-cypress-tests/src/findPackageJson.ts index f52fcdd52f..715587bcbc 100644 --- a/npm/create-cypress-tests/src/findPackageJson.ts +++ b/npm/create-cypress-tests/src/findPackageJson.ts @@ -1,6 +1,7 @@ import path from 'path' import fs from 'fs' import findUp from 'find-up' +import { validateSemverVersion } from './utils' type PackageJsonLike = { name?: string @@ -91,7 +92,7 @@ export function createFindPackageJsonIterator (rootPath = process.cwd()) { } } -export function scanFSForAvailableDependency (cwd: string, deps: string[]) { +export function scanFSForAvailableDependency (cwd: string, lookingForDeps: Record) { const { success } = createFindPackageJsonIterator(cwd) .map(({ dependencies, devDependencies }, path) => { if (!dependencies && !devDependencies) { @@ -99,8 +100,13 @@ export function scanFSForAvailableDependency (cwd: string, deps: string[]) { } return { - success: Object.keys({ ...dependencies, ...devDependencies }) - .some((dependency) => deps.includes(dependency)), + success: Object.entries({ ...dependencies, ...devDependencies }) + .some(([dependency, version]) => { + return ( + Boolean(lookingForDeps[dependency]) + && validateSemverVersion(version, lookingForDeps[dependency], dependency) + ) + }), } }) diff --git a/npm/create-cypress-tests/src/main.ts b/npm/create-cypress-tests/src/main.ts index d5fedf74a0..d836476591 100644 --- a/npm/create-cypress-tests/src/main.ts +++ b/npm/create-cypress-tests/src/main.ts @@ -38,7 +38,7 @@ async function shouldUseYarn () { } function shouldUseTypescript () { - return scanFSForAvailableDependency(process.cwd(), ['typescript']) + return scanFSForAvailableDependency(process.cwd(), { typescript: '*' }) } async function askForComponentTesting () { @@ -51,16 +51,22 @@ async function askForComponentTesting () { return shouldSetupComponentTesting } -function printCypressCommandsHelper ({ useYarn }: { useYarn: boolean }) { - const displayedCommand = useYarn ? 'yarn' : 'npx' +function printCypressCommandsHelper (options: { shouldSetupComponentTesting: boolean, useYarn: boolean }) { + const printCommand = (command: string, description: string) => { + const displayedRunner = options.useYarn ? 'yarn' : 'npx' - console.log('Inside this directory, you can run several commands:') - console.log() - console.log(chalk.cyan(` ${displayedCommand} cypress open`)) - console.log(' Opens cypress local development app.') - console.log() - console.log(chalk.cyan(` ${displayedCommand} cypress run`)) - console.log(' Runs tests in headless mode.') + console.log() + console.log(chalk.cyan(` ${displayedRunner} ${command}`)) + console.log(` ${description}`) + } + + printCommand('cypress open', 'Opens cypress local development app.') + printCommand('cypress run', 'Runs tests in headless mode.') + + if (options.shouldSetupComponentTesting) { + printCommand('cypress open-ct', 'Opens cypress component-testing web app.') + printCommand('cypress run', 'Runs component testing in headless mode.') + } } export async function main ({ useNpm, ignoreTs, setupComponentTesting, ignoreExamples }: MainArgv) { @@ -92,7 +98,7 @@ export async function main ({ useNpm, ignoreTs, setupComponentTesting, ignoreExa } console.log(`\n👍 Success! Cypress is installed and ready to run tests.`) - printCypressCommandsHelper({ useYarn }) + printCypressCommandsHelper({ useYarn, shouldSetupComponentTesting }) console.log(`\nHappy testing with ${chalk.green('cypress.io')} 🌲\n`) } diff --git a/npm/design-system/.eslintrc b/npm/design-system/.eslintrc deleted file mode 100644 index b0ca3a434f..0000000000 --- a/npm/design-system/.eslintrc +++ /dev/null @@ -1,47 +0,0 @@ -{ - "plugins": [ - "cypress", - "@cypress/dev" - ], - "extends": [ - "plugin:@cypress/dev/general", - "plugin:@cypress/dev/tests", - "plugin:@cypress/dev/react", - "../../packages/reporter/src/.eslintrc.json" - ], - "parser": "@typescript-eslint/parser", - "env": { - "cypress/globals": true - }, - "rules": { - "react/jsx-filename-extension": [ - "warn", - { - "extensions": [ - ".js", - ".jsx", - ".tsx" - ] - } - ] - }, - "overrides": [ - { - "files": [ - "lib/*" - ], - "rules": { - "no-console": 1 - } - }, - { - "files": [ - "**/*.json" - ], - "rules": { - "quotes": "off", - "comma-dangle": "off" - } - } - ] -} diff --git a/npm/design-system/.eslintrc.json b/npm/design-system/.eslintrc.json new file mode 100644 index 0000000000..3becfaaad2 --- /dev/null +++ b/npm/design-system/.eslintrc.json @@ -0,0 +1,137 @@ +{ + "plugins": [ + "cypress", + "@cypress/dev" + ], + "extends": [ + "plugin:@cypress/dev/general", + "plugin:@cypress/dev/tests", + "plugin:@cypress/dev/react", + "plugin:react/recommended", + "plugin:react-hooks/recommended", + "../../packages/reporter/src/.eslintrc.json" + ], + "parser": "@typescript-eslint/parser", + "env": { + "cypress/globals": true + }, + "rules": { + "react/display-name": "off", + "react/function-component-definition": [ + "error", + { + "namedComponents": "arrow-function", + "unnamedComponents": "arrow-function" + } + ], + "react/jsx-boolean-value": [ + "error", + "always" + ], + "react/jsx-closing-bracket-location": [ + "error", + "line-aligned" + ], + "react/jsx-closing-tag-location": "error", + "react/jsx-curly-brace-presence": [ + "error", + { + "props": "never", + "children": "never" + } + ], + "react/jsx-curly-newline": "error", + "react/jsx-filename-extension": [ + "warn", + { + "extensions": [ + ".js", + ".jsx", + ".tsx" + ] + } + ], + "react/jsx-first-prop-new-line": "error", + "react/jsx-max-props-per-line": [ + "error", + { + "maximum": 1, + "when": "multiline" + } + ], + "react/jsx-no-bind": [ + "error", + { + "ignoreDOMComponents": true + } + ], + "react/jsx-no-useless-fragment": "error", + "react/jsx-one-expression-per-line": [ + "error", + { + "allow": "literal" + } + ], + "react/jsx-sort-props": [ + "error", + { + "callbacksLast": true, + "ignoreCase": true, + "noSortAlphabetically": true, + "reservedFirst": true + } + ], + "react/jsx-tag-spacing": [ + "error", + { + "closingSlash": "never", + "beforeSelfClosing": "always" + } + ], + "react/jsx-wrap-multilines": [ + "error", + { + "declaration": "parens-new-line", + "assignment": "parens-new-line", + "return": "parens-new-line", + "arrow": "parens-new-line", + "condition": "parens-new-line", + "logical": "parens-new-line", + "prop": "parens-new-line" + } + ], + "react/no-array-index-key": "error", + "react/no-unescaped-entities": "off", + "react/prop-types": "off", + "quote-props": [ + "error", + "as-needed" + ] + }, + "overrides": [ + { + "files": [ + "lib/*" + ], + "rules": { + "no-console": 1 + } + }, + { + "files": [ + "**/*.json" + ], + "rules": { + "quotes": "off", + "comma-dangle": "off" + } + }, + { + "files": "*.spec.tsx", + "rules": { + "no-unused-vars": "off", + "react/jsx-no-bind": "off" + } + } + ] +} diff --git a/npm/design-system/babel.config.js b/npm/design-system/babel.config.js index cc7f0acad6..3ac7b6daef 100644 --- a/npm/design-system/babel.config.js +++ b/npm/design-system/babel.config.js @@ -1,4 +1,5 @@ module.exports = { + plugins: ['@babel/plugin-proposal-optional-chaining'], presets: [ '@babel/preset-env', '@babel/preset-react', diff --git a/npm/design-system/cypress.json b/npm/design-system/cypress.json index 0c1d7609a0..65f6885eb7 100644 --- a/npm/design-system/cypress.json +++ b/npm/design-system/cypress.json @@ -12,7 +12,5 @@ "**/__image_snapshots__/*" ], "componentFolder": "src", - "experimentalComponentTesting": true, - "experimentalFetchPolyfill": true, "fixturesFolder": false -} +} \ No newline at end of file diff --git a/npm/design-system/cypress/plugins/index.js b/npm/design-system/cypress/plugins/index.js index 605317386d..3c7a64d322 100644 --- a/npm/design-system/cypress/plugins/index.js +++ b/npm/design-system/cypress/plugins/index.js @@ -1,72 +1,11 @@ // @ts-check -const { startDevServer } = require('@cypress/webpack-dev-server') -const path = require('path') -const babelConfig = require('../../babel.config.js') - -/** @type import("webpack").Configuration */ -const webpackConfig = { - resolve: { - extensions: ['.js', '.ts', '.jsx', '.tsx', '.scss', '.css'], - }, - mode: 'development', - devtool: false, - output: { - publicPath: '/', - chunkFilename: '[name].bundle.js', - }, - module: { - rules: [ - { - test: /\.(js|jsx|mjs|ts|tsx)$/, - loader: 'babel-loader', - options: { ...babelConfig, cacheDirectory: path.resolve(__dirname, '..', '..', '.babel-cache') }, - }, - { - test: /\.modules?\.s[ac]ss$/i, - exclude: [/node_modules/], - use: [ - 'style-loader', - { - loader: 'css-loader', - options: { - modules: true, - }, - }, - 'sass-loader', - ], - }, - { - test: /\.s[ac]ss$/i, - exclude: [/node_modules/, /\.modules?\.s[ac]ss$/i], - use: ['style-loader', 'css-loader', 'sass-loader'], - }, - { - // some of our examples import SVG - test: /\.svg$/, - loader: 'svg-url-loader', - }, - { - // some of our examples import SVG - test: /\.svg$/, - loader: 'svg-url-loader', - }, - { - test: /\.(png|jpg)$/, - use: ['file-loader'], - }, - { - test: /\.(svg|eot|woff|woff2|ttf)$/, - use: ['file-loader'], - }, - ], - }, -} +const { startDevServer } = require('@cypress/vite-dev-server') /** * @type Cypress.PluginConfig */ module.exports = (on, config) => { - on('dev-server:start', (options) => startDevServer({ options, webpackConfig, disableLazyCompilation: false })) + on('dev-server:start', (options) => startDevServer({ options })) return config } diff --git a/npm/design-system/index.html b/npm/design-system/index.html new file mode 100644 index 0000000000..de6b0517b6 --- /dev/null +++ b/npm/design-system/index.html @@ -0,0 +1,11 @@ + + + + + + + AUT Frame + + + + diff --git a/npm/design-system/package.json b/npm/design-system/package.json index 41e784636b..04768ed664 100644 --- a/npm/design-system/package.json +++ b/npm/design-system/package.json @@ -7,9 +7,9 @@ "build": "rimraf dist && yarn rollup -c rollup.config.js", "build-prod": "yarn build", "cy:open": "node ../../scripts/cypress.js open-ct --project ${PWD}", - "cy:open:debug": "NODE_OPTIONS=--max-http-header-size=1048576 node --inspect-brk ../../scripts/start.js --component-testing --project ${PWD}", + "cy:open:debug": "node --inspect-brk ../../scripts/start.js --component-testing --project ${PWD}", "cy:run": "node ../../scripts/cypress.js run-ct --project ${PWD}", - "cy:run:debug": "NODE_OPTIONS=--max-http-header-size=1048576 node --inspect-brk ../../scripts/start.js --component-testing --run-project ${PWD}", + "cy:run:debug": "node --inspect-brk ../../scripts/start.js --component-testing --run-project ${PWD}", "pretest": "yarn transpile", "test": "yarn cy:run", "transpile": "tsc", @@ -21,42 +21,40 @@ "@fortawesome/free-brands-svg-icons": "5.15.2", "@fortawesome/free-solid-svg-icons": "5.15.2", "@fortawesome/react-fontawesome": "0.1.14", - "@iconify/icons-vscode-icons": "1.1.1", - "@iconify/react": "2.0.0-rc.8", "classnames": "2.2.6", "debug": "4.3.2" }, "devDependencies": { "@babel/core": "7.4.5", + "@babel/plugin-proposal-optional-chaining": "^7.13.8", "@babel/preset-env": "7.4.5", "@babel/preset-react": "7.0.0", "@babel/preset-typescript": "7.10.4", "@cypress/react": "0.0.0-development", - "@cypress/webpack-dev-server": "0.0.0-development", + "@cypress/vite-dev-server": "0.0.0-development", "@percy/cypress": "2.3.2", "@rollup/plugin-commonjs": "^17.1.0", "@rollup/plugin-image": "2.0.6", "@rollup/plugin-json": "^4.1.0", "@rollup/plugin-node-resolve": "^11.1.1", - "@types/node": "12.12.50", + "@types/node": "14.14.31", "@types/semver": "7.3.4", "babel-loader": "8.0.6", "css-loader": "2.1.1", "cypress": "0.0.0-development", "cypress-real-events": "1.1.0", - "mocha": "^7.0.1", + "eslint-plugin-react": "^7.22.0", + "eslint-plugin-react-hooks": "^4.2.0", "react": "16.8.6", "react-dom": "16.8.6", "rollup": "^2.38.5", + "rollup-plugin-copy-assets": "2.0.3", "rollup-plugin-peer-deps-external": "2.2.4", "rollup-plugin-postcss-modules": "2.0.2", "rollup-plugin-typescript2": "^0.29.0", "sass": "1.32.8", - "sass-loader": "10.1.1", - "style-loader": "0.23.1", - "svg-url-loader": "3.0.3", "typescript": "4.0.3", - "webpack": "4.44.1" + "vite": "2.1.3" }, "peerDependencies": { "react": "^=16.x || ^=17.x", @@ -90,4 +88,4 @@ "expect" ] } -} +} \ No newline at end of file diff --git a/npm/design-system/rollup.config.js b/npm/design-system/rollup.config.js index 2a508c377d..88057a4a6a 100644 --- a/npm/design-system/rollup.config.js +++ b/npm/design-system/rollup.config.js @@ -6,6 +6,7 @@ import peerDepsExternal from 'rollup-plugin-peer-deps-external' import postcss from 'rollup-plugin-postcss-modules' import pkg from './package.json' import image from '@rollup/plugin-image' +import copy from 'rollup-plugin-copy-assets' const banner = ` /** @@ -29,7 +30,17 @@ function createEntry (options) { 'react-dom', ], plugins: [ - peerDepsExternal(), resolve(), json(), commonjs(), postcss({ writeDefinitions: false }), image(), + peerDepsExternal(), + resolve(), + json(), + commonjs(), + postcss({ writeDefinitions: false }), + image(), + copy({ + assets: [ + './index.scss', + ], + }), ], output: { banner, diff --git a/npm/design-system/src/components/Button/Button.tsx b/npm/design-system/src/components/Button/Button.tsx index 221a4c6e8c..551c7d12d7 100644 --- a/npm/design-system/src/components/Button/Button.tsx +++ b/npm/design-system/src/components/Button/Button.tsx @@ -1,4 +1,6 @@ import React from 'react' import { button } from './Button.module.scss' -export const Button = () => () +export const Button = () => ( + +) diff --git a/npm/design-system/src/components/CypressLogo/CypressLogo.tsx b/npm/design-system/src/components/CypressLogo/CypressLogo.tsx index 93088d8ee6..ca759a9dd7 100644 --- a/npm/design-system/src/components/CypressLogo/CypressLogo.tsx +++ b/npm/design-system/src/components/CypressLogo/CypressLogo.tsx @@ -16,8 +16,10 @@ interface LogoProps { export const CypressLogo: React.FC = (props) => { return ( - + src={LogoPng} + /> ) } diff --git a/npm/design-system/src/components/FileExplorer/FileExplorer.module.scss b/npm/design-system/src/components/FileExplorer/FileExplorer.module.scss deleted file mode 100644 index d5e9c03b52..0000000000 --- a/npm/design-system/src/components/FileExplorer/FileExplorer.module.scss +++ /dev/null @@ -1,48 +0,0 @@ -@use '../../index.scss' as *; - -.nav { - user-select: none; - white-space: nowrap; -} - -.ul { - margin-block-start: 0; - margin-block-end: 0; - margin-inline-start: 0; - margin-inline-end: 0; - padding-inline-start: 0; - &:before { - display: none; - } -} - -.li.li { - padding-left: 20px; -} - - -.ul, .li { - position: relative; - list-style: none; - font-size: $text-s; - line-height: 1.6; -} - -.a { - position: relative; - color: unset; - text-decoration: none; - display: inline-block; - width: 100%; - &:hover { - cursor: pointer; - } -} - -.ul .ul { - margin-inline-start: $text-xs; -} - -.isSelected, .isSelected:hover { - text-decoration: underline; -} \ No newline at end of file diff --git a/npm/design-system/src/components/FileExplorer/FileExplorer.spec.tsx b/npm/design-system/src/components/FileExplorer/FileExplorer.spec.tsx deleted file mode 100644 index f327126aa6..0000000000 --- a/npm/design-system/src/components/FileExplorer/FileExplorer.spec.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { mount } from '@cypress/react' -import React from 'react' -import { FileExplorer, FileComponentProps, FolderComponentProps } from './FileExplorer' -import { FileNode, makeFileHierarchy, TreeNode } from './helpers/makeFileHierarchy' - -import styles from './FileExplorer.module.scss' - -const specs: Cypress.Cypress['spec'][] = [ - { - relative: 'foo/bar/foo.spec.js', - absolute: 'Users/code/foo/bar/foo.spec.js', - name: 'foo/bar/foo.spec.js', - }, - { - relative: 'bar/foo.spec.tsx', - absolute: 'bar/foo.spec.tsx', - name: 'bar/foo.spec.tsx', - }, - { - relative: 'merp/map.spec.ts', - absolute: 'merp/map.spec.ts', - name: 'merp/map.spec.ts', - }, -] - -interface FileExplorerTestProps { - clickFileStub: typeof cy.stub - clickFolderStub: typeof cy.stub -} - -function createFileExplorer (testProps: FileExplorerTestProps): React.FC { - return () => { - const [selectedFile, setSelectedFile] = React.useState() - - const onFileClick = (file: FileNode) => { - setSelectedFile(file.absolute) - } - - const files = makeFileHierarchy(specs.map((spec) => spec.relative)) - - const FileComponent: React.FC = (props) => { - return ( -
{ - testProps.clickFileStub(props.item) - props.onClick(props.item) - }}> - {props.item.name} -
- ) - } - - const FolderComponent: React.FC = (props) => { - return ( -
{ - testProps.clickFolderStub() - props.onClick() - }}> - {props.item.name} -
- ) - } - - return ( - - ) - } -} - -describe('FileExplorer', () => { - it('basic usage', () => { - const files: TreeNode[] = [ - { - type: 'folder', - name: 'foo', - absolute: 'foo', - files: [ - { - type: 'file', - name: 'bar.js', - absolute: 'foo/bar.js', - }, - ], - }, - ] - - const FileComponent: React.FC = (props) =>
{props.item.name}
- const FolderComponent: React.FC = (props) =>
{props.item.name}
- - mount( - {}} - />, - ) - }) - - it('clicks file and folders', () => { - const clickFolderStub = cy.stub() - const clickFileStub = cy.stub() - - const Wrapper = createFileExplorer({ - clickFolderStub, - clickFileStub, - }) - - mount() - - cy.get('div').contains('bar').click().then(() => { - expect(clickFolderStub).to.have.been.calledWith() - }) - - cy.get('div').contains('map.spec.ts').click().then(() => { - expect(clickFileStub).to.have.been.calledWith({ - type: 'file', - absolute: 'merp/map.spec.ts', - name: 'map.spec.ts', - }) - }) - }) -}) diff --git a/npm/design-system/src/components/FileExplorer/FileExplorer.tsx b/npm/design-system/src/components/FileExplorer/FileExplorer.tsx deleted file mode 100644 index cc03f8d581..0000000000 --- a/npm/design-system/src/components/FileExplorer/FileExplorer.tsx +++ /dev/null @@ -1,244 +0,0 @@ -import React from 'react' -import cs from 'classnames' -import { FileNode, FolderNode, TreeNode } from './helpers/makeFileHierarchy' - -export { FileNode, FolderNode, TreeNode } - -export interface FolderComponentProps { - item: FolderNode - depth: number - isOpen: boolean - onClick: () => void -} - -export interface FileComponentProps { - item: FileNode - depth: number - onClick: (file: FileNode) => void -} - -export interface FileExplorerProps extends React.HTMLAttributes { - files: TreeNode[] - fileComponent: React.FC - folderComponent: React.FC - selectedFile?: string - searchInput?: JSX.Element - onFileClick: (file: FileNode) => void - - // Styles. They should be a *.module.scss. - // TODO: Can we type these? Do we want to couple to CSS modules? - cssModule?: { - nav: any - ul: any - li: any - a: any - isSelected: any - } -} - -export interface FileTreeProps extends FileExplorerProps { - depth: number - openFolders: Record - style?: React.CSSProperties - setSelectedFile: (absolute: string) => void -} - -export const FileExplorer: React.FC = (props) => { - /** - * Whether a folder is open or not is a **UI** concern. - * From a file system point of view, there is no such concept as "open" or "closed", - * only from a user's point of view. - * For this reason we save the open state as part of the UI component. The easiest - * way to do this is a key/value pair, mapping the absolute path of a directory to a boolean - * - * { - * 'foo': true, - * 'foo/bar': true - * 'foo/bar/qux': false - * } - * - * Every directory is set to open by default. When you add a new directory - * or file via your file system (eg mkdir foo/bar && touch foo/bar/hello.js) it will be added - * without losing the current state of open/closed directories. - */ - const [openFolders, setOpenFolders] = React.useState>({}) - - React.useLayoutEffect(() => { - const openFoldersTmp:Record = {} - - function walk (nodes: TreeNode[]) { - for (const node of nodes) { - if (node.type === 'folder') { - // only update with newly created folders. - // we want to maintain the current state (open/closed) of existing folders. - if (!(node.absolute in openFoldersTmp)) { - openFoldersTmp[node.absolute] = true - } - - walk(node.files) - } - } - } - - walk(props.files) - setOpenFolders(openFoldersTmp) - }, [props.files]) - - const handleKeyDown = (e: React.KeyboardEvent) => { - const files: TreeNode[] = [] - - function flatten (nodes: TreeNode[]) { - for (const node of nodes) { - if (node.type === 'folder') { - // only update with newly created folders. - // we want to maintain the current state (open/closed) of existing folders. - if (openFolders[node.absolute]) { - files.push(node) - flatten(node.files) - } else { - files.push(node) - } - } else { - files.push(node) - } - } - } - - flatten(props.files) - - const selectSpecByIndex = (index: number) => { - const file = typeof index !== 'number' || index < 0 - ? files[0] - : files[index] - - const specElement = document.querySelector(`[data-item="${file.absolute}"]`) as HTMLDivElement - - if (specElement) { - specElement.focus() - } - } - - const selectedSpecIndex = files.findIndex((file) => { - return file.absolute === (document.activeElement as HTMLElement).dataset.item - }) - - if (e.key === 'Enter') { - const selected = files[selectedSpecIndex] - - if (selected.type === 'file') { - // Run the spec. - props.onFileClick(selected) - } - - // Toggle the folder open/closed. - return setSelectedFile(selected.absolute) - } - - if (e.key === 'ArrowUp') { - return selectSpecByIndex(selectedSpecIndex - 1) - } - - if (e.key === 'ArrowDown') { - return selectSpecByIndex(selectedSpecIndex + 1) - } - } - - const setSelectedFile = (absolute: string) => { - setOpenFolders({ ...openFolders, [absolute]: !openFolders[absolute] }) - } - - return ( - - ) -} - -export const FileTree: React.FC = (props) => { - // Negative margins let the tag take full width (a11y) - // while the
  • tag with text content can be positioned relatively - // This gives us HTML + cssModule-only highlight and click handling - const fileTree = (item: TreeNode) => { - if (item.type !== 'folder') { - return - } - - return ( - - ) - } - - const renderFolder = (item: FolderNode) => { - return ( - props.setSelectedFile(item.absolute)} - /> - ) - } - - const renderFile = (item: FileNode) => { - return ( - - ) - } - - return ( - <> - {props.searchInput} - - - ) -} diff --git a/npm/design-system/src/components/Nav/LeftNav.spec.tsx b/npm/design-system/src/components/Nav/LeftNav.spec.tsx index 12aa99acb3..820e4e319e 100644 --- a/npm/design-system/src/components/Nav/LeftNav.spec.tsx +++ b/npm/design-system/src/components/Nav/LeftNav.spec.tsx @@ -59,7 +59,8 @@ describe('LeftNav', () => { href: '#foo', }, }, - ]} />) + ]} + />) cy.get('a').first().eq(0).click().url().should('include', '#foo') }) @@ -71,7 +72,8 @@ describe('LeftNav', () => {
    + }} + > This is the main page content
    diff --git a/npm/design-system/src/components/Nav/LeftNav.tsx b/npm/design-system/src/components/Nav/LeftNav.tsx index d566a8c216..6a684bbe6b 100644 --- a/npm/design-system/src/components/Nav/LeftNav.tsx +++ b/npm/design-system/src/components/Nav/LeftNav.tsx @@ -54,8 +54,8 @@ export const LeftNav: React.FC = ({ items, activeIndex, leftNavCla const topNav = ( @@ -63,8 +63,8 @@ export const LeftNav: React.FC = ({ items, activeIndex, leftNavCla const bottomNav = ( diff --git a/npm/design-system/src/components/Playground.spec.tsx b/npm/design-system/src/components/Playground.spec.tsx index 31be8bec1c..42fa7c8fd2 100644 --- a/npm/design-system/src/components/Playground.spec.tsx +++ b/npm/design-system/src/components/Playground.spec.tsx @@ -12,13 +12,15 @@ library.add(fab) describe('Playground', () => { it('cypress logo', () => { - mount(<> - -
    - -
    - - ) + mount( + <> + +
    + +
    + + , + ) }) it('search input', () => { @@ -26,26 +28,31 @@ describe('Playground', () => { const [value, setValue] = React.useState(props.value || '') const inputRef = React.useRef(null) - return ( { - setValue('') - inputRef.current.focus() - }} - placeholder={props.placeholder} - inputRef={inputRef} - value={value} - onChange={(event) => setValue(event.target.value)}> - ) + return ( + { + setValue('') + inputRef.current.focus() + }} + onChange={(event) => setValue(event.target.value)} + > + + ) } - mount(<> - -
    - {/* */} -
    - {/* */} - ) + mount( + <> + +
    + {/* */} +
    + {/* */} + , + ) cy.get('input').should('exist') cy.get('input').should('exist').first() diff --git a/npm/design-system/src/components/SearchInput/SearchInput.module.scss b/npm/design-system/src/components/SearchInput/SearchInput.module.scss index 87abe0c08d..71e9cc7814 100644 --- a/npm/design-system/src/components/SearchInput/SearchInput.module.scss +++ b/npm/design-system/src/components/SearchInput/SearchInput.module.scss @@ -2,9 +2,7 @@ $active-color: $metal-50; $inactive-color: $metal-20; - $input-color: $metal-50; -$input-width: 120px; @mixin quick-transition($param) { transition: $param 0.15s ease-in-out; @@ -16,13 +14,12 @@ $input-width: 120px; color: $input-color; padding: 0 $text-m 0 $text-xxs; width: 100%; - max-width: $input-width; border: unset; outline: unset; border-bottom: 1px solid $inactive-color; &.hasPrefix { - padding: 0 $text-m; + padding: 0.2rem $text-m; } } @@ -45,11 +42,14 @@ $icon-margin: calc(#{$icon-size} / 3); .suffix { margin: $icon-margin $icon-negative-margin; + right: 20px; } .inputButton { position: relative; + display: flex; margin: 1rem; + align-items: center; &:active, &:focus-within { .searchInput { diff --git a/npm/design-system/src/components/SearchInput/SearchInput.tsx b/npm/design-system/src/components/SearchInput/SearchInput.tsx index 5996da4001..22e9b55237 100644 --- a/npm/design-system/src/components/SearchInput/SearchInput.tsx +++ b/npm/design-system/src/components/SearchInput/SearchInput.tsx @@ -12,6 +12,8 @@ interface SearchInputProps extends React.InputHTMLAttributes { } export const SearchInput: React.FC = (props) => { + const { onSuffixClicked } = props + const prefixIcon = props.prefixIcon && ( = (props) => { /> ) + const onKeyPress = React.useCallback((e: React.KeyboardEvent) => { + if (e.key === 'Enter') { + onSuffixClicked?.() + } + }, [onSuffixClicked]) + return ( {prefixIcon} { - props.value && - e.key === 'Enter' && props.onSuffixClicked && props.onSuffixClicked()} - /> + props.value && ( + + ) } ) diff --git a/npm/design-system/src/components/SpecList/SpecList.spec.tsx b/npm/design-system/src/components/SpecList/SpecList.spec.tsx deleted file mode 100644 index eebd2b5d98..0000000000 --- a/npm/design-system/src/components/SpecList/SpecList.spec.tsx +++ /dev/null @@ -1,104 +0,0 @@ -/// -import { mount } from '@cypress/react' -import React from 'react' -import { FileNode } from '../FileExplorer/helpers/makeFileHierarchy' -import { SpecList } from './SpecList' - -const specs: Cypress.Cypress['spec'][] = [ - { - relative: 'foo/bar/foo.spec.js', - absolute: 'Users/code/foo/bar/foo.spec.js', - name: 'foo/bar/foo.spec.js', - }, - { - relative: 'qux/foo.spec.tsx', - absolute: 'qux/foo.spec.tsx', - name: 'qux/foo.spec.tsx', - }, - { - relative: 'merp/foo.spec.ts', - absolute: 'merp/foo.spec.ts', - name: 'merp/foo.spec.ts', - }, -] - -describe('SpecList', () => { - const createSpecList = (selectStub: typeof cy.stub): React.FC => { - return () => { - const [selectedFile, setSelectedFile] = React.useState() - - const onFileClick = (file: FileNode) => { - selectStub(file) - setSelectedFile(file.absolute) - } - - return ( - - ) - } - } - - it('renders and selects a file', () => { - const selectStub = cy.stub() - const Subject = createSpecList(selectStub) - - mount() - - cy.get('div').contains('foo.spec.tsx').click().then(() => { - expect(selectStub).to.have.been.calledWith({ - type: 'file', - absolute: 'qux/foo.spec.tsx', - name: 'foo.spec.tsx', - }) - }) - }) - - it('closes a folder', () => { - const Subject = createSpecList(cy.stub()) - - mount() - - cy.get('div').contains('foo.spec.tsx').should('exist') - - // qux folder contains foo.spec.tsx. If we close it, it should not exist anymore. - cy.get('div').contains('qux').click().then(() => { - cy.get('div').contains('foo.spec.tsx').should('not.exist') - }) - }) - - it('navigates with arrow keys', () => { - const selectStub = cy.stub() - const Subject = createSpecList(selectStub) - - mount() - - // close the "foo" directory - cy.get('div').contains('foo').click() - - // navigate to "qux" - cy.realPress('ArrowDown') - cy.get('div').contains('foo.spec.tsx').should('exist') - - // collapse "qux", hiding "foo.spec.tsx" - cy.realPress('{enter}') - cy.get('div').contains('foo.spec.tsx').should('not.exist') - - // uncollapse "qux", revealing "foo.spec.tsx" - cy.realPress('{enter}') - cy.get('div').contains('foo.spec.tsx').should('exist') - - // navigate to "foo.spec.tsx" - cy.realPress('ArrowDown') - cy.realPress('{enter}').then(() => { - expect(selectStub).to.have.been.calledWith({ - type: 'file', - absolute: 'qux/foo.spec.tsx', - name: 'foo.spec.tsx', - }) - }) - }) -}) diff --git a/npm/design-system/src/components/SpecList/SpecList.tsx b/npm/design-system/src/components/SpecList/SpecList.tsx deleted file mode 100644 index 99c3536ff5..0000000000 --- a/npm/design-system/src/components/SpecList/SpecList.tsx +++ /dev/null @@ -1,81 +0,0 @@ -import React from 'react' -import { - FileComponentProps, - FolderComponentProps, - FileExplorer, - FileExplorerProps, -} from '../FileExplorer/FileExplorer' -import { makeFileHierarchy } from '../FileExplorer/helpers/makeFileHierarchy' - -import { InlineIcon } from '@iconify/react' -import javascriptIcon from '@iconify/icons-vscode-icons/file-type-js-official' -import typescriptIcon from '@iconify/icons-vscode-icons/file-type-typescript-official' -import reactJs from '@iconify/icons-vscode-icons/file-type-reactjs' -import reactTs from '@iconify/icons-vscode-icons/file-type-reactts' -import folderClosed from '@iconify/icons-vscode-icons/default-folder' -import folderOpen from '@iconify/icons-vscode-icons/default-folder-opened' -import styles from './SpecList.module.scss' - -const icons: Record = { - js: { icon: javascriptIcon }, - ts: { icon: typescriptIcon }, - tsx: { icon: reactTs }, - jsx: { icon: reactJs }, - folderOpen: { icon: folderOpen }, - folderClosed: { icon: folderClosed }, -} - -const getExt = (path: string) => { - const extensionMatches = path.match(/(?:\.([^.]+))?$/) - - return extensionMatches ? extensionMatches[1] : '' -} - -const FileComponent: React.FC = (props) => { - const ext = getExt(props.item.name) - const inlineIconProps = ext && icons[ext] - - return ( -
    props.onClick(props.item)} - > - - {props.item.name} -
    - ) -} - -const FolderComponent: React.FC = (props) => { - const inlineIconProps = props.isOpen ? icons.folderOpen : icons.folderClosed - - return ( -
    - - {props.item.name} -
    - ) -} - -interface SpecListProps extends Omit< - FileExplorerProps, 'files' | 'fileComponent' | 'folderComponent' | 'cssModule' -> { - specs: Cypress.Cypress['spec'][] -} - -export const SpecList: React.FC = (props) => { - const files = React.useMemo(() => makeFileHierarchy(props.specs.map((spec) => spec.relative)), [props.specs]) - - return ( - <> - - - ) -} diff --git a/npm/design-system/src/index.scss b/npm/design-system/src/index.scss index 35b9f2ebd6..9e791431fa 100644 --- a/npm/design-system/src/index.scss +++ b/npm/design-system/src/index.scss @@ -1,7 +1,4 @@ // Color map -@import '~@fortawesome/fontawesome-free/css/all.min.css'; -@import '~normalize.css'; - $colors: ( black: rgba(0, 0, 0, 1), metal-90: rgba(33, 36, 38, 1), diff --git a/npm/design-system/src/index.ts b/npm/design-system/src/index.ts index 73d3ac3141..63dd402ee8 100644 --- a/npm/design-system/src/index.ts +++ b/npm/design-system/src/index.ts @@ -2,10 +2,6 @@ export * from './components/Button' export * from './components/CypressLogo/CypressLogo' -export * from './components/FileExplorer/FileExplorer' - -export * from './components/SpecList/SpecList' - export * from './components/SearchInput/SearchInput' export * from './components/Nav' diff --git a/npm/eslint-plugin-dev/lib/index.js b/npm/eslint-plugin-dev/lib/index.js index e9d94384a3..47beefa8f0 100644 --- a/npm/eslint-plugin-dev/lib/index.js +++ b/npm/eslint-plugin-dev/lib/index.js @@ -50,6 +50,8 @@ const baseRules = { 'error', 2, { + // TODO: fix this, we shouldn't need to ignore TemplateLiterals + 'ignoredNodes': ['TemplateLiteral'], 'SwitchCase': 1, 'MemberExpression': 0, }, @@ -193,7 +195,8 @@ const baseRules = { ], 'space-infix-ops': 'error', 'space-unary-ops': 'error', - 'template-curly-spacing': 'error', + // TODO: change this back to 'error' + 'template-curly-spacing': 'off', 'use-isnan': 'error', 'valid-typeof': 'error', } @@ -214,6 +217,9 @@ module.exports = { json: { 'sort-package-json': 'pro', }, + react: { + version: 'detect', + }, }, env: { node: true, @@ -252,12 +258,16 @@ module.exports = { }, }, { - files: '*.ts', + files: [ + '*.ts', + '*.tsx', + ], parser: '@typescript-eslint/parser', plugins: [ '@typescript-eslint', ], rules: { + 'no-undef': 'off', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': [ 'error', diff --git a/npm/eslint-plugin-dev/package.json b/npm/eslint-plugin-dev/package.json index 80f911feb7..7fe732857e 100644 --- a/npm/eslint-plugin-dev/package.json +++ b/npm/eslint-plugin-dev/package.json @@ -17,9 +17,9 @@ "shelljs": "^0.8.3" }, "devDependencies": { - "eslint": "^6.1.0", + "eslint": "^7.22.0", "eslint-plugin-json-format": "^2.0.0", - "eslint-plugin-mocha": "^5.3.0", + "eslint-plugin-mocha": "^8.1.0", "eslint-plugin-promise": "^4.2.1", "jest": "^24.8.0", "jest-cli": "^24.8.0", @@ -33,7 +33,7 @@ "eslint": ">= 3.2.1", "eslint-plugin-json-format": ">= 2.0.0", "eslint-plugin-mocha": "^4.11.0", - "eslint-plugin-react": "^7.2.1" + "eslint-plugin-react": "^7.22.0" }, "bin": { "lint-changed": "./lib/scripts/lint-changed.js", @@ -54,4 +54,4 @@ "eslint", "eslintplugin" ] -} +} \ No newline at end of file diff --git a/npm/react/.eslintrc b/npm/react/.eslintrc index fef43b39a0..1740aa1a0b 100644 --- a/npm/react/.eslintrc +++ b/npm/react/.eslintrc @@ -12,6 +12,7 @@ "env": { "cypress/globals": true }, + "root": true, "globals": { "jest": "readonly" }, diff --git a/npm/react/.releaserc.js b/npm/react/.releaserc.js index 00efa3cd4f..b7e7a76285 100644 --- a/npm/react/.releaserc.js +++ b/npm/react/.releaserc.js @@ -1,3 +1,9 @@ +/** + * NOTICE + * Disable the release for React until further notice. + * You may re-enable it by toggling publishConfig: restricted/public + * and uncommenting the following lines + */ module.exports = { ...require('../../.releaserc.base'), branches: [ diff --git a/npm/react/CHANGELOG.md b/npm/react/CHANGELOG.md index 88545e5633..92f9e1bcc1 100644 --- a/npm/react/CHANGELOG.md +++ b/npm/react/CHANGELOG.md @@ -39,14 +39,6 @@ # [@cypress/react-v5.0.1](https://github.com/cypress-io/cypress/compare/@cypress/react-v5.0.0...@cypress/react-v5.0.1) (2021-02-17) - -### Bug Fixes - -* trigger semantic release ([#15128](https://github.com/cypress-io/cypress/issues/15128)) ([3a6f3b1](https://github.com/cypress-io/cypress/commit/3a6f3b1928277f7086062b1107f424e5a0247e00)) - -# [@cypress/react-v5.0.0](https://github.com/cypress-io/cypress/compare/@cypress/react-v4.16.4...@cypress/react-v5.0.0) (2021-02-17) - - ### Bug Fixes * update dependencies of npm/react-vue ([#15095](https://github.com/cypress-io/cypress/issues/15095)) ([e028262](https://github.com/cypress-io/cypress/commit/e028262aed485865c4f40162c1f8102970ef91f8)) @@ -60,31 +52,11 @@ ### BREAKING CHANGES -* change of architecture for -component testing - -Co-authored-by: Dmitriy Kovalenko - -# [@cypress/react-v5.0.0](https://github.com/cypress-io/cypress/compare/@cypress/react-v4.16.4...@cypress/react-v5.0.0) (2021-02-16) - - -### Bug Fixes - -* update dependencies of npm/react-vue ([#15095](https://github.com/cypress-io/cypress/issues/15095)) ([e028262](https://github.com/cypress-io/cypress/commit/e028262aed485865c4f40162c1f8102970ef91f8)) -* **component-testing:** make content adjust to size of window ([#14876](https://github.com/cypress-io/cypress/issues/14876)) ([4cf3896](https://github.com/cypress-io/cypress/commit/4cf3896ecbb074831709f73f22768457fdaf5779)) - - -### Features - -* component testing ([#14479](https://github.com/cypress-io/cypress/issues/14479)) ([af26fbe](https://github.com/cypress-io/cypress/commit/af26fbebe6bc609132013a0493a116cc78bb1bd4)) - - -### BREAKING CHANGES - -* change of architecture for -component testing - -Co-authored-by: Dmitriy Kovalenko +* Added the need to install a preprocessor or a dev-server plugin +* Removed the pre-instalation of test coverage + * Install it manually by following [the documentation](https://docs.cypress.io/guides/tooling/code-coverage.html#Introduction) +* removed the pre-installation of `cypress-react-selector` + * If you use `cy.react()` in your tests, the command will not work anymore. [Install it back in your support file](https://www.npmjs.com/package/cypress-react-selector) # [@cypress/react-v4.16.4](https://github.com/cypress-io/cypress/compare/@cypress/react-v4.16.3...@cypress/react-v4.16.4) (2021-01-27) diff --git a/npm/react/README.md b/npm/react/README.md index e762a4a0e4..82e02aa834 100644 --- a/npm/react/README.md +++ b/npm/react/README.md @@ -1,4 +1,4 @@ -> A little helper to unit test React components in the open source [Cypress.io](https://www.cypress.io/) E2E test runner **v4.5.0+** +> A little helper to unit test React components in the open source [Cypress.io](https://www.cypress.io/) test runner **v7.0.0+** **Jump to:** [Comparison](#comparison), [Blog posts](#blog-posts), [Install](#install), Examples: [basic](#basic-examples), [advanced](#advanced-examples), [full](#full-examples), [external](#external-examples), [Style options](#options), [Code coverage](#code-coverage), [Visual testing](#visual-testing), [Common problems](#common-problems), [Chat](#chat) @@ -8,9 +8,9 @@ ![Example component test](images/dynamic.gif) -- How is this different from [Enzyme](https://github.com/airbnb/enzyme) or [RTL](https://testing-library.com/docs/react-testing-library/intro)? It is similar in functionality BUT runs the component in the real browser with full power of Cypress E2E test runner: [live GUI, full API, screen recording, CI support, cross-platform](https://www.cypress.io/features/), and [visual testing](https://on.cypress.io/visual-testing). Ohh, and the code coverage is built-in! +- How is this different from [Enzyme](https://github.com/airbnb/enzyme) or [RTL](https://testing-library.com/docs/react-testing-library/intro)? It is similar in functionality BUT runs the component in the real browser with full power of Cypress E2E test runner: [live GUI, full API, screen recording, CI support, cross-platform](https://www.cypress.io/features/), and [visual testing](https://on.cypress.io/visual-testing). - If you like using `@testing-library/react`, you can use `@testing-library/cypress` for the same `findBy`, `queryBy` commands, see one of the examples in the list below -- Read [My Vision for Component Tests in Cypress](https://glebbahmutov.com/blog/my-vision-for-component-tests/) +- Read [My Vision for Component Tests in Cypress](https://glebbahmutov.com/blog/my-vision-for-component-tests/) by Gleb Bahmutov ## Comparison @@ -54,10 +54,10 @@ If you are coming from Enzyme world, check out the [enzyme](cypress/component/ba ## Install -Requires [Node](https://nodejs.org/en/) version 8 or above. +Requires [Node](https://nodejs.org/en/) version 12 or above. ```sh -npm install --save-dev cypress @cypress/react +npm install --save-dev cypress @cypress/react @cypress/webpack-dev-server ``` ## Init @@ -294,6 +294,20 @@ If your React and React DOM libraries are installed in non-standard paths (think +You may also specify the `ReactDOM` package to use. This can be useful in complex monorepo setups that have different versions of React and React DOM installed. If you see an error relating to [mismatching versions of React or React DOM](https://reactjs.org/warnings/invalid-hook-call-warning.html#mismatching-versions-of-react-and-react-dom), this may be the solution. You can do this using the `ReactDom` option: + +```jsx +// if you have multiple versions of ReactDom in your monorepo +import ReactDom from 'react-dom' + +mount(, { + stylesheets: [ + 'https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.2/css/bulma.css', + ], + ReactDom +}) +``` + ## Code coverage In order to use code coverage you can follow the instructions from [docs](https://github.com/cypress-io/code-coverage). In most of cases you need to install 2 dependencies: @@ -357,44 +371,13 @@ Finally, when running tests on the continuous integration service, the true test -
    - Slow bundling - -When you bundle spec file, you are now bundling React, Read DOM and other libraries, which is might be slow. For now, you can disable inline source maps by adding to your Webpack config settings (if available) the following: - -```js -const webpackOptions = { - devtool: false, -} -``` - -Keep your eye on issue [#9663](https://github.com/cypress-io/cypress/issues/9663) for more information. - -
    - -
    - Missing code coverage - -If you are using your custom Webpack, this plugin might be missing code coverage information because the code was not instrumented. We try to insert the `babel-plugin-istanbul` plugin automatically, but your bundling might not use Babel, or configure it differently, preventing plugin insertion. Please let us know by opening an issue with full reproducible details. - -See related issue [#141](https://github.com/bahmutov/cypress-react-unit-test/react/issues/141). You can also debug the plugin's behavior by running it with `DEBUG` environment variable, see [#debugging](#debugging) section. - -
    - -
    - Gatsby.js projects not supported - -Currently, this project cannot find Webpack settings used by Gatsby.js, thus it cannot bundle specs and application code correctly. Keep an eye on [#307](https://github.com/cypress-io/cypress/issues/9671) - -
    - ## Context Provider usage React context provider usage and API described in [./docs/providers-and-composition.md](./docs/providers-and-composition.md) ## Chat -We have a chat workspace at [https://component-testing.slack.com/](https://component-testing.slack.com/), you are welcome to [join us](https://join.slack.com/t/component-testing/shared_invite/zt-h93lrgsl-8WzE8yNQlcZuZji_gA_mtg). +Come chat with us [on discord](https://discord.gg/7ZHYhZSW) in the #component-testing channel. ## Development @@ -418,12 +401,9 @@ DEBUG=@cypress/react,find-webpack Same feature for unit testing components from other frameworks using Cypress -- [cypress-vue-unit-test](https://github.com/bahmutov/cypress-vue-unit-test) +- [@cypress/vue](https://github.com/cypress-io/cypress/tree/develop/npm/vue) - [cypress-cycle-unit-test](https://github.com/bahmutov/cypress-cycle-unit-test) - [cypress-svelte-unit-test](https://github.com/bahmutov/cypress-svelte-unit-test) - [cypress-angular-unit-test](https://github.com/bahmutov/cypress-angular-unit-test) - [cypress-hyperapp-unit-test](https://github.com/bahmutov/cypress-hyperapp-unit-test) - [cypress-angularjs-unit-test](https://github.com/bahmutov/cypress-angularjs-unit-test) - -[renovate-badge]: https://img.shields.io/badge/renovate-app-blue.svg -[renovate-app]: https://renovateapp.com/ diff --git a/npm/react/cypress.json b/npm/react/cypress.json index 2d77a5b265..a6b5db93e7 100644 --- a/npm/react/cypress.json +++ b/npm/react/cypress.json @@ -11,6 +11,5 @@ "**/__snapshots__/*", "**/__image_snapshots__/*" ], - "experimentalComponentTesting": true, "experimentalFetchPolyfill": true -} +} \ No newline at end of file diff --git a/npm/react/cypress/component/advanced/lazy-loaded-suspense/LazyComponent.tsx b/npm/react/cypress/component/advanced/lazy-loaded-suspense/LazyComponent.tsx index c5675f25b0..05410fe818 100644 --- a/npm/react/cypress/component/advanced/lazy-loaded-suspense/LazyComponent.tsx +++ b/npm/react/cypress/component/advanced/lazy-loaded-suspense/LazyComponent.tsx @@ -1,6 +1,9 @@ import * as React from 'react' -const LazyDog = React.lazy(() => import(/* webpackChunkName: "Dog" */ './Dog')) +const LazyDog = React.lazy(() => { + return import(/* webpackChunkName: "Dog" */ './Dog') + .then((comp) => new Promise((resolve) => setTimeout(() => resolve(comp), 10))) +}) interface LazyComponentProps {} diff --git a/npm/react/cypress/component/advanced/material-ui-example/button-spec.js b/npm/react/cypress/component/advanced/material-ui-example/button-spec.js index 461ac0c0b2..0085c9a34b 100644 --- a/npm/react/cypress/component/advanced/material-ui-example/button-spec.js +++ b/npm/react/cypress/component/advanced/material-ui-example/button-spec.js @@ -9,3 +9,11 @@ it('renders a button', () => { , ) }) + +it('renders a button with an icon', () => { + mount( + , + ) +}) diff --git a/npm/react/cypress/component/advanced/renderless/mouse-movement.js b/npm/react/cypress/component/advanced/renderless/mouse-movement.js index b14d77cd72..8e838c58b2 100644 --- a/npm/react/cypress/component/advanced/renderless/mouse-movement.js +++ b/npm/react/cypress/component/advanced/renderless/mouse-movement.js @@ -43,6 +43,7 @@ export default class MouseMovement extends React.Component { clearTimeout(this.state.timer) this.props.onMoved(false) } + render () { return null } diff --git a/npm/react/cypress/component/advanced/renderless/mouse-spec.js b/npm/react/cypress/component/advanced/renderless/mouse-spec.js index caadc4fd5e..8cf8aa87b8 100644 --- a/npm/react/cypress/component/advanced/renderless/mouse-spec.js +++ b/npm/react/cypress/component/advanced/renderless/mouse-spec.js @@ -31,7 +31,13 @@ describe('Renderless component', () => { cy.get('@log') .invoke('getCalls') - .then((calls) => calls.map((call) => call.args[0])) + .then((calls) => { + return calls.map((call) => { + console.log('one', call.args[0]) + + return call.args[0] + }) + }) .should('deep.equal', [ 'MouseMovement constructor', 'MouseMovement componentWillMount', diff --git a/npm/react/cypress/component/basic/error-boundary-spec.js b/npm/react/cypress/component/basic/error-boundary-spec.js index 48eaa81ab2..b5a4cf0363 100644 --- a/npm/react/cypress/component/basic/error-boundary-spec.js +++ b/npm/react/cypress/component/basic/error-boundary-spec.js @@ -29,15 +29,20 @@ describe('Error Boundary', () => { }) it('on error, display fallback UI', () => { - try { - mount( - - - , - ) - } catch (e) { - // do nothing - } + // Error boundaries do not stop an uncaught error from propagating. + // Cypress will fail on uncaught exceptions by default, so we need to suppress that behavior. + cy.on('uncaught:exception', (err) => { + // Assert that we are only suppressing the default behavior for the error we expect. + expect(err.message.includes('I crashed!')).to.be.true + + return false + }) + + mount( + + + , + ) cy.get('header h1').should('contain', 'Something went wrong.') cy.get('header h3').should('contain', 'ChildWithError failed to load') diff --git a/npm/react/cypress/plugins/index.js b/npm/react/cypress/plugins/index.js index 9aa6e0a55c..036b2a068a 100644 --- a/npm/react/cypress/plugins/index.js +++ b/npm/react/cypress/plugins/index.js @@ -61,6 +61,10 @@ const webpackConfig = { * @type Cypress.PluginConfig */ module.exports = (on, config) => { + if (config.testingType !== 'component') { + throw Error(`This is a component testing project. testingType should be 'component'. Received ${config.testingType}`) + } + on('dev-server:start', (options) => { return startDevServer({ options, webpackConfig, disableLazyCompilation: false }) }) diff --git a/npm/react/docs/recipes.md b/npm/react/docs/recipes.md index b8ada21c96..6a476309d3 100644 --- a/npm/react/docs/recipes.md +++ b/npm/react/docs/recipes.md @@ -1,22 +1,28 @@ # Recipes - [Recipes](#recipes) - - [Do nothing](#do-nothing) - - [React Scripts](#react-scripts) - - [Next.js](#nextjs) - - [Your webpack config](#your-webpack-config) - - [Your `.babelrc` file](#your-babelrc-file) - - [Add Babel plugins](#add-babel-plugins) + - [Configuration](#configuration) + - [Do nothing](#do-nothing) + - [React Scripts](#react-scripts) + - [Next.js](#nextjs) + - [Your Webpack config](#your-webpack-config) + - [Your `.babelrc` file](#your-babelrc-file) + - [Add Babel plugins](#add-babel-plugins) + - [Using rollup config](#using-rollup-config) + - [Usage](#usage) + - [Changing props](#changing-props) -## Do nothing +## Configuration + +### Do nothing Cypress Test Runner understands plain JSX by default, so for simple React applications it ... might just test components right out of the box! But usually you want to point Cypress at your application's current Webpack configuration, so the specs can import your components correctly. The next recipes discuss common ways for doing this. -## React Scripts +### React Scripts -If you are using Create-React-App v3 or `react-scripts`, and want to reuse the built in webpack (even after ejecting), this module ships with Cypress preprocessor in [plugins](plugins) folder. +If you are using Create-React-App v3 or `react-scripts`, and want to reuse the built in Webpack (even after ejecting), this module ships with Cypress preprocessor in [plugins](plugins) folder. ```js // cypress/plugins/index.js @@ -32,7 +38,7 @@ See example repo [bahmutov/try-cra-with-unit-test](https://github.com/bahmutov/t **Tip:** `plugins/react-scripts` is just loading `plugins/cra-v3`. -## Next.js +### Next.js ```js // cypress/plugins/index.js @@ -46,9 +52,9 @@ module.exports = (on, config) => { See example in the folder [examples/nextjs](examples/nextjs). -## Your webpack config +### Your Webpack config -If you have your own webpack config, you can use included plugins file to load it. You can pass the webpack config file name (with respect to the root folder where `cypress.json` file sits) via plugins file or via an `env` variable in `cypress.json` +If you have your own Webpack config, you can use included plugins file to load it. You can pass the Webpack config file name (with respect to the root folder where `cypress.json` file sits) via plugins file or via an `env` variable in `cypress.json` ```js // cypress/plugins/index.js @@ -64,7 +70,7 @@ module.exports = (on, config) => { See example in [bahmutov/Jscrambler-Webpack-React](https://github.com/bahmutov/Jscrambler-Webpack-React) or included example in the folder [examples/webpack-file](examples/webpack-file). -## Your `.babelrc` file +### Your `.babelrc` file If you are using Babel without Webpack to transpile, you can use the plugin that tells Babel loader to use your `.babelrc` configuration file. @@ -81,7 +87,7 @@ module.exports = (on, config) => { See example in the folder [examples/using-babel](examples/using-babel) and [examples/using-babel-typescript](examples/using-babel-typescript). -### Add Babel plugins +#### Add Babel plugins If you want to use code instrumentation, add the [babel-plugin-istanbul](https://github.com/istanbuljs/babel-plugin-istanbul) to your `.babelrc` setup. You do not even need to install it separately, as it is already included in `@cypress/react` as a dependency. @@ -125,7 +131,7 @@ When loading your `.babelrc` settings, `@cypress/react` sets `BABEL_ENV` and `NO See [examples/using-babel](examples/using-babel) folder for full example. -### Using rollup config +#### Using rollup config If you are using rollup for bundling – we can use it as well for the bundling. Check the example: @@ -158,3 +164,83 @@ replace({ 'process.env.NODE_ENV': JSON.stringify('development') }), ``` See [examples/rollup](examples/rollup) folder for full example. + +## Usage + +### Changing props + +Many components have some statefulness, whether explicitly through `useState`, or implicitly through `useEffect`. Therefore during testing it is useful to keep the component mounted, but change the props being passed to it in order to preserve its state. This is referred to in some testing frameworks as `rerender()`. + +We recommend building a "wrapper" component that acts similarly to how your users will interact with the component under test. In isolation, you can add DOM controls to push new props to your component. + +```js +const Accumulator = ({ value }) => { + const [storedValues, setStoredValues] = React.useState([]) + + React.useEffect(() => { + if (!value) { + return + } + + setStoredValues((prev) => [...prev, value]) + }, [value]) + + return ( +
      + {storedValues.map((v) => ( +
    • + {v} +
    • + ))} +
    + ) +} +``` + +This component is an accumulator that stores each `value` prop passed to it. We create a wrapper component that has an `input` and a `button` to push new values to the `value` prop. + +```js +const TestAcc = () => { + const ref = React.useRef() + const [value, setValue] = React.useState() + + return ( +
    + + + +
    + ) +} +``` + +With this, we can begin writing component tests to check the functionality of our `Accumulator` component. + +```js +it('should store value', () => { + mount() + + cy.get('input').type('Component testing is awesome!') + cy.get('button').click() + + cy.get('li').eq(0).contains('Component testing is awesome!') + + cy.get('input').clear().type('We are dynamically changing props') + cy.get('button').click() + + cy.get('li').eq(1).contains('We are dynamically changing props') + + cy.get('input').clear().type('to build a list of text') + cy.get('button').click() + + cy.get('li').eq(0).contains('Component testing is awesome!') + cy.get('li').eq(1).contains('We are dynamically changing props') + cy.get('li').eq(2).contains('to build a list of text') +}) +``` \ No newline at end of file diff --git a/npm/react/examples/a11y/cypress.json b/npm/react/examples/a11y/cypress.json index e720a77150..49b616efaf 100644 --- a/npm/react/examples/a11y/cypress.json +++ b/npm/react/examples/a11y/cypress.json @@ -3,6 +3,5 @@ "fixturesFolder": false, "testFiles": "**/*spec.js", "viewportWidth": 500, - "viewportHeight": 500, - "experimentalComponentTesting": true -} + "viewportHeight": 500 +} \ No newline at end of file diff --git a/npm/react/examples/nextjs/cypress.json b/npm/react/examples/nextjs/cypress.json index 57d871c568..a281a06f60 100644 --- a/npm/react/examples/nextjs/cypress.json +++ b/npm/react/examples/nextjs/cypress.json @@ -3,10 +3,9 @@ "testFiles": "**/*.spec.{js,jsx}", "viewportWidth": 500, "viewportHeight": 800, - "experimentalComponentTesting": true, "experimentalFetchPolyfill": true, "componentFolder": "cypress/components", "env": { "coverage": true } -} +} \ No newline at end of file diff --git a/npm/react/examples/nextjs/cypress/components/Router.spec.jsx b/npm/react/examples/nextjs/cypress/components/Router.spec.jsx index 18247fc016..c298ff7532 100644 --- a/npm/react/examples/nextjs/cypress/components/Router.spec.jsx +++ b/npm/react/examples/nextjs/cypress/components/Router.spec.jsx @@ -2,7 +2,6 @@ /// import * as React from 'react' import RouterPage from '../../pages/router' -import { createRouter } from 'next/router' import { RouterContext } from 'next/dist/next-server/lib/router-context' import { mount } from '@cypress/react' @@ -22,6 +21,9 @@ describe('Component with router usage', () => { reload: cy.spy(), back: cy.spy(), prefetch: cy.spy(), + isReady: true, + isPreview: false, + isLocaleDomain: false, beforePopState: cy.spy(), } @@ -34,33 +36,6 @@ describe('Component with router usage', () => { cy.contains('Next.js route /testPath') }) - it('renders the component that uses next.js with parsed query', () => { - // alternatively you can use next's internal `createRouter` function to create a real instance of NextRouter - const router = createRouter( - '/testPath', - { param1: 'param1' }, - '/asTestPath', - { - subscription: cy.spy(), - initialProps: {}, - App: cy.spy(), - Component: cy.spy(), - pageLoader: cy.spy(), - initialStyleSheets: [], - wrapApp: cy.spy(), - isFallback: false, - }, - ) - - mount( - - - , - ) - - cy.contains('My query: {"param1":"param1"}') - }) - it('pushes the new route', () => { const router = { pathname: '/router', @@ -76,6 +51,9 @@ describe('Component with router usage', () => { reload: cy.spy(), back: cy.spy(), prefetch: cy.spy(), + isReady: true, + isPreview: false, + isLocaleDomain: false, beforePopState: cy.spy(), } diff --git a/npm/react/examples/nextjs/package.json b/npm/react/examples/nextjs/package.json index 9da84e27ef..cf8b78555a 100644 --- a/npm/react/examples/nextjs/package.json +++ b/npm/react/examples/nextjs/package.json @@ -15,12 +15,11 @@ "devDependencies": { "@cypress/react": "file:../../dist", "@mdx-js/loader": "^1.6.16", - "@next/mdx": "10.0.7", + "@next/mdx": "10.1.2", "@zeit/next-sass": "^1.0.1", "check-code-coverage": "1.9.2", "cypress-circleci-reporter": "0.2.0", - "next": "10.0.7", - "webpack": "^4.44.2" + "next": "10.1.2" }, "license": "MIT" } diff --git a/npm/react/examples/nextjs/yarn.lock b/npm/react/examples/nextjs/yarn.lock index 7c18f003f0..8d575591d7 100644 --- a/npm/react/examples/nextjs/yarn.lock +++ b/npm/react/examples/nextjs/yarn.lock @@ -302,25 +302,25 @@ resolved "https://registry.yarnpkg.com/@mdx-js/util/-/util-1.6.18.tgz#c7563bf72cb4520b8b7100b64006a64be717e936" integrity sha512-axMe+NoLF55OlXPbhRn4GNCHcL1f5W3V3c0dWzg05S9JXm3Ecpxzxaht3g3vTP0dcqBL/yh/xCvzK0ZpO54Eug== -"@next/env@10.0.7": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@next/env/-/env-10.0.7.tgz#7b3e87a9029ca37491e2ec25c27593f0906725f9" - integrity sha512-/vnz2SL/mk3Tei58WfRtVnvz5xHmAqcBmZL5sTBEy1CZG6OtZGNx0qAFCjtVkeJ5m1Bh4Ut+WFh/RF333wx8Sg== +"@next/env@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@next/env/-/env-10.1.2.tgz#04888eb7115a5b0633dc59e321e5c952917a39d5" + integrity sha512-G6kEq7dr7f+unVTUL74lIaB6njB73vEMVi7AhujaNnNZr6z8jQ43jCjNyawQsNyoNWsRo/9x6x9W72PbrGmy/w== -"@next/mdx@10.0.7": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@next/mdx/-/mdx-10.0.7.tgz#c4de220ad5e4c38297c2972f2d1f7e2107b88477" - integrity sha512-joaEBSh+P6YpRIrRti4OoDCn6sEMxUb00q2Hd29s4/oGAVOmgo7nRCSRoy99i/uGK2IMBjPksSrHTLwW+bcG5A== +"@next/mdx@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@next/mdx/-/mdx-10.1.2.tgz#8a93cb9546f2ad93c1a0850b75b13c5f8ebc4573" + integrity sha512-yomUJudRX/iAxDafWwL23Grpgw5Eu5NuLPwTHxyXEsRnMOiwQlhAlHSye3BhxXrZaMAt08RYM75Mc3jeqoz6Sg== -"@next/polyfill-module@10.0.7": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.0.7.tgz#ec45ec1f28f47beed15ed67dffc907edd7143094" - integrity sha512-HxqzRpoSgmZP0kRIWwH+e0SgtAXqJ0VkYtwWcsQFED8+xF4Eqn+7Twyp4uE6hutC8gr8IFSFqH+DEYhRtg1ltQ== +"@next/polyfill-module@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@next/polyfill-module/-/polyfill-module-10.1.2.tgz#0cad99af18da0f90a63a25b60602ab46650017e6" + integrity sha512-9+xXb33HIPCrV0yM79blqwgLa+fkvm0gYs/wUDI0pPBCHkMpCZA/SWUeF/yKDY6qWO79H3B5pWTziLmzycQPWA== -"@next/react-dev-overlay@10.0.7": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.0.7.tgz#5fe777011cab75ec09ad539ee61bb95ab5a2bdeb" - integrity sha512-yq71MDHVqN2N+IqOvZDiFsMpQrBcymrdpTx1ShhAADX7cWQvW4dhcIir4BbfrS10vS1LLz/3a8uKZkGdNoJj3w== +"@next/react-dev-overlay@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@next/react-dev-overlay/-/react-dev-overlay-10.1.2.tgz#e98edfdc7fbed4d0cb333594469c7fa62f96e6df" + integrity sha512-B81nhgkWr+MbDAXN9I38WIdhAKayfIzrnOXXF2MS4VgxyHBvYQQfmobNNE0XBByyDn0+Ww5s9xg3L6Shh9kWKA== dependencies: "@babel/code-frame" "7.12.11" anser "1.4.9" @@ -334,10 +334,10 @@ stacktrace-parser "0.1.10" strip-ansi "6.0.0" -"@next/react-refresh-utils@10.0.7": - version "10.0.7" - resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.0.7.tgz#866ce30fe2f321e011255e81ed5d55eeda05894b" - integrity sha512-d/71vtQglv6m7sh4W1O9drc2hYti7UnAdEXfBLZAS354g2S80lvCRGIhbDrMx4w0rpShoxBIZboE2++LihAESg== +"@next/react-refresh-utils@10.1.2": + version "10.1.2" + resolved "https://registry.yarnpkg.com/@next/react-refresh-utils/-/react-refresh-utils-10.1.2.tgz#1c60150bb3f004fb9dd02db387a952483e6e2e4c" + integrity sha512-SQvtCt6nNOkGKddidQehxtJKMkoapg/kbLy/HwrqU8WdVrVVAk8JQw/QjDHVEsdezRxspeNKbho4L+3jl4c9rw== "@oozcitak/dom@1.15.8": version "1.15.8" @@ -455,161 +455,6 @@ resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.3.tgz#9c088679876f374eb5983f150d4787aa6fb32d7e" integrity sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ== -"@webassemblyjs/ast@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" - integrity sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA== - dependencies: - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - -"@webassemblyjs/floating-point-hex-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz#3c3d3b271bddfc84deb00f71344438311d52ffb4" - integrity sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA== - -"@webassemblyjs/helper-api-error@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz#203f676e333b96c9da2eeab3ccef33c45928b6a2" - integrity sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw== - -"@webassemblyjs/helper-buffer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz#a1442d269c5feb23fcbc9ef759dac3547f29de00" - integrity sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA== - -"@webassemblyjs/helper-code-frame@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz#647f8892cd2043a82ac0c8c5e75c36f1d9159f27" - integrity sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA== - dependencies: - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/helper-fsm@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz#c05256b71244214671f4b08ec108ad63b70eddb8" - integrity sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw== - -"@webassemblyjs/helper-module-context@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz#25d8884b76839871a08a6c6f806c3979ef712f07" - integrity sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g== - dependencies: - "@webassemblyjs/ast" "1.9.0" - -"@webassemblyjs/helper-wasm-bytecode@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz#4fed8beac9b8c14f8c58b70d124d549dd1fe5790" - integrity sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw== - -"@webassemblyjs/helper-wasm-section@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz#5a4138d5a6292ba18b04c5ae49717e4167965346" - integrity sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - -"@webassemblyjs/ieee754@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz#15c7a0fbaae83fb26143bbacf6d6df1702ad39e4" - integrity sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz#f19ca0b76a6dc55623a09cffa769e838fa1e1c95" - integrity sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz#04d33b636f78e6a6813227e82402f7637b6229ab" - integrity sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w== - -"@webassemblyjs/wasm-edit@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz#3fe6d79d3f0f922183aa86002c42dd256cfee9cf" - integrity sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/helper-wasm-section" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-opt" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - "@webassemblyjs/wast-printer" "1.9.0" - -"@webassemblyjs/wasm-gen@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz#50bc70ec68ded8e2763b01a1418bf43491a7a49c" - integrity sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wasm-opt@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz#2211181e5b31326443cc8112eb9f0b9028721a61" - integrity sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-buffer" "1.9.0" - "@webassemblyjs/wasm-gen" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - -"@webassemblyjs/wasm-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz#9d48e44826df4a6598294aa6c87469d642fff65e" - integrity sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-wasm-bytecode" "1.9.0" - "@webassemblyjs/ieee754" "1.9.0" - "@webassemblyjs/leb128" "1.9.0" - "@webassemblyjs/utf8" "1.9.0" - -"@webassemblyjs/wast-parser@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz#3031115d79ac5bd261556cecc3fa90a3ef451914" - integrity sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/floating-point-hex-parser" "1.9.0" - "@webassemblyjs/helper-api-error" "1.9.0" - "@webassemblyjs/helper-code-frame" "1.9.0" - "@webassemblyjs/helper-fsm" "1.9.0" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/wast-printer@1.9.0": - version "1.9.0" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz#4935d54c85fef637b00ce9f52377451d00d47899" - integrity sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/wast-parser" "1.9.0" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - "@zeit/next-css@1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@zeit/next-css/-/next-css-1.0.1.tgz#4f784e841e7ca1b21b3468a902e2c1fa95a3e75c" @@ -630,17 +475,12 @@ "@zeit/next-css" "1.0.1" sass-loader "6.0.6" -acorn@^6.4.1: - version "6.4.2" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" - integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== - ajv-errors@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: +ajv-keywords@^3.1.0: version "3.5.2" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== @@ -655,16 +495,6 @@ ajv@^6.1.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^6.10.2: - version "6.12.6" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - 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" - anser@1.4.9: version "1.4.9" resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.9.tgz#1f85423a5dcf8da4631a341665ff675b96845760" @@ -675,11 +505,6 @@ ansi-regex@^2.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - ansi-regex@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" @@ -704,14 +529,6 @@ ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" -anymatch@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw== - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - anymatch@~3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" @@ -720,19 +537,6 @@ anymatch@~3.1.1: normalize-path "^3.0.0" picomatch "^2.0.4" -aproba@^1.0.3, aproba@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== - -are-we-there-yet@~1.1.2: - version "1.1.5" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" - integrity sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w== - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - arg@4.1.3: version "4.1.3" resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" @@ -745,30 +549,10 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-flatten@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-3.0.0.tgz#6428ca2ee52c7b823192ec600fa3ed2f157cd541" - integrity sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA== - -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= asn1.js@^5.2.0: version "5.4.1" @@ -780,6 +564,16 @@ asn1.js@^5.2.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" +assert@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/assert/-/assert-2.0.0.tgz#95fc1c616d48713510680f2eaf2d10dd22e02d32" + integrity sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A== + dependencies: + es6-object-assign "^1.1.0" + is-nan "^1.2.1" + object-is "^1.0.1" + util "^0.12.0" + assert@^1.1.1: version "1.5.0" resolved "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz#55c109aaf6e0aefdb3dc4b71240c70bf574b18eb" @@ -788,21 +582,11 @@ assert@^1.1.1: object-assign "^4.1.1" util "0.10.3" -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - ast-types@0.13.2: version "0.13.2" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.2.tgz#df39b677a911a83f3a049644fb74fdded23cea48" integrity sha512-uWMHxJxtfj/1oZClOxDEV1sQ1HCDkA4MG8Gr69KKeBjEVH0R84WlejZ0y2DcwyBlpAEMltmVYkVgqfLFb2oyiA== -async-each@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== - async@^2.1.5: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" @@ -810,10 +594,12 @@ async@^2.1.5: dependencies: lodash "^4.17.14" -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +available-typed-arrays@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" + integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== + dependencies: + array-filter "^1.0.0" babel-code-frame@^6.26.0: version "6.26.0" @@ -849,70 +635,21 @@ bail@^1.0.0: resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - base64-js@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g== -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== -binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw== - binary-extensions@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== -bindings@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== - dependencies: - file-uri-to-path "1.0.0" - -bl@^4.0.3: - version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" - integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== - dependencies: - buffer "^5.5.0" - inherits "^2.0.4" - readable-stream "^3.4.0" - -bluebird@^3.5.5: - version "3.7.2" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== - bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" @@ -923,30 +660,6 @@ bn.js@^5.1.1: resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -1013,7 +726,7 @@ browserify-sign@^4.0.0: readable-stream "^3.6.0" safe-buffer "^5.2.0" -browserify-zlib@^0.2.0: +browserify-zlib@0.2.0, browserify-zlib@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz#2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f" integrity sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA== @@ -1031,11 +744,6 @@ browserslist@4.16.1: escalade "^3.1.1" node-releases "^1.1.69" -buffer-from@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== - buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -1058,14 +766,6 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -buffer@^5.5.0: - version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" - integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.1.13" - builtin-status-codes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8" @@ -1076,42 +776,6 @@ bytes@3.1.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg== -cacache@^12.0.2: - version "12.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz#668bcbd105aeb5f1d92fe25570ec9525c8faa40c" - integrity sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ== - dependencies: - bluebird "^3.5.5" - chownr "^1.1.1" - figgy-pudding "^3.5.1" - glob "^7.1.4" - graceful-fs "^4.1.15" - infer-owner "^1.0.3" - lru-cache "^5.1.1" - mississippi "^3.0.0" - mkdirp "^0.5.1" - move-concurrently "^1.0.1" - promise-inflight "^1.0.1" - rimraf "^2.6.3" - ssri "^6.0.1" - unique-filename "^1.1.1" - y18n "^4.0.0" - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - cacheable-lookup@^4.1.1: version "4.3.0" resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-4.3.0.tgz#86ff1cb38f648cc6aba28feffe008f808b403550" @@ -1130,6 +794,14 @@ cacheable-request@^7.0.1: normalize-url "^4.1.0" responselike "^2.0.0" +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" @@ -1217,7 +889,7 @@ check-code-coverage@1.9.2: got "11.1.0" lodash "4.17.15" -chokidar@3.5.1, chokidar@^3.4.1: +chokidar@3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a" integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw== @@ -1232,37 +904,6 @@ chokidar@3.5.1, chokidar@^3.4.1: optionalDependencies: fsevents "~2.3.1" -chokidar@^2.1.8: - version "2.1.8" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg== - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - -chownr@^1.1.1: - version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" - integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== - -chrome-trace-event@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz#234090ee97c7d4ad1a2c4beae27505deffc608a4" - integrity sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ== - dependencies: - tslib "^1.9.0" - cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -1271,16 +912,6 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - classnames@2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" @@ -1303,25 +934,12 @@ clone-response@^1.0.2: dependencies: mimic-response "^1.0.0" -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - collapse-white-space@^1.0.2: version "1.0.6" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.6.tgz#e63629c0016665792060dbbeb79c42239d2c5287" integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - -color-convert@^1.9.0, color-convert@^1.9.1: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -1340,27 +958,11 @@ color-name@1.1.3: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= -color-name@^1.0.0, color-name@~1.1.4: +color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.5.4: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/color/-/color-3.1.3.tgz#ca67fb4e7b97d611dcde39eceed422067d91596e" - integrity sha512-xgXAcTHa2HeFCGLE9Xs/R82hujGtu9Jd9x4NW3T34+OMs7VoPsjwzRczKHvTAHeJwWFwX5j15+MgAppE8ztObQ== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.4" - colorette@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" @@ -1371,47 +973,17 @@ comma-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz#632b80b6117867a158f1080ad498b2fbe7e3f5ea" integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -concat-stream@^1.5.0: - version "1.6.2" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - console-browserify@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz#67063cef57ceb6cf4993a2ab3a55840ae8c49336" integrity sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA== -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= - -constants-browserify@^1.0.0: +constants-browserify@1.0.0, constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" integrity sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U= @@ -1423,23 +995,6 @@ convert-source-map@1.7.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" -copy-concurrently@^1.0.0: - version "1.0.5" - resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" - integrity sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A== - dependencies: - aproba "^1.1.1" - fs-write-stream-atomic "^1.0.8" - iferr "^0.1.5" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.0" - -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1555,11 +1110,6 @@ cssnano-simple@1.2.2: cssnano-preset-simple "1.2.2" postcss "^7.0.32" -cyclist@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" - integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= - cypress-circleci-reporter@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/cypress-circleci-reporter/-/cypress-circleci-reporter-0.2.0.tgz#a3e1571694f4e21649a6af4d508e68948d23622d" @@ -1573,6 +1123,13 @@ data-uri-to-buffer@3.0.1: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== +debug@2: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + debug@4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" @@ -1580,13 +1137,6 @@ debug@4.1.1: dependencies: ms "^2.1.1" -debug@^2.2.0, debug@^2.3.3: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - debug@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1" @@ -1594,18 +1144,6 @@ debug@^4.1.0: dependencies: ms "2.1.2" -decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - -decompress-response@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-4.2.1.tgz#414023cc7a302da25ce2ec82d0d5238ccafd8986" - integrity sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw== - dependencies: - mimic-response "^2.0.0" - decompress-response@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-5.0.0.tgz#7849396e80e3d1eba8cb2f75ef4930f76461cb0f" @@ -1613,49 +1151,17 @@ decompress-response@^5.0.0: dependencies: mimic-response "^2.0.0" -decompress-response@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" - integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== - dependencies: - mimic-response "^3.1.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - defer-to-connect@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= +define-properties@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o= + object-keys "^1.0.12" depd@~1.1.2: version "1.1.2" @@ -1677,11 +1183,6 @@ detab@2.0.3: dependencies: repeat-string "^1.5.4" -detect-libc@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -1691,21 +1192,16 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +domain-browser@4.19.0: + version "4.19.0" + resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-4.19.0.tgz#1093e17c0a17dbd521182fe90d49ac1370054af1" + integrity sha512-fRA+BaAWOR/yr/t7T9E9GJztHPeFjj8U35ajyAjCDtAAnTn1Rc1f6W6VGPJrO1tkQv9zWu+JRof7z6oQtiYVFQ== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" integrity sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA== -duplexify@^3.4.2, duplexify@^3.6.0: - version "3.7.1" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz#2a4df5317f6ccfd91f86d6fd25d8d8a103b88309" - integrity sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g== - dependencies: - end-of-stream "^1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - electron-to-chromium@^1.3.634: version "1.3.680" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.680.tgz#88cc44bd2a85b46cf7521f714db57dd74d0cd488" @@ -1734,29 +1230,20 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== -end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: +encoding@0.1.13: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.1.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" -enhanced-resolve@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz#2f3cfd84dbe3b487f18f2db2ef1e064a571ca5ec" - integrity sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg== - dependencies: - graceful-fs "^4.1.2" - memory-fs "^0.5.0" - tapable "^1.0.0" - -errno@^0.1.3, errno@~0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f" - integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A== - dependencies: - prr "~1.0.1" - error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" @@ -1764,6 +1251,42 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.18.0-next.1, es-abstract@^1.18.0-next.2: + version "1.18.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw== + 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" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.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.0" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +es6-object-assign@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es6-object-assign/-/es6-object-assign-1.1.0.tgz#c2c3582656247c39ea107cb1e6652b6f9f24523c" + integrity sha1-wsNYJlYkfDnqEHyx5mUrb58kUjw= + escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -1774,36 +1297,11 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -eslint-scope@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz#ca03833310f6889a3264781aa82e63eb9cfe7848" - integrity sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg== - dependencies: - esrecurse "^4.1.0" - estraverse "^4.1.1" - esprima@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esrecurse@^4.1.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -1827,58 +1325,11 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-template@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" - integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - extracted-loader@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/extracted-loader/-/extracted-loader-1.0.4.tgz#e1a3f1791813c14091a1959e261e23e95dd90115" @@ -1899,26 +1350,6 @@ fastparse@^1.1.2: resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== -figgy-pudding@^3.5.1: - version "3.5.2" - resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" - integrity sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw== - -file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== - -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1935,15 +1366,6 @@ find-cache-dir@3.3.1: make-dir "^3.0.2" pkg-dir "^4.1.0" -find-cache-dir@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" - integrity sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ== - dependencies: - commondir "^1.0.1" - make-dir "^2.0.0" - pkg-dir "^3.0.0" - find-up@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -1951,13 +1373,6 @@ find-up@2.1.0: dependencies: locate-path "^2.0.0" -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - find-up@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" @@ -1966,20 +1381,12 @@ find-up@^4.0.0: locate-path "^5.0.0" path-exists "^4.0.0" -flush-write-stream@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" - integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== - dependencies: - inherits "^2.0.3" - readable-stream "^2.3.6" - for-in@^0.1.3: version "0.1.8" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.8.tgz#d8773908e31256109952b1fdb9b3fa867d2775e1" integrity sha1-2Hc5COMSVhCZUrH9ubP6hn0ndeE= -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= @@ -1991,73 +1398,42 @@ for-own@^1.0.0: dependencies: for-in "^1.0.1" -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - -from2@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" - integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= - dependencies: - inherits "^2.0.1" - readable-stream "^2.0.0" - -fs-constants@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" - integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== - -fs-write-stream-atomic@^1.0.8: - version "1.0.10" - resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" - integrity sha1-tH31NJPvkR33VzHnCp3tAYnbQMk= - dependencies: - graceful-fs "^4.1.2" - iferr "^0.1.5" - imurmurhash "^0.1.4" - readable-stream "1 || 2" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -fsevents@^1.2.7: - version "1.2.13" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== - dependencies: - bindings "^1.5.0" - nan "^2.12.1" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k= fsevents@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - integrity sha1-LANAXHU4w51+s3sxcCLjJfsBi/c= - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== gensync@^1.0.0-beta.1: version "1.0.0-beta.1" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + +get-orientation@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/get-orientation/-/get-orientation-1.1.2.tgz#20507928951814f8a91ded0a0e67b29dfab98947" + integrity sha512-/pViTfifW+gBbh/RnlFYHINvELT9Znt+SYyDKAUL6uV6By019AK/s+i9XP4jSwq7lwP38Fd8HVeTxym3+hkwmQ== + dependencies: + stream-parser "^0.3.1" + get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" @@ -2065,24 +1441,6 @@ get-stream@^5.0.0, get-stream@^5.1.0: dependencies: pump "^3.0.0" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -github-from-package@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" - integrity sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4= - -glob-parent@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - glob-parent@~5.1.0: version "5.1.1" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" @@ -2095,18 +1453,6 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.1.3, glob@^7.1.4: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - 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" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -2130,11 +1476,6 @@ got@11.1.0: p-cancelable "^2.0.0" responselike "^2.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.15: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - graceful-fs@^4.1.2: version "4.2.4" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" @@ -2147,6 +1488,11 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-bigints@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA== + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -2157,41 +1503,17 @@ has-flag@^4.0.0: resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - integrity sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk= +has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw== -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" + function-bind "^1.1.1" hash-base@^3.0.0: version "3.1.0" @@ -2320,7 +1642,7 @@ http2-wrapper@^1.0.0-beta.4.4: quick-lru "^5.1.1" resolve-alpn "^1.0.0" -https-browserify@^1.0.0: +https-browserify@1.0.0, https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" integrity sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM= @@ -2332,6 +1654,13 @@ iconv-lite@0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -2344,21 +1673,11 @@ icss-utils@^2.1.0: dependencies: postcss "^6.0.1" -ieee754@^1.1.13: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - ieee754@^1.1.4: version "1.1.13" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg== -iferr@^0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" - integrity sha1-xg7taebY/bazEEofy8ocGS3FtQE= - ignore-loader@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/ignore-loader/-/ignore-loader-0.1.2.tgz#d81f240376d0ba4f0d778972c3ad25874117a463" @@ -2386,29 +1705,6 @@ import-from@^2.1.0: dependencies: resolve-from "^3.0.0" -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - -infer-owner@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" - integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - inherits@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" @@ -2419,30 +1715,16 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@~1.3.0: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== inline-style-parser@0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/inline-style-parser/-/inline-style-parser-0.1.1.tgz#ec8a3b429274e9c0a1f1c4ffa9453a7fef72cea1" integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-alphabetical@1.0.4, is-alphabetical@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.4.tgz#9e7d6b94916be22153745d184c298cbf986a686d" @@ -2456,22 +1738,22 @@ is-alphanumerical@^1.0.0: is-alphabetical "^1.0.0" is-decimal "^1.0.0" +is-arguments@^1.0.4: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9" + integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg== + dependencies: + call-bind "^1.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@^1.0.0: +is-bigint@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg== is-binary-path@~2.1.0: version "2.1.0" @@ -2480,6 +1762,13 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA== + dependencies: + call-bind "^1.0.0" + is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -2490,85 +1779,42 @@ is-buffer@^2.0.0: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" +is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ== -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" +is-date-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== is-decimal@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5" integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= -is-extendable@^0.1.0, is-extendable@^0.1.1: +is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - -is-extglob@^2.1.0, is-extglob@^2.1.1: +is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" +is-generator-function@^1.0.7: + version "1.0.8" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b" + integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ== -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - -is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: +is-glob@^4.0.1, is-glob@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== @@ -2580,12 +1826,23 @@ is-hexadecimal@^1.0.0: resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7" integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= +is-nan@^1.2.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/is-nan/-/is-nan-1.3.2.tgz#043a54adea31748b55b6cd4e09aadafa69bd9e1d" + integrity sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w== dependencies: - kind-of "^3.0.2" + call-bind "^1.0.0" + define-properties "^1.1.3" + +is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== + +is-number-object@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== is-number@^7.0.0: version "7.0.0" @@ -2597,33 +1854,54 @@ is-plain-obj@^2.0.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== -is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.1: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== dependencies: isobject "^3.0.1" +is-regex@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg== + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + +is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== + dependencies: + has-symbols "^1.0.1" + +is-typed-array@^1.1.3: + version "1.1.5" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.5.tgz#f32e6e096455e329eb7b423862456aa213f0eb4e" + integrity sha512-S+GRDgJlR3PyEbsX/Fobd9cqpZBuvUS+8asRqYDMLCb2qMzt1oz5m5oxQCxOgUDxiWsOVNi4yaF+/uvdlHlYug== + dependencies: + available-typed-arrays "^1.0.2" + call-bind "^1.0.2" + es-abstract "^1.18.0-next.2" + foreach "^2.0.5" + has-symbols "^1.0.1" + is-whitespace-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== -is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-word-character@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.4.tgz#ce0e73216f98599060592f62ff31354ddbeb0230" integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== -is-wsl@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" - integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2636,18 +1914,19 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -jest-worker@24.9.0: - version "24.9.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" - integrity sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw== +jest-worker@27.0.0-next.5: + version "27.0.0-next.5" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.0.0-next.5.tgz#5985ee29b12a4e191f4aae4bb73b97971d86ec28" + integrity sha512-mk0umAQ5lT+CaOJ+Qp01N6kz48sJG2kr2n1rX0koqKf6FIygQV0qLOdN9SCYID4IVeSigDOcPeGLozdMLYfb5g== dependencies: + "@types/node" "*" merge-stream "^2.0.0" - supports-color "^6.1.0" + supports-color "^8.0.0" "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" @@ -2677,7 +1956,7 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -2715,30 +1994,13 @@ kind-of@^2.0.1: dependencies: is-buffer "^1.0.2" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0, kind-of@^3.2.2: +kind-of@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= dependencies: is-buffer "^1.1.5" -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - lazy-cache@^0.2.3: version "0.2.7" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-0.2.7.tgz#7feddf2dcb6edb77d11ef1d117ab5ffdf0ab1b65" @@ -2752,11 +2014,6 @@ line-column@^1.0.2: isarray "^1.0.0" isobject "^2.0.0" -loader-runner@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" - integrity sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw== - loader-utils@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7" @@ -2775,7 +2032,7 @@ loader-utils@2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0, loader-utils@^1.2.3: +loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -2792,14 +2049,6 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -2849,28 +2098,6 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5" - integrity sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== - dependencies: - pify "^4.0.1" - semver "^5.6.0" - make-dir@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" @@ -2878,18 +2105,6 @@ make-dir@^3.0.2: dependencies: semver "^6.0.0" -map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - markdown-escapes@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" @@ -2937,46 +2152,11 @@ mdurl@^1.0.0: resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4= -memory-fs@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" - integrity sha1-OpoguEYlI+RHz7x+i7gO1me/xVI= - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - -memory-fs@^0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz#324c01288b88652966d161db77838720845a8e3c" - integrity sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA== - dependencies: - errno "^0.1.3" - readable-stream "^2.0.1" - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -2995,11 +2175,6 @@ mimic-response@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-2.1.0.tgz#d13763d35f613d09ec37ebb30bac0469c0ee8f43" integrity sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA== -mimic-response@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" - integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== - mini-css-extract-plugin@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" @@ -3019,42 +2194,11 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.5: +minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== -mississippi@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" - integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== - dependencies: - concat-stream "^1.5.0" - duplexify "^3.4.2" - end-of-stream "^1.1.0" - flush-write-stream "^1.0.0" - from2 "^2.1.0" - parallel-transform "^1.1.0" - pump "^3.0.0" - pumpify "^1.3.3" - stream-each "^1.1.0" - through2 "^2.0.0" - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - mixin-object@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/mixin-object/-/mixin-object-2.0.1.tgz#4fb949441dab182540f1fe035ba60e1947a5e57e" @@ -3063,30 +2207,6 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: - version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" - integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== - -mkdirp@^0.5.1, mkdirp@^0.5.3: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - -move-concurrently@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" - integrity sha1-viwAX9oy4LKa8fBdfEszIUxwH5I= - dependencies: - aproba "^1.1.1" - copy-concurrently "^1.0.0" - fs-write-stream-atomic "^1.0.8" - mkdirp "^0.5.1" - rimraf "^2.5.4" - run-queue "^1.0.3" - ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3097,38 +2217,11 @@ ms@2.1.2, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== -nan@^2.12.1: - version "2.14.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== - nanoid@^3.1.16: version "3.1.20" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.20.tgz#badc263c6b1dcf14b71efaa85f6ab4c1d6cfc788" integrity sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -napi-build-utils@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" - integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== - native-url@0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/native-url/-/native-url-0.3.4.tgz#29c943172aed86c63cee62c8c04db7f5756661f8" @@ -3136,66 +2229,61 @@ native-url@0.3.4: dependencies: querystring "^0.2.0" -neo-async@^2.5.0, neo-async@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next@10.0.7: - version "10.0.7" - resolved "https://registry.yarnpkg.com/next/-/next-10.0.7.tgz#442f8e1da7454de33b0bbcc1ce5684b923597ee6" - integrity sha512-We0utmwwfkvO12eLyUZd3tX9VLDE3FPpOaHpH3kqKdUTxJzUKt8FLBXCTm0mwsTKW5XColWG8mJvz2OLu3+3QA== +next@10.1.2: + version "10.1.2" + resolved "https://registry.yarnpkg.com/next/-/next-10.1.2.tgz#2c508cc2982077f0bad6863be020c10c1d059970" + integrity sha512-S2KYS8NXeFmaJd8EyoC/kWi3uIlNz3PghnpDWYwy5dxhbtyaozK7fVpXmDcOTQEyYq3BZG5ph0B+hOsAwMdYfQ== dependencies: "@babel/runtime" "7.12.5" "@hapi/accept" "5.0.1" - "@next/env" "10.0.7" - "@next/polyfill-module" "10.0.7" - "@next/react-dev-overlay" "10.0.7" - "@next/react-refresh-utils" "10.0.7" + "@next/env" "10.1.2" + "@next/polyfill-module" "10.1.2" + "@next/react-dev-overlay" "10.1.2" + "@next/react-refresh-utils" "10.1.2" "@opentelemetry/api" "0.14.0" + assert "2.0.0" ast-types "0.13.2" + browserify-zlib "0.2.0" browserslist "4.16.1" buffer "5.6.0" caniuse-lite "^1.0.30001179" chalk "2.4.2" chokidar "3.5.1" + constants-browserify "1.0.0" crypto-browserify "3.12.0" cssnano-simple "1.2.2" + domain-browser "4.19.0" + encoding "0.1.13" etag "1.8.1" find-cache-dir "3.3.1" - jest-worker "24.9.0" + get-orientation "1.1.2" + https-browserify "1.0.0" + jest-worker "27.0.0-next.5" native-url "0.3.4" node-fetch "2.6.1" node-html-parser "1.4.9" node-libs-browser "^2.2.1" + os-browserify "0.3.0" p-limit "3.1.0" path-browserify "1.0.1" pnp-webpack-plugin "1.6.4" postcss "8.1.7" process "0.11.10" prop-types "15.7.2" + querystring-es3 "0.2.1" raw-body "2.4.1" react-is "16.13.1" react-refresh "0.8.3" stream-browserify "3.0.0" + stream-http "3.1.1" + string_decoder "1.3.0" styled-jsx "3.3.2" + timers-browserify "2.0.12" + tty-browserify "0.0.1" use-subscription "1.5.1" + util "0.12.3" vm-browserify "1.1.2" - watchpack "2.0.0-beta.13" - optionalDependencies: - sharp "0.26.3" - -node-abi@^2.7.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.20.0.tgz#0659ee1a4a04dacabd3ac4429fac6297ed58e92e" - integrity sha512-6ldtfVR5l3RS8D0aT+lj/uM2Vv/PGEkeWzt2tl8DFBsGY/IuVnAIHl+dG6C14NlWClVv7Rn2+ZDvox+35Hx2Kg== - dependencies: - semver "^5.4.1" - -node-addon-api@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.1.0.tgz#98b21931557466c6729e51cb77cd39c965f42239" - integrity sha512-flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw== + watchpack "2.1.1" node-fetch@2.6.1: version "2.6.1" @@ -3243,18 +2331,6 @@ node-releases@^1.1.69: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== -noop-logger@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" - integrity sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI= - -normalize-path@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -3265,57 +2341,47 @@ normalize-url@^4.1.0: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129" integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ== -npmlog@^4.0.1, npmlog@^4.1.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - -object-assign@^4.1.0, object-assign@^4.1.1: +object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" +object-inspect@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" + integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= +object-is@^1.0.1: + version "1.1.5" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== dependencies: - isobject "^3.0.0" + call-bind "^1.0.2" + define-properties "^1.1.3" -object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= +object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== dependencies: - isobject "^3.0.1" + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" -once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -os-browserify@^0.3.0: +os-browserify@0.3.0, os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= @@ -3339,7 +2405,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0: +p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -3353,13 +2419,6 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -3382,15 +2441,6 @@ pako@~1.0.5: resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== -parallel-transform@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz#9049ca37d6cb2182c3b1d2c720be94d14a5814fc" - integrity sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg== - dependencies: - cyclist "^1.0.1" - inherits "^2.0.3" - readable-stream "^2.1.5" - parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.6" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.6.tgz#385080a3ec13cb62a62d39409cb3e88844cdaed4" @@ -3427,11 +2477,6 @@ parse5@^6.0.0: resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - path-browserify@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz#e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a" @@ -3442,11 +2487,6 @@ path-browserify@1.0.1: resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -3457,11 +2497,6 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" @@ -3488,18 +2523,6 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== - -pkg-dir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" - integrity sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw== - dependencies: - find-up "^3.0.0" - pkg-dir@^4.1.0: version "4.2.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" @@ -3519,11 +2542,6 @@ pnp-webpack-plugin@1.6.4: dependencies: ts-pnp "^1.1.6" -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - postcss-load-config@^2.0.0: version "2.1.2" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.2.tgz#c5ea504f2c4aef33c7359a34de3573772ad7502a" @@ -3606,27 +2624,6 @@ postcss@^7.0.0, postcss@^7.0.32: source-map "^0.6.1" supports-color "^6.1.0" -prebuild-install@^6.0.0: - version "6.0.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-6.0.1.tgz#5902172f7a40eb67305b96c2a695db32636ee26d" - integrity sha512-7GOJrLuow8yeiyv75rmvZyeMGzl8mdEX5gY69d6a6bHWmiPevwqFw+tQavhK0EYMaSg3/KD24cWqeQv1EWsqDQ== - dependencies: - detect-libc "^1.0.3" - expand-template "^2.0.3" - github-from-package "0.0.0" - minimist "^1.2.3" - mkdirp-classic "^0.5.3" - napi-build-utils "^1.0.1" - node-abi "^2.7.0" - noop-logger "^0.1.1" - npmlog "^4.0.1" - pump "^3.0.0" - rc "^1.2.7" - simple-get "^3.0.3" - tar-fs "^2.0.0" - tunnel-agent "^0.6.0" - which-pm-runs "^1.0.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -3637,11 +2634,6 @@ process@0.11.10, process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= -promise-inflight@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" - integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= - prop-types@15.7.2: version "15.7.2" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5" @@ -3658,11 +2650,6 @@ property-information@^5.0.0, property-information@^5.3.0: dependencies: xtend "^4.0.0" -prr@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" - integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY= - public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -3675,14 +2662,6 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" - integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - pump@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" @@ -3691,15 +2670,6 @@ pump@^3.0.0: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3: - version "1.5.1" - resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" - integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== - dependencies: - duplexify "^3.6.0" - inherits "^2.0.3" - pump "^2.0.0" - punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -3715,7 +2685,7 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== -querystring-es3@^0.2.0: +querystring-es3@0.2.1, querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" integrity sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM= @@ -3730,7 +2700,7 @@ quick-lru@^5.1.1: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -3755,16 +2725,6 @@ raw-body@2.4.1: iconv-lite "0.4.24" unpipe "1.0.0" -rc@^1.2.7: - version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - react-is@16.13.1, react-is@^16.8.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" @@ -3775,7 +2735,7 @@ react-refresh@0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: +readable-stream@^2.0.2, readable-stream@^2.3.3, readable-stream@^2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -3788,7 +2748,7 @@ react-refresh@0.8.3: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable-stream@^3.6.0: +readable-stream@^3.5.0, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -3797,15 +2757,6 @@ readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.5.0, readable string_decoder "^1.1.1" util-deprecate "^1.0.1" -readdirp@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - readdirp@~3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e" @@ -3818,14 +2769,6 @@ regenerator-runtime@^0.13.4: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - remark-footnotes@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/remark-footnotes/-/remark-footnotes-2.0.0.tgz#9001c4c2ffebba55695d2dd80ffb8b82f7e6303f" @@ -3874,17 +2817,7 @@ remark-squeeze-paragraphs@4.0.0: dependencies: mdast-squeeze-paragraphs "^4.0.0" -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - -repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== - -repeat-string@^1.5.4, repeat-string@^1.6.1: +repeat-string@^1.5.4: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -3904,11 +2837,6 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - resolve@^1.3.2: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" @@ -3923,18 +2851,6 @@ responselike@^2.0.0: dependencies: lowercase-keys "^2.0.0" -ret@~0.1.10: - version "0.1.15" - resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== - -rimraf@^2.5.4, rimraf@^2.6.3: - version "2.7.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== - dependencies: - glob "^7.1.3" - ripemd160@^2.0.0, ripemd160@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c" @@ -3943,13 +2859,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" -run-queue@^1.0.0, run-queue@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" - integrity sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec= - dependencies: - aproba "^1.1.1" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" @@ -3960,14 +2869,7 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -3992,7 +2894,7 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -semver@^5.4.1, semver@^5.6.0: +semver@^5.4.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -4002,35 +2904,6 @@ semver@^6.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -serialize-javascript@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-4.0.0.tgz#b525e1238489a5ecfc42afacc3fe99e666f4b1aa" - integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== - dependencies: - randombytes "^2.1.0" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -4059,121 +2932,16 @@ shallow-clone@^0.1.2: lazy-cache "^0.2.3" mixin-object "^2.0.1" -sharp@0.26.3: - version "0.26.3" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.26.3.tgz#9de8577a986b22538e6e12ced1f7e8a53f9728de" - integrity sha512-NdEJ9S6AMr8Px0zgtFo1TJjMK/ROMU92MkDtYn2BBrDjIx3YfH9TUyGdzPC+I/L619GeYQc690Vbaxc5FPCCWg== - dependencies: - array-flatten "^3.0.0" - color "^3.1.3" - detect-libc "^1.0.3" - node-addon-api "^3.0.2" - npmlog "^4.1.2" - prebuild-install "^6.0.0" - semver "^7.3.2" - simple-get "^4.0.0" - tar-fs "^2.1.1" - tunnel-agent "^0.6.0" - shell-quote@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== -signal-exit@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== - -simple-concat@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" - integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== - -simple-get@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-3.1.0.tgz#b45be062435e50d159540b576202ceec40b9c6b3" - integrity sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA== - dependencies: - decompress-response "^4.2.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-get@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.0.tgz#73fa628278d21de83dadd5512d2cc1f4872bd675" - integrity sha512-ZalZGexYr3TA0SwySsr5HlgOOinS4Jsa8YB2GJ6lUNAazyAu4KG/VmzMTwAt2YVXzzVj8QmefmAonZIK2BSGcQ== - dependencies: - decompress-response "^6.0.0" - once "^1.3.1" - simple-concat "^1.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - -source-map-support@~0.5.12: - version "0.5.19" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" - integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@0.7.3: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" @@ -4186,12 +2954,12 @@ source-map@0.8.0-beta.0: dependencies: whatwg-url "^7.0.0" -source-map@^0.5.0, source-map@^0.5.6: +source-map@^0.5.0: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -4201,25 +2969,11 @@ space-separated-tokens@^1.0.0: resolved "https://registry.yarnpkg.com/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz#85f32c3d10d9682007e917414ddc5c26d1aa6899" integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= -ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== - dependencies: - figgy-pudding "^3.5.1" - stacktrace-parser@0.1.10: version "0.1.10" resolved "https://registry.yarnpkg.com/stacktrace-parser/-/stacktrace-parser-0.1.10.tgz#29fb0cae4e0d0b85155879402857a1639eb6051a" @@ -4232,14 +2986,6 @@ state-toggle@^1.0.0: resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.3.tgz#e123b16a88e143139b09c6852221bc9815917dfe" integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - "statuses@>= 1.5.0 < 2": version "1.5.0" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" @@ -4261,13 +3007,15 @@ stream-browserify@^2.0.1: inherits "~2.0.1" readable-stream "^2.0.2" -stream-each@^1.1.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz#ebe27a0c389b04fbcc233642952e10731afa9bae" - integrity sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw== +stream-http@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-3.1.1.tgz#0370a8017cf8d050b9a8554afe608f043eaff564" + integrity sha512-S7OqaYu0EkFpgeGFb/NPOoPLxFko7TPqtEeFg5DXPB4v/KETHG0Ln6fRFrNezoelpaDKmycEmmZ81cC9DAwgYg== dependencies: - end-of-stream "^1.1.0" - stream-shift "^1.0.0" + builtin-status-codes "^3.0.0" + inherits "^2.0.4" + readable-stream "^3.6.0" + xtend "^4.0.2" stream-http@^2.7.2: version "2.8.3" @@ -4280,34 +3028,35 @@ stream-http@^2.7.2: to-arraybuffer "^1.0.0" xtend "^4.0.0" -stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +stream-parser@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/stream-parser/-/stream-parser-0.3.1.tgz#1618548694420021a1182ff0af1911c129761773" + integrity sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M= + dependencies: + debug "2" string-hash@1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/string-hash/-/string-hash-1.1.3.tgz#e8aafc0ac1855b4666929ed7dd1275df5d6c811b" integrity sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs= -string-width@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= +string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A== dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" + call-bind "^1.0.2" + define-properties "^1.1.3" -"string-width@^1.0.2 || 2": - version "2.1.1" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== +string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw== dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" + call-bind "^1.0.2" + define-properties "^1.1.3" -string_decoder@^1.0.0, string_decoder@^1.1.1: +string_decoder@1.3.0, string_decoder@^1.0.0, string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== @@ -4328,25 +3077,13 @@ strip-ansi@6.0.0, strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - style-to-object@0.3.0, style-to-object@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/style-to-object/-/style-to-object-0.3.0.tgz#b1b790d205991cc783801967214979ee19a76e46" @@ -4404,63 +3141,19 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -tapable@^1.0.0, tapable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tar-fs@^2.0.0, tar-fs@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" - integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== dependencies: - chownr "^1.1.1" - mkdirp-classic "^0.5.2" - pump "^3.0.0" - tar-stream "^2.1.4" + has-flag "^4.0.0" -tar-stream@^2.1.4: - version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" - integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== +timers-browserify@2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.12.tgz#44a45c11fbf407f34f97bccd1577c652361b00ee" + integrity sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ== dependencies: - bl "^4.0.3" - end-of-stream "^1.4.1" - fs-constants "^1.0.0" - inherits "^2.0.3" - readable-stream "^3.1.1" - -terser-webpack-plugin@^1.4.3: - version "1.4.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz#a217aefaea330e734ffacb6120ec1fa312d6040b" - integrity sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw== - dependencies: - cacache "^12.0.2" - find-cache-dir "^2.1.0" - is-wsl "^1.1.0" - schema-utils "^1.0.0" - serialize-javascript "^4.0.0" - source-map "^0.6.1" - terser "^4.1.2" - webpack-sources "^1.4.0" - worker-farm "^1.7.0" - -terser@^4.1.2: - version "4.8.0" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.8.0.tgz#63056343d7c70bb29f3af665865a46fe03a0df17" - integrity sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw== - dependencies: - commander "^2.20.0" - source-map "~0.6.1" - source-map-support "~0.5.12" - -through2@^2.0.0: - version "2.0.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" + setimmediate "^1.0.4" timers-browserify@^2.0.4: version "2.0.11" @@ -4479,21 +3172,6 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" @@ -4501,16 +3179,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -4543,32 +3211,30 @@ ts-pnp@^1.1.6: resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== -tslib@^1.9.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" - integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== - tty-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6" integrity sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY= -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" +tty-browserify@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.1.tgz#3f05251ee17904dfd0677546670db9651682b811" + integrity sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw== type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= +unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw== + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" unherit@^1.0.4: version "1.1.3" @@ -4590,30 +3256,6 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - -unique-filename@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" - integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== - dependencies: - unique-slug "^2.0.0" - -unique-slug@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz#baabce91083fc64e945b0f3ad613e264f7cd4e6c" - integrity sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w== - dependencies: - imurmurhash "^0.1.4" - unist-builder@2.0.3, unist-builder@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/unist-builder/-/unist-builder-2.0.3.tgz#77648711b5d86af0942f334397a33c5e91516436" @@ -4677,19 +3319,6 @@ unpipe@1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -upath@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== - uri-js@^4.2.2: version "4.4.0" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.0.tgz#aa714261de793e8a82347a7bcc9ce74e86f28602" @@ -4697,11 +3326,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -4717,11 +3341,6 @@ use-subscription@1.5.1: dependencies: object-assign "^4.1.1" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -4734,6 +3353,18 @@ util@0.10.3: dependencies: inherits "2.0.1" +util@0.12.3, util@^0.12.0: + version "0.12.3" + resolved "https://registry.yarnpkg.com/util/-/util-0.12.3.tgz#971bb0292d2cc0c892dab7c6a5d37c2bec707888" + integrity sha512-I8XkoQwE+fPQEhy9v012V+TSdH2kp9ts29i20TaaDUXsg7x/onePbhFJUExBfv/2ay1ZOp/Vsm3nDlmnFGSAog== + dependencies: + inherits "^2.0.3" + is-arguments "^1.0.4" + is-generator-function "^1.0.7" + is-typed-array "^1.1.3" + safe-buffer "^5.1.2" + which-typed-array "^1.1.2" + util@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz#3236733720ec64bb27f6e26f421aaa2e1b588d61" @@ -4770,32 +3401,14 @@ vm-browserify@1.1.2, vm-browserify@^1.0.1: resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== -watchpack-chokidar2@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957" - integrity sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww== - dependencies: - chokidar "^2.1.8" - -watchpack@2.0.0-beta.13: - version "2.0.0-beta.13" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.13.tgz#9d9b0c094b8402139333e04eb6194643c8384f55" - integrity sha512-ZEFq2mx/k5qgQwgi6NOm+2ImICb8ngAkA/rZ6oyXZ7SgPn3pncf+nfhYTCrs3lmHwOxnPtGLTOuFLfpSMh1VMA== +watchpack@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" -watchpack@^1.7.4: - version "1.7.5" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.5.tgz#1267e6c55e0b9b5be44c2023aed5437a2c26c453" - integrity sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ== - dependencies: - graceful-fs "^4.1.2" - neo-async "^2.5.0" - optionalDependencies: - chokidar "^3.4.1" - watchpack-chokidar2 "^2.0.1" - web-namespaces@^1.0.0: version "1.1.4" resolved "https://registry.yarnpkg.com/web-namespaces/-/web-namespaces-1.1.4.tgz#bc98a3de60dadd7faefc403d1076d529f5e030ec" @@ -4806,7 +3419,7 @@ webidl-conversions@^4.0.2: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== -webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: +webpack-sources@^1.1.0: version "1.4.3" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz#eedd8ec0b928fbf1cbfe994e22d2d890f330a933" integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== @@ -4814,35 +3427,6 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.44.2: - version "4.46.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.46.0.tgz#bf9b4404ea20a073605e0a011d188d77cb6ad542" - integrity sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q== - dependencies: - "@webassemblyjs/ast" "1.9.0" - "@webassemblyjs/helper-module-context" "1.9.0" - "@webassemblyjs/wasm-edit" "1.9.0" - "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.4.1" - ajv "^6.10.2" - ajv-keywords "^3.4.1" - chrome-trace-event "^1.0.2" - enhanced-resolve "^4.5.0" - eslint-scope "^4.0.3" - json-parse-better-errors "^1.0.2" - loader-runner "^2.4.0" - loader-utils "^1.2.3" - memory-fs "^0.4.1" - micromatch "^3.1.10" - mkdirp "^0.5.3" - neo-async "^2.6.1" - node-libs-browser "^2.2.1" - schema-utils "^1.0.0" - tapable "^1.1.3" - terser-webpack-plugin "^1.4.3" - watchpack "^1.7.4" - webpack-sources "^1.4.1" - whatwg-url@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" @@ -4852,24 +3436,29 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" -which-pm-runs@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" - integrity sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs= - -wide-align@^1.1.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.3.tgz#ae074e6bdc0c14a431e804e624549c633b000457" - integrity sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA== +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== dependencies: - string-width "^1.0.2 || 2" + 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" -worker-farm@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8" - integrity sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw== +which-typed-array@^1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff" + integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA== dependencies: - errno "~0.1.7" + available-typed-arrays "^1.0.2" + call-bind "^1.0.0" + es-abstract "^1.18.0-next.1" + foreach "^2.0.5" + function-bind "^1.1.1" + has-symbols "^1.0.1" + is-typed-array "^1.1.3" wrappy@1: version "1.0.2" @@ -4887,26 +3476,11 @@ xmlbuilder2@^2.1.1: "@types/node" "14.6.2" js-yaml "3.14.0" -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" diff --git a/npm/react/examples/react-scripts-folder/cypress.json b/npm/react/examples/react-scripts-folder/cypress.json index 55ea7682fc..a595a1acd3 100644 --- a/npm/react/examples/react-scripts-folder/cypress.json +++ b/npm/react/examples/react-scripts-folder/cypress.json @@ -4,6 +4,5 @@ "testFiles": "**/*cy-spec.js", "viewportWidth": 500, "viewportHeight": 800, - "experimentalComponentTesting": true, "componentFolder": "cypress/component" -} +} \ No newline at end of file diff --git a/npm/react/examples/react-scripts/cypress.json b/npm/react/examples/react-scripts/cypress.json index d781edca13..6c8427ea33 100644 --- a/npm/react/examples/react-scripts/cypress.json +++ b/npm/react/examples/react-scripts/cypress.json @@ -3,7 +3,6 @@ "testFiles": "**/*cy-spec.js", "viewportWidth": 500, "viewportHeight": 800, - "experimentalComponentTesting": true, "experimentalFetchPolyfill": true, "componentFolder": "src" -} +} \ No newline at end of file diff --git a/npm/react/examples/react-scripts/src/RemotePizza.cy-spec.js b/npm/react/examples/react-scripts/src/RemotePizza.cy-spec.js index fca59ef7f3..45e8de5c4b 100644 --- a/npm/react/examples/react-scripts/src/RemotePizza.cy-spec.js +++ b/npm/react/examples/react-scripts/src/RemotePizza.cy-spec.js @@ -23,7 +23,7 @@ describe('RemotePizza', () => { it('stubs via prop (di)', () => { const fetchIngredients = cy.stub().resolves({ args: { ingredients } }) - mount() + mount(, { ReactDom }) cy.contains('button', /cook/i).click() for (const ingredient of ingredients) { diff --git a/npm/react/examples/rollup/cypress.json b/npm/react/examples/rollup/cypress.json index 7100f07d1e..4dd1b549ee 100644 --- a/npm/react/examples/rollup/cypress.json +++ b/npm/react/examples/rollup/cypress.json @@ -1,8 +1,7 @@ { "video": false, "testFiles": "**/*spec.{ts,tsx}", - "experimentalComponentTesting": true, "experimentalFetchPolyfill": true, "componentFolder": "src", "fixturesFolder": false -} +} \ No newline at end of file diff --git a/npm/react/examples/sass-and-ts/cypress.json b/npm/react/examples/sass-and-ts/cypress.json index e8aa361797..1341d16e3b 100644 --- a/npm/react/examples/sass-and-ts/cypress.json +++ b/npm/react/examples/sass-and-ts/cypress.json @@ -4,10 +4,9 @@ "testFiles": "**/*spec.*", "viewportWidth": 500, "viewportHeight": 500, - "experimentalComponentTesting": true, "componentFolder": "src", "nodeVersion": "system", "env": { "coverage": true } -} +} \ No newline at end of file diff --git a/npm/react/examples/snapshots/cypress.json b/npm/react/examples/snapshots/cypress.json index 90204abaeb..4abcd4d5d3 100644 --- a/npm/react/examples/snapshots/cypress.json +++ b/npm/react/examples/snapshots/cypress.json @@ -4,7 +4,6 @@ "testFiles": "**/*-spec.js", "viewportWidth": 500, "viewportHeight": 500, - "experimentalComponentTesting": true, "ignoreTestFiles": [ "**/__snapshots__/*", "**/__image_snapshots__/*" @@ -14,4 +13,4 @@ "prettier": true } } -} +} \ No newline at end of file diff --git a/npm/react/examples/tailwind/cypress.json b/npm/react/examples/tailwind/cypress.json index 3778939194..b3055fbcbb 100644 --- a/npm/react/examples/tailwind/cypress.json +++ b/npm/react/examples/tailwind/cypress.json @@ -4,9 +4,8 @@ "testFiles": "**/*cy-spec.js", "viewportWidth": 500, "viewportHeight": 500, - "experimentalComponentTesting": true, "componentFolder": "src", "env": { "coverage": true } -} +} \ No newline at end of file diff --git a/npm/react/examples/using-babel-typescript/cypress.json b/npm/react/examples/using-babel-typescript/cypress.json index 1e868f1a6d..86ef45a150 100644 --- a/npm/react/examples/using-babel-typescript/cypress.json +++ b/npm/react/examples/using-babel-typescript/cypress.json @@ -4,6 +4,5 @@ "testFiles": "**/*spec.tsx", "viewportWidth": 500, "viewportHeight": 500, - "experimentalComponentTesting": true, "componentFolder": "src" -} +} \ No newline at end of file diff --git a/npm/react/examples/using-babel/cypress.json b/npm/react/examples/using-babel/cypress.json index f5acead769..f97af0417f 100644 --- a/npm/react/examples/using-babel/cypress.json +++ b/npm/react/examples/using-babel/cypress.json @@ -4,6 +4,5 @@ "testFiles": "**/*spec.js", "viewportWidth": 500, "viewportHeight": 500, - "experimentalComponentTesting": true, "componentFolder": "src" -} +} \ No newline at end of file diff --git a/npm/react/examples/visual-sudoku/cypress.json b/npm/react/examples/visual-sudoku/cypress.json index 651d89df1a..561f83d47b 100644 --- a/npm/react/examples/visual-sudoku/cypress.json +++ b/npm/react/examples/visual-sudoku/cypress.json @@ -4,6 +4,5 @@ "testFiles": "**/*cy-spec.js", "viewportWidth": 1000, "viewportHeight": 1000, - "experimentalComponentTesting": true, "componentFolder": "src" -} +} \ No newline at end of file diff --git a/npm/react/examples/visual-sudoku/src/solver/sudoku.js b/npm/react/examples/visual-sudoku/src/solver/sudoku.js index 2e1485818d..322d4db855 100644 --- a/npm/react/examples/visual-sudoku/src/solver/sudoku.js +++ b/npm/react/examples/visual-sudoku/src/solver/sudoku.js @@ -313,7 +313,6 @@ sudoku._search = function(candidates, reverse) { // If only one candidate for every square, we've a solved puzzle! // Return the candidates map. var max_nr_candidates = 0 - // eslint-disable-next-line var max_candidates_square = null for (var si in SQUARES) { var square = SQUARES[si] @@ -322,6 +321,7 @@ sudoku._search = function(candidates, reverse) { if (nr_candidates > max_nr_candidates) { max_nr_candidates = nr_candidates + // eslint-disable-next-line no-unused-vars max_candidates_square = square } } diff --git a/npm/react/examples/visual-testing-with-applitools/cypress.json b/npm/react/examples/visual-testing-with-applitools/cypress.json index acb30c3b5e..a86687662f 100644 --- a/npm/react/examples/visual-testing-with-applitools/cypress.json +++ b/npm/react/examples/visual-testing-with-applitools/cypress.json @@ -4,9 +4,8 @@ "testFiles": "**/*spec.js", "viewportWidth": 1000, "viewportHeight": 1000, - "experimentalComponentTesting": true, "componentFolder": "src", "env": { "coverage": false } -} +} \ No newline at end of file diff --git a/npm/react/examples/visual-testing-with-happo/cypress.json b/npm/react/examples/visual-testing-with-happo/cypress.json index 5f29ccf6cd..18d423f08d 100644 --- a/npm/react/examples/visual-testing-with-happo/cypress.json +++ b/npm/react/examples/visual-testing-with-happo/cypress.json @@ -3,6 +3,5 @@ "testFiles": "**/*cy-spec.js", "viewportWidth": 400, "viewportHeight": 700, - "experimentalComponentTesting": true, "componentFolder": "src" -} +} \ No newline at end of file diff --git a/npm/react/examples/visual-testing-with-percy/cypress.json b/npm/react/examples/visual-testing-with-percy/cypress.json index f9eebd3fc1..b268172ca3 100644 --- a/npm/react/examples/visual-testing-with-percy/cypress.json +++ b/npm/react/examples/visual-testing-with-percy/cypress.json @@ -4,6 +4,5 @@ "testFiles": "**/*cy-spec.js", "viewportWidth": 500, "viewportHeight": 500, - "experimentalComponentTesting": true, "componentFolder": "src" -} +} \ No newline at end of file diff --git a/npm/react/examples/webpack-file/cypress.json b/npm/react/examples/webpack-file/cypress.json index c1091b4f65..707979192c 100644 --- a/npm/react/examples/webpack-file/cypress.json +++ b/npm/react/examples/webpack-file/cypress.json @@ -3,6 +3,5 @@ "fixturesFolder": false, "testFiles": "**/*cy-spec.js", "viewportWidth": 500, - "viewportHeight": 500, - "experimentalComponentTesting": true -} + "viewportHeight": 500 +} \ No newline at end of file diff --git a/npm/react/examples/webpack-options/cypress.json b/npm/react/examples/webpack-options/cypress.json index c1091b4f65..707979192c 100644 --- a/npm/react/examples/webpack-options/cypress.json +++ b/npm/react/examples/webpack-options/cypress.json @@ -3,6 +3,5 @@ "fixturesFolder": false, "testFiles": "**/*cy-spec.js", "viewportWidth": 500, - "viewportHeight": 500, - "experimentalComponentTesting": true -} + "viewportHeight": 500 +} \ No newline at end of file diff --git a/npm/react/images/dynamic.gif b/npm/react/images/dynamic.gif index d37a0fce4a..7bfeb7b201 100644 Binary files a/npm/react/images/dynamic.gif and b/npm/react/images/dynamic.gif differ diff --git a/npm/react/package.json b/npm/react/package.json index 5dfee4aadf..b017074907 100644 --- a/npm/react/package.json +++ b/npm/react/package.json @@ -7,9 +7,9 @@ "build": "rimraf dist && yarn rollup -c rollup.config.js", "build-prod": "yarn build", "cy:open": "node ../../scripts/cypress.js open-ct --project ${PWD}", - "cy:open:debug": "NODE_OPTIONS=--max-http-header-size=1048576 node --inspect-brk ../../scripts/start.js --component-testing --project ${PWD}", + "cy:open:debug": "node --inspect-brk ../../scripts/start.js --component-testing --project ${PWD}", "cy:run": "node ../../scripts/cypress.js run-ct --project ${PWD}", - "cy:run:debug": "NODE_OPTIONS=--max-http-header-size=1048576 node --inspect-brk ../../scripts/start.js --component-testing --run-project ${PWD}", + "cy:run:debug": "node --inspect-brk ../../scripts/start.js --component-testing --run-project ${PWD}", "pretest": "yarn transpile", "test": "yarn cy:run", "test-ci": "node run-tests.js", @@ -69,7 +69,7 @@ "lodash": "4.17.15", "mobx": "6.0.0", "mobx-react-lite": "3.0.0", - "next": "^9.5.3", + "next": "^10.1.2", "pretty": "2.0.0", "prop-types": "15.7.2", "radioactive-state": "1.3.4", @@ -154,7 +154,7 @@ } }, "publishConfig": { - "access": "public" + "access": "restricted" }, "standard": { "globals": [ diff --git a/npm/react/plugins/next/findNextWebpackConfig.js b/npm/react/plugins/next/findNextWebpackConfig.js index 471d100ab6..b892a62ff3 100644 --- a/npm/react/plugins/next/findNextWebpackConfig.js +++ b/npm/react/plugins/next/findNextWebpackConfig.js @@ -1,4 +1,5 @@ // @ts-check +/// const debug = require('debug')('@cypress/react') const loadConfig = require('next/dist/next-server/server/config').default const getNextJsBaseWebpackConfig = require('next/dist/build/webpack-config').default @@ -14,7 +15,7 @@ async function getNextWebpackConfig (config) { isServer: false, pagesDir: config.projectRoot, entrypoints: {}, - rewrites: [], + rewrites: { fallback: [], afterFiles: [], beforeFiles: [] }, }, ) diff --git a/npm/react/src/mount.ts b/npm/react/src/mount.ts index 689fcadf87..3db9111482 100644 --- a/npm/react/src/mount.ts +++ b/npm/react/src/mount.ts @@ -45,18 +45,7 @@ export const mount = (jsx: React.ReactNode, options: MountOptions = {}) => { ? `<${componentName} ... /> as "${options.alias}"` : `<${componentName} ... />` - // @ts-ignore - let logInstance: Cypress.Log - return cy - .then(() => { - if (options.log !== false) { - logInstance = Cypress.log({ - name: 'mount', - message: [message], - }) - } - }) .then(injectStyles(options)) .then(() => { const reactDomToUse = options.ReactDom || ReactDOM @@ -90,28 +79,20 @@ export const mount = (jsx: React.ReactNode, options: MountOptions = {}) => { reactDomToUse.render(reactComponent, el) - if (logInstance) { - const logConsoleProps = { - // @ts-ignore protect the use of jsx functional components use ReactNode - props: jsx.props, - description: 'Mounts React component', - home: 'https://github.com/cypress-io/cypress', - } - const componentElement = el.children[0] - - if (componentElement) { - // @ts-ignore - logConsoleProps.yielded = reactDomToUse.findDOMNode(componentElement) - } - - logInstance.set('consoleProps', () => logConsoleProps) - - if (el.children.length) { - logInstance.set( - '$el', - (el.children.item(0) as unknown) as JQuery, - ) - } + if (options.log !== false) { + Cypress.log({ + name: 'mount', + message: [message], + $el: (el.children.item(0) as unknown) as JQuery, + consoleProps: () => { + return { + // @ts-ignore protect the use of jsx functional components use ReactNode + props: jsx.props, + description: 'Mounts React component', + home: 'https://github.com/cypress-io/cypress', + } + }, + }).snapshot('mounted').end() } return ( @@ -122,20 +103,16 @@ export const mount = (jsx: React.ReactNode, options: MountOptions = {}) => { // and letting hooks and component lifecycle methods to execute mount // https://github.com/bahmutov/cypress-react-unit-test/issues/200 .wait(0, { log: false }) - .then(() => { - if (logInstance) { - logInstance.snapshot('mounted') - logInstance.end() - } - - // by returning undefined we keep the previous subject - // which is the mounted component - return undefined - }) ) }) } +let initialInnerHtml = '' + +Cypress.on('run:start', () => { + initialInnerHtml = document.head.innerHTML +}) + /** * Removes the mounted component. Notice this command automatically * queues up the `unmount` into Cypress chain, thus you don't need `.then` @@ -166,8 +143,17 @@ export const unmount = (options = { log: true }) => { }) } -beforeEach(() => { - unmount() +// Cleanup before each run +// NOTE: we cannot use unmount here because +// we are not in the context of a test +Cypress.on('test:before:run', () => { + const el = document.getElementById(ROOT_ID) + + if (el) { + const wasUnmounted = ReactDOM.unmountComponentAtNode(el) + + document.head.innerHTML = initialInnerHtml + } }) /** diff --git a/npm/rollup-dev-server/index-template.html b/npm/rollup-dev-server/index-template.html index b99ce088de..c1a8f81b46 100644 --- a/npm/rollup-dev-server/index-template.html +++ b/npm/rollup-dev-server/index-template.html @@ -21,13 +21,34 @@ return node } + /** + * Format the requested spec file. + * Nollup writes everything to a single directory (eg /dist) + * All outputted files are *.js. + * RunnerCt requests specs using the original filename including extension. + * + * Example usage: + * formatSpecName('/cypress/component/foo.spec.tsx') //=> 'foo.spec.js' + */ + function formatSpecName (filename) { + const split = filename.split('/') + const name = split[split.length - 1] + const pos = name.lastIndexOf('.') + const newName = `${name.substr(0, pos < 0 ? name.length : pos)}.js` + + return `/${newName}` + } + const Cypress = window.Cypress = parent.Cypress + const specPath = `/__cypress/src/${formatSpecName(window.location.pathname)}` + const importsToLoad = [ - () => import('{{{specPath}}}'), () => { {{{supportFile}}} - } + }, + () => import(specPath), + ] Cypress.onSpecWindow(window, importsToLoad) diff --git a/npm/rollup-dev-server/package.json b/npm/rollup-dev-server/package.json index 7b87ed0458..40386fd452 100644 --- a/npm/rollup-dev-server/package.json +++ b/npm/rollup-dev-server/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "tsc", "build-prod": "tsc", - "cy:open": "node ../../scripts/start.js --component-testing --project ${PWD}", + "cy:open": "node ../../scripts/cypress.js open-ct --project ${PWD}", "cy:run": "node ../../scripts/cypress.js run-ct --project ${PWD}", "test": "yarn cy:run", "watch": "tsc -w" diff --git a/npm/rollup-dev-server/src/index.ts b/npm/rollup-dev-server/src/index.ts index c86ef8a1c6..018c10e86b 100644 --- a/npm/rollup-dev-server/src/index.ts +++ b/npm/rollup-dev-server/src/index.ts @@ -9,6 +9,7 @@ interface Options { specs: Cypress.Cypress['spec'][] // Why isn't this working? It works for webpack-dev-server config: Record devServerEvents: EventEmitter + devServerPublicPathRoute: string [key: string]: unknown } diff --git a/npm/rollup-dev-server/src/makeHtmlPlugin.ts b/npm/rollup-dev-server/src/makeHtmlPlugin.ts index 06a43e1660..7fa9e9993f 100644 --- a/npm/rollup-dev-server/src/makeHtmlPlugin.ts +++ b/npm/rollup-dev-server/src/makeHtmlPlugin.ts @@ -6,33 +6,11 @@ import { Express } from 'express' const indexHtmlPath = resolve(__dirname, '../index-template.html') const readIndexHtml = () => readFileSync(indexHtmlPath).toString() -/** - * Rormat the requested spec file. - * Nollup writes everything to a single directory (eg /dist) - * All outputted files are *.js. - * RunnerCt requests specs using the original filename including extension. - * - * Example usage: - * formatSpecName('/cypress/component/foo.spec.tsx') //=> 'foo.spec.js' - */ -function formatSpecName (filename: string) { - const split = filename.split('/') - const name = split[split.length - 1] - const pos = name.lastIndexOf('.') - const newName = `${name.substr(0, pos < 0 ? name.length : pos)}.js` - - return `/${newName}` -} - -function handleIndex (indexHtml: string, projectRoot: string, supportFilePath: string, cypressSpecPath: string) { - const specPath = `/${cypressSpecPath}` - - console.log(supportFilePath) +function handleIndex (indexHtml: string, projectRoot: string, supportFilePath: string) { const supportFile = readFileSync(supportFilePath).toString() return render(indexHtml, { supportFile, - specPath: formatSpecName(specPath), }) } @@ -40,15 +18,15 @@ export const makeHtmlPlugin = ( projectRoot: string, supportFilePath: string, server: Express, + publicPath: string, ) => { const indexHtml = readIndexHtml() - server.use('/index.html', (req, res) => { + server.use(`${publicPath}/index.html`, (req, res) => { const html = handleIndex( indexHtml, projectRoot, supportFilePath, - req.headers.__cypress_spec_path as string, ) res.end(html) diff --git a/npm/rollup-dev-server/src/startServer.ts b/npm/rollup-dev-server/src/startServer.ts index 740bbf6234..1d69683459 100644 --- a/npm/rollup-dev-server/src/startServer.ts +++ b/npm/rollup-dev-server/src/startServer.ts @@ -41,6 +41,7 @@ interface NollupDevServer { } export async function start (devServerOptions: StartDevServer): Promise { + console.log('OBject', Object.keys(devServerOptions.options)) const rollupConfigObj = typeof devServerOptions.rollupConfig === 'string' ? await loadConfigFile(devServerOptions.rollupConfig).then((configResult) => configResult.options) : devServerOptions.rollupConfig @@ -58,25 +59,28 @@ export async function start (devServerOptions: StartDevServer): Promise ⚡️ + 🌲 Cypress Component Testing w/ Vite To install vite in you component testing environment, 1. Install it `yarn add @cypress/vite-dev-server` @@ -13,3 +15,46 @@ module.exports = (on, config) => { return config } ``` + +# @cypress/webpack-dev-server + +> **Note** this package is not meant to be used outside of cypress component testing. + +Install `@cypress/vue` or `@cypress/react` to get this package working properly + +## Architecture + +### Cypress server + +- Every HTTP request goes to the cypress server which returns an html page. We call "TOP" because of its name in the dev tools + This page + - renders the list of spec files + - And the timetraveling command log + - Finally, it renders an AUT Iframe. this iframe calls a url that has 2 parts concatenated. + - a prefix: `__cypress/iframes/` + - the path to the current. For example: `src/components/button.spec.tsx` +- In the cypress server, calls prefixed with `__cypress/iframes/...` will be passed to the dev-server as `__cypress/src/index.html` +- Every call with the prefix `__cypress/src/` will be passed to the dev-server to deal as is, without changes. + +### Dev-server + +- Responds to every query with the prefix `__cypress/src/` (base path should be this prefix). +- Responds to `__cypress/src/index.html` with an html page. + This page + - will contain an element `
    `. Tis will be used by mount function to mount the app containing the components we want. + - will load support files + - will load the current spec from the url + - will start the test when both files are done loading +- The server re-runs the tests as soon as the current spec or any dependency is updated by calling an event `devServerEvents.emit('dev-server:compile:success')` + +## Vite dev server + +- Takes the users `vite.config` and adds base of `__cypress/src/` and a cypress vite plugin. +- The cypress plugin takes care of + - responding to the index.html query with an html page + - restarting the tests when files are changed +- The HTML page calls a script that loads support file and the specs using a native `import()` function +- Then triggers the loaded tests + +Vite is reponsible for compiling and bundling all the files. We use its error overlay to display any transpiling error. +Omly runtime errors have to be handled through cypress diff --git a/npm/vite-dev-server/client/initCypressTests.js b/npm/vite-dev-server/client/initCypressTests.js new file mode 100644 index 0000000000..3ac99370a1 --- /dev/null +++ b/npm/vite-dev-server/client/initCypressTests.js @@ -0,0 +1,48 @@ +// This file is merged in a diff --git a/npm/vite-dev-server/cypress/components/vue/Card/logo.png b/npm/vite-dev-server/cypress/components/vue/Card/logo.png new file mode 100644 index 0000000000..60e17006ad Binary files /dev/null and b/npm/vite-dev-server/cypress/components/vue/Card/logo.png differ diff --git a/npm/vite-dev-server/cypress/components/vue/Hello/Hello.spec.js b/npm/vite-dev-server/cypress/components/vue/Hello/Hello.spec.js new file mode 100644 index 0000000000..6c5b880fec --- /dev/null +++ b/npm/vite-dev-server/cypress/components/vue/Hello/Hello.spec.js @@ -0,0 +1,16 @@ +/// +import { mount } from '@cypress/vue' +import Hello from './Hello.vue' + +describe('Hello', () => { + it('shows error for short text', () => { + cy.viewport(300, 200) + mount(Hello) + // use the component like a real user + cy.findByRole('textbox').type('abc') + cy.contains('.error', 'enter a longer username') + // now enter a longer string + cy.findByRole('textbox').type('12345') + cy.get('.error').should('not.exist') + }) +}) diff --git a/npm/vite-dev-server/cypress/components/vue/Hello/Hello.vue b/npm/vite-dev-server/cypress/components/vue/Hello/Hello.vue new file mode 100644 index 0000000000..997d288746 --- /dev/null +++ b/npm/vite-dev-server/cypress/components/vue/Hello/Hello.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/npm/vite-dev-server/cypress/components/vue/Hello/logo.png b/npm/vite-dev-server/cypress/components/vue/Hello/logo.png new file mode 100644 index 0000000000..60e17006ad Binary files /dev/null and b/npm/vite-dev-server/cypress/components/vue/Hello/logo.png differ diff --git a/npm/vite-dev-server/cypress/plugins.js b/npm/vite-dev-server/cypress/plugins.js index 16054ce032..05b49d5128 100644 --- a/npm/vite-dev-server/cypress/plugins.js +++ b/npm/vite-dev-server/cypress/plugins.js @@ -1,7 +1,13 @@ import { startDevServer } from '@cypress/vite-dev-server' +import viteConfig from '../vite.config' module.exports = (on, config) => { - on('dev-server:start', async (options) => startDevServer({ options })) + on('dev-server:start', async (options) => { + return startDevServer({ + options, + viteConfig, + }) + }) return config } diff --git a/npm/vite-dev-server/cypress/support/support.js b/npm/vite-dev-server/cypress/support/support.js index 667b35a2c4..18915a9458 100644 --- a/npm/vite-dev-server/cypress/support/support.js +++ b/npm/vite-dev-server/cypress/support/support.js @@ -1,3 +1,5 @@ +import '@testing-library/cypress/add-commands' + before(() => { window.supportFileWasLoaded = true }) diff --git a/npm/vite-dev-server/index-template.html b/npm/vite-dev-server/index-template.html deleted file mode 100644 index d08afceb11..0000000000 --- a/npm/vite-dev-server/index-template.html +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - Components App - - -
    - - - diff --git a/npm/vite-dev-server/index.d.ts b/npm/vite-dev-server/index.d.ts index bb6bb6c83a..9ae0af320b 100644 --- a/npm/vite-dev-server/index.d.ts +++ b/npm/vite-dev-server/index.d.ts @@ -1,2 +1 @@ -// eslint-disable-next-line @typescript-eslint/triple-slash-reference -/// +export * from "./dist" diff --git a/npm/vite-dev-server/index.html b/npm/vite-dev-server/index.html new file mode 100644 index 0000000000..0471b25388 --- /dev/null +++ b/npm/vite-dev-server/index.html @@ -0,0 +1,12 @@ + + + + + + + AUT Frame + + +
    + + diff --git a/npm/vite-dev-server/package.json b/npm/vite-dev-server/package.json index 77ee48d786..497c5eb12c 100644 --- a/npm/vite-dev-server/package.json +++ b/npm/vite-dev-server/package.json @@ -12,19 +12,28 @@ "watch": "tsc -w" }, "dependencies": { - "debug": "4.3.2", - "mustache": "4.1.0" + "debug": "^4.3.2", + "get-port": "^5.1.1" }, "devDependencies": { - "@types/mustache": "4.1.1", - "vite": "2.0.5" + "@cypress/react": "0.0.0-development", + "@cypress/vue": "3.0.0-alpha.4", + "@testing-library/cypress": "7.0.4", + "@vitejs/plugin-vue": "1.2.0", + "@vue/compiler-sfc": "3.0.9", + "cypress": "0.0.0-development", + "cypress-circleci-reporter": "0.2.0", + "react": "17.0.2", + "vite": "2.1.3", + "vue": "3.0.9" }, "peerDependencies": { - "vite": ">= 2" + "vite": ">= 2.1.3" }, "files": [ "dist", - "index-template.html" + "client", + "index.html" ], "license": "MIT", "repository": { @@ -33,6 +42,7 @@ }, "homepage": "https://github.com/cypress-io/cypress/tree/master/npm/vite-dev-server#readme", "bugs": "https://github.com/cypress-io/cypress/issues/new?template=1-bug-report.md", + "module": "dist/index.js", "publishConfig": { "access": "public" } diff --git a/npm/vite-dev-server/src/index.ts b/npm/vite-dev-server/src/index.ts index b6da016910..c027b05a07 100644 --- a/npm/vite-dev-server/src/index.ts +++ b/npm/vite-dev-server/src/index.ts @@ -1,23 +1,9 @@ -import { EventEmitter } from 'events' import { debug as debugFn } from 'debug' -import { start as createDevServer } from './startServer' -import { UserConfig } from 'vite' import { Server } from 'http' +import { start as createDevServer, StartDevServer } from './startServer' const debug = debugFn('cypress:vite-dev-server:vite') -interface Options { - specs: any[] // Cypress.Cypress['spec'][] // Why isn't this working? It works for webpack-dev-server - config: Record - devServerEvents: EventEmitter - [key: string]: unknown -} - -export interface StartDevServer { - /* this is the Cypress options object */ - options: Options - /* support passing a path to the user's webpack config */ - viteConfig?: UserConfig // TODO: implement taking in the user's vite configuration. Right now we don't -} +export { StartDevServer } export interface ResolvedDevServerConfig { port: number @@ -27,11 +13,10 @@ export interface ResolvedDevServerConfig { export async function startDevServer (startDevServerArgs: StartDevServer): Promise { const viteDevServer = await createDevServer(startDevServerArgs) - return new Promise(async (resolve) => { - const app = await viteDevServer.listen() - const port = app.config.server.port + const app = await viteDevServer.listen() + const port = app.config.server.port - debug('Component testing vite server started on port', port) - resolve({ port, server: app.httpServer }) - }) + debug('Component testing vite server started on port', port) + + return { port, server: app.httpServer } } diff --git a/npm/vite-dev-server/src/makeCypressPlugin.ts b/npm/vite-dev-server/src/makeCypressPlugin.ts index 878a1e87a8..0e632d6e2e 100644 --- a/npm/vite-dev-server/src/makeCypressPlugin.ts +++ b/npm/vite-dev-server/src/makeCypressPlugin.ts @@ -1,40 +1,61 @@ -import { EventEmitter } from 'events' -import { relative, resolve } from 'path' -import { readFileSync } from 'fs' +import { resolve } from 'path' +import { readFile } from 'fs' +import { promisify } from 'util' import { Plugin, ViteDevServer } from 'vite' -import { render } from 'mustache' + +const read = promisify(readFile) const pluginName = 'cypress-transform-html' -const indexHtmlPath = resolve(__dirname, '../index-template.html') -const readIndexHtml = () => readFileSync(indexHtmlPath).toString() -function handleIndex (indexHtml, projectRoot, supportFilePath, req, res) { - const specPath = `/${req.headers.__cypress_spec_path}` - const supportPath = supportFilePath ? `/${relative(projectRoot, supportFilePath)}` : null - - res.end(render(indexHtml, { supportPath, specPath })) -} +const INIT_FILEPATH = resolve(__dirname, '../client/initCypressTests.js') export const makeCypressPlugin = ( projectRoot: string, supportFilePath: string, devServerEvents: EventEmitter, ): Plugin => { + let base = '/' + return { name: pluginName, enforce: 'pre', - configureServer: (server: ViteDevServer) => { - const indexHtml = readIndexHtml() + config (_, env) { + if (env) { + return { + define: { + 'import.meta.env.__cypress_supportPath': JSON.stringify(supportFilePath ? resolve(projectRoot, supportFilePath) : undefined), + 'import.meta.env.__cypress_originAutUrl': JSON.stringify('__cypress/iframes/'), + }, + } + } + }, + configResolved (config) { + base = config.base + }, + transformIndexHtml () { + return [ + // load the script at the end of the body + // script has to be loaded when the vite client is connected + { + tag: 'script', + injectTo: 'body', + attrs: { type: 'module' }, + children: `import(${JSON.stringify(INIT_FILEPATH)})`, + }, + ] + }, + configureServer: async (server: ViteDevServer) => { + const indexHtml = await read(resolve(__dirname, '..', 'index.html'), { encoding: 'utf8' }) - server.middlewares.use('/index.html', (req, res) => handleIndex(indexHtml, projectRoot, supportFilePath, req, res)) + const transformedIndexHtml = await server.transformIndexHtml(base, indexHtml) + + server.middlewares.use(`${base}index.html`, (req, res) => res.end(transformedIndexHtml)) }, handleHotUpdate: () => { + // restart tests when code is updated devServerEvents.emit('dev-server:compile:success') return [] }, - // TODO subscribe on the compile error hook and call the - // devServerEvents.emit('dev-server:compile:error', err) - // it looks like for now (02.02.2021) there is no way to subscribe to an error } } diff --git a/npm/vite-dev-server/src/makeHtmlPlugin.ts b/npm/vite-dev-server/src/makeHtmlPlugin.ts deleted file mode 100644 index 2370a53c09..0000000000 --- a/npm/vite-dev-server/src/makeHtmlPlugin.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { relative, resolve } from 'path' -import { readFileSync } from 'fs' -import { Plugin, ViteDevServer } from 'vite' -import { render } from 'mustache' - -const pluginName = 'cypress-transform-html' -const indexHtmlPath = resolve(__dirname, '../index-template.html') -const readIndexHtml = () => readFileSync(indexHtmlPath).toString() - -function handleIndex (indexHtml, projectRoot, supportFilePath, req, res) { - const specPath = `/${req.headers.__cypress_spec_path}` - const supportPath = supportFilePath ? `/${relative(projectRoot, supportFilePath)}` : null - - res.end(render(indexHtml, { supportPath, specPath })) -} - -export const makeHtmlPlugin = (projectRoot: string, supportFilePath: string): Plugin => { - return { - name: pluginName, - enforce: 'pre', - configureServer: (server: ViteDevServer) => { - const indexHtml = readIndexHtml() - - server.middlewares.use('/index.html', (req, res) => handleIndex(indexHtml, projectRoot, supportFilePath, req, res)) - }, - } -} diff --git a/npm/vite-dev-server/src/startServer.ts b/npm/vite-dev-server/src/startServer.ts index 08737ff834..324a026802 100644 --- a/npm/vite-dev-server/src/startServer.ts +++ b/npm/vite-dev-server/src/startServer.ts @@ -1,40 +1,49 @@ import Debug from 'debug' -import { StartDevServer } from '.' -import { createServer, ViteDevServer, InlineConfig } from 'vite' -import { resolve } from 'path' +import { createServer, ViteDevServer, InlineConfig, UserConfig } from 'vite' +import { dirname, resolve } from 'path' +import getPort from 'get-port' import { makeCypressPlugin } from './makeCypressPlugin' -import { EventEmitter } from 'events' const debug = Debug('cypress:vite-dev-server:start') -// TODO: Pull in types for Options so we can infer these -const serverConfig = (projectRoot: string, supportFilePath: string, devServerEvents: EventEmitter): InlineConfig => { - return { - root: resolve(__dirname, projectRoot), - base: '/__cypress/src/', - plugins: [makeCypressPlugin(projectRoot, supportFilePath, devServerEvents)], - server: { - port: 0, - }, - } +interface Options { + specs: Cypress.Cypress['spec'][] + config: Record + devServerEvents: EventEmitter + [key: string]: unknown } -const resolveServerConfig = ({ viteConfig, options }: StartDevServer) => { - const defaultServerConfig = serverConfig( - options.config.projectRoot, - options.config.supportFile, - options.devServerEvents, - ) +export interface StartDevServer { + /* this is the Cypress options object */ + options: Options + /* support passing a path to the user's webpack config */ + viteConfig?: UserConfig // TODO: implement taking in the user's vite configuration. Right now we don't +} - const requiredOptions = { - base: defaultServerConfig.base, - root: defaultServerConfig.root, +const resolveServerConfig = async ({ viteConfig, options }: StartDevServer): Promise => { + const { projectRoot, supportFile } = options.config + + const requiredOptions: InlineConfig = { + base: '/__cypress/src/', + root: projectRoot, } - const finalConfig = { ...defaultServerConfig, ...viteConfig, ...requiredOptions } + const finalConfig: InlineConfig = { ...viteConfig, ...requiredOptions } - finalConfig.plugins = [...(viteConfig.plugins || []), defaultServerConfig.plugins[0]] - finalConfig.server.port = defaultServerConfig.server.port + finalConfig.plugins = [...(viteConfig.plugins || []), makeCypressPlugin(projectRoot, supportFile, options.devServerEvents)] + + // This alias is necessary to avoid a "prefixIdentifiers" issue from slots mounting + // only cjs compiler-core accepts using prefixIdentifiers in slots which vue test utils use. + // Could we resolve this usage in test-utils? + finalConfig.resolve = finalConfig.resolve || {} + finalConfig.resolve.alias = { + ...finalConfig.resolve.alias, + '@vue/compiler-core': resolve(dirname(require.resolve('@vue/compiler-core')), 'dist', 'compiler-core.cjs.js'), + }, + + finalConfig.server = finalConfig.server || {} + + finalConfig.server.port = await getPort({ port: 3000, host: 'localhost' }), debug(`the resolved server config is ${JSON.stringify(finalConfig, null, 2)}`) @@ -48,7 +57,7 @@ export async function start (devServerOptions: StartDevServer): Promise Browser-based Component Testing for Vue.js with the Open-Source [Cypress.io](https://www.cypress.io/) Test Runner ✌️🌲 > @@ -11,8 +10,6 @@ **Jump to:** [Comparison](#comparison), [Blog posts](#blog-posts), Examples: [basic](#basic-examples), [advanced](#advanced-examples), [full](#full-examples), [external](#external-examples), [Code coverage](#code-coverage), [Development](#development) -**🚧 Notice** We are in the middle of moving into the Cypress NPM org, so any references to `cypress-vue-unit-test` should be switched to `@cypress/vue`. Once complete, this repository will be archived. - ### What is @cypress/vue? This package allows you to use the [Cypress](https://www.cypress.io/) test runner to mount and test your components within Cypress. It is built on top of the [Vue Test Utils](https://github.com/vuejs/vue-test-utils) package. @@ -25,26 +22,63 @@ It uses [Vue Test Utils](https://github.com/vuejs/vue-test-utils) under the hood ## Installation -

    - Terminal typing vue add cypress-experimental -

    +- Requires Cypress v7.0.0 or later +- Requires [Node](https://nodejs.org/en/) version 12 or above +- Supports webpack-based projects, vite in alpha, if you would like us to support another, please [create an issue](https://github.com/cypress-io/cypress/issues/new?assignees=&labels=npm:%20@cypress/vue&template=3-feature.md) or, if an issue already exists subscribe to it. -- Requires Cypress v4.5.0 or later -- Requires [Node](https://nodejs.org/en/) version 8 or above -- Only supporting webpack-based projects -- Installation via Vue CLI recommended, read [Write Your First Vue Component Test](https://glebbahmutov.com/blog/first-vue-component-test/) +Now you are ready to install. -### Vue CLI Installation +### Manual Installation -> Vue CLI v3+ +Using [@cypress/webpack-dev-server](https://github.com/cypress-io/cypress-webpack-preprocessor#readme) and [vue-loader](https://github.com/vuejs/vue-loader). -_Recommended_: One step install to existing projects with Vue CLI via [experimental plugin](https://github.com/jessicasachs/vue-cli-plugin-cypress-experimental), read [Write Your First Vue Component Test](https://glebbahmutov.com/blog/first-vue-component-test/) +```js +// cypress/plugins/index.js +const webpack = require('@cypress/webpack-dev-server') +const webpackOptions = { + module: { + rules: [ + { + test: /\.vue$/, + loader: 'vue-loader', + }, + ], + }, +} -```sh -vue add cypress-experimental +const options = { + // send in the options from your webpack.config.js, so it works the same + // as your app's code + webpackOptions, + watchOptions: {}, +} + +module.exports = (on) => { + on('dev-server:start', webpack(options)) +} ``` -If you want to install this package manually, follow [manual install](./docs/manual-install.md) +Install dev dependencies + +```shell +npm i -D @cypress/webpack-dev-server \ + vue-loader vue-template-compiler css-loader +``` + +And write a test + +```js +import Hello from '../../components/Hello.vue' +import { mountCallback } from '@cypress/vue' + +describe('Hello.vue', () => { + beforeEach(mountCallback(Hello)) + + it('shows hello', () => { + cy.contains('Hello World!') + }) +}) +``` ## Usage and Examples @@ -82,8 +116,6 @@ mount(Todo, { See examples below for details. - - ### Global Vue Options You can pass extensions (global components, mixins, modules to use) @@ -95,9 +127,7 @@ the `options`. - `mixin` (alias `mixins`) - list of global mixins, see [Mixins](cypress/component/basic/mixins) example - `filters` - hash of global filters, see [Filters](cypress/component/basic/filters) example - - -### The intro example +### intro example Take a look at the first Vue v2 example: [Declarative Rendering](https://vuejs.org/v2/guide/#Declarative-Rendering). @@ -164,9 +194,7 @@ the reference `Cypress.vue.$data` and via GUI. The full power of the ![Hello world tested](images/spec.png) - - -### The list example +### list example There is a list example next in the Vue docs. @@ -233,8 +261,6 @@ describe('Declarative rendering', () => { ![List tested](images/list-spec.png) - - ### Handling User Input The next section in the Vue docs starts with [reverse message example](https://vuejs.org/v2/guide/#Handling-User-Input). @@ -358,8 +384,6 @@ describe('Several components', () => { }) ``` - - ### Spying example Button counter component is used in several Vue doc examples @@ -553,91 +577,7 @@ Repo | Description [vue-component-test-example](https://github.com/bahmutov/vue-component-test-example) | Scaffolded Vue CLI v3 project with added component tests, read [Write Your First Vue Component Test](https://glebbahmutov.com/blog/first-vue-component-test/). -## Known problems - - -## Bundling - -How do we load this Vue file into the testing code? Using webpack preprocessor. Note that this module ships with [@cypress/webpack-preprocessor](https://github.com/cypress-io/cypress-webpack-preprocessor#compatibility) 2.x that requires Webpack 4.x. If you have Webpack 3.x please add `@cypress/webpack-preprocessor v1.x`. - - - -### Short way - -#### For Webpack Users - -Your project probably already has `webpack.config.js` setup to transpile -`.vue` files. To load these files in the Cypress tests, grab the webpack -processor included in this module, and load it from the `cypress/plugins/index.js` -file. - -```js -const { - onFilePreprocessor, -} = require('@cypress/vue/preprocessor/webpack') -module.exports = (on) => { - on('file:preprocessor', onFilePreprocessor('../path/to/webpack.config')) -} -``` - -Cypress should be able to import `.vue` files in the tests - - - -### Manual - -Using [@cypress/webpack-preprocessor](https://github.com/cypress-io/cypress-webpack-preprocessor#readme) and [vue-loader](https://github.com/vuejs/vue-loader). -You can use [cypress/plugins/index.js](cypress/plugins/index.js) to load `.vue` files -using `vue-loader`. - -```js -// cypress/plugins/index.js -const webpack = require('@cypress/webpack-preprocessor') -const webpackOptions = { - module: { - rules: [ - { - test: /\.vue$/, - loader: 'vue-loader', - }, - ], - }, -} - -const options = { - // send in the options from your webpack.config.js, so it works the same - // as your app's code - webpackOptions, - watchOptions: {}, -} - -module.exports = (on) => { - on('file:preprocessor', webpack(options)) -} -``` - -Install dev dependencies - -```shell -npm i -D @cypress/webpack-preprocessor \ - vue-loader vue-template-compiler css-loader -``` - -And write a test - -```js -import Hello from '../../components/Hello.vue' -import { mountCallback } from '@cypress/vue' - -describe('Hello.vue', () => { - beforeEach(mountCallback(Hello)) - - it('shows hello', () => { - cy.contains('Hello World!') - }) -}) -``` ## Code coverage @@ -659,27 +599,22 @@ If you want to disable code coverage instrumentation and reporting, use `--env c We were in the middle of moving into the Cypress NPM org, so any references to `cypress-vue-unit-test` should be switched to `@cypress/vue`. Once complete, the old repository will be archived. - - ## Development -To see all local tests, install dependencies, build the code and open Cypress in GUI mode +To see all local tests, install dependencies, build the code and open Cypress using the open-ct command ```sh -npm install -npm run build +yarn install +yarn workspace @cypress/vue build ``` -The build is done using `tsc` that transpiles all files from [src](src) to the `dist` folder. You can then run component tests by opening Cypress +The build is done using `rollup`. It bundles all files from [src](src) to the `dist` folder. You can then run component tests by opening Cypress ```sh -npm run cy:open +# cypress open-ct +yarn workspace @cypress/vue cy:open ``` -and clicking on any component spec - -![Component specs](images/component-specs.png) - Larger tests that use full application and run on CI (see [circle.yml](circle.yml)) are located in the folder [examples](examples). ### Debugging @@ -696,8 +631,6 @@ If some deeply nested objects are abbreviated and do not print fully, set the ma DEBUG=@cypress/vue DEBUG_DEPTH=10 ``` - - ## Related info - [Testing Vue web applications with Vuex data store & REST backend](https://www.cypress.io/blog/2017/11/28/testing-vue-web-application-with-vuex-data-store-and-rest-backend/) @@ -706,27 +639,10 @@ DEBUG=@cypress/vue DEBUG_DEPTH=10 - [Learn TDD in Vue](https://learntdd.in/vue) - [@cypress/vue vs vue-test-utils](https://codingitwrong.com/2018/03/04/comparing-vue-component-testing-tools.html) -```js -const { - onFileDefaultPreprocessor, -} = require('@cypress/vue/preprocessor/webpack') - -module.exports = (on, config) => { - require('@cypress/code-coverage/task')(on, config) - on('file:preprocessor', onFileDefaultPreprocessor(config)) - - // IMPORTANT to return the config object - // with the any changed environment variables - return config -} -``` - ## Blog posts - [Write Your First Vue Component Test](https://glebbahmutov.com/blog/first-vue-component-test/) - - ## Test adapters for other frameworks - [@cypress/react](https://github.com/cypress-io/@cypress/react) @@ -736,8 +652,6 @@ module.exports = (on, config) => { - [cypress-hyperapp-unit-test](https://github.com/bahmutov/cypress-hyperapp-unit-test) - [cypress-angularjs-unit-test](https://github.com/bahmutov/cypress-angularjs-unit-test) - - ## Maintainers The Cypress.io Component Testing Team diff --git a/npm/vue/cypress.json b/npm/vue/cypress.json index 49a9b3bdcb..9aa5956f42 100644 --- a/npm/vue/cypress.json +++ b/npm/vue/cypress.json @@ -5,6 +5,5 @@ "responseTimeout": 2500, "projectId": "134ej7", "testFiles": "**/*spec.js", - "experimentalComponentTesting": true, "experimentalFetchPolyfill": true -} +} \ No newline at end of file diff --git a/npm/vue/cypress/component/basic/code-coverage/Calculator-spec.js b/npm/vue/cypress/component/basic/code-coverage/Calculator-spec.js index a234d1258f..47abd16f33 100644 --- a/npm/vue/cypress/component/basic/code-coverage/Calculator-spec.js +++ b/npm/vue/cypress/component/basic/code-coverage/Calculator-spec.js @@ -25,4 +25,27 @@ describe('Calculator', () => { expect(includesVue, 'Calculator.vue is instrumented').to.be.true }) }) + + it('adds two decimal numbers', () => { + cy.viewport(400, 50) + mount(Calculator) + cy.get('[data-cy=a]').clear().type('22.6') + cy.get('[data-cy=b]').clear().type('19.4') + cy.contains('= 42') + + cy.log('**check coverage**') + cy.wrap(window) + .its('__coverage__') + // and it includes information even for this file + .then(Object.keys) + .should('include', Cypress.spec.absolute) + .and((filenames) => { + // coverage should include Calculator.vue file + const includesVue = filenames.some((filename) => { + return filename.endsWith('Calculator.vue') + }) + + expect(includesVue, 'Calculator.vue is instrumented').to.be.true + }) + }) }) diff --git a/npm/vue/cypress/component/support.spec.js b/npm/vue/cypress/component/support.spec.js deleted file mode 100644 index 384318c29a..0000000000 --- a/npm/vue/cypress/component/support.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -/// - -describe('support.js', () => { - /** - * Because tests inside of here are validating beforeEach - * they must be executed *together* to be meaningful. - */ - describe('beforeEach', () => { - let count = 0 - const $ = Cypress.$ - - beforeEach(() => { - count++ - $('body').append(`

    beforeEach's DOM cleanup: ${count}

    `) - $('head').append(``) - - cy.get('head') - .find('.before-each-head') - .should('exist').and('have.length', 1) - - cy.get('body') - .find('h1') - .should('exist') - .and('have.length', 1) - }) - - it('Setup-only: cleans up the target between it blocks', () => {}) - - it('Actual assertion: should have cleared out the first specs DOM', () => {}) - }) -}) diff --git a/npm/vue/cypress/plugins/index.js b/npm/vue/cypress/plugins/index.js index 1e01c246d0..6c6a7feabc 100644 --- a/npm/vue/cypress/plugins/index.js +++ b/npm/vue/cypress/plugins/index.js @@ -6,6 +6,10 @@ const webpackConfig = require('../../webpack.config') * @type Cypress.PluginConfig */ module.exports = (on, config) => { + if (config.testingType !== 'component') { + throw Error(`This is a component testing project. testingType should be 'component'. Received ${config.testingType}`) + } + require('@cypress/code-coverage/task')(on, config) on('dev-server:start', (options) => startDevServer({ options, webpackConfig })) diff --git a/npm/vue/cypress/support/index.js b/npm/vue/cypress/support/index.js index a73d518aec..0741db5b69 100644 --- a/npm/vue/cypress/support/index.js +++ b/npm/vue/cypress/support/index.js @@ -1 +1 @@ -require('../../dist/support') +// created automatically when cy:open starts diff --git a/npm/vue/examples/cli-ts/cypress.json b/npm/vue/examples/cli-ts/cypress.json index 70c873b311..9d7782bbd7 100644 --- a/npm/vue/examples/cli-ts/cypress.json +++ b/npm/vue/examples/cli-ts/cypress.json @@ -1,6 +1,5 @@ { - "experimentalComponentTesting": true, "componentFolder": "src", "testFiles": "**/*.spec.ts", "fixturesFolder": false -} +} \ No newline at end of file diff --git a/npm/vue/examples/cli/package.json b/npm/vue/examples/cli/package.json index 4bd5699c75..d8194e3f4b 100644 --- a/npm/vue/examples/cli/package.json +++ b/npm/vue/examples/cli/package.json @@ -35,8 +35,8 @@ "@vue/cli-plugin-eslint": "~4.4.0", "@vue/cli-service": "~4.4.0", "babel-eslint": "^10.1.0", - "eslint": "^6.7.2", + "eslint": "^7.22.0", "eslint-plugin-vue": "^6.2.2", "vue-template-compiler": "^2.6.11" } -} +} \ No newline at end of file diff --git a/npm/vue/examples/cli2/cypress.json b/npm/vue/examples/cli2/cypress.json index 3c52369b15..1f8c6bfcd8 100644 --- a/npm/vue/examples/cli2/cypress.json +++ b/npm/vue/examples/cli2/cypress.json @@ -1,7 +1,6 @@ { - "experimentalComponentTesting": true, "testFiles": "**/*.spec.*", "pluginsFile": "./plugins.js", "componentFolder": "./src", "componentSupportFile": "./component-helpers.js" -} +} \ No newline at end of file diff --git a/npm/vue/package.json b/npm/vue/package.json index 5a1a221523..381e427e29 100644 --- a/npm/vue/package.json +++ b/npm/vue/package.json @@ -12,8 +12,7 @@ "watch": "yarn build --watch --watch.exclude ./dist/**/*" }, "dependencies": { - "@vue/test-utils": "1.0.3", - "unfetch": "4.1.0" + "@vue/test-utils": "^1.1.3" }, "devDependencies": { "@babel/core": "7.9.0", @@ -31,6 +30,7 @@ "babel-plugin-istanbul": "6.0.0", "css-loader": "3.4.2", "cypress": "0.0.0-development", + "cypress-circleci-reporter": "0.2.0", "debug": "4.3.2", "eslint-plugin-vue": "^6.2.2", "find-webpack": "2.1.0", @@ -40,12 +40,13 @@ "rollup-plugin-typescript2": "^0.29.0", "tailwindcss": "1.1.4", "typescript": "3.9.6", - "vue": "2.6.11", + "unfetch": "4.1.0", + "vue": "2.6.12", "vue-i18n": "8.9.0", "vue-loader": "15.9.3", "vue-router": "3.0.5", "vue-style-loader": "4.1.2", - "vue-template-compiler": "2.6.11", + "vue-template-compiler": "2.6.12", "vuex": "3.1.1", "webpack": "4.42.0" }, diff --git a/npm/vue/src/index.ts b/npm/vue/src/index.ts index d7a442ae04..a0dd51b42e 100644 --- a/npm/vue/src/index.ts +++ b/npm/vue/src/index.ts @@ -5,8 +5,10 @@ import { mount as testUtilsMount, VueTestUtilsConfigOptions, Wrapper, + enableAutoDestroy, } from '@vue/test-utils' -import { renderTestingPlatform, ROOT_ID } from './renderTestingPlatform' + +const ROOT_ID = '__cy_root' const defaultOptions: (keyof MountOptions)[] = [ 'vue', @@ -63,7 +65,7 @@ const installMixins = (Vue, options) => { } } -const hasStore = ({ store }: { store: any }) => store && store._vm // @ts-ignore +const hasStore = ({ store }: { store: any }) => Boolean(store && store._vm) const forEachValue = (obj: Record, fn: (value: T, key: string) => void) => { return Object.keys(obj).forEach((key) => fn(obj[key], key)) @@ -305,6 +307,21 @@ function failTestOnVueError (err, vm, info) { window.top.onerror(err) } +let initialInnerHtml = '' + +Cypress.on('run:start', () => { + initialInnerHtml = document.head.innerHTML +}) + +function registerAutoDestroy ($destroy: () => void) { + Cypress.on('test:before:run', () => { + $destroy() + document.head.innerHTML = initialInnerHtml + }) +} + +enableAutoDestroy(registerAutoDestroy) + /** * Mounts a Vue component inside Cypress browser. * @param {object} component imported from Vue file @@ -357,14 +374,8 @@ export const mount = ( // @ts-ignore const document: Document = cy.state('document') - document.body.innerHTML = '' let el = document.getElementById(ROOT_ID) - // If the target div doesn't exist, create it - if (!el) { - el = renderTestingPlatform(document.head.innerHTML) - } - if (typeof options.stylesheets === 'string') { options.stylesheets = [options.stylesheets] } @@ -394,11 +405,9 @@ export const mount = ( // setup Vue instance installFilters(localVue, options) installMixins(localVue, options) - // @ts-ignore installPlugins(localVue, options, props) registerGlobalComponents(localVue, options) - // @ts-ignore props.attachTo = componentNode const wrapper = localVue.extend(component as any) diff --git a/npm/vue/src/renderTestingPlatform.ts b/npm/vue/src/renderTestingPlatform.ts deleted file mode 100644 index 64efe6bf52..0000000000 --- a/npm/vue/src/renderTestingPlatform.ts +++ /dev/null @@ -1,20 +0,0 @@ -export const ROOT_ID = '__cy_root' - -/** Initialize an empty document with root element - * This only needs for experimentalComponentTesting -*/ -export function renderTestingPlatform (headInnerHTML: string) { - // @ts-expect-error no idea - const document = cy.state('document') - - if (document.body) document.body.innerHTML = '' - - if (document.head) document.head.innerHTML = headInnerHTML - - const rootNode = document.createElement('div') - - rootNode.setAttribute('id', ROOT_ID) - document.getElementsByTagName('body')[0].prepend(rootNode) - - return rootNode -} diff --git a/npm/vue/src/support.js b/npm/vue/src/support.js index 2e5c51a411..aac24e7ae4 100644 --- a/npm/vue/src/support.js +++ b/npm/vue/src/support.js @@ -1,16 +1,5 @@ -/* eslint-env mocha */ +// empty to keep backwards compat -const { renderTestingPlatform } = require('./renderTestingPlatform') +// FIXME: delete in next major -let headInnerHTML = document.head.innerHTML - -beforeEach(() => { - renderTestingPlatform(headInnerHTML) -}) - -before(() => { - // after the root imports are done - const document = cy.state('document') - - headInnerHTML = document.head && document.head.innerHTML -}) +console.error('Avoid using this file, it will be deleted in the next major') diff --git a/npm/webpack-batteries-included-preprocessor/index.js b/npm/webpack-batteries-included-preprocessor/index.js index 202edaf77e..c8b9bb1342 100644 --- a/npm/webpack-batteries-included-preprocessor/index.js +++ b/npm/webpack-batteries-included-preprocessor/index.js @@ -33,7 +33,10 @@ const getDefaultWebpackOptions = (file, options = {}) => { }], ], presets: [ - [require.resolve('@babel/preset-env'), { modules: 'commonjs' }], + // the chrome version should be synced with + // packages/web-config/webpack.config.base.ts and + // packages/server/lib/browsers/chrome.ts + [require.resolve('@babel/preset-env'), { modules: 'commonjs', targets: { 'chrome': '64' } }], require.resolve('@babel/preset-react'), ], }, diff --git a/npm/webpack-batteries-included-preprocessor/package.json b/npm/webpack-batteries-included-preprocessor/package.json index d58cff0c99..81863c0aff 100644 --- a/npm/webpack-batteries-included-preprocessor/package.json +++ b/npm/webpack-batteries-included-preprocessor/package.json @@ -28,14 +28,14 @@ "@cypress/webpack-preprocessor": "0.0.0-development", "@types/mocha": "^8.0.2", "@types/webpack": "^4.41.21", - "@typescript-eslint/eslint-plugin": "^3.9.0", - "@typescript-eslint/parser": "^3.9.0", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", "babel-eslint": "^10.1.0", "chai": "^4.2.0", - "eslint": "^7.6.0", + "eslint": "^7.22.0", "eslint-plugin-json-format": "^2.0.1", - "eslint-plugin-mocha": "^8.0.0", - "eslint-plugin-react": "^7.20.6", + "eslint-plugin-mocha": "^8.1.0", + "eslint-plugin-react": "^7.22.0", "fs-extra": "^9.0.1", "graphql": "14.0.0", "mocha": "^8.1.1", @@ -66,4 +66,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/npm/webpack-dev-server/README.md b/npm/webpack-dev-server/README.md index abece7ff56..d3e3a5a6f9 100644 --- a/npm/webpack-dev-server/README.md +++ b/npm/webpack-dev-server/README.md @@ -1,17 +1,62 @@ -# Webpack-ct +# @cypress/webpack-dev-server > **Note** this package is not meant to be used outside of cypress component testing. Install `@cypress/vue` or `@cypress/react` to get this package working properly -## Responsibilities +To install `@cypress/webpack-dev-server` in you component testing environment, +1. Install it `yarn add @cypress/webpack-dev-server` +2. Add it to `cypress/plugins/index.js` -- Make a `webpack.config` from the users setup - - add current project rules and aliases - - remove eslint? -- Launch webpack dev server -- Update entry point (in `src/browser.ts`) -- The entry point (`browser.ts`) has to delegate the loading of spec files to the loader + plugin +```js +import { startDevServer } from '@cypress/webpack-dev-server' + +module.exports = (on, config) => { + on('dev-server:start', async (options) => startDevServer({ options })) + + return config +} +``` + +## Architecture + +### Cypress server + +- Every HTTP request goes to the cypress server which returns an html page. We call "TOP" because of its name in the dev tools + This page + - renders the list of spec files + - And the timetraveling command log + - Finally, it renders an AUT Iframe. this iframe calls a url that has 2 parts concatenated. + - a prefix: `__cypress/iframes/` + - the path to the current. For example: `src/components/button.spec.tsx` +- In the cypress server, calls prefixed with `__cypress/iframes/...` will be passed to the dev-server as `__cypress/src/index.html` +- Every call with the prefix `__cypress/src/` will be passed to the dev-server to deal as is, without changes. + +### Dev-server + +- Responds to every query with the prefix `__cypress/src/` (base path should be this prefix). +- Responds to `__cypress/src/index.html` with an html page. + This page + - will contain an element `
    ` to attach the mounted components to. + - will load support files + - will load the current spec from the url + - will start the test when both files are done loading +- The server re-runs the tests as soon as the current spec or any dependency is updated +by calling an event `devServerEvents.emit('dev-server:compile:success')` + +## Webpack + +Webpack-dev-server fulfills his reponsibilities by + +- Making a `webpack.config` from the users setup by changing the entrypoint to `browser.ts` +- Launches the webpack dev server with `devServer.publicPath = "__cypress/src/"` and `devServer.hot = false` +- The entry point (`browser.ts`) delegates the loading of spec files to the loader. + - By using a require on itself, it enables using a custom loader and Hot Module Replacements if hot is false. +- The plugin is responsible for passing down the path to the support files and the list of specs discovered by the cypress server to the loader +- The loader: + - compares the url with each spec path given by the plugin + - picks the spec that should be run + - runs the `AUT-Runner.ts` to load and launch the support file and the current spec ## Performance tests diff --git a/npm/webpack-dev-server/index-template.html b/npm/webpack-dev-server/index-template.html index 75e2886053..ebc248c6d5 100644 --- a/npm/webpack-dev-server/index-template.html +++ b/npm/webpack-dev-server/index-template.html @@ -7,5 +7,6 @@ Components App +
    diff --git a/npm/webpack-dev-server/index.js b/npm/webpack-dev-server/index.js deleted file mode 100644 index 59ad7a88e9..0000000000 --- a/npm/webpack-dev-server/index.js +++ /dev/null @@ -1,5 +0,0 @@ -const { validatePeerDependencies } = require('./dist/errors') - -validatePeerDependencies() - -module.exports = require('./dist') diff --git a/npm/webpack-dev-server/package.json b/npm/webpack-dev-server/package.json index 92c08d6939..ff3583b83a 100644 --- a/npm/webpack-dev-server/package.json +++ b/npm/webpack-dev-server/package.json @@ -2,7 +2,7 @@ "name": "@cypress/webpack-dev-server", "version": "0.0.0-development", "description": "Launches Webpack Dev Server for Component Testing", - "main": "index.js", + "main": "dist/index.js", "scripts": { "build": "tsc", "build-prod": "tsc", @@ -25,9 +25,9 @@ "webpack-dev-server": "^3.11.0" }, "peerDependencies": { - "html-webpack-plugin": "> 3", - "webpack": "> 4", - "webpack-dev-server": "> 3" + "html-webpack-plugin": ">=4", + "webpack": ">=4", + "webpack-dev-server": ">=4" }, "files": [ "dist", diff --git a/npm/webpack-dev-server/src/aut-runner.ts b/npm/webpack-dev-server/src/aut-runner.ts index f1bf323854..3ef44125f8 100644 --- a/npm/webpack-dev-server/src/aut-runner.ts +++ b/npm/webpack-dev-server/src/aut-runner.ts @@ -1,23 +1,7 @@ -/*eslint-env browser,mocha*/ +/*eslint-env browser */ -function appendTargetIfNotExists (id: string, tag = 'div', parent = document.body) { - let node = document.getElementById(id) - - if (node) { - // it is required to completely remove node from the document - // cause framework can store the information between renders inside the root node (like react-dom is doing) - node.parentElement.removeChild(node) - } - - node = document.createElement(tag) - node.setAttribute('id', id) - parent.appendChild(node) - - return node -} - -export function init (importPromises, parent = (window.opener || window.parent)) { - const Cypress = (window as any).Cypress = parent.Cypress +export function init (importPromises, parent: Window = (window.opener || window.parent)) { + const Cypress = window.Cypress = parent.Cypress if (!Cypress) { throw new Error('Tests cannot run without a reference to Cypress!') @@ -25,16 +9,4 @@ export function init (importPromises, parent = (window.opener || window.parent)) Cypress.onSpecWindow(window, importPromises) Cypress.action('app:window:before:load', window) - - // Before all tests we are mounting the root element, **not beforeEach** - // Cleaning up platform between tests is the responsibility of the specific adapter - // because unmounting react/vue component should be done using specific framework API - // (for devtools and to get rid of global event listeners from previous tests.) - before(() => { - appendTargetIfNotExists('__cy_root') - }) - - return { - restartRunner: Cypress.restartRunner, - } } diff --git a/npm/webpack-dev-server/src/errors.ts b/npm/webpack-dev-server/src/errors.ts deleted file mode 100644 index ea1cef561c..0000000000 --- a/npm/webpack-dev-server/src/errors.ts +++ /dev/null @@ -1,80 +0,0 @@ -export interface MissingDependency { - prettyName: string - packageName: string -} - -const peerDeps: MissingDependency[] = [ - { - prettyName: 'Webpack Dev Server', - packageName: 'webpack-dev-server', - }, - { - prettyName: 'Html Webpack Plugin', - packageName: 'html-webpack-plugin', - }, - { - prettyName: 'Webpack', - packageName: 'webpack', - }, -] - -const makePrettyLibs = (libs) => { - return libs.reduce((acc, curr, idx) => { - acc.prettyNames.push(curr.prettyName) - acc.packageNames.push(curr.packageName) - - if (idx >= libs.length) return acc - - return { - prettyNames: acc.prettyNames.join(', '), - packageNames: acc.packageNames.join(' '), - } - }, { prettyNames: [], packageNames: [] }) -} - -export class MissingPeerDependency extends Error { - private libs: { prettyNames: string[], packageNames: string[] } - - constructor (message, - libs: MissingDependency[]) { - const prettyLibs = makePrettyLibs(libs) - - super(`${message} ${prettyLibs.prettyNames}`) - this.name = 'PeerDependencyMissing' - this.libs = prettyLibs - - Object.setPrototypeOf(this, MissingPeerDependency.prototype) - } - - get prettyMessage () { - return `❌ Missing ${this.libs.prettyNames}. Please install them with npm or yarn. - - npm i ${this.libs.packageNames} -D - yarn add ${this.libs.packageNames} --dev - - Updating webpack config is unnecessary -` - } -} - -export function validatePeerDependencies () { - const missingPeerDeps = peerDeps.filter((peerDep) => { - try { - require(peerDep.packageName) - } catch (err) { - return true - } - - return false - }) - - if (missingPeerDeps.length) { - const error = new MissingPeerDependency(`@cypress/webpack-dev-server is missing peer dependencies`, missingPeerDeps) - - console.error(error.prettyMessage) // eslint-disable-line - - throw error - } - - return true -} diff --git a/npm/webpack-dev-server/src/index.ts b/npm/webpack-dev-server/src/index.ts index ad665f789b..97f96abdc0 100644 --- a/npm/webpack-dev-server/src/index.ts +++ b/npm/webpack-dev-server/src/index.ts @@ -1,7 +1,6 @@ import { debug as debugFn } from 'debug' import { AddressInfo } from 'net' -import { start as createDevServer } from './startServer' -import { UserWebpackDevServerOptions } from './makeWebpackConfig' +import { start as createDevServer, StartDevServer } from './startServer' const debug = debugFn('cypress:webpack-dev-server:webpack') @@ -12,12 +11,7 @@ export interface ResolvedDevServerConfig { close: (done?: DoneCallback) => void } -export interface StartDevServer extends UserWebpackDevServerOptions { - /* this is the Cypress options object */ - options: Cypress.DevServerOptions - /* support passing a path to the user's webpack config */ - webpackConfig?: Record -} +export { StartDevServer } export async function startDevServer (startDevServerArgs: StartDevServer, exitProcess = process.exit) { const webpackDevServer = await createDevServer(startDevServerArgs, exitProcess) diff --git a/npm/webpack-dev-server/src/makeWebpackConfig.ts b/npm/webpack-dev-server/src/makeWebpackConfig.ts index 06efdfa3dd..1e83d6ade6 100644 --- a/npm/webpack-dev-server/src/makeWebpackConfig.ts +++ b/npm/webpack-dev-server/src/makeWebpackConfig.ts @@ -18,11 +18,11 @@ export interface UserWebpackDevServerOptions { } interface MakeWebpackConfigOptions extends CypressCTOptionsPluginOptions, UserWebpackDevServerOptions { - webpackDevServerPublicPathRoute: string + devServerPublicPathRoute: string isOpenMode: boolean } -const mergePublicPath = (baseValue, userValue = '/') => { +const mergePublicPath = (baseValue = '/', userValue = '/') => { return path.join(baseValue, userValue, '/') } @@ -42,7 +42,7 @@ function getLazyCompilationWebpackConfig (options: MakeWebpackConfigOptions): we } export async function makeWebpackConfig (userWebpackConfig: webpack.Configuration, options: MakeWebpackConfigOptions): Promise { - const { projectRoot, webpackDevServerPublicPathRoute, files, supportFile, devServerEvents } = options + const { projectRoot, devServerPublicPathRoute, files, supportFile, devServerEvents } = options debug(`User passed in webpack config with values %o`, userWebpackConfig) @@ -52,7 +52,7 @@ export async function makeWebpackConfig (userWebpackConfig: webpack.Configuratio const entry = path.resolve(__dirname, './browser.js') - const publicPath = mergePublicPath(webpackDevServerPublicPathRoute, userWebpackConfig?.output?.publicPath) + const publicPath = mergePublicPath(devServerPublicPathRoute, userWebpackConfig?.output?.publicPath) const dynamicWebpackConfig = { output: { diff --git a/npm/webpack-dev-server/src/startServer.ts b/npm/webpack-dev-server/src/startServer.ts index 5058aa2e0e..2bb6b19d50 100644 --- a/npm/webpack-dev-server/src/startServer.ts +++ b/npm/webpack-dev-server/src/startServer.ts @@ -1,8 +1,14 @@ import Debug from 'debug' import webpack from 'webpack' import WebpackDevServer from 'webpack-dev-server' -import { StartDevServer } from '.' -import { makeWebpackConfig } from './makeWebpackConfig' +import { makeWebpackConfig, UserWebpackDevServerOptions } from './makeWebpackConfig' + +export interface StartDevServer extends UserWebpackDevServerOptions { + /* this is the Cypress options object */ + options: Cypress.DevServerOptions + /* support passing a path to the user's webpack config */ + webpackConfig?: Record +} const debug = Debug('cypress:webpack-dev-server:start') @@ -11,13 +17,13 @@ export async function start ({ webpackConfig: userWebpackConfig, options, ...use debug('User did not pass in any webpack configuration') } - // @ts-expect-error ?? webpackDevServerPublicPathRoute is not a valid option of Cypress.Config - const { projectRoot, webpackDevServerPublicPathRoute, isTextTerminal } = options.config + // @ts-expect-error ?? devServerPublicPathRoute is not a valid option of Cypress.Config + const { projectRoot, devServerPublicPathRoute, isTextTerminal } = options.config const webpackConfig = await makeWebpackConfig(userWebpackConfig || {}, { files: options.specs, projectRoot, - webpackDevServerPublicPathRoute, + devServerPublicPathRoute, devServerEvents: options.devServerEvents, supportFile: options.config.supportFile as string, isOpenMode: !isTextTerminal, @@ -40,23 +46,11 @@ export async function start ({ webpackConfig: userWebpackConfig, options, ...use debug('starting webpack dev server') - // TODO: write a test for how we are NOT modifying publicPath - // here, and instead stripping it out of the cypress proxy layer - // - // ...this prevents a problem if users have a 'before' or 'after' - // function defined in their webpack config, it does NOT - // interfere with their routes... otherwise the public - // path we are prefixing like /__cypress/src/ would be - // prepended to req.url and cause their routing handlers to fail - // - // NOTE: we are merging in webpackConfig.devServer here so - // that user values for the devServer get passed on correctly - // since we are passing in the compiler directly, and these - // devServer options would otherwise get ignored const webpackDevServerConfig = { ...userWebpackConfig.devServer, hot: false, inline: false, + publicPath: devServerPublicPathRoute, } return new WebpackDevServer(compiler, webpackDevServerConfig) diff --git a/npm/webpack-dev-server/src/webpack.config.js b/npm/webpack-dev-server/src/webpack.config.js index 968bec6c53..302b1d3c06 100644 --- a/npm/webpack-dev-server/src/webpack.config.js +++ b/npm/webpack-dev-server/src/webpack.config.js @@ -14,6 +14,6 @@ module.exports = { path: path.resolve(__dirname, 'dist'), }, plugins: [new HtmlWebpackPlugin({ - template: path.join(__dirname, '../index-template.html'), + template: path.resolve(__dirname, '..', 'index-template.html'), })], } diff --git a/npm/webpack-dev-server/src/window.d.ts b/npm/webpack-dev-server/src/window.d.ts new file mode 100644 index 0000000000..017657aab5 --- /dev/null +++ b/npm/webpack-dev-server/src/window.d.ts @@ -0,0 +1,8 @@ +/** + * We need this file to call window.Cypress + */ +export declare global { + interface Window { + Cypress: Cypress.Cypress; + } +} diff --git a/npm/webpack-dev-server/test/e2e.spec.ts b/npm/webpack-dev-server/test/e2e.spec.ts index da5cdebf46..b0671390b3 100644 --- a/npm/webpack-dev-server/test/e2e.spec.ts +++ b/npm/webpack-dev-server/test/e2e.spec.ts @@ -53,7 +53,7 @@ const config = { projectRoot: root, supportFile: '', isTextTerminal: true, - webpackDevServerPublicPathRoute: root, + devServerPublicPathRoute: root, } as any as Cypress.ResolvedConfigOptions & Cypress.RuntimeConfigOptions describe('#startDevServer', () => { diff --git a/npm/webpack-dev-server/tsconfig.json b/npm/webpack-dev-server/tsconfig.json index bb285da26d..cd933e83fd 100644 --- a/npm/webpack-dev-server/tsconfig.json +++ b/npm/webpack-dev-server/tsconfig.json @@ -17,14 +17,14 @@ "outDir": "dist" /* Redirect output structure to the directory. */, // "rootDir": "src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ // "removeComments": true, /* Do not emit comments to output. */ -// "noEmit": true, /* Do not emit outputs. */ + // "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ "strict": false /* Enable all strict type-checking options. */, - "noImplicitAny": false, + // "noImplicitAny": true, /* Module Resolution Options */ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ @@ -48,6 +48,5 @@ "esModuleInterop": true }, "include": ["src"], - "exclude": ["*.js"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "*.js"] } diff --git a/npm/webpack-preprocessor/__snapshots__/compilation.spec.js b/npm/webpack-preprocessor/__snapshots__/compilation.spec.js index d00597c3a4..cbef76d8f5 100644 --- a/npm/webpack-preprocessor/__snapshots__/compilation.spec.js +++ b/npm/webpack-preprocessor/__snapshots__/compilation.spec.js @@ -9,9 +9,9 @@ Webpack Compilation Error Module build failed (from ./node_modules/babel-loader/lib/index.js): SyntaxError: /_test-output/syntax_error_spec.js: Unexpected token (1:18) -> 1 | describe('fail', ->) -  |  ^ -  2 |  +> 1 | describe('fail', ->) +  | ^ +  2 | ` exports['webpack preprocessor - e2e has less verbose "Module not found" error 1'] = ` diff --git a/npm/webpack-preprocessor/package.json b/npm/webpack-preprocessor/package.json index efc3604e8b..87ca16cbae 100644 --- a/npm/webpack-preprocessor/package.json +++ b/npm/webpack-preprocessor/package.json @@ -6,7 +6,7 @@ "main": "dist", "scripts": { "ban": "ban", - "build": "rm -rf dist && tsc", + "build": "shx rm -rf dist && tsc", "build-prod": "yarn build", "deps": "deps-ok && dependency-check --no-dev .", "license": "license-checker --production --onlyunknown --csv", @@ -32,8 +32,8 @@ "@babel/preset-env": "^7.0.0", "@fellow/eslint-plugin-coffee": "0.4.13", "@types/webpack": "4.41.12", - "@typescript-eslint/eslint-plugin": "2.31.0", - "@typescript-eslint/parser": "2.31.0", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", "babel-loader": "^8.0.2", "ban-sensitive-files": "1.9.0", "chai": "4.1.2", @@ -42,10 +42,10 @@ "cypress": "0.0.0-development", "dependency-check": "2.9.1", "deps-ok": "1.2.1", - "eslint": "6.8.0", + "eslint": "7.22.0", "eslint-plugin-cypress": "2.11.2", "eslint-plugin-json-format": "2.0.1", - "eslint-plugin-mocha": "4.11.0", + "eslint-plugin-mocha": "8.1.0", "fast-glob": "3.1.1", "find-webpack": "1.5.0", "fs-extra": "8.1.0", @@ -58,6 +58,7 @@ "react-dom": "16.13.1", "react-scripts": "3.2", "semantic-release": "17.0.4", + "shx": "0.3.3", "sinon": "^9.0.0", "sinon-chai": "^3.5.0", "snap-shot-it": "7.9.2", @@ -89,4 +90,4 @@ "cypress-preprocessor", "webpack" ] -} +} \ No newline at end of file diff --git a/package.json b/package.json index c3052fc9e8..f34c7c6675 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cypress", - "version": "6.8.0", + "version": "7.0.0", "description": "Cypress.io end to end testing tool", "private": true, "scripts": { @@ -52,6 +52,7 @@ "test-integration": "lerna exec yarn test-integration --ignore \"'@packages/{desktop-gui,driver,root,static,web-config}'\"", "test-mocha": "mocha --reporter spec scripts/spec.js", "test-mocha-snapshot": "mocha scripts/mocha-snapshot-spec.js", + "test-npm-package-release-script": "npx lerna exec --scope \"@cypress/*\" -- npx --no-install semantic-release --dry-run", "test-s3-api": "node -r ./packages/ts/register scripts/binary/s3-api-demo.ts", "test-scripts": "mocha -r packages/ts/register --reporter spec 'scripts/unit/**/*spec.js'", "test-scripts-watch": "yarn test-scripts --watch --watch-extensions 'ts,js'", @@ -93,15 +94,15 @@ "@types/markdown-it": "0.0.9", "@types/mini-css-extract-plugin": "0.8.0", "@types/mocha": "8.0.3", - "@types/node": "12.12.50", + "@types/node": "14.14.31", "@types/prismjs": "1.16.0", "@types/ramda": "0.25.47", "@types/react": "16.9.50", "@types/react-dom": "16.9.8", "@types/request-promise": "4.1.45", "@types/sinon-chai": "3.2.3", - "@typescript-eslint/eslint-plugin": "3", - "@typescript-eslint/parser": "3", + "@typescript-eslint/eslint-plugin": "4.18.0", + "@typescript-eslint/parser": "4.18.0", "ansi-styles": "3.2.1", "arg": "4.1.2", "ascii-table": "0.0.9", @@ -122,11 +123,12 @@ "electron-builder": "22.9.1", "electron-notarize": "1.0.0", "enzyme-adapter-react-16": "1.12.1", - "eslint": "6.8.0", + "eslint": "7.22.0", "eslint-plugin-cypress": "2.11.2", - "eslint-plugin-json-format": "2.0.0", - "eslint-plugin-mocha": "6.1.0", - "eslint-plugin-react": "7.18.3", + "eslint-plugin-json-format": "2.0.1", + "eslint-plugin-mocha": "8.1.0", + "eslint-plugin-react": "7.22.0", + "eslint-plugin-react-hooks": "4.2.0", "execa": "4.0.0", "execa-wrap": "1.4.0", "filesize": "4.1.2", @@ -141,7 +143,7 @@ "gulp-debug": "4.0.0", "gulp-rename": "1.4.0", "hasha": "5.0.0", - "http-server": "0.12.1", + "http-server": "0.12.3", "human-interval": "1.0.0", "husky": "2.4.1", "inquirer": "3.3.0", @@ -192,7 +194,7 @@ "typescript": "3.7.4" }, "engines": { - "node": ">=12.18.3", + "node": ">=14.16.0", "yarn": ">=1.17.3" }, "productName": "Cypress", diff --git a/packages/desktop-gui/cypress.json b/packages/desktop-gui/cypress.json index 9b816faa12..431581dce2 100644 --- a/packages/desktop-gui/cypress.json +++ b/packages/desktop-gui/cypress.json @@ -13,10 +13,9 @@ }, "nodeVersion": "system", "testFiles": "**/*_spec.{js,jsx}", - "experimentalComponentTesting": true, "componentFolder": "src", "reporter": "../../node_modules/cypress-multi-reporters/index.js", "reporterOptions": { "configFile": "../../mocha-reporter-config.json" } -} +} \ No newline at end of file diff --git a/packages/desktop-gui/cypress/fixtures/dashboard_projects.json b/packages/desktop-gui/cypress/fixtures/dashboard_projects.json index c535d0dc71..a74d765a40 100644 --- a/packages/desktop-gui/cypress/fixtures/dashboard_projects.json +++ b/packages/desktop-gui/cypress/fixtures/dashboard_projects.json @@ -6,8 +6,8 @@ "createdAt": "2021-01-01T05:00:00.000Z", "updatedAt": "2021-01-03T08:30:00.000Z", "public": false, - "lastBuildStatus": null, - "lastBuildCreatedAt": null, + "lastBuildStatus": "passed", + "lastBuildCreatedAt": "2021-01-05T10:15:00.000Z", "runCompletionDelay": null, "orgId": "000", "orgName": "Jane Lane", diff --git a/packages/desktop-gui/cypress/integration/app_spec.js b/packages/desktop-gui/cypress/integration/app_spec.js index c56b17b106..69346a20e5 100644 --- a/packages/desktop-gui/cypress/integration/app_spec.js +++ b/packages/desktop-gui/cypress/integration/app_spec.js @@ -38,7 +38,14 @@ describe('App', function () { }) it('sends name, stack, message to gui:error on unhandled rejection', function () { - const err = new Error('foo') + const message = 'intentional error' + + cy.on('uncaught:exception', (err) => { + // we expect the error, so don't let it fail the test + if (err.message.includes(message)) return false + }) + + const err = new Error(message) this.win.foo = () => { return this.win.Promise.reject(err) @@ -46,13 +53,12 @@ describe('App', function () { setTimeout(() => { return this.win.foo() - } - , 0) + }, 0) cy.wrap({}).should(function () { expect(this.ipc.guiError).to.be.calledWithExactly({ name: 'Error', - message: 'foo', + message, stack: err.stack, }) }) diff --git a/packages/desktop-gui/cypress/integration/footer_spec.js b/packages/desktop-gui/cypress/integration/footer_spec.js index fef26e1d8b..79a022c623 100644 --- a/packages/desktop-gui/cypress/integration/footer_spec.js +++ b/packages/desktop-gui/cypress/integration/footer_spec.js @@ -67,6 +67,11 @@ describe('Footer', () => { it('shows update indicator', () => { cy.get('.update-indicator').should('be.visible') + cy.wrap(ipc.updaterCheck).should('be.calledOnceWith', { + initialLaunch: true, + testingType: 'e2e', + }) + cy.percySnapshot() }) diff --git a/packages/desktop-gui/cypress/integration/release_notes_spec.js b/packages/desktop-gui/cypress/integration/release_notes_spec.js index 67e29382a5..5b78bbe762 100644 --- a/packages/desktop-gui/cypress/integration/release_notes_spec.js +++ b/packages/desktop-gui/cypress/integration/release_notes_spec.js @@ -53,8 +53,10 @@ describe('Release Notes', () => { }) it('shows update instructions if getting release notes errors', () => { - getReleaseNotes.reject(new Error('something went wrong')) - cy.get('.update-notice').contains('Learn more').click() + cy.get('.update-notice').contains('Learn more').click().then(() => { + getReleaseNotes.reject(new Error('something went wrong')) + }) + cy.contains('Update to Version 1.2.3').should('be.visible') }) diff --git a/packages/desktop-gui/cypress/integration/runs_list_spec.js b/packages/desktop-gui/cypress/integration/runs_list_spec.js index 8a25ef5ce3..db82bb9206 100644 --- a/packages/desktop-gui/cypress/integration/runs_list_spec.js +++ b/packages/desktop-gui/cypress/integration/runs_list_spec.js @@ -335,7 +335,7 @@ describe('Runs List', function () { }) it('displays "need to set up" message', () => { - cy.contains('Connect to the Dashboard to see your recorded test runs here') + cy.contains('Connect to the Dashboard to see your recorded test results here') }) }) @@ -350,7 +350,7 @@ describe('Runs List', function () { }) it('displays "need to set up" message', () => { - cy.contains('Connect to the Dashboard to see your recorded test runs here') + cy.contains('Connect to the Dashboard to see your recorded test results here') }) describe('click setup project', function () { @@ -452,7 +452,7 @@ describe('Runs List', function () { it('displays "need to set up" message', function () { this.ipcError({ type: 'NO_PROJECT_ID' }) - cy.contains('Connect to the Dashboard to see your recorded test runs here') + cy.contains('Connect to the Dashboard to see your recorded test results here') }) it('displays old runs if another error', function () { @@ -739,7 +739,7 @@ describe('Runs List', function () { }) it('displays "need to set up" message', () => { - cy.contains('Connect to the Dashboard to see your recorded test runs here') + cy.contains('Connect to the Dashboard to see your recorded test results here') cy.percySnapshot() }) @@ -750,9 +750,6 @@ describe('Runs List', function () { cy.get('.organizations-select__option') .contains('Your personal organization').click() - cy.get('.setup-project') - .contains('Create new project').click() - cy.get('.setup-project') .contains('.btn', 'Set up project').click() @@ -820,9 +817,6 @@ describe('Runs List', function () { cy.get('.organizations-select__option') .contains('Your personal organization').click() - cy.get('.setup-project') - .contains('Create new project').click() - cy.get('.setup-project') .contains('.btn', 'Set up project').click() @@ -842,7 +836,7 @@ describe('Runs List', function () { }) it('displays "need to set up" message', () => { - cy.contains('Connect to the Dashboard to see your recorded test runs here') + cy.contains('Connect to the Dashboard to see your recorded test results here') }) it('banner does not cover browser dropdown', () => { diff --git a/packages/desktop-gui/cypress/integration/settings_spec.js b/packages/desktop-gui/cypress/integration/settings_spec.js index b0116bea86..6891dbea68 100644 --- a/packages/desktop-gui/cypress/integration/settings_spec.js +++ b/packages/desktop-gui/cypress/integration/settings_spec.js @@ -121,13 +121,7 @@ describe('Settings', () => { cy.get('.config-vars').invoke('text') .should('contain', '0:Chrome') - // make sure the main collapsible content - // has finished animating and that it has - // an empty inline style attribute - cy.get('.rc-collapse-content') - .should('not.have.class', 'rc-collapse-anim') - .should('have.attr', 'style', '') - + cy.ensureAnimationsFinished() cy.percySnapshot() }) @@ -482,12 +476,9 @@ describe('Settings', () => { }) it('shows message that user must be logged in to view record keys', () => { - // turn off animation to ensure panel is fully expanded in time for percy snapshot - cy.get('body').then(($body) => { - $body.append('