diff --git a/.github/workflows/build-release-zip-file.yml b/.github/workflows/build-release-zip-file.yml index 2f6dd819e20..05e11efb9d8 100644 --- a/.github/workflows/build-release-zip-file.yml +++ b/.github/workflows/build-release-zip-file.yml @@ -17,7 +17,7 @@ jobs: ref: ${{ github.event.inputs.ref || github.ref }} - name: Build the zip file id: build - uses: woocommerce/action-build@v2 + uses: woocommerce/action-build@trunk - name: Unzip the file (prevents double zip problem) run: unzip ${{ steps.build.outputs.zip_path }} -d zipfile - name: Upload the zip file as an artifact diff --git a/.github/workflows/build-release.yml b/.github/workflows/build-release.yml index 152860063a4..7081582b688 100644 --- a/.github/workflows/build-release.yml +++ b/.github/workflows/build-release.yml @@ -11,7 +11,7 @@ jobs: uses: actions/checkout@v2 - name: Build id: build - uses: woocommerce/action-build@v2 + uses: woocommerce/action-build@trunk - name: Upload release asset uses: actions/upload-release-asset@v1 env: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 829c6842a82..df8ad097394 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -59,8 +59,13 @@ jobs: ./vendor key: ${{ runner.os }}-${{ hashFiles('./composer.lock') }} + - name: Install PNPM and install dependencies + run: | + npm install -g pnpm + pnpm install + - name: Setup and install composer - run: composer install + run: pnpm nx composer-install woocommerce - name: Add PHP8 Compatibility. run: | @@ -71,11 +76,11 @@ jobs: composer bin phpunit config repositories.0 '{"type": "path", "url": "/tmp/phpunit-7.5-fork/phpunit-add-compatibility-with-php8-to-phpunit-7", "options": {"symlink": false}}' composer bin phpunit require --dev -W phpunit/phpunit:@dev --ignore-platform-reqs rm -rf ./vendor/phpunit/ - composer dump-autoload + pnpm nx composer-dump-autoload woocommerce fi - name: Init DB and WP run: ./tests/bin/install.sh woo_test root root 127.0.0.1 ${{ matrix.wp }} - name: Run tests - run: ./vendor/bin/phpunit -c ./phpunit.xml + run: pnpm nx test-unit woocommerce diff --git a/.github/workflows/mirrors.yml b/.github/workflows/mirrors.yml new file mode 100644 index 00000000000..8bdb1ddf9c6 --- /dev/null +++ b/.github/workflows/mirrors.yml @@ -0,0 +1,70 @@ +name: Mirrors +on: + push: + branches: ['trunk', 'release/**'] +jobs: + build: + name: Build WooCommerce zip + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + - name: Build + id: build + uses: woocommerce/action-build@trunk + env: + BUILD_ENV: mirrors + + - name: Upload PR zip + uses: actions/upload-artifact@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + name: woocommerce + path: ${{ steps.build.outputs.zip_path }} + retention-days: 7 + + mirror: + name: Push to Mirror + runs-on: ubuntu-latest + needs: [build] + steps: + - name: Create directories + run: | + mkdir -p tmp/woocommerce-build + mkdir -p monorepo + + - name: Checkout monorepo + uses: actions/checkout@v2 + with: + path: monorepo + + - name: Download WooCommerce ZIP + uses: actions/download-artifact@v2 + with: + name: woocommerce + path: tmp/woocommerce-build + + - name: Extract and replace WooCommerce zip. + working-directory: tmp/woocommerce-build + run: | + mkdir -p woocommerce/woocommerce-production + unzip woocommerce.zip -d woocommerce/woocommerce-production + mv woocommerce/woocommerce-production/woocommerce/* woocommerce/woocommerce-production + rm -rf woocommerce/woocommerce-production/woocommerce + + - name: Set up mirror + working-directory: tmp/woocommerce-build + run: | + touch mirrors.txt + echo "woocommerce/woocommerce-production" >> mirrors.txt + + - name: Push to mirror + uses: Automattic/action-push-to-mirrors@v1 + with: + source-directory: ${{ github.workspace }}/monorepo + token: ${{ secrets.API_TOKEN_GITHUB }} + username: matticbot + working-directory: ${{ github.workspace }}/tmp/woocommerce-build + timeout-minutes: 5 # 2021-01-18: Successful runs seem to take about half a minute. diff --git a/.github/workflows/pr-build-and-e2e-tests.yml b/.github/workflows/pr-build-and-e2e-tests.yml index be5a2dc441d..53404802f9b 100644 --- a/.github/workflows/pr-build-and-e2e-tests.yml +++ b/.github/workflows/pr-build-and-e2e-tests.yml @@ -11,6 +11,8 @@ jobs: - name: Build id: build uses: woocommerce/action-build@trunk + env: + BUILD_ENV: e2e - name: Upload PR zip uses: actions/upload-artifact@v2 @@ -41,8 +43,8 @@ jobs: - name: Install PNPM and install dependencies working-directory: package/woocommerce run: | - npm install -g pnpm - pnpm install + npm install -g pnpm + pnpm install - name: Load docker images and start containers. working-directory: package/woocommerce/plugins/woocommerce @@ -66,8 +68,8 @@ jobs: - name: Install dependencies again working-directory: package/woocommerce run: | - npm install -g pnpm - pnpm install + npm install -g pnpm + pnpm install - name: Run tests command. working-directory: package/woocommerce/plugins/woocommerce @@ -75,9 +77,60 @@ jobs: WC_E2E_SCREENSHOTS: 1 E2E_SLACK_TOKEN: ${{ secrets.E2E_SLACK_TOKEN }} E2E_SLACK_CHANNEL: ${{ secrets.E2E_SLACK_CHANNEL }} + run: pnpx wc-e2e test:e2e + + api-tests-run: + name: Runs API tests. + runs-on: ubuntu-18.04 + needs: [build] + steps: + - name: Create dirs. + run: | + mkdir -p code/woocommerce + mkdir -p package/woocommerce + mkdir -p tmp/woocommerce + mkdir -p node_modules + + - name: Checkout code. + uses: actions/checkout@v2 + with: + path: package/woocommerce + + - name: Install PNPM and install dependencies + working-directory: package/woocommerce + run: | + npm install -g pnpm + pnpm install + + - name: Load docker images and start containers. + working-directory: package/woocommerce/plugins/woocommerce + run: pnpx wc-e2e docker:up + + - name: Move current directory to code. We will install zip file in this dir later. + run: mv ./package/woocommerce/plugins/woocommerce/* ./code/woocommerce + + - name: Download WooCommerce ZIP. + uses: actions/download-artifact@v2 + with: + name: woocommerce + path: tmp + + - name: Extract and replace WooCommerce zip. + working-directory: tmp + run: | + unzip woocommerce.zip -d woocommerce + mv woocommerce/woocommerce/* ../package/woocommerce/plugins/woocommerce/ + + - name: Install dependencies again + working-directory: package/woocommerce + run: | + npm install -g pnpm + pnpm install + + - name: Run tests command. + working-directory: package/woocommerce/plugins/woocommerce + env: BASE_URL: ${{ secrets.PR_E2E_TEST_URL }} USER_KEY: ${{ secrets.PR_E2E_TEST_ADMIN_USER }} USER_SECRET: ${{ secrets.PR_E2E_TEST_ADMIN_PASSWORD }} - run: | - pnpx wc-e2e test:e2e - pnpx wc-api-tests test api + run: pnpx wc-api-tests test api diff --git a/.github/workflows/pr-code-coverage.yml b/.github/workflows/pr-code-coverage.yml index 18f437a2dab..c0340682f42 100644 --- a/.github/workflows/pr-code-coverage.yml +++ b/.github/workflows/pr-code-coverage.yml @@ -45,15 +45,20 @@ jobs: ./vendor key: ${{ runner.os }}-${{ hashFiles('./composer.lock') }} + - name: Install PNPM and install dependencies + run: | + npm install -g pnpm + pnpm install + - name: Setup and install composer - run: composer install + run: pnpm nx composer-install woocommerce - name: Init DB and WP - run: ./tests/bin/install.sh woo_test root root 127.0.0.1 latest + run: pnpm nx install-unit-test-db woocommerce - name: Run unit tests with code coverage. Allow to fail. run: | - RUN_CODE_COVERAGE=1 bash ./tests/bin/phpunit.sh + pnpm nx test-code-coverage woocommerce exit 0 - name: Send code coverage to Codecov. diff --git a/.github/workflows/pr-code-sniff.yml b/.github/workflows/pr-code-sniff.yml index 3e9feb8d792..4978488aefa 100644 --- a/.github/workflows/pr-code-sniff.yml +++ b/.github/workflows/pr-code-sniff.yml @@ -35,8 +35,13 @@ jobs: ./vendor key: ${{ runner.os }}-${{ hashFiles('./composer.lock') }} + - name: Install PNPM and install dependencies + run: | + npm install -g pnpm + pnpm install + - name: Setup and install composer - run: composer install + run: pnpm nx composer-install woocommerce - name: Run code sniff continue-on-error: true diff --git a/.github/workflows/pr-smoke-test.yml b/.github/workflows/pr-smoke-test.yml index 7678ae0d26f..aa679b79206 100644 --- a/.github/workflows/pr-smoke-test.yml +++ b/.github/workflows/pr-smoke-test.yml @@ -28,8 +28,8 @@ jobs: run: | npm install -g pnpm pnpm install - composer install --no-dev - pnpm run build:assets + pnpm nx composer-install-no-dev" woocommerce + pnpm nx build-assets woocommerce pnpm install jest - name: Run smoke test. diff --git a/.github/workflows/pr-unit-tests.yml b/.github/workflows/pr-unit-tests.yml index 14b6afcb30b..fc1c4ce5d0c 100644 --- a/.github/workflows/pr-unit-tests.yml +++ b/.github/workflows/pr-unit-tests.yml @@ -56,8 +56,11 @@ jobs: ./vendor key: ${{ runner.os }}-${{ hashFiles('./composer.lock') }} - - name: Setup and install composer - run: composer install + - name: Install PNPM and install dependencies + run: | + npm install -g pnpm + pnpm install + pnpm nx composer-install woocommerce - name: Add PHP8 Compatibility. run: | @@ -75,4 +78,4 @@ jobs: run: ./tests/bin/install.sh woo_test root root 127.0.0.1 ${{ matrix.wp }} - name: Run tests - run: ./vendor/bin/phpunit -c ./phpunit.xml + run: pnpm nx test-unit woocommerce diff --git a/.github/workflows/smoke-test-daily.yml b/.github/workflows/smoke-test-daily.yml index a777c420ee5..68fb656a777 100644 --- a/.github/workflows/smoke-test-daily.yml +++ b/.github/workflows/smoke-test-daily.yml @@ -26,8 +26,8 @@ jobs: run: | npm install -g pnpm pnpm install - composer install --no-dev - pnpm run build:assets + pnpm nx composer-install-no-dev woocommerce + pnpm nx build-assets woocommerce pnpm install jest - name: Run smoke test. diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index a005cb6bd2b..a98ba12fcc4 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -26,8 +26,8 @@ jobs: run: | npm install -g pnpm pnpm install - composer install --no-dev - pnpm run build:assets + pnpm nx composer-install-no-dev woocommerce + pnpm nx build-assets woocommerce pnpm install jest - name: Run smoke test. @@ -82,7 +82,7 @@ jobs: working-directory: package/woocommerce/plugins/woocommerce env: LATEST_WP_VERSION_MINUS: ${{ matrix.wp }} - run: pnpx wc-e2e docker:up + run: pnpm nx docker-up woocommerce - name: Move current directory to code. We will install zip file in this dir later. run: mv ./package/woocommerce/plugins/woocommerce/* ./code/woocommerce @@ -103,4 +103,4 @@ jobs: WC_E2E_SCREENSHOTS: 1 E2E_SLACK_TOKEN: ${{ secrets.SMOKE_TEST_SLACK_TOKEN }} E2E_SLACK_CHANNEL: ${{ secrets.RELEASE_TEST_SLACK_CHANNEL }} - run: pnpx wc-e2e test:e2e + run: pnpm nx test-e2e woocommerce diff --git a/.gitignore b/.gitignore index 67f387dc2be..130ad00fe7e 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,19 @@ Thumbs.db # IDE files .idea .vscode/ +project.xml +project.properties +.project +.settings* +*.sublime-project +*.sublime-workspace +.sublimelinterrc + +# Eslint Cache +.eslintcache # Environment files wp-cli.local.yml -.wp-env.override.json yarn-error.log npm-debug.log .pnpm-debug.log @@ -22,6 +31,7 @@ npm-debug.log build/ build-module/ build-style/ +dist/ # Project files node_modules/ @@ -37,5 +47,3 @@ tsconfig.tsbuildinfo /tmp packages/js/e2e-environment/config/default.json packages/js/e2e-environment/docker/wp-cli/initialize.sh -packages/js/e2e-environment/build/ -packages/js/e2e-environment/build-module/ diff --git a/nx.json b/nx.json index c3b7fe88035..fa1ac820d8b 100644 --- a/nx.json +++ b/nx.json @@ -1,20 +1,17 @@ { - "npmScope": "woocommerce", - "affected": { - "defaultBase": "trunk" - }, - "implicitDependencies": { - "package.json": { - "dependencies": "*", - "devDependencies": "*" - }, - ".eslintrc.json": "*" - }, + "extends": "@nrwl/workspace/presets/npm.json", + "npmScope": "woocommerce-monorepo", "tasksRunnerOptions": { "default": { "runner": "@nrwl/workspace/tasks-runners/default", "options": { - "cacheableOperations": ["build", "lint", "test", "e2e"] + "cacheableOperations": [ + "build", + "test", + "lint", + "package", + "prepare" + ] } } }, @@ -24,7 +21,21 @@ "target": "build", "projects": "dependencies" } + ], + "prepare": [ + { + "target": "prepare", + "projects": "dependencies" + } + ], + "package": [ + { + "target": "package", + "projects": "dependencies" + } ] }, - "projects": {} + "affected": { + "defaultBase": "trunk" + } } diff --git a/package.json b/package.json index c10644964b6..8591d1464ec 100644 --- a/package.json +++ b/package.json @@ -1,39 +1,45 @@ { - "name": "woocommerce-monorepo", - "title": "WooCommerce Monorepo", - "description": "Monorepo for the WooCommerce ecosystem", - "homepage": "https://woocommerce.com/", - "private": true, - "repository": { - "type": "git", - "url": "https://github.com/woocommerce/woocommerce.git" - }, - "author": "Automattic", - "license": "GPL-3.0-or-later", - "bugs": { - "url": "https://github.com/woocommerce/woocommerce/issues" - }, - "devDependencies": { - "@nrwl/tao": "12.10.0", - "@nrwl/cli": "12.10.0", - "@nrwl/workspace": "12.10.0", - "@types/node": "14.14.33", - "@woocommerce/eslint-plugin": "^1.2.0", - "@wordpress/prettier-config": "^1.0.5", - "chalk": "^4.1.2", - "glob": "^7.2.0", - "jest": "^27.0.6", - "mkdirp": "^1.0.4", - "node-stream-zip": "^1.13.6", - "prettier": "npm:wp-prettier@2.2.1-beta-1", - "request": "^2.88.2", - "typescript": "4.2.4" - }, - "dependencies": { - "@babel/core": "7.12.9", - "@wordpress/babel-plugin-import-jsx-pragma": "^3.1.0", - "@wordpress/babel-preset-default": "^6.3.3", - "lodash": "^4.17.21", - "wp-textdomain": "1.0.1" - } + "name": "woocommerce-monorepo", + "title": "WooCommerce Monorepo", + "description": "Monorepo for the WooCommerce ecosystem", + "homepage": "https://woocommerce.com/", + "private": true, + "repository": { + "type": "git", + "url": "https://github.com/woocommerce/woocommerce.git" + }, + "author": "Automattic", + "license": "GPL-3.0-or-later", + "bugs": { + "url": "https://github.com/woocommerce/woocommerce/issues" + }, + "scripts": { + "preinstall": "npx only-allow pnpm" + }, + "devDependencies": { + "@automattic/nx-composer": "^0.1.0", + "@nrwl/cli": "latest", + "@nrwl/linter": "^13.1.4", + "@nrwl/tao": "latest", + "@nrwl/web": "^13.1.4", + "@nrwl/workspace": "latest", + "@types/node": "14.14.33", + "@woocommerce/eslint-plugin": "^1.3.0", + "@wordpress/prettier-config": "^1.1.1", + "chalk": "^4.1.2", + "glob": "^7.2.0", + "jest": "^27.3.1", + "mkdirp": "^1.0.4", + "node-stream-zip": "^1.15.0", + "prettier": "npm:wp-prettier@^2.2.1-beta-1", + "request": "^2.88.2", + "typescript": "4.2.4" + }, + "dependencies": { + "@babel/core": "7.12.9", + "@wordpress/babel-plugin-import-jsx-pragma": "^3.1.0", + "@wordpress/babel-preset-default": "^6.4.1", + "lodash": "^4.17.21", + "wp-textdomain": "1.0.1" + } } diff --git a/packages/js/api-core-tests/.gitignore b/packages/js/api-core-tests/.gitignore index e0031849ea1..5a5072cb91d 100644 --- a/packages/js/api-core-tests/.gitignore +++ b/packages/js/api-core-tests/.gitignore @@ -1,8 +1,2 @@ -# Node modules -node_modules/ - -# Environment -.env - # Collection output collection.json diff --git a/packages/js/api-core-tests/NEXT_CHANGELOG.md b/packages/js/api-core-tests/NEXT_CHANGELOG.md new file mode 100644 index 00000000000..7195284dfd0 --- /dev/null +++ b/packages/js/api-core-tests/NEXT_CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +[See legacy changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob//packages/js/api-core-tests/CHANGELOG.md). diff --git a/packages/js/api-core-tests/bin/wc-api-tests.sh b/packages/js/api-core-tests/bin/wc-api-tests.sh index d271732f9ca..7b57c2e80d8 100755 --- a/packages/js/api-core-tests/bin/wc-api-tests.sh +++ b/packages/js/api-core-tests/bin/wc-api-tests.sh @@ -31,7 +31,7 @@ cd "$SCRIPTPATH/$(dirname "$REALPATH")/.." # Run scripts case $1 in 'test') - jest --group=$2 + jest --group=$2 --runInBand TESTRESULT=$? ;; 'make:collection') diff --git a/packages/js/api-core-tests/composer.json b/packages/js/api-core-tests/composer.json new file mode 100644 index 00000000000..059a937b966 --- /dev/null +++ b/packages/js/api-core-tests/composer.json @@ -0,0 +1,27 @@ +{ + "name": "woocommerce/api-core-tests", + "description": "WooCommerce API core test", + "type": "library", + "license": "GPL-3.0-or-later", + "minimum-stability": "dev", + "require-dev": { + "automattic/jetpack-changelogger": "3.0.2" + }, + "extra": { + "changelogger": { + "formatter": { + "filename": "../../../tools/changelogger/PackageFormatter.php" + }, + "types": [ + "Fix", + "Add", + "Update", + "Dev", + "Tweak", + "Performance", + "Enhancement" + ], + "changelog": "NEXT_CHANGELOG.md" + } + } +} diff --git a/packages/js/api-core-tests/composer.lock b/packages/js/api-core-tests/composer.lock new file mode 100644 index 00000000000..a4ca13764fb --- /dev/null +++ b/packages/js/api-core-tests/composer.lock @@ -0,0 +1,1021 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "dfa2036cb7c8dbe5fac357bce6f30a0f", + "packages": [], + "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 | ^5.2", + "symfony/process": "^3.4 | ^5.2", + "wikimedia/at-ease": "^1.2 | ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 | ^2.0", + "yoast/phpunit-polyfills": "1.0.2" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "mirror-repo": "Automattic/jetpack-changelogger", + "version-constants": { + "::VERSION": "src/Application.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-changelogger/compare/${old}...${new}" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Changelogger\\": "src", + "Automattic\\Jetpack\\Changelog\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "time": "2021-11-02T14:06:49+00:00" + }, + { + "name": "psr/container", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "symfony/console", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "30885182c981ab175d4d034db0f6f469898070ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T17:12:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/11b9acb5e8619aef6455735debf77dde8825795c", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-13T13:58:33+00:00" + }, + { + "name": "symfony/process", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-13T09:35:11+00:00" + }, + { + "name": "symfony/string", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-28T19:23:26+00:00" + }, + { + "name": "wikimedia/at-ease", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "35.0.0", + "mediawiki/minus-x": "1.1.1", + "ockcyp/covers-validator": "1.3.3", + "php-parallel-lint/php-console-highlighter": "0.5.0", + "php-parallel-lint/php-parallel-lint": "1.2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + }, + "files": [ + "src/Wikimedia/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "time": "2021-02-27T15:53:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/packages/js/api-core-tests/data/orders.js b/packages/js/api-core-tests/data/orders.js new file mode 100644 index 00000000000..d06fd6717f4 --- /dev/null +++ b/packages/js/api-core-tests/data/orders.js @@ -0,0 +1,292 @@ +/** + * Internal dependencies + */ +const { + postRequest, + deleteRequest, + getRequest, + putRequest, +} = require( '../utils/request' ); +const productsTestSetup = require( './product-list' ); +const { ordersApi } = require( '../endpoints/orders' ); + +const createCustomer = ( data ) => postRequest( 'customers', data ); +const deleteCustomer = ( id ) => deleteRequest( `customers/${ id }`, true ); + +const createSampleData = async () => { + const testProductData = await productsTestSetup.createSampleData(); + + const orderedProducts = { + pocketHoodie: testProductData.simpleProducts.find( + ( p ) => p.name === 'Hoodie with Pocket' + ), + sunglasses: testProductData.simpleProducts.find( + ( p ) => p.name === 'Sunglasses' + ), + beanie: testProductData.simpleProducts.find( + ( p ) => p.name === 'Beanie' + ), + blueVneck: testProductData.variableProducts.vneckVariations.find( + ( p ) => p.sku === 'woo-vneck-tee-blue' + ), + pennant: testProductData.externalProducts[ 0 ], + }; + + const johnAddress = { + first_name: 'John', + last_name: 'Doe', + company: 'Automattic', + country: 'US', + address_1: '60 29th Street', + address_2: '#343', + city: 'San Francisco', + state: 'CA', + postcode: '94110', + phone: '123456789', + }; + const tinaAddress = { + first_name: 'Tina', + last_name: 'Clark', + company: 'Automattic', + country: 'US', + address_1: 'Oxford Ave', + address_2: '', + city: 'Buffalo', + state: 'NY', + postcode: '14201', + phone: '123456789', + }; + const guestShippingAddress = { + first_name: 'Ano', + last_name: 'Nymous', + company: '', + country: 'US', + address_1: '0 Incognito St', + address_2: '', + city: 'Erie', + state: 'PA', + postcode: '16515', + phone: '123456789', + }; + const guestBillingAddress = { + first_name: 'Ben', + last_name: 'Efactor', + company: '', + country: 'US', + address_1: '200 W University Avenue', + address_2: '', + city: 'Gainesville', + state: 'FL', + postcode: '32601', + phone: '123456789', + email: 'ben.efactor@email.net', + }; + + const { body: john } = await createCustomer( { + first_name: 'John', + last_name: 'Doe', + username: 'john.doe', + email: 'john.doe@example.com', + billing: { + ...johnAddress, + email: 'john.doe@example.com', + }, + shipping: johnAddress, + } ); + + const { body: tina } = await createCustomer( { + first_name: 'Tina', + last_name: 'Clark', + username: 'tina.clark', + email: 'tina.clark@example.com', + billing: { + ...tinaAddress, + email: 'tina.clark@example.com', + }, + shipping: tinaAddress, + } ); + + const orderBaseData = { + payment_method: 'cod', + payment_method_title: 'Cash on Delivery', + status: 'processing', + set_paid: false, + currency: 'USD', + customer_id: 0, + }; + + const orders = []; + + // Have "John" order all products. + Object.values( orderedProducts ).forEach( async ( product ) => { + const { body: order } = await ordersApi.create.order( { + ...orderBaseData, + customer_id: john.id, + billing: { + ...johnAddress, + email: 'john.doe@example.com', + }, + shipping: johnAddress, + line_items: [ + { + product_id: product.id, + quantity: 1, + }, + ], + } ); + + orders.push( order ); + } ); + + // Have "Tina" order some sunglasses and make a child order. + // This somewhat resembles a subscription renewal, but we're just testing the `parent` field. + const { body: order2 } = await ordersApi.create.order( { + ...orderBaseData, + status: 'completed', + set_paid: true, + customer_id: tina.id, + billing: { + ...tinaAddress, + email: 'tina.clark@example.com', + }, + shipping: tinaAddress, + line_items: [ + { + product_id: orderedProducts.sunglasses.id, + quantity: 1, + }, + ], + } ); + orders.push( order2 ); + + const { body: order3 } = await ordersApi.create.order( { + ...orderBaseData, + parent_id: order2.id, + customer_id: tina.id, + billing: { + ...tinaAddress, + email: 'tina.clark@example.com', + }, + shipping: tinaAddress, + line_items: [ + { + product_id: orderedProducts.sunglasses.id, + quantity: 1, + }, + ], + } ); + orders.push( order3 ); + + // Guest order. + const { body: guestOrder } = await ordersApi.create.order( { + ...orderBaseData, + billing: guestBillingAddress, + shipping: guestShippingAddress, + line_items: [ + { + product_id: orderedProducts.pennant.id, + quantity: 2, + }, + { + product_id: orderedProducts.beanie.id, + quantity: 1, + }, + ], + } ); + + // Create an order with all possible numerical fields (taxes, fees, refunds, etc). + const { body: taxSetting } = await getRequest( + 'settings/general/woocommerce_calc_taxes' + ); + await putRequest( 'settings/general/woocommerce_calc_taxes', { + value: 'yes', + } ); + + const { body: taxRate } = await postRequest( 'taxes', { + country: '*', + state: '*', + postcode: '*', + city: '*', + rate: '5.5000', + name: 'Tax', + rate: '5.5', + shipping: true, + } ); + + const { body: coupon } = await postRequest( 'coupons', { + code: 'save5', + amount: '5', + } ); + + const { body: order4 } = await ordersApi.create.order( { + ...orderBaseData, + line_items: [ + { + product_id: orderedProducts.blueVneck.id, + quantity: 1, + }, + ], + coupon_lines: [ { code: 'save5' } ], + shipping_lines: [ + { + method_id: 'flat_rate', + total: '5.00', + }, + ], + fee_lines: [ + { + total: '1.00', + name: 'Test Fee', + }, + ], + } ); + + await postRequest( `orders/${ order4.id }/refunds`, { + api_refund: false, // Prevent an actual refund request (fails with CoD), + line_items: [ + { + id: order4.line_items[ 0 ].id, + quantity: 1, + refund_total: order4.line_items[ 0 ].total, + refund_tax: [ + { + id: order4.line_items[ 0 ].taxes[ 0 ].id, + refund_total: order4.line_items[ 0 ].total_tax, + }, + ], + }, + ], + } ); + orders.push( order4 ); + + return { + customers: { john, tina }, + orders, + precisionOrder: order4, + hierarchicalOrders: { + parent: order2, + child: order3, + }, + guestOrder, + testProductData, + }; +}; + +const deleteSampleData = async ( sampleData ) => { + await productsTestSetup.deleteSampleData( sampleData.testProductData ); + + sampleData.orders + .concat( [ sampleData.guestOrder ] ) + .forEach( async ( { id } ) => { + await ordersApi.delete.order( id, true ); + } ); + + Object.values( sampleData.customers ).forEach( async ( { id } ) => { + await deleteCustomer( id ); + } ); +}; + +module.exports = { + createSampleData, + deleteSampleData, +}; diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/data/product-list.js b/packages/js/api-core-tests/data/product-list.js similarity index 100% rename from plugins/woocommerce/tests/e2e/api-core-tests/data/product-list.js rename to packages/js/api-core-tests/data/product-list.js diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/data/products-crud.js b/packages/js/api-core-tests/data/products-crud.js similarity index 100% rename from plugins/woocommerce/tests/e2e/api-core-tests/data/products-crud.js rename to packages/js/api-core-tests/data/products-crud.js diff --git a/packages/js/api-core-tests/data/products.js b/packages/js/api-core-tests/data/products.js deleted file mode 100644 index 0264b39a094..00000000000 --- a/packages/js/api-core-tests/data/products.js +++ /dev/null @@ -1,1690 +0,0 @@ -/** - * Internal dependencies - */ -const { - getRequest, - postRequest, - putRequest, - deleteRequest, -} = require('../utils/request'); - -const getProducts = ( params = {} ) => getRequest( 'products', params ); - -const createProduct = ( data ) => postRequest( 'products', data ); -const createProductVariations = ( parentId, variations ) => postRequest( - `products/${ parentId }/variations/batch`, - { - create: variations, - } -) -const createProducts = ( products ) => postRequest( 'products/batch', { create: products } ); -const createProductCategory = ( data ) => postRequest( 'products/categories', data ); -const createProductAttribute = ( name ) => postRequest( 'products/attributes', { name } ); -const createProductAttributeTerms = ( parentId, termNames ) => postRequest( - `products/attributes/${ parentId }/terms/batch`, - { - create: termNames.map( name => ( { name } ) ) - } -); -const createProductReview = ( productId, review ) => postRequest( 'products/reviews', { - product_id: productId, - ...review, -} ); -const updateProductReview = ( reviewId, data = {} ) => putRequest( `products/reviews/${ reviewId }`, data ); -const createProductTag = ( name ) => postRequest( 'products/tags', { name } ); -const createShippingClass = ( name ) => postRequest( 'products/shipping_classes', { name } ); -const createTaxClass = ( name ) => postRequest( 'taxes/classes', { name } ); - -const createSampleCategories = async () => { - const { body: clothing } = await createProductCategory( { name: 'Clothing' } ); - const { body: accessories } = await createProductCategory( { name: 'Accessories', parent: clothing.id } ); - const { body: hoodies } = await createProductCategory( { name: 'Hoodies', parent: clothing.id } ); - const { body: tshirts } = await createProductCategory( { name: 'Tshirts', parent: clothing.id } ); - const { body: decor } = await createProductCategory( { name: 'Decor' } ); - const { body: music } = await createProductCategory( { name: 'Music' } ); - - return { - clothing, - accessories, - hoodies, - tshirts, - decor, - music, - }; -}; - -const createSampleAttributes = async () => { - const { body: color } = await createProductAttribute( 'Color' ); - const { body: size } = await createProductAttribute( 'Size' ); - const { body: colors } = await createProductAttributeTerms( color.id, [ 'Blue', 'Gray', 'Green', 'Red', 'Yellow' ] ); - const { body: sizes } = await createProductAttributeTerms( size.id, [ 'Large', 'Medium', 'Small' ] ); - - return { - color, - colors: colors.create, - size, - sizes: sizes.create, - }; -}; - -const createSampleTags = async () => { - const { body: cool } = await createProductTag( 'Cool' ); - - return { - cool, - }; -} - -const createSampleShippingClasses = async () => { - const { body: freight } = await createShippingClass( 'Freight' ); - - return { - freight, - }; -} - -const createSampleTaxClasses = async () => { - const { body: reducedRate } = await createTaxClass( 'Reduced Rate' ); - - return { - reducedRate, - }; -} - -const createSampleSimpleProducts = async ( categories, attributes, tags ) => { - const description = '

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. ' - + 'Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. ' - + 'Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

\n'; - - const { body: simpleProducts } = await createProducts( [ - { - name: 'Beanie with Logo', - date_created_gmt: '2021-09-01T15:50:20', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'Woo-beanie-logo', - price: '18', - regular_price: '20', - sale_price: '18', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.2', - dimensions: { length: '6', width: '4', height: '1' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.accessories.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Red' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 62, 63, 61, 60 ], - stock_status: 'instock' - }, - { - name: 'T-Shirt with Logo', - date_created_gmt: '2021-09-02T15:50:20', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'Woo-tshirt-logo', - price: '18', - regular_price: '18', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.5', - dimensions: { length: '10', width: '12', height: '0.5' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.tshirts.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Gray' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 59, 67, 66, 56 ], - stock_status: 'instock' - }, - { - name: 'Single', - date_created_gmt: '2021-09-03T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple, virtual product.

\n', - sku: 'woo-single', - price: '2', - regular_price: '3', - sale_price: '2', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: true, - downloadable: true, - downloads: [ - { - id: '2579cf07-8b08-4c25-888a-b6258dd1f035', - name: 'Single', - file: 'https://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2017/08/single.jpg' - } - ], - download_limit: 1, - download_expiry: 1, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '', - dimensions: { length: '', width: '', height: '' }, - shipping_required: false, - shipping_taxable: false, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.music.id } ], - tags: [], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 68 ], - stock_status: 'instock' - }, - { - name: 'Album', - date_created_gmt: '2021-09-04T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple, virtual product.

\n', - sku: 'woo-album', - price: '15', - regular_price: '15', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: true, - downloadable: true, - downloads: [ - { - id: 'cc10249f-1de2-44d4-93d3-9f88ae629f76', - name: 'Single 1', - file: 'https://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2017/08/single.jpg' - }, - { - id: 'aea8ef69-ccdc-4d83-8e21-3c395ebb9411', - name: 'Single 2', - file: 'https://demo.woothemes.com/woocommerce/wp-content/uploads/sites/56/2017/08/album.jpg' - } - ], - download_limit: 1, - download_expiry: 1, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '', - dimensions: { length: '', width: '', height: '' }, - shipping_required: false, - shipping_taxable: false, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.music.id } ], - tags: [], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 69 ], - stock_status: 'instock' - }, - { - name: 'Polo', - date_created_gmt: '2021-09-05T15:50:19', - type: 'simple', - status: 'pending', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-polo', - price: '20', - regular_price: '20', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.8', - dimensions: { length: '6', width: '5', height: '1' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.tshirts.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Blue' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 59, 56, 66, 76 ], - stock_status: 'instock' - }, - { - name: 'Long Sleeve Tee', - date_created_gmt: '2021-09-06T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-long-sleeve-tee', - price: '25', - regular_price: '25', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '1', - dimensions: { length: '7', width: '5', height: '1' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: 'freight', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.tshirts.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Green' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 59, 56, 76, 67 ], - stock_status: 'instock' - }, - { - name: 'Hoodie with Zipper', - date_created_gmt: '2021-09-07T15:50:19', - type: 'simple', - status: 'publish', - featured: true, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-hoodie-with-zipper', - price: '45', - regular_price: '45', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '2', - dimensions: { length: '8', width: '6', height: '2' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.hoodies.id } ], - tags: [], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 57, 58 ], - stock_status: 'instock' - }, - { - name: 'Hoodie with Pocket', - date_created_gmt: '2021-09-08T15:50:19', - type: 'simple', - status: 'publish', - featured: true, - catalog_visibility: 'hidden', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-hoodie-with-pocket', - price: '35', - regular_price: '45', - sale_price: '35', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '3', - dimensions: { length: '10', width: '8', height: '2' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.hoodies.id } ], - tags: [ { id: tags.cool.id } ], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Gray' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 65, 57, 58 ], - stock_status: 'instock' - }, - { - name: 'Sunglasses', - date_created_gmt: '2021-09-09T15:50:19', - type: 'simple', - status: 'publish', - featured: true, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-sunglasses', - price: '90', - regular_price: '90', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: 'reduced-rate', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.2', - dimensions: { length: '4', width: '1.4', height: '1' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.accessories.id } ], - tags: [ { id: tags.cool.id } ], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 60, 62, 77, 61 ], - stock_status: 'instock' - }, - { - name: 'Cap', - date_created_gmt: '2021-09-10T15:50:19', - type: 'simple', - status: 'publish', - featured: true, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-cap', - price: '16', - regular_price: '18', - sale_price: '16', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.6', - dimensions: { length: '8', width: '6.5', height: '4' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.accessories.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Yellow' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 60, 77, 61, 63 ], - stock_status: 'instock' - }, - { - name: 'Belt', - date_created_gmt: '2021-09-12T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-belt', - price: '55', - regular_price: '65', - sale_price: '55', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '1.2', - dimensions: { length: '12', width: '2', height: '1.5' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.accessories.id } ], - tags: [], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 63, 77, 62, 60 ], - stock_status: 'instock' - }, - { - name: 'Beanie', - date_created_gmt: '2021-09-13T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-beanie', - price: '18', - regular_price: '20', - sale_price: '18', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.2', - dimensions: { length: '4', width: '5', height: '0.5' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.accessories.id } ], - tags: [ { id: tags.cool.id } ], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Red' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 63, 62, 61, 77 ], - stock_status: 'instock' - }, - { - name: 'T-Shirt', - date_created_gmt: '2021-09-14T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-tshirt', - price: '18', - regular_price: '18', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.8', - dimensions: { length: '8', width: '6', height: '1' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.tshirts.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Gray' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 67, 76, 56, 66 ], - stock_status: 'onbackorder' - }, - { - name: 'Hoodie with Logo', - date_created_gmt: '2021-09-15T15:50:19', - type: 'simple', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a simple product.

\n', - sku: 'woo-hoodie-with-logo', - price: '45', - regular_price: '45', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '2', - dimensions: { length: '10', width: '6', height: '3' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.hoodies.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: false, - options: [ 'Blue' ] - } - ], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [ 57, 65 ], - stock_status: 'instock' - } - ] ); - - return simpleProducts.create; -}; - -const createSampleExternalProducts = async ( categories ) => { - const { body: externalProducts } = await createProducts( [ - { - name: 'WordPress Pennant', - date_created_gmt: '2021-09-16T15:50:20', - type: 'external', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description: - '

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. ' - + 'Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. ' - + 'Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

\n', - short_description: '

This is an external product.

\n', - sku: 'wp-pennant', - price: '11.05', - regular_price: '11.05', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: false, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: 'https://mercantile.wordpress.org/product/wordpress-pennant/', - button_text: 'Buy on the WordPress swag store!', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '', - dimensions: { length: '', width: '', height: '' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.decor.id } ], - tags: [], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: [], - menu_order: 0, - related_ids: [], - stock_status: 'instock' - }, - ] ); - - return externalProducts.create; -}; - -const createSampleGroupedProduct = async ( categories ) => { - const { body: logoProducts } = await getProducts( { - search: 'logo', - _fields: [ 'id' ], - } ); - - const { body: groupedProducts } = await createProducts( [ - { - name: 'Logo Collection', - date_created_gmt: '2021-09-17T15:50:20', - type: 'grouped', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description: - '

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. ' - + 'Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. ' - + 'Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

\n', - short_description: '

This is a grouped product.

\n', - sku: 'logo-collection', - price: '18', - regular_price: '', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: false, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '', - dimensions: { length: '', width: '', height: '' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.clothing.id } ], - tags: [], - attributes: [], - default_attributes: [], - variations: [], - grouped_products: logoProducts.map( p => p.id ), - menu_order: 0, - related_ids: [], - stock_status: 'instock' - }, - ] ); - - return groupedProducts.create; -}; - -const createSampleVariableProducts = async ( categories, attributes ) => { - const description = '

Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. ' - + 'Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. ' - + 'Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.

\n'; - const { body: hoodie } = await createProduct( { - name: 'Hoodie', - date_created_gmt: '2021-09-18T15:50:19', - type: 'variable', - status: 'publish', - featured: false, - catalog_visibility: 'visible', - description, - short_description: '

This is a variable product.

\n', - sku: 'woo-hoodie', - price: '42', - regular_price: '', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '1.5', - dimensions: { length: '10', width: '8', height: '3' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.hoodies.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: true, - options: [ 'Blue', 'Green', 'Red' ] - }, - { - id: 0, - name: 'Logo', - position: 1, - visible: true, - variation: true, - options: [ 'Yes', 'No' ] - } - ], - default_attributes: [], - grouped_products: [], - menu_order: 0, - stock_status: 'instock' - } ); - - const variationDescription = - '

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum sagittis orci ac odio dictum tincidunt. ' - + 'Donec ut metus leo. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. ' - + 'Sed luctus, dui eu sagittis sodales, nulla nibh sagittis augue, vel porttitor diam enim non metus. ' - + 'Vestibulum aliquam augue neque. Phasellus tincidunt odio eget ullamcorper efficitur. ' - + 'Cras placerat ut turpis pellentesque vulputate. Nam sed consequat tortor. Curabitur finibus sapien dolor. ' - + 'Ut eleifend tellus nec erat pulvinar dignissim. Nam non arcu purus. Vivamus et massa massa.

\n'; - - const { body: hoodieVariations } = await createProductVariations( hoodie.id, [ - { - date_created_gmt: '2021-09-19T15:50:20', - description: variationDescription, - sku: 'woo-hoodie-blue-logo', - price: '45', - regular_price: '45', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '1.5', - dimensions: { length: '10', width: '8', height: '3' }, - shipping_class: '', - attributes: [ - { id: attributes.color.id, option: 'Blue' }, - { id: 0, name: 'Logo', option: 'Yes' } - ], - menu_order: 0 - }, - { - date_created_gmt: '2021-09-20T15:50:20', - description: variationDescription, - sku: 'woo-hoodie-blue', - price: '45', - regular_price: '45', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '1.5', - dimensions: { length: '10', width: '8', height: '3' }, - shipping_class: '', - attributes: [ - { id: attributes.color.id, option: 'Blue' }, - { id: 0, name: 'Logo', option: 'No' } - ], - menu_order: 3 - }, - { - date_created_gmt: '2021-09-21T15:50:20', - description: variationDescription, - sku: 'woo-hoodie-green', - price: '45', - regular_price: '45', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '1.5', - dimensions: { length: '10', width: '8', height: '3' }, - shipping_class: '', - attributes: [ - { id: attributes.color.id, option: 'Green' }, - { id: 0, name: 'Logo', option: 'No' } - ], - menu_order: 2 - }, - { - date_created_gmt: '2021-09-22T15:50:19', - description: variationDescription, - sku: 'woo-hoodie-red', - price: '42', - regular_price: '45', - sale_price: '42', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: true, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '1.5', - dimensions: { length: '10', width: '8', height: '3' }, - shipping_class: '', - attributes: [ - { id: attributes.color.id, option: 'Red' }, - { id: 0, name: 'Logo', option: 'No' } - ], - menu_order: 1 - } - ] ); - - const { body: vneck } = await createProduct( { - name: 'V-Neck T-Shirt', - date_created_gmt: '2021-09-23T15:50:19', - type: 'variable', - status: 'publish', - featured: true, - catalog_visibility: 'visible', - description, - short_description: '

This is a variable product.

\n', - sku: 'woo-vneck-tee', - price: '15', - regular_price: '', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - purchasable: true, - total_sales: 0, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - external_url: '', - button_text: '', - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - sold_individually: false, - weight: '0.5', - dimensions: { length: '24', width: '1', height: '2' }, - shipping_required: true, - shipping_taxable: true, - shipping_class: '', - reviews_allowed: true, - average_rating: '0.00', - rating_count: 0, - upsell_ids: [], - cross_sell_ids: [], - parent_id: 0, - purchase_note: '', - categories: [ { id: categories.tshirts.id } ], - tags: [], - attributes: [ - { - id: attributes.color.id, - position: 0, - visible: true, - variation: true, - options: [ 'Blue', 'Green', 'Red' ] - }, - { - id: attributes.size.id, - position: 1, - visible: true, - variation: true, - options: [ 'Large', 'Medium', 'Small' ] - } - ], - default_attributes: [], - grouped_products: [], - menu_order: 0, - stock_status: 'instock' - } ); - - const { body: vneckVariations } = await createProductVariations( vneck.id, [ - { - date_created_gmt: '2021-09-24T15:50:19', - description: variationDescription, - sku: 'woo-vneck-tee-blue', - price: '15', - regular_price: '15', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '0.5', - dimensions: { length: '24', width: '1', height: '2' }, - shipping_class: '', - attributes: [ { id: attributes.color.id, option: 'Blue' } ], - menu_order: 0 - }, - { - date_created_gmt: '2021-09-25T15:50:19', - description: variationDescription, - sku: 'woo-vneck-tee-green', - price: '20', - regular_price: '20', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '0.5', - dimensions: { length: '24', width: '1', height: '2' }, - shipping_class: '', - attributes: [ { id: attributes.color.id, option: 'Green' } ], - menu_order: 0 - }, - { - date_created_gmt: '2021-09-26T15:50:19', - description: variationDescription, - sku: 'woo-vneck-tee-red', - price: '20', - regular_price: '20', - sale_price: '', - date_on_sale_from_gmt: null, - date_on_sale_to_gmt: null, - on_sale: false, - status: 'publish', - purchasable: true, - virtual: false, - downloadable: false, - downloads: [], - download_limit: 0, - download_expiry: 0, - tax_status: 'taxable', - tax_class: '', - manage_stock: false, - stock_quantity: null, - stock_status: 'instock', - backorders: 'no', - backorders_allowed: false, - backordered: false, - low_stock_amount: null, - weight: '0.5', - dimensions: { length: '24', width: '1', height: '2' }, - shipping_class: '', - attributes: [ { id: attributes.color.id, option: 'Red' } ], - menu_order: 0 - } - ] ); - - return { - hoodie, - hoodieVariations: hoodieVariations.create, - vneck, - vneckVariations: vneckVariations.create, - }; -}; - -const createSampleHierarchicalProducts = async () => { - const { body: parent } = await createProduct( { - name: 'Parent Product', - date_created_gmt: '2021-09-27T15:50:19', - } ); - - const { body: child } = await createProduct( { - name: 'Child Product', - parent_id: parent.id, - date_created_gmt: '2021-09-28T15:50:19', - } ); - - return { - parent, - child, - } -}; - -const createSampleProductReviews = async ( simpleProducts ) => { - const cap = simpleProducts.find( p => p.name === 'Cap' ); - const shirt = simpleProducts.find( p => p.name === 'T-Shirt' ); - const sunglasses = simpleProducts.find( p => p.name === 'Sunglasses' ); - - let { body: review1 } = await createProductReview( cap.id, { - rating: 3, - review: 'Decent cap.', - reviewer: 'John Doe', - reviewer_email: 'john.doe@example.com', - } ); - // We need to update the review in order for the product's - // average_rating to be recalculated. - // See: https://github.com/woocommerce/woocommerce/issues/29906. - await updateProductReview( review1.id ); - - let { body: review2 } = await createProductReview( shirt.id, { - rating: 5, - review: 'The BEST shirt ever!!', - reviewer: 'Shannon Smith', - reviewer_email: 'shannon.smith@example.com', - } ); - await updateProductReview( review2.id ); - - let { body: review3 } = await createProductReview( sunglasses.id, { - rating: 1, - review: 'These are way too expensive.', - reviewer: 'Tim Frugalman', - reviewer_email: 'timmyfrufru@example.com', - } ); - await updateProductReview( review3.id ); - - return [ review1.id, review2.id, review3.id ]; -}; - -const createSampleProductOrders = async ( simpleProducts ) => { - const single = simpleProducts.find( p => p.name === 'Single' ); - const beanie = simpleProducts.find( p => p.name === 'Beanie with Logo' ); - const shirt = simpleProducts.find( p => p.name === 'T-Shirt' ); - - const { body: order } = await postRequest( 'orders', { - set_paid: true, - status: 'completed', - line_items: [ - { - product_id: single.id, - quantity: 2, - }, - { - product_id: beanie.id, - quantity: 3, - }, - { - product_id: shirt.id, - quantity: 1, - }, - ], - } ); - - return [ order ]; -}; - -const createSampleData = async () => { - const categories = await createSampleCategories(); - const attributes = await createSampleAttributes(); - const tags = await createSampleTags(); - const shippingClasses = await createSampleShippingClasses(); - const taxClasses = await createSampleTaxClasses(); - - const simpleProducts = await createSampleSimpleProducts( categories, attributes, tags ); - const externalProducts = await createSampleExternalProducts( categories ); - const groupedProducts = await createSampleGroupedProduct( categories ); - const variableProducts = await createSampleVariableProducts( categories, attributes ); - const hierarchicalProducts = await createSampleHierarchicalProducts(); - - const reviewIds = await createSampleProductReviews( simpleProducts ); - const orders = await createSampleProductOrders( simpleProducts ); - - return { - categories, - attributes, - tags, - shippingClasses, - taxClasses, - simpleProducts, - externalProducts, - groupedProducts, - variableProducts, - hierarchicalProducts, - reviewIds, - orders, - }; -}; - -const deleteSampleData = async ( sampleData ) => { - const { - categories, - attributes, - tags, - shippingClasses, - taxClasses, - simpleProducts, - externalProducts, - groupedProducts, - variableProducts, - hierarchicalProducts, - orders, - } = sampleData; - - const productIds = [].concat( - simpleProducts.map( p => p.id ) - ).concat( - externalProducts.map( p => p.id ) - ).concat( - groupedProducts.map( p => p.id ) - ).concat( [ - variableProducts.hoodie.id, - variableProducts.vneck.id, - ] ).concat( [ - hierarchicalProducts.parent.id, - hierarchicalProducts.child.id, - ] ); - - orders.forEach( async ( { id } ) => { - await deleteRequest( `orders/${ id }`, true ); - } ); - - productIds.forEach( async ( id ) => { - await deleteRequest( `products/${ id }`, true ); - } ); - - await deleteRequest( `products/attributes/${ attributes.color.id }`, true ); - await deleteRequest( `products/attributes/${ attributes.size.id }`, true ); - - Object.values( categories ).forEach( async ( { id } ) => { - await deleteRequest( `products/categories/${ id }`, true ); - } ); - - Object.values( tags ).forEach( async ( { id } ) => { - await deleteRequest( `products/tags/${ id }`, true ); - } ); - - Object.values( shippingClasses ).forEach( async ( { id } ) => { - await deleteRequest( `products/shipping_classes/${ id }`, true ); - } ); - - Object.values( taxClasses ).forEach( async ( { slug } ) => { - await deleteRequest( `taxes/classes/${ slug }`, true ); - } ); -}; - -module.exports = { - createSampleData, - deleteSampleData, -}; diff --git a/packages/js/api-core-tests/data/refund.js b/packages/js/api-core-tests/data/refund.js index 7e467836b13..13a35f0cb58 100644 --- a/packages/js/api-core-tests/data/refund.js +++ b/packages/js/api-core-tests/data/refund.js @@ -1,4 +1,3 @@ - /** * A basic refund. * @@ -7,7 +6,7 @@ * https://woocommerce.github.io/woocommerce-rest-api-docs/#order-refund-properties * */ - const refund = { +const refund = { api_refund: false, amount: '1.00', reason: 'Late delivery refund.', diff --git a/packages/js/api-core-tests/endpoints/orders.js b/packages/js/api-core-tests/endpoints/orders.js index 2233fec0113..ad0aacf5ca6 100644 --- a/packages/js/api-core-tests/endpoints/orders.js +++ b/packages/js/api-core-tests/endpoints/orders.js @@ -1,8 +1,13 @@ /** * Internal dependencies */ -const { getRequest, postRequest, putRequest, deleteRequest } = require('../utils/request'); -const { getOrderExample, shared } = require('../data'); +const { + getRequest, + postRequest, + putRequest, + deleteRequest, +} = require( '../utils/request' ); +const { getOrderExample, shared } = require( '../data' ); /** * WooCommerce Orders endpoints. @@ -24,7 +29,8 @@ const ordersApi = { method: 'GET', path: 'orders/', responseCode: 200, - order: async ( orderId ) => getRequest( `orders/${ orderId }` ), + order: async ( orderId, ordersQuery = {} ) => + getRequest( `orders/${ orderId }`, ordersQuery ), }, listAll: { name: 'List all orders', diff --git a/packages/js/api-core-tests/endpoints/refunds.js b/packages/js/api-core-tests/endpoints/refunds.js index 3646278caa3..a4fb63ab704 100644 --- a/packages/js/api-core-tests/endpoints/refunds.js +++ b/packages/js/api-core-tests/endpoints/refunds.js @@ -1,8 +1,7 @@ - /** * Internal dependencies */ - const { +const { getRequest, postRequest, deleteRequest, diff --git a/packages/js/api-core-tests/project.json b/packages/js/api-core-tests/project.json new file mode 100644 index 00000000000..1b27a1e913d --- /dev/null +++ b/packages/js/api-core-tests/project.json @@ -0,0 +1,31 @@ +{ + "root": "packages/js/api-core-tests/", + "sourceRoot": "packages/js/api-core-tests", + "projectType": "library", + "targets": { + "test": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test" + } + }, + "test-hello": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:hello" + } + }, + "make-collection": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "make:collection" + } + }, + "test-api": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:api" + } + } + } +} diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/tests/coupons/coupons.test.js b/packages/js/api-core-tests/tests/coupons/coupons.test.js similarity index 100% rename from plugins/woocommerce/tests/e2e/api-core-tests/tests/coupons/coupons.test.js rename to packages/js/api-core-tests/tests/coupons/coupons.test.js diff --git a/packages/js/api-core-tests/tests/orders/orders.test.js b/packages/js/api-core-tests/tests/orders/orders.test.js index 4ece1381286..94df275f0dd 100644 --- a/packages/js/api-core-tests/tests/orders/orders.test.js +++ b/packages/js/api-core-tests/tests/orders/orders.test.js @@ -1,10 +1,11 @@ -const { ordersApi } = require('../../endpoints/orders'); -const { order } = require('../../data'); +const { ordersApi } = require( '../../endpoints/orders' ); +const { order } = require( '../../data' ); +const { createSampleData, deleteSampleData } = require( '../../data/orders' ); /** * Billing properties to update. */ - const updatedCustomerBilling = { +const updatedCustomerBilling = { first_name: 'Jane', last_name: 'Doe', company: 'Automattic', @@ -41,43 +42,523 @@ const updatedCustomerShipping = { * @group orders * */ -describe('Orders API tests', () => { - let orderId; +describe( 'Orders API tests', () => { + let orderId, sampleData; - it('can create an order', async () => { + beforeAll( async () => { + sampleData = await createSampleData(); + }, 100000 ); + + afterAll( async () => { + await deleteSampleData( sampleData ); + }, 10000 ); + + it( 'can create an order', async () => { const response = await ordersApi.create.order( order ); expect( response.status ).toEqual( ordersApi.create.responseCode ); expect( response.body.id ).toBeDefined(); orderId = response.body.id; // Validate the data type and verify the order is in a pending state - expect( typeof response.body.status ).toBe('string'); - expect( response.body.status ).toEqual('pending'); - }); + expect( typeof response.body.status ).toBe( 'string' ); + expect( response.body.status ).toEqual( 'pending' ); + } ); - it('can retrieve an order', async () => { + it( 'can retrieve an order', async () => { const response = await ordersApi.retrieve.order( orderId ); expect( response.status ).toEqual( ordersApi.retrieve.responseCode ); expect( response.body.id ).toEqual( orderId ); - }); + } ); - it('can add shipping and billing contacts to an order', async () => { + it( 'can add shipping and billing contacts to an order', async () => { // Update the billing and shipping fields on the order order.billing = updatedCustomerBilling; order.shipping = updatedCustomerShipping; const response = await ordersApi.update.order( orderId, order ); - expect( response.status).toEqual( ordersApi.update.responseCode ); + expect( response.status ).toEqual( ordersApi.update.responseCode ); expect( response.body.billing ).toEqual( updatedCustomerBilling ); expect( response.body.shipping ).toEqual( updatedCustomerShipping ); - }); + } ); - it('can permanently delete an order', async () => { + it( 'can permanently delete an order', async () => { const response = await ordersApi.delete.order( orderId, true ); expect( response.status ).toEqual( ordersApi.delete.responseCode ); const getOrderResponse = await ordersApi.retrieve.order( orderId ); expect( getOrderResponse.status ).toEqual( 404 ); - }); -}); + } ); + + describe( 'List all orders', () => { + const ORDERS_COUNT = 10; + + it( 'pagination', async () => { + const pageSize = 4; + const page1 = await ordersApi.listAll.orders( { + per_page: pageSize, + } ); + const page2 = await ordersApi.listAll.orders( { + per_page: pageSize, + page: 2, + } ); + expect( page1.statusCode ).toEqual( 200 ); + expect( page2.statusCode ).toEqual( 200 ); + + // Verify total page count. + expect( page1.headers[ 'x-wp-total' ] ).toEqual( + ORDERS_COUNT.toString() + ); + expect( page1.headers[ 'x-wp-totalpages' ] ).toEqual( '3' ); + + // Verify we get pageSize'd arrays. + expect( Array.isArray( page1.body ) ).toBe( true ); + expect( Array.isArray( page2.body ) ).toBe( true ); + expect( page1.body ).toHaveLength( pageSize ); + expect( page2.body ).toHaveLength( pageSize ); + + // Ensure all of the order IDs are unique (no page overlap). + const allOrderIds = page1.body + .concat( page2.body ) + .reduce( ( acc, { id } ) => { + acc[ id ] = 1; + return acc; + }, {} ); + expect( Object.keys( allOrderIds ) ).toHaveLength( pageSize * 2 ); + + // Verify that offset takes precedent over page number. + const page2Offset = await ordersApi.listAll.orders( { + per_page: pageSize, + page: 2, + offset: pageSize + 1, + } ); + // The offset pushes the result set 1 order past the start of page 2. + expect( page2Offset.body ).toEqual( + expect.not.arrayContaining( [ + expect.objectContaining( { id: page2.body[ 0 ].id } ), + ] ) + ); + expect( page2Offset.body[ 0 ].id ).toEqual( page2.body[ 1 ].id ); + + // Verify the last page only has 1 order as we expect. + const lastPage = await ordersApi.listAll.orders( { + per_page: pageSize, + page: 3, + } ); + expect( Array.isArray( lastPage.body ) ).toBe( true ); + expect( lastPage.body ).toHaveLength( 2 ); + + // Verify a page outside the total page count is empty. + const page6 = await ordersApi.listAll.orders( { + per_page: pageSize, + page: 6, + } ); + expect( Array.isArray( page6.body ) ).toBe( true ); + expect( page6.body ).toHaveLength( 0 ); + } ); + + it( 'inclusion / exclusion', async () => { + const allOrders = await ordersApi.listAll.orders( { + per_page: 10, + } ); + expect( allOrders.statusCode ).toEqual( 200 ); + const allOrdersIds = allOrders.body.map( ( order ) => order.id ); + expect( allOrdersIds ).toHaveLength( ORDERS_COUNT ); + + const ordersToFilter = [ + allOrdersIds[ 0 ], + allOrdersIds[ 2 ], + allOrdersIds[ 4 ], + allOrdersIds[ 7 ], + ]; + + const included = await ordersApi.listAll.orders( { + per_page: 20, + include: ordersToFilter.join( ',' ), + } ); + expect( included.statusCode ).toEqual( 200 ); + expect( included.body ).toHaveLength( ordersToFilter.length ); + expect( included.body ).toEqual( + expect.arrayContaining( + ordersToFilter.map( ( id ) => + expect.objectContaining( { id } ) + ) + ) + ); + + const excluded = await ordersApi.listAll.orders( { + per_page: 20, + exclude: ordersToFilter.join( ',' ), + } ); + expect( excluded.statusCode ).toEqual( 200 ); + expect( excluded.body ).toHaveLength( + ORDERS_COUNT - ordersToFilter.length + ); + expect( excluded.body ).toEqual( + expect.not.arrayContaining( + ordersToFilter.map( ( id ) => + expect.objectContaining( { id } ) + ) + ) + ); + } ); + + it( 'parent', async () => { + const result1 = await ordersApi.listAll.orders( { + parent: sampleData.hierarchicalOrders.parent.id, + } ); + expect( result1.statusCode ).toEqual( 200 ); + expect( result1.body ).toHaveLength( 1 ); + expect( result1.body[ 0 ].id ).toBe( + sampleData.hierarchicalOrders.child.id + ); + + const result2 = await ordersApi.listAll.orders( { + parent_exclude: sampleData.hierarchicalOrders.parent.id, + } ); + expect( result2.statusCode ).toEqual( 200 ); + expect( result2.body ).toEqual( + expect.not.arrayContaining( [ + expect.objectContaining( { + id: sampleData.hierarchicalOrders.child.id, + } ), + ] ) + ); + } ); + + it( 'status', async () => { + const result1 = await ordersApi.listAll.orders( { + status: 'completed', + } ); + + expect( result1.statusCode ).toEqual( 200 ); + expect( result1.body ).toHaveLength( 2 ); + expect( result1.body ).toEqual( + expect.arrayContaining( [ + expect.objectContaining( { + status: 'completed', + customer_id: 0, + line_items: expect.arrayContaining( [ + expect.objectContaining( { + name: 'Single', + quantity: 2, + } ), + expect.objectContaining( { + name: 'Beanie with Logo', + quantity: 3, + } ), + expect.objectContaining( { + name: 'T-Shirt', + quantity: 1, + } ), + ] ), + } ), + expect.objectContaining( { + status: 'completed', + customer_id: sampleData.customers.tina.id, + line_items: expect.arrayContaining( [ + expect.objectContaining( { + name: 'Sunglasses', + quantity: 1, + } ), + ] ), + } ), + ] ) + ); + + const result2 = await ordersApi.listAll.orders( { + status: 'processing', + } ); + expect( result2.statusCode ).toEqual( 200 ); + expect( result2.body ).toHaveLength( 8 ); + expect( result2.body ).toEqual( + expect.not.arrayContaining( + result1.body.map( ( { id } ) => + expect.objectContaining( { id } ) + ) + ) + ); + } ); + + it( 'customer', async () => { + const result1 = await ordersApi.listAll.orders( { + customer: sampleData.customers.john.id, + } ); + expect( result1.statusCode ).toEqual( 200 ); + expect( result1.body ).toHaveLength( 5 ); + result1.body.forEach( ( order ) => + expect( order ).toEqual( + expect.objectContaining( { + customer_id: sampleData.customers.john.id, + } ) + ) + ); + + const result2 = await ordersApi.listAll.orders( { + customer: 0, + } ); + expect( result2.statusCode ).toEqual( 200 ); + expect( result2.body ).toHaveLength( 3 ); + result2.body.forEach( ( order ) => + expect( order ).toEqual( + expect.objectContaining( { + customer_id: 0, + } ) + ) + ); + } ); + + it( 'product', async () => { + const beanie = sampleData.testProductData.simpleProducts.find( + ( p ) => p.name === 'Beanie' + ); + const result1 = await ordersApi.listAll.orders( { + product: beanie.id, + } ); + expect( result1.statusCode ).toEqual( 200 ); + expect( result1.body ).toHaveLength( 2 ); + result1.body.forEach( ( order ) => + expect( order ).toEqual( + expect.objectContaining( { + line_items: expect.arrayContaining( [ + expect.objectContaining( { + name: 'Beanie', + } ), + ] ), + } ) + ) + ); + } ); + + // NOTE: This does not verify the `taxes` array nested in line items. + // While the precision parameter doesn't affect those values, after some + // discussion it seems `dp` may not be supported in v4 of the API. + it( 'dp (precision)', async () => { + const expectPrecisionToMatch = ( value, dp ) => { + expect( value ).toEqual( + Number.parseFloat( value ).toFixed( dp ) + ); + }; + + const verifyOrderPrecision = ( order, dp ) => { + expectPrecisionToMatch( order[ 'discount_total' ], dp ); + expectPrecisionToMatch( order[ 'discount_tax' ], dp ); + expectPrecisionToMatch( order[ 'shipping_total' ], dp ); + expectPrecisionToMatch( order[ 'shipping_tax' ], dp ); + expectPrecisionToMatch( order[ 'cart_tax' ], dp ); + expectPrecisionToMatch( order[ 'total' ], dp ); + expectPrecisionToMatch( order[ 'total_tax' ], dp ); + + order[ 'line_items' ].forEach( ( lineItem ) => { + expectPrecisionToMatch( lineItem[ 'total' ], dp ); + expectPrecisionToMatch( lineItem[ 'total_tax' ], dp ); + } ); + + order[ 'tax_lines' ].forEach( ( taxLine ) => { + expectPrecisionToMatch( taxLine[ 'tax_total' ], dp ); + expectPrecisionToMatch( + taxLine[ 'shipping_tax_total' ], + dp + ); + } ); + + order[ 'shipping_lines' ].forEach( ( shippingLine ) => { + expectPrecisionToMatch( shippingLine[ 'total' ], dp ); + expectPrecisionToMatch( shippingLine[ 'total_tax' ], dp ); + } ); + + order[ 'fee_lines' ].forEach( ( feeLine ) => { + expectPrecisionToMatch( feeLine[ 'total' ], dp ); + expectPrecisionToMatch( feeLine[ 'total_tax' ], dp ); + } ); + + order[ 'refunds' ].forEach( ( refund ) => { + expectPrecisionToMatch( refund[ 'total' ], dp ); + } ); + }; + + const result1 = await ordersApi.retrieve.order( + sampleData.precisionOrder.id, + { + dp: 1, + } + ); + expect( result1.statusCode ).toEqual( 200 ); + verifyOrderPrecision( result1.body, 1 ); + + const result2 = await ordersApi.retrieve.order( + sampleData.precisionOrder.id, + { + dp: 3, + } + ); + expect( result2.statusCode ).toEqual( 200 ); + verifyOrderPrecision( result2.body, 3 ); + + const result3 = await ordersApi.retrieve.order( + sampleData.precisionOrder.id + ); + expect( result3.statusCode ).toEqual( 200 ); + verifyOrderPrecision( result3.body, 2 ); // The default value for 'dp' is 2. + } ); + + it( 'search', async () => { + // By default, 'search' looks in: + // - _billing_address_index + // - _shipping_address_index + // - _billing_last_name + // - _billing_email + // - order_item_name + + // Test billing email. + const result1 = await ordersApi.listAll.orders( { + search: 'example.com', + } ); + expect( result1.statusCode ).toEqual( 200 ); + expect( result1.body ).toHaveLength( 7 ); + result1.body.forEach( ( order ) => + expect( order.billing.email ).toContain( 'example.com' ) + ); + + // Test billing address. + const result2 = await ordersApi.listAll.orders( { + search: 'gainesville', // Intentionally lowercase. + } ); + expect( result2.statusCode ).toEqual( 200 ); + expect( result2.body ).toHaveLength( 1 ); + expect( result2.body[ 0 ].id ).toEqual( sampleData.guestOrder.id ); + + // Test shipping address. + const result3 = await ordersApi.listAll.orders( { + search: 'Incognito', + } ); + expect( result3.statusCode ).toEqual( 200 ); + expect( result3.body ).toHaveLength( 1 ); + expect( result3.body[ 0 ].id ).toEqual( sampleData.guestOrder.id ); + + // Test billing last name. + const result4 = await ordersApi.listAll.orders( { + search: 'Doe', + } ); + expect( result4.statusCode ).toEqual( 200 ); + expect( result4.body ).toHaveLength( 5 ); + result4.body.forEach( ( order ) => + expect( order.billing.last_name ).toEqual( 'Doe' ) + ); + + // Test order item name. + const result5 = await ordersApi.listAll.orders( { + search: 'Pennant', + } ); + expect( result5.statusCode ).toEqual( 200 ); + expect( result5.body ).toHaveLength( 2 ); + result5.body.forEach( ( order ) => + expect( order ).toEqual( + expect.objectContaining( { + line_items: expect.arrayContaining( [ + expect.objectContaining( { + name: 'WordPress Pennant', + } ), + ] ), + } ) + ) + ); + } ); + + describe( 'orderby', () => { + // The orders endpoint `orderby` parameter uses WP_Query, so our tests won't + // include slug and title, since they are programmatically generated. + it( 'default', async () => { + // Default = date desc. + const result = await ordersApi.listAll.orders(); + expect( result.statusCode ).toEqual( 200 ); + + // Verify all dates are in descending order. + let lastDate = Date.now(); + result.body.forEach( ( { date_created } ) => { + const created = Date.parse( date_created + '.000Z' ); + expect( lastDate ).toBeGreaterThanOrEqual( created ); + lastDate = created; + } ); + } ); + + it( 'date', async () => { + const result = await ordersApi.listAll.orders( { + order: 'asc', + orderby: 'date', + } ); + expect( result.statusCode ).toEqual( 200 ); + + // Verify all dates are in ascending order. + let lastDate = 0; + result.body.forEach( ( { date_created } ) => { + const created = Date.parse( date_created + '.000Z' ); + expect( created ).toBeGreaterThanOrEqual( lastDate ); + lastDate = created; + } ); + } ); + + it( 'id', async () => { + const result1 = await ordersApi.listAll.orders( { + order: 'asc', + orderby: 'id', + } ); + expect( result1.statusCode ).toEqual( 200 ); + + // Verify all results are in ascending order. + let lastId = 0; + result1.body.forEach( ( { id } ) => { + expect( id ).toBeGreaterThan( lastId ); + lastId = id; + } ); + + const result2 = await ordersApi.listAll.orders( { + order: 'desc', + orderby: 'id', + } ); + expect( result2.statusCode ).toEqual( 200 ); + + // Verify all results are in descending order. + lastId = Number.MAX_SAFE_INTEGER; + result2.body.forEach( ( { id } ) => { + expect( lastId ).toBeGreaterThan( id ); + lastId = id; + } ); + } ); + + it( 'include', async () => { + const includeIds = [ + sampleData.precisionOrder.id, + sampleData.hierarchicalOrders.parent.id, + sampleData.guestOrder.id, + ]; + + const result1 = await ordersApi.listAll.orders( { + order: 'asc', + orderby: 'include', + include: includeIds.join( ',' ), + } ); + expect( result1.statusCode ).toEqual( 200 ); + expect( result1.body ).toHaveLength( includeIds.length ); + + // Verify all results are in proper order. + result1.body.forEach( ( { id }, idx ) => { + expect( id ).toBe( includeIds[ idx ] ); + } ); + + const result2 = await ordersApi.listAll.orders( { + order: 'desc', + orderby: 'include', + include: includeIds.join( ',' ), + } ); + expect( result2.statusCode ).toEqual( 200 ); + expect( result2.body ).toHaveLength( includeIds.length ); + + // Verify all results are in proper order. + result2.body.forEach( ( { id }, idx ) => { + expect( id ).toBe( includeIds[ idx ] ); + } ); + } ); + } ); + } ); +} ); diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/tests/products/product-list.test.js b/packages/js/api-core-tests/tests/products/product-list.test.js similarity index 100% rename from plugins/woocommerce/tests/e2e/api-core-tests/tests/products/product-list.test.js rename to packages/js/api-core-tests/tests/products/product-list.test.js diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/tests/products/products-crud.test.js b/packages/js/api-core-tests/tests/products/products-crud.test.js similarity index 100% rename from plugins/woocommerce/tests/e2e/api-core-tests/tests/products/products-crud.test.js rename to packages/js/api-core-tests/tests/products/products-crud.test.js diff --git a/packages/js/api-core-tests/tests/products/products.test.js b/packages/js/api-core-tests/tests/products/products.test.js deleted file mode 100644 index 9a379eae5f3..00000000000 --- a/packages/js/api-core-tests/tests/products/products.test.js +++ /dev/null @@ -1,777 +0,0 @@ -/** - * Internal dependencies - */ -const { createSampleData, deleteSampleData } = require( '../../data/products' ); -const { productsApi } = require('../../endpoints/products'); - -/** - * Tests for the WooCommerce Products API. - * - * @group api - * @group products - * - */ - describe( 'Products API tests', () => { - - const PRODUCTS_COUNT = 20; - let sampleData; - - beforeAll( async () => { - sampleData = await createSampleData(); - }, 10000 ); - - afterAll( async () => { - await deleteSampleData( sampleData ); - }, 10000 ); - - describe( 'List all products', () => { - - it( 'defaults', async () => { - const result = await productsApi.listAll.products(); - expect( result.statusCode ).toEqual( 200 ); - expect( result.headers['x-wp-total'] ).toEqual( PRODUCTS_COUNT.toString() ); - expect( result.headers['x-wp-totalpages'] ).toEqual( '2' ); - } ); - - it( 'pagination', async () => { - const pageSize = 6; - const page1 = await productsApi.listAll.products( { - per_page: pageSize, - } ); - const page2 = await productsApi.listAll.products( { - per_page: pageSize, - page: 2, - } ); - expect( page1.statusCode ).toEqual( 200 ); - expect( page2.statusCode ).toEqual( 200 ); - - // Verify total page count. - expect( page1.headers['x-wp-total'] ).toEqual( PRODUCTS_COUNT.toString() ); - expect( page1.headers['x-wp-totalpages'] ).toEqual( '4' ); - - // Verify we get pageSize'd arrays. - expect( Array.isArray( page1.body ) ).toBe( true ); - expect( Array.isArray( page2.body ) ).toBe( true ); - expect( page1.body ).toHaveLength( pageSize ); - expect( page2.body ).toHaveLength( pageSize ); - - // Ensure all of the product IDs are unique (no page overlap). - const allProductIds = page1.body.concat( page2.body ).reduce( ( acc, product ) => { - acc[ product.id ] = 1; - return acc; - }, {} ); - expect( Object.keys( allProductIds ) ).toHaveLength( pageSize * 2 ); - - // Verify that offset takes precedent over page number. - const page2Offset = await productsApi.listAll.products( { - per_page: pageSize, - page: 2, - offset: pageSize + 1, - } ); - // The offset pushes the result set 1 product past the start of page 2. - expect( page2Offset.body ).toEqual( - expect.not.arrayContaining( [ - expect.objectContaining( { id: page2.body[0].id } ) - ] ) - ); - expect( page2Offset.body[0].id ).toEqual( page2.body[1].id ); - - // Verify the last page only has 2 products as we expect. - const lastPage = await productsApi.listAll.products( { - per_page: pageSize, - page: 4, - } ); - expect( Array.isArray( lastPage.body ) ).toBe( true ); - expect( lastPage.body ).toHaveLength( 2 ); - - // Verify a page outside the total page count is empty. - const page6 = await productsApi.listAll.products( { - per_page: pageSize, - page: 6, - } ); - expect( Array.isArray( page6.body ) ).toBe( true ); - expect( page6.body ).toHaveLength( 0 ); - } ); - - it( 'search', async () => { - // Match in the short description. - const result1 = await productsApi.listAll.products( { - search: 'external' - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( 1 ); - expect( result1.body[0].name ).toBe( 'WordPress Pennant' ); - - // Match in the product name. - const result2 = await productsApi.listAll.products( { - search: 'pocket' - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( 1 ); - expect( result2.body[0].name ).toBe( 'Hoodie with Pocket' ); - } ); - - it( 'inclusion / exclusion', async () => { - const allProducts = await productsApi.listAll.products( { - per_page: 20, - } ); - expect( allProducts.statusCode ).toEqual( 200 ); - const allProductIds = allProducts.body.map( product => product.id ); - expect( allProductIds ).toHaveLength( PRODUCTS_COUNT ); - - const productsToFilter = [ - allProductIds[2], - allProductIds[4], - allProductIds[7], - allProductIds[13], - ]; - - const included = await productsApi.listAll.products( { - per_page: 20, - include: productsToFilter.join( ',' ), - } ); - expect( included.statusCode ).toEqual( 200 ); - expect( included.body ).toHaveLength( productsToFilter.length ); - expect( included.body ).toEqual( - expect.arrayContaining( - productsToFilter.map( id => expect.objectContaining( { id } ) ) - ) - ); - - const excluded = await productsApi.listAll.products( { - per_page: 20, - exclude: productsToFilter.join( ',' ), - } ); - expect( excluded.statusCode ).toEqual( 200 ); - expect( excluded.body ).toHaveLength( PRODUCTS_COUNT - productsToFilter.length ); - expect( excluded.body ).toEqual( - expect.not.arrayContaining( - productsToFilter.map( id => expect.objectContaining( { id } ) ) - ) - ); - - } ); - - it( 'slug', async () => { - // Match by slug. - const result1 = await productsApi.listAll.products( { - slug: 't-shirt-with-logo' - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( 1 ); - expect( result1.body[0].slug ).toBe( 't-shirt-with-logo' ); - - // No matches - const result2 = await productsApi.listAll.products( { - slug: 'no-product-with-this-slug' - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( 0 ); - } ); - - it( 'sku', async () => { - // Match by SKU. - const result1 = await productsApi.listAll.products( { - sku: 'woo-sunglasses' - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( 1 ); - expect( result1.body[0].sku ).toBe( 'woo-sunglasses' ); - - // No matches - const result2 = await productsApi.listAll.products( { - sku: 'no-product-with-this-sku' - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( 0 ); - } ); - - it( 'type', async () => { - const result1 = await productsApi.listAll.products( { - type: 'simple' - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.headers['x-wp-total'] ).toEqual( '16' ); - - const result2 = await productsApi.listAll.products( { - type: 'external' - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( 1 ); - expect( result2.body[0].name ).toBe( 'WordPress Pennant' ); - - const result3 = await productsApi.listAll.products( { - type: 'variable' - } ); - expect( result3.statusCode ).toEqual( 200 ); - expect( result3.body ).toHaveLength( 2 ); - - const result4 = await productsApi.listAll.products( { - type: 'grouped' - } ); - expect( result4.statusCode ).toEqual( 200 ); - expect( result4.body ).toHaveLength( 1 ); - expect( result4.body[0].name ).toBe( 'Logo Collection' ); - } ); - - it( 'featured', async () => { - const featured = [ - expect.objectContaining( { name: 'Hoodie with Zipper' } ), - expect.objectContaining( { name: 'Hoodie with Pocket' } ), - expect.objectContaining( { name: 'Sunglasses' } ), - expect.objectContaining( { name: 'Cap' } ), - expect.objectContaining( { name: 'V-Neck T-Shirt' } ), - ]; - - const result1 = await productsApi.listAll.products( { - featured: true, - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( featured.length ); - expect( result1.body ).toEqual( expect.arrayContaining( featured ) ); - - const result2 = await productsApi.listAll.products( { - featured: false, - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toEqual( expect.not.arrayContaining( featured ) ); - } ); - - it( 'categories', async () => { - const accessory = [ - expect.objectContaining( { name: 'Beanie' } ), - ] - const hoodies = [ - expect.objectContaining( { name: 'Hoodie with Zipper' } ), - expect.objectContaining( { name: 'Hoodie with Pocket' } ), - expect.objectContaining( { name: 'Hoodie with Logo' } ), - expect.objectContaining( { name: 'Hoodie' } ), - ]; - - // Verify that subcategories are included. - const result1 = await productsApi.listAll.products( { - per_page: 20, - category: sampleData.categories.clothing.id, - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toEqual( expect.arrayContaining( accessory ) ); - expect( result1.body ).toEqual( expect.arrayContaining( hoodies ) ); - - // Verify sibling categories are not. - const result2 = await productsApi.listAll.products( { - category: sampleData.categories.hoodies.id, - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toEqual( expect.not.arrayContaining( accessory ) ); - expect( result2.body ).toEqual( expect.arrayContaining( hoodies ) ); - } ); - - it( 'on sale', async () => { - const onSale = [ - expect.objectContaining( { name: 'Beanie with Logo' } ), - expect.objectContaining( { name: 'Hoodie with Pocket' } ), - expect.objectContaining( { name: 'Single' } ), - expect.objectContaining( { name: 'Cap' } ), - expect.objectContaining( { name: 'Belt' } ), - expect.objectContaining( { name: 'Beanie' } ), - expect.objectContaining( { name: 'Hoodie' } ), - ]; - - const result1 = await productsApi.listAll.products( { - on_sale: true, - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( onSale.length ); - expect( result1.body ).toEqual( expect.arrayContaining( onSale ) ); - - const result2 = await productsApi.listAll.products( { - on_sale: false, - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toEqual( expect.not.arrayContaining( onSale ) ); - } ); - - it( 'price', async () => { - const result1 = await productsApi.listAll.products( { - min_price: 21, - max_price: 28, - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( 1 ); - expect( result1.body[0].name ).toBe( 'Long Sleeve Tee' ); - expect( result1.body[0].price ).toBe( '25' ); - - const result2 = await productsApi.listAll.products( { - max_price: 5, - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( 1 ); - expect( result2.body[0].name ).toBe( 'Single' ); - expect( result2.body[0].price ).toBe( '2' ); - - const result3 = await productsApi.listAll.products( { - min_price: 5, - order: 'asc', - orderby: 'price', - } ); - expect( result3.statusCode ).toEqual( 200 ); - expect( result3.body ).toEqual( - expect.not.arrayContaining( [ - expect.objectContaining( { name: 'Single' } ) - ] ) - ); - } ); - - it( 'before / after', async () => { - const before = [ - expect.objectContaining( { name: 'Album' } ), - expect.objectContaining( { name: 'Single' } ), - expect.objectContaining( { name: 'T-Shirt with Logo' } ), - expect.objectContaining( { name: 'Beanie with Logo' } ), - ]; - const after = [ - expect.objectContaining( { name: 'Hoodie' } ), - expect.objectContaining( { name: 'V-Neck T-Shirt' } ), - expect.objectContaining( { name: 'Parent Product' } ), - expect.objectContaining( { name: 'Child Product' } ), - ]; - - const result1 = await productsApi.listAll.products( { - before: '2021-09-05T15:50:19', - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( before.length ); - expect( result1.body ).toEqual( expect.arrayContaining( before ) ); - - const result2 = await productsApi.listAll.products( { - after: '2021-09-18T15:50:18', - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toEqual( expect.not.arrayContaining( before ) ); - expect( result2.body ).toHaveLength( after.length ); - expect( result2.body ).toEqual( expect.arrayContaining( after ) ); - } ); - - it( 'attributes', async () => { - const red = sampleData.attributes.colors.find( term => term.name === 'Red' ); - - const redProducts = [ - expect.objectContaining( { name: 'V-Neck T-Shirt' } ), - expect.objectContaining( { name: 'Hoodie' } ), - expect.objectContaining( { name: 'Beanie' } ), - expect.objectContaining( { name: 'Beanie with Logo' } ), - ]; - - const result = await productsApi.listAll.products( { - attribute: 'pa_color', - attribute_term: red.id, - } ); - - expect( result.statusCode ).toEqual( 200 ); - expect( result.body ).toHaveLength( redProducts.length ); - expect( result.body ).toEqual( expect.arrayContaining( redProducts ) ); - } ); - - it( 'status', async () => { - const result1 = await productsApi.listAll.products( { - status: 'pending' - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( 1 ); - expect( result1.body[0].name ).toBe( 'Polo' ); - - const result2 = await productsApi.listAll.products( { - status: 'draft' - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( 0 ); - } ); - - it( 'shipping class', async () => { - const result = await productsApi.listAll.products( { - shipping_class: sampleData.shippingClasses.freight.id, - } ); - expect( result.statusCode ).toEqual( 200 ); - expect( result.body ).toHaveLength( 1 ); - expect( result.body[0].name ).toBe( 'Long Sleeve Tee' ); - } ); - - it( 'tax class', async () => { - const result = await productsApi.listAll.products( { - tax_class: 'reduced-rate', - } ); - expect( result.statusCode ).toEqual( 200 ); - expect( result.body ).toHaveLength( 1 ); - expect( result.body[0].name ).toBe( 'Sunglasses' ); - } ); - - it( 'stock status', async () => { - const result = await productsApi.listAll.products( { - stock_status: 'onbackorder', - } ); - expect( result.statusCode ).toEqual( 200 ); - expect( result.body ).toHaveLength( 1 ); - expect( result.body[0].name ).toBe( 'T-Shirt' ); - } ); - - it( 'tags', async () => { - const coolProducts = [ - expect.objectContaining( { name: 'Sunglasses' } ), - expect.objectContaining( { name: 'Hoodie with Pocket' } ), - expect.objectContaining( { name: 'Beanie' } ), - ]; - - const result = await productsApi.listAll.products( { - tag: sampleData.tags.cool.id, - } ); - - expect( result.statusCode ).toEqual( 200 ); - expect( result.body ).toHaveLength( coolProducts.length ); - expect( result.body ).toEqual( expect.arrayContaining( coolProducts ) ); - } ); - - it( 'parent', async () => { - const result1 = await productsApi.listAll.products( { - parent: sampleData.hierarchicalProducts.parent.id, - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( 1 ); - expect( result1.body[0].name ).toBe( 'Child Product' ); - - const result2 = await productsApi.listAll.products( { - parent_exclude: sampleData.hierarchicalProducts.parent.id, - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toEqual( expect.not.arrayContaining( [ - expect.objectContaining( { name: 'Child Product' } ), - ] ) ); - } ); - - describe( 'orderby', () => { - const productNamesAsc = [ - 'Album', - 'Beanie', - 'Beanie with Logo', - 'Belt', - 'Cap', - 'Child Product', - 'Hoodie', - 'Hoodie with Logo', - 'Hoodie with Pocket', - 'Hoodie with Zipper', - 'Logo Collection', - 'Long Sleeve Tee', - 'Parent Product', - 'Polo', - 'Single', - 'Sunglasses', - 'T-Shirt', - 'T-Shirt with Logo', - 'V-Neck T-Shirt', - 'WordPress Pennant', - ]; - const productNamesDesc = [ ...productNamesAsc ].reverse(); - const productNamesByRatingAsc = [ - 'Sunglasses', - 'Cap', - 'T-Shirt', - ]; - const productNamesByRatingDesc = [ ...productNamesByRatingAsc ].reverse(); - const productNamesByPopularityDesc = [ - 'Beanie with Logo', - 'Single', - 'T-Shirt', - ]; - const productNamesByPopularityAsc = [ ...productNamesByPopularityDesc ].reverse(); - - it( 'default', async () => { - // Default = date desc. - const result = await productsApi.listAll.products(); - expect( result.statusCode ).toEqual( 200 ); - - // Verify all dates are in descending order. - let lastDate = Date.now(); - result.body.forEach( ( { date_created_gmt } ) => { - const created = Date.parse( date_created_gmt + '.000Z' ); - expect( lastDate ).toBeGreaterThan( created ); - lastDate = created; - } ); - } ); - - it( 'date', async () => { - const result = await productsApi.listAll.products( { - order: 'asc', - orderby: 'date', - } ); - expect( result.statusCode ).toEqual( 200 ); - - // Verify all dates are in ascending order. - let lastDate = 0; - result.body.forEach( ( { date_created_gmt } ) => { - const created = Date.parse( date_created_gmt + '.000Z' ); - expect( created ).toBeGreaterThan( lastDate ); - lastDate = created; - } ); - } ); - - it( 'id', async () => { - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'id', - } ); - expect( result1.statusCode ).toEqual( 200 ); - - // Verify all results are in ascending order. - let lastId = 0; - result1.body.forEach( ( { id } ) => { - expect( id ).toBeGreaterThan( lastId ); - lastId = id; - } ); - - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'id', - } ); - expect( result2.statusCode ).toEqual( 200 ); - - // Verify all results are in descending order. - lastId = Number.MAX_SAFE_INTEGER; - result2.body.forEach( ( { id } ) => { - expect( lastId ).toBeGreaterThan( id ); - lastId = id; - } ); - } ); - - it( 'title', async () => { - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'title', - per_page: productNamesAsc.length, - } ); - expect( result1.statusCode ).toEqual( 200 ); - - // Verify all results are in ascending order. - result1.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesAsc[ idx ] ); - } ); - - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'title', - per_page: productNamesDesc.length, - } ); - expect( result2.statusCode ).toEqual( 200 ); - - // Verify all results are in descending order. - result2.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesDesc[ idx ] ); - } ); - } ); - - it( 'slug', async () => { - const productNamesBySlugAsc = [ - 'Polo', // The Polo isn't published so it has an empty slug. - ...productNamesAsc.filter( p => p !== 'Polo' ), - ]; - const productNamesBySlugDesc = [ ...productNamesBySlugAsc ].reverse(); - - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'slug', - per_page: productNamesBySlugAsc.length, - } ); - expect( result1.statusCode ).toEqual( 200 ); - - // Verify all results are in ascending order. - result1.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesBySlugAsc[ idx ] ); - } ); - - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'slug', - per_page: productNamesBySlugDesc.length, - } ); - expect( result2.statusCode ).toEqual( 200 ); - - // Verify all results are in descending order. - result2.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesBySlugDesc[ idx ] ); - } ); - } ); - - it( 'price', async () => { - const productNamesMinPriceAsc = [ - 'Parent Product', - 'Child Product', - 'Single', - 'WordPress Pennant', - 'Album', - 'V-Neck T-Shirt', - 'Cap', - 'Beanie with Logo', - 'T-Shirt with Logo', - 'Beanie', - 'T-Shirt', - 'Logo Collection', - 'Polo', - 'Long Sleeve Tee', - 'Hoodie with Pocket', - 'Hoodie', - 'Hoodie with Zipper', - 'Hoodie with Logo', - 'Belt', - 'Sunglasses', - ]; - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'price', - per_page: productNamesMinPriceAsc.length - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( productNamesMinPriceAsc.length ); - - // Verify all results are in ascending order. - // The query uses the min price calculated in the product meta lookup table, - // so we can't just check the price property of the response. - result1.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesMinPriceAsc[ idx ] ); - } ); - - const productNamesMaxPriceDesc = [ - 'Sunglasses', - 'Belt', - 'Hoodie', - 'Logo Collection', - 'Hoodie with Logo', - 'Hoodie with Zipper', - 'Hoodie with Pocket', - 'Long Sleeve Tee', - 'V-Neck T-Shirt', - 'Polo', - 'T-Shirt', - 'Beanie', - 'T-Shirt with Logo', - 'Beanie with Logo', - 'Cap', - 'Album', - 'WordPress Pennant', - 'Single', - 'Child Product', - 'Parent Product', - ]; - - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'price', - per_page: productNamesMaxPriceDesc.length - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( productNamesMaxPriceDesc.length ); - - // Verify all results are in descending order. - // The query uses the max price calculated in the product meta lookup table, - // so we can't just check the price property of the response. - result2.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesMaxPriceDesc[ idx ] ); - } ); - } ); - - // This case will remain skipped until orderby include is fixed. - // See: https://github.com/woocommerce/woocommerce/issues/30354#issuecomment-925955099. - it( 'include', async () => { - const includeIds = [ - sampleData.groupedProducts[ 0 ].id, - sampleData.simpleProducts[ 3 ].id, - sampleData.hierarchicalProducts.parent.id, - ]; - - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'include', - include: includeIds.join( ',' ), - } ); - expect( result1.statusCode ).toEqual( 200 ); - expect( result1.body ).toHaveLength( includeIds.length ); - - // Verify all results are in proper order. - result1.body.forEach( ( { id }, idx ) => { - expect( id ).toBe( includeIds[ idx ] ); - } ); - - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'include', - include: includeIds.join( ',' ), - } ); - expect( result2.statusCode ).toEqual( 200 ); - expect( result2.body ).toHaveLength( includeIds.length ); - - // Verify all results are in proper order. - result2.body.forEach( ( { id }, idx ) => { - expect( id ).toBe( includeIds[ idx ] ); - } ); - } ); - - it( 'rating (desc)', async () => { - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'rating', - per_page: productNamesByRatingDesc.length, - } ); - expect( result2.statusCode ).toEqual( 200 ); - - // Verify all results are in descending order. - result2.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesByRatingDesc[ idx ] ); - } ); - } ); - - // This case will remain skipped until ratings can be sorted ascending. - // See: https://github.com/woocommerce/woocommerce/issues/30354#issuecomment-925955099. - it.skip( 'rating (asc)', async () => { - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'rating', - per_page: productNamesByRatingAsc.length, - } ); - expect( result1.statusCode ).toEqual( 200 ); - - // Verify all results are in ascending order. - result1.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesByRatingAsc[ idx ] ); - } ); - } ); - - it( 'popularity (desc)', async () => { - const result2 = await productsApi.listAll.products( { - order: 'desc', - orderby: 'popularity', - per_page: productNamesByPopularityDesc.length, - } ); - expect( result2.statusCode ).toEqual( 200 ); - - // Verify all results are in descending order. - result2.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesByPopularityDesc[ idx ] ); - } ); - } ); - - // This case will remain skipped until popularity can be sorted ascending. - // See: https://github.com/woocommerce/woocommerce/issues/30354#issuecomment-925955099. - it.skip( 'popularity (asc)', async () => { - const result1 = await productsApi.listAll.products( { - order: 'asc', - orderby: 'popularity', - per_page: productNamesByPopularityAsc.length, - } ); - expect( result1.statusCode ).toEqual( 200 ); - - // Verify all results are in ascending order. - result1.body.forEach( ( { name }, idx ) => { - expect( name ).toBe( productNamesByPopularityAsc[ idx ] ); - } ); - } ); - } ); - } ); -} ); diff --git a/packages/js/api/.eslintrc.js b/packages/js/api/.eslintrc.js index 957aa457452..75d467c88d1 100644 --- a/packages/js/api/.eslintrc.js +++ b/packages/js/api/.eslintrc.js @@ -1,12 +1,9 @@ module.exports = { parser: '@typescript-eslint/parser', env: { - 'jest/globals': true + 'jest/globals': true, }, - ignorePatterns: [ - 'dist/', - 'node_modules/' - ], + ignorePatterns: [ 'dist/', 'node_modules/' ], rules: { 'no-unused-vars': 'off', 'no-dupe-class-members': 'off', @@ -14,18 +11,11 @@ module.exports = { 'no-useless-constructor': 'off', '@typescript-eslint/no-useless-constructor': 2, }, - plugins: [ - '@typescript-eslint' - ], - extends: [ - 'plugin:@wordpress/eslint-plugin/recommended-with-formatting' - ], + plugins: [ '@typescript-eslint/eslint-plugin' ], + extends: [ 'plugin:@wordpress/eslint-plugin/recommended-with-formatting' ], overrides: [ { - files: [ - '**/*.js', - '**/*.ts' - ], + files: [ '**/*.js', '**/*.ts' ], settings: { jsdoc: { mode: 'typescript', @@ -33,13 +23,10 @@ module.exports = { }, }, { - files: [ - '**/*.spec.ts', - '**/*.test.ts' - ], + files: [ '**/*.spec.ts', '**/*.test.ts' ], rules: { 'no-console': 'off', - } - } - ] -} + }, + }, + ], +}; diff --git a/packages/js/api/.gitignore b/packages/js/api/.gitignore index 1f578929131..e22a3150198 100644 --- a/packages/js/api/.gitignore +++ b/packages/js/api/.gitignore @@ -1,18 +1,2 @@ - # Editors -project.xml -project.properties /nbproject/private/ -.buildpath -.project -.settings* -.idea -.vscode -*.sublime-project -*.sublime-workspace -.sublimelinterrc - -# Build Artifacts -/node_modules/ -/dist/ -tsconfig.tsbuildinfo diff --git a/packages/js/api/NEXT_CHANGELOG.md b/packages/js/api/NEXT_CHANGELOG.md new file mode 100644 index 00000000000..33c2a06e5ec --- /dev/null +++ b/packages/js/api/NEXT_CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +[See legacy changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob//packages/js/api/CHANGELOG.md). diff --git a/packages/js/api/changelog/.gitkeep b/packages/js/api/changelog/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/js/api/composer.json b/packages/js/api/composer.json new file mode 100644 index 00000000000..d5ea2d1d861 --- /dev/null +++ b/packages/js/api/composer.json @@ -0,0 +1,27 @@ +{ + "name": "woocommerce/api", + "description": "WooCommerce API", + "type": "library", + "license": "GPL-3.0-or-later", + "minimum-stability": "dev", + "require-dev": { + "automattic/jetpack-changelogger": "3.0.2" + }, + "extra": { + "changelogger": { + "formatter": { + "filename": "../../../tools/changelogger/PackageFormatter.php" + }, + "types": [ + "Fix", + "Add", + "Update", + "Dev", + "Tweak", + "Performance", + "Enhancement" + ], + "changelog": "NEXT_CHANGELOG.md" + } + } +} diff --git a/packages/js/api/composer.lock b/packages/js/api/composer.lock new file mode 100644 index 00000000000..2b7e38de2b3 --- /dev/null +++ b/packages/js/api/composer.lock @@ -0,0 +1,1021 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "1f8115cd526598664a4be58c5a4c3a7c", + "packages": [], + "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 | ^5.2", + "symfony/process": "^3.4 | ^5.2", + "wikimedia/at-ease": "^1.2 | ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 | ^2.0", + "yoast/phpunit-polyfills": "1.0.2" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "mirror-repo": "Automattic/jetpack-changelogger", + "version-constants": { + "::VERSION": "src/Application.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-changelogger/compare/${old}...${new}" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Changelogger\\": "src", + "Automattic\\Jetpack\\Changelog\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "time": "2021-11-02T14:06:49+00:00" + }, + { + "name": "psr/container", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "symfony/console", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "30885182c981ab175d4d034db0f6f469898070ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T17:12:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/11b9acb5e8619aef6455735debf77dde8825795c", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-13T13:58:33+00:00" + }, + { + "name": "symfony/process", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-13T09:35:11+00:00" + }, + { + "name": "symfony/string", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-28T19:23:26+00:00" + }, + { + "name": "wikimedia/at-ease", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "35.0.0", + "mediawiki/minus-x": "1.1.1", + "ockcyp/covers-validator": "1.3.3", + "php-parallel-lint/php-console-highlighter": "0.5.0", + "php-parallel-lint/php-parallel-lint": "1.2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + }, + "files": [ + "src/Wikimedia/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "time": "2021-02-27T15:53:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/packages/js/api/package.json b/packages/js/api/package.json index bc885c8b52a..56388920230 100644 --- a/packages/js/api/package.json +++ b/packages/js/api/package.json @@ -34,20 +34,21 @@ "test": "jest" }, "dependencies": { - "axios": "0.21.2", + "axios": "^0.24.0", "create-hmac": "1.1.7", "oauth-1.0a": "2.2.6" }, "devDependencies": { "@types/create-hmac": "1.1.0", - "@types/jest": "25.2.1", - "@types/moxios": "^0.4.9", + "@types/jest": "^27.0.2", "@types/node": "13.13.5", - "jest": "^25.1.0", - "jest-mock-extended": "^1.0.10", - "moxios": "0.4.0", + "@typescript-eslint/eslint-plugin": "^5.3.1", + "@typescript-eslint/parser": "^5.3.1", + "axios-mock-adapter": "^1.20.0", + "eslint": "^8.2.0", + "jest": "^27.3.1", "ts-jest": "25.5.0", - "typescript": "3.9.7" + "typescript": "^4.4.4" }, "publishConfig": { "access": "public" diff --git a/packages/js/api/project.json b/packages/js/api/project.json new file mode 100644 index 00000000000..68d0a0cdbad --- /dev/null +++ b/packages/js/api/project.json @@ -0,0 +1,43 @@ +{ + "root": "packages/js/api/", + "sourceRoot": "packages/js/api/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build" + } + }, + "clean": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "clean" + } + }, + "compile": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "compile" + } + }, + "prepare": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "prepare" + } + }, + "lint": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "lint" + } + }, + "test": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test" + } + } + } +} diff --git a/packages/js/api/src/framework/__tests__/model-repository.spec.ts b/packages/js/api/src/framework/__tests__/model-repository.spec.ts index cae60a083ac..abb39998638 100644 --- a/packages/js/api/src/framework/__tests__/model-repository.spec.ts +++ b/packages/js/api/src/framework/__tests__/model-repository.spec.ts @@ -101,7 +101,7 @@ describe( 'ModelRepository', () => { const created = await repository.create( { parent: 'yes' }, { childName: 'test' } ); expect( created ).toBe( model ); - expect( callback ).toHaveBeenCalledWith( { childName: 'test' } ); + expect( callback ).toHaveBeenCalledWith( { parent: 'yes' }, { childName: 'test' } ); } ); it( 'should throw error on create without callback', () => { diff --git a/packages/js/api/src/framework/transformations/__tests__/model-transformer-transformation.spec.ts b/packages/js/api/src/framework/transformations/__tests__/model-transformer-transformation.spec.ts index 2edecc01c69..6e5834aaeac 100644 --- a/packages/js/api/src/framework/transformations/__tests__/model-transformer-transformation.spec.ts +++ b/packages/js/api/src/framework/transformations/__tests__/model-transformer-transformation.spec.ts @@ -1,52 +1,54 @@ +import { mocked } from 'ts-jest/utils' import { ModelTransformerTransformation } from '../model-transformer-transformation'; import { ModelTransformer } from '../../model-transformer'; -import { mock, MockProxy } from 'jest-mock-extended'; import { DummyModel } from '../../../__test_data__/dummy-model'; +jest.mock( '../../model-transformer' ); + describe( 'ModelTransformerTransformation', () => { - let mockTransformer: MockProxy< ModelTransformer< any > > & ModelTransformer< any >; + let propertyTransformer: ModelTransformer< any >; let transformation: ModelTransformerTransformation< any >; beforeEach( () => { - mockTransformer = mock< ModelTransformer< any > >(); + propertyTransformer = new ModelTransformer( [] ); transformation = new ModelTransformerTransformation< DummyModel >( 'test', DummyModel, - mockTransformer, + propertyTransformer, ); } ); it( 'should execute child transformer', () => { - mockTransformer.toModel.mockReturnValue( { toModel: 'Test' } ); + mocked( propertyTransformer.toModel ).mockReturnValue( { toModel: 'Test' } ); let transformed = transformation.toModel( { test: 'Test' } ); expect( transformed ).toMatchObject( { test: { toModel: 'Test' } } ); - expect( mockTransformer.toModel ).toHaveBeenCalledWith( DummyModel, 'Test' ); + expect( propertyTransformer.toModel ).toHaveBeenCalledWith( DummyModel, 'Test' ); - mockTransformer.fromModel.mockReturnValue( { fromModel: 'Test' } ); + mocked( propertyTransformer.fromModel ).mockReturnValue( { fromModel: 'Test' } ); transformed = transformation.fromModel( { test: 'Test' } ); expect( transformed ).toMatchObject( { test: { fromModel: 'Test' } } ); - expect( mockTransformer.fromModel ).toHaveBeenCalledWith( 'Test' ); + expect( propertyTransformer.fromModel ).toHaveBeenCalledWith( 'Test' ); } ); it( 'should execute child transformer on array', () => { - mockTransformer.toModel.mockReturnValue( { toModel: 'Test' } ); + mocked( propertyTransformer.toModel ).mockReturnValue( { toModel: 'Test' } ); let transformed = transformation.toModel( { test: [ 'Test', 'Test2' ] } ); expect( transformed ).toMatchObject( { test: [ { toModel: 'Test' }, { toModel: 'Test' } ] } ); - expect( mockTransformer.toModel ).toHaveBeenCalledWith( DummyModel, 'Test' ); - expect( mockTransformer.toModel ).toHaveBeenCalledWith( DummyModel, 'Test2' ); + expect( propertyTransformer.toModel ).toHaveBeenCalledWith( DummyModel, 'Test' ); + expect( propertyTransformer.toModel ).toHaveBeenCalledWith( DummyModel, 'Test2' ); - mockTransformer.fromModel.mockReturnValue( { fromModel: 'Test' } ); + mocked( propertyTransformer.fromModel ).mockReturnValue( { fromModel: 'Test' } ); transformed = transformation.fromModel( { test: [ 'Test', 'Test2' ] } ); expect( transformed ).toMatchObject( { test: [ { fromModel: 'Test' }, { fromModel: 'Test' } ] } ); - expect( mockTransformer.fromModel ).toHaveBeenCalledWith( 'Test' ); - expect( mockTransformer.fromModel ).toHaveBeenCalledWith( 'Test2' ); + expect( propertyTransformer.fromModel ).toHaveBeenCalledWith( 'Test' ); + expect( propertyTransformer.fromModel ).toHaveBeenCalledWith( 'Test2' ); } ); } ); diff --git a/packages/js/api/src/http/axios/__tests__/axios-client.spec.ts b/packages/js/api/src/http/axios/__tests__/axios-client.spec.ts index 97d0a3fbd84..eadf4bb2f44 100644 --- a/packages/js/api/src/http/axios/__tests__/axios-client.spec.ts +++ b/packages/js/api/src/http/axios/__tests__/axios-client.spec.ts @@ -1,56 +1,57 @@ -import * as moxios from 'moxios'; +import MockAdapter from 'axios-mock-adapter'; import { AxiosClient } from '../axios-client'; import { HTTPResponse } from '../../http-client'; import { AxiosInterceptor } from '../axios-interceptor'; -import { mock } from 'jest-mock-extended'; +import axios from 'axios'; + +class DummyInterceptor extends AxiosInterceptor { + public start = jest.fn(); + public stop = jest.fn(); +} describe( 'AxiosClient', () => { let httpClient: AxiosClient; - beforeEach( () => { - moxios.install(); - } ); - - afterEach( () => { - moxios.uninstall(); - } ); - it( 'should transform to HTTPResponse', async () => { + const adapter = new MockAdapter( axios ); + httpClient = new AxiosClient( { baseURL: 'http://test.test' } ); - moxios.stubRequest( '/test', { - status: 200, - headers: { - 'Content-Type': 'application/json', - }, - responseText: JSON.stringify( { test: 'value' } ), - } ); + adapter + .onGet( '/test' ) + .reply( + 200, + { test: 'value' }, + { 'content-type': 'application/json' } + ); const response = await httpClient.get( '/test' ); + + adapter.restore(); + expect( response ).toBeInstanceOf( HTTPResponse ); expect( response ).toHaveProperty( 'statusCode', 200 ); - expect( response ).toHaveProperty( 'headers', { 'content-type': 'application/json' } ); + expect( response ).toHaveProperty( 'headers', { + 'content-type': 'application/json', + } ); expect( response ).toHaveProperty( 'data', { test: 'value' } ); } ); it( 'should start extra interceptors', async () => { - const interceptor = mock< AxiosInterceptor >(); + const interceptor = new DummyInterceptor(); - httpClient = new AxiosClient( - { baseURL: 'http://test.test' }, - [ interceptor ], - ); + const adapter = new MockAdapter( axios ); - moxios.stubRequest( '/test', { - status: 200, - headers: { - 'Content-Type': 'application/json', - }, - responseText: JSON.stringify( { test: 'value' } ), - } ); + httpClient = new AxiosClient( { baseURL: 'http://test.test' }, [ + interceptor, + ] ); + + adapter.onGet( '/test' ).reply( 200, { test: 'value' } ); await httpClient.get( '/test' ); + adapter.restore(); + expect( interceptor.start ).toHaveBeenCalled(); } ); } ); diff --git a/packages/js/api/src/http/axios/__tests__/axios-interceptor.spec.ts b/packages/js/api/src/http/axios/__tests__/axios-interceptor.spec.ts index d0e2160d9dc..496e23d4772 100644 --- a/packages/js/api/src/http/axios/__tests__/axios-interceptor.spec.ts +++ b/packages/js/api/src/http/axios/__tests__/axios-interceptor.spec.ts @@ -1,5 +1,5 @@ import axios, { AxiosInstance } from 'axios'; -import * as moxios from 'moxios'; +import MockAdapter from 'axios-mock-adapter'; import { AxiosInterceptor } from '../axios-interceptor'; class TestInterceptor extends AxiosInterceptor {} @@ -7,10 +7,11 @@ class TestInterceptor extends AxiosInterceptor {} describe( 'AxiosInterceptor', () => { let interceptors: TestInterceptor[]; let axiosInstance: AxiosInstance; + let adapter: MockAdapter; beforeEach( () => { axiosInstance = axios.create(); - moxios.install( axiosInstance ); + adapter = new MockAdapter( axiosInstance ); interceptors = []; } ); @@ -18,11 +19,11 @@ describe( 'AxiosInterceptor', () => { for ( const interceptor of interceptors ) { interceptor.stop( axiosInstance ); } - moxios.uninstall( axiosInstance ); + adapter.restore(); } ); it( 'should not break interceptor chaining for success', async () => { - moxios.stubRequest( 'http://test.test', { status: 200 } ); + adapter.onGet( 'http://test.test' ).reply( 200 ); interceptors.push( new TestInterceptor() ); interceptors.push( new TestInterceptor() ); @@ -37,7 +38,7 @@ describe( 'AxiosInterceptor', () => { } ); it( 'should not break interceptor chaining for errors', async () => { - moxios.stubRequest( 'http://test.test', { status: 401 } ); + adapter.onGet( 'http://test.test' ).reply( 401 ); interceptors.push( new TestInterceptor() ); interceptors.push( new TestInterceptor() ); diff --git a/packages/js/api/src/http/axios/__tests__/axios-oauth-interceptor.spec.ts b/packages/js/api/src/http/axios/__tests__/axios-oauth-interceptor.spec.ts index 2f6949269cc..8999730e1d2 100644 --- a/packages/js/api/src/http/axios/__tests__/axios-oauth-interceptor.spec.ts +++ b/packages/js/api/src/http/axios/__tests__/axios-oauth-interceptor.spec.ts @@ -1,14 +1,15 @@ import axios, { AxiosInstance } from 'axios'; -import * as moxios from 'moxios'; +import MockAdapter from 'axios-mock-adapter'; import { AxiosOAuthInterceptor } from '../axios-oauth-interceptor'; describe( 'AxiosOAuthInterceptor', () => { let apiAuthInterceptor: AxiosOAuthInterceptor; let axiosInstance: AxiosInstance; + let adapter: MockAdapter; beforeEach( () => { axiosInstance = axios.create(); - moxios.install( axiosInstance ); + adapter = new MockAdapter( axiosInstance ); apiAuthInterceptor = new AxiosOAuthInterceptor( 'consumer_key', 'consumer_secret', @@ -18,66 +19,40 @@ describe( 'AxiosOAuthInterceptor', () => { afterEach( () => { apiAuthInterceptor.stop( axiosInstance ); - moxios.uninstall( axiosInstance ); - } ); - - it( 'should not run unless started', async () => { - moxios.stubRequest( 'https://api.test', { status: 200 } ); - - apiAuthInterceptor.stop( axiosInstance ); - await axiosInstance.get( 'https://api.test' ); - - let request = moxios.requests.mostRecent(); - expect( request.headers ).not.toHaveProperty( 'Authorization' ); - - apiAuthInterceptor.start( axiosInstance ); - await axiosInstance.get( 'https://api.test' ); - - request = moxios.requests.mostRecent(); - expect( request.headers ).toHaveProperty( 'Authorization' ); + adapter.restore(); } ); it( 'should use basic auth for HTTPS', async () => { - moxios.stubRequest( 'https://api.test', { status: 200 } ); - await axiosInstance.get( 'https://api.test' ); + adapter.onGet( 'https://api.test' ).reply( 200 ); + const response = await axiosInstance.get( 'https://api.test' ); - const request = moxios.requests.mostRecent(); - - expect( request.headers ).toHaveProperty( 'Authorization' ); - expect( request.headers.Authorization ).toBe( - 'Basic ' + - Buffer.from( 'consumer_key:consumer_secret' ).toString( 'base64' ), - ); + expect( response.config.auth ).not.toBeNull(); + expect( response.config.auth!.username ).toBe( 'consumer_key' ); + expect( response.config.auth!.password ).toBe( 'consumer_secret' ); } ); it( 'should use OAuth 1.0a for HTTP', async () => { - moxios.stubRequest( 'http://api.test', { status: 200 } ); - await axiosInstance.get( 'http://api.test' ); - - const request = moxios.requests.mostRecent(); + adapter.onGet( 'http://api.test' ).reply( 200 ); + const response = await axiosInstance.get( 'http://api.test' ); // We're going to assume that the oauth-1.0a package added the signature data correctly so we will // focus on ensuring that the header looks roughly correct given what we readily know. - expect( request.headers ).toHaveProperty( 'Authorization' ); - expect( request.headers.Authorization ).toMatch( + expect( response.config.headers! ).toHaveProperty( 'Authorization' ); + expect( response.config.headers!.Authorization ).toMatch( /^OAuth oauth_consumer_key="consumer_key".*oauth_signature_method="HMAC-SHA256".*oauth_version="1.0"/, ); } ); it( 'should work with base URL', async () => { - moxios.stubRequest( '/test', { status: 200 } ); - await axiosInstance.request( { + adapter.onGet( 'https://api.test/test' ).reply( 200 ); + const response = await axiosInstance.request( { method: 'GET', baseURL: 'https://api.test/', url: '/test', } ); - const request = moxios.requests.mostRecent(); - - expect( request.headers ).toHaveProperty( 'Authorization' ); - expect( request.headers.Authorization ).toBe( - 'Basic ' + - Buffer.from( 'consumer_key:consumer_secret' ).toString( 'base64' ), - ); + expect( response.config.auth ).not.toBeNull(); + expect( response.config.auth!.username ).toBe( 'consumer_key' ); + expect( response.config.auth!.password ).toBe( 'consumer_secret' ); } ); } ); diff --git a/packages/js/api/src/http/axios/__tests__/axios-response-interceptor.spec.ts b/packages/js/api/src/http/axios/__tests__/axios-response-interceptor.spec.ts index 8f602682610..95e635d3bd8 100644 --- a/packages/js/api/src/http/axios/__tests__/axios-response-interceptor.spec.ts +++ b/packages/js/api/src/http/axios/__tests__/axios-response-interceptor.spec.ts @@ -1,31 +1,30 @@ import axios, { AxiosInstance } from 'axios'; -import * as moxios from 'moxios'; +import MockAdapter from 'axios-mock-adapter'; import { AxiosResponseInterceptor } from '../axios-response-interceptor'; describe( 'AxiosResponseInterceptor', () => { let apiResponseInterceptor: AxiosResponseInterceptor; let axiosInstance: AxiosInstance; + let adapter: MockAdapter; beforeEach( () => { axiosInstance = axios.create(); - moxios.install( axiosInstance ); + adapter = new MockAdapter( axiosInstance ); apiResponseInterceptor = new AxiosResponseInterceptor(); apiResponseInterceptor.start( axiosInstance ); } ); afterEach( () => { apiResponseInterceptor.stop( axiosInstance ); - moxios.uninstall(); + adapter.restore(); } ); it( 'should transform responses into an HTTPResponse', async () => { - moxios.stubRequest( 'http://test.test', { - status: 200, - headers: { - 'Content-Type': 'application/json', - }, - responseText: JSON.stringify( { test: 'value' } ), - } ); + adapter.onGet( 'http://test.test' ).reply( + 200, + { test: 'value' }, + { 'content-type': 'application/json' } + ); const response = await axiosInstance.get( 'http://test.test' ); @@ -41,13 +40,11 @@ describe( 'AxiosResponseInterceptor', () => { } ); it( 'should transform error responses into an HTTPResponse', async () => { - moxios.stubRequest( 'http://test.test', { - status: 404, - headers: { - 'Content-Type': 'application/json', - }, - responseText: JSON.stringify( { code: 'error_code', message: 'value' } ), - } ); + adapter.onGet( 'http://test.test' ).reply( + 404, + { code: 'error_code', message: 'value' }, + { 'content-type': 'application/json' } + ); await expect( axiosInstance.get( 'http://test.test' ) ).rejects.toMatchObject( { statusCode: 404, @@ -62,7 +59,7 @@ describe( 'AxiosResponseInterceptor', () => { } ); it( 'should bubble non-response errors', async () => { - moxios.stubTimeout( 'http://test.test' ); + adapter.onGet( 'http://test.test' ).timeout(); await expect( axiosInstance.get( 'http://test.test' ) ).rejects.toMatchObject( new Error( 'timeout of 0ms exceeded' ), diff --git a/packages/js/api/src/http/axios/__tests__/axios-url-to-query-interceptor.spec.ts b/packages/js/api/src/http/axios/__tests__/axios-url-to-query-interceptor.spec.ts index 190d4a3abd3..af797a455f8 100644 --- a/packages/js/api/src/http/axios/__tests__/axios-url-to-query-interceptor.spec.ts +++ b/packages/js/api/src/http/axios/__tests__/axios-url-to-query-interceptor.spec.ts @@ -1,31 +1,33 @@ import axios, { AxiosInstance } from 'axios'; -import * as moxios from 'moxios'; +import MockAdapter from 'axios-mock-adapter'; import { AxiosURLToQueryInterceptor } from '../axios-url-to-query-interceptor'; describe( 'AxiosURLToQueryInterceptor', () => { let urlToQueryInterceptor: AxiosURLToQueryInterceptor; let axiosInstance: AxiosInstance; + let adapter: MockAdapter; beforeEach( () => { axiosInstance = axios.create(); - moxios.install( axiosInstance ); + adapter = new MockAdapter( axiosInstance ); urlToQueryInterceptor = new AxiosURLToQueryInterceptor( 'test' ); urlToQueryInterceptor.start( axiosInstance ); } ); afterEach( () => { urlToQueryInterceptor.stop( axiosInstance ); - moxios.uninstall(); + adapter.restore(); } ); it( 'should put path in query string', async () => { - moxios.stubRequest( 'http://test.test/?test=%2Ftest%2Froute', { - status: 200, - headers: { - 'Content-Type': 'application/json', - }, - responseText: JSON.stringify( { test: 'value' } ), - } ); + adapter.onGet( + 'http://test.test/', + { params: { test: '/test/route' } } + ).reply( + 200, + { test: 'value' }, + { 'content-type': 'application/json' } + ); const response = await axiosInstance.get( 'http://test.test/test/route' ); diff --git a/packages/js/api/src/http/axios/axios-oauth-interceptor.ts b/packages/js/api/src/http/axios/axios-oauth-interceptor.ts index ff565d19170..f86aa3b9f8b 100644 --- a/packages/js/api/src/http/axios/axios-oauth-interceptor.ts +++ b/packages/js/api/src/http/axios/axios-oauth-interceptor.ts @@ -50,7 +50,7 @@ export class AxiosOAuthInterceptor extends AxiosInterceptor { username: this.oauth.consumer.key, password: this.oauth.consumer.secret, }; - } else { + } else if ( request.headers ) { request.headers.Authorization = this.oauth.toHeader( this.oauth.authorize( { url, diff --git a/packages/js/api/src/repositories/rest/__tests__/shared.spec.ts b/packages/js/api/src/repositories/rest/__tests__/shared.spec.ts index 6a4d67e935e..b81b56d0a2c 100644 --- a/packages/js/api/src/repositories/rest/__tests__/shared.spec.ts +++ b/packages/js/api/src/repositories/rest/__tests__/shared.spec.ts @@ -1,4 +1,4 @@ -import { mock, MockProxy } from 'jest-mock-extended'; +import { mocked } from 'ts-jest/utils'; import { HTTPClient, HTTPResponse } from '../../../http'; import { ModelTransformer, ModelRepositoryParams } from '../../../framework'; import { DummyModel } from '../../../__test_data__/dummy-model'; @@ -26,17 +26,25 @@ class DummyChildModel extends Model { } type DummyChildParams = ModelRepositoryParams< DummyChildModel, { parent: string }, { childSearch: string }, 'childName' > +jest.mock( '../../../framework/model-transformer' ); + describe( 'Shared REST Functions', () => { - let mockClient: MockProxy< HTTPClient >; - let mockTransformer: MockProxy< ModelTransformer< any > > & ModelTransformer< any >; + let mockClient: HTTPClient; + let mockTransformer: ModelTransformer< any >; beforeEach( () => { - mockClient = mock< HTTPClient >(); - mockTransformer = mock< ModelTransformer< any > >(); + mockClient = { + get: jest.fn(), + post: jest.fn(), + patch: jest.fn(), + put: jest.fn(), + delete: jest.fn(), + }; + mockTransformer = new ModelTransformer( [] ); } ); it( 'restList', async () => { - mockClient.get.mockResolvedValue( new HTTPResponse( + mocked( mockClient.get ).mockResolvedValue( new HTTPResponse( 200, {}, [ @@ -50,7 +58,7 @@ describe( 'Shared REST Functions', () => { }, ], ) ); - mockTransformer.toModel.mockReturnValue( new DummyModel( { name: 'Test' } ) ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyModel( { name: 'Test' } ) ); const fn = restList< DummyModelParams >( () => 'test-url', DummyModel, mockClient, mockTransformer ); @@ -65,7 +73,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restListChildren', async () => { - mockClient.get.mockResolvedValue( new HTTPResponse( + mocked( mockClient.get ).mockResolvedValue( new HTTPResponse( 200, {}, [ @@ -79,7 +87,7 @@ describe( 'Shared REST Functions', () => { }, ], ) ); - mockTransformer.toModel.mockReturnValue( new DummyChildModel( { name: 'Test' } ) ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyChildModel( { name: 'Test' } ) ); const fn = restListChild< DummyChildParams >( ( parent ) => 'test-url-' + parent.parent, @@ -99,7 +107,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restCreate', async () => { - mockClient.post.mockResolvedValue( new HTTPResponse( + mocked( mockClient.post ).mockResolvedValue( new HTTPResponse( 200, {}, { @@ -107,8 +115,8 @@ describe( 'Shared REST Functions', () => { label: 'Test 1', }, ) ); - mockTransformer.fromModel.mockReturnValue( { name: 'From-Test' } ); - mockTransformer.toModel.mockReturnValue( new DummyModel( { name: 'Test' } ) ); + mocked( mockTransformer.fromModel ).mockReturnValue( { name: 'From-Test' } ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyModel( { name: 'Test' } ) ); const fn = restCreate< DummyModelParams >( ( properties ) => 'test-url-' + properties.name, @@ -126,7 +134,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restRead', async () => { - mockClient.get.mockResolvedValue( new HTTPResponse( + mocked( mockClient.get ).mockResolvedValue( new HTTPResponse( 200, {}, { @@ -134,7 +142,7 @@ describe( 'Shared REST Functions', () => { label: 'Test 1', }, ) ); - mockTransformer.toModel.mockReturnValue( new DummyModel( { name: 'Test' } ) ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyModel( { name: 'Test' } ) ); const fn = restRead< DummyModelParams >( ( id ) => 'test-url-' + id, DummyModel, mockClient, mockTransformer ); @@ -146,7 +154,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restReadChildren', async () => { - mockClient.get.mockResolvedValue( new HTTPResponse( + mocked( mockClient.get ).mockResolvedValue( new HTTPResponse( 200, {}, { @@ -154,7 +162,7 @@ describe( 'Shared REST Functions', () => { label: 'Test 1', }, ) ); - mockTransformer.toModel.mockReturnValue( new DummyChildModel( { name: 'Test' } ) ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyChildModel( { name: 'Test' } ) ); const fn = restReadChild< DummyChildParams >( ( parent, id ) => 'test-url-' + parent.parent + '-' + id, @@ -171,7 +179,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restUpdate', async () => { - mockClient.patch.mockResolvedValue( new HTTPResponse( + mocked( mockClient.patch ).mockResolvedValue( new HTTPResponse( 200, {}, { @@ -179,8 +187,8 @@ describe( 'Shared REST Functions', () => { label: 'Test 1', }, ) ); - mockTransformer.fromModel.mockReturnValue( { name: 'From-Test' } ); - mockTransformer.toModel.mockReturnValue( new DummyModel( { name: 'Test' } ) ); + mocked( mockTransformer.fromModel ).mockReturnValue( { name: 'From-Test' } ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyModel( { name: 'Test' } ) ); const fn = restUpdate< DummyModelParams >( ( id ) => 'test-url-' + id, DummyModel, mockClient, mockTransformer ); @@ -193,7 +201,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restUpdateChildren', async () => { - mockClient.patch.mockResolvedValue( new HTTPResponse( + mocked( mockClient.patch ).mockResolvedValue( new HTTPResponse( 200, {}, { @@ -201,8 +209,8 @@ describe( 'Shared REST Functions', () => { label: 'Test 1', }, ) ); - mockTransformer.fromModel.mockReturnValue( { name: 'From-Test' } ); - mockTransformer.toModel.mockReturnValue( new DummyChildModel( { name: 'Test' } ) ); + mocked( mockTransformer.fromModel ).mockReturnValue( { name: 'From-Test' } ); + mocked( mockTransformer.toModel ).mockReturnValue( new DummyChildModel( { name: 'Test' } ) ); const fn = restUpdateChild< DummyChildParams >( ( parent, id ) => 'test-url-' + parent.parent + '-' + id, @@ -220,7 +228,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restDelete', async () => { - mockClient.delete.mockResolvedValue( new HTTPResponse( 200, {}, {} ) ); + mocked( mockClient.delete ).mockResolvedValue( new HTTPResponse( 200, {}, {} ) ); const fn = restDelete< DummyModelParams >( ( id ) => 'test-url-' + id, mockClient ); @@ -231,7 +239,7 @@ describe( 'Shared REST Functions', () => { } ); it( 'restDeleteChildren', async () => { - mockClient.delete.mockResolvedValue( new HTTPResponse( 200, {}, {} ) ); + mocked( mockClient.delete ).mockResolvedValue( new HTTPResponse( 200, {}, {} ) ); const fn = restDeleteChild< DummyChildParams >( ( parent, id ) => 'test-url-' + parent.parent + '-' + id, diff --git a/packages/js/api/src/services/__tests__/setting-service.spec.ts b/packages/js/api/src/services/__tests__/setting-service.spec.ts index 3eb61506aee..ba73b849709 100644 --- a/packages/js/api/src/services/__tests__/setting-service.spec.ts +++ b/packages/js/api/src/services/__tests__/setting-service.spec.ts @@ -1,13 +1,14 @@ -import { mock, MockProxy } from 'jest-mock-extended'; import { UpdatesSettings } from '../../models'; import { SettingService } from '../setting-service'; describe( 'SettingService', () => { - let repository: MockProxy< UpdatesSettings >; + let repository: UpdatesSettings; let service: SettingService; beforeEach( () => { - repository = mock< UpdatesSettings >(); + repository = { + update: jest.fn(), + }; service = new SettingService( repository ); } ); diff --git a/packages/js/api/tsconfig.json b/packages/js/api/tsconfig.json index 419ecaa6555..5567fce84ed 100644 --- a/packages/js/api/tsconfig.json +++ b/packages/js/api/tsconfig.json @@ -1,8 +1,8 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { - "types": [ "node", "jest", "axios", "moxios", "create-hmac" ], - "rootDir": "src", + "types": [ "node", "jest", "axios", "create-hmac" ], + "rootDir": "src", "outDir": "dist", "target": "es5" }, diff --git a/packages/js/e2e-core-tests/NEXT_CHANGELOG.md b/packages/js/e2e-core-tests/NEXT_CHANGELOG.md new file mode 100644 index 00000000000..b7c8a41ef4f --- /dev/null +++ b/packages/js/e2e-core-tests/NEXT_CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +[See legacy changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob//packages/js/e2e-core-tests/CHANGELOG.md). diff --git a/packages/js/e2e-core-tests/changelog/.gitkeep b/packages/js/e2e-core-tests/changelog/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/js/e2e-core-tests/composer.json b/packages/js/e2e-core-tests/composer.json new file mode 100644 index 00000000000..93e0c6ec09b --- /dev/null +++ b/packages/js/e2e-core-tests/composer.json @@ -0,0 +1,27 @@ +{ + "name": "woocommerce/e2e-core-tests", + "description": "WooCommerce end to end core tests", + "type": "library", + "license": "GPL-3.0-or-later", + "minimum-stability": "dev", + "require-dev": { + "automattic/jetpack-changelogger": "3.0.2" + }, + "extra": { + "changelogger": { + "formatter": { + "filename": "../../../tools/changelogger/PackageFormatter.php" + }, + "types": [ + "Fix", + "Add", + "Update", + "Dev", + "Tweak", + "Performance", + "Enhancement" + ], + "changelog": "NEXT_CHANGELOG.md" + } + } +} diff --git a/packages/js/e2e-core-tests/composer.lock b/packages/js/e2e-core-tests/composer.lock new file mode 100644 index 00000000000..7e7499aca32 --- /dev/null +++ b/packages/js/e2e-core-tests/composer.lock @@ -0,0 +1,1021 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "25ff60cdb096034e20fe82f606dfd33b", + "packages": [], + "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 | ^5.2", + "symfony/process": "^3.4 | ^5.2", + "wikimedia/at-ease": "^1.2 | ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 | ^2.0", + "yoast/phpunit-polyfills": "1.0.2" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "mirror-repo": "Automattic/jetpack-changelogger", + "version-constants": { + "::VERSION": "src/Application.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-changelogger/compare/${old}...${new}" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Changelogger\\": "src", + "Automattic\\Jetpack\\Changelog\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "time": "2021-11-02T14:06:49+00:00" + }, + { + "name": "psr/container", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "symfony/console", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "30885182c981ab175d4d034db0f6f469898070ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T17:12:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/11b9acb5e8619aef6455735debf77dde8825795c", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-13T13:58:33+00:00" + }, + { + "name": "symfony/process", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-13T09:35:11+00:00" + }, + { + "name": "symfony/string", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-28T19:23:26+00:00" + }, + { + "name": "wikimedia/at-ease", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "35.0.0", + "mediawiki/minus-x": "1.1.1", + "ockcyp/covers-validator": "1.3.3", + "php-parallel-lint/php-console-highlighter": "0.5.0", + "php-parallel-lint/php-parallel-lint": "1.2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + }, + "files": [ + "src/Wikimedia/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "time": "2021-02-27T15:53:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/packages/js/e2e-core-tests/project.json b/packages/js/e2e-core-tests/project.json new file mode 100644 index 00000000000..8e7d28cd936 --- /dev/null +++ b/packages/js/e2e-core-tests/project.json @@ -0,0 +1,5 @@ +{ + "root": "packages/js/e2e-core-tests/", + "sourceRoot": "packages/js/e2e-core-tests", + "projectType": "library" +} diff --git a/packages/js/e2e-core-tests/specs/api/coupon.test.js b/packages/js/e2e-core-tests/specs/api/coupon.test.js index 0d29996ea8b..512cb6d8249 100644 --- a/packages/js/e2e-core-tests/specs/api/coupon.test.js +++ b/packages/js/e2e-core-tests/specs/api/coupon.test.js @@ -7,23 +7,19 @@ const { HTTPClientFactory, Coupon } = require( '@woocommerce/api' ); * External dependencies */ const config = require( 'config' ); -const { - it, - describe, - beforeAll, -} = require( '@jest/globals' ); +const { it, describe, beforeAll } = require( '@jest/globals' ); /** * Create the default coupon and tests interactions with it via the API. */ const runCouponApiTest = () => { - describe('REST API > Coupon', () => { + describe( 'REST API > Coupon', () => { let client; let percentageCoupon; let coupon; let repository; - beforeAll(async () => { + beforeAll( async () => { percentageCoupon = config.get( 'coupons.percentage' ); const admin = config.get( 'users.admin' ); const url = config.get( 'url' ); @@ -34,15 +30,17 @@ const runCouponApiTest = () => { .create(); } ); - it('can create a coupon', async () => { + it( 'can create a coupon', async () => { repository = Coupon.restRepository( client ); // Check properties of the coupon in the create coupon response. coupon = await repository.create( percentageCoupon ); - expect( coupon ).toEqual( expect.objectContaining( percentageCoupon ) ); - }); + expect( coupon ).toEqual( + expect.objectContaining( percentageCoupon ) + ); + } ); - it('can retrieve a coupon', async () => { + it( 'can retrieve a coupon', async () => { const couponProperties = { id: coupon.id, code: percentageCoupon.code, @@ -51,12 +49,16 @@ const runCouponApiTest = () => { }; // Read coupon directly from API to compare. - const response = await client.get( `/wc/v3/coupons/${coupon.id}` ); - expect( response.status ).toBe( 200 ); - expect( response.data ).toEqual( expect.objectContaining( couponProperties ) ); - }); + const response = await client.get( + `/wc/v3/coupons/${ coupon.id }` + ); + expect( response.statusCode ).toBe( 200 ); + expect( response.data ).toEqual( + expect.objectContaining( couponProperties ) + ); + } ); - it('can update a coupon', async () => { + it( 'can update a coupon', async () => { const updatedCouponProperties = { amount: '75.00', discount_type: 'fixed_cart', @@ -66,19 +68,23 @@ const runCouponApiTest = () => { await repository.update( coupon.id, updatedCouponProperties ); // Check the coupon response for the updated values. - const response = await client.get( `/wc/v3/coupons/${coupon.id}` ); - expect( response.status ).toBe( 200 ); - expect( response.data ).toEqual( expect.objectContaining( updatedCouponProperties ) ); - }); + const response = await client.get( + `/wc/v3/coupons/${ coupon.id }` + ); + expect( response.statusCode ).toBe( 200 ); + expect( response.data ).toEqual( + expect.objectContaining( updatedCouponProperties ) + ); + } ); - it('can delete a coupon', async () => { + it( 'can delete a coupon', async () => { // Delete the coupon const status = await repository.delete( coupon.id ); // If the delete is successful, the response comes back truthy expect( status ).toBeTruthy(); - }); - }); + } ); + } ); }; module.exports = runCouponApiTest; diff --git a/packages/js/e2e-core-tests/specs/api/external-product.test.js b/packages/js/e2e-core-tests/specs/api/external-product.test.js index 9cd552a3250..6f8882aedf6 100644 --- a/packages/js/e2e-core-tests/specs/api/external-product.test.js +++ b/packages/js/e2e-core-tests/specs/api/external-product.test.js @@ -7,24 +7,20 @@ const { HTTPClientFactory, ExternalProduct } = require( '@woocommerce/api' ); * External dependencies */ const config = require( 'config' ); -const { - it, - describe, - beforeAll, -} = require( '@jest/globals' ); +const { it, describe, beforeAll } = require( '@jest/globals' ); /** * Create an external product and retrieve via the API. */ const runExternalProductAPITest = () => { // @todo: add a call to ensure pretty permalinks are enabled once settings api is in use. - describe('REST API > External Product', () => { + describe( 'REST API > External Product', () => { let client; let defaultExternalProduct; let product; let repository; - beforeAll(async () => { + beforeAll( async () => { defaultExternalProduct = config.get( 'products.external' ); const admin = config.get( 'users.admin' ); const url = config.get( 'url' ); @@ -35,15 +31,17 @@ const runExternalProductAPITest = () => { .create(); } ); - it('can create an external product', async () => { + it( 'can create an external product', async () => { repository = ExternalProduct.restRepository( client ); // Check properties of product in the create product response. product = await repository.create( defaultExternalProduct ); - expect( product ).toEqual( expect.objectContaining( defaultExternalProduct ) ); - }); + expect( product ).toEqual( + expect.objectContaining( defaultExternalProduct ) + ); + } ); - it('can retrieve a raw external product', async () => { + it( 'can retrieve a raw external product', async () => { const rawProperties = { id: product.id, button_text: defaultExternalProduct.buttonText, @@ -52,12 +50,16 @@ const runExternalProductAPITest = () => { }; // Read product directly from api. - const response = await client.get( `/wc/v3/products/${product.id}` ); - expect( response.status ).toBe( 200 ); - expect( response.data ).toEqual( expect.objectContaining( rawProperties ) ); - }); + const response = await client.get( + `/wc/v3/products/${ product.id }` + ); + expect( response.statusCode ).toBe( 200 ); + expect( response.data ).toEqual( + expect.objectContaining( rawProperties ) + ); + } ); - it('can retrieve a transformed external product', async () => { + it( 'can retrieve a transformed external product', async () => { const transformedProperties = { ...defaultExternalProduct, id: product.id, @@ -66,14 +68,16 @@ const runExternalProductAPITest = () => { // Read product via the repository. const transformed = await repository.read( product.id ); - expect( transformed ).toEqual( expect.objectContaining( transformedProperties ) ); - }); + expect( transformed ).toEqual( + expect.objectContaining( transformedProperties ) + ); + } ); - it('can delete an external product', async () => { + it( 'can delete an external product', async () => { const status = repository.delete( product.id ); expect( status ).toBeTruthy(); - }); - }); + } ); + } ); }; module.exports = runExternalProductAPITest; diff --git a/packages/js/e2e-core-tests/specs/api/grouped-product.test.js b/packages/js/e2e-core-tests/specs/api/grouped-product.test.js index fef241654f9..3a1cf785dd0 100644 --- a/packages/js/e2e-core-tests/specs/api/grouped-product.test.js +++ b/packages/js/e2e-core-tests/specs/api/grouped-product.test.js @@ -1,32 +1,32 @@ /** * Internal dependencies */ -const { HTTPClientFactory, GroupedProduct, SimpleProduct } = require( '@woocommerce/api' ); +const { + HTTPClientFactory, + GroupedProduct, + SimpleProduct, +} = require( '@woocommerce/api' ); /** * External dependencies */ const config = require( 'config' ); -const { - it, - describe, - beforeAll, -} = require( '@jest/globals' ); +const { it, describe, beforeAll } = require( '@jest/globals' ); /** * Create an external product and retrieve via the API. */ const runGroupedProductAPITest = () => { // @todo: add a call to ensure pretty permalinks are enabled once settings api is in use. - describe('REST API > Grouped Product', () => { + describe( 'REST API > Grouped Product', () => { let client; let defaultGroupedProduct; let baseGroupedProduct; let product; - let groupedProducts = []; + const groupedProducts = []; let repository; - beforeAll(async () => { + beforeAll( async () => { defaultGroupedProduct = config.get( 'products.grouped' ); const admin = config.get( 'users.admin' ); const url = config.get( 'url' ); @@ -38,13 +38,19 @@ const runGroupedProductAPITest = () => { // Create the simple products to be grouped first. repository = SimpleProduct.restRepository( client ); - for ( let c = 0; c < defaultGroupedProduct.groupedProducts.length; c++ ) { - product = await repository.create( defaultGroupedProduct.groupedProducts[ c ] ); + for ( + let c = 0; + c < defaultGroupedProduct.groupedProducts.length; + c++ + ) { + product = await repository.create( + defaultGroupedProduct.groupedProducts[ c ] + ); groupedProducts.push( product.id ); } - }); + } ); - it('can create a grouped product', async () => { + it( 'can create a grouped product', async () => { baseGroupedProduct = { ...defaultGroupedProduct, groupedProducts, @@ -53,38 +59,46 @@ const runGroupedProductAPITest = () => { // Check properties of product in the create product response. product = await repository.create( baseGroupedProduct ); - expect( product ).toEqual( expect.objectContaining( baseGroupedProduct ) ); - }); + expect( product ).toEqual( + expect.objectContaining( baseGroupedProduct ) + ); + } ); - it('can retrieve a raw grouped product', async () => { - let rawProperties = { + it( 'can retrieve a raw grouped product', async () => { + const rawProperties = { id: product.id, grouped_products: baseGroupedProduct.groupedProducts, ...defaultGroupedProduct, }; - delete rawProperties['groupedProducts']; + delete rawProperties.groupedProducts; // Read product directly from api. - const response = await client.get( `/wc/v3/products/${product.id}` ); - expect( response.status ).toBe( 200 ); - expect( response.data ).toEqual( expect.objectContaining( rawProperties ) ); - }); + const response = await client.get( + `/wc/v3/products/${ product.id }` + ); + expect( response.statusCode ).toBe( 200 ); + expect( response.data ).toEqual( + expect.objectContaining( rawProperties ) + ); + } ); - it('can retrieve a transformed grouped product', async () => { + it( 'can retrieve a transformed grouped product', async () => { // Read product via the repository. const transformed = await repository.read( product.id ); - expect( transformed ).toEqual( expect.objectContaining( baseGroupedProduct ) ); - }); + expect( transformed ).toEqual( + expect.objectContaining( baseGroupedProduct ) + ); + } ); - it('can delete a grouped product', async () => { + it( 'can delete a grouped product', async () => { const status = repository.delete( product.id ); expect( status ).toBeTruthy(); // Delete the simple "child" products. groupedProducts.forEach( ( productId ) => { repository.delete( productId ); - }); - }); - }); + } ); + } ); + } ); }; module.exports = runGroupedProductAPITest; diff --git a/packages/js/e2e-core-tests/specs/api/order.test.js b/packages/js/e2e-core-tests/specs/api/order.test.js index 220326e45ba..0f4b5d75bed 100644 --- a/packages/js/e2e-core-tests/specs/api/order.test.js +++ b/packages/js/e2e-core-tests/specs/api/order.test.js @@ -1,28 +1,24 @@ /** * Internal dependencies */ - const { HTTPClientFactory, Order } = require( '@woocommerce/api' ); +const { HTTPClientFactory, Order } = require( '@woocommerce/api' ); - /** - * External dependencies - */ - const config = require( 'config' ); - const { - it, - describe, - beforeAll, - } = require( '@jest/globals' ); +/** + * External dependencies + */ +const config = require( 'config' ); +const { it, describe, beforeAll } = require( '@jest/globals' ); - /** +/** * Creates an order and tests interactions with it via the API. */ const runOrderApiTest = () => { - describe('REST API > Order', () => { + describe( 'REST API > Order', () => { let client; let order; let repository; - beforeAll(async () => { + beforeAll( async () => { order = config.get( 'orders.basicPaidOrder' ); const admin = config.get( 'users.admin' ); const url = config.get( 'url' ); @@ -33,15 +29,15 @@ const runOrderApiTest = () => { .create(); } ); - it('can create an order', async () => { + it( 'can create an order', async () => { repository = Order.restRepository( client ); // Check properties of the order in the create order response. order = await repository.create( order ); expect( order ).toEqual( expect.objectContaining( order ) ); - }); + } ); - it('can retrieve an order', async () => { + it( 'can retrieve an order', async () => { const orderProperties = { id: order.id, payment_method: order.paymentMethod, @@ -49,12 +45,14 @@ const runOrderApiTest = () => { }; // Read order directly from API to compare. - const response = await client.get( `/wc/v3/orders/${order.id}` ); - expect( response.status ).toBe( 200 ); - expect( response.data ).toEqual( expect.objectContaining( orderProperties ) ); - }); + const response = await client.get( `/wc/v3/orders/${ order.id }` ); + expect( response.statusCode ).toBe( 200 ); + expect( response.data ).toEqual( + expect.objectContaining( orderProperties ) + ); + } ); - it('can update an order', async () => { + it( 'can update an order', async () => { const updatedOrderProperties = { payment_method: 'bacs', status: 'completed', @@ -63,19 +61,21 @@ const runOrderApiTest = () => { await repository.update( order.id, updatedOrderProperties ); // Check the order response for the updated values. - const response = await client.get( `/wc/v3/orders/${order.id}` ); - expect( response.status ).toBe( 200 ); - expect( response.data ).toEqual( expect.objectContaining( updatedOrderProperties ) ); - }); + const response = await client.get( `/wc/v3/orders/${ order.id }` ); + expect( response.statusCode ).toBe( 200 ); + expect( response.data ).toEqual( + expect.objectContaining( updatedOrderProperties ) + ); + } ); - it('can delete an order', async () => { + it( 'can delete an order', async () => { // Delete the order const status = await repository.delete( order.id ); // If the delete is successful, the response comes back truthy expect( status ).toBeTruthy(); - }); - }); + } ); + } ); }; module.exports = runOrderApiTest; diff --git a/packages/js/e2e-core-tests/specs/api/telemetry.test.js b/packages/js/e2e-core-tests/specs/api/telemetry.test.js index 754e54323f1..7def25552ba 100644 --- a/packages/js/e2e-core-tests/specs/api/telemetry.test.js +++ b/packages/js/e2e-core-tests/specs/api/telemetry.test.js @@ -7,11 +7,7 @@ const { HTTPClientFactory } = require( '@woocommerce/api' ); * External dependencies */ const config = require( 'config' ); -const { - it, - describe, - beforeAll, -} = require( '@jest/globals' ); +const { it, describe, beforeAll } = require( '@jest/globals' ); /** * Create the default coupon and tests interactions with it via the API. @@ -20,7 +16,7 @@ const runTelemetryAPITest = () => { describe( 'REST API > Telemetry', () => { let client; - beforeAll(async () => { + beforeAll( async () => { const admin = config.get( 'users.admin' ); const url = config.get( 'url' ); @@ -30,29 +26,26 @@ const runTelemetryAPITest = () => { .create(); } ); - it.each([ - null, - {}, - { platform: 'ios' }, - { version: '1.1' }, - ])( 'errors for invalid request body - %p', async data => { - const response = await client - .post( `/wc-telemetry/tracker`, data ) - .catch( err => { - expect( err.response.status ).toBe( 400 ); - } ); + it.each( [ null, {}, { platform: 'ios' }, { version: '1.1' } ] )( + 'errors for invalid request body - %p', + async ( data ) => { + const response = await client + .post( `/wc-telemetry/tracker`, data ) + .catch( ( err ) => { + expect( err.statusCode ).toBe( 400 ); + } ); - expect( response ).toBeUndefined(); - } ); + expect( response ).toBeUndefined(); + } + ); it( 'returns 200 with correct fields', async () => { - const response = await client - .post( `/wc-telemetry/tracker`, { - platform: 'ios', - version: '1.0', - }) + const response = await client.post( `/wc-telemetry/tracker`, { + platform: 'ios', + version: '1.0', + } ); - expect( response.status ).toBe( 200 ); + expect( response.statusCode ).toBe( 200 ); } ); } ); }; diff --git a/packages/js/e2e-core-tests/specs/keep/onboarding-tasklist.test.js b/packages/js/e2e-core-tests/specs/keep/onboarding-tasklist.test.js deleted file mode 100644 index 47aeecb715f..00000000000 --- a/packages/js/e2e-core-tests/specs/keep/onboarding-tasklist.test.js +++ /dev/null @@ -1,83 +0,0 @@ -/* eslint-disable jest/no-export, jest/no-disabled-tests */ - -/** - * Internal dependencies - */ -const { - merchant, - completeOnboardingWizard, - withRestApi, - addShippingZoneAndMethod, - IS_RETEST_MODE, -} = require( '@woocommerce/e2e-utils' ); - -/** - * External dependencies - */ -const config = require( 'config' ); -const { - it, - describe, -} = require( '@jest/globals' ); - -const shippingZoneNameUS = config.get( 'addresses.customer.shipping.country' ); - -const runOnboardingFlowTest = () => { - describe('Store owner can go through store Onboarding', () => { - if ( IS_RETEST_MODE ) { - it('can reset onboarding to default settings', async () => { - await withRestApi.resetOnboarding(); - }); - - it('can reset shipping zones to default settings', async () => { - await withRestApi.deleteAllShippingZones(); - }); - - it('can reset to default settings', async () => { - await withRestApi.resetSettingsGroupToDefault('general'); - await withRestApi.resetSettingsGroupToDefault('products'); - await withRestApi.resetSettingsGroupToDefault('tax'); - }); - } - - it('can start and complete onboarding when visiting the site for the first time.', async () => { - await completeOnboardingWizard(); - }); - }); -}; - -const runTaskListTest = () => { - describe('Store owner can go through setup Task List', () => { - it('can setup shipping', async () => { - await page.evaluate(() => { - document.querySelector('.woocommerce-list__item-title').scrollIntoView(); - }); - // Query for all tasks on the list - const taskListItems = await page.$$('.woocommerce-list__item-title'); - expect(taskListItems.length).toBeInRange( 5, 6 ); - - // Work around for https://github.com/woocommerce/woocommerce-admin/issues/6761 - if ( taskListItems.length == 6 ) { - // Click on "Set up shipping" task to move to the next step - const [ setupTaskListItem ] = await page.$x( '//div[contains(text(),"Set up shipping")]' ); - await setupTaskListItem.click(); - - // Wait for "Proceed" button to become active - await page.waitForSelector('button.is-primary:not(:disabled)'); - await page.waitFor(3000); - - // Click on "Proceed" button to save shipping settings - await page.click('button.is-primary'); - await page.waitFor(3000); - } else { - await merchant.openNewShipping(); - await addShippingZoneAndMethod(shippingZoneNameUS); - } - }); - }); -}; - -module.exports = { - runOnboardingFlowTest, - runTaskListTest, -}; diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-coupon-new.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-coupon-new.test.js index cccd3d8aa39..87921c63ce2 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-coupon-new.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-coupon-new.test.js @@ -5,9 +5,8 @@ const { merchant, clickTab, AdminEdit, - factories, + withRestApi, } = require( '@woocommerce/e2e-utils' ); -const { Coupon } = require( '@woocommerce/api' ); /** * External dependencies @@ -50,8 +49,7 @@ const runCreateCouponTest = () => { // Delete the coupon const couponId = await adminEdit.getId(); if ( couponId ) { - const repository = Coupon.restRepository( factories.api.withDefaultPermalinks ); - await repository.delete( couponId ); + await withRestApi.deleteCoupon( couponId ); } }); }); diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-extensions-connect-wccom.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-extensions-connect-wccom.test.js index 3935b7743de..ff67cfa2e9d 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-extensions-connect-wccom.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-extensions-connect-wccom.test.js @@ -21,7 +21,13 @@ const runInitiateWccomConnectionTest = () => { }); it.skip('can initiate WCCOM connection', async () => { - await merchant.openHelper(); + await merchant.openExtensions(); + + // Click on a tab to choose WooCommerce Subscriptions extension + await Promise.all( [ + expect( page ).toClick( 'a.nav-tab', { text: "WooCommerce.com Subscriptions" } ), + page.waitForNavigation( { waitUntil: 'networkidle0' } ), + ] ); // Click on Connect button to initiate a WCCOM connection await Promise.all([ diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-new.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-new.test.js index 176b11cb768..3dd15e2d758 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-new.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-new.test.js @@ -4,9 +4,10 @@ const { merchant, uiUnblocked, + withRestApi, AdminEdit, -} = require('@woocommerce/e2e-utils'); -const config = require('config'); +} = require( '@woocommerce/e2e-utils' ); +const config = require( 'config' ); const { HTTPClientFactory, VariableProduct, @@ -14,22 +15,34 @@ const { SimpleProduct, ProductVariation, ExternalProduct -} = require('@woocommerce/api'); +} = require( '@woocommerce/api' ); + +const taxClasses = [ + { + name: 'Tax Class Simple', + }, + { + name: 'Tax Class Variable', + }, + { + name: 'Tax Class External', + }, +]; const taxRates = [ { name: 'Tax Rate Simple', - rate: '10', + rate: '10.0000', class: 'tax-class-simple' }, { name: 'Tax Rate Variable', - rate: '20', + rate: '20.0000', class: 'tax-class-variable' }, { name: 'Tax Rate External', - rate: '30', + rate: '30.0000', class: 'tax-class-external' } ]; @@ -43,60 +56,22 @@ const initProducts = async () => { const httpClient = HTTPClientFactory.build(apiUrl) .withBasicAuth(adminUsername, adminPassword) .create(); - const taxClassesPath = '/wc/v3/taxes/classes'; - const taxClasses = [ - { - name: 'Tax Class Simple', - slug: 'tax-class-simple-698962' - }, - { - name: 'Tax Class Variable', - slug: 'tax-class-variable-790238' - }, - { - name: 'Tax Class External', - slug: 'tax-class-external-991321' - } - ]; - // Enable taxes in settings - const enableTaxes = async () => { - const path = '/wc/v3/settings/general/woocommerce_calc_taxes'; - const data = { - value: 'yes' - }; - await httpClient.put(path, data); - }; - await enableTaxes(); - - // Initialize tax classes - const initTaxClasses = async () => { - for (const classToBeAdded of taxClasses) { - await httpClient.post(taxClassesPath, classToBeAdded); - } - }; - await initTaxClasses(); - - // Initialize tax rates - const initTaxRates = async () => { - const path = '/wc/v3/taxes'; - - for (const rateToBeAdded of taxRates) { - await httpClient.post(path, rateToBeAdded); - } - }; - await initTaxRates(); + await withRestApi.updateSettingOption( 'general', 'woocommerce_calc_taxes', { value: 'yes' } ); + await withRestApi.addTaxClasses( taxClasses ); + await withRestApi.addTaxRates( taxRates ); // Initialization functions per product type const initSimpleProduct = async () => { - const repo = SimpleProduct.restRepository(httpClient); + const repo = SimpleProduct.restRepository( httpClient ); const simpleProduct = { name: 'Simple Product 273722', regularPrice: '100', taxClass: 'Tax Class Simple' }; - return await repo.create(simpleProduct); + return await repo.create( simpleProduct ); }; + const initVariableProduct = async () => { const variations = [ { @@ -264,12 +239,12 @@ const runCreateOrderTest = () => { } // Verify that the names of each tax class were shown - for (const { name } of taxRates) { + for (const taxRate of taxRates) { await expect(page).toMatchElement('th.line_tax', { - text: name + text: taxRate.name }); await expect(page).toMatchElement('.wc-order-totals td.label', { - text: name + text: taxRate.name }); } diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-refund.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-refund.test.js index cf7e9253fa5..a2cc152406f 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-refund.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-refund.test.js @@ -9,32 +9,12 @@ const { uiUnblocked, evalAndClick, createOrder, + clickAndWaitForSelector, } = require( '@woocommerce/e2e-utils' ); -const { waitForSelector } = require( '@woocommerce/e2e-environment' ); - const config = require( 'config' ); const simpleProductPrice = config.has('products.simple.price') ? config.get('products.simple.price') : '9.99'; -/** - * Evaluate and click a button selector then wait for a result selector. - * This is a work around for what appears to be intermittent delays in handling confirm dialogs. - * - * @param buttonSelector - * @param resultSelector - * @returns {Promise} - */ -const clickAndWaitForSelector = async ( buttonSelector, resultSelector ) => { - await evalAndClick( buttonSelector ); - await waitForSelector( - page, - resultSelector, - { - timeout: 5000 - } - ); -}; - const runRefundOrderTest = () => { describe('WooCommerce Orders > Refund an order', () => { let productId; diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-searching.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-searching.test.js index b054460607c..306b3a5add2 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-searching.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-searching.test.js @@ -51,7 +51,7 @@ const updateCustomerBilling = async () => { search: 'Jane', role: 'all', } ); - if ( ! customers.data | ! customers.data.length ) { + if ( ! customers.data || ! customers.data.length ) { return; } diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-status-filters.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-status-filters.test.js index e3e36389a52..5a2740774cd 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-status-filters.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-status-filters.test.js @@ -45,7 +45,7 @@ const runOrderStatusFiltersTest = () => { }); // Create the orders using the API - await withRestApi.batchCreateOrders(orders); + await withRestApi.batchCreateOrders( orders, false ); // Next, let's login and navigate to the Orders page await merchant.login(); diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-import-csv.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-import-csv.test.js index b59bf90b926..685a1e0d2a7 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-import-csv.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-import-csv.test.js @@ -107,9 +107,9 @@ const runImportProductsTest = () => { afterAll(async () => { // Delete imported products await withRestApi.deleteAllProducts(); - await withRestApi.deleteAllProductAttributes(); - await withRestApi.deleteAllProductCategories(); - await withRestApi.deleteAllProductTags(); + await withRestApi.deleteAllProductAttributes( false ); + await withRestApi.deleteAllProductCategories( false ); + await withRestApi.deleteAllProductTags( false ); }); it( 'should show error message if you go without providing CSV file', async () => { diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-classes.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-classes.test.js index bdcfdc83b3c..eeaf345facc 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-classes.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-classes.test.js @@ -14,7 +14,7 @@ const runAddShippingClassesTest = () => { }); afterAll(async () => { - await withRestApi.deleteAllShippingClasses(); + await withRestApi.deleteAllShippingClasses( false ); }); it('can add shipping classes', async () => { diff --git a/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-zones.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-zones.test.js index cd2e8ed0f63..06d3e9b7893 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-zones.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-settings-shipping-zones.test.js @@ -35,7 +35,7 @@ const runAddNewShippingZoneTest = () => { beforeAll(async () => { productId = await createSimpleProduct(); - await withRestApi.deleteAllShippingZones(); + await withRestApi.deleteAllShippingZones( false ); await merchant.login(); }); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-cart-calculate-shipping.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-cart-calculate-shipping.test.js index f14f5e8deb4..98add6b0d52 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-cart-calculate-shipping.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-cart-calculate-shipping.test.js @@ -42,19 +42,19 @@ const runCartCalculateShippingTest = () => { firstProductId = await createSimpleProduct(firstProductName); secondProductId = await createSimpleProduct(secondProductName, secondProductPrice); - await withRestApi.resetSettingsGroupToDefault( 'general' ); + await withRestApi.resetSettingsGroupToDefault( 'general', false ); // Add a new shipping zone Germany with Free shipping - await withRestApi.addShippingZoneAndMethod(shippingZoneNameDE, shippingCountryDE, ' ', 'free_shipping'); + await withRestApi.addShippingZoneAndMethod(shippingZoneNameDE, shippingCountryDE, ' ', 'free_shipping', '', [], false ); // Add a new shipping zone for France with Flat rate & Local pickup - await withRestApi.addShippingZoneAndMethod(shippingZoneNameFR, shippingCountryFR, ' ', 'flat_rate', '5', ['local_pickup']); + await withRestApi.addShippingZoneAndMethod(shippingZoneNameFR, shippingCountryFR, ' ', 'flat_rate', '5', ['local_pickup'], false ); await shopper.emptyCart(); }); afterAll(async () => { - await withRestApi.deleteAllShippingZones(); + await withRestApi.deleteAllShippingZones( false ); }); it('allows customer to calculate Free Shipping if in Germany', async () => { diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-cart-coupons.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-cart-coupons.test.js index 123c4da8a36..464856ded67 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-cart-coupons.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-cart-coupons.test.js @@ -9,6 +9,7 @@ const { applyCoupon, removeCoupon, } = require( '@woocommerce/e2e-utils' ); +const { getCouponId, getCouponsTable } = require( '../utils/coupons' ); /** * External dependencies @@ -19,36 +20,12 @@ const { beforeAll, } = require( '@jest/globals' ); -const couponsTable = [ - ['fixed cart', { text: '$5.00' }, { text: '$4.99' }], - ['percentage', { text: '$4.99' }, { text: '$5.00' }], - ['fixed product', { text: '$5.00' }, { text: '$4.99' }] -]; - -let couponFixedCart; -let couponPercentage; -let couponFixedProduct; - -const getCoupon = (couponType) => { - switch (couponType) { - case 'fixed cart': - return couponFixedCart; - case 'percentage': - return couponPercentage; - case 'fixed product': - return couponFixedProduct; - } -}; - const runCartApplyCouponsTest = () => { describe('Cart applying coupons', () => { let productId; beforeAll(async () => { productId = await createSimpleProduct(); - couponFixedCart = await createCoupon(); - couponPercentage = await createCoupon('50', 'Percentage discount'); - couponFixedProduct = await createCoupon('5', 'Fixed product discount'); await shopper.emptyCart(); await shopper.goToShop(); await shopper.addToCartFromShopPage( productId ); @@ -56,8 +33,8 @@ const runCartApplyCouponsTest = () => { await shopper.goToCart(); }); - it.each(couponsTable)('allows cart to apply %s coupon', async (couponType, cartDiscount, orderTotal) => { - const coupon = getCoupon(couponType); + it.each( getCouponsTable() )( 'allows cart to apply %s coupon', async ( couponType, cartDiscount, orderTotal ) => { + const coupon = await getCouponId( couponType ); await applyCoupon(coupon); await expect(page).toMatchElement('.woocommerce-message', { text: 'Coupon code applied successfully.' }); @@ -69,9 +46,10 @@ const runCartApplyCouponsTest = () => { }); it('prevents cart applying same coupon twice', async () => { - await applyCoupon(couponFixedCart); + const couponId = await getCouponId( 'fixed cart' ); + await applyCoupon( couponId ); await expect(page).toMatchElement('.woocommerce-message', {text: 'Coupon code applied successfully.'}); - await applyCoupon(couponFixedCart); + await applyCoupon( couponId ); // Verify only one discount applied // This is a work around for Puppeteer inconsistently finding 'Coupon code already applied' await expect(page).toMatchElement('.cart-discount .amount', {text: '$5.00'}); @@ -79,7 +57,7 @@ const runCartApplyCouponsTest = () => { }); it('allows cart to apply multiple coupons', async () => { - await applyCoupon(couponFixedProduct); + await applyCoupon( await getCouponId( 'fixed product' ) ); await expect(page).toMatchElement('.woocommerce-message', {text: 'Coupon code applied successfully.'}); // Verify discount applied and order total @@ -88,8 +66,8 @@ const runCartApplyCouponsTest = () => { }); it('restores cart total when coupons are removed', async () => { - await removeCoupon(couponFixedCart); - await removeCoupon(couponFixedProduct); + await removeCoupon( await getCouponId( 'fixed cart' ) ); + await removeCoupon( await getCouponId( 'fixed product' ) ); await expect(page).toMatchElement('.order-total .amount', {text: '$9.99'}); }); }); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-cart.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-cart.test.js index 9d2d1b2ecff..fea98893cf7 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-cart.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-cart.test.js @@ -28,9 +28,9 @@ const runCartPageTest = () => { beforeAll(async () => { productId = await createSimpleProduct(); - await withRestApi.resetSettingsGroupToDefault('general'); - await withRestApi.resetSettingsGroupToDefault('products'); - await withRestApi.resetSettingsGroupToDefault('tax'); + await withRestApi.resetSettingsGroupToDefault( 'general', false ); + await withRestApi.resetSettingsGroupToDefault( 'products', false ); + await withRestApi.resetSettingsGroupToDefault( 'tax', false ); }); it('should display no item in the cart', async () => { diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-coupons.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-coupons.test.js index a24bc82c370..dded5cc3587 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-coupons.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-coupons.test.js @@ -10,6 +10,7 @@ const { removeCoupon, waitForSelectorWithoutThrow, } = require( '@woocommerce/e2e-utils' ); +const { getCouponId, getCouponsTable } = require( '../utils/coupons' ); /** * External dependencies @@ -20,26 +21,6 @@ const { beforeAll, } = require( '@jest/globals' ); -const couponsTable = [ - ['fixed cart', { text: '$5.00' }, { text: '$4.99' }], - ['percentage', { text: '$4.99' }, { text: '$5.00' }], - ['fixed product', { text: '$5.00' }, { text: '$4.99' }] -]; - -let couponFixedCart; -let couponPercentage; -let couponFixedProduct; - -const getCoupon = (couponType) => { - switch (couponType) { - case 'fixed cart': - return couponFixedCart; - case 'percentage': - return couponPercentage; - case 'fixed product': - return couponFixedProduct; - } -}; const runCheckoutApplyCouponsTest = () => { describe('Checkout coupons', () => { @@ -47,9 +28,6 @@ const runCheckoutApplyCouponsTest = () => { beforeAll(async () => { productId = await createSimpleProduct(); - couponFixedCart = await createCoupon(); - couponPercentage = await createCoupon('50', 'Percentage discount'); - couponFixedProduct = await createCoupon('5', 'Fixed product discount'); await shopper.emptyCart(); await shopper.goToShop(); await waitForSelectorWithoutThrow( '.add_to_cart_button' ); @@ -58,8 +36,8 @@ const runCheckoutApplyCouponsTest = () => { await shopper.goToCheckout(); }); - it.each(couponsTable)('allows checkout to apply %s coupon', async (couponType, cartDiscount, orderTotal) => { - const coupon = getCoupon(couponType); + it.each( getCouponsTable() )( 'allows checkout to apply %s coupon', async ( couponType, cartDiscount, orderTotal ) => { + const coupon = await getCouponId( couponType ); await applyCoupon(coupon); await expect(page).toMatchElement('.woocommerce-message', { text: 'Coupon code applied successfully.' }); @@ -73,9 +51,10 @@ const runCheckoutApplyCouponsTest = () => { }); it('prevents checkout applying same coupon twice', async () => { - await applyCoupon(couponFixedCart); + const couponId = await getCouponId( 'fixed cart' ); + await applyCoupon( couponId ); await expect(page).toMatchElement('.woocommerce-message', {text: 'Coupon code applied successfully.'}); - await applyCoupon(couponFixedCart); + await applyCoupon( couponId ); // Verify only one discount applied // This is a work around for Puppeteer inconsistently finding 'Coupon code already applied' await expect(page).toMatchElement('.cart-discount .amount', {text: '$5.00'}); @@ -83,7 +62,7 @@ const runCheckoutApplyCouponsTest = () => { }); it('allows checkout to apply multiple coupons', async () => { - await applyCoupon(couponFixedProduct); + await applyCoupon( await getCouponId( 'fixed product' ) ); await expect(page).toMatchElement('.woocommerce-message', {text: 'Coupon code applied successfully.'}); // Verify discount applied and order total @@ -92,8 +71,8 @@ const runCheckoutApplyCouponsTest = () => { }); it('restores checkout total when coupons are removed', async () => { - await removeCoupon(couponFixedCart); - await removeCoupon(couponFixedProduct); + await removeCoupon( await getCouponId( 'fixed cart' ) ); + await removeCoupon( await getCouponId( 'fixed product' ) ); await expect(page).toMatchElement('.order-total .amount', {text: '$9.99'}); }); }); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-create-account.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-create-account.test.js index 103ab45cbbd..71dc37a1bdf 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-create-account.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-checkout-create-account.test.js @@ -39,7 +39,7 @@ const runCheckoutCreateAccountTest = () => { await settingsPageSaveChanges(); // Set free shipping within California - await addShippingZoneAndMethod('Free Shipping CA', 'state:US:CA', ' ', 'free_shipping'); + await addShippingZoneAndMethod('Free Shipping CA', 'state:US:CA', ' ', 'free_shipping' ); await merchant.logout(); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-checkout.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-checkout.test.js index a4466ce347e..47999a5d07d 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-checkout.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-checkout.test.js @@ -26,12 +26,12 @@ const runCheckoutPageTest = () => { describe('Checkout page', () => { beforeAll(async () => { productId = await createSimpleProduct(); - await withRestApi.resetSettingsGroupToDefault('general'); - await withRestApi.resetSettingsGroupToDefault('products'); - await withRestApi.resetSettingsGroupToDefault('tax'); + await withRestApi.resetSettingsGroupToDefault( 'general', false ); + await withRestApi.resetSettingsGroupToDefault( 'products', false ); + await withRestApi.resetSettingsGroupToDefault( 'tax', false ); // Set free shipping within California - await withRestApi.addShippingZoneAndMethod('Free Shipping CA', 'state:US:CA', '', 'free_shipping'); + await withRestApi.addShippingZoneAndMethod('Free Shipping CA', 'state:US:CA', '', 'free_shipping', '', [], false ); // Set base location with state CA. await withRestApi.updateSettingOption( 'general', 'woocommerce_default_country', { value: 'US:CA' } ); @@ -44,14 +44,14 @@ const runCheckoutPageTest = () => { // Tax calculation should have been enabled by another test - no-op // Enable BACS payment method - await withRestApi.updatePaymentGateway( 'bacs', { enabled: true } ); + await withRestApi.updatePaymentGateway( 'bacs', { enabled: true }, false ); // Enable COD payment method - await withRestApi.updatePaymentGateway( 'cod', { enabled: true } ); + await withRestApi.updatePaymentGateway( 'cod', { enabled: true }, false ); }); afterAll(async () => { - await withRestApi.deleteAllShippingZones(); + await withRestApi.deleteAllShippingZones( false ); }); it('should display cart items in order review', async () => { diff --git a/packages/js/e2e-core-tests/specs/utils/coupons.js b/packages/js/e2e-core-tests/specs/utils/coupons.js new file mode 100644 index 00000000000..f39532abad1 --- /dev/null +++ b/packages/js/e2e-core-tests/specs/utils/coupons.js @@ -0,0 +1,49 @@ +/** + * Internal dependencies + */ +const { createCoupon } = require( '@woocommerce/e2e-utils' ); + +const couponsTable = [ + [ 'fixed cart', { text: '$5.00' }, { text: '$4.99' } ], + [ 'percentage', { text: '$4.99' }, { text: '$5.00' } ], + [ 'fixed product', { text: '$5.00' }, { text: '$4.99' } ] +]; + +let couponFixedCart; +let couponPercentage; +let couponFixedProduct; + +/** + * Get a test coupon Id. Create the coupon if it does not exist. + * + * @param {string} couponType Coupon type. + * @return {string} Coupon code. + */ +const getCouponId = async ( couponType ) => { + switch ( couponType ) { + case 'fixed cart': + if ( ! couponFixedCart ) { + couponFixedCart = await createCoupon(); + } + return couponFixedCart; + case 'percentage': + if ( ! couponPercentage ) { + couponPercentage = await createCoupon( '50', 'Percentage discount' ); + } + return couponPercentage; + case 'fixed product': + if ( ! couponFixedProduct ) { + couponFixedProduct = await createCoupon( '5', 'Fixed product discount' ); + } + return couponFixedProduct; + } +}; + +const getCouponsTable = () => { + return couponsTable; +}; + +module.exports = { + getCouponsTable, + getCouponId, +}; diff --git a/packages/js/e2e-environment/CHANGELOG.md b/packages/js/e2e-environment/CHANGELOG.md index 26c0ac4752e..4c1db86b56f 100644 --- a/packages/js/e2e-environment/CHANGELOG.md +++ b/packages/js/e2e-environment/CHANGELOG.md @@ -4,6 +4,7 @@ - Added quotes around `WORDPRESS_TITLE` value in .env file to address issue with docker compose 2 "key cannot contain a space" error. - Added `LATEST_WP_VERSION_MINUS` that allows setting a number to subtract from the current WordPress version for the WordPress Docker image. +- Support for PHP_VERSION, MARIADB_VERSION environment variables for built in container initialization ## Fixed diff --git a/packages/js/e2e-environment/NEXT_CHANGELOG.md b/packages/js/e2e-environment/NEXT_CHANGELOG.md new file mode 100644 index 00000000000..2a343c15823 --- /dev/null +++ b/packages/js/e2e-environment/NEXT_CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +[See legacy changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob//packages/js/e2e-environment/CHANGELOG.md). diff --git a/packages/js/e2e-environment/bin/docker-compose.sh b/packages/js/e2e-environment/bin/docker-compose.sh index 55c9859055c..ee0be868de2 100755 --- a/packages/js/e2e-environment/bin/docker-compose.sh +++ b/packages/js/e2e-environment/bin/docker-compose.sh @@ -17,22 +17,30 @@ if [[ $1 ]]; then export WORDPRESS_VERSION=$(./bin/get-previous-version.js $WORDPRESS_VERSION $LATEST_WP_VERSION_MINUS 2> /dev/null) fi - if ! [[ $TRAVIS_PHP_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then - TRAVIS_PHP_VERSION=$(./bin/get-latest-docker-tag.js php 7 2> /dev/null) - fi - if [[ $TRAVIS_PHP_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then - export DC_PHP_VERSION=$TRAVIS_PHP_VERSION + if [[ $PHP_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then + export DC_PHP_VERSION=$PHP_VERSION else - export DC_PHP_VERSION="7.4.22" + if ! [[ $TRAVIS_PHP_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then + TRAVIS_PHP_VERSION=$(./bin/get-latest-docker-tag.js php 7 2> /dev/null) + fi + if [[ $TRAVIS_PHP_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then + export DC_PHP_VERSION=$TRAVIS_PHP_VERSION + else + export DC_PHP_VERSION="7.4.25" + fi fi - if ! [[ $TRAVIS_MARIADB_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then - TRAVIS_MARIADB_VERSION=$(./bin/get-latest-docker-tag.js mariadb 10 2> /dev/null) - fi - if [[ $TRAVIS_MARIADB_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then - export DC_MARIADB_VERSION=$TRAVIS_MARIADB_VERSION + if [[ $MARIADB_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then + export DC_MARIADB_VERSION=$MARIADB_VERSION else - export DC_MARIADB_VERSION="10.6.4" + if ! [[ $TRAVIS_MARIADB_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then + TRAVIS_MARIADB_VERSION=$(./bin/get-latest-docker-tag.js mariadb 10 2> /dev/null) + fi + if [[ $TRAVIS_MARIADB_VERSION =~ ^[0-9]+\.[0-9]+ ]]; then + export DC_MARIADB_VERSION=$TRAVIS_MARIADB_VERSION + else + export DC_MARIADB_VERSION="10.6.5" + fi fi if [[ $1 == 'up' ]]; then diff --git a/packages/js/e2e-environment/builtin.md b/packages/js/e2e-environment/builtin.md index 80ab9064bc7..6ec0095f7c9 100644 --- a/packages/js/e2e-environment/builtin.md +++ b/packages/js/e2e-environment/builtin.md @@ -126,9 +126,17 @@ The built in container defaults to mapping the root folder of the repository to Since the introduction of the WooCommerce Monorepo, a `WC_CORE_PATH` environment variable maps to Core WooCommerce at `plugins/woocommerce`. It can also be overriden in a similar fashion. +### Specifying Server Software versions + +The built-in container supports these variables for use locally and in CI environments: + +- `WP_VERSION` - WordPress (default `latest`) +- `PHP_VERSION` - PHP (default `latest`) +- `MARIADB_VERSION` - MariaDB (default `latest`) + ### Travis CI Supported Versions -Travis CI uses environment variables to allow control of some software versions in the testing environment. The built in container supports these variables: +Travis CI uses environment variables to allow control of some software versions in the testing environment. The built-in container supports these variables: - `WP_VERSION` - WordPress (default `latest`) - `TRAVIS_PHP_VERSION` - PHP (default `latest`) diff --git a/packages/js/e2e-environment/changelog/.gitkeep b/packages/js/e2e-environment/changelog/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/js/e2e-environment/composer.json b/packages/js/e2e-environment/composer.json new file mode 100644 index 00000000000..9297a4b6592 --- /dev/null +++ b/packages/js/e2e-environment/composer.json @@ -0,0 +1,27 @@ +{ + "name": "woocommerce/e2e-environment", + "description": "WooCommerce end to end testing environment", + "type": "library", + "license": "GPL-3.0-or-later", + "minimum-stability": "dev", + "require-dev": { + "automattic/jetpack-changelogger": "3.0.2" + }, + "extra": { + "changelogger": { + "formatter": { + "filename": "../../../tools/changelogger/PackageFormatter.php" + }, + "types": [ + "Fix", + "Add", + "Update", + "Dev", + "Tweak", + "Performance", + "Enhancement" + ], + "changelog": "NEXT_CHANGELOG.md" + } + } +} diff --git a/packages/js/e2e-environment/composer.lock b/packages/js/e2e-environment/composer.lock new file mode 100644 index 00000000000..0907ad54d29 --- /dev/null +++ b/packages/js/e2e-environment/composer.lock @@ -0,0 +1,1021 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "b8b1db72d3888837553c6d782593ee3a", + "packages": [], + "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 | ^5.2", + "symfony/process": "^3.4 | ^5.2", + "wikimedia/at-ease": "^1.2 | ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 | ^2.0", + "yoast/phpunit-polyfills": "1.0.2" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "mirror-repo": "Automattic/jetpack-changelogger", + "version-constants": { + "::VERSION": "src/Application.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-changelogger/compare/${old}...${new}" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Changelogger\\": "src", + "Automattic\\Jetpack\\Changelog\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "time": "2021-11-02T14:06:49+00:00" + }, + { + "name": "psr/container", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "symfony/console", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "30885182c981ab175d4d034db0f6f469898070ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T17:12:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/11b9acb5e8619aef6455735debf77dde8825795c", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-13T13:58:33+00:00" + }, + { + "name": "symfony/process", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-13T09:35:11+00:00" + }, + { + "name": "symfony/string", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-28T19:23:26+00:00" + }, + { + "name": "wikimedia/at-ease", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "35.0.0", + "mediawiki/minus-x": "1.1.1", + "ockcyp/covers-validator": "1.3.3", + "php-parallel-lint/php-console-highlighter": "0.5.0", + "php-parallel-lint/php-parallel-lint": "1.2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + }, + "files": [ + "src/Wikimedia/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "time": "2021-02-27T15:53:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/packages/js/e2e-environment/docker/wp-cli/initialize.sh b/packages/js/e2e-environment/docker/wp-cli/initialize.sh index 4d1e5b62746..7c0ab8f9991 100755 --- a/packages/js/e2e-environment/docker/wp-cli/initialize.sh +++ b/packages/js/e2e-environment/docker/wp-cli/initialize.sh @@ -2,7 +2,11 @@ echo "Initializing WooCommerce E2E" -wp plugin activate woocommerce +# This is a workaround to accommodate different directory names. +wp plugin activate --all +wp plugin deactivate akismet +wp plugin deactivate hello + wp theme install twentynineteen --activate wp user create customer customer@woocommercecoree2etestsuite.com \ --user_pass=password \ diff --git a/packages/js/e2e-environment/package.json b/packages/js/e2e-environment/package.json index 84ab7d99c74..33e576f5420 100644 --- a/packages/js/e2e-environment/package.json +++ b/packages/js/e2e-environment/package.json @@ -41,6 +41,7 @@ "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.12.7", "@wordpress/eslint-plugin": "7.3.0", + "eslint": "^8.1.0", "ndb": "^1.1.5", "semver": "^7.3.2" }, @@ -58,7 +59,8 @@ "docker:ssh": "docker exec -it $(node utils/get-app-name.js)_wordpress-www /bin/bash", "test:e2e": "bash ./bin/wait-for-build.sh && ./bin/e2e-test-integration.js", "test:e2e-debug": "bash ./bin/wait-for-build.sh && ./bin/e2e-test-integration.js --dev --debug", - "test:e2e-dev": "bash ./bin/wait-for-build.sh && ./bin/e2e-test-integration.js --dev" + "test:e2e-dev": "bash ./bin/wait-for-build.sh && ./bin/e2e-test-integration.js --dev", + "lint": "eslint src" }, "bin": { "wc-e2e": "bin/wc-e2e.sh" diff --git a/packages/js/e2e-environment/project.json b/packages/js/e2e-environment/project.json new file mode 100644 index 00000000000..46f5e0ca784 --- /dev/null +++ b/packages/js/e2e-environment/project.json @@ -0,0 +1,79 @@ +{ + "root": "packages/js/e2e-environment/", + "sourceRoot": "packages/js/e2e-environment/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build" + } + }, + "lint": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "lint" + } + }, + "clean": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "clean" + } + }, + "compile": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "compile" + } + }, + "prepare": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "prepare" + } + }, + "docker-up": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:up" + } + }, + "docker-down": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:down" + } + }, + "docker-clear-all": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:clear-all" + } + }, + "docker-ssh": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:ssh" + } + }, + "test-e2e": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:e2e" + } + }, + "test-e2e-debug": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:e2e-debug" + } + }, + "test-e2e-dev": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:e2e-dev" + } + } + } +} diff --git a/packages/js/e2e-utils/.eslintrc.js b/packages/js/e2e-utils/.eslintrc.js new file mode 100644 index 00000000000..75d467c88d1 --- /dev/null +++ b/packages/js/e2e-utils/.eslintrc.js @@ -0,0 +1,32 @@ +module.exports = { + parser: '@typescript-eslint/parser', + env: { + 'jest/globals': true, + }, + ignorePatterns: [ 'dist/', 'node_modules/' ], + rules: { + 'no-unused-vars': 'off', + 'no-dupe-class-members': 'off', + + 'no-useless-constructor': 'off', + '@typescript-eslint/no-useless-constructor': 2, + }, + plugins: [ '@typescript-eslint/eslint-plugin' ], + extends: [ 'plugin:@wordpress/eslint-plugin/recommended-with-formatting' ], + overrides: [ + { + files: [ '**/*.js', '**/*.ts' ], + settings: { + jsdoc: { + mode: 'typescript', + }, + }, + }, + { + files: [ '**/*.spec.ts', '**/*.test.ts' ], + rules: { + 'no-console': 'off', + }, + }, + ], +}; diff --git a/packages/js/e2e-utils/CHANGELOG.md b/packages/js/e2e-utils/CHANGELOG.md index d6d3488b78e..3877b2277fe 100644 --- a/packages/js/e2e-utils/CHANGELOG.md +++ b/packages/js/e2e-utils/CHANGELOG.md @@ -7,6 +7,13 @@ - Update `shopper.addToCartFromShopPage()` and `.removeFromCart()` to accept product Id or Title - Added `deleteAllProductAttributes()`, `deleteAllProductCategories()`, and `deleteAllProductTags()` to clean up meta data added when products are imported - Added `withRestApi.createProductCategory()` that creates a product category and returns the ID +- `deleteAllProductAttributes()`, `deleteAllProductCategories()`, and `deleteAllProductTags()` to clean up meta data added when products are imported +- `withRestApi.createProductCategory()` that creates a product category and returns the ID +- `withRestApi.deleteCoupon()` that deletes a single coupon +- `withRestApi.addTaxClasses()` that adds an array of tax classes if they do not exist +- `withRestApi.addTaxRates()` that adds an array of tax rates if they do not exist +- `clickAndWaitForSelector( buttonSelector, resultSelector, timeout )` to click a button and wait for response +- Optional parameter `testResponse` to `withRestApi` functions that contain an `expect()` # 0.1.6 diff --git a/packages/js/e2e-utils/NEXT_CHANGELOG.md b/packages/js/e2e-utils/NEXT_CHANGELOG.md new file mode 100644 index 00000000000..40338e2b752 --- /dev/null +++ b/packages/js/e2e-utils/NEXT_CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +--- + +[See legacy changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob//packages/js/e2e-utils/CHANGELOG.md). diff --git a/packages/js/e2e-utils/README.md b/packages/js/e2e-utils/README.md index 065005b7508..c34fc42c85e 100644 --- a/packages/js/e2e-utils/README.md +++ b/packages/js/e2e-utils/README.md @@ -142,22 +142,26 @@ Please note: if you're using a non-SSL environment (such as a Docker container f | Function | Parameters | Description | |----------|------------|-------------| -| `resetOnboarding` | | Reset onboarding settings | +| `addShippingZoneAndMethod` | `zoneName`, `zoneLocation`, `zipCode`, `zoneMethod`, `cost`, `additionalZoneMethods`, `testResponse` | Adds a shipping zone along with a shipping method | +| `batchCreateOrders` | `orders`, `testResponse` | Create a batch of orders using the "Batch Create Order" API endpoint | +| `addTaxClasses` | `taxClasses` | Add an array of tax classes if they do not exist | +| `addTaxRates` | `taxRates` | Add an array of tax rates if they do not exist | +| `createProductCategory` | `categoryName` | Create a product category with the provided name | | `deleteAllCoupons` | | Permanently delete all coupons | -| `deleteAllProducts` | | Permanently delete all products | -| `deleteAllShippingZones` | | Permanently delete all shipping zones except the default | -| `deleteAllShippingClasses` | Permanently delete all shipping classes | -| `deleteCustomerByEmail` | `emailAddress` | Delete customer user account. Posts are reassigned to user ID 1 | -| `resetSettingsGroupToDefault` | `settingsGroup` | Reset settings in settings group to default except `select` fields | -| `batchCreateOrders` | `orders` | Create a batch of orders using the "Batch Create Order" API endpoint | | `deleteAllOrders` | | Permanently delete all orders | -| `updateSettingOption` | `settingsGroup`, `settingID`, `payload` | Update a settings group | -| `updatePaymentGateway`| `paymentGatewayId`, `payload` | Update a payment gateway | +| `deleteAllProductAttributes` | `testResponse` | Permanently delete all product attributes | +| `deleteAllProductCategories` | `testResponse` | Permanently delete all product categories | +| `deleteAllProducts` | | Permanently delete all products | +| `deleteAllProductTags` | `testResponse` | Permanently delete all product tags | +| `deleteAllShippingClasses` | `testResponse` | Permanently delete all shipping classes | +| `deleteAllShippingZones` | `testResponse` | Permanently delete all shipping zones except the default | +| `deleteCoupon` | `couponId` | Permanently delete a coupon | +| `deleteCustomerByEmail` | `emailAddress` | Delete customer user account. Posts are reassigned to user ID 1 | | `getSystemEnvironment` | | Get the current environment from the WooCommerce system status API. | -| `deleteAllProductAttributes` | | Permanently delete all product attributes. | -| `deleteAllProductCategories` | | Permanently delete all product categories. | -| `deleteAllProductTags` | | Permanently delete all product tags. | -| `createProductCategory` | `categoryName` | Create a product category with the provided name. | +| `resetOnboarding` | | Reset onboarding settings | +| `resetSettingsGroupToDefault` | `settingsGroup`, `testResponse` | Reset settings in settings group to default except `select` fields | +| `updateSettingOption` | `settingsGroup`, `settingID`, `payload` | Update a settings group | +| `updatePaymentGateway`| `paymentGatewayId`, `payload`, `testResponse` | Update a payment gateway | ### Classes @@ -229,6 +233,7 @@ There is a general utilities object `utils` with the following functions: | `deleteAllShippingZones` | | Delete all the existing shipping zones | | `waitForSelectorWithoutThrow` | `selector`, `timeoutInSeconds` | conditionally wait for a selector without throwing an error. Default timeout is 5 seconds | | `createOrder` | `orderOptions` | Creates an order using the API with the passed in details | +| `clickAndWaitForSelector` | `buttonSelector`, `resultSelector`, `timeout` | Click a button and wait for response | ### Test Utilities diff --git a/packages/js/e2e-utils/changelog/.gitkeep b/packages/js/e2e-utils/changelog/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/js/e2e-utils/composer.json b/packages/js/e2e-utils/composer.json new file mode 100644 index 00000000000..ef52c1b8559 --- /dev/null +++ b/packages/js/e2e-utils/composer.json @@ -0,0 +1,27 @@ +{ + "name": "woocommerce/e2e-utiles", + "description": "WooCommerce end to end testing utilities", + "type": "library", + "license": "GPL-3.0-or-later", + "minimum-stability": "dev", + "require-dev": { + "automattic/jetpack-changelogger": "3.0.2" + }, + "extra": { + "changelogger": { + "formatter": { + "filename": "../../../tools/changelogger/PackageFormatter.php" + }, + "types": [ + "Fix", + "Add", + "Update", + "Dev", + "Tweak", + "Performance", + "Enhancement" + ], + "changelog": "NEXT_CHANGELOG.md" + } + } +} diff --git a/packages/js/e2e-utils/composer.lock b/packages/js/e2e-utils/composer.lock new file mode 100644 index 00000000000..a5d2be9ba89 --- /dev/null +++ b/packages/js/e2e-utils/composer.lock @@ -0,0 +1,1021 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "0ca2417cb40cd24e2e3ea7a86be839f8", + "packages": [], + "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 | ^5.2", + "symfony/process": "^3.4 | ^5.2", + "wikimedia/at-ease": "^1.2 | ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 | ^2.0", + "yoast/phpunit-polyfills": "1.0.2" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "mirror-repo": "Automattic/jetpack-changelogger", + "version-constants": { + "::VERSION": "src/Application.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-changelogger/compare/${old}...${new}" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Changelogger\\": "src", + "Automattic\\Jetpack\\Changelog\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "time": "2021-11-02T14:06:49+00:00" + }, + { + "name": "psr/container", + "version": "1.1.x-dev", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/8622567409010282b7aeebe4bb841fe98b58dcaf", + "reference": "8622567409010282b7aeebe4bb841fe98b58dcaf", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "time": "2021-03-05T17:36:06+00:00" + }, + { + "name": "symfony/console", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "reference": "bea7632e3b1d12decedba0a7fe7a7e0ebf7ee2f4", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-12T14:48:14+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "30885182c981ab175d4d034db0f6f469898070ab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/30885182c981ab175d4d034db0f6f469898070ab", + "reference": "30885182c981ab175d4d034db0f6f469898070ab", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "reference": "5911fe42c266a5917aef12e45fbd3a640a9e3b18", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-26T17:12:59+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/8590a5f561694770bdcd3f9b5c69dde6945028e8", + "reference": "8590a5f561694770bdcd3f9b5c69dde6945028e8", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-02-19T12:13:01+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/11b9acb5e8619aef6455735debf77dde8825795c", + "reference": "11b9acb5e8619aef6455735debf77dde8825795c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-20T20:35:02+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/cc5db0e22b3cb4111010e48785a97f670b350ca5", + "reference": "cc5db0e22b3cb4111010e48785a97f670b350ca5", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-06-05T21:20:04+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/57b712b08eddb97c762a8caa32c84e037892d2e9", + "reference": "57b712b08eddb97c762a8caa32c84e037892d2e9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.23-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "files": [ + "bootstrap.php" + ], + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-09-13T13:58:33+00:00" + }, + { + "name": "symfony/process", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "reference": "cbdd4cdf3fc834638c13f3ba26c2ce657a3987ec", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Executes commands in sub-processes", + "homepage": "https://symfony.com", + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-11-04T16:48:04+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "2.5.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "reference": "56b990c18120c91eaf0d38a93fabfa2a1f7fa413", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-07-13T09:35:11+00:00" + }, + { + "name": "symfony/string", + "version": "5.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "reference": "dad92b16d84cb661f39c85a5dbb6e4792b92e90f", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "files": [ + "Resources/functions.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2021-10-28T19:23:26+00:00" + }, + { + "name": "wikimedia/at-ease", + "version": "v2.1.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "reference": "e8ebaa7bb7c8a8395481a05f6dc4deaceab11c33", + "shasum": "" + }, + "require": { + "php": ">=7.2.9" + }, + "require-dev": { + "mediawiki/mediawiki-codesniffer": "35.0.0", + "mediawiki/minus-x": "1.1.1", + "ockcyp/covers-validator": "1.3.3", + "php-parallel-lint/php-console-highlighter": "0.5.0", + "php-parallel-lint/php-parallel-lint": "1.2.0", + "phpunit/phpunit": "^8.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + }, + "files": [ + "src/Wikimedia/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "time": "2021-02-27T15:53:37+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "1.1.0" +} diff --git a/packages/js/e2e-utils/package.json b/packages/js/e2e-utils/package.json index e5382f52561..21f42941f46 100644 --- a/packages/js/e2e-utils/package.json +++ b/packages/js/e2e-utils/package.json @@ -11,12 +11,18 @@ "main": "build/index.js", "module": "build-module/index.js", "dependencies": { + "@automattic/puppeteer-utils": "github:Automattic/puppeteer-utils#0f3ec50", "@wordpress/deprecated": "^2.10.0", "@wordpress/e2e-test-utils": "^4.16.1", "config": "3.3.3", "faker": "^5.1.0", "fishery": "^1.2.0" }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^5.3.0", + "@typescript-eslint/parser": "^5.3.0", + "eslint": "^8.1.0" + }, "peerDependencies": { "@woocommerce/api": "^0.2.0" }, @@ -27,6 +33,7 @@ "clean": "rm -rf ./build ./build-module", "compile": "node ./../bin/build.js", "build": "pnpm run clean && pnpm run compile", - "prepare": "pnpm run build" + "prepare": "pnpm run build", + "lint": "eslint src" } } diff --git a/packages/js/e2e-utils/project.json b/packages/js/e2e-utils/project.json new file mode 100644 index 00000000000..7c55a20ade4 --- /dev/null +++ b/packages/js/e2e-utils/project.json @@ -0,0 +1,37 @@ +{ + "root": "packages/js/e2e-utils/", + "sourceRoot": "packages/js/e2e-utils/src", + "projectType": "library", + "targets": { + "build": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build" + } + }, + "clean": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "clean" + } + }, + "compile": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "compile" + } + }, + "prepare": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "prepare" + } + }, + "lint": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "lint" + } + } + } +} diff --git a/packages/js/e2e-utils/src/components.js b/packages/js/e2e-utils/src/components.js index 1349be25edd..21767d578c2 100644 --- a/packages/js/e2e-utils/src/components.js +++ b/packages/js/e2e-utils/src/components.js @@ -190,13 +190,13 @@ const completeOnboardingWizard = async () => { /** * Create simple product. * - * @param productTitle - Defaults to Simple Product. Customizable title. - * @param productPrice - Defaults to $9.99. Customizable pricing. + * @param productTitle Defaults to Simple Product. Customizable title. + * @param productPrice Defaults to $9.99. Customizable pricing. */ const createSimpleProduct = async ( productTitle = simpleProductName, productPrice = simpleProductPrice ) => { const product = await factories.products.simple.create( { name: productTitle, - regularPrice: productPrice + regularPrice: productPrice, } ); return product.id; } ; diff --git a/packages/js/e2e-utils/src/flows/with-rest-api.js b/packages/js/e2e-utils/src/flows/with-rest-api.js index 49b496d273c..5fc127ee0e5 100644 --- a/packages/js/e2e-utils/src/flows/with-rest-api.js +++ b/packages/js/e2e-utils/src/flows/with-rest-api.js @@ -4,12 +4,14 @@ import {Coupon, Setting, SimpleProduct, Order} from '@woocommerce/api'; const client = factories.api.withDefaultPermalinks; const onboardingProfileEndpoint = '/wc-admin/onboarding/profile'; -const shippingZoneEndpoint = '/wc/v3/shipping/zones'; -const shippingClassesEndpoint = '/wc/v3/products/shipping_classes'; -const userEndpoint = '/wp/v2/users'; -const systemStatusEndpoint = '/wc/v3/system_status'; const productsEndpoint = '/wc/v3/products'; const productCategoriesEndpoint = '/wc/v3/products/categories'; +const shippingClassesEndpoint = '/wc/v3/products/shipping_classes'; +const shippingZoneEndpoint = '/wc/v3/shipping/zones'; +const systemStatusEndpoint = '/wc/v3/system_status'; +const taxClassesEndpoint = '/wc/v3/taxes/classes'; +const taxRatesEndpoint = '/wc/v3/taxes'; +const userEndpoint = '/wp/v2/users'; /** * Utility function to delete all merchant created data store objects. @@ -42,6 +44,16 @@ const deleteAllRepositoryObjects = async ( repository, defaultObjectId = null, s } }; +/** + * Utility to flatten a tax rate. + * + * @param {object} taxRate Tax rate to be flattened. + * @return {string} + */ +const flattenTaxRate = ( taxRate ) => { + return taxRate.rate + '/' + taxRate.class + '/' + taxRate.name; +}; + /** * Utility functions that use the REST API to process the requested function. */ @@ -77,6 +89,16 @@ export const withRestApi = { const repository = Coupon.restRepository( client ); await deleteAllRepositoryObjects( repository ); }, + /** + * Use api package to delete a coupon. + * + * @param {number} couponId Coupon ID. + * @return {Promise} Promise resolving once coupon has been deleted. + */ + deleteCoupon: async ( couponId ) => { + const repository = Coupon.restRepository( client ); + await repository.delete( couponId ); + }, /** * Use api package to delete products. * @@ -89,24 +111,28 @@ export const withRestApi = { /** * Use the API to delete all product attributes. * + * @param {boolean} testResponse Test the response status code. * @return {Promise} Promise resolving once attributes have been deleted. */ - deleteAllProductAttributes: async () => { + deleteAllProductAttributes: async ( testResponse = true ) => { const productAttributesPath = productsEndpoint + '/attributes'; const productAttributes = await client.get( productAttributesPath ); if ( productAttributes.data && productAttributes.data.length ) { for ( let a = 0; a < productAttributes.data.length; a++ ) { const response = await client.delete( productAttributesPath + `/${productAttributes.data[a].id}?force=true` ); - expect( response.status ).toBe( 200 ); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } } } }, /** * Use the API to delete all product categories. * + * @param {boolean} testResponse Test the response status code. * @return {Promise} Promise resolving once categories have been deleted. */ - deleteAllProductCategories: async () => { + deleteAllProductCategories: async ( testResponse = true ) => { const productCategoriesPath = productsEndpoint + '/categories'; const productCategories = await client.get( productCategoriesPath ); if ( productCategories.data && productCategories.data.length ) { @@ -116,22 +142,27 @@ export const withRestApi = { continue; } const response = await client.delete( productCategoriesPath + `/${productCategories.data[c].id}?force=true` ); - expect( response.status ).toBe( 200 ); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } } } }, /** * Use the API to delete all product tags. * + * @param {boolean} testResponse Test the response status code. * @return {Promise} Promise resolving once tags have been deleted. */ - deleteAllProductTags: async () => { + deleteAllProductTags: async ( testResponse = true ) => { const productTagsPath = productsEndpoint + '/tags'; const productTags = await client.get( productTagsPath ); if ( productTags.data && productTags.data.length ) { for ( let t = 0; t < productTags.data.length; t++ ) { const response = await client.delete( productTagsPath + `/${productTags.data[t].id}?force=true` ); - expect( response.status ).toBe( 200 ); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } } } }, @@ -155,6 +186,7 @@ export const withRestApi = { * @param zoneMethod Shipping method type. Defaults to flat_rate (use also: free_shipping or local_pickup). * @param cost Shipping method cost. Default is no cost. * @param additionalZoneMethods Array of additional zone methods to add to the shipping zone. + * @param {boolean} testResponse Test the response status code. */ addShippingZoneAndMethod: async ( zoneName, @@ -162,33 +194,38 @@ export const withRestApi = { zipCode = '', zoneMethod = 'flat_rate', cost = '', - additionalZoneMethods = [] ) => { + additionalZoneMethods = [], + testResponse = true ) => { - const path = 'wc/v3/shipping/zones'; + const path = 'wc/v3/shipping/zones'; - const response = await client.post( path, { name: zoneName } ); - expect(response.status).toEqual(201); - let zoneId = response.data.id; + const response = await client.post( path, { name: zoneName } ); + if ( testResponse ) { + expect( response.status ).toEqual( 201 ); + } + let zoneId = response.data.id; - // Select shipping zone location - let [ zoneType, zoneCode ] = zoneLocation.split(/:(.+)/); - let zoneLocationPayload = [ + // Select shipping zone location + let [ zoneType, zoneCode ] = zoneLocation.split(/:(.+)/); + let zoneLocationPayload = [ { code: zoneCode, type: zoneType, } - ]; + ]; - // Fill shipping zone postcode if provided - if ( zipCode ) { + // Fill shipping zone postcode if provided + if ( zipCode ) { zoneLocationPayload.push( { code: zipCode, type: "postcode", } ); - } + } - const locationResponse = await client.put( path + `/${zoneId}/locations`, zoneLocationPayload ); - expect(locationResponse.status).toEqual(200); + const locationResponse = await client.put( path + `/${zoneId}/locations`, zoneLocationPayload ); + if ( testResponse ) { + expect( locationResponse.status ).toEqual( 200 ); + } // Add shipping zone method let methodPayload = { @@ -196,7 +233,9 @@ export const withRestApi = { } const methodsResponse = await client.post( path + `/${zoneId}/methods`, methodPayload ); - expect(methodsResponse.status).toEqual(200); + if ( testResponse ) { + expect( methodsResponse.status ).toEqual( 200 ); + } let methodId = methodsResponse.data.id; // Add in cost, if provided @@ -208,23 +247,28 @@ export const withRestApi = { } const costResponse = await client.put( path + `/${zoneId}/methods/${methodId}`, costPayload ); - expect(costResponse.status).toEqual(200); + if ( testResponse ) { + expect( costResponse.status ).toEqual( 200 ); + } } // Add any additional zones, if provided if (additionalZoneMethods.length > 0) { for ( let z = 0; z < additionalZoneMethods.length; z++ ) { let response = await client.post( path + `/${zoneId}/methods`, { method_id: additionalZoneMethods[z] } ); - expect(response.status).toEqual(200); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } } } }, /** * Use api package to delete shipping zones. * + * @param {boolean} testResponse Test the response status code. * @return {Promise} Promise resolving once shipping zones have been deleted. */ - deleteAllShippingZones: async () => { + deleteAllShippingZones: async ( testResponse = true ) => { const shippingZones = await client.get( shippingZoneEndpoint ); if ( shippingZones.data && shippingZones.data.length ) { for ( let z = 0; z < shippingZones.data.length; z++ ) { @@ -233,21 +277,26 @@ export const withRestApi = { continue; } const response = await client.delete( shippingZoneEndpoint + `/${shippingZones.data[z].id}?force=true` ); - expect( response.status ).toBe( 200 ); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } } } }, /** * Use api package to delete shipping classes. * + * @param {boolean} testResponse Test the response status code. * @return {Promise} Promise resolving once shipping classes have been deleted. */ - deleteAllShippingClasses: async () => { + deleteAllShippingClasses: async ( testResponse = true ) => { const shippingClasses = await client.get( shippingClassesEndpoint ); if ( shippingClasses.data && shippingClasses.data.length ) { for ( let c = 0; c < shippingClasses.data.length; c++ ) { const response = await client.delete( shippingClassesEndpoint + `/${shippingClasses.data[c].id}?force=true` ); - expect( response.status ).toBe( 200 ); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } } } }, @@ -278,9 +327,10 @@ export const withRestApi = { /** * Reset a settings group to default values except selects. * @param settingsGroup + * @param {boolean} testResponse Test the response status code. * @returns {Promise} */ - resetSettingsGroupToDefault: async ( settingsGroup ) => { + resetSettingsGroupToDefault: async ( settingsGroup, testResponse = true ) => { const settingsClient = Setting.restRepository( client ); const settings = await settingsClient.list( settingsGroup ); if ( ! settings.length ) { @@ -300,7 +350,7 @@ export const withRestApi = { const response = await settingsClient.update( settingsGroup, defaultSetting.id, defaultSetting ); // Multi-selects have a default '' but return an empty []. - if ( settings[s].type != 'multiselect' ) { + if ( testResponse && settings[s].type != 'multiselect' ) { expect( response.value ).toBe( defaultSetting.value ); } } @@ -321,22 +371,61 @@ export const withRestApi = { * * @param {string} paymentGatewayId The ID of the payment gateway to update. * @param {object} payload An object with the key/value pair to update. + * @param {boolean} testResponse Test the response status code. */ - updatePaymentGateway: async ( paymentGatewayId, payload = {} ) => { + updatePaymentGateway: async ( paymentGatewayId, payload = {}, testResponse = true ) => { const response = await client.put( `/wc/v3/payment_gateways/${paymentGatewayId}`, payload ); - expect( response.status ).toBe( 200 ); + if ( testResponse ) { + expect( response.status ).toEqual( 200 ); + } }, /** * Create a batch of orders using the "Batch Create Order" API endpoint. * * @param orders Array of orders to be created + * @param {boolean} testResponse Test the response status code. */ - batchCreateOrders: async (orders) => { + batchCreateOrders: async ( orders, testResponse = true ) => { const path = '/wc/v3/orders/batch'; const payload = { create: orders }; const response = await client.post(path, payload); - expect( response.status ).toEqual(200); + if ( testResponse ) { + expect( response.status ).toBe( 200 ); + } + }, + /** + * Add tax classes. + * + * @param {>} taxClasses Array of tax class objects. + * @returns {Promise} + */ + addTaxClasses: async ( taxClasses ) => { + // Only add tax classes which don't already exist. + const existingTaxClasses = await client.get( taxClassesEndpoint ); + const existingTaxNames = existingTaxClasses.data.map( taxClass => taxClass.name ); + const newTaxClasses = taxClasses.filter( taxClass => ! existingTaxNames.includes( taxClass.name ) ); + + for ( const taxClass of newTaxClasses ) { + await client.post( taxClassesEndpoint, taxClass ); + } + }, + /** + * Add tax rates. + * + * @param {>} taxRates Array of tax rate objects. + * @returns {Promise} + */ + addTaxRates: async ( taxRates ) => { + // Only add rates which don't already exist + const existingTaxRates = await client.get( taxRatesEndpoint ); + const existingRates = existingTaxRates.data.map( taxRate => flattenTaxRate( taxRate ) ); + + for ( const taxRate of taxRates ) { + if ( ! existingRates.includes( flattenTaxRate( taxRate ) ) ) { + await client.post( taxRatesEndpoint, taxRate ); + } + } }, /** * Get the current environment from the WooCommerce system status API. diff --git a/packages/js/e2e-utils/src/page-utils.js b/packages/js/e2e-utils/src/page-utils.js index f67c00b0bb3..8133b5b03fc 100644 --- a/packages/js/e2e-utils/src/page-utils.js +++ b/packages/js/e2e-utils/src/page-utils.js @@ -2,6 +2,7 @@ * External dependencies */ import { pressKeyWithModifier } from '@wordpress/e2e-test-utils'; +import { waitForSelector } from '@automattic/puppeteer-utils'; /** * Internal dependencies @@ -220,11 +221,11 @@ export const evalAndClick = async ( selector ) => { * @param {string} selector Selector of the select2 search field */ export const selectOptionInSelect2 = async ( value, selector = 'input.select2-search__field' ) => { - await page.waitForSelector(selector); - await page.click(selector); - await page.type(selector, value); + await page.waitForSelector( selector ); + await page.click( selector ); + await page.type( selector, value ); await waitForTimeout( 2000 ); // to avoid flakyness, must wait before pressing Enter - await page.keyboard.press('Enter'); + await page.keyboard.press( 'Enter' ); }; /** @@ -234,12 +235,12 @@ export const selectOptionInSelect2 = async ( value, selector = 'input.select2-se * @param {string} orderId Order ID * @param {string} customerName Customer's full name attached to order ID. */ -export const searchForOrder = async (value, orderId, customerName) => { - await clearAndFillInput('#post-search-input', value); - await expect(page).toMatchElement('#post-search-input', value); - await expect(page).toClick('#search-submit' ); - await page.waitForSelector('#the-list', { timeout: 10000 } ); - await expect(page).toMatchElement('.order_number > a.order-view', {text: `#${orderId} ${customerName}`}); +export const searchForOrder = async ( value, orderId, customerName) => { + await clearAndFillInput( '#post-search-input', value ); + await expect( page ).toMatchElement( '#post-search-input', value ); + await expect( page ).toClick( '#search-submit' ); + await page.waitForSelector( '#the-list', { timeout: 10000 } ); + await expect( page ).toMatchElement( '.order_number > a.order-view', { text: `#${orderId} ${customerName}` } ); }; /** @@ -255,16 +256,16 @@ export const applyCoupon = async ( couponCode ) => { page.reload(), page.waitForNavigation( { waitUntil: 'networkidle0' } ), ]); - await expect(page).toClick('a', {text: 'Click here to enter your code'}); + await expect( page ).toClick( 'a', { text: 'Click here to enter your code' } ); await uiUnblocked(); - await clearAndFillInput('#coupon_code', couponCode); - await expect(page).toClick('button', {text: 'Apply coupon'}); + await clearAndFillInput( '#coupon_code', couponCode ); + await expect( page ).toClick( 'button', {text: 'Apply coupon' } ); await uiUnblocked(); - } catch (error) { - await clearAndFillInput('#coupon_code', couponCode); - await expect(page).toClick('button', {text: 'Apply coupon'}); + } catch ( error ) { + await clearAndFillInput( '#coupon_code', couponCode ); + await expect( page ).toClick( 'button', { text: 'Apply coupon' } ); await uiUnblocked(); - }; + } }; /** @@ -278,9 +279,9 @@ export const removeCoupon = async ( couponCode ) => { page.reload(), page.waitForNavigation( { waitUntil: 'networkidle0' } ), ]); - await expect(page).toClick('[data-coupon="'+couponCode.toLowerCase()+'"]', {text: '[Remove]'}); + await expect( page ).toClick( '[data-coupon="'+couponCode.toLowerCase()+'"]', {text: '[Remove]' } ); await uiUnblocked(); - await expect(page).toMatchElement('.woocommerce-message', {text: 'Coupon has been removed.'}); + await expect( page ).toMatchElement( '.woocommerce-message', {text: 'Coupon has been removed.' } ); }; /** @@ -296,3 +297,24 @@ export const selectOrderAction = async ( action ) => { page.waitForNavigation( { waitUntil: 'networkidle0' } ), ] ); } + + +/** + * Evaluate and click a button selector then wait for a result selector. + * This is a work around for what appears to be intermittent delays in handling confirm dialogs. + * + * @param {string} buttonSelector Selector of button to click + * @param {string} resultSelector Selector to wait for after click + * @param {number} timeout Timeout length in milliseconds. Default 5000. + * @returns {Promise} + */ +export const clickAndWaitForSelector = async ( buttonSelector, resultSelector, timeout = 5000 ) => { + await evalAndClick( buttonSelector ); + await waitForSelector( + page, + resultSelector, + { + timeout + } + ); +}; diff --git a/plugins/woocommerce/.distignore b/plugins/woocommerce/.distignore index 64c332f0cbb..69c122dc43d 100644 --- a/plugins/woocommerce/.distignore +++ b/plugins/woocommerce/.distignore @@ -16,6 +16,7 @@ docker-compose.yaml Dockerfile Gruntfile.js none +project.json package-lock.json package.json packages/woocommerce-admin/docs diff --git a/plugins/woocommerce/.gitignore b/plugins/woocommerce/.gitignore index 841fe64ce6e..5bd13ff9092 100644 --- a/plugins/woocommerce/.gitignore +++ b/plugins/woocommerce/.gitignore @@ -1,20 +1,7 @@ # Editors -project.xml -project.properties /nbproject/private/ -.buildpath -.project -.settings* -.idea -.vscode -.eslintcache -*.sublime-project -*.sublime-workspace -.sublimelinterrc -*.swp # Grunt -node_modules/ none # Sass @@ -27,12 +14,6 @@ none # Minified JS /assets/js/**/*.min.js -# OS X metadata -.DS_Store - -# Windows junk -Thumbs.db - # Behat/CLI Tests tests/cli/installer tests/cli/composer.phar @@ -46,15 +27,9 @@ tests/cli/vendor /tests/e2e/config/local-*.json /tests/e2e/config/local.json /tests/e2e/config/default.json -/tests/e2e/env/config/default.json /tests/e2e/docker -/tests/e2e/env/docker/wp-cli/initialize.sh -/tests/e2e/env/build/ -/tests/e2e/env/build-module/ /tests/e2e/screenshots /tests/e2e/plugins -/tests/e2e/utils/build/ -/tests/e2e/utils/build-module/ # Logs /logs @@ -73,12 +48,5 @@ yarn.lock /packages/* !/packages/README.md -# Screenshots for e2e tests failures -/screenshots/ - # Language files i18n/languages/woocommerce.pot - -# Build -build/ -woocommerce.zip diff --git a/plugins/woocommerce/NEXT_CHANGELOG.md b/plugins/woocommerce/NEXT_CHANGELOG.md new file mode 100644 index 00000000000..ef1933df641 --- /dev/null +++ b/plugins/woocommerce/NEXT_CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +--- + +[See changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob/77ccfc56ca5680f3bc1496d8b2f93befa28e1483/changelog.txt). diff --git a/plugins/woocommerce/assets/css/admin.scss b/plugins/woocommerce/assets/css/admin.scss index 1de1eb48349..06de2fa27b6 100644 --- a/plugins/woocommerce/assets/css/admin.scss +++ b/plugins/woocommerce/assets/css/admin.scss @@ -90,36 +90,17 @@ @media only screen and ( min-width: 768px ) { margin-bottom: 24px; } + } - .current-section-dropdown { - position: relative; - width: 100%; + .current-section-dropdown { + background: #fff; + border: 1px solid #a7aaad; + margin-bottom: 20px; + position: relative; + width: 100%; - @media only screen and ( min-width: 600px ) { - margin-left: 70px; - width: 288px; - } - } - - .current-section-name { - cursor: pointer; - font-weight: 600; - font-size: 14px; - line-height: 20px; - padding: 20px 16px; - position: relative; - } - - .current-section-name::after { - background-image: url(../images/icons/gridicons-chevron-down.svg); - background-size: contain; - content: ""; - display: block; - height: 20px; - position: absolute; - right: 20px; - top: 20px; - width: 20px; + @media only screen and (min-width: 600px) { + width: 288px; } ul { @@ -136,11 +117,13 @@ width: 100%; z-index: 10; - @media only screen and ( min-width: 600px ) { + @media only screen and (min-width: 600px) { border: 1px solid #1e1e1e; + left: -1px; + top: 48px; } - @media only screen and ( min-width: 1100px ) { + @media only screen and (min-width: 1100px) { justify-content: center; } @@ -148,6 +131,17 @@ font-size: 13px; line-height: 16px; margin: 0; + + &.current a::after { + background-image: url(../images/icons/gridicons-checkmark.svg); + content: ""; + display: block; + height: 20px; + position: absolute; + right: 20px; + top: 7px; + width: 20px; + } } a, @@ -165,32 +159,41 @@ position: relative; width: 100%; - @media only screen and ( min-width: 600px ) { + @media only screen and (min-width: 600px) { padding: 10px 18px; } } + } + } - a.current::after { - background-image: url(../images/icons/gridicons-checkmark.svg); - content: ""; - display: block; - height: 20px; - position: absolute; - right: 20px; - top: 7px; - width: 20px; - } + .current-section-name { + cursor: pointer; + font-size: 14px; + line-height: 24px; + padding: 12px 16px; + position: relative; + } + + .current-section-name::after { + background-image: url(../images/icons/gridicons-chevron-down.svg); + background-size: contain; + content: ""; + display: block; + height: 20px; + position: absolute; + right: 20px; + top: 16px; + width: 20px; + } + + .current-section-dropdown.is-open { + + ul { + display: flex; } - .current-section-dropdown.is-open { - - ul { - display: flex; - } - - .current-section-name::after { - transform: rotate(0.5turn); - } + .current-section-name::after { + transform: rotate(0.5turn); } } @@ -202,7 +205,7 @@ font-size: 9px; font-weight: 600; line-height: 17px; - margin: 1px 0 0 2px; + margin: 1px 0 0 4px; padding: 0 6px; vertical-align: text-top; } @@ -223,7 +226,7 @@ font-size: 20px; font-family: $font-sf-pro-display; line-height: 1.2; - margin: 48px 0 16px; + margin: 48px 0 12px; padding: 0; } @@ -366,6 +369,17 @@ color: #fff; } + .addons-button-promoted { + float: right; + width: auto; + padding: 0 20px; + margin-top: 0; + } + + .addons-button-promoted:hover { + opacity: 0.8; + } + .addons-button-expandable { display: inline-block; padding: 0 16px; @@ -419,10 +433,6 @@ @media only screen and (max-width: 400px) { - .addons-featured { - margin: -1% -5%; - } - .addons-button { width: 100%; } @@ -439,9 +449,21 @@ width: 100%; } + .addon-product-group { + margin-bottom: 24px; + } + .addon-product-group-title { font-family: $font-sf-pro-display; - letter-spacing: 0.38px; + font-size: 20px; + font-weight: 400; + line-height: 24px; + margin: 0 0 4px; + } + + .current-section-dropdown__title { + display: none; + font-family: $font-sf-pro-display; } .addon-product-group-description-container { @@ -492,6 +514,7 @@ background: #fff; border: 1px solid #dcdcde; border-radius: 2px; + box-sizing: border-box; display: flex; flex: 1 0 auto; flex-direction: column; @@ -504,6 +527,10 @@ padding: 0; vertical-align: top; + &.addons-full-width { + max-width: 100%; + } + @media only screen and ( max-width: 768px ) { max-width: none; width: 100%; @@ -567,6 +594,35 @@ color: #1d2327; // Gray / Gray 90 } + &.featured, + &.promoted { + + .label { + align-items: center; + border-radius: 2px; + background: #dcdcde; + display: flex; + flex-direction: row; + height: 20px; + justify-content: flex-end; + margin-bottom: 8px; + max-width: 52px; + padding: 3px 12px; + top: 28px; + right: 24px; + text-align: center; + + &.promoted { + float: right; + max-width: 58px; + } + } + + h2 { + color: #2c3338; + } + } + p { color: #2c3338; font-size: 14px; @@ -670,6 +726,18 @@ } } + .product-footer-promoted { + align-items: flex-end; + display: flex; + justify-content: space-between; + padding: 24px; + + .icon img { + border-radius: 4px; + width: 80px; + } + } + .addons-buttons-banner { display: flex; flex-direction: row; @@ -737,6 +805,36 @@ } } +.marketplace-header__tabs { + display: flex; + margin: 0; +} + +.marketplace-header__tab { + display: flex; + flex: 1; + margin: 0; +} + +.marketplace-header__tab-link { + align-items: center; + border-bottom: 2px solid transparent; + box-sizing: border-box; + display: flex; + font-size: 14px; + height: 60px; + justify-content: center; + line-height: 20px; + padding: 0 24px; + text-decoration: none; + width: 100%; + + &.is-current { + border-bottom: 2px solid #1e1e1e; + color: #1e1e1e; + } +} + .no-touch, .no-js { @@ -757,6 +855,19 @@ .wc-subscriptions-wrap { max-width: 1200px; + + .update-plugins .update-count { + background-color: #d54e21; + border-radius: 10px; + color: #fff; + display: inline-block; + font-size: 9px; + font-weight: 600; + line-height: 17px; + margin: 1px 0 0 2px; + padding: 0 6px; + vertical-align: text-top; + } } .woocommerce-page-wc-marketplace { @@ -7643,4 +7754,87 @@ table.bar_chart { } } } + + .marketplace-header__tab { + flex: none; + } +} + +@media screen and (min-width: 961px) { + + .marketplace-header__tabs { + margin-left: 84px; + } +} + +@media screen and (min-width: 1024px) { + + .current-section-name { + display: none; + } + + .wc-addons-wrap { + .current-section-dropdown__title { + display: block; + font-size: 20px; + font-weight: 400; + line-height: 24px; + margin: 0 0 16px; + } + + .current-section-dropdown { + background: none; + border: none; + margin-bottom: 32px; + width: 100%; + + ul { + background: none; + border: none; + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + margin-top: -12px; + padding: 0; + position: static; + + li { + background: #fff; + border: 1px solid #ccc; + border-radius: 32px; + font-size: 14px; + line-height: 20px; + margin: 12px 12px 0 0; + + &.current { + background: #007cba; + border: 1px solid #007cba; + + a { + color: #fff; + } + + a::after { + background: none; + } + } + } + + a, + a:visited, + a:hover, + a:active { + color: #2c3338; + padding: 10px 16px !important; + } + } + + li:last-child { + a::after { + display: none; + } + } + } + } } diff --git a/plugins/woocommerce/bin/build-zip.sh b/plugins/woocommerce/bin/build-zip.sh index 9d7675711aa..0dae45443fe 100755 --- a/plugins/woocommerce/bin/build-zip.sh +++ b/plugins/woocommerce/bin/build-zip.sh @@ -10,7 +10,7 @@ rm -rf "$BUILD_PATH" mkdir -p "$DEST_PATH" echo "Installing PHP and JS dependencies..." -pnpm run install:no-e2e +pnpm install composer install || exit "$?" echo "Running JS Build..." pnpm run build:core || exit "$?" diff --git a/plugins/woocommerce/bin/composer/mozart/composer.lock b/plugins/woocommerce/bin/composer/mozart/composer.lock index e7e060dec9a..ffc24351bb8 100644 --- a/plugins/woocommerce/bin/composer/mozart/composer.lock +++ b/plugins/woocommerce/bin/composer/mozart/composer.lock @@ -266,16 +266,16 @@ }, { "name": "symfony/console", - "version": "v5.3.7", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", + "url": "https://api.github.com/repos/symfony/console/zipball/d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", + "reference": "d4e409d9fbcfbf71af0e5a940abb7b0b4bad0bd3", "shasum": "" }, "require": { @@ -345,7 +345,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.7" + "source": "https://github.com/symfony/console/tree/v5.3.10" }, "funding": [ { @@ -361,7 +361,7 @@ "type": "tidelift" } ], - "time": "2021-08-25T20:02:16+00:00" + "time": "2021-10-26T09:30:15+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1059,16 +1059,16 @@ }, { "name": "symfony/string", - "version": "v5.3.7", + "version": "v5.3.10", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", + "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", "shasum": "" }, "require": { @@ -1122,7 +1122,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.7" + "source": "https://github.com/symfony/string/tree/v5.3.10" }, "funding": [ { @@ -1138,7 +1138,7 @@ "type": "tidelift" } ], - "time": "2021-08-26T08:00:08+00:00" + "time": "2021-10-27T18:21:46+00:00" } ], "aliases": [], diff --git a/plugins/woocommerce/bin/composer/phpunit/composer.lock b/plugins/woocommerce/bin/composer/phpunit/composer.lock index b3eb88d717f..d6320b80455 100644 --- a/plugins/woocommerce/bin/composer/phpunit/composer.lock +++ b/plugins/woocommerce/bin/composer/phpunit/composer.lock @@ -1112,16 +1112,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" + "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", "shasum": "" }, "require": { @@ -1130,7 +1130,7 @@ }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1177,7 +1177,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" }, "funding": [ { @@ -1185,7 +1185,7 @@ "type": "github" } ], - "time": "2020-11-30T07:47:53+00:00" + "time": "2021-11-11T13:51:24+00:00" }, { "name": "sebastian/global-state", diff --git a/plugins/woocommerce/bin/composer/wp/composer.lock b/plugins/woocommerce/bin/composer/wp/composer.lock index 52f554a2577..fb6330f9c9a 100644 --- a/plugins/woocommerce/bin/composer/wp/composer.lock +++ b/plugins/woocommerce/bin/composer/wp/composer.lock @@ -9,16 +9,16 @@ "packages-dev": [ { "name": "gettext/gettext", - "version": "v4.8.5", + "version": "v4.8.6", "source": { "type": "git", "url": "https://github.com/php-gettext/Gettext.git", - "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4" + "reference": "bbeb8f4d3077663739aecb4551b22e720c0e9efe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/ef2e312dff383fc0e4cd62dd39042e1157f137d4", - "reference": "ef2e312dff383fc0e4cd62dd39042e1157f137d4", + "url": "https://api.github.com/repos/php-gettext/Gettext/zipball/bbeb8f4d3077663739aecb4551b22e720c0e9efe", + "reference": "bbeb8f4d3077663739aecb4551b22e720c0e9efe", "shasum": "" }, "require": { @@ -70,7 +70,7 @@ "support": { "email": "oom@oscarotero.com", "issues": "https://github.com/oscarotero/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v4.8.5" + "source": "https://github.com/php-gettext/Gettext/tree/v4.8.6" }, "funding": [ { @@ -86,20 +86,20 @@ "type": "patreon" } ], - "time": "2021-07-13T16:45:53+00:00" + "time": "2021-10-19T10:44:53+00:00" }, { "name": "gettext/languages", - "version": "2.8.1", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a" + "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4ad818b6341e177b7c508ec4c37e18932a7b788a", - "reference": "4ad818b6341e177b7c508ec4c37e18932a7b788a", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/ed56dd2c7f4024cc953ed180d25f02f2640e3ffa", + "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa", "shasum": "" }, "require": { @@ -148,7 +148,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.8.1" + "source": "https://github.com/php-gettext/Languages/tree/2.9.0" }, "funding": [ { @@ -160,20 +160,20 @@ "type": "github" } ], - "time": "2021-07-14T15:03:58+00:00" + "time": "2021-11-11T17:30:39+00:00" }, { "name": "mck89/peast", - "version": "v1.13.8", + "version": "v1.13.9", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "4f0423441ec557f3935b056d10987f2e1c7a3e76" + "reference": "5329e997fb50e0b82ca8f6e4164f92941f689b47" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/4f0423441ec557f3935b056d10987f2e1c7a3e76", - "reference": "4f0423441ec557f3935b056d10987f2e1c7a3e76", + "url": "https://api.github.com/repos/mck89/peast/zipball/5329e997fb50e0b82ca8f6e4164f92941f689b47", + "reference": "5329e997fb50e0b82ca8f6e4164f92941f689b47", "shasum": "" }, "require": { @@ -185,7 +185,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13.8-dev" + "dev-master": "1.13.9-dev" } }, "autoload": { @@ -207,9 +207,9 @@ "description": "Peast is PHP library that generates AST for JavaScript code", "support": { "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.13.8" + "source": "https://github.com/mck89/peast/tree/v1.13.9" }, - "time": "2021-09-11T10:28:18+00:00" + "time": "2021-11-12T13:44:49+00:00" }, { "name": "mustache/mustache", diff --git a/plugins/woocommerce/bin/post-merge.sh b/plugins/woocommerce/bin/post-merge.sh index 598689495f5..b7d9ac1bab4 100755 --- a/plugins/woocommerce/bin/post-merge.sh +++ b/plugins/woocommerce/bin/post-merge.sh @@ -9,5 +9,5 @@ runOnChange() { fi } -runOnChange "package-lock.json" "pnpm run install:no-e2e" +runOnChange "package-lock.json" "pnpm install" runOnChange "composer.lock" "SKIP_UPDATE_TEXTDOMAINS=true composer install" diff --git a/plugins/woocommerce/changelog/.gitkeep b/plugins/woocommerce/changelog/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index acab8ed832c..fec0261dce0 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -1,121 +1,138 @@ { - "name": "woocommerce/woocommerce", - "description": "An eCommerce toolkit that helps you sell anything. Beautifully.", - "homepage": "https://woocommerce.com/", - "type": "wordpress-plugin", - "license": "GPL-3.0-or-later", - "prefer-stable": true, - "minimum-stability": "dev", - "repositories": [ - { - "type": "path", - "url": "lib" - } - ], - "require": { - "php": ">=7.0", - "automattic/jetpack-autoloader": "2.10.1", - "automattic/jetpack-constants": "1.5.1", - "composer/installers": "~1.7", - "maxmind-db/reader": "1.6.0", - "pelago/emogrifier": "3.1.0", - "psr/container": "1.0.0", - "woocommerce/action-scheduler": "3.3.0", - "woocommerce/woocommerce-admin": "2.8.0", - "woocommerce/woocommerce-blocks": "6.1.0" - }, - "require-dev": { - "bamarni/composer-bin-plugin": "^1.4", - "yoast/phpunit-polyfills": "^1.0" - }, - "config": { - "optimize-autoloader": true, - "platform": { - "php": "7.0" - }, - "preferred-install": { - "woocommerce/action-scheduler": "dist", - "woocommerce/woocommerce-rest-api": "dist", - "woocommerce/woocommerce-blocks": "dist" - }, - "sort-packages": true - }, - "autoload": { - "exclude-from-classmap": [ - "includes/legacy", - "includes/libraries" - ], - "classmap": [ - "includes/rest-api" - ], - "psr-4": { - "Automattic\\WooCommerce\\": "src/", - "Automattic\\WooCommerce\\Vendor\\": "lib/packages/" - }, - "psr-0": { - "Automattic\\WooCommerce\\Vendor\\": "lib/packages/" - } - }, - "autoload-dev": { - "psr-4": { - "Automattic\\WooCommerce\\Tests\\": "tests/php/src/", - "Automattic\\WooCommerce\\Testing\\Tools\\": "tests/Tools/" - }, - "classmap": [ - "tests/legacy/unit-tests/rest-api/Helpers" - ] - }, - "scripts": { - "post-install-cmd": [ - "@composer bin all install --ansi", - "sh ./bin/package-update.sh" - ], - "post-update-cmd": [ - "@composer bin all update --ansi", - "sh ./bin/package-update.sh" - ], - "test": [ - "phpunit" - ], - "phpcs": [ - "phpcs -s -p" - ], - "phpcs-pre-commit": [ - "phpcs -s -p -n" - ], - "phpcbf": [ - "phpcbf -p" - ], - "makepot-audit": [ - "wp --allow-root i18n make-pot . --exclude=\".github,.wordpress-org,bin,sample-data,node_modules,tests\" --slug=woocommerce" - ], - "makepot": [ - "@makepot-audit --skip-audit" - ], - "bin": [ - "echo 'bin not installed'" - ], - "build-lib": [ - "sh ./bin/build-lib.sh" - ] - }, - "extra": { - "installer-paths": { - "packages/{$name}": [ - "woocommerce/action-scheduler", - "woocommerce/woocommerce-blocks", - "woocommerce/woocommerce-admin" - ] - }, - "scripts-description": { - "test": "Run unit tests", - "phpcs": "Analyze code against the WordPress coding standards with PHP_CodeSniffer", - "phpcbf": "Fix coding standards warnings/errors automatically with PHP Code Beautifier", - "makepot-audit": "Generate i18n/languages/woocommerce.pot file and run audit", - "makepot": "Generate i18n/languages/woocommerce.pot file" - }, - "bamarni-bin": { - "target-directory": "bin/composer" - } - } + "name": "woocommerce/woocommerce", + "description": "An eCommerce toolkit that helps you sell anything. Beautifully.", + "homepage": "https://woocommerce.com/", + "type": "wordpress-plugin", + "license": "GPL-3.0-or-later", + "prefer-stable": true, + "minimum-stability": "dev", + "repositories": [ + { + "type": "path", + "url": "lib" + } + ], + "require": { + "php": ">=7.0", + "automattic/jetpack-autoloader": "2.10.1", + "automattic/jetpack-constants": "1.5.1", + "composer/installers": "~1.7", + "maxmind-db/reader": "1.6.0", + "pelago/emogrifier": "3.1.0", + "psr/container": "1.0.0", + "woocommerce/action-scheduler": "3.3.0", + "woocommerce/woocommerce-admin": "2.9.0-rc.2", + "woocommerce/woocommerce-blocks": "6.3.2" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4", + "yoast/phpunit-polyfills": "^1.0", + "automattic/jetpack-changelogger": "3.0.2" + }, + "config": { + "optimize-autoloader": true, + "preferred-install": { + "woocommerce/action-scheduler": "dist", + "woocommerce/woocommerce-rest-api": "dist", + "woocommerce/woocommerce-blocks": "dist" + }, + "sort-packages": true, + "platform": { + "php": "7.0.33" + } + }, + "autoload": { + "exclude-from-classmap": [ + "includes/legacy", + "includes/libraries" + ], + "classmap": [ + "includes/rest-api" + ], + "psr-4": { + "Automattic\\WooCommerce\\": "src/", + "Automattic\\WooCommerce\\Vendor\\": "lib/packages/" + }, + "psr-0": { + "Automattic\\WooCommerce\\Vendor\\": "lib/packages/" + } + }, + "autoload-dev": { + "psr-4": { + "Automattic\\WooCommerce\\Tests\\": "tests/php/src/", + "Automattic\\WooCommerce\\Testing\\Tools\\": "tests/Tools/" + }, + "classmap": [ + "tests/legacy/unit-tests/rest-api/Helpers" + ] + }, + "scripts": { + "post-install-cmd": [ + "@composer bin all install --ansi", + "sh ./bin/package-update.sh" + ], + "post-update-cmd": [ + "@composer bin all update --ansi", + "sh ./bin/package-update.sh" + ], + "test": [ + "phpunit" + ], + "phpcs": [ + "phpcs -s -p" + ], + "phpcs-pre-commit": [ + "phpcs -s -p -n" + ], + "phpcbf": [ + "phpcbf -p" + ], + "makepot-audit": [ + "wp --allow-root i18n make-pot . --exclude=\".github,.wordpress-org,bin,sample-data,node_modules,tests\" --slug=woocommerce" + ], + "makepot": [ + "@makepot-audit --skip-audit" + ], + "bin": [ + "echo 'bin not installed'" + ], + "build-lib": [ + "sh ./bin/build-lib.sh" + ] + }, + "extra": { + "installer-paths": { + "packages/{$name}": [ + "woocommerce/action-scheduler", + "woocommerce/woocommerce-blocks", + "woocommerce/woocommerce-admin" + ] + }, + "scripts-description": { + "test": "Run unit tests", + "phpcs": "Analyze code against the WordPress coding standards with PHP_CodeSniffer", + "phpcbf": "Fix coding standards warnings/errors automatically with PHP Code Beautifier", + "makepot-audit": "Generate i18n/languages/woocommerce.pot file and run audit", + "makepot": "Generate i18n/languages/woocommerce.pot file" + }, + "bamarni-bin": { + "target-directory": "bin/composer" + }, + "changelogger": { + "formatter": { + "filename": "../../tools/changelogger/PluginFormatter.php" + }, + "types": [ + "Fix", + "Add", + "Update", + "Dev", + "Tweak", + "Performance", + "Enhancement" + ], + "versioning": "wordpress", + "changelog": "NEXT_CHANGELOG.md" + } + } } diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index 29ff15be7ba..5acea642ea3 100644 --- a/plugins/woocommerce/composer.lock +++ b/plugins/woocommerce/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2850714f99d072cbc80188fd4b56630f", + "content-hash": "83379234b653f45a89537a0bb470eb69", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -438,27 +438,22 @@ }, { "name": "symfony/css-selector", - "version": "v3.3.6", + "version": "v3.4.47", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "4d882dced7b995d5274293039370148e291808f2" + "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/4d882dced7b995d5274293039370148e291808f2", - "reference": "4d882dced7b995d5274293039370148e291808f2", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/da3d9da2ce0026771f5fe64cb332158f1bd2bc33", + "reference": "da3d9da2ce0026771f5fe64cb332158f1bd2bc33", "shasum": "" }, "require": { - "php": ">=5.5.9" + "php": "^5.5.9|>=7.0.8" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, "autoload": { "psr-4": { "Symfony\\Component\\CssSelector\\": "" @@ -472,14 +467,14 @@ "MIT" ], "authors": [ - { - "name": "Jean-François Simon", - "email": "jeanfrancois.simon@sensiolabs.com" - }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" @@ -488,9 +483,23 @@ "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/master" + "source": "https://github.com/symfony/css-selector/tree/v3.4.47" }, - "time": "2017-05-01T15:01:29+00:00" + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" }, { "name": "woocommerce/action-scheduler", @@ -533,16 +542,16 @@ }, { "name": "woocommerce/woocommerce-admin", - "version": "2.8.0", + "version": "2.9.0-rc.2", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-admin.git", - "reference": "63b93a95db4bf788f42587a41f2378128a2adfdf" + "reference": "6c81e761d9a19e6ed4484db82d6710331f375a3a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/63b93a95db4bf788f42587a41f2378128a2adfdf", - "reference": "63b93a95db4bf788f42587a41f2378128a2adfdf", + "url": "https://api.github.com/repos/woocommerce/woocommerce-admin/zipball/6c81e761d9a19e6ed4484db82d6710331f375a3a", + "reference": "6c81e761d9a19e6ed4484db82d6710331f375a3a", "shasum": "" }, "require": { @@ -598,22 +607,22 @@ "homepage": "https://github.com/woocommerce/woocommerce-admin", "support": { "issues": "https://github.com/woocommerce/woocommerce-admin/issues", - "source": "https://github.com/woocommerce/woocommerce-admin/tree/v2.8.0" + "source": "https://github.com/woocommerce/woocommerce-admin/tree/v2.9.0-rc.2" }, - "time": "2021-11-02T19:28:38+00:00" + "time": "2021-11-18T08:35:56+00:00" }, { "name": "woocommerce/woocommerce-blocks", - "version": "v6.1.0", + "version": "v6.3.2", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-gutenberg-products-block.git", - "reference": "8556efd69e85c01f5571d39e6581d9b8486b682f" + "reference": "5b3aea9adb718a1f78525881e4f0c33c72ba175d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-gutenberg-products-block/zipball/8556efd69e85c01f5571d39e6581d9b8486b682f", - "reference": "8556efd69e85c01f5571d39e6581d9b8486b682f", + "url": "https://api.github.com/repos/woocommerce/woocommerce-gutenberg-products-block/zipball/5b3aea9adb718a1f78525881e4f0c33c72ba175d", + "reference": "5b3aea9adb718a1f78525881e4f0c33c72ba175d", "shasum": "" }, "require": { @@ -621,6 +630,8 @@ "composer/installers": "^1.7.0" }, "require-dev": { + "johnbillion/wp-hooks-generator": "0.6.1", + "mockery/mockery": "^1.4", "woocommerce/woocommerce-sniffs": "0.1.0", "wp-phpunit/wp-phpunit": "^5.4", "yoast/phpunit-polyfills": "^1.0" @@ -650,12 +661,69 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues", - "source": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/v6.1.0" + "source": "https://github.com/woocommerce/woocommerce-gutenberg-products-block/tree/v6.3.2" }, - "time": "2021-10-12T13:07:11+00:00" + "time": "2021-11-18T03:27:03+00:00" } ], "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.0.2", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "reference": "b76f9cb4c22ec08490eff91a2e0e5aa586ee04b3", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 | ^5.2", + "symfony/process": "^3.4 | ^5.2", + "wikimedia/at-ease": "^1.2 | ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 | ^2.0", + "yoast/phpunit-polyfills": "1.0.2" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-master": "3.0.x-dev" + }, + "mirror-repo": "Automattic/jetpack-changelogger", + "version-constants": { + "::VERSION": "src/Application.php" + }, + "changelogger": { + "link-template": "https://github.com/Automattic/jetpack-changelogger/compare/${old}...${new}" + } + }, + "autoload": { + "psr-4": { + "Automattic\\Jetpack\\Changelogger\\": "src", + "Automattic\\Jetpack\\Changelog\\": "lib" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "support": { + "source": "https://github.com/Automattic/jetpack-changelogger/tree/v3.0.2" + }, + "time": "2021-11-02T14:06:49+00:00" + }, { "name": "bamarni/composer-bin-plugin", "version": "1.4.1", @@ -1576,6 +1644,56 @@ "abandoned": true, "time": "2018-08-09T05:50:03+00:00" }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, { "name": "sebastian/code-unit-reverse-lookup", "version": "1.0.2", @@ -1811,16 +1929,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e" + "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/6b853149eab67d4da22291d36f5b0631c0fd856e", - "reference": "6b853149eab67d4da22291d36f5b0631c0fd856e", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", "shasum": "" }, "require": { @@ -1829,7 +1947,7 @@ }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1876,7 +1994,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" }, "funding": [ { @@ -1884,7 +2002,7 @@ "type": "github" } ], - "time": "2020-11-30T07:47:53+00:00" + "time": "2021-11-11T13:51:24+00:00" }, { "name": "sebastian/global-state", @@ -2209,6 +2327,158 @@ }, "time": "2016-10-03T07:35:21+00:00" }, + { + "name": "symfony/console", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" + }, + { + "name": "symfony/debug", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/ab42889de57fdfcfcc0759ab102e2fd4ea72dcae", + "reference": "ab42889de57fdfcfcc0759ab102e2fd4ea72dcae", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "psr/log": "~1.0" + }, + "conflict": { + "symfony/http-kernel": ">=2.3,<2.3.24|~2.4.0|>=2.5,<2.5.9|>=2.6,<2.6.2" + }, + "require-dev": { + "symfony/http-kernel": "~2.8|~3.0|~4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Debug\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Debug Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" + }, { "name": "symfony/polyfill-ctype", "version": "v1.19.0", @@ -2288,6 +2558,147 @@ ], "time": "2020-10-23T09:01:57+00:00" }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "reference": "b5f7b932ee6fa802fc792eabd77c4c88084517ce", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.19-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + }, + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.19.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-23T09:01:57+00:00" + }, + { + "name": "symfony/process", + "version": "v3.4.47", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca", + "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/v3.4.47" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2020-10-24T10:57:07+00:00" + }, { "name": "theseer/tokenizer", "version": "1.1.3", @@ -2385,6 +2796,61 @@ }, "time": "2020-07-08T17:02:28+00:00" }, + { + "name": "wikimedia/at-ease", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "013ac61929797839c80a111a3f1a4710d8248e7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/013ac61929797839c80a111a3f1a4710d8248e7a", + "reference": "013ac61929797839c80a111a3f1a4710d8248e7a", + "shasum": "" + }, + "require": { + "php": ">=5.6.99" + }, + "require-dev": { + "jakub-onderka/php-console-highlighter": "0.3.2", + "jakub-onderka/php-parallel-lint": "1.0.0", + "mediawiki/mediawiki-codesniffer": "22.0.0", + "mediawiki/minus-x": "0.3.1", + "ockcyp/covers-validator": "0.5.1 || 0.6.1", + "phpunit/phpunit": "4.8.36 || ^6.5" + }, + "type": "library", + "autoload": { + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + }, + "files": [ + "src/Wikimedia/Functions.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "support": { + "source": "https://github.com/wikimedia/at-ease/tree/master" + }, + "time": "2018-10-10T15:39:06+00:00" + }, { "name": "yoast/phpunit-polyfills", "version": "1.0.2", @@ -2457,7 +2923,7 @@ }, "platform-dev": [], "platform-overrides": { - "php": "7.0" + "php": "7.0.33" }, - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/plugins/woocommerce/i18n/states.php b/plugins/woocommerce/i18n/states.php index be564d0943a..4b4412d9e92 100644 --- a/plugins/woocommerce/i18n/states.php +++ b/plugins/woocommerce/i18n/states.php @@ -269,6 +269,24 @@ return array( 'ZG' => __( 'Zug', 'woocommerce' ), 'ZH' => __( 'Zürich', 'woocommerce' ), ), + 'CL' => array( // Chile states. + 'CL-AI' => __( 'Aisén del General Carlos Ibañez del Campo', 'woocommerce' ), + 'CL-AN' => __( 'Antofagasta', 'woocommerce' ), + 'CL-AP' => __( 'Arica y Parinacota', 'woocommerce' ), + 'CL-AR' => __( 'La Araucanía', 'woocommerce' ), + 'CL-AT' => __( 'Atacama', 'woocommerce' ), + 'CL-BI' => __( 'Biobío', 'woocommerce' ), + 'CL-CO' => __( 'Coquimbo', 'woocommerce' ), + 'CL-LI' => __( 'Libertador General Bernardo O\'Higgins', 'woocommerce' ), + 'CL-LL' => __( 'Los Lagos', 'woocommerce' ), + 'CL-LR' => __( 'Los Ríos', 'woocommerce' ), + 'CL-MA' => __( 'Magallanes', 'woocommerce' ), + 'CL-ML' => __( 'Maule', 'woocommerce' ), + 'CL-NB' => __( 'Ñuble', 'woocommerce' ), + 'CL-RM' => __( 'Región Metropolitana de Santiago', 'woocommerce' ), + 'CL-TA' => __( 'Tarapacá', 'woocommerce' ), + 'CL-VS' => __( 'Valparaíso', 'woocommerce' ), + ), 'CN' => array( // Chinese states. 'CN1' => __( 'Yunnan / 云南', 'woocommerce' ), 'CN2' => __( 'Beijing / 北京', 'woocommerce' ), @@ -534,7 +552,7 @@ return array( 'SO' => __( 'Sololá', 'woocommerce' ), 'SU' => __( 'Suchitepéquez', 'woocommerce' ), 'TO' => __( 'Totonicapán', 'woocommerce' ), - 'ZA' => __( 'Zacapa', 'woocommerce' ) + 'ZA' => __( 'Zacapa', 'woocommerce' ), ), 'HK' => array( // Hong Kong states. 'HONG KONG' => __( 'Hong Kong Island', 'woocommerce' ), @@ -1818,7 +1836,7 @@ return array( 'AE' => __( 'Armed Forces (AE)', 'woocommerce' ), 'AP' => __( 'Armed Forces (AP)', 'woocommerce' ), ), - 'VE' => array( // Venezuela States. Ref: https://github.com/unicode-org/cldr/blob/release-38-1/common/subdivisions/en.xml#L5426-L5451 + 'VE' => array( // Venezuela States. 'A' => __( 'Capital', 'woocommerce' ), 'B' => __( 'Anzoátegui', 'woocommerce' ), 'C' => __( 'Apure', 'woocommerce' ), @@ -1843,7 +1861,7 @@ return array( 'W' => __( 'Federal Dependencies', 'woocommerce' ), 'X' => __( 'Vargas', 'woocommerce' ), 'Y' => __( 'Delta Amacuro', 'woocommerce' ), - 'Z' => __( 'Amazonas', 'woocommerce' ) + 'Z' => __( 'Amazonas', 'woocommerce' ), ), 'VN' => array(), 'YT' => array(), diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-data.php b/plugins/woocommerce/includes/abstracts/abstract-wc-data.php index 9c436791cf3..da4131116b1 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-data.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-data.php @@ -590,14 +590,14 @@ abstract class WC_Data { if ( ! $force_read ) { if ( ! empty( $this->cache_group ) ) { $cached_meta = wp_cache_get( $cache_key, $this->cache_group ); - $cache_loaded = ! empty( $cached_meta ); + $cache_loaded = is_array( $cached_meta ); } } // We filter the raw meta data again when loading from cache, in case we cached in an earlier version where filter conditions were different. $raw_meta_data = $cache_loaded ? $this->data_store->filter_raw_meta_data( $this, $cached_meta ) : $this->data_store->read_meta( $this ); - if ( $raw_meta_data ) { + if ( is_array( $raw_meta_data ) ) { foreach ( $raw_meta_data as $meta ) { $this->meta_data[] = new WC_Meta_Data( array( diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php index 31942a57d35..ce04a4c8786 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php @@ -1166,7 +1166,12 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order { $used_by = $this->get_billing_email(); } - $coupon->increase_usage_count( $used_by ); + $order_data_store = $this->get_data_store(); + if ( $order_data_store->get_recorded_coupon_usage_counts( $this ) ) { + $coupon->increase_usage_count( $used_by ); + } + + wc_update_coupon_usage_counts( $this->get_id() ); return true; } diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-addons.php b/plugins/woocommerce/includes/admin/class-wc-admin-addons.php index 6747fbabe92..a018b96272f 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-addons.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-addons.php @@ -26,7 +26,7 @@ class WC_Admin_Addons { * @return array of objects */ public static function get_featured() { - $featured = get_transient( 'wc_addons_featured' ); + $featured = get_transient( 'wc_addons_featured_2' ); if ( false === $featured ) { $headers = array(); $auth = WC_Helper_Options::get( 'auth' ); @@ -46,7 +46,7 @@ class WC_Admin_Addons { if ( ! is_wp_error( $raw_featured ) ) { $featured = json_decode( wp_remote_retrieve_body( $raw_featured ) ); if ( $featured ) { - set_transient( 'wc_addons_featured', $featured, DAY_IN_SECONDS ); + set_transient( 'wc_addons_featured_2', $featured, DAY_IN_SECONDS ); } } } @@ -758,7 +758,7 @@ class WC_Admin_Addons { $product_list_classes = 'products addons-products-' . $product_list_classes; ?>
-

title ); ?>

+

title ); ?>

description ) ) : ?>
@@ -891,6 +891,7 @@ class WC_Admin_Addons { * Output HTML for a promotion action. * * @param array $action Array of action properties. + * * @return void */ public static function output_promotion_action( array $action ) { @@ -1056,7 +1057,7 @@ class WC_Admin_Addons { if ( $rating >= $index ) { // Rating more that current star to show. return 'fill'; - } else if ( + } elseif ( abs( $index - 1 - floor( $rating ) ) < 0.0000001 && 0 < ( $rating - floor( $rating ) ) ) { @@ -1160,28 +1161,34 @@ class WC_Admin_Addons { // For product-related banners icon is a product's image. $mapped->icon = $data->image ?? null; } + // URL. $mapped->url = $data->link ?? null; if ( empty( $mapped->url ) ) { $mapped->url = $data->url ?? null; } + // Title. $mapped->title = $data->title ?? null; + // Vendor Name. $mapped->vendor_name = $data->vendor_name ?? null; if ( empty( $mapped->vendor_name ) ) { $mapped->vendor_name = $data->vendorName ?? null; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase } + // Vendor URL. $mapped->vendor_url = $data->vendor_url ?? null; if ( empty( $mapped->vendor_url ) ) { $mapped->vendor_url = $data->vendorUrl ?? null; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase } + // Description. $mapped->description = $data->excerpt ?? null; if ( empty( $mapped->description ) ) { $mapped->description = $data->description ?? null; } + $has_currency = ! empty( $data->currency ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase // Is Free. @@ -1190,22 +1197,37 @@ class WC_Admin_Addons { } else { $mapped->is_free = '$0.00' === $data->price; } + // Price. if ( $has_currency ) { $mapped->price = wc_price( $data->price, array( 'currency' => $data->currency ) ); } else { $mapped->price = $data->price; } + + // Price suffix, e.g. "per month". + $mapped->price_suffix = $data->price_suffix ?? null; + // Rating. $mapped->rating = $data->rating ?? null; if ( null === $mapped->rating ) { $mapped->rating = $data->averageRating ?? null; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase } + // Reviews Count. $mapped->reviews_count = $data->reviews_count ?? null; if ( null === $mapped->reviews_count ) { $mapped->reviews_count = $data->reviewsCount ?? null; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase } + // Featured & Promoted product card. + // Label. + $mapped->label = $data->label ?? null; + // Primary color. + $mapped->primary_color = $data->primary_color ?? null; + // Text color. + $mapped->text_color = $data->text_color ?? null; + // Button text. + $mapped->button = $data->button ?? null; return $mapped; } @@ -1234,25 +1256,69 @@ class WC_Admin_Addons { if ( 'banner' === $block_type ) { $product_details_classes .= ' addon-product-banner-details'; } - ?> + + if ( isset( $mapped->label ) && 'promoted' === $mapped->label ) { + $product_details_classes .= ' promoted'; + } elseif ( isset( $mapped->label ) && 'featured' === $mapped->label ) { + $product_details_classes .= ' featured'; + } + + if ( 'promoted' === $mapped->label + && ! empty( $mapped->primary_color ) + && ! empty( $mapped->text_color ) + && ! empty( $mapped->button ) ) { + // Promoted product card. + ?> +
  • +
    + + +

    title ); ?>

    +
    +

    description ); ?>

    +
    + +
  • +
  • + label ) && 'featured' === $mapped->label ) { ?> + +

    title ); ?>

    vendor_name ) && ! empty( $mapped->vendor_url ) ) : ?>
    %2$s', - esc_url_raw( $mapped->vendor_url ), - esc_html( $mapped->vendor_name ) - ) - ); + $vendor_url = add_query_arg( + array( + 'utm_source' => 'extensionsscreen', + 'utm_medium' => 'product', + 'utm_campaign' => 'wcaddons', + 'utm_content' => 'devpartner', + ), + $mapped->vendor_url + ); + + printf( + /* translators: %s vendor link */ + esc_html__( 'Developed by %s', 'woocommerce' ), + sprintf( + '%2$s', + esc_url_raw( $vendor_url ), + esc_html( $mapped->vendor_name ) + ) + ); ?>
    @@ -1284,7 +1350,15 @@ class WC_Admin_Addons { ); ?> - + + price_suffix ) ) { + $price_suffix = $mapped->price_suffix; + } + echo esc_html( $price_suffix ); + ?> +
    reviews_count ) && ! empty( $mapped->rating ) ) : ?> @@ -1303,6 +1377,7 @@ class WC_Admin_Addons {
  • - Menus > Pages. add_action( 'admin_head-nav-menus.php', array( $this, 'add_nav_menu_meta_boxes' ) ); @@ -151,9 +149,8 @@ class WC_Admin_Menus { public function addons_menu() { $count_html = WC_Helper_Updater::get_updates_count_html(); /* translators: %s: extensions count */ - $menu_title = sprintf( __( 'My Subscriptions %s', 'woocommerce' ), $count_html ); - add_submenu_page( 'woocommerce', __( 'WooCommerce Marketplace', 'woocommerce' ), __( 'Marketplace', 'woocommerce' ), 'manage_woocommerce', 'wc-addons', array( $this, 'addons_page' ) ); - add_submenu_page( 'woocommerce', __( 'My WooCommerce.com Subscriptions', 'woocommerce' ), $menu_title, 'manage_woocommerce', 'wc-addons§ion=helper', array( $this, 'addons_page' ) ); + $menu_title = sprintf( __( 'Extensions %s', 'woocommerce' ), $count_html ); + add_submenu_page( 'woocommerce', __( 'WooCommerce extensions', 'woocommerce' ), $menu_title, 'manage_woocommerce', 'wc-addons', array( $this, 'addons_page' ) ); } /** @@ -391,38 +388,6 @@ class WC_Admin_Menus { ); } - /** - * Highlight the My Subscriptions menu item when on that page - * - * @param string $submenu_file The submenu file. - * @param string $parent_file currently opened page. - * - * @return string - */ - public function update_menu_highlight( $submenu_file, $parent_file ) { - if ( 'woocommerce' === $parent_file && isset( $_GET['section'] ) && 'helper' === $_GET['section'] ) { - $submenu_file = 'wc-addons§ion=helper'; - } - return $submenu_file; - } - - /** - * Update the My Subscriptions document title when on that page. - * We want to maintain existing page URL but add it as a separate page, - * which requires updating it manually. - * - * @param string $admin_title existing page title. - * @return string - */ - public function update_my_subscriptions_title( $admin_title ) { - if ( - isset( $_GET['page'] ) && 'wc-addons' === $_GET['page'] && - isset( $_GET['section'] ) && 'helper' === $_GET['section'] - ) { - $admin_title = 'My WooCommerce.com Subscriptions'; - } - return $admin_title; - } } return new WC_Admin_Menus(); diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-notices.php b/plugins/woocommerce/includes/admin/class-wc-admin-notices.php index b543c698472..1e8a10ee15f 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-notices.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-notices.php @@ -51,7 +51,7 @@ class WC_Admin_Notices { add_action( 'switch_theme', array( __CLASS__, 'reset_admin_notices' ) ); add_action( 'woocommerce_installed', array( __CLASS__, 'reset_admin_notices' ) ); add_action( 'wp_loaded', array( __CLASS__, 'add_redirect_download_method_notice' ) ); - add_action( 'wp_loaded', array( __CLASS__, 'hide_notices' ) ); + add_action( 'admin_init', array( __CLASS__, 'hide_notices' ), 20 ); // @TODO: This prevents Action Scheduler async jobs from storing empty list of notices during WC installation. // That could lead to OBW not starting and 'Run setup wizard' notice not appearing in WP admin, which we want // to avoid. diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-setup-wizard.php b/plugins/woocommerce/includes/admin/class-wc-admin-setup-wizard.php index 255776aa251..1b03e352a9c 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-setup-wizard.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-setup-wizard.php @@ -111,7 +111,7 @@ class WC_Admin_Setup_Wizard { $country_code = WC()->countries->get_base_country(); // https://developers.taxjar.com/api/reference/#countries . $tax_supported_countries = array_merge( - array( 'US', 'CA', 'AU' ), + array( 'US', 'CA', 'AU', 'GB' ), WC()->countries->get_european_union_countries() ); diff --git a/plugins/woocommerce/includes/admin/helper/views/html-main.php b/plugins/woocommerce/includes/admin/helper/views/html-main.php index f4461cb8daa..7aa6a8fba41 100644 --- a/plugins/woocommerce/includes/admin/helper/views/html-main.php +++ b/plugins/woocommerce/includes/admin/helper/views/html-main.php @@ -9,7 +9,8 @@
    -

    + +

    diff --git a/plugins/woocommerce/includes/admin/helper/views/html-oauth-start.php b/plugins/woocommerce/includes/admin/helper/views/html-oauth-start.php index cf68c04f297..e1a14a93d01 100644 --- a/plugins/woocommerce/includes/admin/helper/views/html-oauth-start.php +++ b/plugins/woocommerce/includes/admin/helper/views/html-oauth-start.php @@ -10,6 +10,7 @@ defined( 'ABSPATH' ) || exit(); ?>
    +

    diff --git a/plugins/woocommerce/includes/admin/helper/views/html-section-nav.php b/plugins/woocommerce/includes/admin/helper/views/html-section-nav.php index 1ce756576e2..5fa3d9b9d59 100644 --- a/plugins/woocommerce/includes/admin/helper/views/html-section-nav.php +++ b/plugins/woocommerce/includes/admin/helper/views/html-section-nav.php @@ -15,7 +15,7 @@ defined( 'ABSPATH' ) || exit(); ?> diff --git a/plugins/woocommerce/includes/admin/views/html-admin-page-addons-category-nav.php b/plugins/woocommerce/includes/admin/views/html-admin-page-addons-category-nav.php new file mode 100644 index 00000000000..a9afb1fdf6c --- /dev/null +++ b/plugins/woocommerce/includes/admin/views/html-admin-page-addons-category-nav.php @@ -0,0 +1,36 @@ + +
    +

    +
      + + slug && '_featured' !== $section->slug ) { + $current_section_name = $section->label; + } + ?> + slug ) : ?> +
    • + +
    • + + + label ); ?> + +
    • + +
    +
    +
    diff --git a/plugins/woocommerce/includes/admin/views/html-admin-page-addons.php b/plugins/woocommerce/includes/admin/views/html-admin-page-addons.php index fb3111640c4..807667d0766 100644 --- a/plugins/woocommerce/includes/admin/views/html-admin-page-addons.php +++ b/plugins/woocommerce/includes/admin/views/html-admin-page-addons.php @@ -6,6 +6,8 @@ * @var string $view * @var object $addons * @var object $promotions + * @var array $sections + * @var string $current_section */ use Automattic\WooCommerce\Admin\RemoteInboxNotifications as PromotionRuleEngine; @@ -39,31 +41,35 @@ $current_section_name = __( 'Browse Categories', 'woocommerce' );
    + + + +
    +

    @@ -112,8 +118,9 @@ $current_section_name = __( 'Browse Categories', 'woocommerce' ); continue; } } + + WC_Admin_Addons::render_product_card( $addon ); ?> - diff --git a/plugins/woocommerce/includes/class-wc-comments.php b/plugins/woocommerce/includes/class-wc-comments.php index f83c30b2b8f..4d3ae407269 100644 --- a/plugins/woocommerce/includes/class-wc-comments.php +++ b/plugins/woocommerce/includes/class-wc-comments.php @@ -46,6 +46,9 @@ class WC_Comments { // Support avatars for `review` comment type. add_filter( 'get_avatar_comment_types', array( __CLASS__, 'add_avatar_for_review_comment_type' ) ); + // Add Product Reviews filter for `review` comment type. + add_filter( 'admin_comment_types_dropdown', array( __CLASS__, 'add_review_comment_filter' ) ); + // Review of verified purchase. add_action( 'comment_post', array( __CLASS__, 'add_comment_purchase_verification' ) ); @@ -293,6 +296,20 @@ class WC_Comments { return array_merge( $comment_types, array( 'review' ) ); } + /** + * Add Product Reviews filter for `review` comment type. + * + * @since 6.0.0 + * + * @param array $comment_types Array of comment type labels keyed by their name. + * + * @return array + */ + public static function add_review_comment_filter( array $comment_types ): array { + $comment_types['review'] = __( 'Product Reviews', 'woocommerce' ); + return $comment_types; + } + /** * Determine if a review is from a verified owner at submission. * diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 7ca6258a00a..29481568841 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -299,14 +299,14 @@ class WC_Post_Types { $shop_page_id = wc_get_page_id( 'shop' ); - if ( current_theme_supports( 'woocommerce' ) ) { + if ( wc_current_theme_supports_woocommerce_or_fse() ) { $has_archive = $shop_page_id && get_post( $shop_page_id ) ? urldecode( get_page_uri( $shop_page_id ) ) : 'shop'; } else { $has_archive = false; } // If theme support changes, we may need to flush permalinks since some are changed based on this flag. - $theme_support = current_theme_supports( 'woocommerce' ) ? 'yes' : 'no'; + $theme_support = wc_current_theme_supports_woocommerce_or_fse() ? 'yes' : 'no'; if ( get_option( 'current_theme_supports_woocommerce' ) !== $theme_support && update_option( 'current_theme_supports_woocommerce', $theme_support ) ) { update_option( 'woocommerce_queue_flush_rewrite_rules', 'yes' ); } diff --git a/plugins/woocommerce/includes/class-wc-template-loader.php b/plugins/woocommerce/includes/class-wc-template-loader.php index 2adec2db212..d8c1182c931 100644 --- a/plugins/woocommerce/includes/class-wc-template-loader.php +++ b/plugins/woocommerce/includes/class-wc-template-loader.php @@ -37,13 +37,18 @@ class WC_Template_Loader { * Hook in methods. */ public static function init() { - self::$theme_support = current_theme_supports( 'woocommerce' ); + self::$theme_support = wc_current_theme_supports_woocommerce_or_fse(); self::$shop_page_id = wc_get_page_id( 'shop' ); // Supported themes. if ( self::$theme_support ) { add_filter( 'template_include', array( __CLASS__, 'template_loader' ) ); add_filter( 'comments_template', array( __CLASS__, 'comments_template_loader' ) ); + + // Loads gallery scripts on Product page for FSE themes. + if ( wc_current_theme_is_fse_theme() ) { + self::add_support_for_product_page_gallery(); + } } else { // Unsupported themes. add_action( 'template_redirect', array( __CLASS__, 'unsupported_theme_init' ) ); @@ -292,6 +297,15 @@ class WC_Template_Loader { add_filter( 'woocommerce_product_tabs', array( __CLASS__, 'unsupported_theme_remove_review_tab' ) ); remove_action( 'woocommerce_before_main_content', 'woocommerce_output_content_wrapper', 10 ); remove_action( 'woocommerce_after_main_content', 'woocommerce_output_content_wrapper_end', 10 ); + self::add_support_for_product_page_gallery(); + } + + /** + * Add theme support for Product page gallery. + * + * @since x.x.x + */ + private static function add_support_for_product_page_gallery() { add_theme_support( 'wc-product-gallery-zoom' ); add_theme_support( 'wc-product-gallery-lightbox' ); add_theme_support( 'wc-product-gallery-slider' ); diff --git a/plugins/woocommerce/includes/emails/class-wc-email-customer-on-hold-order.php b/plugins/woocommerce/includes/emails/class-wc-email-customer-on-hold-order.php index 080abb92395..8be3f17c09d 100644 --- a/plugins/woocommerce/includes/emails/class-wc-email-customer-on-hold-order.php +++ b/plugins/woocommerce/includes/emails/class-wc-email-customer-on-hold-order.php @@ -30,7 +30,7 @@ if ( ! class_exists( 'WC_Email_Customer_On_Hold_Order', false ) ) : $this->id = 'customer_on_hold_order'; $this->customer_email = true; $this->title = __( 'Order on-hold', 'woocommerce' ); - $this->description = __( 'This is an order notification sent to customers containing order details after an order is placed on-hold.', 'woocommerce' ); + $this->description = __( 'This is an order notification sent to customers containing order details after an order is placed on-hold from Pending, Cancelled or Failed order status.', 'woocommerce' ); $this->template_html = 'emails/customer-on-hold-order.php'; $this->template_plain = 'emails/plain/customer-on-hold-order.php'; $this->placeholders = array( diff --git a/plugins/woocommerce/includes/wc-attribute-functions.php b/plugins/woocommerce/includes/wc-attribute-functions.php index 535a719f1b8..e720d93a94d 100644 --- a/plugins/woocommerce/includes/wc-attribute-functions.php +++ b/plugins/woocommerce/includes/wc-attribute-functions.php @@ -95,7 +95,7 @@ function wc_get_attribute_taxonomy_ids() { $cache_key = $prefix . 'ids'; $cache_value = wp_cache_get( $cache_key, 'woocommerce-attributes' ); - if ( $cache_value ) { + if ( false !== $cache_value ) { return $cache_value; } @@ -117,7 +117,7 @@ function wc_get_attribute_taxonomy_labels() { $cache_key = $prefix . 'labels'; $cache_value = wp_cache_get( $cache_key, 'woocommerce-attributes' ); - if ( $cache_value ) { + if ( false !== $cache_value ) { return $cache_value; } @@ -722,7 +722,7 @@ function wc_attribute_taxonomy_slug( $attribute_name ) { $cache_key = $prefix . 'slug-' . $attribute_name; $cache_value = wp_cache_get( $cache_key, 'woocommerce-attributes' ); - if ( $cache_value ) { + if ( false !== $cache_value ) { return $cache_value; } diff --git a/plugins/woocommerce/includes/wc-conditional-functions.php b/plugins/woocommerce/includes/wc-conditional-functions.php index 641066cb657..bdebe59dc48 100644 --- a/plugins/woocommerce/includes/wc-conditional-functions.php +++ b/plugins/woocommerce/includes/wc-conditional-functions.php @@ -494,3 +494,28 @@ function wc_is_file_valid_csv( $file, $check_path = true ) { return false; } + +/** + * Check if the current theme is an FSE theme. + * + * @since x.x.x + * @return bool + */ +function wc_current_theme_is_fse_theme() { + if ( function_exists( 'gutenberg_is_fse_theme' ) ) { + return (bool) gutenberg_is_fse_theme(); + } + + return false; +} + +/** + * Check if the current theme has WooCommerce support or is a FSE theme. + * + * @since x.x.x + * @return bool + */ +function wc_current_theme_supports_woocommerce_or_fse() { + return (bool) current_theme_supports( 'woocommerce' ) || wc_current_theme_is_fse_theme(); +} + diff --git a/plugins/woocommerce/includes/wc-template-functions.php b/plugins/woocommerce/includes/wc-template-functions.php index 4f843072bb6..bbf1a556f42 100644 --- a/plugins/woocommerce/includes/wc-template-functions.php +++ b/plugins/woocommerce/includes/wc-template-functions.php @@ -1773,6 +1773,9 @@ if ( ! function_exists( 'woocommerce_quantity_input' ) ) { 'inputmode' => apply_filters( 'woocommerce_quantity_input_inputmode', has_filter( 'woocommerce_stock_amount', 'intval' ) ? 'numeric' : '' ), 'product_name' => $product ? $product->get_title() : '', 'placeholder' => apply_filters( 'woocommerce_quantity_input_placeholder', '', $product ), + // When autocomplete is enabled in firefox, it will overwrite actual value with what user entered last. So we default to off. + // See @link https://github.com/woocommerce/woocommerce/issues/30733. + 'autocomplete' => apply_filters( 'woocommerce_quantity_input_autocomplete', 'off', $product ), ); $args = apply_filters( 'woocommerce_quantity_input_args', wp_parse_args( $args, $defaults ), $product ); diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index aec725fc788..e21e1c15527 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -13,9 +13,7 @@ "wp_org_slug": "woocommerce" }, "scripts": { - "check:subset-installed": "pnpm list --depth 1 install-subset > /dev/null 2>&1", - "install:subset-only": "pnpm install --no-package-lock --no-save install-subset", - "install:no-e2e": "pnpm run check:subset-installed --silent || pnpm run install:subset-only && pnpx install-subset i no-e2e", + "preinstall": "npx only-allow pnpm", "build": "./bin/build-zip.sh", "build:core": "grunt && pnpm run makepot", "build-watch": "grunt watch", @@ -125,17 +123,5 @@ "> 0.1%", "ie 8", "ie 9" - ], - "subsets": { - "no-e2e": { - "exclude": [ - "@woocommerce/api", - "@woocommerce/api-core-tests", - "@woocommerce/e2e-core-tests", - "@woocommerce/e2e-environment", - "@woocommerce/e2e-utils", - "@wordpress/e2e-test-utils" - ] - } - } + ] } diff --git a/plugins/woocommerce/project.json b/plugins/woocommerce/project.json new file mode 100644 index 00000000000..9d4ff113f6d --- /dev/null +++ b/plugins/woocommerce/project.json @@ -0,0 +1,150 @@ +{ + "root": "plugins/woocommerce/", + "sourceRoot": "plugins/woocommerce", + "projectType": "application", + "targets": { + "composer-install": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "command": "composer install", + "cwd": "plugins/woocommerce" + } + }, + "composer-install-no-dev": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "command": "composer install --no-dev", + "cwd": "plugins/woocommerce" + } + }, + "composer-dump-autoload": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "command": "composer dump-autoload", + "cwd": "plugins/woocommerce" + } + }, + "build": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build" + } + }, + "build-core": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build:core" + } + }, + "build-zip": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build:zip" + } + }, + "build-watch": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build-watch" + } + }, + "build-assets": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "build:assets" + } + }, + "lint-js": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "lint:js" + } + }, + "docker-up": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:up" + } + }, + "docker-down": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:down" + } + }, + "docker-ssh": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "docker:ssh" + } + }, + "test-api": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:api" + } + }, + "test-e2e": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:e2e" + } + }, + "test-e2e-debug": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:e2e-debug" + } + }, + "test-e2e-dev": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:e2e-dev" + } + }, + "test-unit": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "test:unit" + } + }, + "makepot": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "makepot" + } + }, + "packages-fix-text-domain": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "packages:fix:textdomain" + } + }, + "git-update-hooks": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "git:update-hooks" + } + }, + "make-collection": { + "executor": "@nrwl/workspace:run-script", + "options": { + "script": "make:collection" + } + }, + "install-unit-test-db": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "command": "bash tests/bin/install.sh woo_test root root 127.0.0.1 latest", + "cwd": "plugins/woocommerce" + } + }, + "test-code-coverage": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "command": "RUN_CODE_COVERAGE=1 bash tests/bin/phpunit.sh", + "cwd": "plugins/woocommerce" + } + } + } +} diff --git a/plugins/woocommerce/src/Internal/ProductAttributesLookup/DataRegenerator.php b/plugins/woocommerce/src/Internal/ProductAttributesLookup/DataRegenerator.php index ec82a9cd47a..5f06e5298fb 100644 --- a/plugins/woocommerce/src/Internal/ProductAttributesLookup/DataRegenerator.php +++ b/plugins/woocommerce/src/Internal/ProductAttributesLookup/DataRegenerator.php @@ -255,10 +255,6 @@ CREATE TABLE ' . $this->lookup_table_name . '( * @return array The tools array with the entry added. */ private function add_initiate_regeneration_entry_to_tools_array( array $tools_array ) { - if ( ! $this->data_store->is_feature_visible() ) { - return $tools_array; - } - $lookup_table_exists = $this->data_store->check_lookup_table_exists(); $generation_is_in_progress = $this->data_store->regeneration_is_in_progress(); @@ -375,9 +371,6 @@ CREATE TABLE ' . $this->lookup_table_name . '( * @throws \Exception Something prevents the regeneration from starting. */ private function check_can_do_lookup_table_regeneration( $product_id = null ) { - if ( ! $this->data_store->is_feature_visible() ) { - throw new \Exception( "Can't do product attribute lookup data regeneration: feature is not visible" ); - } if ( $product_id && ! $this->data_store->check_lookup_table_exists() ) { throw new \Exception( "Can't do product attribute lookup data regeneration: lookup table doesn't exist" ); } diff --git a/plugins/woocommerce/src/Internal/ProductAttributesLookup/Filterer.php b/plugins/woocommerce/src/Internal/ProductAttributesLookup/Filterer.php index 132d31fc65c..a4d6f97850b 100644 --- a/plugins/woocommerce/src/Internal/ProductAttributesLookup/Filterer.php +++ b/plugins/woocommerce/src/Internal/ProductAttributesLookup/Filterer.php @@ -63,13 +63,17 @@ class Filterer { return $args; } - $clause_root = " {$wpdb->prefix}posts.ID IN ("; + // The extra derived table ("SELECT product_or_parent_id FROM") is needed for performance + // (causes the filtering subquery to be executed only once). + $clause_root = " {$wpdb->posts}.ID IN ( SELECT product_or_parent_id FROM ("; if ( 'yes' === get_option( 'woocommerce_hide_out_of_stock_items' ) ) { $in_stock_clause = ' AND in_stock = 1'; } else { $in_stock_clause = ''; } + $attribute_ids_for_and_filtering = array(); + foreach ( $attributes_to_filter_by as $taxonomy => $data ) { $all_terms = get_terms( $taxonomy, array( 'hide_empty' => false ) ); $term_ids_by_slug = wp_list_pluck( $all_terms, 'term_id', 'slug' ); @@ -79,24 +83,10 @@ class Filterer { $is_and_query = 'and' === $data['query_type']; $count = count( $term_ids_to_filter_by ); + if ( 0 !== $count ) { - if ( $is_and_query ) { - $clauses[] = " - {$clause_root} - SELECT product_or_parent_id - FROM {$this->lookup_table_name} lt - WHERE is_variation_attribute=0 - {$in_stock_clause} - AND term_id in {$term_ids_to_filter_by_list} - GROUP BY product_id - HAVING COUNT(product_id)={$count} - UNION - SELECT product_or_parent_id - FROM {$this->lookup_table_name} lt - WHERE is_variation_attribute=1 - {$in_stock_clause} - AND term_id in {$term_ids_to_filter_by_list} - )"; + if ( $is_and_query && $count > 1 ) { + $attribute_ids_for_and_filtering = array_merge( $attribute_ids_for_and_filtering, $term_ids_to_filter_by ); } else { $clauses[] = " {$clause_root} @@ -109,8 +99,30 @@ class Filterer { } } + if ( ! empty( $attribute_ids_for_and_filtering ) ) { + $count = count( $attribute_ids_for_and_filtering ); + $term_ids_to_filter_by_list = '(' . join( ',', $attribute_ids_for_and_filtering ) . ')'; + $clauses[] = " + {$clause_root} + SELECT product_or_parent_id + FROM {$this->lookup_table_name} lt + WHERE is_variation_attribute=0 + {$in_stock_clause} + AND term_id in {$term_ids_to_filter_by_list} + GROUP BY product_id + HAVING COUNT(product_id)={$count} + UNION + SELECT product_or_parent_id + FROM {$this->lookup_table_name} lt + WHERE is_variation_attribute=1 + {$in_stock_clause} + AND term_id in {$term_ids_to_filter_by_list} + )"; + } + if ( ! empty( $clauses ) ) { - $args['where'] .= ' AND (' . join( ' AND ', $clauses ) . ')'; + // "temp" is needed because the extra derived tables require an alias. + $args['where'] .= ' AND (' . join( ' temp ) AND ', $clauses ) . ' temp ))'; } elseif ( ! empty( $attributes_to_filter_by ) ) { $args['where'] .= ' AND 1=0'; } @@ -228,10 +240,12 @@ class Filterer { } if ( ! empty( $and_term_ids ) ) { - $terms_count = count( $and_term_ids ); - $term_ids_list = '(' . join( ',', $and_term_ids ) . ')'; + $terms_count = count( $and_term_ids ); + $term_ids_list = '(' . join( ',', $and_term_ids ) . ')'; + // The extra derived table ("SELECT product_or_parent_id FROM") is needed for performance + // (causes the filtering subquery to be executed only once). $query['where'] .= " - AND product_or_parent_id IN ( + AND product_or_parent_id IN ( SELECT product_or_parent_id FROM ( SELECT product_or_parent_id FROM {$this->lookup_table_name} lt WHERE is_variation_attribute=0 @@ -245,17 +259,17 @@ class Filterer { WHERE is_variation_attribute=1 {$in_stock_clause} AND term_id in {$term_ids_list} - )"; + ) temp )"; } if ( ! empty( $or_term_ids ) ) { $term_ids_list = '(' . join( ',', $or_term_ids ) . ')'; $query['where'] .= " - AND product_or_parent_id IN ( + AND product_or_parent_id IN ( SELECT product_or_parent_id FROM ( SELECT product_or_parent_id FROM {$this->lookup_table_name} WHERE term_id in {$term_ids_list} {$in_stock_clause} - )"; + ) temp )"; } } else { diff --git a/plugins/woocommerce/src/Internal/ProductAttributesLookup/LookupDataStore.php b/plugins/woocommerce/src/Internal/ProductAttributesLookup/LookupDataStore.php index 377eb28ee5a..a357e5a2590 100644 --- a/plugins/woocommerce/src/Internal/ProductAttributesLookup/LookupDataStore.php +++ b/plugins/woocommerce/src/Internal/ProductAttributesLookup/LookupDataStore.php @@ -30,13 +30,6 @@ class LookupDataStore { */ private $lookup_table_name; - /** - * Is the feature visible? - * - * @var bool - */ - private $is_feature_visible; - /** * LookupDataStore constructor. Makes the feature hidden by default. */ @@ -44,7 +37,6 @@ class LookupDataStore { global $wpdb; $this->lookup_table_name = $wpdb->prefix . 'wc_product_attributes_lookup'; - $this->is_feature_visible = false; $this->init_hooks(); } @@ -65,7 +57,7 @@ class LookupDataStore { add_filter( 'woocommerce_get_sections_products', function ( $products ) { - if ( $this->is_feature_visible() && $this->check_lookup_table_exists() ) { + if ( $this->check_lookup_table_exists() ) { $products['advanced'] = __( 'Advanced', 'woocommerce' ); } return $products; @@ -77,7 +69,7 @@ class LookupDataStore { add_filter( 'woocommerce_get_settings_products', function ( $settings, $section_id ) { - if ( 'advanced' === $section_id && $this->is_feature_visible() && $this->check_lookup_table_exists() ) { + if ( 'advanced' === $section_id && $this->check_lookup_table_exists() ) { $title_item = array( 'title' => __( 'Product attributes lookup table', 'woocommerce' ), 'type' => 'title', @@ -136,29 +128,6 @@ class LookupDataStore { return $this->lookup_table_name === $wpdb->get_var( $query ); } - /** - * Checks if the feature is visible (so that dedicated entries will be added to the debug tools page). - * - * @return bool True if the feature is visible. - */ - public function is_feature_visible() { - return $this->is_feature_visible; - } - - /** - * Makes the feature visible, so that dedicated entries will be added to the debug tools page. - */ - public function show_feature() { - $this->is_feature_visible = true; - } - - /** - * Hides the feature, so that no entries will be added to the debug tools page. - */ - public function hide_feature() { - $this->is_feature_visible = false; - } - /** * Get the name of the lookup table. * diff --git a/plugins/woocommerce/templates/global/quantity-input.php b/plugins/woocommerce/templates/global/quantity-input.php index 172fc858e6c..2d304fafa70 100644 --- a/plugins/woocommerce/templates/global/quantity-input.php +++ b/plugins/woocommerce/templates/global/quantity-input.php @@ -42,7 +42,9 @@ if ( $max_value && $min_value === $max_value ) { title="" size="4" placeholder="" - inputmode="" /> + inputmode="" + autocomplete="" + />

    /refunds', - responseCode: 201, - refund: async ( orderId, refundDetails ) => - postRequest( `orders/${ orderId }/refunds`, refundDetails ), - }, - retrieve: { - name: 'Retrieve a refund', - method: 'GET', - path: 'orders//refunds/', - responseCode: 200, - refund: async ( orderId, refundId ) => - getRequest( `orders/${ orderId }/refunds/${ refundId }` ), - }, - listAll: { - name: 'List all refunds', - method: 'GET', - path: 'orders//refunds', - responseCode: 200, - refunds: async ( orderId ) => - getRequest( `orders/${ orderId }/refunds` ), - }, - delete: { - name: 'Delete a refund', - method: 'DELETE', - path: 'orders//refunds/', - responseCode: 200, - payload: { - force: false, - }, - refund: async ( orderId, refundId, deletePermanently ) => - deleteRequest( - `orders/${ orderId }/refunds/${ refundId }`, - deletePermanently - ), - }, -}; - -module.exports = { - refundsApi: refundsApi, -}; diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/tests/refunds/refunds.test.js b/plugins/woocommerce/tests/e2e/api-core-tests/tests/refunds/refunds.test.js deleted file mode 100644 index b39bbb34ff4..00000000000 --- a/plugins/woocommerce/tests/e2e/api-core-tests/tests/refunds/refunds.test.js +++ /dev/null @@ -1,122 +0,0 @@ -const { refundsApi } = require( '../../endpoints/refunds' ); -const { ordersApi } = require( '../../endpoints/orders' ); -const { productsApi } = require( '../../endpoints/products' ); -const { refund } = require( '../../data' ); - -/** - * Tests for the WooCommerce Refunds API. - * - * @group api - * @group refunds - * - */ -describe( 'Refunds API tests', () => { - let expectedRefund; - let orderId; - let productId; - - beforeAll( async () => { - // Create a product and save its product ID - const product = { - name: 'Simple Product for Refunds API tests', - regular_price: '100', - }; - const createProductResponse = await productsApi.create.product( - product - ); - productId = createProductResponse.body.id; - - // Create an order with a product line item, and save its Order ID - const order = { - status: 'pending', - line_items: [ - { - product_id: productId, - }, - ], - }; - const createOrderResponse = await ordersApi.create.order( order ); - orderId = createOrderResponse.body.id; - - // Setup the expected refund object - expectedRefund = { - ...refund, - line_items: [ - { - product_id: productId, - }, - ], - }; - } ); - - afterAll( async () => { - // Cleanup the created product and order - await productsApi.delete.product( productId, true ); - await ordersApi.delete.order( orderId, true ); - } ); - - it( 'can create a refund', async () => { - const { status, body } = await refundsApi.create.refund( - orderId, - expectedRefund - ); - expect( status ).toEqual( refundsApi.create.responseCode ); - expect( body.id ).toBeDefined(); - - // Save the refund ID - expectedRefund.id = body.id; - - // Verify that the order was refunded. - const getOrderResponse = await ordersApi.retrieve.order( orderId ); - expect( getOrderResponse.body.refunds ).toHaveLength( 1 ); - expect( getOrderResponse.body.refunds[ 0 ].id ).toEqual( - expectedRefund.id - ); - expect( getOrderResponse.body.refunds[ 0 ].reason ).toEqual( - expectedRefund.reason - ); - expect( getOrderResponse.body.refunds[ 0 ].total ).toEqual( - `-${ expectedRefund.amount }` - ); - } ); - - it( 'can retrieve a refund', async () => { - const { status, body } = await refundsApi.retrieve.refund( - orderId, - expectedRefund.id - ); - - expect( status ).toEqual( refundsApi.retrieve.responseCode ); - expect( body.id ).toEqual( expectedRefund.id ); - } ); - - it( 'can list all refunds', async () => { - const { status, body } = await refundsApi.listAll.refunds( orderId ); - - expect( status ).toEqual( refundsApi.listAll.responseCode ); - expect( body ).toHaveLength( 1 ); - expect( body[ 0 ].id ).toEqual( expectedRefund.id ); - } ); - - it( 'can delete a refund', async () => { - const { status, body } = await refundsApi.delete.refund( - orderId, - expectedRefund.id, - true - ); - - expect( status ).toEqual( refundsApi.delete.responseCode ); - expect( body.id ).toEqual( expectedRefund.id ); - - // Verify that the refund cannot be retrieved - const retrieveRefundResponse = await refundsApi.retrieve.refund( - orderId, - expectedRefund.id - ); - expect( retrieveRefundResponse.status ).toEqual( 404 ); - - // Verify that the order no longer has a refund - const retrieveOrderResponse = await ordersApi.retrieve.order( orderId ); - expect( retrieveOrderResponse.body.refunds ).toHaveLength( 0 ); - } ); -} ); diff --git a/plugins/woocommerce/tests/e2e/docker/initialize.sh b/plugins/woocommerce/tests/e2e/docker/initialize.sh index 4d1e5b62746..7c0ab8f9991 100755 --- a/plugins/woocommerce/tests/e2e/docker/initialize.sh +++ b/plugins/woocommerce/tests/e2e/docker/initialize.sh @@ -2,7 +2,11 @@ echo "Initializing WooCommerce E2E" -wp plugin activate woocommerce +# This is a workaround to accommodate different directory names. +wp plugin activate --all +wp plugin deactivate akismet +wp plugin deactivate hello + wp theme install twentynineteen --activate wp user create customer customer@woocommercecoree2etestsuite.com \ --user_pass=password \ diff --git a/plugins/woocommerce/tests/legacy/bootstrap.php b/plugins/woocommerce/tests/legacy/bootstrap.php index 645d839d1e8..ef29235d8bd 100644 --- a/plugins/woocommerce/tests/legacy/bootstrap.php +++ b/plugins/woocommerce/tests/legacy/bootstrap.php @@ -71,7 +71,7 @@ class WC_Unit_Tests_Bootstrap { * Load PHPUnit Polyfills for the WP testing suite. * @see https://github.com/WordPress/wordpress-develop/pull/1563/ */ - define( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH', __DIR__ . '/../vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php' ); + define( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH', __DIR__ . '/../../vendor/yoast/phpunit-polyfills/phpunitpolyfills-autoload.php' ); // load the WP testing environment. require_once $this->wp_tests_dir . '/includes/bootstrap.php'; diff --git a/plugins/woocommerce/tests/legacy/unit-tests/util/api-functions.php b/plugins/woocommerce/tests/legacy/unit-tests/util/api-functions.php index 3fb98c57b12..7a6a64a64bb 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/util/api-functions.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/util/api-functions.php @@ -82,7 +82,8 @@ class WC_Tests_API_Functions extends WC_Unit_Test_Case { */ public function test_wc_rest_upload_image_from_url_should_return_error_when_invalid_image_is_passed() { // empty file. - if ( version_compare( get_bloginfo( 'version' ), '5.4-alpha', '>=' ) ) { + $wp_version = get_bloginfo( 'version' ); + if ( version_compare( $wp_version, '5.4-alpha', '>=' ) ) { $expected_error_message = 'Invalid image: File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini file or by post_max_size being defined as smaller than upload_max_filesize in php.ini.'; } else { $expected_error_message = 'Invalid image: File is empty. Please upload something more substantial. This error could also be caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini.'; @@ -93,7 +94,7 @@ class WC_Tests_API_Functions extends WC_Unit_Test_Case { $this->assertEquals( $expected_error_message, $result->get_error_message() ); // unsupported mime type. - $expected_error_message = 'Invalid image: Sorry, this file type is not permitted for security reasons.'; + $expected_error_message = version_compare( $wp_version, '5.9-alpha', '>=' ) ? 'Invalid image: Sorry, you are not allowed to upload this file type.' : 'Invalid image: Sorry, this file type is not permitted for security reasons.'; $result = wc_rest_upload_image_from_url( 'http://somedomain.com/invalid-image-2.png' ); $this->assertWPError( $result ); diff --git a/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-data-test.php b/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-data-test.php new file mode 100644 index 00000000000..1bf127d7ed1 --- /dev/null +++ b/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-data-test.php @@ -0,0 +1,75 @@ +getMockBuilder( WC_Object_Data_Store_Interface::class )->getMock(); + $data_store->expects( $this->once() ) + ->method( 'create' ) + ->with( + $this->isInstanceOf( WC_Data::class ) + ); + $data_store->expects( $this->once() ) + ->method( 'update' ) + ->with( + $this->isInstanceOf( WC_Data::class ) + ); + $data_store->expects( $this->once() ) + ->method( 'delete' ) + ->with( + $this->isInstanceOf( WC_Data::class ) + ); + + $data_object = new class( $data_store ) extends WC_Data { + public function __construct( $data_store ) { + $this->data_store = $data_store; + } + }; + $data_object->save(); + $data_object->set_id( 1 ); + $data_object->save(); + $data_object->delete(); + } + + /** + * Test that cache is used when reading meta data. + */ + public function test_meta_data_cache() { + $raw_meta_data = []; + $data_store = $this->getMockBuilder( WC_Data_Store_WP::class )->getMock(); + $data_store->expects( $this->once() ) + ->method( 'filter_raw_meta_data' ) + ->with( + $this->isInstanceOf( WC_Data::class ), + $raw_meta_data + ); + $data_store->expects( $this->once() ) + ->method( 'read_meta' ) + ->with( + $this->isInstanceOf( WC_Data::class ) + ) + ->willReturn( $raw_meta_data ); + + $data_object = new class( $data_store ) extends WC_Data { + protected $cache_group = 'object_name'; + public function __construct( $data_store ) { + $this->id = 1; + $this->data_store = $data_store; + } + }; + $meta_data = $data_object->get_meta_data(); + $this->assertEquals( [], $meta_data ); + $data_object->read_meta_data(); + } +} diff --git a/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-order-test.php b/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-order-test.php index be35d13756a..6be91389917 100644 --- a/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-order-test.php +++ b/plugins/woocommerce/tests/php/includes/abstracts/class-wc-abstract-order-test.php @@ -184,4 +184,66 @@ class WC_Abstract_Order_Test extends WC_Unit_Test_Case { $this->assertEquals( 1234, $order_item->passed_props['total'] ); $this->assertEquals( 1234, $order_item->passed_props['subtotal'] ); } + + /** + * Test get coupon usage count across statuses. + */ + public function test_apply_coupon_across_status() { + $coupon_code = 'coupon_test_count_across_status'; + $coupon = WC_Helper_Coupon::create_coupon( $coupon_code ); + $this->assertEquals( 0, $coupon->get_usage_count() ); + + $order = WC_Helper_Order::create_order(); + $order->set_status( 'pending' ); + $order->save(); + $order->apply_coupon( $coupon_code ); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code ) )->get_usage_count() ); + + // Change order status to anything other than cancelled should not change coupon count. + $order->set_status( 'processing' ); + $order->save(); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code ) )->get_usage_count() ); + + // Cancelling order should reduce coupon count. + $order->set_status( 'cancelled' ); + $order->save(); + $this->assertEquals( 0, ( new WC_Coupon( $coupon_code ) )->get_usage_count() ); + } + + /** + * Test get multiple coupon usage count across statuses. + */ + public function test_apply_coupon_multiple_across_status() { + $coupon_code_1 = 'coupon_test_count_across_status_1'; + $coupon_code_2 = 'coupon_test_count_across_status_2'; + $coupon_code_3 = 'coupon_test_count_across_status_3'; + WC_Helper_Coupon::create_coupon( $coupon_code_1 ); + WC_Helper_Coupon::create_coupon( $coupon_code_2 ); + WC_Helper_Coupon::create_coupon( $coupon_code_3 ); + + $order = WC_Helper_Order::create_order(); + $order->set_status( 'pending' ); + $order->save(); + $order->apply_coupon( $coupon_code_1 ); + $order->apply_coupon( $coupon_code_2 ); + $order->apply_coupon( $coupon_code_3 ); + + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code_1 ) )->get_usage_count() ); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code_2 ) )->get_usage_count() ); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code_3 ) )->get_usage_count() ); + + // Change order status to anything other than cancelled should not change coupon count. + $order->set_status( 'processing' ); + $order->save(); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code_1 ) )->get_usage_count() ); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code_2 ) )->get_usage_count() ); + $this->assertEquals( 1, ( new WC_Coupon( $coupon_code_3 ) )->get_usage_count() ); + + // Cancelling order should reduce coupon count. + $order->set_status( 'cancelled' ); + $order->save(); + $this->assertEquals( 0, ( new WC_Coupon( $coupon_code_1 ) )->get_usage_count() ); + $this->assertEquals( 0, ( new WC_Coupon( $coupon_code_2 ) )->get_usage_count() ); + $this->assertEquals( 0, ( new WC_Coupon( $coupon_code_3 ) )->get_usage_count() ); + } } diff --git a/tests/php/includes/class-wc-auth-test.php b/plugins/woocommerce/tests/php/includes/class-wc-auth-test.php similarity index 100% rename from tests/php/includes/class-wc-auth-test.php rename to plugins/woocommerce/tests/php/includes/class-wc-auth-test.php diff --git a/plugins/woocommerce/tests/php/includes/wc-attribute-functions-test.php b/plugins/woocommerce/tests/php/includes/wc-attribute-functions-test.php new file mode 100644 index 00000000000..d324ae59581 --- /dev/null +++ b/plugins/woocommerce/tests/php/includes/wc-attribute-functions-test.php @@ -0,0 +1,125 @@ +filter_recorder = $this->any(); + + $filter_mock = $this->getMockBuilder( stdClass::class ) + ->setMethods( [ '__invoke' ] ) + ->getMock(); + $filter_mock->expects( $this->filter_recorder ) + ->method( '__invoke' ) + ->will( $this->returnArgument( 0 ) ); + + add_filter( 'woocommerce_attribute_taxonomies', $filter_mock ); + add_filter( 'sanitize_taxonomy_name', $filter_mock ); + } + + /** + * Tear down. + */ + public function tearDown() { + remove_all_filters( 'woocommerce_attribute_taxonomies' ); + remove_all_filters( 'sanitize_taxonomy_name' ); + + parent::tearDown(); + } + + /** + * Test wc_get_attribute_taxonomy_ids() function. + * Even empty arrays should be cached. + */ + public function test_wc_get_attribute_taxonomy_ids() { + $ids = wc_get_attribute_taxonomy_ids(); + $this->assertEquals( [], $ids ); + $this->assertEquals( + 1, + $this->filter_recorder->getInvocationCount(), + 'Filter `woocommerce_attribute_taxonomies` should have been triggered once after fetching all attribute taxonomies.' + ); + $ids = wc_get_attribute_taxonomy_ids(); + $this->assertEquals( [], $ids ); + $this->assertEquals( + 1, + $this->filter_recorder->getInvocationCount(), + 'Filter `woocommerce_attribute_taxonomies` should not be triggered a second time because the results should be loaded from the cache.' + ); + } + + /** + * Test wc_get_attribute_taxonomy_labels() function. + * Even empty arrays should be cached. + */ + public function test_wc_get_attribute_taxonomy_labels() { + $labels = wc_get_attribute_taxonomy_labels(); + $this->assertEquals( [], $labels ); + $this->assertEquals( + 1, + $this->filter_recorder->getInvocationCount(), + 'Filter `woocommerce_attribute_taxonomies` should have been triggered once after fetching all attribute taxonomies.' + ); + $labels = wc_get_attribute_taxonomy_labels(); + $this->assertEquals( [], $labels ); + $this->assertEquals( + 1, + $this->filter_recorder->getInvocationCount(), + 'Filter `woocommerce_attribute_taxonomies` should not be triggered a second time because the results should be loaded from the cache.' + ); + } + + /** + * Test wc_attribute_taxonomy_slug() function. + * Even empty strings should be cached. + * + * @dataProvider get_attribute_names_and_slugs + */ + public function test_wc_get_attribute_taxonomy_slug( $name, $expected_slug ) { + $slug = wc_attribute_taxonomy_slug( $name ); + $this->assertEquals( $expected_slug, $slug ); + $this->assertEquals( + 1, + $this->filter_recorder->getInvocationCount(), + 'Filter `sanitize_taxonomy_name` should have been triggered once.' + ); + $slug = wc_attribute_taxonomy_slug( $name ); + $this->assertEquals( $expected_slug, $slug ); + $this->assertEquals( + 1, + $this->filter_recorder->getInvocationCount(), + 'Filter `sanitize_taxonomy_name` should not be triggered a second time because the slug should be loaded from the cache.' + ); + } + + public function get_attribute_names_and_slugs() { + return [ + [ 'Dash Me', 'dash-me' ], + [ '', '' ], + [ 'pa_SubStr', 'substr' ], + [ 'ĂnîC°Dę', 'anicde' ], + ]; + } +} diff --git a/plugins/woocommerce/tsconfig.json b/plugins/woocommerce/tsconfig.json index 3372b91feaf..ad584a964d0 100644 --- a/plugins/woocommerce/tsconfig.json +++ b/plugins/woocommerce/tsconfig.json @@ -1,6 +1,7 @@ { + "extends": "../../tsconfig.base.json", "references": [ - { "path": "tests/e2e/api" } + { "path": "../../packages/js/api" } ], "files": [] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1914e20272f..7de4f806ce9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,41 +4,47 @@ importers: .: specifiers: + '@automattic/nx-composer': ^0.1.0 '@babel/core': 7.12.9 - '@nrwl/cli': 12.10.0 - '@nrwl/tao': 12.10.0 - '@nrwl/workspace': 12.10.0 + '@nrwl/cli': latest + '@nrwl/linter': ^13.1.4 + '@nrwl/tao': latest + '@nrwl/web': ^13.1.4 + '@nrwl/workspace': latest '@types/node': 14.14.33 - '@woocommerce/eslint-plugin': ^1.2.0 + '@woocommerce/eslint-plugin': ^1.3.0 '@wordpress/babel-plugin-import-jsx-pragma': ^3.1.0 - '@wordpress/babel-preset-default': ^6.3.3 - '@wordpress/prettier-config': ^1.0.5 + '@wordpress/babel-preset-default': ^6.4.1 + '@wordpress/prettier-config': ^1.1.1 chalk: ^4.1.2 glob: ^7.2.0 - jest: ^27.0.6 + jest: ^27.3.1 lodash: ^4.17.21 mkdirp: ^1.0.4 - node-stream-zip: ^1.13.6 - prettier: npm:wp-prettier@2.2.1-beta-1 + node-stream-zip: ^1.15.0 + prettier: npm:wp-prettier@^2.2.1-beta-1 request: ^2.88.2 typescript: 4.2.4 wp-textdomain: 1.0.1 dependencies: '@babel/core': 7.12.9 '@wordpress/babel-plugin-import-jsx-pragma': 3.1.0_@babel+core@7.12.9 - '@wordpress/babel-preset-default': 6.3.3 + '@wordpress/babel-preset-default': 6.4.1 lodash: 4.17.21 wp-textdomain: 1.0.1 devDependencies: - '@nrwl/cli': 12.10.0 - '@nrwl/tao': 12.10.0 - '@nrwl/workspace': 12.10.0_wp-prettier@2.2.1-beta-1 + '@automattic/nx-composer': 0.1.0 + '@nrwl/cli': 13.1.4 + '@nrwl/linter': 13.1.4 + '@nrwl/tao': 13.1.4 + '@nrwl/web': 13.1.4_42cab1dece2b2240094de84cfd414406 + '@nrwl/workspace': 13.1.4_wp-prettier@2.2.1-beta-1 '@types/node': 14.14.33 '@woocommerce/eslint-plugin': 1.3.0 '@wordpress/prettier-config': 1.1.1 chalk: 4.1.2 glob: 7.2.0 - jest: 27.2.4 + jest: 27.3.1 mkdirp: 1.0.4 node-stream-zip: 1.15.0 prettier: /wp-prettier/2.2.1-beta-1 @@ -48,31 +54,33 @@ importers: packages/js/api: specifiers: '@types/create-hmac': 1.1.0 - '@types/jest': 25.2.1 - '@types/moxios': ^0.4.9 + '@types/jest': ^27.0.2 '@types/node': 13.13.5 - axios: 0.21.2 + '@typescript-eslint/eslint-plugin': ^5.3.1 + '@typescript-eslint/parser': ^5.3.1 + axios: ^0.24.0 + axios-mock-adapter: ^1.20.0 create-hmac: 1.1.7 - jest: ^25.1.0 - jest-mock-extended: ^1.0.10 - moxios: 0.4.0 + eslint: ^8.2.0 + jest: ^27.3.1 oauth-1.0a: 2.2.6 ts-jest: 25.5.0 - typescript: 3.9.7 + typescript: ^4.4.4 dependencies: - axios: 0.21.2 + axios: 0.24.0 create-hmac: 1.1.7 oauth-1.0a: 2.2.6 devDependencies: '@types/create-hmac': 1.1.0 - '@types/jest': 25.2.1 - '@types/moxios': 0.4.12 + '@types/jest': 27.0.2 '@types/node': 13.13.5 - jest: 25.5.4 - jest-mock-extended: 1.0.18_jest@25.5.4+typescript@3.9.7 - moxios: 0.4.0_axios@0.21.2 - ts-jest: 25.5.0_jest@25.5.4+typescript@3.9.7 - typescript: 3.9.7 + '@typescript-eslint/eslint-plugin': 5.4.0_b983626bd16070d34b18187cb6bde052 + '@typescript-eslint/parser': 5.4.0_eslint@8.2.0+typescript@4.4.4 + axios-mock-adapter: 1.20.0_axios@0.24.0 + eslint: 8.2.0 + jest: 27.3.1 + ts-jest: 25.5.0_jest@27.3.1+typescript@4.4.4 + typescript: 4.4.4 packages/js/api-core-tests: specifiers: @@ -113,6 +121,7 @@ importers: '@wordpress/jest-preset-default': ^6.4.0 app-root-path: ^3.0.0 commander: 4.1.1 + eslint: ^8.1.0 jest: ^25.1.0 jest-each: 25.5.0 jest-puppeteer: ^4.4.0 @@ -139,23 +148,33 @@ importers: '@babel/core': 7.12.9 '@babel/polyfill': 7.12.1 '@babel/preset-env': 7.12.7_@babel+core@7.12.9 - '@wordpress/eslint-plugin': 7.3.0_typescript@4.2.4 + '@wordpress/eslint-plugin': 7.3.0_eslint@8.1.0+typescript@4.2.4 + eslint: 8.1.0 ndb: 1.1.5 semver: 7.3.5 packages/js/e2e-utils: specifiers: + '@automattic/puppeteer-utils': github:Automattic/puppeteer-utils#0f3ec50 + '@typescript-eslint/eslint-plugin': ^5.3.0 + '@typescript-eslint/parser': ^5.3.0 '@wordpress/deprecated': ^2.10.0 '@wordpress/e2e-test-utils': ^4.16.1 config: 3.3.3 + eslint: ^8.1.0 faker: ^5.1.0 fishery: ^1.2.0 dependencies: + '@automattic/puppeteer-utils': github.com/Automattic/puppeteer-utils/0f3ec50 '@wordpress/deprecated': 2.12.3 - '@wordpress/e2e-test-utils': 4.16.1_jest@27.2.4 + '@wordpress/e2e-test-utils': 4.16.1_jest@27.3.1 config: 3.3.3 faker: 5.5.3 fishery: 1.4.0 + devDependencies: + '@typescript-eslint/eslint-plugin': 5.3.0_ef742ec0d85d332d26b421951e243e75 + '@typescript-eslint/parser': 5.3.0_eslint@8.1.0+typescript@4.2.4 + eslint: 8.1.0 plugins/woocommerce: specifiers: @@ -273,6 +292,12 @@ importers: packages: + /@automattic/nx-composer/0.1.0: + resolution: {integrity: sha512-nUyHUmIRFUv1co5gYikk1ZrYnSL1CyK0Jp+tiT1RGhtxsRlFgQHy8HagP1SJz7OiH7qOJCY9gIUrPAhzu60LUA==} + dependencies: + '@nrwl/devkit': 12.10.0 + dev: true + /@babel/cli/7.12.8_@babel+core@7.12.9: resolution: {integrity: sha512-/6nQj11oaGhLmZiuRUfxsujiPDc9BBReemiXgIbxc+M5W+MIiFKYwvNDJvBfnGKNsJTKbUfEheKc9cwoPHAVQA==} hasBin: true @@ -293,13 +318,13 @@ packages: chokidar: 3.5.2 dev: true - /@babel/cli/7.12.8_@babel+core@7.15.8: + /@babel/cli/7.12.8_@babel+core@7.16.0: resolution: {integrity: sha512-/6nQj11oaGhLmZiuRUfxsujiPDc9BBReemiXgIbxc+M5W+MIiFKYwvNDJvBfnGKNsJTKbUfEheKc9cwoPHAVQA==} hasBin: true peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 commander: 4.1.1 convert-source-map: 1.8.0 fs-readdir-recursive: 1.1.0 @@ -316,31 +341,41 @@ packages: /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} dependencies: - '@babel/highlight': 7.14.5 + '@babel/highlight': 7.16.0 dev: true /@babel/code-frame/7.15.8: resolution: {integrity: sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.14.5 + '@babel/highlight': 7.16.0 + + /@babel/code-frame/7.16.0: + resolution: {integrity: sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.16.0 /@babel/compat-data/7.15.0: resolution: {integrity: sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==} engines: {node: '>=6.9.0'} + /@babel/compat-data/7.16.4: + resolution: {integrity: sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==} + engines: {node: '>=6.9.0'} + /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.15.8 - '@babel/generator': 7.15.8 - '@babel/helper-module-transforms': 7.15.8 - '@babel/helpers': 7.15.4 - '@babel/parser': 7.15.8 - '@babel/template': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helpers': 7.16.3 + '@babel/parser': 7.16.4 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 convert-source-map: 1.8.0 debug: 4.3.2 gensync: 1.0.0-beta.2 @@ -356,15 +391,15 @@ packages: resolution: {integrity: sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.15.8 - '@babel/generator': 7.15.8 + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 '@babel/helper-compilation-targets': 7.15.4_@babel+core@7.15.8 '@babel/helper-module-transforms': 7.15.8 '@babel/helpers': 7.15.4 - '@babel/parser': 7.15.8 - '@babel/template': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/parser': 7.16.2 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 convert-source-map: 1.8.0 debug: 4.3.2 gensync: 1.0.0-beta.2 @@ -374,11 +409,33 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator/7.15.8: - resolution: {integrity: sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==} + /@babel/core/7.16.0: + resolution: {integrity: sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helpers': 7.16.3 + '@babel/parser': 7.16.4 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 + convert-source-map: 1.8.0 + debug: 4.3.2 + gensync: 1.0.0-beta.2 + json5: 2.2.0 + semver: 6.3.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + + /@babel/generator/7.16.0: + resolution: {integrity: sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 jsesc: 2.5.2 source-map: 0.5.7 @@ -386,14 +443,29 @@ packages: resolution: {integrity: sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-annotate-as-pure/7.16.0: + resolution: {integrity: sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-builder-binary-assignment-operator-visitor/7.15.4: resolution: {integrity: sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.15.4 - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-builder-binary-assignment-operator-visitor/7.16.0: + resolution: {integrity: sha512-9KuleLT0e77wFUku6TUkqZzCEymBdtuQQ27MhEKzf9UOOJu3cYj98kyaDAzxpC7lV6DGiZFuC8XqDsq8/Kl6aQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-explode-assignable-expression': 7.16.0 + '@babel/types': 7.16.0 /@babel/helper-compilation-targets/7.15.4_@babel+core@7.12.9: resolution: {integrity: sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==} @@ -404,7 +476,7 @@ packages: '@babel/compat-data': 7.15.0 '@babel/core': 7.12.9 '@babel/helper-validator-option': 7.14.5 - browserslist: 4.17.3 + browserslist: 4.17.6 semver: 6.3.0 dev: true @@ -417,7 +489,19 @@ packages: '@babel/compat-data': 7.15.0 '@babel/core': 7.15.8 '@babel/helper-validator-option': 7.14.5 - browserslist: 4.17.3 + browserslist: 4.17.6 + semver: 6.3.0 + + /@babel/helper-compilation-targets/7.16.3_@babel+core@7.16.0: + resolution: {integrity: sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.16.4 + '@babel/core': 7.16.0 + '@babel/helper-validator-option': 7.14.5 + browserslist: 4.18.1 semver: 6.3.0 /@babel/helper-create-class-features-plugin/7.15.4_@babel+core@7.12.9: @@ -452,6 +536,57 @@ packages: '@babel/helper-split-export-declaration': 7.15.4 transitivePeerDependencies: - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.16.0_@babel+core@7.12.9: + resolution: {integrity: sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.16.0_@babel+core@7.15.8: + resolution: {integrity: sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.15.8 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + transitivePeerDependencies: + - supports-color /@babel/helper-create-regexp-features-plugin/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==} @@ -473,6 +608,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-annotate-as-pure': 7.15.4 regexpu-core: 4.8.0 + dev: true + + /@babel/helper-create-regexp-features-plugin/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + regexpu-core: 4.8.0 /@babel/helper-define-polyfill-provider/0.2.3_@babel+core@7.15.8: resolution: {integrity: sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==} @@ -483,7 +629,25 @@ packages: '@babel/helper-compilation-targets': 7.15.4_@babel+core@7.15.8 '@babel/helper-module-imports': 7.15.4 '@babel/helper-plugin-utils': 7.14.5 - '@babel/traverse': 7.15.4 + '@babel/traverse': 7.16.0 + debug: 4.3.2 + lodash.debounce: 4.0.8 + resolve: 1.20.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider/0.3.0_@babel+core@7.16.0: + resolution: {integrity: sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/traverse': 7.16.3 debug: 4.3.2 lodash.debounce: 4.0.8 resolve: 1.20.0 @@ -495,52 +659,103 @@ packages: resolution: {integrity: sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-explode-assignable-expression/7.16.0: + resolution: {integrity: sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-function-name/7.15.4: resolution: {integrity: sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-get-function-arity': 7.15.4 - '@babel/template': 7.15.4 - '@babel/types': 7.15.6 + '@babel/helper-get-function-arity': 7.16.0 + '@babel/template': 7.16.0 + '@babel/types': 7.16.0 + dev: true - /@babel/helper-get-function-arity/7.15.4: - resolution: {integrity: sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==} + /@babel/helper-function-name/7.16.0: + resolution: {integrity: sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/helper-get-function-arity': 7.16.0 + '@babel/template': 7.16.0 + '@babel/types': 7.16.0 + + /@babel/helper-get-function-arity/7.16.0: + resolution: {integrity: sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-hoist-variables/7.15.4: resolution: {integrity: sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-hoist-variables/7.16.0: + resolution: {integrity: sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-member-expression-to-functions/7.15.4: resolution: {integrity: sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.15.6 + dev: true + + /@babel/helper-member-expression-to-functions/7.16.0: + resolution: {integrity: sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-module-imports/7.15.4: resolution: {integrity: sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + + /@babel/helper-module-imports/7.16.0: + resolution: {integrity: sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-module-transforms/7.15.8: resolution: {integrity: sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-module-imports': 7.15.4 - '@babel/helper-replace-supers': 7.15.4 + '@babel/helper-replace-supers': 7.16.0 '@babel/helper-simple-access': 7.15.4 - '@babel/helper-split-export-declaration': 7.15.4 + '@babel/helper-split-export-declaration': 7.16.0 '@babel/helper-validator-identifier': 7.15.7 - '@babel/template': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + + /@babel/helper-module-transforms/7.16.0: + resolution: {integrity: sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-simple-access': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + '@babel/helper-validator-identifier': 7.15.7 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 transitivePeerDependencies: - supports-color @@ -549,6 +764,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.15.6 + dev: true + + /@babel/helper-optimise-call-expression/7.16.0: + resolution: {integrity: sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-plugin-utils/7.14.5: resolution: {integrity: sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==} @@ -558,9 +780,20 @@ packages: resolution: {integrity: sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-annotate-as-pure': 7.15.4 + '@babel/helper-annotate-as-pure': 7.16.0 '@babel/helper-wrap-function': 7.15.4 - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-remap-async-to-generator/7.16.4: + resolution: {integrity: sha512-vGERmmhR+s7eH5Y/cp8PCVzj4XEjerq8jooMfxFdA5xVtAk9Sh4AQsrWgiErUEBjtGrBtOFKDUcWQFW4/dFwMA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-wrap-function': 7.16.0 + '@babel/types': 7.16.0 transitivePeerDependencies: - supports-color @@ -568,10 +801,22 @@ packages: resolution: {integrity: sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-member-expression-to-functions': 7.15.4 - '@babel/helper-optimise-call-expression': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-replace-supers/7.16.0: + resolution: {integrity: sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-member-expression-to-functions': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 transitivePeerDependencies: - supports-color @@ -579,19 +824,39 @@ packages: resolution: {integrity: sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + + /@babel/helper-simple-access/7.16.0: + resolution: {integrity: sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-skip-transparent-expression-wrappers/7.15.4: resolution: {integrity: sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-skip-transparent-expression-wrappers/7.16.0: + resolution: {integrity: sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-split-export-declaration/7.15.4: resolution: {integrity: sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/helper-split-export-declaration/7.16.0: + resolution: {integrity: sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.16.0 /@babel/helper-validator-identifier/7.15.7: resolution: {integrity: sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==} @@ -605,10 +870,22 @@ packages: resolution: {integrity: sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.15.4 - '@babel/template': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/helper-function-name': 7.16.0 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-wrap-function/7.16.0: + resolution: {integrity: sha512-VVMGzYY3vkWgCJML+qVLvGIam902mJW0FvT7Avj1zEe0Gn7D93aWdLblYARTxEw+6DhZmtzhBM2zv0ekE5zg1g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-function-name': 7.16.0 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 transitivePeerDependencies: - supports-color @@ -616,14 +893,24 @@ packages: resolution: {integrity: sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.0 + '@babel/types': 7.16.0 transitivePeerDependencies: - supports-color - /@babel/highlight/7.14.5: - resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} + /@babel/helpers/7.16.3: + resolution: {integrity: sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 + transitivePeerDependencies: + - supports-color + + /@babel/highlight/7.16.0: + resolution: {integrity: sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-validator-identifier': 7.15.7 @@ -634,6 +921,26 @@ packages: resolution: {integrity: sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==} engines: {node: '>=6.0.0'} hasBin: true + dev: true + + /@babel/parser/7.16.2: + resolution: {integrity: sha512-RUVpT0G2h6rOZwqLDTrKk7ksNv7YpAilTnYe1/Q+eDjxEceRMKVWbCsX7t8h6C1qCFi/1Y8WZjcEPBAFG27GPw==} + engines: {node: '>=6.0.0'} + hasBin: true + + /@babel/parser/7.16.4: + resolution: {integrity: sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==} + engines: {node: '>=6.0.0'} + hasBin: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.2_@babel+core@7.16.0: + resolution: {integrity: sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.15.4_@babel+core@7.15.8: resolution: {integrity: sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==} @@ -645,6 +952,18 @@ packages: '@babel/helper-plugin-utils': 7.14.5 '@babel/helper-skip-transparent-expression-wrappers': 7.15.4 '@babel/plugin-proposal-optional-chaining': 7.14.5_@babel+core@7.15.8 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 /@babel/plugin-proposal-async-generator-functions/7.15.8_@babel+core@7.12.9: resolution: {integrity: sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==} @@ -672,6 +991,20 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.15.8 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.16.4_@babel+core@7.16.0: + resolution: {integrity: sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-remap-async-to-generator': 7.16.4 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-class-properties/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==} @@ -680,7 +1013,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.15.4_@babel+core@7.12.9 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.14.5 transitivePeerDependencies: - supports-color @@ -693,7 +1026,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.15.8 - '@babel/helper-create-class-features-plugin': 7.15.4_@babel+core@7.15.8 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.15.8 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 '@babel/helper-plugin-utils': 7.14.5 transitivePeerDependencies: - supports-color @@ -705,11 +1051,39 @@ packages: '@babel/core': ^7.12.0 dependencies: '@babel/core': 7.15.8 - '@babel/helper-create-class-features-plugin': 7.15.4_@babel+core@7.15.8 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.15.8 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-mAy3sdcY9sKAkf3lQbDiv3olOfiLqI51c9DR9b19uMoR2Z6r5pmGl7dfNFqEvqOyqbf1ta4lknK4gc5PJn3mfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color + + /@babel/plugin-proposal-decorators/7.16.4_@babel+core@7.16.0: + resolution: {integrity: sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-decorators': 7.16.0_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color + dev: true /@babel/plugin-proposal-dynamic-import/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==} @@ -731,6 +1105,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 /@babel/plugin-proposal-export-namespace-from/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==} @@ -752,6 +1137,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.0 /@babel/plugin-proposal-json-strings/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==} @@ -773,6 +1169,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-json-strings/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.0 /@babel/plugin-proposal-logical-assignment-operators/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==} @@ -794,6 +1201,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.0 /@babel/plugin-proposal-nullish-coalescing-operator/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==} @@ -815,6 +1233,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.0 /@babel/plugin-proposal-numeric-separator/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==} @@ -836,6 +1265,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.0 /@babel/plugin-proposal-object-rest-spread/7.15.6_@babel+core@7.12.9: resolution: {integrity: sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==} @@ -863,6 +1303,20 @@ packages: '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.15.8 '@babel/plugin-transform-parameters': 7.15.4_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-LU/+jp89efe5HuWJLmMmFG0+xbz+I2rSI7iLc1AlaeSMDMOGzWlc5yJrMN1d04osXN4sSfpo4O+azkBNBes0jg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.16.4 + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.16.0 /@babel/plugin-proposal-optional-catch-binding/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==} @@ -884,6 +1338,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.0 /@babel/plugin-proposal-optional-chaining/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==} @@ -907,6 +1372,18 @@ packages: '@babel/helper-plugin-utils': 7.14.5 '@babel/helper-skip-transparent-expression-wrappers': 7.15.4 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.15.8 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.0 /@babel/plugin-proposal-private-methods/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==} @@ -932,6 +1409,19 @@ packages: '@babel/helper-plugin-utils': 7.14.5 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-private-property-in-object/7.15.4_@babel+core@7.15.8: resolution: {integrity: sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==} @@ -940,12 +1430,27 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.15.8 - '@babel/helper-annotate-as-pure': 7.15.4 - '@babel/helper-create-class-features-plugin': 7.15.4_@babel+core@7.15.8 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.15.8 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-3jQUr/HBbMVZmi72LpjQwlZ55i1queL8KcDTQEkAHihttJnAPrcvG9ZNXIfsd2ugpizZo595egYV6xy+pv4Ofw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-unicode-property-regex/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==} @@ -967,6 +1472,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-create-regexp-features-plugin': 7.14.5_@babel+core@7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.12.9: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} @@ -984,6 +1500,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.16.0: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -1001,6 +1525,15 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.12.9: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: @@ -1017,6 +1550,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.16.0: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.15.8: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -1025,6 +1566,26 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.16.0: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + + /@babel/plugin-syntax-decorators/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} @@ -1042,6 +1603,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -1059,6 +1629,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.12.9: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -1077,6 +1656,15 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.16.0: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: true + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: @@ -1093,6 +1681,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-jsx/7.14.5_@babel+core@7.15.8: resolution: {integrity: sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==} engines: {node: '>=6.9.0'} @@ -1101,6 +1697,17 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-jsx/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-8zv2+xiPHwly31RK4RmnEYY5zziuF3O7W2kIDW+07ewWDh6Oi0dRq8kwvulRkFgt6DB97RlKs5c1y068iPlCUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + dev: false /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.12.9: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} @@ -1118,6 +1725,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.16.0: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -1134,6 +1749,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.12.9: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -1150,6 +1773,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.16.0: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -1166,6 +1797,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -1182,6 +1821,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -1198,6 +1845,14 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.16.0: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.15.8: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -1206,6 +1861,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.16.0: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} @@ -1225,14 +1890,24 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true - /@babel/plugin-syntax-typescript/7.14.5_@babel+core@7.15.8: - resolution: {integrity: sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==} + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.16.0: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + + /@babel/plugin-syntax-typescript/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-arrow-functions/7.14.5_@babel+core@7.12.9: @@ -1253,6 +1928,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-arrow-functions/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-vIFb5250Rbh7roWARvCLvIJ/PtAU5Lhv7BtZ1u24COwpI9Ypjsh+bZcKk6rlIyalK+r0jOc1XQ8I4ovNxNrWrA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-async-to-generator/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==} @@ -1280,6 +1965,20 @@ packages: '@babel/helper-remap-async-to-generator': 7.15.4 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-remap-async-to-generator': 7.16.4 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-block-scoped-functions/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==} @@ -1299,6 +1998,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-block-scoping/7.15.3_@babel+core@7.12.9: resolution: {integrity: sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==} @@ -1318,6 +2027,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-block-scoping/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-classes/7.15.4_@babel+core@7.12.9: resolution: {integrity: sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==} @@ -1353,6 +2072,24 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-classes/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-optimise-call-expression': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-replace-supers': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-computed-properties/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==} @@ -1372,6 +2109,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-computed-properties/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-63l1dRXday6S8V3WFY5mXJwcRAnPYxvFfTlt67bwV1rTyVTM5zrp0DBBb13Kl7+ehkCVwIZPumPpFP/4u70+Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-destructuring/7.14.7_@babel+core@7.12.9: resolution: {integrity: sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==} @@ -1391,6 +2138,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-destructuring/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-dotall-regex/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==} @@ -1412,6 +2169,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-create-regexp-features-plugin': 7.14.5_@babel+core@7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-duplicate-keys/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==} @@ -1431,6 +2199,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-exponentiation-operator/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==} @@ -1452,6 +2230,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-builder-binary-assignment-operator-visitor': 7.15.4 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-for-of/7.15.4_@babel+core@7.12.9: resolution: {integrity: sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==} @@ -1471,6 +2260,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-for-of/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-function-name/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==} @@ -1492,6 +2291,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-function-name': 7.15.4 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-function-name/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-literals/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==} @@ -1511,6 +2321,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-gQDlsSF1iv9RU04clgXqRjrPyyoJMTclFt3K1cjLmTKikc0s/6vE3hlDeEVC71wLTRu72Fq7650kABrdTc2wMQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-member-expression-literals/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==} @@ -1530,6 +2350,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-modules-amd/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==} @@ -1557,6 +2387,20 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-modules-commonjs/7.15.4_@babel+core@7.12.9: resolution: {integrity: sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==} @@ -1586,6 +2430,21 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Dzi+NWqyEotgzk/sb7kgQPJQf7AJkQBWsVp1N6JWc1lBVo0vkElUnGdr1PzUBmfsCCN5OOFya3RtpeHk15oLKQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-simple-access': 7.16.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-modules-systemjs/7.15.4_@babel+core@7.12.9: resolution: {integrity: sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==} @@ -1617,6 +2476,22 @@ packages: babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-yuGBaHS3lF1m/5R+6fjIke64ii5luRUg97N2wr+z1sF0V+sNSXPxXDdEEL/iYLszsN5VKxVB1IPfEqhzVpiqvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-identifier': 7.15.7 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-modules-umd/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==} @@ -1642,6 +2517,19 @@ packages: '@babel/helper-plugin-utils': 7.14.5 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-nx4f6no57himWiHhxDM5pjwhae5vLpTK2zCnDH8+wNLJy0TVER/LJRHl2bkt6w9Aad2sPD5iNNoUpY3X9sTGDg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-transforms': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-named-capturing-groups-regex/7.14.9_@babel+core@7.12.9: resolution: {integrity: sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==} @@ -1661,6 +2549,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-create-regexp-features-plugin': 7.14.5_@babel+core@7.15.8 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-LogN88uO+7EhxWc8WZuQ8vxdSyVGxhkh8WTC3tzlT8LccMuQdA81e9SGV6zY7kY2LjDhhDOFdQVxdGwPyBCnvg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 /@babel/plugin-transform-new-target/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==} @@ -1680,6 +2578,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-new-target/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-object-super/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==} @@ -1705,6 +2613,19 @@ packages: '@babel/helper-replace-supers': 7.15.4 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-object-super/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-replace-supers': 7.16.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-parameters/7.15.4_@babel+core@7.12.9: resolution: {integrity: sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==} @@ -1724,6 +2645,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-parameters/7.16.3_@babel+core@7.16.0: + resolution: {integrity: sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-property-literals/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==} @@ -1743,6 +2674,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-property-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-react-jsx/7.14.9_@babel+core@7.15.8: resolution: {integrity: sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==} @@ -1755,7 +2696,22 @@ packages: '@babel/helper-module-imports': 7.15.4 '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-jsx': 7.14.5_@babel+core@7.15.8 - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@babel/plugin-transform-react-jsx/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-rqDgIbukZ44pqq7NIRPGPGNklshPkvlmvqjdx3OZcGPk4zGIenYkxDTvl3LsSL8gqcc3ZzGmXPE6hR/u/voNOw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-annotate-as-pure': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/types': 7.16.0 + dev: false /@babel/plugin-transform-regenerator/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==} @@ -1775,6 +2731,16 @@ packages: dependencies: '@babel/core': 7.15.8 regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-regenerator/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + regenerator-transform: 0.14.5 /@babel/plugin-transform-reserved-words/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==} @@ -1794,6 +2760,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-reserved-words/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-runtime/7.15.8_@babel+core@7.15.8: resolution: {integrity: sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==} @@ -1810,6 +2786,23 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true + + /@babel/plugin-transform-runtime/7.16.4_@babel+core@7.16.0: + resolution: {integrity: sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.0 + babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.0 + babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-shorthand-properties/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==} @@ -1829,6 +2822,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-iVb1mTcD8fuhSv3k99+5tlXu5N0v8/DPm2mO3WACLG6al1CGZH7v09HJyUb1TtYl/Z+KrM6pHSIJdZxP5A+xow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-spread/7.15.8_@babel+core@7.12.9: resolution: {integrity: sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==} @@ -1850,6 +2853,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 '@babel/helper-skip-transparent-expression-wrappers': 7.15.4 + dev: true + + /@babel/plugin-transform-spread/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 /@babel/plugin-transform-sticky-regex/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==} @@ -1869,6 +2883,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-template-literals/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==} @@ -1888,6 +2912,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-template-literals/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-typeof-symbol/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==} @@ -1907,20 +2941,29 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true - /@babel/plugin-transform-typescript/7.15.8_@babel+core@7.15.8: - resolution: {integrity: sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==} + /@babel/plugin-transform-typeof-symbol/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.15.8 - '@babel/helper-create-class-features-plugin': 7.15.4_@babel+core@7.15.8 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - '@babel/plugin-syntax-typescript': 7.14.5_@babel+core@7.15.8 + + /@babel/plugin-transform-typescript/7.16.1_@babel+core@7.16.0: + resolution: {integrity: sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-class-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-typescript': 7.16.0_@babel+core@7.16.0 transitivePeerDependencies: - supports-color - dev: false /@babel/plugin-transform-unicode-escapes/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==} @@ -1940,6 +2983,16 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-VFi4dhgJM7Bpk8lRc5CMaRGlKZ29W9C3geZjt9beuzSUrlJxsNwX7ReLwaL6WEvsOf2EQkyIJEPtF8EXjB/g2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-transform-unicode-regex/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==} @@ -1961,6 +3014,17 @@ packages: '@babel/core': 7.15.8 '@babel/helper-create-regexp-features-plugin': 7.14.5_@babel+core@7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-create-regexp-features-plugin': 7.16.0_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 /@babel/polyfill/7.12.1: resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} @@ -2120,7 +3184,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.14.5_@babel+core@7.15.8 '@babel/plugin-transform-unicode-regex': 7.14.5_@babel+core@7.15.8 '@babel/preset-modules': 0.1.4_@babel+core@7.15.8 - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 babel-plugin-polyfill-corejs2: 0.2.2_@babel+core@7.15.8 babel-plugin-polyfill-corejs3: 0.2.5_@babel+core@7.15.8 babel-plugin-polyfill-regenerator: 0.2.2_@babel+core@7.15.8 @@ -2128,6 +3192,91 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true + + /@babel/preset-env/7.16.4_@babel+core@7.16.0: + resolution: {integrity: sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.16.4 + '@babel/core': 7.16.0 + '@babel/helper-compilation-targets': 7.16.3_@babel+core@7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/helper-validator-option': 7.14.5 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.2_@babel+core@7.16.0 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-async-generator-functions': 7.16.4_@babel+core@7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-class-static-block': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-dynamic-import': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-export-namespace-from': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-json-strings': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-numeric-separator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-object-rest-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-catch-binding': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-optional-chaining': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-methods': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-private-property-in-object': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.0 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.0 + '@babel/plugin-transform-arrow-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-async-to-generator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoped-functions': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-block-scoping': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-classes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-computed-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-destructuring': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-dotall-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-duplicate-keys': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-exponentiation-operator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-for-of': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-function-name': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-member-expression-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-amd': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-commonjs': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-systemjs': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-modules-umd': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-new-target': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-object-super': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.16.0 + '@babel/plugin-transform-property-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-regenerator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-reserved-words': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-shorthand-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-spread': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-sticky-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-template-literals': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-typeof-symbol': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-unicode-escapes': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-unicode-regex': 7.16.0_@babel+core@7.16.0 + '@babel/preset-modules': 0.1.5_@babel+core@7.16.0 + '@babel/types': 7.16.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.0 + babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.0 + babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.0 + core-js-compat: 3.19.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /@babel/preset-modules/0.1.4_@babel+core@7.12.9: resolution: {integrity: sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==} @@ -2153,20 +3302,32 @@ packages: '@babel/plugin-transform-dotall-regex': 7.14.5_@babel+core@7.15.8 '@babel/types': 7.15.6 esutils: 2.0.3 + dev: true - /@babel/preset-typescript/7.15.0_@babel+core@7.15.8: - resolution: {integrity: sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==} + /@babel/preset-modules/0.1.5_@babel+core@7.16.0: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-proposal-unicode-property-regex': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-dotall-regex': 7.16.0_@babel+core@7.16.0 + '@babel/types': 7.16.0 + esutils: 2.0.3 + + /@babel/preset-typescript/7.16.0_@babel+core@7.16.0: + resolution: {integrity: sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 '@babel/helper-validator-option': 7.14.5 - '@babel/plugin-transform-typescript': 7.15.8_@babel+core@7.15.8 + '@babel/plugin-transform-typescript': 7.16.1_@babel+core@7.16.0 transitivePeerDependencies: - supports-color - dev: false /@babel/register/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-XWcmseMIncOjoydKZnWvWi0/5CUCD+ZYKhRwgYlWOrA8fGZ/FjuLRpqtIhLOVD/fvR1b9DQHtZPn68VvhpYf+Q==} @@ -2181,11 +3342,11 @@ packages: source-map-support: 0.5.20 dev: true - /@babel/runtime-corejs3/7.15.4: - resolution: {integrity: sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==} + /@babel/runtime-corejs3/7.16.3: + resolution: {integrity: sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.18.2 + core-js-pure: 3.19.1 regenerator-runtime: 0.13.9 dev: true @@ -2195,25 +3356,64 @@ packages: dependencies: regenerator-runtime: 0.13.9 - /@babel/template/7.15.4: - resolution: {integrity: sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==} + /@babel/runtime/7.16.3: + resolution: {integrity: sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.15.8 - '@babel/parser': 7.15.8 - '@babel/types': 7.15.6 + regenerator-runtime: 0.13.9 + + /@babel/template/7.16.0: + resolution: {integrity: sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@babel/parser': 7.16.4 + '@babel/types': 7.16.0 /@babel/traverse/7.15.4: resolution: {integrity: sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.15.8 - '@babel/generator': 7.15.8 - '@babel/helper-function-name': 7.15.4 - '@babel/helper-hoist-variables': 7.15.4 - '@babel/helper-split-export-declaration': 7.15.4 - '@babel/parser': 7.15.8 - '@babel/types': 7.15.6 + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/types': 7.16.0 + debug: 4.3.2 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/traverse/7.16.0: + resolution: {integrity: sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + '@babel/parser': 7.16.2 + '@babel/types': 7.16.0 + debug: 4.3.2 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse/7.16.3: + resolution: {integrity: sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/helper-function-name': 7.16.0 + '@babel/helper-hoist-variables': 7.16.0 + '@babel/helper-split-export-declaration': 7.16.0 + '@babel/parser': 7.16.4 + '@babel/types': 7.16.0 debug: 4.3.2 globals: 11.12.0 transitivePeerDependencies: @@ -2225,6 +3425,14 @@ packages: dependencies: '@babel/helper-validator-identifier': 7.15.7 to-fast-properties: 2.0.0 + dev: true + + /@babel/types/7.16.0: + resolution: {integrity: sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.15.7 + to-fast-properties: 2.0.0 /@bcoe/v8-coverage/0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} @@ -2244,6 +3452,25 @@ packages: exec-sh: 0.3.6 minimist: 1.2.5 + /@cypress/webpack-preprocessor/5.10.0_8664c4230b51db280b15ba36bf8e5650: + resolution: {integrity: sha512-KzcDBjos3rIw58imyvATYTNi9CB+Co0SFUhexmuH2c+Wk1ksSM3g4XmxUUIaJJvDwmIK4tcoBMYd9Lzle8bR7A==} + peerDependencies: + '@babel/core': ^7.0.1 + '@babel/preset-env': ^7.0.0 + babel-loader: ^8.0.2 + webpack: ^4 || ^5 + dependencies: + '@babel/core': 7.16.0 + '@babel/preset-env': 7.16.4_@babel+core@7.16.0 + babel-loader: 8.2.3_fda98f9ff70e0481a7d2271d8792a29b + bluebird: 3.7.2 + debug: 4.3.2 + lodash: 4.17.21 + webpack: 5.64.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -2251,7 +3478,7 @@ packages: ajv: 6.12.6 debug: 4.3.2 espree: 7.3.1 - globals: 13.11.0 + globals: 13.12.0 ignore: 4.0.6 import-fresh: 3.3.0 js-yaml: 3.14.1 @@ -2261,6 +3488,40 @@ packages: - supports-color dev: true + /@eslint/eslintrc/1.0.3: + resolution: {integrity: sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.2 + espree: 9.0.0 + globals: 13.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 3.14.1 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/eslintrc/1.0.4: + resolution: {integrity: sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.2 + espree: 9.0.0 + globals: 13.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.0.4 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@hapi/address/2.1.4: resolution: {integrity: sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==} deprecated: Moved to 'npm install @sideway/address' @@ -2297,15 +3558,26 @@ packages: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.0 + '@humanwhocodes/object-schema': 1.2.1 debug: 4.3.2 minimatch: 3.0.4 transitivePeerDependencies: - supports-color dev: true - /@humanwhocodes/object-schema/1.2.0: - resolution: {integrity: sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==} + /@humanwhocodes/config-array/0.6.0: + resolution: {integrity: sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.2 + minimatch: 3.0.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/object-schema/1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} dev: true /@istanbuljs/load-nyc-config/1.1.0: @@ -2341,15 +3613,15 @@ packages: jest-util: 25.5.0 slash: 3.0.0 - /@jest/console/27.2.4: - resolution: {integrity: sha512-94znCKynPZpDpYHQ6esRJSc11AmONrVkBOBZiD7S+bSubHhrUfbS95EY5HIOxhm4PQO7cnvZkL3oJcY0oMA+Wg==} + /@jest/console/27.3.1: + resolution: {integrity: sha512-RkFNWmv0iui+qsOr/29q9dyfKTTT5DCuP31kUwg7rmOKPT/ozLeGLKJKVIiOfbiKyleUZKIrHwhmiZWVe8IMdw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 '@types/node': 16.10.3 chalk: 4.1.2 - jest-message-util: 27.2.4 - jest-util: 27.2.4 + jest-message-util: 27.3.1 + jest-util: 27.3.1 slash: 3.0.0 dev: true @@ -2427,8 +3699,8 @@ packages: - supports-color - utf-8-validate - /@jest/core/27.2.4: - resolution: {integrity: sha512-UNQLyy+rXoojNm2MGlapgzWhZD1CT1zcHZQYeiD0xE7MtJfC19Q6J5D/Lm2l7i4V97T30usKDoEtjI8vKwWcLg==} + /@jest/core/27.3.1: + resolution: {integrity: sha512-DMNE90RR5QKx0EA+wqe3/TNEwiRpOkhshKNxtLxd4rt3IZpCt+RSL+FoJsGeblRZmqdK4upHA/mKKGPPRAifhg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2436,30 +3708,30 @@ packages: node-notifier: optional: true dependencies: - '@jest/console': 27.2.4 - '@jest/reporters': 27.2.4 - '@jest/test-result': 27.2.4 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@jest/console': 27.3.1 + '@jest/reporters': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.8 - jest-changed-files: 27.2.4 - jest-config: 27.2.4 - jest-haste-map: 27.2.4 - jest-message-util: 27.2.4 + jest-changed-files: 27.3.0 + jest-config: 27.3.1 + jest-haste-map: 27.3.1 + jest-message-util: 27.3.1 jest-regex-util: 27.0.6 - jest-resolve: 27.2.4 - jest-resolve-dependencies: 27.2.4 - jest-runner: 27.2.4 - jest-runtime: 27.2.4 - jest-snapshot: 27.2.4 - jest-util: 27.2.4 - jest-validate: 27.2.4 - jest-watcher: 27.2.4 + jest-resolve: 27.3.1 + jest-resolve-dependencies: 27.3.1 + jest-runner: 27.3.1 + jest-runtime: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + jest-watcher: 27.3.1 micromatch: 4.0.4 rimraf: 3.0.2 slash: 3.0.0 @@ -2501,14 +3773,14 @@ packages: '@types/node': 16.10.3 jest-mock: 26.6.2 - /@jest/environment/27.2.4: - resolution: {integrity: sha512-wkuui5yr3SSQW0XD0Qm3TATUbL/WE3LDEM3ulC+RCQhMf2yxhci8x7svGkZ4ivJ6Pc94oOzpZ6cdHBAMSYd1ew==} + /@jest/environment/27.3.1: + resolution: {integrity: sha512-BCKCj4mOVLme6Tanoyc9k0ultp3pnmuyHw73UHRPeeZxirsU/7E3HC4le/VDb/SMzE1JcPnto+XBKFOcoiJzVw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/fake-timers': 27.2.4 - '@jest/types': 27.2.4 + '@jest/fake-timers': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 - jest-mock: 27.2.4 + jest-mock: 27.3.0 dev: true /@jest/fake-timers/24.9.0: @@ -2541,16 +3813,16 @@ packages: jest-mock: 26.6.2 jest-util: 26.6.2 - /@jest/fake-timers/27.2.4: - resolution: {integrity: sha512-cs/TzvwWUM7kAA6Qm/890SK6JJ2pD5RfDNM3SSEom6BmdyV6OiWP1qf/pqo6ts6xwpcM36oN0wSEzcZWc6/B6w==} + /@jest/fake-timers/27.3.1: + resolution: {integrity: sha512-M3ZFgwwlqJtWZ+QkBG5NmC23A9w+A6ZxNsO5nJxJsKYt4yguBd3i8TpjQz5NfCX91nEve1KqD9RA2Q+Q1uWqoA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 - '@sinonjs/fake-timers': 8.0.1 + '@jest/types': 27.2.5 + '@sinonjs/fake-timers': 8.1.0 '@types/node': 16.10.3 - jest-message-util: 27.2.4 - jest-mock: 27.2.4 - jest-util: 27.2.4 + jest-message-util: 27.3.1 + jest-mock: 27.3.0 + jest-util: 27.3.1 dev: true /@jest/globals/25.5.2: @@ -2569,13 +3841,13 @@ packages: '@jest/types': 26.6.2 expect: 26.6.2 - /@jest/globals/27.2.4: - resolution: {integrity: sha512-DRsRs5dh0i+fA9mGHylTU19+8fhzNJoEzrgsu+zgJoZth3x8/0juCQ8nVVdW1er4Cqifb/ET7/hACYVPD0dBEA==} + /@jest/globals/27.3.1: + resolution: {integrity: sha512-Q651FWiWQAIFiN+zS51xqhdZ8g9b88nGCobC87argAxA7nMfNQq0Q0i9zTfQYgLa6qFXk2cGANEqfK051CZ8Pg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.2.4 - '@jest/types': 27.2.4 - expect: 27.2.4 + '@jest/environment': 27.3.1 + '@jest/types': 27.2.5 + expect: 27.3.1 dev: true /@jest/reporters/24.9.0: @@ -2650,24 +3922,24 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.2.4 - '@jest/test-result': 27.2.4 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@jest/console': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.0 graceful-fs: 4.2.8 - istanbul-lib-coverage: 3.0.1 + istanbul-lib-coverage: 3.2.0 istanbul-lib-instrument: 4.0.3 istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.0 - istanbul-reports: 3.0.3 - jest-haste-map: 27.2.4 - jest-resolve: 27.2.4 - jest-util: 27.2.4 - jest-worker: 27.2.4 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.0.5 + jest-haste-map: 27.3.1 + jest-resolve: 27.3.1 + jest-util: 27.3.1 + jest-worker: 27.3.1 slash: 3.0.0 source-map: 0.6.1 string-length: 4.0.2 @@ -2677,8 +3949,8 @@ packages: - supports-color dev: true - /@jest/reporters/27.2.4: - resolution: {integrity: sha512-LHeSdDnDZkDnJ8kvnjcqV8P1Yv/32yL4d4XfR5gBiy3xGO0onwll1QEbvtW96fIwhx2nejug0GTaEdNDoyr3fQ==} + /@jest/reporters/27.3.1: + resolution: {integrity: sha512-m2YxPmL9Qn1emFVgZGEiMwDntDxRRQ2D58tiDQlwYTg5GvbFOKseYCcHtn0WsI8CG4vzPglo3nqbOiT8ySBT/w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 @@ -2687,24 +3959,25 @@ packages: optional: true dependencies: '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 27.2.4 - '@jest/test-result': 27.2.4 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@jest/console': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 + '@types/node': 16.10.3 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 glob: 7.2.0 graceful-fs: 4.2.8 - istanbul-lib-coverage: 3.0.1 + istanbul-lib-coverage: 3.2.0 istanbul-lib-instrument: 4.0.3 istanbul-lib-report: 3.0.0 - istanbul-lib-source-maps: 4.0.0 - istanbul-reports: 3.0.3 - jest-haste-map: 27.2.4 - jest-resolve: 27.2.4 - jest-util: 27.2.4 - jest-worker: 27.2.4 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.0.5 + jest-haste-map: 27.3.1 + jest-resolve: 27.3.1 + jest-util: 27.3.1 + jest-worker: 27.3.1 slash: 3.0.0 source-map: 0.6.1 string-length: 4.0.2 @@ -2762,18 +4035,18 @@ packages: resolution: {integrity: sha512-yENoDEoWlEFI7l5z7UYyJb/y5Q8RqbPd4neAVhKr6l+vVaQOPKf8V/IseSMJI9+urDUIxgssA7RGNyCRhGjZvw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.2.4 - '@jest/types': 27.2.4 + '@jest/console': 27.3.1 + '@jest/types': 27.2.5 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 dev: true - /@jest/test-result/27.2.4: - resolution: {integrity: sha512-eU+PRo0+lIS01b0dTmMdVZ0TtcRSxEaYquZTRFMQz6CvsehGhx9bRzi9Zdw6VROviJyv7rstU+qAMX5pNBmnfQ==} + /@jest/test-result/27.3.1: + resolution: {integrity: sha512-mLn6Thm+w2yl0opM8J/QnPTqrfS4FoXsXF2WIWJb2O/GBSyResL71BRuMYbYRsGt7ELwS5JGcEcGb52BNrumgg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.2.4 - '@jest/types': 27.2.4 + '@jest/console': 27.3.1 + '@jest/types': 27.2.5 '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 dev: true @@ -2805,14 +4078,14 @@ packages: - supports-color - utf-8-validate - /@jest/test-sequencer/27.2.4: - resolution: {integrity: sha512-fpk5eknU3/DXE2QCCG1wv/a468+cfPo3Asu6d6yUtM9LOPh709ubZqrhuUOYfM8hXMrIpIdrv1CdCrWWabX0rQ==} + /@jest/test-sequencer/27.3.1: + resolution: {integrity: sha512-siySLo07IMEdSjA4fqEnxfIX8lB/lWYsBPwNFtkOvsFQvmBrL3yj3k3uFNZv/JDyApTakRpxbKLJ3CT8UGVCrA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 27.2.4 + '@jest/test-result': 27.3.1 graceful-fs: 4.2.8 - jest-haste-map: 27.2.4 - jest-runtime: 27.2.4 + jest-haste-map: 27.3.1 + jest-runtime: 27.3.1 transitivePeerDependencies: - supports-color dev: true @@ -2821,7 +4094,7 @@ packages: resolution: {integrity: sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==} engines: {node: '>= 6'} dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@jest/types': 24.9.0 babel-plugin-istanbul: 5.2.0 chalk: 2.4.2 @@ -2864,20 +4137,20 @@ packages: transitivePeerDependencies: - supports-color - /@jest/transform/27.2.4: - resolution: {integrity: sha512-n5FlX2TH0oQGwyVDKPxdJ5nI2sO7TJBFe3u3KaAtt7TOiV4yL+Y+rSFDl+Ic5MpbiA/eqXmLAQxjnBmWgS2rEA==} + /@jest/transform/27.3.1: + resolution: {integrity: sha512-3fSvQ02kuvjOI1C1ssqMVBKJpZf6nwoCiSu00zAKh5nrp3SptNtZy/8s5deayHnqxhjD9CWDJ+yqQwuQ0ZafXQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.15.8 - '@jest/types': 27.2.4 - babel-plugin-istanbul: 6.0.0 + '@babel/core': 7.16.0 + '@jest/types': 27.2.5 + babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 1.8.0 fast-json-stable-stringify: 2.1.0 graceful-fs: 4.2.8 - jest-haste-map: 27.2.4 + jest-haste-map: 27.3.1 jest-regex-util: 27.0.6 - jest-util: 27.2.4 + jest-util: 27.3.1 micromatch: 4.0.4 pirates: 4.0.1 slash: 3.0.0 @@ -2915,8 +4188,8 @@ packages: '@types/yargs': 15.0.14 chalk: 4.1.2 - /@jest/types/27.2.4: - resolution: {integrity: sha512-IDO2ezTxeMvQAHxzG/ZvEyA47q0aVfzT95rGFl7bZs/Go0aIucvfDbS2rmnoEdXxlLQhcolmoG/wvL/uKx4tKA==} + /@jest/types/27.2.5: + resolution: {integrity: sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@types/istanbul-lib-coverage': 2.0.3 @@ -2964,34 +4237,83 @@ packages: fastq: 1.13.0 dev: true - /@nrwl/cli/12.10.0: - resolution: {integrity: sha512-T8HY7OpY5ygwUZcgt1W2mKYvSsiJ2AMDv7PDGQMCfauYd37FeK8ae93mqdbAXZRJKLrAuaoy51TWOQxwv4vzsA==} + /@nrwl/cli/13.1.4: + resolution: {integrity: sha512-X2mJwjXitBbY/zRkcVJCUI4Kwk7bPJ/ZJwZHQH5Sn9IAX3p13ELQ1eAanxpOpUakVLvkjlAJ1g5vzt1znzs8wA==} hasBin: true dependencies: - '@nrwl/tao': 12.10.0 + '@nrwl/tao': 13.1.4 chalk: 4.1.0 + enquirer: 2.3.6 v8-compile-cache: 2.3.0 yargs: 15.4.1 yargs-parser: 20.0.0 dev: true + /@nrwl/cypress/13.1.4_45e5b05f8550ddf8ad44a90a38658752: + resolution: {integrity: sha512-t3HewJdWl7wWAoFm6ZCtMbe8AODvV7Gtck4RP/cB0lFn6Di0q8tUNutVXSfNSdAvSURvegurZsyb30ehIM1FcQ==} + peerDependencies: + cypress: '>= 3 < 9' + peerDependenciesMeta: + cypress: + optional: true + dependencies: + '@cypress/webpack-preprocessor': 5.10.0_8664c4230b51db280b15ba36bf8e5650 + '@nrwl/devkit': 13.1.4 + '@nrwl/linter': 13.1.4_ts-node@9.1.1 + '@nrwl/workspace': 13.1.4_e369ab82b1fb00f8171cda4ee1f045dc + chalk: 4.1.0 + enhanced-resolve: 5.8.3 + fork-ts-checker-webpack-plugin: 6.2.10 + rxjs: 6.6.7 + ts-loader: 9.2.6_typescript@4.2.4+webpack@5.64.1 + tsconfig-paths: 3.11.0 + tsconfig-paths-webpack-plugin: 3.4.1 + tslib: 2.3.1 + webpack-node-externals: 3.0.0 + yargs-parser: 20.0.0 + transitivePeerDependencies: + - '@babel/core' + - '@babel/preset-env' + - babel-loader + - bufferutil + - canvas + - node-notifier + - prettier + - supports-color + - ts-node + - typescript + - utf-8-validate + - webpack + dev: true + /@nrwl/devkit/12.10.0: resolution: {integrity: sha512-we0K5Hn48BXh77SV5GVSPfRJeIHNCVFSn+feLbnKz3G60Tk3wFEEFhDABA8cCfTKDxMESSjZoWBy4ZcVg0EX0g==} dependencies: '@nrwl/tao': 12.10.0 ejs: 3.1.6 - ignore: 5.1.8 + ignore: 5.1.9 rxjs: 6.6.7 semver: 7.3.4 tslib: 2.3.1 dev: true - /@nrwl/jest/12.10.0: - resolution: {integrity: sha512-Tqrl/d6y+fGWV9j8bCReLhhfnioAA8yPC9Y6EUevxPuuuW0AUwRZp8slhx7mCiWNh9nLCkMO7PcwD+4L39kzjQ==} + /@nrwl/devkit/13.1.4: + resolution: {integrity: sha512-2jzb7A94O8k3lQfIvCgVb/LPoym2P6EoKAEYYX6OgPY0hwjaqik1LgkWxSnN0yTPL5gCCxb6pYLHS8A0tDye2w==} + dependencies: + '@nrwl/tao': 13.1.4 + ejs: 3.1.6 + ignore: 5.1.9 + rxjs: 6.6.7 + semver: 7.3.4 + tslib: 2.3.1 + dev: true + + /@nrwl/jest/13.1.4: + resolution: {integrity: sha512-Lb+jVgHhamnO/kkJpRbgr7lvLGh4pqgp+WXzcDJo8in0TgWcdZzldCfV7lXiFoRVv1FgUjVYb5BgfNcVsrDJLg==} dependencies: '@jest/reporters': 27.2.2 '@jest/test-result': 27.2.2 - '@nrwl/devkit': 12.10.0 + '@nrwl/devkit': 13.1.4 chalk: 4.1.0 identity-obj-proxy: 3.0.0 jest-config: 27.2.2 @@ -3008,11 +4330,53 @@ packages: - utf-8-validate dev: true - /@nrwl/linter/12.10.0: - resolution: {integrity: sha512-GULnMm3vMh1QEq6QUzZWV+AYB2NlZnov0Pj6tdtqXTjS+mOXkLYP/k8Vfb4ZEPVNSwHyjRZY08A5sbeRnurD2w==} + /@nrwl/jest/13.1.4_ts-node@9.1.1: + resolution: {integrity: sha512-Lb+jVgHhamnO/kkJpRbgr7lvLGh4pqgp+WXzcDJo8in0TgWcdZzldCfV7lXiFoRVv1FgUjVYb5BgfNcVsrDJLg==} dependencies: - '@nrwl/devkit': 12.10.0 - '@nrwl/jest': 12.10.0 + '@jest/reporters': 27.2.2 + '@jest/test-result': 27.2.2 + '@nrwl/devkit': 13.1.4 + chalk: 4.1.0 + identity-obj-proxy: 3.0.0 + jest-config: 27.2.2_ts-node@9.1.1 + jest-resolve: 27.2.2 + jest-util: 27.2.0 + rxjs: 6.6.7 + tslib: 2.3.1 + transitivePeerDependencies: + - bufferutil + - canvas + - node-notifier + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@nrwl/linter/13.1.4: + resolution: {integrity: sha512-eeBP2BOA8U7QpDbWcYQ7d30I9oSXsxl7jZnhggRUDxmrW1SzJmMTXCSAwRLFnHediFAYQVR1FxVmIjX8cxRPBQ==} + dependencies: + '@nrwl/devkit': 13.1.4 + '@nrwl/jest': 13.1.4 + eslint: 7.32.0 + glob: 7.1.4 + minimatch: 3.0.4 + tmp: 0.2.1 + tslib: 2.3.1 + transitivePeerDependencies: + - bufferutil + - canvas + - node-notifier + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@nrwl/linter/13.1.4_ts-node@9.1.1: + resolution: {integrity: sha512-eeBP2BOA8U7QpDbWcYQ7d30I9oSXsxl7jZnhggRUDxmrW1SzJmMTXCSAwRLFnHediFAYQVR1FxVmIjX8cxRPBQ==} + dependencies: + '@nrwl/devkit': 13.1.4 + '@nrwl/jest': 13.1.4_ts-node@9.1.1 + eslint: 7.32.0 glob: 7.1.4 minimatch: 3.0.4 tmp: 0.2.1 @@ -3043,15 +4407,149 @@ packages: yargs-parser: 20.0.0 dev: true - /@nrwl/workspace/12.10.0_wp-prettier@2.2.1-beta-1: - resolution: {integrity: sha512-3efkh/0DEOmQXnA2SlBcEk21QiM0vPaJt73CiYnocm1oy7/ngZDyhxYFxOJkVtsfRvR69Etj2JLonbIWa4Za5w==} + /@nrwl/tao/13.1.4: + resolution: {integrity: sha512-XslTN56x5Y1sEuVkGoAMCibEU0V5CunOORSewMWsNaEWtefhkLD00R0L02Uj4q1d28H+6TiucjR/mGFjyEzWUQ==} + hasBin: true + dependencies: + chalk: 4.1.0 + enquirer: 2.3.6 + fs-extra: 9.1.0 + jsonc-parser: 3.0.0 + nx: 13.1.4 + rxjs: 6.6.7 + rxjs-for-await: 0.0.2_rxjs@6.6.7 + semver: 7.3.4 + tmp: 0.2.1 + tslib: 2.3.1 + yargs-parser: 20.0.0 + dev: true + + /@nrwl/web/13.1.4_42cab1dece2b2240094de84cfd414406: + resolution: {integrity: sha512-ana2YrMHYltowOHG3f3+EzA5jQVL4+QsVniN8qXFJrwecpFEoRlCZYGvhomhe3TyC4QlQkmmSm575foV8dzAyQ==} + dependencies: + '@babel/core': 7.16.0 + '@babel/plugin-proposal-class-properties': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.16.0 + '@babel/plugin-transform-regenerator': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.16.0 + '@babel/preset-env': 7.16.4_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/runtime': 7.16.3 + '@nrwl/cypress': 13.1.4_45e5b05f8550ddf8ad44a90a38658752 + '@nrwl/devkit': 13.1.4 + '@nrwl/jest': 13.1.4_ts-node@9.1.1 + '@nrwl/linter': 13.1.4_ts-node@9.1.1 + '@nrwl/workspace': 13.1.4_e369ab82b1fb00f8171cda4ee1f045dc + '@pmmmwh/react-refresh-webpack-plugin': 0.5.1_92cb4b81c6b9f71cf92f0bdb85e4210c + '@rollup/plugin-babel': 5.3.0_@babel+core@7.16.0+rollup@2.60.0 + '@rollup/plugin-commonjs': 20.0.0_rollup@2.60.0 + '@rollup/plugin-image': 2.1.1_rollup@2.60.0 + '@rollup/plugin-json': 4.1.0_rollup@2.60.0 + '@rollup/plugin-node-resolve': 13.0.6_rollup@2.60.0 + autoprefixer: 10.4.0_postcss@8.3.0 + babel-loader: 8.2.3_fda98f9ff70e0481a7d2271d8792a29b + babel-plugin-const-enum: 1.2.0_@babel+core@7.16.0 + babel-plugin-macros: 2.8.0 + babel-plugin-transform-async-to-promises: 0.8.15 + babel-plugin-transform-typescript-metadata: 0.3.2 + browserslist: 4.18.1 + bytes: 3.1.1 + caniuse-lite: 1.0.30001280 + chalk: 4.1.0 + chokidar: 3.5.2 + copy-webpack-plugin: 9.1.0_webpack@5.64.1 + core-js: 3.19.1 + css-loader: 6.5.1_webpack@5.64.1 + css-minimizer-webpack-plugin: 3.1.3_webpack@5.64.1 + enhanced-resolve: 5.8.3 + file-loader: 6.2.0_webpack@5.64.1 + fork-ts-checker-webpack-plugin: 6.2.10 + fs-extra: 9.1.0 + http-server: 0.12.3 + identity-obj-proxy: 3.0.0 + ignore: 5.1.9 + less: 3.12.2 + less-loader: 10.2.0_less@3.12.2+webpack@5.64.1 + license-webpack-plugin: 2.3.15 + loader-utils: 1.2.3 + mini-css-extract-plugin: 2.4.4_webpack@5.64.1 + open: 7.4.2 + parse5: 4.0.0 + parse5-html-rewriting-stream: 6.0.1 + postcss: 8.3.0 + postcss-import: 14.0.2_postcss@8.3.0 + postcss-loader: 6.2.0_postcss@8.3.0+webpack@5.64.1 + raw-loader: 4.0.2_webpack@5.64.1 + react-refresh: 0.10.0 + rimraf: 3.0.2 + rollup: 2.60.0 + rollup-plugin-copy: 3.4.0 + rollup-plugin-peer-deps-external: 2.2.4_rollup@2.60.0 + rollup-plugin-postcss: 4.0.1_postcss@8.3.0+ts-node@9.1.1 + rollup-plugin-typescript2: 0.30.0_rollup@2.60.0+typescript@4.2.4 + rxjs: 6.6.7 + rxjs-for-await: 0.0.2_rxjs@6.6.7 + sass: 1.43.4 + sass-loader: 12.3.0_sass@1.43.4+webpack@5.64.1 + semver: 7.3.4 + source-map: 0.7.3 + source-map-loader: 3.0.0_webpack@5.64.1 + style-loader: 3.3.1_webpack@5.64.1 + stylus: 0.55.0 + stylus-loader: 6.2.0_stylus@0.55.0+webpack@5.64.1 + terser: 4.3.8 + terser-webpack-plugin: 5.2.5_webpack@5.64.1 + ts-loader: 9.2.6_typescript@4.2.4+webpack@5.64.1 + ts-node: 9.1.1_typescript@4.2.4 + tsconfig-paths: 3.11.0 + tsconfig-paths-webpack-plugin: 3.4.1 + tslib: 2.3.1 + webpack: 5.64.1 + webpack-dev-server: 4.5.0_webpack@5.64.1 + webpack-merge: 5.8.0 + webpack-sources: 3.2.2 + webpack-subresource-integrity: 1.5.2_webpack@5.64.1 + worker-plugin: 3.2.0_webpack@5.64.1 + transitivePeerDependencies: + - '@swc/core' + - '@types/babel__core' + - '@types/webpack' + - acorn + - bufferutil + - canvas + - clean-css + - csso + - cypress + - debug + - esbuild + - fibers + - html-webpack-plugin + - node-notifier + - node-sass + - prettier + - sockjs-client + - supports-color + - type-fest + - typescript + - uglify-js + - utf-8-validate + - webpack-cli + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + + /@nrwl/workspace/13.1.4_e369ab82b1fb00f8171cda4ee1f045dc: + resolution: {integrity: sha512-dQlxswf2XlMyEJBK4+fZHQTpxtevcWzDCVO9iLjuvL1XZDbDQG95+N7DsASq67qOxFAlpYWVxAVZAXIHsnX9tQ==} peerDependencies: prettier: ^2.3.0 + peerDependenciesMeta: + prettier: + optional: true dependencies: - '@nrwl/cli': 12.10.0 - '@nrwl/devkit': 12.10.0 - '@nrwl/jest': 12.10.0 - '@nrwl/linter': 12.10.0 + '@nrwl/cli': 13.1.4 + '@nrwl/devkit': 13.1.4 + '@nrwl/jest': 13.1.4_ts-node@9.1.1 + '@nrwl/linter': 13.1.4_ts-node@9.1.1 '@parcel/watcher': 2.0.0-alpha.11 chalk: 4.1.0 chokidar: 3.5.2 @@ -3061,7 +4559,50 @@ packages: flat: 5.0.2 fs-extra: 9.1.0 glob: 7.1.4 - ignore: 5.1.8 + ignore: 5.1.9 + minimatch: 3.0.4 + npm-run-all: 4.1.5 + npm-run-path: 4.0.1 + open: 7.4.2 + prettier: /wp-prettier/2.2.1-beta-1 + rxjs: 6.6.7 + semver: 7.3.4 + strip-ansi: 6.0.0 + tmp: 0.2.1 + tslib: 2.3.1 + yargs: 15.4.1 + yargs-parser: 20.0.0 + transitivePeerDependencies: + - bufferutil + - canvas + - node-notifier + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@nrwl/workspace/13.1.4_wp-prettier@2.2.1-beta-1: + resolution: {integrity: sha512-dQlxswf2XlMyEJBK4+fZHQTpxtevcWzDCVO9iLjuvL1XZDbDQG95+N7DsASq67qOxFAlpYWVxAVZAXIHsnX9tQ==} + peerDependencies: + prettier: ^2.3.0 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@nrwl/cli': 13.1.4 + '@nrwl/devkit': 13.1.4 + '@nrwl/jest': 13.1.4 + '@nrwl/linter': 13.1.4 + '@parcel/watcher': 2.0.0-alpha.11 + chalk: 4.1.0 + chokidar: 3.5.2 + cosmiconfig: 4.0.0 + dotenv: 10.0.0 + enquirer: 2.3.6 + flat: 5.0.2 + fs-extra: 9.1.0 + glob: 7.1.4 + ignore: 5.1.9 minimatch: 3.0.4 npm-run-all: 4.1.5 npm-run-path: 4.0.1 @@ -3092,6 +4633,134 @@ packages: node-gyp-build: 4.3.0 dev: true + /@pmmmwh/react-refresh-webpack-plugin/0.5.1_92cb4b81c6b9f71cf92f0bdb85e4210c: + resolution: {integrity: sha512-ccap6o7+y5L8cnvkZ9h8UXCGyy2DqtwCD+/N3Yru6lxMvcdkPKtdx13qd7sAC9s5qZktOmWf9lfUjsGOvSdYhg==} + engines: {node: '>= 10.13'} + peerDependencies: + '@types/webpack': 4.x || 5.x + react-refresh: ^0.10.0 + sockjs-client: ^1.4.0 + type-fest: '>=0.17.0 <3.0.0' + webpack: '>=4.43.0 <6.0.0' + webpack-dev-server: 3.x || 4.x + webpack-hot-middleware: 2.x + webpack-plugin-serve: 0.x || 1.x + peerDependenciesMeta: + '@types/webpack': + optional: true + sockjs-client: + optional: true + type-fest: + optional: true + webpack-dev-server: + optional: true + webpack-hot-middleware: + optional: true + webpack-plugin-serve: + optional: true + dependencies: + ansi-html-community: 0.0.8 + common-path-prefix: 3.0.0 + core-js-pure: 3.19.1 + error-stack-parser: 2.0.6 + find-up: 5.0.0 + html-entities: 2.3.2 + loader-utils: 2.0.2 + react-refresh: 0.10.0 + schema-utils: 3.1.1 + source-map: 0.7.3 + webpack: 5.64.1 + webpack-dev-server: 4.5.0_webpack@5.64.1 + dev: true + + /@rollup/plugin-babel/5.3.0_@babel+core@7.16.0+rollup@2.60.0: + resolution: {integrity: sha512-9uIC8HZOnVLrLHxayq/PTzw+uS25E14KPUBh5ktF+18Mjo5yK0ToMMx6epY0uEgkjwJw0aBW4x2horYXh8juWw==} + engines: {node: '>= 10.0.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/babel__core': ^7.1.9 + rollup: ^1.20.0||^2.0.0 + peerDependenciesMeta: + '@types/babel__core': + optional: true + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-module-imports': 7.16.0 + '@rollup/pluginutils': 3.1.0_rollup@2.60.0 + rollup: 2.60.0 + dev: true + + /@rollup/plugin-commonjs/20.0.0_rollup@2.60.0: + resolution: {integrity: sha512-5K0g5W2Ol8hAcTHqcTBHiA7M58tfmYi1o9KxeJuuRNpGaTa5iLjcyemBitCBcKXaHamOBBEH2dGom6v6Unmqjg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^2.38.3 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.60.0 + commondir: 1.0.1 + estree-walker: 2.0.2 + glob: 7.2.0 + is-reference: 1.2.1 + magic-string: 0.25.7 + resolve: 1.20.0 + rollup: 2.60.0 + dev: true + + /@rollup/plugin-image/2.1.1_rollup@2.60.0: + resolution: {integrity: sha512-AgP4U85zuQJdUopLUCM+hTf45RepgXeTb8EJsleExVy99dIoYpt3ZlDYJdKmAc2KLkNntCDg6BPJvgJU3uGF+g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.60.0 + mini-svg-data-uri: 1.4.3 + rollup: 2.60.0 + dev: true + + /@rollup/plugin-json/4.1.0_rollup@2.60.0: + resolution: {integrity: sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==} + peerDependencies: + rollup: ^1.20.0 || ^2.0.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.60.0 + rollup: 2.60.0 + dev: true + + /@rollup/plugin-node-resolve/13.0.6_rollup@2.60.0: + resolution: {integrity: sha512-sFsPDMPd4gMqnh2gS0uIxELnoRUp5kBl5knxD2EO0778G1oOJv4G1vyT2cpWz75OU2jDVcXhjVUuTAczGyFNKA==} + engines: {node: '>= 10.0.0'} + peerDependencies: + rollup: ^2.42.0 + dependencies: + '@rollup/pluginutils': 3.1.0_rollup@2.60.0 + '@types/resolve': 1.17.1 + builtin-modules: 3.2.0 + deepmerge: 4.2.2 + is-module: 1.0.0 + resolve: 1.20.0 + rollup: 2.60.0 + dev: true + + /@rollup/pluginutils/3.1.0_rollup@2.60.0: + resolution: {integrity: sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==} + engines: {node: '>= 8.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0 + dependencies: + '@types/estree': 0.0.39 + estree-walker: 1.0.1 + picomatch: 2.3.0 + rollup: 2.60.0 + dev: true + + /@rollup/pluginutils/4.1.1: + resolution: {integrity: sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.0 + dev: true + /@samverschueren/stream-to-observable/0.3.1_rxjs@6.6.7: resolution: {integrity: sha512-c/qwwcHyafOQuVQJj0IlBjf5yYgBI7YPJ77k4fOJYesb41jio65eaJODRUmfYKhTOFBrIZ66kgvGPlNbjuoRdQ==} engines: {node: '>=6'} @@ -3118,8 +4787,8 @@ packages: dependencies: '@sinonjs/commons': 1.8.3 - /@sinonjs/fake-timers/8.0.1: - resolution: {integrity: sha512-AU7kwFxreVd6OAXcAFlKSmZquiRUU0FvYm44k1Y1QbK7Co4m0aqfGMhjykIeQp/H6rcl+nFmj0zfdUcGVs9Dew==} + /@sinonjs/fake-timers/8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} dependencies: '@sinonjs/commons': 1.8.3 dev: true @@ -3238,11 +4907,16 @@ packages: engines: {node: '>= 6'} dev: true + /@trysound/sax/0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: true + /@types/babel__core/7.1.16: resolution: {integrity: sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==} dependencies: - '@babel/parser': 7.15.8 - '@babel/types': 7.15.6 + '@babel/parser': 7.16.4 + '@babel/types': 7.16.0 '@types/babel__generator': 7.6.3 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.14.2 @@ -3250,18 +4924,18 @@ packages: /@types/babel__generator/7.6.3: resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.15.8 - '@babel/types': 7.15.6 + '@babel/parser': 7.16.4 + '@babel/types': 7.16.0 /@types/babel__traverse/7.14.2: resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 /@types/cheerio/0.22.30: resolution: {integrity: sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==} @@ -3275,10 +4949,38 @@ packages: '@types/node': 16.10.3 dev: true + /@types/eslint-scope/3.7.1: + resolution: {integrity: sha512-SCFeogqiptms4Fg29WpOTk5nHIzfpKCemSN63ksBQYKTcXoJEmJagV+DhVmbapZzY4/5YaOV1nZwrsU79fFm1g==} + dependencies: + '@types/eslint': 7.29.0 + '@types/estree': 0.0.50 + dev: true + /@types/eslint-visitor-keys/1.0.0: resolution: {integrity: sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==} dev: true + /@types/eslint/7.29.0: + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + dependencies: + '@types/estree': 0.0.50 + '@types/json-schema': 7.0.9 + dev: true + + /@types/estree/0.0.39: + resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + dev: true + + /@types/estree/0.0.50: + resolution: {integrity: sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==} + dev: true + + /@types/fs-extra/8.1.2: + resolution: {integrity: sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==} + dependencies: + '@types/node': 16.10.3 + dev: true + /@types/glob/7.1.4: resolution: {integrity: sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==} dependencies: @@ -3286,11 +4988,24 @@ packages: '@types/node': 16.10.3 dev: true + /@types/glob/7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 3.0.5 + '@types/node': 16.10.3 + dev: true + /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: '@types/node': 16.10.3 + /@types/http-proxy/1.17.7: + resolution: {integrity: sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==} + dependencies: + '@types/node': 16.10.3 + dev: true + /@types/is-stream/1.1.0: resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} dependencies: @@ -3316,13 +5031,6 @@ packages: dependencies: '@types/istanbul-lib-report': 3.0.0 - /@types/jest/25.2.1: - resolution: {integrity: sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA==} - dependencies: - jest-diff: 25.5.0 - pretty-format: 25.5.0 - dev: true - /@types/jest/26.0.23: resolution: {integrity: sha512-ZHLmWMJ9jJ9PTiT58juykZpL7KjwJywFN3Rr2pTSkyQfydf/rk22yS7W8p5DaVUMQ2BQC7oYiU3FjbTM/mYrOA==} dependencies: @@ -3330,6 +5038,13 @@ packages: pretty-format: 26.6.2 dev: true + /@types/jest/27.0.2: + resolution: {integrity: sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==} + dependencies: + jest-diff: 27.3.1 + pretty-format: 27.3.1 + dev: true + /@types/json-schema/7.0.9: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} dev: true @@ -3356,14 +5071,6 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/moxios/0.4.12: - resolution: {integrity: sha512-/wi8KjB0Lj5sa6XvGToi89rNybR20fk3KmhPsX/g1JqC8f8I/C4Yd9QgU692ReqJprUoYEzQl9rElyhabhNY1g==} - dependencies: - axios: 0.21.2 - transitivePeerDependencies: - - debug - dev: true - /@types/node/13.13.5: resolution: {integrity: sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==} dev: true @@ -3385,8 +5092,8 @@ packages: /@types/prettier/1.19.1: resolution: {integrity: sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==} - /@types/prettier/2.4.1: - resolution: {integrity: sha512-Fo79ojj3vdEZOHg3wR9ksAMRz4P3S5fDB5e/YWZiFnyFQI1WY2Vftu9XoXVVtJfxB7Bpce/QTqWSSntkz2Znrw==} + /@types/prettier/2.4.2: + resolution: {integrity: sha512-ekoj4qOQYp7CvjX8ZDBgN86w3MqQhLE1hczEJbEIjgFEumDy+na/4AJAbLXfgEWFNB2pKadM5rPFtuSGMWK7xA==} dev: true /@types/prop-types/15.7.4: @@ -3396,25 +5103,34 @@ packages: /@types/react-dom/16.9.14: resolution: {integrity: sha512-FIX2AVmPTGP30OUJ+0vadeIFJJ07Mh1m+U0rxfgyW34p3rTlXI+nlenvAxNn4BP36YyI9IJ/+UJ7Wu22N1pI7A==} dependencies: - '@types/react': 16.14.17 + '@types/react': 16.14.21 dev: false - /@types/react/16.14.17: - resolution: {integrity: sha512-pMLc/7+7SEdQa9A+hN9ujI8blkjFqYAZVqh3iNXqdZ0cQ8TIR502HMkNJniaOGv9SAgc47jxVKoiBJ7c0AakvQ==} + /@types/react/16.14.21: + resolution: {integrity: sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==} dependencies: '@types/prop-types': 15.7.4 '@types/scheduler': 0.16.2 - csstype: 3.0.9 + csstype: 3.0.10 dev: false + /@types/resolve/1.17.1: + resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + dependencies: + '@types/node': 16.10.3 + dev: true + /@types/retry/0.12.1: resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} - dev: false /@types/scheduler/0.16.2: resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} dev: false + /@types/source-list-map/0.1.2: + resolution: {integrity: sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==} + dev: true + /@types/stack-utils/1.0.1: resolution: {integrity: sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==} @@ -3425,6 +5141,14 @@ packages: resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==} dev: true + /@types/webpack-sources/0.1.9: + resolution: {integrity: sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==} + dependencies: + '@types/node': 16.10.3 + '@types/source-list-map': 0.1.2 + source-map: 0.6.1 + dev: true + /@types/yargs-parser/20.2.1: resolution: {integrity: sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw==} @@ -3469,6 +5193,58 @@ packages: - supports-color dev: true + /@typescript-eslint/eslint-plugin/5.3.0_ef742ec0d85d332d26b421951e243e75: + resolution: {integrity: sha512-ARUEJHJrq85aaiCqez7SANeahDsJTD3AEua34EoQN9pHS6S5Bq9emcIaGGySt/4X2zSi+vF5hAH52sEen7IO7g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 5.3.0_eslint@8.1.0+typescript@4.2.4 + '@typescript-eslint/parser': 5.3.0_eslint@8.1.0+typescript@4.2.4 + '@typescript-eslint/scope-manager': 5.3.0 + debug: 4.3.2 + eslint: 8.1.0 + functional-red-black-tree: 1.0.1 + ignore: 5.1.8 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.2.4 + typescript: 4.2.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin/5.4.0_b983626bd16070d34b18187cb6bde052: + resolution: {integrity: sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/experimental-utils': 5.4.0_eslint@8.2.0+typescript@4.4.4 + '@typescript-eslint/parser': 5.4.0_eslint@8.2.0+typescript@4.4.4 + '@typescript-eslint/scope-manager': 5.4.0 + debug: 4.3.2 + eslint: 8.2.0 + functional-red-black-tree: 1.0.1 + ignore: 5.1.9 + regexpp: 3.2.0 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/experimental-utils/2.34.0_eslint@6.8.0+typescript@3.9.7: resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3485,7 +5261,7 @@ packages: - typescript dev: true - /@typescript-eslint/experimental-utils/2.34.0_typescript@4.2.4: + /@typescript-eslint/experimental-utils/2.34.0_eslint@8.1.0+typescript@4.2.4: resolution: {integrity: sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} peerDependencies: @@ -3493,6 +5269,7 @@ packages: dependencies: '@types/json-schema': 7.0.9 '@typescript-eslint/typescript-estree': 2.34.0_typescript@4.2.4 + eslint: 8.1.0 eslint-scope: 5.1.1 eslint-utils: 2.1.0 transitivePeerDependencies: @@ -3552,6 +5329,42 @@ packages: - typescript dev: true + /@typescript-eslint/experimental-utils/5.3.0_eslint@8.1.0+typescript@4.2.4: + resolution: {integrity: sha512-NFVxYTjKj69qB0FM+piah1x3G/63WB8vCBMnlnEHUsiLzXSTWb9FmFn36FD9Zb4APKBLY3xRArOGSMQkuzTF1w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 5.3.0 + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/typescript-estree': 5.3.0_typescript@4.2.4 + eslint: 8.1.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.1.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/experimental-utils/5.4.0_eslint@8.2.0+typescript@4.4.4: + resolution: {integrity: sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + dependencies: + '@types/json-schema': 7.0.9 + '@typescript-eslint/scope-manager': 5.4.0 + '@typescript-eslint/types': 5.4.0 + '@typescript-eslint/typescript-estree': 5.4.0_typescript@4.4.4 + eslint: 8.2.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.2.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/parser/3.10.1_eslint@6.8.0+typescript@3.9.7: resolution: {integrity: sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -3593,6 +5406,46 @@ packages: - supports-color dev: true + /@typescript-eslint/parser/5.3.0_eslint@8.1.0+typescript@4.2.4: + resolution: {integrity: sha512-rKu/yAReip7ovx8UwOAszJVO5MgBquo8WjIQcp1gx4pYQCwYzag+I5nVNHO4MqyMkAo0gWt2gWUi+36gWAVKcw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.3.0 + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/typescript-estree': 5.3.0_typescript@4.2.4 + debug: 4.3.2 + eslint: 8.1.0 + typescript: 4.2.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.4.0_eslint@8.2.0+typescript@4.4.4: + resolution: {integrity: sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.4.0 + '@typescript-eslint/types': 5.4.0 + '@typescript-eslint/typescript-estree': 5.4.0_typescript@4.4.4 + debug: 4.3.2 + eslint: 8.2.0 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/scope-manager/4.33.0: resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3601,6 +5454,22 @@ packages: '@typescript-eslint/visitor-keys': 4.33.0 dev: true + /@typescript-eslint/scope-manager/5.3.0: + resolution: {integrity: sha512-22Uic9oRlTsPppy5Tcwfj+QET5RWEnZ5414Prby465XxQrQFZ6nnm5KnXgnsAJefG4hEgMnaxTB3kNEyjdjj6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/visitor-keys': 5.3.0 + dev: true + + /@typescript-eslint/scope-manager/5.4.0: + resolution: {integrity: sha512-pRxFjYwoi8R+n+sibjgF9iUiAELU9ihPBtHzocyW8v8D8G8KeQvXTsW7+CBYIyTYsmhtNk50QPGLE3vrvhM5KA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.4.0 + '@typescript-eslint/visitor-keys': 5.4.0 + dev: true + /@typescript-eslint/types/3.10.1: resolution: {integrity: sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3611,6 +5480,16 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} dev: true + /@typescript-eslint/types/5.3.0: + resolution: {integrity: sha512-fce5pG41/w8O6ahQEhXmMV+xuh4+GayzqEogN24EK+vECA3I6pUwKuLi5QbXO721EMitpQne5VKXofPonYlAQg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/types/5.4.0: + resolution: {integrity: sha512-GjXNpmn+n1LvnttarX+sPD6+S7giO+9LxDIGlRl4wK3a7qMWALOHYuVSZpPTfEIklYjaWuMtfKdeByx0AcaThA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@typescript-eslint/typescript-estree/2.34.0_typescript@3.9.7: resolution: {integrity: sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3718,6 +5597,48 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree/5.3.0_typescript@4.2.4: + resolution: {integrity: sha512-FJ0nqcaUOpn/6Z4Jwbtf+o0valjBLkqc3MWkMvrhA2TvzFXtcclIM8F4MBEmYa2kgcI8EZeSAzwoSrIC8JYkug==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.3.0 + '@typescript-eslint/visitor-keys': 5.3.0 + debug: 4.3.2 + globby: 11.0.4 + is-glob: 4.0.3 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.2.4 + typescript: 4.2.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/typescript-estree/5.4.0_typescript@4.4.4: + resolution: {integrity: sha512-nhlNoBdhKuwiLMx6GrybPT3SFILm5Gij2YBdPEPFlYNFAXUJWX6QRgvi/lwVoadaQEFsizohs6aFRMqsXI2ewA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.4.0 + '@typescript-eslint/visitor-keys': 5.4.0 + debug: 4.3.2 + globby: 11.0.4 + is-glob: 4.0.3 + semver: 7.3.5 + tsutils: 3.21.0_typescript@4.4.4 + typescript: 4.4.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/visitor-keys/3.10.1: resolution: {integrity: sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -3733,6 +5654,29 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /@typescript-eslint/visitor-keys/5.3.0: + resolution: {integrity: sha512-oVIAfIQuq0x2TFDNLVavUn548WL+7hdhxYn+9j3YdJJXB7mH9dAmZNJsPDa7Jc+B9WGqoiex7GUDbyMxV0a/aw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.3.0 + eslint-visitor-keys: 3.0.0 + dev: true + + /@typescript-eslint/visitor-keys/5.4.0: + resolution: {integrity: sha512-PVbax7MeE7tdLfW5SA0fs8NGVVr+buMPrcj+CWYWPXsZCH8qZ1THufDzbXm1xrZ2b2PA1iENJ0sRq5fuUtvsJg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.4.0 + eslint-visitor-keys: 3.0.0 + dev: true + + /@webassemblyjs/ast/1.11.1: + resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + dev: true + /@webassemblyjs/ast/1.9.0: resolution: {integrity: sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==} dependencies: @@ -3741,14 +5685,26 @@ packages: '@webassemblyjs/wast-parser': 1.9.0 dev: true + /@webassemblyjs/floating-point-hex-parser/1.11.1: + resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + dev: true + /@webassemblyjs/floating-point-hex-parser/1.9.0: resolution: {integrity: sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==} dev: true + /@webassemblyjs/helper-api-error/1.11.1: + resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + dev: true + /@webassemblyjs/helper-api-error/1.9.0: resolution: {integrity: sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==} dev: true + /@webassemblyjs/helper-buffer/1.11.1: + resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + dev: true + /@webassemblyjs/helper-buffer/1.9.0: resolution: {integrity: sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==} dev: true @@ -3769,10 +5725,31 @@ packages: '@webassemblyjs/ast': 1.9.0 dev: true + /@webassemblyjs/helper-numbers/1.11.1: + resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode/1.11.1: + resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + dev: true + /@webassemblyjs/helper-wasm-bytecode/1.9.0: resolution: {integrity: sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==} dev: true + /@webassemblyjs/helper-wasm-section/1.11.1: + resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + dev: true + /@webassemblyjs/helper-wasm-section/1.9.0: resolution: {integrity: sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==} dependencies: @@ -3782,22 +5759,51 @@ packages: '@webassemblyjs/wasm-gen': 1.9.0 dev: true + /@webassemblyjs/ieee754/1.11.1: + resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + /@webassemblyjs/ieee754/1.9.0: resolution: {integrity: sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==} dependencies: '@xtuc/ieee754': 1.2.0 dev: true + /@webassemblyjs/leb128/1.11.1: + resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + /@webassemblyjs/leb128/1.9.0: resolution: {integrity: sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==} dependencies: '@xtuc/long': 4.2.2 dev: true + /@webassemblyjs/utf8/1.11.1: + resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + dev: true + /@webassemblyjs/utf8/1.9.0: resolution: {integrity: sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==} dev: true + /@webassemblyjs/wasm-edit/1.11.1: + resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-wasm-section': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-opt': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/wast-printer': 1.11.1 + dev: true + /@webassemblyjs/wasm-edit/1.9.0: resolution: {integrity: sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==} dependencies: @@ -3811,6 +5817,16 @@ packages: '@webassemblyjs/wast-printer': 1.9.0 dev: true + /@webassemblyjs/wasm-gen/1.11.1: + resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + /@webassemblyjs/wasm-gen/1.9.0: resolution: {integrity: sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==} dependencies: @@ -3821,6 +5837,15 @@ packages: '@webassemblyjs/utf8': 1.9.0 dev: true + /@webassemblyjs/wasm-opt/1.11.1: + resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + dev: true + /@webassemblyjs/wasm-opt/1.9.0: resolution: {integrity: sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==} dependencies: @@ -3830,6 +5855,17 @@ packages: '@webassemblyjs/wasm-parser': 1.9.0 dev: true + /@webassemblyjs/wasm-parser/1.11.1: + resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + dev: true + /@webassemblyjs/wasm-parser/1.9.0: resolution: {integrity: sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==} dependencies: @@ -3852,6 +5888,13 @@ packages: '@xtuc/long': 4.2.2 dev: true + /@webassemblyjs/wast-printer/1.11.1: + resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@xtuc/long': 4.2.2 + dev: true + /@webassemblyjs/wast-printer/1.9.0: resolution: {integrity: sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==} dependencies: @@ -3878,7 +5921,7 @@ packages: '@typescript-eslint/parser': 4.33.0_eslint@7.32.0+typescript@4.2.4 '@wordpress/eslint-plugin': 8.0.2_eslint@7.32.0+typescript@4.2.4 eslint: 7.32.0 - eslint-plugin-react-hooks: 4.2.0_eslint@7.32.0 + eslint-plugin-react-hooks: 4.3.0_eslint@7.32.0 eslint-plugin-testing-library: 3.10.2_eslint@7.32.0+typescript@4.2.4 requireindex: 1.2.0 typescript: 4.2.4 @@ -3905,13 +5948,13 @@ packages: '@babel/core': 7.12.9 dev: false - /@wordpress/babel-plugin-import-jsx-pragma/3.1.0_@babel+core@7.15.8: + /@wordpress/babel-plugin-import-jsx-pragma/3.1.0_@babel+core@7.16.0: resolution: {integrity: sha512-518mL3goaSeXtJCQcPK9OYHUUiA0sjXuoGWHBwRalkyTIQZZy5ZZzlwrlSc9ESZcOw9BZ+Uo8CJRjV2OWnx+Zw==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.12.9 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 dev: false /@wordpress/babel-preset-default/3.0.2: @@ -3931,22 +5974,22 @@ packages: - supports-color dev: true - /@wordpress/babel-preset-default/6.3.3: - resolution: {integrity: sha512-sMP7LgBmYaF5Cz+FZ4EXS5Qu4Tecv3JFIYEVbPLmn+/AIA+fzrEELn2BuEcHmd0q7VogAAmhU1iw2Fndj29bgw==} + /@wordpress/babel-preset-default/6.4.1: + resolution: {integrity: sha512-T0+dPOn0Hus/FSP043H3C2awjGNWLJcSahm7LhLqT5uUtgdg6QD9yf4jSr7G5mpLO/DXgz2ZnaYMUj+d1/gk9w==} engines: {node: '>=12'} dependencies: - '@babel/core': 7.15.8 - '@babel/plugin-transform-react-jsx': 7.14.9_@babel+core@7.15.8 - '@babel/plugin-transform-runtime': 7.15.8_@babel+core@7.15.8 - '@babel/preset-env': 7.15.8_@babel+core@7.15.8 - '@babel/preset-typescript': 7.15.0_@babel+core@7.15.8 - '@babel/runtime': 7.15.4 - '@wordpress/babel-plugin-import-jsx-pragma': 3.1.0_@babel+core@7.15.8 + '@babel/core': 7.16.0 + '@babel/plugin-transform-react-jsx': 7.16.0_@babel+core@7.16.0 + '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.16.0 + '@babel/preset-env': 7.16.4_@babel+core@7.16.0 + '@babel/preset-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/runtime': 7.16.3 + '@wordpress/babel-plugin-import-jsx-pragma': 3.1.0_@babel+core@7.16.0 '@wordpress/browserslist-config': 4.1.0 - '@wordpress/element': 4.0.2 + '@wordpress/element': 4.0.4 '@wordpress/warning': 2.2.2 - browserslist: 4.17.3 - core-js: 3.18.3 + browserslist: 4.18.1 + core-js: 3.19.1 transitivePeerDependencies: - supports-color dev: false @@ -3975,7 +6018,7 @@ packages: jest: '>=24' puppeteer: '>=1.19.0' dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 '@wordpress/keycodes': 2.19.3 '@wordpress/url': 2.22.2 jest: 24.9.0 @@ -4003,7 +6046,7 @@ packages: - react-native dev: false - /@wordpress/e2e-test-utils/4.16.1_jest@27.2.4: + /@wordpress/e2e-test-utils/4.16.1_jest@27.3.1: resolution: {integrity: sha512-Dpsq5m0VSvjIhro2MjACSzkOkOf1jGEryzgEMW1ikbT6YI+motspHfGtisKXgYhZJOnjV4PwuEg+9lPVnd971g==} engines: {node: '>=8'} peerDependencies: @@ -4013,31 +6056,31 @@ packages: '@babel/runtime': 7.15.4 '@wordpress/keycodes': 2.19.3 '@wordpress/url': 2.22.2 - jest: 27.2.4 + jest: 27.3.1 lodash: 4.17.21 node-fetch: 2.6.5 transitivePeerDependencies: - react-native dev: false - /@wordpress/element/4.0.2: - resolution: {integrity: sha512-qBNpkLb7Hh3r9aSwBOBMwRUevScbN5iR1M5B8/ZOuSZbeXYNcgWxX4WqVrt5Y52CNm8WwoQTdqcuIziNN6lhig==} + /@wordpress/element/4.0.4: + resolution: {integrity: sha512-GbYVSZrHitOmupQCjb7cSlewVigXHorpZUBpvWnkU3rhyh1tF/N9qve3fgg7Q3s2szjtTP+eEutB+4mmkwHQOA==} engines: {node: '>=12'} dependencies: - '@babel/runtime': 7.15.4 - '@types/react': 16.14.17 + '@babel/runtime': 7.16.3 + '@types/react': 16.14.21 '@types/react-dom': 16.9.14 - '@wordpress/escape-html': 2.2.2 + '@wordpress/escape-html': 2.2.3 lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 dev: false - /@wordpress/escape-html/2.2.2: - resolution: {integrity: sha512-NuPury2dyaqF7zpDaUOKaoM0FrEuqaDE1c3j7rM6kceJ4ZFDHnCLf5NivwchOLo7Xs0oVtqBdDza/dcSQaLFGg==} + /@wordpress/escape-html/2.2.3: + resolution: {integrity: sha512-nYIwT8WzHfAzjjwHLiwDQWrzn4/gUNr5zud465XQszM2cAItN2wnC26/ovSpPomDGkvjcG0YltgnSqc1T62olA==} engines: {node: '>=12'} dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 dev: false /@wordpress/eslint-plugin/7.3.0_eslint@6.8.0+typescript@3.9.7: @@ -4064,21 +6107,22 @@ packages: - typescript dev: true - /@wordpress/eslint-plugin/7.3.0_typescript@4.2.4: + /@wordpress/eslint-plugin/7.3.0_eslint@8.1.0+typescript@4.2.4: resolution: {integrity: sha512-7wIFzzc14E1XuuT9haBuhoA9FRUGWlbD4Oek+XkiZlzNVqZI3slgbtIFJ6/Mfij1V18rv6Ns9a1cPJLtCU8JHQ==} peerDependencies: eslint: ^6 || ^7 dependencies: '@wordpress/prettier-config': 0.4.0 - babel-eslint: 10.1.0 + babel-eslint: 10.1.0_eslint@8.1.0 cosmiconfig: 7.0.1 - eslint-config-prettier: 6.15.0 - eslint-plugin-jest: 23.20.0_typescript@4.2.4 - eslint-plugin-jsdoc: 30.7.13 - eslint-plugin-jsx-a11y: 6.4.1 - eslint-plugin-prettier: 3.4.1_f5d47c57aba0303a274284ebffad65f7 - eslint-plugin-react: 7.26.1 - eslint-plugin-react-hooks: 4.2.0 + eslint: 8.1.0 + eslint-config-prettier: 6.15.0_eslint@8.1.0 + eslint-plugin-jest: 23.20.0_eslint@8.1.0+typescript@4.2.4 + eslint-plugin-jsdoc: 30.7.13_eslint@8.1.0 + eslint-plugin-jsx-a11y: 6.4.1_eslint@8.1.0 + eslint-plugin-prettier: 3.4.1_0ee224e0723ebb336792c58a54fe2b48 + eslint-plugin-react: 7.26.1_eslint@8.1.0 + eslint-plugin-react-hooks: 4.2.0_eslint@8.1.0 globals: 12.4.0 prettier: /wp-prettier/2.0.5 requireindex: 1.2.0 @@ -4098,13 +6142,13 @@ packages: cosmiconfig: 7.0.1 eslint: 7.32.0 eslint-config-prettier: 7.2.0_eslint@7.32.0 - eslint-plugin-import: 2.24.2_eslint@7.32.0 - eslint-plugin-jest: 24.5.2_eslint@7.32.0+typescript@4.2.4 + eslint-plugin-import: 2.25.3_eslint@7.32.0 + eslint-plugin-jest: 24.7.0_eslint@7.32.0+typescript@4.2.4 eslint-plugin-jsdoc: 30.7.13_eslint@7.32.0 - eslint-plugin-jsx-a11y: 6.4.1_eslint@7.32.0 + eslint-plugin-jsx-a11y: 6.5.1_eslint@7.32.0 eslint-plugin-prettier: 3.4.1_34b707f3a53b0942f3919c1ff656ce36 - eslint-plugin-react: 7.26.1_eslint@7.32.0 - eslint-plugin-react-hooks: 4.2.0_eslint@7.32.0 + eslint-plugin-react: 7.27.0_eslint@7.32.0 + eslint-plugin-react-hooks: 4.3.0_eslint@7.32.0 globals: 12.4.0 prettier: /wp-prettier/2.2.1-beta-1 requireindex: 1.2.0 @@ -4117,14 +6161,14 @@ packages: /@wordpress/hooks/2.12.3: resolution: {integrity: sha512-LmKiwKldZt6UYqOxV/a6+eUFXdvALFnB/pQx3RmrMvO64sgFhfR6dhrlv+uVbuuezSuv8dce1jx8lUWAT0krMA==} dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 dev: false /@wordpress/i18n/3.20.0: resolution: {integrity: sha512-SIoOJFB4UrrYAScS4H91CYCLW9dX3Ghv8pBKc/yHGculb1AdGr6gRMlmJxZV62Cn3CZ4Ga86c+FfR+GiBu0JPg==} hasBin: true dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 '@wordpress/hooks': 2.12.3 gettext-parser: 1.4.0 lodash: 4.17.21 @@ -4139,7 +6183,7 @@ packages: peerDependencies: jest: '>=24' dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 jest: 25.5.4 jest-matcher-utils: 25.5.0 lodash: 4.17.21 @@ -4168,7 +6212,7 @@ packages: /@wordpress/keycodes/2.19.3: resolution: {integrity: sha512-8rNdmP5M1ifTgLIL0dt/N1uTGsq/Rx1ydCXy+gg24WdxBRhyu5sudNVCtascVXo26aIfOH9OJRdqRZZTEORhog==} dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 '@wordpress/i18n': 3.20.0 lodash: 4.17.21 dev: false @@ -4186,7 +6230,7 @@ packages: /@wordpress/url/2.22.2: resolution: {integrity: sha512-aqpYKQXzyzkCOm+GzZRYlLb+wh58g0cwR1PaKAl0UXaBS4mdS+X6biMriylb4P8CVC/RR7CSw5XI20JC24KDwQ==} dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 lodash: 4.17.21 react-native-url-polyfill: 1.3.0 transitivePeerDependencies: @@ -4217,6 +6261,14 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: true + /accepts/1.3.7: + resolution: {integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.34 + negotiator: 0.6.2 + dev: true + /acorn-globals/4.3.4: resolution: {integrity: sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==} dependencies: @@ -4230,6 +6282,14 @@ packages: acorn-walk: 7.2.0 dev: true + /acorn-import-assertions/1.8.0_acorn@8.5.0: + resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.5.0 + dev: true + /acorn-jsx/5.3.2_acorn@6.4.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -4245,6 +6305,14 @@ packages: dependencies: acorn: 7.4.1 + /acorn-jsx/5.3.2_acorn@8.5.0: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.5.0 + dev: true + /acorn-walk/6.2.0: resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} engines: {node: '>=0.4.0'} @@ -4354,6 +6422,19 @@ packages: uri-js: 4.4.1 dev: true + /ajv/8.8.1: + resolution: {integrity: sha512-6CiMNDrzv0ZR916u2T+iRunnD60uWmNn8SkdB44/6stVORUg0aAkWO7PkOhpCmjmW8f2I/G/xnowD66fxGyQJg==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: true + + /alphanum-sort/1.0.2: + resolution: {integrity: sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=} + dev: true + /amdefine/1.0.1: resolution: {integrity: sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=} engines: {node: '>=0.4.2'} @@ -4385,6 +6466,12 @@ packages: dependencies: type-fest: 0.21.3 + /ansi-html-community/0.0.8: + resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} + engines: {'0': node >= 0.8.0} + hasBin: true + dev: true + /ansi-regex/2.1.1: resolution: {integrity: sha1-w7M6te42DYbg5ijwRorn7yfWVN8=} engines: {node: '>=0.10.0'} @@ -4402,6 +6489,11 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + /ansi-regex/6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + /ansi-styles/2.2.1: resolution: {integrity: sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=} engines: {node: '>=0.10.0'} @@ -4465,17 +6557,25 @@ packages: readable-stream: 2.3.7 dev: true + /arg/4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + /argparse/1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 + /argparse/2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + /aria-query/4.2.2: resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==} engines: {node: '>=6.0'} dependencies: - '@babel/runtime': 7.15.4 - '@babel/runtime-corejs3': 7.15.4 + '@babel/runtime': 7.16.3 + '@babel/runtime-corejs3': 7.16.3 dev: true /arr-diff/4.0.0: @@ -4503,6 +6603,14 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-flatten/1.1.1: + resolution: {integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=} + dev: true + + /array-flatten/2.1.2: + resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==} + dev: true + /array-includes/3.1.4: resolution: {integrity: sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==} engines: {node: '>= 0.4'} @@ -4578,8 +6686,8 @@ packages: safer-buffer: 2.1.2 dev: true - /asn1/0.2.4: - resolution: {integrity: sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==} + /asn1/0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} dependencies: safer-buffer: 2.1.2 @@ -4657,6 +6765,22 @@ packages: engines: {node: '>= 4.5.0'} hasBin: true + /autoprefixer/10.4.0_postcss@8.3.0: + resolution: {integrity: sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.18.1 + caniuse-lite: 1.0.30001280 + fraction.js: 4.1.2 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + /autoprefixer/9.8.6: resolution: {integrity: sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==} hasBin: true @@ -4681,17 +6805,34 @@ packages: engines: {node: '>=4'} dev: true - /axios/0.21.2: - resolution: {integrity: sha512-87otirqUw3e8CzHTMO+/9kh/FSgXt/eVDvipijwDtEuwbkySWZ9SBm6VEubmJ/kLKEoLQV/POhxXFb66bfekfg==} + /axe-core/4.3.5: + resolution: {integrity: sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==} + engines: {node: '>=4'} + dev: true + + /axios-mock-adapter/1.20.0_axios@0.24.0: + resolution: {integrity: sha512-shZRhTjLP0WWdcvHKf3rH3iW9deb3UdKbdnKUoHmmsnBhVXN3sjPJM6ZvQ2r/ywgvBVQrMnjrSyQab60G1sr2w==} + peerDependencies: + axios: '>= 0.9.0' dependencies: - follow-redirects: 1.14.4 - transitivePeerDependencies: - - debug + axios: 0.24.0 + fast-deep-equal: 3.1.3 + is-blob: 2.1.0 + is-buffer: 2.0.5 + dev: true /axios/0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.14.4 + follow-redirects: 1.14.5 + transitivePeerDependencies: + - debug + dev: false + + /axios/0.24.0: + resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} + dependencies: + follow-redirects: 1.14.5 transitivePeerDependencies: - debug dev: false @@ -4716,23 +6857,6 @@ packages: '@babel/core': 7.15.8 dev: true - /babel-eslint/10.1.0: - resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} - engines: {node: '>=6'} - deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. - peerDependencies: - eslint: '>= 4.12.1' - dependencies: - '@babel/code-frame': 7.15.8 - '@babel/parser': 7.15.8 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 - eslint-visitor-keys: 1.3.0 - resolve: 1.20.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-eslint/10.1.0_eslint@6.8.0: resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} engines: {node: '>=6'} @@ -4769,6 +6893,24 @@ packages: - supports-color dev: true + /babel-eslint/10.1.0_eslint@8.1.0: + resolution: {integrity: sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==} + engines: {node: '>=6'} + deprecated: babel-eslint is now @babel/eslint-parser. This package will no longer receive updates. + peerDependencies: + eslint: '>= 4.12.1' + dependencies: + '@babel/code-frame': 7.15.8 + '@babel/parser': 7.15.8 + '@babel/traverse': 7.15.4 + '@babel/types': 7.15.6 + eslint: 8.1.0 + eslint-visitor-keys: 1.3.0 + resolve: 1.20.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-generator/6.26.1: resolution: {integrity: sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==} dependencies: @@ -4782,18 +6924,18 @@ packages: trim-right: 1.0.1 dev: true - /babel-jest/24.9.0_@babel+core@7.15.8: + /babel-jest/24.9.0_@babel+core@7.16.0: resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} engines: {node: '>= 6'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@jest/transform': 24.9.0 '@jest/types': 24.9.0 '@types/babel__core': 7.1.16 babel-plugin-istanbul: 5.2.0 - babel-preset-jest: 24.9.0_@babel+core@7.15.8 + babel-preset-jest: 24.9.0_@babel+core@7.16.0 chalk: 2.4.2 slash: 2.0.0 transitivePeerDependencies: @@ -4810,7 +6952,7 @@ packages: '@jest/transform': 25.5.1 '@jest/types': 25.5.0 '@types/babel__core': 7.1.16 - babel-plugin-istanbul: 6.0.0 + babel-plugin-istanbul: 6.1.1 babel-preset-jest: 25.5.0_@babel+core@7.12.9 chalk: 3.0.0 graceful-fs: 4.2.8 @@ -4829,7 +6971,7 @@ packages: '@jest/transform': 25.5.1 '@jest/types': 25.5.0 '@types/babel__core': 7.1.16 - babel-plugin-istanbul: 6.0.0 + babel-plugin-istanbul: 6.1.1 babel-preset-jest: 25.5.0_@babel+core@7.15.8 chalk: 3.0.0 graceful-fs: 4.2.8 @@ -4837,18 +6979,18 @@ packages: transitivePeerDependencies: - supports-color - /babel-jest/27.2.4_@babel+core@7.15.8: - resolution: {integrity: sha512-f24OmxyWymk5jfgLdlCMu4fTs4ldxFBIdn5sJdhvGC1m08rSkJ5hYbWkNmfBSvE/DjhCVNSHXepxsI6THGfGsg==} + /babel-jest/27.3.1_@babel+core@7.16.0: + resolution: {integrity: sha512-SjIF8hh/ir0peae2D6S6ZKRhUy7q/DnpH7k/V6fT4Bgs/LXXUztOpX4G2tCgq8mLo5HA9mN6NmlFMeYtKmIsTQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.15.8 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@babel/core': 7.16.0 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 '@types/babel__core': 7.1.16 - babel-plugin-istanbul: 6.0.0 - babel-preset-jest: 27.2.0_@babel+core@7.15.8 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.2.0_@babel+core@7.16.0 chalk: 4.1.2 graceful-fs: 4.2.8 slash: 3.0.0 @@ -4856,12 +6998,40 @@ packages: - supports-color dev: true + /babel-loader/8.2.3_fda98f9ff70e0481a7d2271d8792a29b: + resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.16.0 + find-cache-dir: 3.3.2 + loader-utils: 1.4.0 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.64.1 + dev: true + /babel-messages/6.23.0: resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} dependencies: babel-runtime: 6.26.0 dev: true + /babel-plugin-const-enum/1.2.0_@babel+core@7.16.0: + resolution: {integrity: sha512-o1m/6iyyFnp9MRsK1dHF3bneqyf3AlM2q3A/YbgQr2pCat6B6XJVDv2TXqzfY2RYUi4mak6WAksSBPlyYGx9dg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + '@babel/plugin-syntax-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/traverse': 7.16.3 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-dynamic-import-node/2.3.3: resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} dependencies: @@ -4891,6 +7061,18 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-istanbul/6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.1.0 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + /babel-plugin-jest-hoist/24.9.0: resolution: {integrity: sha512-2EMA2P8Vp7lG0RAzr4HXqtYwacfMErOuv1U3wrvxHX6rD1sV6xS3WXG3r8TRQ2r6w8OhvSdWt+z41hQNwNm3Xw==} engines: {node: '>= 6'} @@ -4902,20 +7084,28 @@ packages: resolution: {integrity: sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==} engines: {node: '>= 8.3'} dependencies: - '@babel/template': 7.15.4 - '@babel/types': 7.15.6 + '@babel/template': 7.16.0 + '@babel/types': 7.16.0 '@types/babel__traverse': 7.14.2 /babel-plugin-jest-hoist/27.2.0: resolution: {integrity: sha512-TOux9khNKdi64mW+0OIhcmbAn75tTlzKhxmiNXevQaPbrBYK7YKjP1jl6NHTJ6XR5UgUrJbCnWlKVnJn29dfjw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.15.4 - '@babel/types': 7.15.6 + '@babel/template': 7.16.0 + '@babel/types': 7.16.0 '@types/babel__core': 7.1.16 '@types/babel__traverse': 7.14.2 dev: true + /babel-plugin-macros/2.8.0: + resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} + dependencies: + '@babel/runtime': 7.16.3 + cosmiconfig: 6.0.0 + resolve: 1.20.0 + dev: true + /babel-plugin-polyfill-corejs2/0.2.2_@babel+core@7.15.8: resolution: {integrity: sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==} peerDependencies: @@ -4927,6 +7117,19 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true + + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.16.0: + resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.16.4 + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /babel-plugin-polyfill-corejs3/0.2.5_@babel+core@7.15.8: resolution: {integrity: sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==} @@ -4938,6 +7141,18 @@ packages: core-js-compat: 3.18.3 transitivePeerDependencies: - supports-color + dev: true + + /babel-plugin-polyfill-corejs3/0.4.0_@babel+core@7.16.0: + resolution: {integrity: sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.0 + core-js-compat: 3.19.1 + transitivePeerDependencies: + - supports-color /babel-plugin-polyfill-regenerator/0.2.2_@babel+core@7.15.8: resolution: {integrity: sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==} @@ -4948,6 +7163,27 @@ packages: '@babel/helper-define-polyfill-provider': 0.2.3_@babel+core@7.15.8 transitivePeerDependencies: - supports-color + dev: true + + /babel-plugin-polyfill-regenerator/0.3.0_@babel+core@7.16.0: + resolution: {integrity: sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.0 + '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.0 + transitivePeerDependencies: + - supports-color + + /babel-plugin-transform-async-to-promises/0.8.15: + resolution: {integrity: sha512-fDXP68ZqcinZO2WCiimCL9zhGjGXOnn3D33zvbh+yheZ/qOrNVVDDIBtAaM3Faz8TRvQzHiRKsu3hfrBAhEncQ==} + dev: true + + /babel-plugin-transform-typescript-metadata/0.3.2: + resolution: {integrity: sha512-mWEvCQTgXQf48yDqgN7CH50waTyYBeP2Lpqx4nNWab9sxEpdXVeKgfj1qYI2/TgUPQtNFZ85i3PemRtnXVYYJg==} + dependencies: + '@babel/helper-plugin-utils': 7.14.5 + dev: true /babel-preset-current-node-syntax/0.1.4_@babel+core@7.12.9: resolution: {integrity: sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==} @@ -4986,34 +7222,34 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.15.8 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.15.8 - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.15.8: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.16.0: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.15.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.15.8 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.15.8 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.15.8 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.15.8 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.15.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.15.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.15.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.15.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.15.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.15.8 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.15.8 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.15.8 + '@babel/core': 7.16.0 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.0 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.0 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.0 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.0 dev: true - /babel-preset-jest/24.9.0_@babel+core@7.15.8: + /babel-preset-jest/24.9.0_@babel+core@7.16.0: resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} engines: {node: '>= 6'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.15.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.15.8 + '@babel/core': 7.16.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.0 babel-plugin-jest-hoist: 24.9.0 dev: false @@ -5038,15 +7274,15 @@ packages: babel-plugin-jest-hoist: 25.5.0 babel-preset-current-node-syntax: 0.1.4_@babel+core@7.15.8 - /babel-preset-jest/27.2.0_@babel+core@7.15.8: + /babel-preset-jest/27.2.0_@babel+core@7.16.0: resolution: {integrity: sha512-z7MgQ3peBwN5L5aCqBKnF6iqdlvZvFUQynEhu0J+X9nHLU72jO3iY331lcYrg+AssJ8q7xsv5/3AICzVmJ/wvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 babel-plugin-jest-hoist: 27.2.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.15.8 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.0 dev: true /babel-runtime/6.26.0: @@ -5120,6 +7356,15 @@ packages: /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + /basic-auth/1.1.0: + resolution: {integrity: sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=} + engines: {node: '>= 0.6'} + dev: true + + /batch/0.6.1: + resolution: {integrity: sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=} + dev: true + /bcrypt-pbkdf/1.0.2: resolution: {integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=} dependencies: @@ -5162,6 +7407,22 @@ packages: resolution: {integrity: sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==} dev: true + /body-parser/1.19.0: + resolution: {integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + content-type: 1.0.4 + debug: 2.6.9 + depd: 1.1.2 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + on-finished: 2.3.0 + qs: 6.7.0 + raw-body: 2.4.0 + type-is: 1.6.18 + dev: true + /body/5.1.0: resolution: {integrity: sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=} dependencies: @@ -5171,9 +7432,19 @@ packages: safe-json-parse: 1.0.1 dev: true + /bonjour/3.5.0: + resolution: {integrity: sha1-jokKGD2O6aI5OzhExpGkK897yfU=} + dependencies: + array-flatten: 2.1.2 + deep-equal: 1.1.1 + dns-equal: 1.0.0 + dns-txt: 2.0.2 + multicast-dns: 6.2.3 + multicast-dns-service-types: 1.1.0 + dev: true + /boolbase/1.0.0: resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} - dev: false /boxen/1.3.0: resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} @@ -5291,11 +7562,34 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001265 - electron-to-chromium: 1.3.861 + caniuse-lite: 1.0.30001278 + electron-to-chromium: 1.3.889 escalade: 3.1.1 node-releases: 1.1.77 picocolors: 0.2.1 + dev: true + + /browserslist/4.17.6: + resolution: {integrity: sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001278 + electron-to-chromium: 1.3.889 + escalade: 3.1.1 + node-releases: 2.0.1 + picocolors: 1.0.0 + + /browserslist/4.18.1: + resolution: {integrity: sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001280 + electron-to-chromium: 1.3.899 + escalade: 3.1.1 + node-releases: 2.0.1 + picocolors: 1.0.0 /bs-logger/0.2.6: resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} @@ -5330,6 +7624,10 @@ packages: /buffer-from/1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + /buffer-indexof/1.1.1: + resolution: {integrity: sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==} + dev: true + /buffer-xor/1.0.3: resolution: {integrity: sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=} dev: true @@ -5349,6 +7647,11 @@ packages: ieee754: 1.2.1 dev: false + /builtin-modules/3.2.0: + resolution: {integrity: sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==} + engines: {node: '>=6'} + dev: true + /builtin-status-codes/3.0.0: resolution: {integrity: sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=} dev: true @@ -5357,6 +7660,21 @@ packages: resolution: {integrity: sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=} dev: true + /bytes/3.0.0: + resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=} + engines: {node: '>= 0.8'} + dev: true + + /bytes/3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: true + + /bytes/3.1.1: + resolution: {integrity: sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==} + engines: {node: '>= 0.8'} + dev: true + /cacache/12.0.4: resolution: {integrity: sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==} dependencies: @@ -5451,13 +7769,29 @@ packages: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} - /camelcase/6.2.0: - resolution: {integrity: sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==} + /camelcase/6.2.1: + resolution: {integrity: sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA==} engines: {node: '>=10'} dev: true + /caniuse-api/3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.18.1 + caniuse-lite: 1.0.30001280 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: true + /caniuse-lite/1.0.30001265: resolution: {integrity: sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==} + dev: true + + /caniuse-lite/1.0.30001278: + resolution: {integrity: sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==} + + /caniuse-lite/1.0.30001280: + resolution: {integrity: sha512-kFXwYvHe5rix25uwueBxC569o53J6TpnGu0BEEn+6Lhl2vsnAumRFWEBhDft1fwyo6m1r4i+RqA4+163FpeFcA==} /capture-exit/2.0.0: resolution: {integrity: sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==} @@ -5764,6 +8098,15 @@ packages: shallow-clone: 0.1.2 dev: false + /clone-deep/4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + dev: true + /clone-regexp/2.2.0: resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==} engines: {node: '>=6'} @@ -5807,15 +8150,28 @@ packages: /color-name/1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + /colord/2.9.1: + resolution: {integrity: sha512-4LBMSt09vR0uLnPVkOUBnmxgoaeN4ewRbx801wY/bXcltXfpR/G46OdWn96XpYmCWuYvO46aBZP4NgX8HpNAcw==} + dev: true + /colorette/1.4.0: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: true + /colorette/2.0.16: + resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} + dev: true + /colors/1.1.2: resolution: {integrity: sha1-FopHAXVran9RoSzgyXv6KMCE7WM=} engines: {node: '>=0.1.90'} dev: true + /colors/1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + /combined-stream/1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5838,11 +8194,20 @@ packages: engines: {node: '>= 6'} dev: false + /commander/7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: true + /comment-parser/0.7.6: resolution: {integrity: sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==} engines: {node: '>= 6.0.0'} dev: true + /common-path-prefix/3.0.0: + resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + dev: true + /commondir/1.0.1: resolution: {integrity: sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=} dev: true @@ -5854,6 +8219,26 @@ packages: /component-emitter/1.3.0: resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + /compressible/2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.51.0 + dev: true + + /compression/1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.7 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + dev: true + /concat-map/0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} @@ -5866,6 +8251,12 @@ packages: readable-stream: 2.3.7 typedarray: 0.0.6 + /concat-with-sourcemaps/1.1.0: + resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} + dependencies: + source-map: 0.6.1 + dev: true + /config/3.3.3: resolution: {integrity: sha512-T3RmZQEAji5KYqUQpziWtyGJFli6Khz7h0rpxDwYNjSkr5ynyTWwO7WpfjHzTXclNCDfSWQRcwMb+NwxJesCKw==} engines: {node: '>= 6.0.0'} @@ -5890,6 +8281,11 @@ packages: xdg-basedir: 3.0.0 dev: true + /connect-history-api-fallback/1.6.0: + resolution: {integrity: sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==} + engines: {node: '>=0.8'} + dev: true + /console-browserify/1.2.0: resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==} dev: true @@ -5902,6 +8298,18 @@ packages: resolution: {integrity: sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=} dev: true + /content-disposition/0.5.3: + resolution: {integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.1.2 + dev: true + + /content-type/1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: true + /continuable-cache/0.3.1: resolution: {integrity: sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=} dev: true @@ -5911,6 +8319,15 @@ packages: dependencies: safe-buffer: 5.1.2 + /cookie-signature/1.0.6: + resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=} + dev: true + + /cookie/0.4.0: + resolution: {integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==} + engines: {node: '>= 0.6'} + dev: true + /cookiejar/2.1.3: resolution: {integrity: sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==} dev: false @@ -5930,14 +8347,36 @@ packages: resolution: {integrity: sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=} engines: {node: '>=0.10.0'} + /copy-webpack-plugin/9.1.0_webpack@5.64.1: + resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.2.7 + glob-parent: 6.0.2 + globby: 11.0.4 + normalize-path: 3.0.0 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + webpack: 5.64.1 + dev: true + /core-js-compat/3.18.3: resolution: {integrity: sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==} dependencies: - browserslist: 4.17.3 + browserslist: 4.17.6 + semver: 7.0.0 + dev: true + + /core-js-compat/3.19.1: + resolution: {integrity: sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==} + dependencies: + browserslist: 4.18.1 semver: 7.0.0 - /core-js-pure/3.18.2: - resolution: {integrity: sha512-4hMMLUlZhKJKOWbbGD1/VDUxGPEhEoN/T01k7bx271WiBKCvCfkgPzy0IeRS4PB50p6/N1q/SZL4B/TRsTE5bA==} + /core-js-pure/3.19.1: + resolution: {integrity: sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==} requiresBuild: true dev: true @@ -5946,10 +8385,9 @@ packages: deprecated: core-js@<3.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js. requiresBuild: true - /core-js/3.18.3: - resolution: {integrity: sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==} + /core-js/3.19.1: + resolution: {integrity: sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==} requiresBuild: true - dev: false /core-util-is/1.0.2: resolution: {integrity: sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=} @@ -5957,6 +8395,11 @@ packages: /core-util-is/1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + /corser/2.0.1: + resolution: {integrity: sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=} + engines: {node: '>= 0.4.0'} + dev: true + /cosmiconfig/4.0.0: resolution: {integrity: sha512-6e5vDdrXZD+t5v0L8CrurPeybg4Fmf+FCSYxXKYVAqLUtyCSbuyqE059d0kDthTNRzKVjL7QMgNpEUlsoYH3iQ==} engines: {node: '>=4'} @@ -5977,6 +8420,17 @@ packages: parse-json: 4.0.0 dev: true + /cosmiconfig/6.0.0: + resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==} + engines: {node: '>=8'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + /cosmiconfig/7.0.1: resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} @@ -6021,6 +8475,10 @@ packages: safe-buffer: 5.1.2 sha.js: 2.4.11 + /create-require/1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + /cross-env/6.0.3: resolution: {integrity: sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==} engines: {node: '>=8.0'} @@ -6083,6 +8541,68 @@ packages: engines: {node: '>=4'} dev: true + /css-declaration-sorter/6.1.3_postcss@8.3.0: + resolution: {integrity: sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==} + engines: {node: '>= 10'} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.3.0 + timsort: 0.3.0 + dev: true + + /css-declaration-sorter/6.1.3_postcss@8.3.11: + resolution: {integrity: sha512-SvjQjNRZgh4ULK1LDJ2AduPKUKxIqmtU7ZAyi47BTV+M90Qvxr9AB6lKlLbDUfXqI9IQeYA8LbAsCZPpJEV3aA==} + engines: {node: '>= 10'} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.3.11 + timsort: 0.3.0 + dev: true + + /css-loader/6.5.1_webpack@5.64.1: + resolution: {integrity: sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + icss-utils: 5.1.0_postcss@8.3.0 + postcss: 8.3.0 + postcss-modules-extract-imports: 3.0.0_postcss@8.3.0 + postcss-modules-local-by-default: 4.0.0_postcss@8.3.0 + postcss-modules-scope: 3.0.0_postcss@8.3.0 + postcss-modules-values: 4.0.0_postcss@8.3.0 + postcss-value-parser: 4.1.0 + semver: 7.3.5 + webpack: 5.64.1 + dev: true + + /css-minimizer-webpack-plugin/3.1.3_webpack@5.64.1: + resolution: {integrity: sha512-x+6kzXprepysouo513zKibWCbWTGIvH9OrEsMRRV8EcJ7vYY/zRg0lR8tCzMHMap+lhNPOrYCdDagjRmfnGGxw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + clean-css: '*' + csso: '*' + esbuild: '*' + webpack: ^5.0.0 + peerDependenciesMeta: + clean-css: + optional: true + csso: + optional: true + esbuild: + optional: true + dependencies: + cssnano: 5.0.11_postcss@8.3.11 + jest-worker: 27.3.1 + postcss: 8.3.11 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + source-map: 0.6.1 + webpack: 5.64.1 + dev: true + /css-select/4.1.3: resolution: {integrity: sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==} dependencies: @@ -6091,12 +8611,26 @@ packages: domhandler: 4.2.2 domutils: 2.8.0 nth-check: 2.0.1 - dev: false + + /css-tree/1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true /css-what/5.1.0: resolution: {integrity: sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==} engines: {node: '>= 6'} - dev: false + + /css/3.0.0: + resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} + dependencies: + inherits: 2.0.4 + source-map: 0.6.1 + source-map-resolve: 0.6.0 + dev: true /cssesc/3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} @@ -6104,6 +8638,133 @@ packages: hasBin: true dev: true + /cssnano-preset-default/5.1.7_postcss@8.3.0: + resolution: {integrity: sha512-bWDjtTY+BOqrqBtsSQIbN0RLGD2Yr2CnecpP0ydHNafh9ZUEre8c8VYTaH9FEbyOt0eIfEUAYYk5zj92ioO8LA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.1.3_postcss@8.3.0 + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-calc: 8.0.0_postcss@8.3.0 + postcss-colormin: 5.2.1_postcss@8.3.0 + postcss-convert-values: 5.0.2_postcss@8.3.0 + postcss-discard-comments: 5.0.1_postcss@8.3.0 + postcss-discard-duplicates: 5.0.1_postcss@8.3.0 + postcss-discard-empty: 5.0.1_postcss@8.3.0 + postcss-discard-overridden: 5.0.1_postcss@8.3.0 + postcss-merge-longhand: 5.0.4_postcss@8.3.0 + postcss-merge-rules: 5.0.3_postcss@8.3.0 + postcss-minify-font-values: 5.0.1_postcss@8.3.0 + postcss-minify-gradients: 5.0.3_postcss@8.3.0 + postcss-minify-params: 5.0.2_postcss@8.3.0 + postcss-minify-selectors: 5.1.0_postcss@8.3.0 + postcss-normalize-charset: 5.0.1_postcss@8.3.0 + postcss-normalize-display-values: 5.0.1_postcss@8.3.0 + postcss-normalize-positions: 5.0.1_postcss@8.3.0 + postcss-normalize-repeat-style: 5.0.1_postcss@8.3.0 + postcss-normalize-string: 5.0.1_postcss@8.3.0 + postcss-normalize-timing-functions: 5.0.1_postcss@8.3.0 + postcss-normalize-unicode: 5.0.1_postcss@8.3.0 + postcss-normalize-url: 5.0.3_postcss@8.3.0 + postcss-normalize-whitespace: 5.0.1_postcss@8.3.0 + postcss-ordered-values: 5.0.2_postcss@8.3.0 + postcss-reduce-initial: 5.0.1_postcss@8.3.0 + postcss-reduce-transforms: 5.0.1_postcss@8.3.0 + postcss-svgo: 5.0.3_postcss@8.3.0 + postcss-unique-selectors: 5.0.2_postcss@8.3.0 + dev: true + + /cssnano-preset-default/5.1.7_postcss@8.3.11: + resolution: {integrity: sha512-bWDjtTY+BOqrqBtsSQIbN0RLGD2Yr2CnecpP0ydHNafh9ZUEre8c8VYTaH9FEbyOt0eIfEUAYYk5zj92ioO8LA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + css-declaration-sorter: 6.1.3_postcss@8.3.11 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-calc: 8.0.0_postcss@8.3.11 + postcss-colormin: 5.2.1_postcss@8.3.11 + postcss-convert-values: 5.0.2_postcss@8.3.11 + postcss-discard-comments: 5.0.1_postcss@8.3.11 + postcss-discard-duplicates: 5.0.1_postcss@8.3.11 + postcss-discard-empty: 5.0.1_postcss@8.3.11 + postcss-discard-overridden: 5.0.1_postcss@8.3.11 + postcss-merge-longhand: 5.0.4_postcss@8.3.11 + postcss-merge-rules: 5.0.3_postcss@8.3.11 + postcss-minify-font-values: 5.0.1_postcss@8.3.11 + postcss-minify-gradients: 5.0.3_postcss@8.3.11 + postcss-minify-params: 5.0.2_postcss@8.3.11 + postcss-minify-selectors: 5.1.0_postcss@8.3.11 + postcss-normalize-charset: 5.0.1_postcss@8.3.11 + postcss-normalize-display-values: 5.0.1_postcss@8.3.11 + postcss-normalize-positions: 5.0.1_postcss@8.3.11 + postcss-normalize-repeat-style: 5.0.1_postcss@8.3.11 + postcss-normalize-string: 5.0.1_postcss@8.3.11 + postcss-normalize-timing-functions: 5.0.1_postcss@8.3.11 + postcss-normalize-unicode: 5.0.1_postcss@8.3.11 + postcss-normalize-url: 5.0.3_postcss@8.3.11 + postcss-normalize-whitespace: 5.0.1_postcss@8.3.11 + postcss-ordered-values: 5.0.2_postcss@8.3.11 + postcss-reduce-initial: 5.0.1_postcss@8.3.11 + postcss-reduce-transforms: 5.0.1_postcss@8.3.11 + postcss-svgo: 5.0.3_postcss@8.3.11 + postcss-unique-selectors: 5.0.2_postcss@8.3.11 + dev: true + + /cssnano-utils/2.0.1_postcss@8.3.0: + resolution: {integrity: sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + dev: true + + /cssnano-utils/2.0.1_postcss@8.3.11: + resolution: {integrity: sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + dev: true + + /cssnano/5.0.11_postcss@8.3.0: + resolution: {integrity: sha512-5SHM31NAAe29jvy0MJqK40zZ/8dGlnlzcfHKw00bWMVFp8LWqtuyPSFwbaoIoxvt71KWJOfg8HMRGrBR3PExCg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.1.7_postcss@8.3.0 + is-resolvable: 1.1.0 + lilconfig: 2.0.4 + postcss: 8.3.0 + yaml: 1.10.2 + dev: true + + /cssnano/5.0.11_postcss@8.3.11: + resolution: {integrity: sha512-5SHM31NAAe29jvy0MJqK40zZ/8dGlnlzcfHKw00bWMVFp8LWqtuyPSFwbaoIoxvt71KWJOfg8HMRGrBR3PExCg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-preset-default: 5.1.7_postcss@8.3.11 + is-resolvable: 1.1.0 + lilconfig: 2.0.4 + postcss: 8.3.11 + yaml: 1.10.2 + dev: true + + /csso/4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + /cssom/0.3.8: resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} @@ -6122,8 +8783,8 @@ packages: dependencies: cssom: 0.3.8 - /csstype/3.0.9: - resolution: {integrity: sha512-rpw6JPxK6Rfg1zLOYCSwle2GFOOsnjmDYDaBwEcwoOg4qlsIVCN789VkBZDJAGi4T07gI4YSutR43t9Zz4Lzuw==} + /csstype/3.0.10: + resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==} dev: false /currently-unhandled/0.4.1: @@ -6193,6 +8854,12 @@ packages: dependencies: ms: 2.0.0 + /debug/3.1.0: + resolution: {integrity: sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==} + dependencies: + ms: 2.0.0 + dev: true + /debug/3.2.6: resolution: {integrity: sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==} deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) @@ -6248,6 +8915,17 @@ packages: type-detect: 4.0.8 dev: true + /deep-equal/1.1.1: + resolution: {integrity: sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==} + dependencies: + is-arguments: 1.1.1 + is-date-object: 1.0.5 + is-regex: 1.1.4 + object-is: 1.1.5 + object-keys: 1.1.1 + regexp.prototype.flags: 1.3.1 + dev: true + /deep-extend/0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -6260,6 +8938,13 @@ packages: resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} engines: {node: '>=0.10.0'} + /default-gateway/6.0.3: + resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} + engines: {node: '>= 10'} + dependencies: + execa: 5.1.1 + dev: true + /default-require-extensions/1.0.0: resolution: {integrity: sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=} engines: {node: '>=0.10.0'} @@ -6267,6 +8952,11 @@ packages: strip-bom: 2.0.0 dev: true + /define-lazy-prop/2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + dev: true + /define-properties/1.1.3: resolution: {integrity: sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==} engines: {node: '>= 0.4'} @@ -6306,6 +8996,20 @@ packages: slash: 3.0.0 dev: true + /del/6.0.0: + resolution: {integrity: sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==} + engines: {node: '>=10'} + dependencies: + globby: 11.0.4 + graceful-fs: 4.2.8 + is-glob: 4.0.3 + is-path-cwd: 2.2.0 + is-path-inside: 3.0.3 + p-map: 4.0.0 + rimraf: 3.0.2 + slash: 3.0.0 + dev: true + /delayed-stream/1.0.0: resolution: {integrity: sha1-3zrhmayt+31ECqrgsp4icrJOxhk=} engines: {node: '>=0.4.0'} @@ -6314,6 +9018,11 @@ packages: resolution: {integrity: sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=} dev: true + /depd/1.1.2: + resolution: {integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=} + engines: {node: '>= 0.6'} + dev: true + /des.js/1.0.1: resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==} dependencies: @@ -6321,6 +9030,10 @@ packages: minimalistic-assert: 1.0.1 dev: true + /destroy/1.0.4: + resolution: {integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=} + dev: true + /detect-file/1.0.0: resolution: {integrity: sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=} engines: {node: '>=0.10.0'} @@ -6342,6 +9055,10 @@ packages: resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} engines: {node: '>=8'} + /detect-node/2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + dev: true + /diff-sequences/24.9.0: resolution: {integrity: sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==} engines: {node: '>= 6'} @@ -6365,6 +9082,11 @@ packages: engines: {node: '>=0.3.1'} dev: true + /diff/4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + /diffie-hellman/5.0.3: resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==} dependencies: @@ -6384,6 +9106,23 @@ packages: resolution: {integrity: sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=} dev: false + /dns-equal/1.0.0: + resolution: {integrity: sha1-s55/HabrCnW6nBcySzR1PEfgZU0=} + dev: true + + /dns-packet/1.3.4: + resolution: {integrity: sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==} + dependencies: + ip: 1.1.5 + safe-buffer: 5.2.1 + dev: true + + /dns-txt/2.0.2: + resolution: {integrity: sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=} + dependencies: + buffer-indexof: 1.1.1 + dev: true + /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -6410,7 +9149,6 @@ packages: domelementtype: 2.2.0 domhandler: 4.2.2 entities: 2.2.0 - dev: false /domain-browser/1.2.0: resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==} @@ -6447,7 +9185,6 @@ packages: engines: {node: '>= 4'} dependencies: domelementtype: 2.2.0 - dev: false /domutils/1.7.0: resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==} @@ -6462,7 +9199,6 @@ packages: dom-serializer: 1.3.2 domelementtype: 2.2.0 domhandler: 4.2.2 - dev: false /dot-prop/4.2.1: resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} @@ -6498,6 +9234,21 @@ packages: jsbn: 0.1.1 safer-buffer: 2.1.2 + /ecstatic/3.3.2: + resolution: {integrity: sha512-fLf9l1hnwrHI2xn9mEDT7KIi22UDqA2jaCwyCbSUJh9a1V+LEUSL/JO/6TIz/QyuBURWUHrFL5Kg2TtO1bkkog==} + deprecated: This package is unmaintained and deprecated. See the GH Issue 259. + hasBin: true + dependencies: + he: 1.2.0 + mime: 1.6.0 + minimist: 1.2.5 + url-join: 2.0.5 + dev: true + + /ee-first/1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + dev: true + /ejs/3.1.6: resolution: {integrity: sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==} engines: {node: '>=0.10.0'} @@ -6506,8 +9257,11 @@ packages: jake: 10.8.2 dev: true - /electron-to-chromium/1.3.861: - resolution: {integrity: sha512-GZyflmpMnZRdZ1e2yAyvuFwz1MPSVQelwHX4TJZyXypB8NcxdPvPNwy5lOTxnlkrK13EiQzyTPugRSnj6cBgKg==} + /electron-to-chromium/1.3.889: + resolution: {integrity: sha512-suEUoPTD1mExjL9TdmH7cvEiWJVM2oEiAi+Y1p0QKxI2HcRlT44qDTP2c1aZmVwRemIPYOpxmV7CxQCOWcm4XQ==} + + /electron-to-chromium/1.3.899: + resolution: {integrity: sha512-w16Dtd2zl7VZ4N4Db+FIa7n36sgPGCKjrKvUUmp5ialsikvcQLjcJR9RWnlYNxIyEHLdHaoIZEqKsPxU9MdyBg==} /elegant-spinner/1.0.1: resolution: {integrity: sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=} @@ -6541,11 +9295,21 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /emojis-list/2.1.0: + resolution: {integrity: sha1-TapNnbAPmBmIDHn6RXrlsJof04k=} + engines: {node: '>= 0.10'} + dev: true + /emojis-list/3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} dev: true + /encodeurl/1.0.2: + resolution: {integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=} + engines: {node: '>= 0.8'} + dev: true + /encoding/0.1.13: resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} dependencies: @@ -6566,6 +9330,14 @@ packages: tapable: 1.1.3 dev: true + /enhanced-resolve/5.8.3: + resolution: {integrity: sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.8 + tapable: 2.2.1 + dev: true + /enquirer/2.3.6: resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} engines: {node: '>=8.6'} @@ -6662,6 +9434,7 @@ packages: /errno/0.1.8: resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} hasBin: true + requiresBuild: true dependencies: prr: 1.0.1 dev: true @@ -6671,6 +9444,12 @@ packages: dependencies: is-arrayish: 0.2.1 + /error-stack-parser/2.0.6: + resolution: {integrity: sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==} + dependencies: + stackframe: 1.2.0 + dev: true + /error/7.2.1: resolution: {integrity: sha512-fo9HBvWnx3NGUKMvMwB/CBCMMrfEJgbDTVDEkPygA3Bdd3lM1OyCd+rbQ8BwnpF6GdVeOLDNmyL4N5Bg80ZvdA==} dependencies: @@ -6706,6 +9485,10 @@ packages: resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} dev: false + /es-module-lexer/0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + dev: true + /es-to-primitive/1.2.1: resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} engines: {node: '>= 0.4'} @@ -6728,6 +9511,10 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escape-html/1.0.3: + resolution: {integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=} + dev: true + /escape-string-regexp/1.0.5: resolution: {integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=} engines: {node: '>=0.8.0'} @@ -6759,22 +9546,13 @@ packages: hasBin: true dependencies: esprima: 4.0.1 - estraverse: 5.2.0 + estraverse: 5.3.0 esutils: 2.0.3 optionator: 0.8.3 optionalDependencies: source-map: 0.6.1 dev: true - /eslint-config-prettier/6.15.0: - resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} - hasBin: true - peerDependencies: - eslint: '>=3.14.1' - dependencies: - get-stdin: 6.0.0 - dev: true - /eslint-config-prettier/6.15.0_eslint@6.8.0: resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} hasBin: true @@ -6785,6 +9563,16 @@ packages: get-stdin: 6.0.0 dev: true + /eslint-config-prettier/6.15.0_eslint@8.1.0: + resolution: {integrity: sha512-a1+kOYLR8wMGustcgAjdydMsQ2A/2ipRPwRKUmfYaSxc9ZPcrku080Ctl6zrZzZNs/U82MjSv+qKREkoq3bJaw==} + hasBin: true + peerDependencies: + eslint: '>=3.14.1' + dependencies: + eslint: 8.1.0 + get-stdin: 6.0.0 + dev: true + /eslint-config-prettier/7.2.0_eslint@7.32.0: resolution: {integrity: sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==} hasBin: true @@ -6812,19 +9600,20 @@ packages: resolve: 1.20.0 dev: true - /eslint-module-utils/2.6.2: - resolution: {integrity: sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==} + /eslint-module-utils/2.7.1: + resolution: {integrity: sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==} engines: {node: '>=4'} dependencies: debug: 3.2.7 + find-up: 2.1.0 pkg-dir: 2.0.0 dev: true - /eslint-plugin-import/2.24.2_eslint@7.32.0: - resolution: {integrity: sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==} + /eslint-plugin-import/2.25.3_eslint@7.32.0: + resolution: {integrity: sha512-RzAVbby+72IB3iOEL8clzPLzL3wpDrlwjsTBAQXgyp5SeTqqY+0bFubwuo+y/HLhNZcXV4XqTBO4LGsfyHIDXg==} engines: {node: '>=4'} peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 dependencies: array-includes: 3.1.4 array.prototype.flat: 1.2.5 @@ -6832,14 +9621,12 @@ packages: doctrine: 2.1.0 eslint: 7.32.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.6.2 - find-up: 2.1.0 + eslint-module-utils: 2.7.1 has: 1.0.3 - is-core-module: 2.7.0 + is-core-module: 2.8.0 + is-glob: 4.0.3 minimatch: 3.0.4 object.values: 1.1.5 - pkg-up: 2.0.0 - read-pkg-up: 3.0.0 resolve: 1.20.0 tsconfig-paths: 3.11.0 dev: true @@ -6857,20 +9644,21 @@ packages: - typescript dev: true - /eslint-plugin-jest/23.20.0_typescript@4.2.4: + /eslint-plugin-jest/23.20.0_eslint@8.1.0+typescript@4.2.4: resolution: {integrity: sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==} engines: {node: '>=8'} peerDependencies: eslint: '>=5' dependencies: - '@typescript-eslint/experimental-utils': 2.34.0_typescript@4.2.4 + '@typescript-eslint/experimental-utils': 2.34.0_eslint@8.1.0+typescript@4.2.4 + eslint: 8.1.0 transitivePeerDependencies: - supports-color - typescript dev: true - /eslint-plugin-jest/24.5.2_eslint@7.32.0+typescript@4.2.4: - resolution: {integrity: sha512-lrI3sGAyZi513RRmP08sIW241Ti/zMnn/6wbE4ZBhb3M2pJ9ztaZMnSKSKKBUfotVdwqU8W1KtD8ao2/FR8DIg==} + /eslint-plugin-jest/24.7.0_eslint@7.32.0+typescript@4.2.4: + resolution: {integrity: sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==} engines: {node: '>=10'} peerDependencies: '@typescript-eslint/eslint-plugin': '>= 4' @@ -6886,23 +9674,6 @@ packages: - typescript dev: true - /eslint-plugin-jsdoc/30.7.13: - resolution: {integrity: sha512-YM4WIsmurrp0rHX6XiXQppqKB8Ne5ATiZLJe2+/fkp9l9ExXFr43BbAbjZaVrpCT+tuPYOZ8k1MICARHnURUNQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 - dependencies: - comment-parser: 0.7.6 - debug: 4.3.2 - jsdoctypeparser: 9.0.0 - lodash: 4.17.21 - regextras: 0.7.1 - semver: 7.3.5 - spdx-expression-parse: 3.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-plugin-jsdoc/30.7.13_eslint@6.8.0: resolution: {integrity: sha512-YM4WIsmurrp0rHX6XiXQppqKB8Ne5ATiZLJe2+/fkp9l9ExXFr43BbAbjZaVrpCT+tuPYOZ8k1MICARHnURUNQ==} engines: {node: '>=10'} @@ -6939,23 +9710,22 @@ packages: - supports-color dev: true - /eslint-plugin-jsx-a11y/6.4.1: - resolution: {integrity: sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==} - engines: {node: '>=4.0'} + /eslint-plugin-jsdoc/30.7.13_eslint@8.1.0: + resolution: {integrity: sha512-YM4WIsmurrp0rHX6XiXQppqKB8Ne5ATiZLJe2+/fkp9l9ExXFr43BbAbjZaVrpCT+tuPYOZ8k1MICARHnURUNQ==} + engines: {node: '>=10'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 + eslint: ^6.0.0 || ^7.0.0 dependencies: - '@babel/runtime': 7.15.4 - aria-query: 4.2.2 - array-includes: 3.1.4 - ast-types-flow: 0.0.7 - axe-core: 4.3.3 - axobject-query: 2.2.0 - damerau-levenshtein: 1.0.7 - emoji-regex: 9.2.2 - has: 1.0.3 - jsx-ast-utils: 3.2.1 - language-tags: 1.0.5 + comment-parser: 0.7.6 + debug: 4.3.2 + eslint: 8.1.0 + jsdoctypeparser: 9.0.0 + lodash: 4.17.21 + regextras: 0.7.1 + semver: 7.3.5 + spdx-expression-parse: 3.0.1 + transitivePeerDependencies: + - supports-color dev: true /eslint-plugin-jsx-a11y/6.4.1_eslint@6.8.0: @@ -6978,7 +9748,7 @@ packages: language-tags: 1.0.5 dev: true - /eslint-plugin-jsx-a11y/6.4.1_eslint@7.32.0: + /eslint-plugin-jsx-a11y/6.4.1_eslint@8.1.0: resolution: {integrity: sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==} engines: {node: '>=4.0'} peerDependencies: @@ -6992,10 +9762,48 @@ packages: axobject-query: 2.2.0 damerau-levenshtein: 1.0.7 emoji-regex: 9.2.2 + eslint: 8.1.0 + has: 1.0.3 + jsx-ast-utils: 3.2.1 + language-tags: 1.0.5 + dev: true + + /eslint-plugin-jsx-a11y/6.5.1_eslint@7.32.0: + resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.16.3 + aria-query: 4.2.2 + array-includes: 3.1.4 + ast-types-flow: 0.0.7 + axe-core: 4.3.5 + axobject-query: 2.2.0 + damerau-levenshtein: 1.0.7 + emoji-regex: 9.2.2 eslint: 7.32.0 has: 1.0.3 jsx-ast-utils: 3.2.1 language-tags: 1.0.5 + minimatch: 3.0.4 + dev: true + + /eslint-plugin-prettier/3.4.1_0ee224e0723ebb336792c58a54fe2b48: + resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} + engines: {node: '>=6.0.0'} + peerDependencies: + eslint: '>=5.0.0' + eslint-config-prettier: '*' + prettier: '>=1.13.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.1.0 + eslint-config-prettier: 6.15.0_eslint@8.1.0 + prettier: /wp-prettier/2.0.5 + prettier-linter-helpers: 1.0.0 dev: true /eslint-plugin-prettier/3.4.1_34b707f3a53b0942f3919c1ff656ce36: @@ -7032,22 +9840,6 @@ packages: prettier-linter-helpers: 1.0.0 dev: true - /eslint-plugin-prettier/3.4.1_f5d47c57aba0303a274284ebffad65f7: - resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} - engines: {node: '>=6.0.0'} - peerDependencies: - eslint: '>=5.0.0' - eslint-config-prettier: '*' - prettier: '>=1.13.0' - peerDependenciesMeta: - eslint-config-prettier: - optional: true - dependencies: - eslint-config-prettier: 6.15.0 - prettier: /wp-prettier/2.0.5 - prettier-linter-helpers: 1.0.0 - dev: true - /eslint-plugin-react-hooks/2.5.1_eslint@6.8.0: resolution: {integrity: sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g==} engines: {node: '>=7'} @@ -7057,13 +9849,6 @@ packages: eslint: 6.8.0 dev: true - /eslint-plugin-react-hooks/4.2.0: - resolution: {integrity: sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - dev: true - /eslint-plugin-react-hooks/4.2.0_eslint@6.8.0: resolution: {integrity: sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==} engines: {node: '>=10'} @@ -7073,35 +9858,22 @@ packages: eslint: 6.8.0 dev: true - /eslint-plugin-react-hooks/4.2.0_eslint@7.32.0: + /eslint-plugin-react-hooks/4.2.0_eslint@8.1.0: resolution: {integrity: sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==} engines: {node: '>=10'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 dependencies: - eslint: 7.32.0 + eslint: 8.1.0 dev: true - /eslint-plugin-react/7.26.1: - resolution: {integrity: sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==} - engines: {node: '>=4'} + /eslint-plugin-react-hooks/4.3.0_eslint@7.32.0: + resolution: {integrity: sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==} + engines: {node: '>=10'} peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: - array-includes: 3.1.4 - array.prototype.flatmap: 1.2.5 - doctrine: 2.1.0 - estraverse: 5.2.0 - jsx-ast-utils: 3.2.1 - minimatch: 3.0.4 - object.entries: 1.1.5 - object.fromentries: 2.0.5 - object.hasown: 1.1.0 - object.values: 1.1.5 - prop-types: 15.7.2 - resolve: 2.0.0-next.3 - semver: 6.3.0 - string.prototype.matchall: 4.0.6 + eslint: 7.32.0 dev: true /eslint-plugin-react/7.26.1_eslint@6.8.0: @@ -7127,7 +9899,7 @@ packages: string.prototype.matchall: 4.0.6 dev: true - /eslint-plugin-react/7.26.1_eslint@7.32.0: + /eslint-plugin-react/7.26.1_eslint@8.1.0: resolution: {integrity: sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==} engines: {node: '>=4'} peerDependencies: @@ -7136,7 +9908,7 @@ packages: array-includes: 3.1.4 array.prototype.flatmap: 1.2.5 doctrine: 2.1.0 - eslint: 7.32.0 + eslint: 8.1.0 estraverse: 5.2.0 jsx-ast-utils: 3.2.1 minimatch: 3.0.4 @@ -7150,6 +9922,29 @@ packages: string.prototype.matchall: 4.0.6 dev: true + /eslint-plugin-react/7.27.0_eslint@7.32.0: + resolution: {integrity: sha512-0Ut+CkzpppgFtoIhdzi2LpdpxxBvgFf99eFqWxJnUrO7mMe0eOiNpou6rvNYeVVV6lWZvTah0BFne7k5xHjARg==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.4 + array.prototype.flatmap: 1.2.5 + doctrine: 2.1.0 + eslint: 7.32.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.2.1 + minimatch: 3.0.4 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.hasown: 1.1.0 + object.values: 1.1.5 + prop-types: 15.7.2 + resolve: 2.0.0-next.3 + semver: 6.3.0 + string.prototype.matchall: 4.0.6 + dev: true + /eslint-plugin-testing-library/3.10.2_eslint@7.32.0+typescript@4.2.4: resolution: {integrity: sha512-WAmOCt7EbF1XM8XfbCKAEzAPnShkNSwcIsAD2jHdsMUT9mZJPjLCG7pMzbcC8kK366NOuGip8HKLDC+Xk4yIdA==} engines: {node: ^10.12.0 || >=12.0.0, npm: '>=6'} @@ -7178,6 +9973,14 @@ packages: esrecurse: 4.3.0 estraverse: 4.3.0 + /eslint-scope/6.0.0: + resolution: {integrity: sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + /eslint-utils/1.4.3: resolution: {integrity: sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==} engines: {node: '>=6'} @@ -7201,6 +10004,26 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-utils/3.0.0_eslint@8.1.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.1.0 + eslint-visitor-keys: 2.1.0 + dev: true + + /eslint-utils/3.0.0_eslint@8.2.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.2.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -7210,6 +10033,11 @@ packages: engines: {node: '>=10'} dev: true + /eslint-visitor-keys/3.0.0: + resolution: {integrity: sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /eslint/5.16.0: resolution: {integrity: sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==} engines: {node: ^6.14.0 || ^8.10.0 || >=9.10.0} @@ -7260,7 +10088,7 @@ packages: engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} hasBin: true dependencies: - '@babel/code-frame': 7.15.8 + '@babel/code-frame': 7.16.0 ajv: 6.12.6 chalk: 2.4.2 cross-spawn: 6.0.5 @@ -7372,7 +10200,7 @@ packages: file-entry-cache: 6.0.1 functional-red-black-tree: 1.0.1 glob-parent: 5.1.2 - globals: 13.11.0 + globals: 13.12.0 ignore: 4.0.6 import-fresh: 3.3.0 imurmurhash: 0.1.4 @@ -7389,7 +10217,101 @@ packages: semver: 7.3.5 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 - table: 6.7.2 + table: 6.7.3 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint/8.1.0: + resolution: {integrity: sha512-JZvNneArGSUsluHWJ8g8MMs3CfIEzwaLx9KyH4tZ2i+R2/rPWzL8c0zg3rHdwYVpN/1sB9gqnjHwz9HoeJpGHw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.0.3 + '@humanwhocodes/config-array': 0.6.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.2 + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 6.0.0 + eslint-utils: 3.0.0_eslint@8.1.0 + eslint-visitor-keys: 3.0.0 + espree: 9.0.0 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.11.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.3.5 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint/8.2.0: + resolution: {integrity: sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.0.4 + '@humanwhocodes/config-array': 0.6.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.2 + doctrine: 3.0.0 + enquirer: 2.3.6 + escape-string-regexp: 4.0.0 + eslint-scope: 6.0.0 + eslint-utils: 3.0.0_eslint@8.2.0 + eslint-visitor-keys: 3.0.0 + espree: 9.0.0 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + functional-red-black-tree: 1.0.1 + glob-parent: 6.0.2 + globals: 13.12.0 + ignore: 4.0.6 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.0.4 + natural-compare: 1.4.0 + optionator: 0.9.1 + progress: 2.0.3 + regexpp: 3.2.0 + semver: 7.3.5 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 text-table: 0.2.0 v8-compile-cache: 2.3.0 transitivePeerDependencies: @@ -7422,6 +10344,15 @@ packages: eslint-visitor-keys: 1.3.0 dev: true + /espree/9.0.0: + resolution: {integrity: sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.5.0 + acorn-jsx: 5.3.2_acorn@8.5.0 + eslint-visitor-keys: 3.0.0 + dev: true + /esprima/4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -7431,13 +10362,13 @@ packages: resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==} engines: {node: '>=0.10'} dependencies: - estraverse: 5.2.0 + estraverse: 5.3.0 /esrecurse/4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: - estraverse: 5.2.0 + estraverse: 5.3.0 /estraverse/4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} @@ -7446,11 +10377,33 @@ packages: /estraverse/5.2.0: resolution: {integrity: sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==} engines: {node: '>=4.0'} + dev: true + + /estraverse/5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /estree-walker/0.6.1: + resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} + dev: true + + /estree-walker/1.0.1: + resolution: {integrity: sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==} + dev: true + + /estree-walker/2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: true /esutils/2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} + /etag/1.8.1: + resolution: {integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=} + engines: {node: '>= 0.6'} + dev: true + /eventemitter2/0.4.14: resolution: {integrity: sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=} dev: true @@ -7461,7 +10414,6 @@ packages: /eventemitter3/4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false /events/3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} @@ -7623,18 +10575,54 @@ packages: jest-message-util: 26.6.2 jest-regex-util: 26.0.0 - /expect/27.2.4: - resolution: {integrity: sha512-gOtuonQ8TCnbNNCSw2fhVzRf8EFYDII4nB5NmG4IEV0rbUnW1I5zXvoTntU4iicB/Uh0oZr20NGlOLdJiwsOZA==} + /expect/27.3.1: + resolution: {integrity: sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 ansi-styles: 5.2.0 - jest-get-type: 27.0.6 - jest-matcher-utils: 27.2.4 - jest-message-util: 27.2.4 + jest-get-type: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 jest-regex-util: 27.0.6 dev: true + /express/4.17.1: + resolution: {integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.7 + array-flatten: 1.1.1 + body-parser: 1.19.0 + content-disposition: 0.5.3 + content-type: 1.0.4 + cookie: 0.4.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 1.1.2 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.3.0 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.7.0 + range-parser: 1.2.1 + safe-buffer: 5.1.2 + send: 0.17.1 + serve-static: 1.14.1 + setprototypeof: 1.1.1 + statuses: 1.5.0 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: true + /extend-shallow/2.0.1: resolution: {integrity: sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=} engines: {node: '>=0.10.0'} @@ -7734,6 +10722,13 @@ packages: websocket-driver: 0.7.4 dev: true + /faye-websocket/0.11.4: + resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} + engines: {node: '>=0.8.0'} + dependencies: + websocket-driver: 0.7.4 + dev: true + /fb-watchman/2.0.1: resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==} dependencies: @@ -7782,6 +10777,17 @@ packages: flat-cache: 3.0.4 dev: true + /file-loader/6.2.0_webpack@5.64.1: + resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + webpack: 5.64.1 + dev: true + /file-sync-cmp/0.1.1: resolution: {integrity: sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=} dev: true @@ -7822,6 +10828,19 @@ packages: dependencies: to-regex-range: 5.0.1 + /finalhandler/1.1.2: + resolution: {integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.3.0 + parseurl: 1.3.3 + statuses: 1.5.0 + unpipe: 1.0.0 + dev: true + /find-cache-dir/2.1.0: resolution: {integrity: sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==} engines: {node: '>=6'} @@ -7831,6 +10850,15 @@ packages: pkg-dir: 3.0.0 dev: true + /find-cache-dir/3.3.2: + resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} + engines: {node: '>=8'} + dependencies: + commondir: 1.0.1 + make-dir: 3.1.0 + pkg-dir: 4.2.0 + dev: true + /find-file-up/0.1.3: resolution: {integrity: sha1-z2gJG8+fMApA2kEbN9pczlovvqA=} engines: {node: '>=0.10.0'} @@ -7885,6 +10913,14 @@ packages: locate-path: 5.0.0 path-exists: 4.0.0 + /find-up/5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + /find-versions/3.2.0: resolution: {integrity: sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==} engines: {node: '>=6'} @@ -7953,7 +10989,7 @@ packages: resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} engines: {node: ^10.12.0 || >=12.0.0} dependencies: - flatted: 3.2.2 + flatted: 3.2.4 rimraf: 3.0.2 dev: true @@ -7972,8 +11008,8 @@ packages: /flatted/2.0.2: resolution: {integrity: sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==} - /flatted/3.2.2: - resolution: {integrity: sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==} + /flatted/3.2.4: + resolution: {integrity: sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==} dev: true /flush-write-stream/1.1.1: @@ -7983,8 +11019,8 @@ packages: readable-stream: 2.3.7 dev: true - /follow-redirects/1.14.4: - resolution: {integrity: sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==} + /follow-redirects/1.14.5: + resolution: {integrity: sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==} engines: {node: '>=4.0'} peerDependencies: debug: '*' @@ -8024,13 +11060,32 @@ packages: /forever-agent/0.6.1: resolution: {integrity: sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=} + /fork-ts-checker-webpack-plugin/6.2.10: + resolution: {integrity: sha512-HveFCHWSH2WlYU1tU3PkrupvW8lNFMTfH3Jk0TfC2mtktE9ibHGcifhCsCFvj+kqlDfNIlwmNLiNqR9jnSA7OQ==} + engines: {node: '>=10', yarn: '>=1.0.0'} + dependencies: + '@babel/code-frame': 7.16.0 + '@types/json-schema': 7.0.9 + chalk: 4.1.2 + chokidar: 3.5.2 + cosmiconfig: 6.0.0 + deepmerge: 4.2.2 + fs-extra: 9.1.0 + glob: 7.2.0 + memfs: 3.3.0 + minimatch: 3.0.4 + schema-utils: 2.7.0 + semver: 7.3.5 + tapable: 1.1.3 + dev: true + /form-data/2.3.3: resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} engines: {node: '>= 0.12'} dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.33 + mime-types: 2.1.34 /form-data/2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} @@ -8038,7 +11093,7 @@ packages: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.33 + mime-types: 2.1.34 dev: false /form-data/3.0.1: @@ -8047,18 +11102,32 @@ packages: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 - mime-types: 2.1.33 + mime-types: 2.1.34 /formidable/1.2.2: resolution: {integrity: sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==} dev: false + /forwarded/0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + dev: true + + /fraction.js/4.1.2: + resolution: {integrity: sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==} + dev: true + /fragment-cache/0.2.1: resolution: {integrity: sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=} engines: {node: '>=0.10.0'} dependencies: map-cache: 0.2.2 + /fresh/0.5.2: + resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=} + engines: {node: '>= 0.6'} + dev: true + /from2/2.3.0: resolution: {integrity: sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=} dependencies: @@ -8071,6 +11140,15 @@ packages: engines: {node: '>=0.10.0'} dev: false + /fs-extra/8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: true + /fs-extra/9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -8081,6 +11159,10 @@ packages: universalify: 2.0.0 dev: true + /fs-monkey/1.0.3: + resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==} + dev: true + /fs-readdir-recursive/1.1.0: resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==} @@ -8173,6 +11255,12 @@ packages: globule: 1.3.3 dev: true + /generic-names/2.0.1: + resolution: {integrity: sha512-kPCHWa1m9wGG/OwQpeweTwM/PYiQLrUIxXbt/P4Nic3LbGjCP0YwrALHW1uNLKZ0LIMg+RF+XRlj2ekT9ZlZAQ==} + dependencies: + loader-utils: 1.4.0 + dev: true + /gensync/1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -8278,6 +11366,17 @@ packages: dependencies: is-glob: 4.0.3 + /glob-parent/6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp/0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + dev: true + /glob/5.0.15: resolution: {integrity: sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=} dependencies: @@ -8409,11 +11508,32 @@ packages: type-fest: 0.20.2 dev: true + /globals/13.12.0: + resolution: {integrity: sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + /globals/9.18.0: resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} engines: {node: '>=0.10.0'} dev: true + /globby/10.0.1: + resolution: {integrity: sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==} + engines: {node: '>=8'} + dependencies: + '@types/glob': 7.2.0 + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.7 + glob: 7.2.0 + ignore: 5.1.9 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globby/10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} @@ -8435,7 +11555,7 @@ packages: array-union: 2.1.0 dir-glob: 3.0.1 fast-glob: 3.2.7 - ignore: 5.1.8 + ignore: 5.1.9 merge2: 1.4.1 slash: 3.0.0 dev: true @@ -8692,6 +11812,10 @@ packages: duplexer: 0.1.2 dev: true + /handle-thing/2.0.1: + resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} + dev: true + /handlebars/4.7.7: resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} engines: {node: '>=0.4.7'} @@ -8844,6 +11968,15 @@ packages: lru-cache: 6.0.0 dev: true + /hpack.js/2.1.6: + resolution: {integrity: sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=} + dependencies: + inherits: 2.0.4 + obuf: 1.1.2 + readable-stream: 2.3.7 + wbuf: 1.7.3 + dev: true + /html-element-map/1.3.1: resolution: {integrity: sha512-6XMlxrAFX4UEEGxctfFnmrFaaZFNf9i5fNuV5wZ3WWQ4FVaNP1aX1LkX9j2mfEx1NpjeE/rL3nmgEn23GdFmrg==} dependencies: @@ -8863,6 +11996,10 @@ packages: whatwg-encoding: 1.0.5 dev: true + /html-entities/2.3.2: + resolution: {integrity: sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==} + dev: true + /html-escaper/2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -8891,6 +12028,42 @@ packages: entities: 2.2.0 dev: false + /http-deceiver/1.2.7: + resolution: {integrity: sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=} + dev: true + + /http-errors/1.6.3: + resolution: {integrity: sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.0 + statuses: 1.5.0 + dev: true + + /http-errors/1.7.2: + resolution: {integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.3 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: true + + /http-errors/1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: true + /http-parser-js/0.5.3: resolution: {integrity: sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==} dev: true @@ -8906,10 +12079,53 @@ packages: - supports-color dev: true + /http-proxy-middleware/2.0.1: + resolution: {integrity: sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==} + engines: {node: '>=12.0.0'} + dependencies: + '@types/http-proxy': 1.17.7 + http-proxy: 1.18.1 + is-glob: 4.0.3 + is-plain-obj: 3.0.0 + micromatch: 4.0.4 + transitivePeerDependencies: + - debug + dev: true + + /http-proxy/1.18.1: + resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} + engines: {node: '>=8.0.0'} + dependencies: + eventemitter3: 4.0.7 + follow-redirects: 1.14.5 + requires-port: 1.0.0 + transitivePeerDependencies: + - debug + dev: true + /http-reasons/0.1.0: resolution: {integrity: sha1-qVPKZwB4Zp3eFCzomUAbnW6F07Q=} dev: false + /http-server/0.12.3: + resolution: {integrity: sha512-be0dKG6pni92bRjq0kvExtj/NrrAd28/8fCXkaI/4piTwQMSDSLMhWyW0NI1V+DBI3aa1HMlQu46/HjVLfmugA==} + engines: {node: '>=6'} + hasBin: true + dependencies: + basic-auth: 1.1.0 + colors: 1.4.0 + corser: 2.0.1 + ecstatic: 3.3.2 + http-proxy: 1.18.1 + minimist: 1.2.5 + opener: 1.5.2 + portfinder: 1.0.28 + secure-compare: 3.0.1 + union: 0.5.0 + transitivePeerDependencies: + - debug + dev: true + /http-signature/1.2.0: resolution: {integrity: sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=} engines: {node: '>=0.8', npm: '>=1.3.7'} @@ -8988,7 +12204,19 @@ packages: engines: {node: '>=0.10.0'} dependencies: safer-buffer: 2.1.2 - dev: false + + /icss-replace-symbols/1.1.0: + resolution: {integrity: sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=} + dev: true + + /icss-utils/5.1.0_postcss@8.3.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.3.0 + dev: true /identity-obj-proxy/3.0.0: resolution: {integrity: sha1-lNK9qWCERT7zb7xarsN+D3nx/BQ=} @@ -9013,6 +12241,26 @@ packages: engines: {node: '>= 4'} dev: true + /ignore/5.1.9: + resolution: {integrity: sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==} + engines: {node: '>= 4'} + dev: true + + /image-size/0.5.5: + resolution: {integrity: sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=} + engines: {node: '>=0.10.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /import-cwd/3.0.0: + resolution: {integrity: sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==} + engines: {node: '>=8'} + dependencies: + import-from: 3.0.0 + dev: true + /import-fresh/2.0.0: resolution: {integrity: sha1-2BNVwVYS04bGH53dOSLUMEgipUY=} engines: {node: '>=4'} @@ -9028,6 +12276,13 @@ packages: parent-module: 1.0.1 resolve-from: 4.0.0 + /import-from/3.0.0: + resolution: {integrity: sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + /import-lazy/2.1.0: resolution: {integrity: sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=} engines: {node: '>=4'} @@ -9141,6 +12396,16 @@ packages: strip-ansi: 6.0.1 through: 2.3.8 + /internal-ip/6.2.0: + resolution: {integrity: sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==} + engines: {node: '>=10'} + dependencies: + default-gateway: 6.0.3 + ipaddr.js: 1.9.1 + is-ip: 3.1.0 + p-event: 4.2.0 + dev: true + /internal-slot/1.0.3: resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} engines: {node: '>= 0.4'} @@ -9167,6 +12432,30 @@ packages: resolution: {integrity: sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=} engines: {node: '>=4'} + /ip-regex/4.3.0: + resolution: {integrity: sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==} + engines: {node: '>=8'} + dev: true + + /ip/1.1.5: + resolution: {integrity: sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=} + dev: true + + /ipaddr.js/1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + dev: true + + /ipaddr.js/2.0.1: + resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==} + engines: {node: '>= 10'} + dev: true + + /is-absolute-url/3.0.3: + resolution: {integrity: sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==} + engines: {node: '>=8'} + dev: true + /is-absolute/1.0.0: resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} engines: {node: '>=0.10.0'} @@ -9198,6 +12487,14 @@ packages: is-decimal: 1.0.4 dev: true + /is-arguments/1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + dev: true + /is-arrayish/0.2.1: resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} @@ -9219,6 +12516,11 @@ packages: dependencies: binary-extensions: 2.2.0 + /is-blob/2.1.0: + resolution: {integrity: sha512-SZ/fTft5eUhQM6oF/ZaASFDEdbFVe89Imltn9uZr03wdKMcWNVYSMjQPFtg05QuNkt5l5c135ElvXEQG0rk4tw==} + engines: {node: '>=6'} + dev: true + /is-boolean-object/1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} engines: {node: '>= 0.4'} @@ -9251,8 +12553,8 @@ packages: dependencies: ci-info: 2.0.0 - /is-ci/3.0.0: - resolution: {integrity: sha512-kDXyttuLeslKAHYL/K28F2YkM3x5jvFPEw3yXbRptXydjD9rpLEz+C5K5iutY9ZiUu6AP41JdvRQwF4Iqs4ZCQ==} + /is-ci/3.0.1: + resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} hasBin: true dependencies: ci-info: 3.2.0 @@ -9262,6 +12564,12 @@ packages: resolution: {integrity: sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==} dependencies: has: 1.0.3 + dev: true + + /is-core-module/2.8.0: + resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} + dependencies: + has: 1.0.3 /is-data-descriptor/0.1.4: resolution: {integrity: sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=} @@ -9377,6 +12685,17 @@ packages: is-path-inside: 1.0.1 dev: true + /is-ip/3.1.0: + resolution: {integrity: sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==} + engines: {node: '>=8'} + dependencies: + ip-regex: 4.3.0 + dev: true + + /is-module/1.0.0: + resolution: {integrity: sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=} + dev: true + /is-negative-zero/2.0.1: resolution: {integrity: sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==} engines: {node: '>= 0.4'} @@ -9441,12 +12760,22 @@ packages: engines: {node: '>=8'} dev: true + /is-plain-obj/3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + dev: true + /is-plain-object/2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 + /is-plain-object/3.0.1: + resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} + engines: {node: '>=0.10.0'} + dev: true + /is-potential-custom-element-name/1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: true @@ -9460,6 +12789,12 @@ packages: engines: {node: '>=0.10.0'} dev: true + /is-reference/1.2.1: + resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} + dependencies: + '@types/estree': 0.0.50 + dev: true + /is-regex/1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -9484,6 +12819,10 @@ packages: is-unc-path: 1.0.0 dev: true + /is-resolvable/1.1.0: + resolution: {integrity: sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==} + dev: true + /is-retry-allowed/1.2.0: resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} engines: {node: '>=0.10.0'} @@ -9614,6 +12953,10 @@ packages: resolution: {integrity: sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==} engines: {node: '>=8'} + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + /istanbul-lib-hook/1.2.2: resolution: {integrity: sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==} dependencies: @@ -9636,11 +12979,11 @@ packages: resolution: {integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==} engines: {node: '>=6'} dependencies: - '@babel/generator': 7.15.8 - '@babel/parser': 7.15.8 - '@babel/template': 7.15.4 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 + '@babel/generator': 7.16.0 + '@babel/parser': 7.16.4 + '@babel/template': 7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 istanbul-lib-coverage: 2.0.5 semver: 6.3.0 transitivePeerDependencies: @@ -9651,9 +12994,21 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.0.1 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /istanbul-lib-instrument/5.1.0: + resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.16.0 + '@babel/parser': 7.16.4 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -9680,7 +13035,7 @@ packages: resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==} engines: {node: '>=8'} dependencies: - istanbul-lib-coverage: 3.0.1 + istanbul-lib-coverage: 3.2.0 make-dir: 3.1.0 supports-color: 7.2.0 @@ -9717,6 +13072,17 @@ packages: transitivePeerDependencies: - supports-color + /istanbul-lib-source-maps/4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.2 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + /istanbul-reports/1.5.1: resolution: {integrity: sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==} dependencies: @@ -9737,6 +13103,14 @@ packages: html-escaper: 2.0.2 istanbul-lib-report: 3.0.0 + /istanbul-reports/3.0.5: + resolution: {integrity: sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.0 + dev: true + /istanbul/1.0.0-alpha.2: resolution: {integrity: sha1-BglrwI6Yuq10Sq5Gli2N+frGPQg=} hasBin: true @@ -9778,35 +13152,35 @@ packages: execa: 3.4.0 throat: 5.0.0 - /jest-changed-files/27.2.4: - resolution: {integrity: sha512-eeO1C1u4ex7pdTroYXezr+rbr957myyVoKGjcY4R1TJi3A+9v+4fu1Iv9J4eLq1bgFyT3O3iRWU9lZsEE7J72Q==} + /jest-changed-files/27.3.0: + resolution: {integrity: sha512-9DJs9garMHv4RhylUMZgbdCJ3+jHSkpL9aaVKp13xtXAD80qLTLrqcDZL1PHA9dYA0bCI86Nv2BhkLpLhrBcPg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 execa: 5.1.1 throat: 6.0.1 dev: true - /jest-circus/27.2.4: - resolution: {integrity: sha512-TtheheTElrGjlsY9VxkzUU1qwIx05ItIusMVKnvNkMt4o/PeegLRcjq3Db2Jz0GGdBalJdbzLZBgeulZAJxJWA==} + /jest-circus/27.3.1: + resolution: {integrity: sha512-v1dsM9II6gvXokgqq6Yh2jHCpfg7ZqV4jWY66u7npz24JnhP3NHxI0sKT7+ZMQ7IrOWHYAaeEllOySbDbWsiXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.2.4 - '@jest/test-result': 27.2.4 - '@jest/types': 27.2.4 + '@jest/environment': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 - expect: 27.2.4 + expect: 27.3.1 is-generator-fn: 2.1.0 - jest-each: 27.2.4 - jest-matcher-utils: 27.2.4 - jest-message-util: 27.2.4 - jest-runtime: 27.2.4 - jest-snapshot: 27.2.4 - jest-util: 27.2.4 - pretty-format: 27.2.4 + jest-each: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-runtime: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + pretty-format: 27.3.1 slash: 3.0.0 stack-utils: 2.0.5 throat: 6.0.1 @@ -9829,7 +13203,7 @@ packages: jest-config: 24.9.0 jest-util: 24.9.0 jest-validate: 24.9.0 - prompts: 2.4.1 + prompts: 2.4.2 realpath-native: 1.1.0 yargs: 13.3.2 transitivePeerDependencies: @@ -9861,8 +13235,8 @@ packages: - supports-color - utf-8-validate - /jest-cli/27.2.4: - resolution: {integrity: sha512-4kpQQkg74HYLaXo3nzwtg4PYxSLgL7puz1LXHj5Tu85KmlIpxQFjRkXlx4V47CYFFIDoyl3rHA/cXOxUWyMpNg==} + /jest-cli/27.3.1: + resolution: {integrity: sha512-WHnCqpfK+6EvT62me6WVs8NhtbjAS4/6vZJnk7/2+oOr50cwAzG4Wxt6RXX0hu6m1169ZGMlhYYUNeKBXCph/Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: @@ -9871,17 +13245,17 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.2.4 - '@jest/test-result': 27.2.4 - '@jest/types': 27.2.4 + '@jest/core': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.8 import-local: 3.0.3 - jest-config: 27.2.4 - jest-util: 27.2.4 - jest-validate: 27.2.4 - prompts: 2.4.1 + jest-config: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + prompts: 2.4.2 yargs: 16.2.0 transitivePeerDependencies: - bufferutil @@ -9895,10 +13269,10 @@ packages: resolution: {integrity: sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==} engines: {node: '>= 6'} dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@jest/test-sequencer': 24.9.0 '@jest/types': 24.9.0 - babel-jest: 24.9.0_@babel+core@7.15.8 + babel-jest: 24.9.0_@babel+core@7.16.0 chalk: 2.4.2 glob: 7.2.0 jest-environment-jsdom: 24.9.0 @@ -9954,27 +13328,27 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.15.8 - '@jest/test-sequencer': 27.2.4 - '@jest/types': 27.2.4 - babel-jest: 27.2.4_@babel+core@7.15.8 + '@babel/core': 7.16.0 + '@jest/test-sequencer': 27.3.1 + '@jest/types': 27.2.5 + babel-jest: 27.3.1_@babel+core@7.16.0 chalk: 4.1.2 deepmerge: 4.2.2 glob: 7.2.0 graceful-fs: 4.2.8 - is-ci: 3.0.0 - jest-circus: 27.2.4 - jest-environment-jsdom: 27.2.4 - jest-environment-node: 27.2.4 - jest-get-type: 27.0.6 - jest-jasmine2: 27.2.4 + is-ci: 3.0.1 + jest-circus: 27.3.1 + jest-environment-jsdom: 27.3.1 + jest-environment-node: 27.3.1 + jest-get-type: 27.3.1 + jest-jasmine2: 27.3.1 jest-regex-util: 27.0.6 - jest-resolve: 27.2.4 - jest-runner: 27.2.4 - jest-util: 27.2.4 - jest-validate: 27.2.4 + jest-resolve: 27.3.1 + jest-runner: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 micromatch: 4.0.4 - pretty-format: 27.2.4 + pretty-format: 27.3.1 transitivePeerDependencies: - bufferutil - canvas @@ -9982,8 +13356,8 @@ packages: - utf-8-validate dev: true - /jest-config/27.2.4: - resolution: {integrity: sha512-tWy0UxhdzqiKyp4l5Vq4HxLyD+gH5td+GCF3c22/DJ0bYAOsMo+qi2XtbJI6oYMH5JOJQs9nLW/r34nvFCehjA==} + /jest-config/27.2.2_ts-node@9.1.1: + resolution: {integrity: sha512-2nhms3lp52ZpU0636bB6zIFHjDVtYxzFQIOHZjBFUeXcb6b41sEkWojbHaJ4FEIO44UbccTLa7tvNpiFCgPE7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} peerDependencies: ts-node: '>=9.0.0' @@ -9991,27 +13365,65 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.15.8 - '@jest/test-sequencer': 27.2.4 - '@jest/types': 27.2.4 - babel-jest: 27.2.4_@babel+core@7.15.8 + '@babel/core': 7.16.0 + '@jest/test-sequencer': 27.3.1 + '@jest/types': 27.2.5 + babel-jest: 27.3.1_@babel+core@7.16.0 chalk: 4.1.2 deepmerge: 4.2.2 glob: 7.2.0 graceful-fs: 4.2.8 - is-ci: 3.0.0 - jest-circus: 27.2.4 - jest-environment-jsdom: 27.2.4 - jest-environment-node: 27.2.4 - jest-get-type: 27.0.6 - jest-jasmine2: 27.2.4 + is-ci: 3.0.1 + jest-circus: 27.3.1 + jest-environment-jsdom: 27.3.1 + jest-environment-node: 27.3.1 + jest-get-type: 27.3.1 + jest-jasmine2: 27.3.1 jest-regex-util: 27.0.6 - jest-resolve: 27.2.4 - jest-runner: 27.2.4 - jest-util: 27.2.4 - jest-validate: 27.2.4 + jest-resolve: 27.3.1 + jest-runner: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 micromatch: 4.0.4 - pretty-format: 27.2.4 + pretty-format: 27.3.1 + ts-node: 9.1.1_typescript@4.2.4 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-config/27.3.1: + resolution: {integrity: sha512-KY8xOIbIACZ/vdYCKSopL44I0xboxC751IX+DXL2+Wx6DKNycyEfV3rryC3BPm5Uq/BBqDoMrKuqLEUNJmMKKg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.16.0 + '@jest/test-sequencer': 27.3.1 + '@jest/types': 27.2.5 + babel-jest: 27.3.1_@babel+core@7.16.0 + chalk: 4.1.2 + ci-info: 3.2.0 + deepmerge: 4.2.2 + glob: 7.2.0 + graceful-fs: 4.2.8 + jest-circus: 27.3.1 + jest-environment-jsdom: 27.3.1 + jest-environment-node: 27.3.1 + jest-get-type: 27.3.1 + jest-jasmine2: 27.3.1 + jest-regex-util: 27.0.6 + jest-resolve: 27.3.1 + jest-runner: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 + micromatch: 4.0.4 + pretty-format: 27.3.1 transitivePeerDependencies: - bufferutil - canvas @@ -10025,7 +13437,7 @@ packages: chalk: 3.0.0 cwd: 0.10.0 find-process: 1.4.5 - prompts: 2.4.1 + prompts: 2.4.2 spawnd: 4.4.0 tree-kill: 1.2.2 wait-on: 3.3.0 @@ -10061,14 +13473,14 @@ packages: jest-get-type: 26.3.0 pretty-format: 26.6.2 - /jest-diff/27.2.4: - resolution: {integrity: sha512-bLAVlDSCR3gqUPGv+4nzVpEXGsHh98HjUL7Vb2hVyyuBDoQmja8eJb0imUABsuxBeUVmf47taJSAd9nDrwWKEg==} + /jest-diff/27.3.1: + resolution: {integrity: sha512-PCeuAH4AWUo2O5+ksW4pL9v5xJAcIKPUPfIhZBcG1RKv/0+dvaWTQK1Nrau8d67dp65fOqbeMdoil+6PedyEPQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.2 diff-sequences: 27.0.6 - jest-get-type: 27.0.6 - pretty-format: 27.2.4 + jest-get-type: 27.3.1 + pretty-format: 27.3.1 dev: true /jest-docblock/24.9.0: @@ -10112,15 +13524,15 @@ packages: jest-util: 25.5.0 pretty-format: 25.5.0 - /jest-each/27.2.4: - resolution: {integrity: sha512-w9XVc+0EDBUTJS4xBNJ7N2JCcWItFd006lFjz77OarAQcQ10eFDBMrfDv2GBJMKlXe9aq0HrIIF51AXcZrRJyg==} + /jest-each/27.3.1: + resolution: {integrity: sha512-E4SwfzKJWYcvOYCjOxhZcxwL+AY0uFMvdCOwvzgutJiaiodFjkxQQDxHm8FQBeTqDnSmKsQWn7ldMRzTn2zJaQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 chalk: 4.1.2 - jest-get-type: 27.0.6 - jest-util: 27.2.4 - pretty-format: 27.2.4 + jest-get-type: 27.3.1 + jest-util: 27.3.1 + pretty-format: 27.3.1 dev: true /jest-environment-jsdom/24.9.0: @@ -10152,16 +13564,16 @@ packages: - canvas - utf-8-validate - /jest-environment-jsdom/27.2.4: - resolution: {integrity: sha512-X70pTXFSypD7AIzKT1mLnDi5hP9w9mdTRcOGOmoDoBrNyNEg4rYm6d4LQWFLc9ps1VnMuDOkFSG0wjSNYGjkng==} + /jest-environment-jsdom/27.3.1: + resolution: {integrity: sha512-3MOy8qMzIkQlfb3W1TfrD7uZHj+xx8Olix5vMENkj5djPmRqndMaXtpnaZkxmxM+Qc3lo+yVzJjzuXbCcZjAlg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.2.4 - '@jest/fake-timers': 27.2.4 - '@jest/types': 27.2.4 + '@jest/environment': 27.3.1 + '@jest/fake-timers': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 - jest-mock: 27.2.4 - jest-util: 27.2.4 + jest-mock: 27.3.0 + jest-util: 27.3.1 jsdom: 16.7.0 transitivePeerDependencies: - bufferutil @@ -10194,16 +13606,16 @@ packages: jest-util: 25.5.0 semver: 6.3.0 - /jest-environment-node/27.2.4: - resolution: {integrity: sha512-ZbVbFSnbzTvhLOIkqh5lcLuGCCFvtG4xTXIRPK99rV2KzQT3kNg16KZwfTnLNlIiWCE8do960eToeDfcqmpSAw==} + /jest-environment-node/27.3.1: + resolution: {integrity: sha512-T89F/FgkE8waqrTSA7/ydMkcc52uYPgZZ6q8OaZgyiZkJb5QNNCF6oPZjH9IfPFfcc9uBWh1574N0kY0pSvTXw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/environment': 27.2.4 - '@jest/fake-timers': 27.2.4 - '@jest/types': 27.2.4 + '@jest/environment': 27.3.1 + '@jest/fake-timers': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 - jest-mock: 27.2.4 - jest-util: 27.2.4 + jest-mock: 27.3.0 + jest-util: 27.3.1 dev: true /jest-environment-puppeteer/4.4.0: @@ -10230,8 +13642,8 @@ packages: resolution: {integrity: sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==} engines: {node: '>= 10.14.2'} - /jest-get-type/27.0.6: - resolution: {integrity: sha512-XTkK5exIeUbbveehcSR8w0bhH+c0yloW/Wpl+9vZrjzztCPWrxhHwkIFpZzCt71oRBsgxmuUfxEqOYoZI2macg==} + /jest-get-type/27.3.1: + resolution: {integrity: sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dev: true @@ -10249,7 +13661,7 @@ packages: jest-worker: 24.9.0 micromatch: 3.1.10 sane: 4.1.0 - walker: 1.0.7 + walker: 1.0.8 optionalDependencies: fsevents: 1.2.13 dev: false @@ -10273,11 +13685,11 @@ packages: optionalDependencies: fsevents: 2.3.2 - /jest-haste-map/27.2.4: - resolution: {integrity: sha512-bkJ4bT00T2K+1NZXbRcyKnbJ42I6QBvoDNMTAQQDBhaGNnZreiQKUNqax0e6hLTx7E75pKDeltVu3V1HAdu+YA==} + /jest-haste-map/27.3.1: + resolution: {integrity: sha512-lYfNZIzwPccDJZIyk9Iz5iQMM/MH56NIIcGj7AFU1YyA4ewWFBl8z+YPJuSCRML/ee2cCt2y3W4K3VXPT6Nhzg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 '@types/graceful-fs': 4.1.5 '@types/node': 16.10.3 anymatch: 3.1.2 @@ -10285,10 +13697,10 @@ packages: graceful-fs: 4.2.8 jest-regex-util: 27.0.6 jest-serializer: 27.0.6 - jest-util: 27.2.4 - jest-worker: 27.2.4 + jest-util: 27.3.1 + jest-worker: 27.3.1 micromatch: 4.0.4 - walker: 1.0.7 + walker: 1.0.8 optionalDependencies: fsevents: 2.3.2 dev: true @@ -10297,7 +13709,7 @@ packages: resolution: {integrity: sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==} engines: {node: '>= 6'} dependencies: - '@babel/traverse': 7.15.4 + '@babel/traverse': 7.16.3 '@jest/environment': 24.9.0 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 @@ -10321,7 +13733,7 @@ packages: resolution: {integrity: sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==} engines: {node: '>= 8.3'} dependencies: - '@babel/traverse': 7.15.4 + '@babel/traverse': 7.16.0 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -10344,27 +13756,27 @@ packages: - supports-color - utf-8-validate - /jest-jasmine2/27.2.4: - resolution: {integrity: sha512-fcffjO/xLWLVnW2ct3No4EksxM5RyPwHDYu9QU+90cC+/eSMLkFAxS55vkqsxexOO5zSsZ3foVpMQcg/amSeIQ==} + /jest-jasmine2/27.3.1: + resolution: {integrity: sha512-WK11ZUetDQaC09w4/j7o4FZDUIp+4iYWH/Lik34Pv7ukL+DuXFGdnmmi7dT58J2ZYKFB5r13GyE0z3NPeyJmsg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/traverse': 7.15.4 - '@jest/environment': 27.2.4 + '@babel/traverse': 7.16.3 + '@jest/environment': 27.3.1 '@jest/source-map': 27.0.6 - '@jest/test-result': 27.2.4 - '@jest/types': 27.2.4 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 chalk: 4.1.2 co: 4.6.0 - expect: 27.2.4 + expect: 27.3.1 is-generator-fn: 2.1.0 - jest-each: 27.2.4 - jest-matcher-utils: 27.2.4 - jest-message-util: 27.2.4 - jest-runtime: 27.2.4 - jest-snapshot: 27.2.4 - jest-util: 27.2.4 - pretty-format: 27.2.4 + jest-each: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-runtime: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + pretty-format: 27.3.1 throat: 6.0.1 transitivePeerDependencies: - supports-color @@ -10385,12 +13797,12 @@ packages: jest-get-type: 25.2.6 pretty-format: 25.5.0 - /jest-leak-detector/27.2.4: - resolution: {integrity: sha512-SrcHWbe0EHg/bw2uBjVoHacTo5xosl068x2Q0aWsjr2yYuW2XwqrSkZV4lurUop0jhv1709ymG4or+8E4sH27Q==} + /jest-leak-detector/27.3.1: + resolution: {integrity: sha512-78QstU9tXbaHzwlRlKmTpjP9k4Pvre5l0r8Spo4SbFFVy/4Abg9I6ZjHwjg2QyKEAMg020XcjP+UgLZIY50yEg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - jest-get-type: 27.0.6 - pretty-format: 27.2.4 + jest-get-type: 27.3.1 + pretty-format: 27.3.1 dev: true /jest-matcher-utils/24.9.0: @@ -10421,21 +13833,21 @@ packages: jest-get-type: 26.3.0 pretty-format: 26.6.2 - /jest-matcher-utils/27.2.4: - resolution: {integrity: sha512-nQeLfFAIPPkyhkDfifAPfP/U5wm1x0fLtAzqXZSSKckXDNuk2aaOfQiDYv1Mgf5GY6yOsxfUnvNm3dDjXM+BXw==} + /jest-matcher-utils/27.3.1: + resolution: {integrity: sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: chalk: 4.1.2 - jest-diff: 27.2.4 - jest-get-type: 27.0.6 - pretty-format: 27.2.4 + jest-diff: 27.3.1 + jest-get-type: 27.3.1 + pretty-format: 27.3.1 dev: true /jest-message-util/24.9.0: resolution: {integrity: sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==} engines: {node: '>= 6'} dependencies: - '@babel/code-frame': 7.15.8 + '@babel/code-frame': 7.16.0 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 '@types/stack-utils': 1.0.1 @@ -10449,7 +13861,7 @@ packages: resolution: {integrity: sha512-ezddz3YCT/LT0SKAmylVyWWIGYoKHOFOFXx3/nA4m794lfVUskMcwhip6vTgdVrOtYdjeQeis2ypzes9mZb4EA==} engines: {node: '>= 8.3'} dependencies: - '@babel/code-frame': 7.15.8 + '@babel/code-frame': 7.16.0 '@jest/types': 25.5.0 '@types/stack-utils': 1.0.1 chalk: 3.0.0 @@ -10472,32 +13884,21 @@ packages: slash: 3.0.0 stack-utils: 2.0.5 - /jest-message-util/27.2.4: - resolution: {integrity: sha512-wbKT/BNGnBVB9nzi+IoaLkXt6fbSvqUxx+IYY66YFh96J3goY33BAaNG3uPqaw/Sh/FR9YpXGVDfd5DJdbh4nA==} + /jest-message-util/27.3.1: + resolution: {integrity: sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/code-frame': 7.15.8 - '@jest/types': 27.2.4 + '@babel/code-frame': 7.16.0 + '@jest/types': 27.2.5 '@types/stack-utils': 2.0.1 chalk: 4.1.2 graceful-fs: 4.2.8 micromatch: 4.0.4 - pretty-format: 27.2.4 + pretty-format: 27.3.1 slash: 3.0.0 stack-utils: 2.0.5 dev: true - /jest-mock-extended/1.0.18_jest@25.5.4+typescript@3.9.7: - resolution: {integrity: sha512-qf1n7lIa2dTxxPIBr+FlXrbj3hnV1sG9DPZsrr2H/8W+Jw0wt6OmeOQsPcjRuW8EXIECC9pDXsSIfEdn+HP7JQ==} - peerDependencies: - jest: ^24.0.0 || ^25.0.0 || ^26.0.0 || ^27.0.0 - typescript: ^3.0.0 || ^4.0.0 - dependencies: - jest: 25.5.4 - ts-essentials: 7.0.3_typescript@3.9.7 - typescript: 3.9.7 - dev: true - /jest-mock/24.9.0: resolution: {integrity: sha512-3BEYN5WbSq9wd+SyLDES7AHnjH9A/ROBwmz7l2y+ol+NtSFO8DYiEBzoO1CeFc9a8DYy10EO4dDFVv/wN3zl1w==} engines: {node: '>= 6'} @@ -10518,11 +13919,11 @@ packages: '@jest/types': 26.6.2 '@types/node': 16.10.3 - /jest-mock/27.2.4: - resolution: {integrity: sha512-iVRU905rutaAoUcrt5Tm1JoHHWi24YabqEGXjPJI4tAyA6wZ7mzDi3GrZ+M7ebgWBqUkZE93GAx1STk7yCMIQA==} + /jest-mock/27.3.0: + resolution: {integrity: sha512-ziZiLk0elZOQjD08bLkegBzv5hCABu/c8Ytx45nJKkysQwGaonvmTxwjLqEA4qGdasq9o2I8/HtdGMNnVsMTGw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 '@types/node': 16.10.3 dev: true @@ -10561,7 +13962,7 @@ packages: jest-resolve: 27.2.2 dev: true - /jest-pnp-resolver/1.2.2_jest-resolve@27.2.4: + /jest-pnp-resolver/1.2.2_jest-resolve@27.3.1: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} peerDependencies: @@ -10570,7 +13971,7 @@ packages: jest-resolve: optional: true dependencies: - jest-resolve: 27.2.4 + jest-resolve: 27.3.1 dev: true /jest-puppeteer/4.4.0: @@ -10619,13 +14020,13 @@ packages: jest-regex-util: 25.2.6 jest-snapshot: 25.5.1 - /jest-resolve-dependencies/27.2.4: - resolution: {integrity: sha512-i5s7Uh9B3Q6uwxLpMhNKlgBf6pcemvWaORxsW1zNF/YCY3jd5EftvnGBI+fxVwJ1CBxkVfxqCvm1lpZkbaoGmg==} + /jest-resolve-dependencies/27.3.1: + resolution: {integrity: sha512-X7iLzY8pCiYOnvYo2YrK3P9oSE8/3N2f4pUZMJ8IUcZnT81vlSonya1KTO9ZfKGuC+svE6FHK/XOb8SsoRUV1A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 jest-regex-util: 27.0.6 - jest-snapshot: 27.2.4 + jest-snapshot: 27.3.1 transitivePeerDependencies: - supports-color dev: true @@ -10659,31 +14060,31 @@ packages: resolution: {integrity: sha512-tfbHcBs/hJTb3fPQ/3hLWR+TsLNTzzK98TU+zIAsrL9nNzWfWROwopUOmiSUqmHMZW5t9au/433kSF2/Af+tTw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 chalk: 4.1.2 escalade: 3.1.1 graceful-fs: 4.2.8 - jest-haste-map: 27.2.4 + jest-haste-map: 27.3.1 jest-pnp-resolver: 1.2.2_jest-resolve@27.2.2 - jest-util: 27.2.4 - jest-validate: 27.2.4 + jest-util: 27.3.1 + jest-validate: 27.3.1 resolve: 1.20.0 slash: 3.0.0 dev: true - /jest-resolve/27.2.4: - resolution: {integrity: sha512-IsAO/3+3BZnKjI2I4f3835TBK/90dxR7Otgufn3mnrDFTByOSXclDi3G2XJsawGV4/18IMLARJ+V7Wm7t+J89Q==} + /jest-resolve/27.3.1: + resolution: {integrity: sha512-Dfzt25CFSPo3Y3GCbxynRBZzxq9AdyNN+x/v2IqYx6KVT5Z6me2Z/PsSGFSv3cOSUZqJ9pHxilao/I/m9FouLw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 chalk: 4.1.2 - escalade: 3.1.1 graceful-fs: 4.2.8 - jest-haste-map: 27.2.4 - jest-pnp-resolver: 1.2.2_jest-resolve@27.2.4 - jest-util: 27.2.4 - jest-validate: 27.2.4 + jest-haste-map: 27.3.1 + jest-pnp-resolver: 1.2.2_jest-resolve@27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 resolve: 1.20.0 + resolve.exports: 1.1.0 slash: 3.0.0 dev: true @@ -10751,30 +14152,30 @@ packages: - supports-color - utf-8-validate - /jest-runner/27.2.4: - resolution: {integrity: sha512-hIo5PPuNUyVDidZS8EetntuuJbQ+4IHWxmHgYZz9FIDbG2wcZjrP6b52uMDjAEQiHAn8yn8ynNe+TL8UuGFYKg==} + /jest-runner/27.3.1: + resolution: {integrity: sha512-r4W6kBn6sPr3TBwQNmqE94mPlYVn7fLBseeJfo4E2uCTmAyDFm2O5DYAQAFP7Q3YfiA/bMwg8TVsciP7k0xOww==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.2.4 - '@jest/environment': 27.2.4 - '@jest/test-result': 27.2.4 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@jest/console': 27.3.1 + '@jest/environment': 27.3.1 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 graceful-fs: 4.2.8 jest-docblock: 27.0.6 - jest-environment-jsdom: 27.2.4 - jest-environment-node: 27.2.4 - jest-haste-map: 27.2.4 - jest-leak-detector: 27.2.4 - jest-message-util: 27.2.4 - jest-resolve: 27.2.4 - jest-runtime: 27.2.4 - jest-util: 27.2.4 - jest-worker: 27.2.4 + jest-environment-jsdom: 27.3.1 + jest-environment-node: 27.3.1 + jest-haste-map: 27.3.1 + jest-leak-detector: 27.3.1 + jest-message-util: 27.3.1 + jest-resolve: 27.3.1 + jest-runtime: 27.3.1 + jest-util: 27.3.1 + jest-worker: 27.3.1 source-map-support: 0.5.20 throat: 6.0.1 transitivePeerDependencies: @@ -10853,18 +14254,17 @@ packages: - supports-color - utf-8-validate - /jest-runtime/27.2.4: - resolution: {integrity: sha512-ICKzzYdjIi70P17MZsLLIgIQFCQmIjMFf+xYww3aUySiUA/QBPUTdUqo5B2eg4HOn9/KkUsV0z6GVgaqAPBJvg==} + /jest-runtime/27.3.1: + resolution: {integrity: sha512-qtO6VxPbS8umqhEDpjA4pqTkKQ1Hy4ZSi9mDVeE9Za7LKBo2LdW2jmT+Iod3XFaJqINikZQsn2wEi0j9wPRbLg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/console': 27.2.4 - '@jest/environment': 27.2.4 - '@jest/fake-timers': 27.2.4 - '@jest/globals': 27.2.4 + '@jest/console': 27.3.1 + '@jest/environment': 27.3.1 + '@jest/globals': 27.3.1 '@jest/source-map': 27.0.6 - '@jest/test-result': 27.2.4 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@jest/test-result': 27.3.1 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 '@types/yargs': 16.0.4 chalk: 4.1.2 cjs-module-lexer: 1.2.2 @@ -10873,14 +14273,14 @@ packages: exit: 0.1.2 glob: 7.2.0 graceful-fs: 4.2.8 - jest-haste-map: 27.2.4 - jest-message-util: 27.2.4 - jest-mock: 27.2.4 + jest-haste-map: 27.3.1 + jest-message-util: 27.3.1 + jest-mock: 27.3.0 jest-regex-util: 27.0.6 - jest-resolve: 27.2.4 - jest-snapshot: 27.2.4 - jest-util: 27.2.4 - jest-validate: 27.2.4 + jest-resolve: 27.3.1 + jest-snapshot: 27.3.1 + jest-util: 27.3.1 + jest-validate: 27.3.1 slash: 3.0.0 strip-bom: 4.0.0 yargs: 16.2.0 @@ -10911,7 +14311,7 @@ packages: resolution: {integrity: sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==} engines: {node: '>= 6'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 '@jest/types': 24.9.0 chalk: 2.4.2 expect: 24.9.0 @@ -10930,7 +14330,7 @@ packages: resolution: {integrity: sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==} engines: {node: '>= 8.3'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -10946,33 +14346,33 @@ packages: pretty-format: 25.5.0 semver: 6.3.0 - /jest-snapshot/27.2.4: - resolution: {integrity: sha512-5DFxK31rYS8X8C6WXsFx8XxrxW3PGa6+9IrUcZdTLg1aEyXDGIeiBh4jbwvh655bg/9vTETbEj/njfZicHTZZw==} + /jest-snapshot/27.3.1: + resolution: {integrity: sha512-APZyBvSgQgOT0XumwfFu7X3G5elj6TGhCBLbBdn3R1IzYustPGPE38F51dBWMQ8hRXa9je0vAdeVDtqHLvB6lg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.15.8 - '@babel/generator': 7.15.8 - '@babel/parser': 7.15.8 - '@babel/plugin-syntax-typescript': 7.14.5_@babel+core@7.15.8 - '@babel/traverse': 7.15.4 - '@babel/types': 7.15.6 - '@jest/transform': 27.2.4 - '@jest/types': 27.2.4 + '@babel/core': 7.16.0 + '@babel/generator': 7.16.0 + '@babel/parser': 7.16.4 + '@babel/plugin-syntax-typescript': 7.16.0_@babel+core@7.16.0 + '@babel/traverse': 7.16.3 + '@babel/types': 7.16.0 + '@jest/transform': 27.3.1 + '@jest/types': 27.2.5 '@types/babel__traverse': 7.14.2 - '@types/prettier': 2.4.1 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.15.8 + '@types/prettier': 2.4.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.16.0 chalk: 4.1.2 - expect: 27.2.4 + expect: 27.3.1 graceful-fs: 4.2.8 - jest-diff: 27.2.4 - jest-get-type: 27.0.6 - jest-haste-map: 27.2.4 - jest-matcher-utils: 27.2.4 - jest-message-util: 27.2.4 - jest-resolve: 27.2.4 - jest-util: 27.2.4 + jest-diff: 27.3.1 + jest-get-type: 27.3.1 + jest-haste-map: 27.3.1 + jest-matcher-utils: 27.3.1 + jest-message-util: 27.3.1 + jest-resolve: 27.3.1 + jest-util: 27.3.1 natural-compare: 1.4.0 - pretty-format: 27.2.4 + pretty-format: 27.3.1 semver: 7.3.5 transitivePeerDependencies: - supports-color @@ -11021,23 +14421,23 @@ packages: resolution: {integrity: sha512-T5ZJCNeFpqcLBpx+Hl9r9KoxBCUqeWlJ1Htli+vryigZVJ1vuLB9j35grEBASp4R13KFkV7jM52bBGnArpJN6A==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 '@types/node': 16.10.3 chalk: 4.1.2 graceful-fs: 4.2.8 - is-ci: 3.0.0 + is-ci: 3.0.1 picomatch: 2.3.0 dev: true - /jest-util/27.2.4: - resolution: {integrity: sha512-mW++4u+fSvAt3YBWm5IpbmRAceUqa2B++JlUZTiuEt2AmNYn0Yw5oay4cP17TGsMINRNPSGiJ2zNnX60g+VbFg==} + /jest-util/27.3.1: + resolution: {integrity: sha512-8fg+ifEH3GDryLQf/eKZck1DEs2YuVPBCMOaHQxVVLmQwl/CDhWzrvChTX4efLZxGrw+AA0mSXv78cyytBt/uw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 '@types/node': 16.10.3 chalk: 4.1.2 + ci-info: 3.2.0 graceful-fs: 4.2.8 - is-ci: 3.0.0 picomatch: 2.3.0 dev: true @@ -11064,16 +14464,16 @@ packages: leven: 3.1.0 pretty-format: 25.5.0 - /jest-validate/27.2.4: - resolution: {integrity: sha512-VMtbxbkd7LHnIH7PChdDtrluCFRJ4b1YV2YJzNwwsASMWftq/HgqiqjvptBOWyWOtevgO3f14wPxkPcLlVBRog==} + /jest-validate/27.3.1: + resolution: {integrity: sha512-3H0XCHDFLA9uDII67Bwi1Vy7AqwA5HqEEjyy934lgVhtJ3eisw6ShOF1MDmRPspyikef5MyExvIm0/TuLzZ86Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 - camelcase: 6.2.0 + '@jest/types': 27.2.5 + camelcase: 6.2.1 chalk: 4.1.2 - jest-get-type: 27.0.6 + jest-get-type: 27.3.1 leven: 3.1.0 - pretty-format: 27.2.4 + pretty-format: 27.3.1 dev: true /jest-watcher/24.9.0: @@ -11100,16 +14500,16 @@ packages: jest-util: 25.5.0 string-length: 3.1.0 - /jest-watcher/27.2.4: - resolution: {integrity: sha512-LXC/0+dKxhK7cfF7reflRYlzDIaQE+fL4ynhKhzg8IMILNMuI4xcjXXfUJady7OR4/TZeMg7X8eHx8uan9vqaQ==} + /jest-watcher/27.3.1: + resolution: {integrity: sha512-9/xbV6chABsGHWh9yPaAGYVVKurWoP3ZMCv6h+O1v9/+pkOroigs6WzZ0e9gLP/njokUwM7yQhr01LKJVMkaZA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/test-result': 27.2.4 - '@jest/types': 27.2.4 + '@jest/test-result': 27.3.1 + '@jest/types': 27.2.5 '@types/node': 16.10.3 ansi-escapes: 4.3.2 chalk: 4.1.2 - jest-util: 27.2.4 + jest-util: 27.3.1 string-length: 4.0.2 dev: true @@ -11128,8 +14528,8 @@ packages: merge-stream: 2.0.0 supports-color: 7.2.0 - /jest-worker/27.2.4: - resolution: {integrity: sha512-Zq9A2Pw59KkVjBBKD1i3iE2e22oSjXhUKKuAK1HGX8flGwkm6NMozyEYzKd41hXc64dbd/0eWFeEEuxqXyhM+g==} + /jest-worker/27.3.1: + resolution: {integrity: sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==} engines: {node: '>= 10.13.0'} dependencies: '@types/node': 16.10.3 @@ -11162,8 +14562,8 @@ packages: - supports-color - utf-8-validate - /jest/27.2.4: - resolution: {integrity: sha512-h4uqb1EQLfPulWyUFFWv9e9Nn8sCqsJ/j3wk/KCY0p4s4s0ICCfP3iMf6hRf5hEhsDyvyrCgKiZXma63gMz16A==} + /jest/27.3.1: + resolution: {integrity: sha512-U2AX0AgQGd5EzMsiZpYt8HyZ+nSVIh5ujQ9CPp9EQZJMjXIiSZpJNweZl0swatKRoqHWgGKM3zaSwm4Zaz87ng==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true peerDependencies: @@ -11172,9 +14572,9 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 27.2.4 + '@jest/core': 27.3.1 import-local: 3.0.3 - jest-cli: 27.2.4 + jest-cli: 27.3.1 transitivePeerDependencies: - bufferutil - canvas @@ -11209,6 +14609,13 @@ packages: argparse: 1.0.10 esprima: 4.0.1 + /js-yaml/4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + /jsbn/0.1.1: resolution: {integrity: sha1-peZUwuWi3rXyAdls77yoDA7y9RM=} @@ -11384,6 +14791,12 @@ packages: resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} dev: true + /jsonfile/4.0.0: + resolution: {integrity: sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=} + optionalDependencies: + graceful-fs: 4.2.8 + dev: true + /jsonfile/6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -11440,6 +14853,11 @@ packages: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} + /klona/2.0.5: + resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==} + engines: {node: '>= 8'} + dev: true + /known-css-properties/0.21.0: resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} dev: true @@ -11476,6 +14894,34 @@ packages: deprecated: use String.prototype.padStart() dev: false + /less-loader/10.2.0_less@3.12.2+webpack@5.64.1: + resolution: {integrity: sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + less: ^3.5.0 || ^4.0.0 + webpack: ^5.0.0 + dependencies: + klona: 2.0.5 + less: 3.12.2 + webpack: 5.64.1 + dev: true + + /less/3.12.2: + resolution: {integrity: sha512-+1V2PCMFkL+OIj2/HrtrvZw0BC0sYLMICJfbQjuj/K8CEnlrFX6R5cKKgzzttsZDHyxQNL1jqMREjKN3ja/E3Q==} + engines: {node: '>=6'} + hasBin: true + dependencies: + tslib: 1.14.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.8 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + native-request: 1.1.0 + source-map: 0.6.1 + dev: true + /leven/3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -11495,6 +14941,13 @@ packages: type-check: 0.4.0 dev: true + /license-webpack-plugin/2.3.15: + resolution: {integrity: sha512-reA0yvwvkkFMRsyqVikTcLGFXmgWKPVXrFaR3tRvAnFoZozM4zvwlNNQxuB5Il6fgTtS7nGkrIPm9xS2KZtu7g==} + dependencies: + '@types/webpack-sources': 0.1.9 + webpack-sources: 1.4.3 + dev: true + /liftoff/2.5.0: resolution: {integrity: sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=} engines: {node: '>= 0.8'} @@ -11509,6 +14962,11 @@ packages: resolve: 1.20.0 dev: true + /lilconfig/2.0.4: + resolution: {integrity: sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==} + engines: {node: '>=10'} + dev: true + /lines-and-columns/1.1.6: resolution: {integrity: sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=} @@ -11618,6 +15076,20 @@ packages: engines: {node: '>=4.3.0 <5.0.0 || >=5.10'} dev: true + /loader-runner/4.2.0: + resolution: {integrity: sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==} + engines: {node: '>=6.11.5'} + dev: true + + /loader-utils/1.2.3: + resolution: {integrity: sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==} + engines: {node: '>=4.0.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 2.1.0 + json5: 1.0.1 + dev: true + /loader-utils/1.4.0: resolution: {integrity: sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==} engines: {node: '>=4.0.0'} @@ -11627,6 +15099,15 @@ packages: json5: 1.0.1 dev: true + /loader-utils/2.0.2: + resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==} + engines: {node: '>=8.9.0'} + dependencies: + big.js: 5.2.2 + emojis-list: 3.0.0 + json5: 2.2.0 + dev: true + /locate-path/2.0.0: resolution: {integrity: sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=} engines: {node: '>=4'} @@ -11648,6 +15129,17 @@ packages: dependencies: p-locate: 4.1.0 + /locate-path/6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.camelcase/4.3.0: + resolution: {integrity: sha1-soqmKIorn8ZRA1x3EfZathkDMaY=} + dev: true + /lodash.clonedeep/4.5.0: resolution: {integrity: sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=} dev: true @@ -11686,6 +15178,10 @@ packages: resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} dev: true + /lodash.uniq/4.5.0: + resolution: {integrity: sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=} + dev: true + /lodash/4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -11767,6 +15263,12 @@ packages: dependencies: yallist: 4.0.0 + /magic-string/0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + dependencies: + sourcemap-codec: 1.4.8 + dev: true + /make-dir/1.3.0: resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} engines: {node: '>=4'} @@ -11777,6 +15279,7 @@ packages: /make-dir/2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} + requiresBuild: true dependencies: pify: 4.0.1 semver: 5.7.1 @@ -11803,6 +15306,11 @@ packages: dependencies: tmpl: 1.0.5 + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + /map-cache/0.2.2: resolution: {integrity: sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=} engines: {node: '>=0.10.0'} @@ -11877,6 +15385,22 @@ packages: resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} dev: true + /mdn-data/2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + dev: true + + /media-typer/0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + dev: true + + /memfs/3.3.0: + resolution: {integrity: sha512-BEE62uMfKOavX3iG7GYX43QJ+hAeeWnwIAuJ/R6q96jaMtiLzhsxHJC8B1L7fK7Pt/vXDRwb3SG/yBpNGDPqzg==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.3 + dev: true + /memize/1.1.0: resolution: {integrity: sha512-K4FcPETOMTwe7KL2LK0orMhpOmWD2wRGwWWpbZy0fyArwsyIKR8YJVz8+efBAh3BO4zPqlSICu4vsLTRRqtFAg==} dev: false @@ -11944,6 +15468,10 @@ packages: kind-of: 3.2.2 dev: false + /merge-descriptors/1.0.1: + resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=} + dev: true + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -11959,7 +15487,6 @@ packages: /methods/1.1.2: resolution: {integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=} engines: {node: '>= 0.6'} - dev: false /micromark/2.11.4: resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} @@ -12008,8 +15535,8 @@ packages: engines: {node: '>= 0.6'} dev: false - /mime-db/1.50.0: - resolution: {integrity: sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==} + /mime-db/1.51.0: + resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} engines: {node: '>= 0.6'} /mime-format/2.0.1: @@ -12025,11 +15552,17 @@ packages: mime-db: 1.49.0 dev: false - /mime-types/2.1.33: - resolution: {integrity: sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==} + /mime-types/2.1.34: + resolution: {integrity: sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==} engines: {node: '>= 0.6'} dependencies: - mime-db: 1.50.0 + mime-db: 1.51.0 + + /mime/1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + dev: true /mime/2.5.2: resolution: {integrity: sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==} @@ -12050,6 +15583,21 @@ packages: engines: {node: '>=4'} dev: true + /mini-css-extract-plugin/2.4.4_webpack@5.64.1: + resolution: {integrity: sha512-UJ+aNuFQaQaECu7AamlWOBLj2cJ6XSGU4zNiqXeZ7lZLe5VD0DoSPWFbWArXueo+6FZVbgHzpX9lUIaBIDLuYg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + schema-utils: 3.1.1 + webpack: 5.64.1 + dev: true + + /mini-svg-data-uri/1.4.3: + resolution: {integrity: sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==} + hasBin: true + dev: true + /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} dev: true @@ -12171,14 +15719,6 @@ packages: run-queue: 1.0.3 dev: true - /moxios/0.4.0_axios@0.21.2: - resolution: {integrity: sha1-/A2ixlR31yXKa5Z51YNw7QxS9Ts=} - peerDependencies: - axios: '>= 0.13.0' - dependencies: - axios: 0.21.2 - dev: true - /ms/2.0.0: resolution: {integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=} @@ -12193,6 +15733,18 @@ packages: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} dev: true + /multicast-dns-service-types/1.1.0: + resolution: {integrity: sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=} + dev: true + + /multicast-dns/6.2.3: + resolution: {integrity: sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==} + hasBin: true + dependencies: + dns-packet: 1.3.4 + thunky: 1.1.0 + dev: true + /mute-stream/0.0.7: resolution: {integrity: sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=} dev: true @@ -12203,6 +15755,12 @@ packages: /nan/2.15.0: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} + /nanoid/3.1.30: + resolution: {integrity: sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: true + /nanomatch/1.2.13: resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==} engines: {node: '>=0.10.0'} @@ -12219,6 +15777,12 @@ packages: snapdragon: 0.8.2 to-regex: 3.0.2 + /native-request/1.1.0: + resolution: {integrity: sha512-uZ5rQaeRn15XmpgE0xoPL8YWqcX90VtCFglYwAgkvKM5e8fog+vePLAhHxuuv/gRkrQxIeh5U3q9sMNUrENqWw==} + requiresBuild: true + dev: true + optional: true + /natural-compare/1.4.0: resolution: {integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=} @@ -12253,6 +15817,11 @@ packages: randexp: 0.4.6 dev: false + /negotiator/0.6.2: + resolution: {integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==} + engines: {node: '>= 0.6'} + dev: true + /neo-async/2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} dev: true @@ -12289,6 +15858,11 @@ packages: whatwg-url: 5.0.0 dev: false + /node-forge/0.10.0: + resolution: {integrity: sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==} + engines: {node: '>= 6.0.0'} + dev: true + /node-gyp-build/4.3.0: resolution: {integrity: sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==} hasBin: true @@ -12379,6 +15953,10 @@ packages: /node-releases/1.1.77: resolution: {integrity: sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==} + dev: true + + /node-releases/2.0.1: + resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} /node-sass/4.14.1: resolution: {integrity: sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==} @@ -12461,6 +16039,11 @@ packages: resolution: {integrity: sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=} dev: true + /normalize-url/6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: true + /npm-run-all/4.1.5: resolution: {integrity: sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==} engines: {node: '>= 4'} @@ -12473,7 +16056,7 @@ packages: minimatch: 3.0.4 pidtree: 0.3.1 read-pkg: 3.0.0 - shell-quote: 1.7.2 + shell-quote: 1.7.3 string.prototype.padend: 3.1.3 dev: true @@ -12509,7 +16092,6 @@ packages: resolution: {integrity: sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==} dependencies: boolbase: 1.0.0 - dev: false /num2fraction/1.2.2: resolution: {integrity: sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=} @@ -12527,7 +16109,14 @@ packages: resolution: {integrity: sha512-LpCfZCWsVEtmD2SI1j2KRaw1uIyn4DJ3eRzsjnDYitbq38aORpkvYO+L0zVMZRNDSYSRGTsuj0nHCS3OOxK/Cg==} hasBin: true dependencies: - '@nrwl/cli': 12.10.0 + '@nrwl/cli': 13.1.4 + dev: true + + /nx/13.1.4: + resolution: {integrity: sha512-m2j3wymaFlEl/7EoGxlgRzdmgQV1Rsh42df1cM8xFzAzV8ZGtR3Zq19qK7r9SUabpq8jMzp1e6rLQTHewCJWig==} + hasBin: true + dependencies: + '@nrwl/cli': 13.1.4 dev: true /oauth-1.0a/2.2.6: @@ -12558,7 +16147,6 @@ packages: dependencies: call-bind: 1.0.2 define-properties: 1.1.3 - dev: false /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -12652,6 +16240,22 @@ packages: define-properties: 1.1.3 es-abstract: 1.19.1 + /obuf/1.1.2: + resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} + dev: true + + /on-finished/2.3.0: + resolution: {integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + + /on-headers/1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: true + /once/1.4.0: resolution: {integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E=} dependencies: @@ -12678,11 +16282,25 @@ packages: is-wsl: 2.2.0 dev: true + /open/8.4.0: + resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + /opencollective-postinstall/2.0.3: resolution: {integrity: sha512-8AV/sCtuzUeTo8gQK5qDZzARrulB3egtLzFgteqB2tcT4Mw7B8Kt7JcDHmltjz6FOAHsvTevk70gZEbhM4ZS9Q==} hasBin: true dev: true + /opener/1.5.2: + resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + hasBin: true + dev: true + /opn/5.5.0: resolution: {integrity: sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==} engines: {node: '>=4'} @@ -12743,6 +16361,13 @@ packages: resolution: {integrity: sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==} engines: {node: '>=8'} + /p-event/4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + dependencies: + p-timeout: 3.2.0 + dev: true + /p-finally/1.0.0: resolution: {integrity: sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=} engines: {node: '>=4'} @@ -12764,6 +16389,13 @@ packages: dependencies: p-try: 2.2.0 + /p-limit/3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + /p-locate/2.0.0: resolution: {integrity: sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=} engines: {node: '>=4'} @@ -12783,6 +16415,13 @@ packages: dependencies: p-limit: 2.3.0 + /p-locate/5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + /p-map/2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -12795,13 +16434,19 @@ packages: aggregate-error: 3.1.0 dev: true + /p-map/4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: true + /p-queue/6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} dependencies: eventemitter3: 4.0.7 p-timeout: 3.2.0 - dev: false /p-reduce/1.0.0: resolution: {integrity: sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=} @@ -12814,14 +16459,12 @@ packages: dependencies: '@types/retry': 0.12.1 retry: 0.13.1 - dev: false /p-timeout/3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} dependencies: p-finally: 1.0.0 - dev: false /p-try/1.0.0: resolution: {integrity: sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=} @@ -12908,7 +16551,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.15.8 + '@babel/code-frame': 7.16.0 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.1.6 @@ -12917,15 +16560,27 @@ packages: resolution: {integrity: sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=} engines: {node: '>=0.10.0'} + /parse5-html-rewriting-stream/6.0.1: + resolution: {integrity: sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==} + dependencies: + parse5: 6.0.1 + parse5-sax-parser: 6.0.1 + dev: true + /parse5-htmlparser2-tree-adapter/6.0.1: resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} dependencies: parse5: 6.0.1 dev: false + /parse5-sax-parser/6.0.1: + resolution: {integrity: sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==} + dependencies: + parse5: 6.0.1 + dev: true + /parse5/4.0.0: resolution: {integrity: sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==} - dev: false /parse5/5.1.0: resolution: {integrity: sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==} @@ -12933,6 +16588,11 @@ packages: /parse5/6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + /pascalcase/0.1.1: resolution: {integrity: sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=} engines: {node: '>=0.10.0'} @@ -12991,6 +16651,10 @@ packages: path-root-regex: 0.1.2 dev: true + /path-to-regexp/0.1.7: + resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} + dev: true + /path-type/1.1.0: resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=} engines: {node: '>=0.10.0'} @@ -13037,6 +16701,10 @@ packages: /picocolors/0.2.1: resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==} + dev: true + + /picocolors/1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} /picomatch/2.3.0: resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} @@ -13061,6 +16729,11 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + /pify/5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} + dev: true + /pinkie-promise/2.0.1: resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} engines: {node: '>=0.10.0'} @@ -13098,13 +16771,6 @@ packages: dependencies: find-up: 4.1.0 - /pkg-up/2.0.0: - resolution: {integrity: sha1-yBmscoBZpGHKscOImivjxJoATX8=} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - dev: true - /please-upgrade-node/3.2.0: resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==} dependencies: @@ -13114,10 +16780,157 @@ packages: /pn/1.1.0: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} + /portfinder/1.0.28: + resolution: {integrity: sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==} + engines: {node: '>= 0.12.0'} + dependencies: + async: 2.6.3 + debug: 3.2.7 + mkdirp: 0.5.5 + dev: true + /posix-character-classes/0.1.1: resolution: {integrity: sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=} engines: {node: '>=0.10.0'} + /postcss-calc/8.0.0_postcss@8.3.0: + resolution: {integrity: sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-calc/8.0.0_postcss@8.3.11: + resolution: {integrity: sha512-5NglwDrcbiy8XXfPM11F3HeC6hoT9W7GUH/Zi5U/p7u3Irv4rHhdDcIZwG0llHXV4ftsBjpfWMXAnXNl4lnt8g==} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.3.11 + postcss-selector-parser: 6.0.6 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-colormin/5.2.1_postcss@8.3.0: + resolution: {integrity: sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + caniuse-api: 3.0.0 + colord: 2.9.1 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-colormin/5.2.1_postcss@8.3.11: + resolution: {integrity: sha512-VVwMrEYLcHYePUYV99Ymuoi7WhKrMGy/V9/kTS0DkCoJYmmjdOMneyhzYUxcNgteKDVbrewOkSM7Wje/MFwxzA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + caniuse-api: 3.0.0 + colord: 2.9.1 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-convert-values/5.0.2_postcss@8.3.0: + resolution: {integrity: sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-convert-values/5.0.2_postcss@8.3.11: + resolution: {integrity: sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-discard-comments/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + dev: true + + /postcss-discard-comments/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + dev: true + + /postcss-discard-duplicates/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + dev: true + + /postcss-discard-duplicates/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + dev: true + + /postcss-discard-empty/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + dev: true + + /postcss-discard-empty/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + dev: true + + /postcss-discard-overridden/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + dev: true + + /postcss-discard-overridden/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-Y28H7y93L2BpJhrdUR2SR2fnSsT+3TVx1NmVQLbcnZWwIUpJ7mfcTC6Za9M2PG6w8j7UQRfzxqn8jU2VwFxo3Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + dev: true + /postcss-html/0.36.0_4f7b71a942b8b7a555b8adf78f88122b: resolution: {integrity: sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==} peerDependencies: @@ -13129,6 +16942,18 @@ packages: postcss-syntax: 0.36.2_postcss@7.0.39 dev: true + /postcss-import/14.0.2_postcss@8.3.0: + resolution: {integrity: sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==} + engines: {node: '>=10.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + read-cache: 1.0.0 + resolve: 1.20.0 + dev: true + /postcss-less/3.1.4: resolution: {integrity: sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==} engines: {node: '>=6.14.4'} @@ -13136,10 +16961,492 @@ packages: postcss: 7.0.39 dev: true + /postcss-load-config/3.1.0_ts-node@9.1.1: + resolution: {integrity: sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==} + engines: {node: '>= 10'} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + import-cwd: 3.0.0 + lilconfig: 2.0.4 + ts-node: 9.1.1_typescript@4.2.4 + yaml: 1.10.2 + dev: true + + /postcss-loader/6.2.0_postcss@8.3.0+webpack@5.64.1: + resolution: {integrity: sha512-H9hv447QjQJVDbHj3OUdciyAXY3v5+UDduzEytAlZCVHCpNAAg/mCSwhYYqZr9BiGYhmYspU8QXxZwiHTLn3yA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + postcss: ^7.0.0 || ^8.0.1 + webpack: ^5.0.0 + dependencies: + cosmiconfig: 7.0.1 + klona: 2.0.5 + postcss: 8.3.0 + semver: 7.3.5 + webpack: 5.64.1 + dev: true + /postcss-media-query-parser/0.2.3: resolution: {integrity: sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=} dev: true + /postcss-merge-longhand/5.0.4_postcss@8.3.0: + resolution: {integrity: sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + stylehacks: 5.0.1_postcss@8.3.0 + dev: true + + /postcss-merge-longhand/5.0.4_postcss@8.3.11: + resolution: {integrity: sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + stylehacks: 5.0.1_postcss@8.3.11 + dev: true + + /postcss-merge-rules/5.0.3_postcss@8.3.0: + resolution: {integrity: sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + caniuse-api: 3.0.0 + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + dev: true + + /postcss-merge-rules/5.0.3_postcss@8.3.11: + resolution: {integrity: sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + caniuse-api: 3.0.0 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-selector-parser: 6.0.6 + dev: true + + /postcss-minify-font-values/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-minify-font-values/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-7JS4qIsnqaxk+FXY1E8dHBDmraYFWmuL6cgt0T1SWGRO5bzJf8sUoelwa4P88LEWJZweHevAiDKxHlofuvtIoA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-minify-gradients/5.0.3_postcss@8.3.0: + resolution: {integrity: sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.1 + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-minify-gradients/5.0.3_postcss@8.3.11: + resolution: {integrity: sha512-Z91Ol22nB6XJW+5oe31+YxRsYooxOdFKcbOqY/V8Fxse1Y3vqlNRpi1cxCqoACZTQEhl+xvt4hsbWiV5R+XI9Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + colord: 2.9.1 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-minify-params/5.0.2_postcss@8.3.0: + resolution: {integrity: sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + alphanum-sort: 1.0.2 + browserslist: 4.18.1 + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-minify-params/5.0.2_postcss@8.3.11: + resolution: {integrity: sha512-qJAPuBzxO1yhLad7h2Dzk/F7n1vPyfHfCCh5grjGfjhi1ttCnq4ZXGIW77GSrEbh9Hus9Lc/e/+tB4vh3/GpDg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + alphanum-sort: 1.0.2 + browserslist: 4.18.1 + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-minify-selectors/5.1.0_postcss@8.3.0: + resolution: {integrity: sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + alphanum-sort: 1.0.2 + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + dev: true + + /postcss-minify-selectors/5.1.0_postcss@8.3.11: + resolution: {integrity: sha512-NzGBXDa7aPsAcijXZeagnJBKBPMYLaJJzB8CQh6ncvyl2sIndLVWfbcDi0SBjRWk5VqEjXvf8tYwzoKf4Z07og==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + alphanum-sort: 1.0.2 + postcss: 8.3.11 + postcss-selector-parser: 6.0.6 + dev: true + + /postcss-modules-extract-imports/3.0.0_postcss@8.3.0: + resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.3.0 + dev: true + + /postcss-modules-local-by-default/4.0.0_postcss@8.3.0: + resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.3.0 + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-modules-scope/3.0.0_postcss@8.3.0: + resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + dev: true + + /postcss-modules-values/4.0.0_postcss@8.3.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0_postcss@8.3.0 + postcss: 8.3.0 + dev: true + + /postcss-modules/4.2.2_postcss@8.3.0: + resolution: {integrity: sha512-/H08MGEmaalv/OU8j6bUKi/kZr2kqGF6huAW8m9UAgOLWtpFdhA14+gPBoymtqyv+D4MLsmqaF2zvIegdCxJXg==} + peerDependencies: + postcss: ^8.0.0 + dependencies: + generic-names: 2.0.1 + icss-replace-symbols: 1.1.0 + lodash.camelcase: 4.3.0 + postcss: 8.3.0 + postcss-modules-extract-imports: 3.0.0_postcss@8.3.0 + postcss-modules-local-by-default: 4.0.0_postcss@8.3.0 + postcss-modules-scope: 3.0.0_postcss@8.3.0 + postcss-modules-values: 4.0.0_postcss@8.3.0 + string-hash: 1.1.3 + dev: true + + /postcss-normalize-charset/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + dev: true + + /postcss-normalize-charset/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + dev: true + + /postcss-normalize-display-values/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-display-values/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-uupdvWk88kLDXi5HEyI9IaAJTE3/Djbcrqq8YgjvAVuzgVuqIk3SuJWUisT2gaJbZm1H9g5k2w1xXilM3x8DjQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-positions/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-positions/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-rvzWAJai5xej9yWqlCb1OWLd9JjW2Ex2BCPzUJrbaXmtKtgfL8dBMOOMTX6TnvQMtjk3ei1Lswcs78qKO1Skrg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-repeat-style/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-repeat-style/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-syZ2itq0HTQjj4QtXZOeefomckiV5TaUO6ReIEabCh3wgDs4Mr01pkif0MeVwKyU/LHEkPJnpwFKRxqWA/7O3w==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-string/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-string/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-Ic8GaQ3jPMVl1OEn2U//2pm93AXUcF3wz+OriskdZ1AOuYV25OdgS7w9Xu2LO5cGyhHCgn8dMXh9bO7vi3i9pA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-timing-functions/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-timing-functions/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-cPcBdVN5OsWCNEo5hiXfLUnXfTGtSFiBU9SK8k7ii8UD7OLuznzgNRYkLZow11BkQiiqMcgPyh4ZqXEEUrtQ1Q==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-unicode/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-unicode/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-kAtYD6V3pK0beqrU90gpCQB7g6AOfP/2KIPCVBKJM2EheVsBQmx/Iof+9zR9NFKLAx4Pr9mDhogB27pmn354nA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-url/5.0.3_postcss@8.3.0: + resolution: {integrity: sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + is-absolute-url: 3.0.3 + normalize-url: 6.1.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-url/5.0.3_postcss@8.3.11: + resolution: {integrity: sha512-qWiUMbvkRx3kc1Dp5opzUwc7MBWZcSDK2yofCmdvFBCpx+zFPkxBC1FASQ59Pt+flYfj/nTZSkmF56+XG5elSg==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + is-absolute-url: 3.0.3 + normalize-url: 6.1.0 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-whitespace/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-normalize-whitespace/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-iPklmI5SBnRvwceb/XH568yyzK0qRVuAG+a1HFUsFRf11lEJTiQQa03a4RSCQvLKdcpX7XsI1Gen9LuLoqwiqA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-ordered-values/5.0.2_postcss@8.3.0: + resolution: {integrity: sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-ordered-values/5.0.2_postcss@8.3.11: + resolution: {integrity: sha512-8AFYDSOYWebJYLyJi3fyjl6CqMEG/UVworjiyK1r573I56kb3e879sCJLGvR3merj+fAdPpVplXKQZv+ey6CgQ==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-reduce-initial/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + caniuse-api: 3.0.0 + postcss: 8.3.0 + dev: true + + /postcss-reduce-initial/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-zlCZPKLLTMAqA3ZWH57HlbCjkD55LX9dsRyxlls+wfuRfqCi5mSlZVan0heX5cHr154Dq9AfbH70LyhrSAezJw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + caniuse-api: 3.0.0 + postcss: 8.3.11 + dev: true + + /postcss-reduce-transforms/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.0 + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + dev: true + + /postcss-reduce-transforms/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-a//FjoPeFkRuAguPscTVmRQUODP+f3ke2HqFNgGPwdYnpeC29RZdCBvGRGTsKpMURb/I3p6jdKoBQ2zI+9Q7kA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + cssnano-utils: 2.0.1_postcss@8.3.11 + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + dev: true + /postcss-resolve-nested-selector/0.1.1: resolution: {integrity: sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=} dev: true @@ -13173,6 +17480,28 @@ packages: util-deprecate: 1.0.2 dev: true + /postcss-svgo/5.0.3_postcss@8.3.0: + resolution: {integrity: sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.0 + postcss-value-parser: 4.1.0 + svgo: 2.8.0 + dev: true + + /postcss-svgo/5.0.3_postcss@8.3.11: + resolution: {integrity: sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + postcss: 8.3.11 + postcss-value-parser: 4.1.0 + svgo: 2.8.0 + dev: true + /postcss-syntax/0.36.2_postcss@7.0.39: resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==} peerDependencies: @@ -13181,6 +17510,28 @@ packages: postcss: 7.0.39 dev: true + /postcss-unique-selectors/5.0.2_postcss@8.3.0: + resolution: {integrity: sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + alphanum-sort: 1.0.2 + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + dev: true + + /postcss-unique-selectors/5.0.2_postcss@8.3.11: + resolution: {integrity: sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + alphanum-sort: 1.0.2 + postcss: 8.3.11 + postcss-selector-parser: 6.0.6 + dev: true + /postcss-value-parser/4.1.0: resolution: {integrity: sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==} dev: true @@ -13202,6 +17553,24 @@ packages: source-map: 0.6.1 dev: true + /postcss/8.3.0: + resolution: {integrity: sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + colorette: 1.4.0 + nanoid: 3.1.30 + source-map-js: 0.6.2 + dev: true + + /postcss/8.3.11: + resolution: {integrity: sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.1.30 + picocolors: 1.0.0 + source-map-js: 0.6.2 + dev: true + /postman-collection/4.1.0: resolution: {integrity: sha512-J9IpCMXpGDLN7MGhdMcUbZ0SIWLCcTVdrjTgKVYubkW1sn1KcDqJgsdTr/ItkO8dOXKLuhvnq2QnE5Vrzb3WMA==} engines: {node: '>=10'} @@ -13282,11 +17651,11 @@ packages: ansi-styles: 4.3.0 react-is: 17.0.2 - /pretty-format/27.2.4: - resolution: {integrity: sha512-NUjw22WJHldzxyps2YjLZkUj6q1HvjqFezkB9Y2cklN8NtVZN/kZEXGZdFw4uny3oENzV5EEMESrkI0YDUH8vg==} + /pretty-format/27.3.1: + resolution: {integrity: sha512-DR/c+pvFc52nLimLROYjnXPtolawm+uWDxr4FjuLDLUn+ktWnSN851KoHwHzzqq6rfCOjkzN8FLgDrSub6UDuA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@jest/types': 27.2.4 + '@jest/types': 27.2.5 ansi-regex: 5.0.1 ansi-styles: 5.2.0 react-is: 17.0.2 @@ -13308,6 +17677,11 @@ packages: resolution: {integrity: sha1-mEcocL8igTL8vdhoEputEsPAKeM=} dev: true + /promise.series/0.2.0: + resolution: {integrity: sha1-LMfr6Vn8OmYZwEq029yeRS2GS70=} + engines: {node: '>=0.12'} + dev: true + /prompts/2.4.1: resolution: {integrity: sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==} engines: {node: '>= 6'} @@ -13315,6 +17689,13 @@ packages: kleur: 3.0.3 sisteransi: 1.0.5 + /prompts/2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + /prop-types-exact/1.2.0: resolution: {integrity: sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==} dependencies: @@ -13330,6 +17711,14 @@ packages: object-assign: 4.1.1 react-is: 16.13.1 + /proxy-addr/2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: true + /proxy-from-env/1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} @@ -13415,7 +17804,7 @@ packages: extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.5.2 - mime-types: 2.1.33 + mime-types: 2.1.34 progress: 2.0.3 proxy-from-env: 1.1.0 rimraf: 2.7.1 @@ -13439,6 +17828,11 @@ packages: resolution: {integrity: sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==} engines: {node: '>=0.6'} + /qs/6.7.0: + resolution: {integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==} + engines: {node: '>=0.6'} + dev: true + /querystring-es3/0.2.1: resolution: {integrity: sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=} engines: {node: '>=0.4.x'} @@ -13490,6 +17884,11 @@ packages: safe-buffer: 5.2.1 dev: true + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + /raw-body/1.1.7: resolution: {integrity: sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=} engines: {node: '>= 0.8.0'} @@ -13498,6 +17897,27 @@ packages: string_decoder: 0.10.31 dev: true + /raw-body/2.4.0: + resolution: {integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + http-errors: 1.7.2 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-loader/4.0.2_webpack@5.64.1: + resolution: {integrity: sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + loader-utils: 2.0.2 + schema-utils: 3.1.1 + webpack: 5.64.1 + dev: true + /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -13533,6 +17953,11 @@ packages: whatwg-url-without-unicode: 8.0.0-3 dev: false + /react-refresh/0.10.0: + resolution: {integrity: sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==} + engines: {node: '>=0.10.0'} + dev: true + /react-test-renderer/16.14.0: resolution: {integrity: sha512-L8yPjqPE5CZO6rKsKXRO/rVPiaCOy0tQQJbC+UjPNlobl5mad59lvPjwFsQHTvL03caVDIVr9x9/OSgDe6I5Eg==} peerDependencies: @@ -13552,6 +17977,12 @@ packages: object-assign: 4.1.1 dev: false + /read-cache/1.0.0: + resolution: {integrity: sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=} + dependencies: + pify: 2.3.0 + dev: true + /read-pkg-up/1.0.1: resolution: {integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=} engines: {node: '>=0.10.0'} @@ -13560,14 +17991,6 @@ packages: read-pkg: 1.1.0 dev: true - /read-pkg-up/3.0.0: - resolution: {integrity: sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=} - engines: {node: '>=4'} - dependencies: - find-up: 2.1.0 - read-pkg: 3.0.0 - dev: true - /read-pkg-up/4.0.0: resolution: {integrity: sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==} engines: {node: '>=6'} @@ -13708,7 +18131,7 @@ packages: /regenerator-transform/0.14.5: resolution: {integrity: sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==} dependencies: - '@babel/runtime': 7.15.4 + '@babel/runtime': 7.16.3 /regex-not/1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -13853,7 +18276,7 @@ packages: is-typedarray: 1.0.0 isstream: 0.1.2 json-stringify-safe: 5.0.1 - mime-types: 2.1.33 + mime-types: 2.1.34 oauth-sign: 0.9.0 performance-now: 2.1.0 qs: 6.5.2 @@ -13879,6 +18302,10 @@ packages: engines: {node: '>=0.10.5'} dev: true + /requires-port/1.0.0: + resolution: {integrity: sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=} + dev: true + /resolve-cwd/2.0.0: resolution: {integrity: sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=} engines: {node: '>=4'} @@ -13923,19 +18350,24 @@ packages: resolution: {integrity: sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=} deprecated: https://github.com/lydell/resolve-url#deprecated + /resolve.exports/1.1.0: + resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} + engines: {node: '>=10'} + dev: true + /resolve/1.1.7: resolution: {integrity: sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=} /resolve/1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: - is-core-module: 2.7.0 + is-core-module: 2.8.0 path-parse: 1.0.7 /resolve/2.0.0-next.3: resolution: {integrity: sha512-W8LucSynKUIDu9ylraa7ueVZ7hc0uAgJBxVsQSKOXOyle8a93qXhcz+XAXZ8bIq2d6i4Ehddn6Evt+0/UwKk6Q==} dependencies: - is-core-module: 2.7.0 + is-core-module: 2.8.0 path-parse: 1.0.7 dev: true @@ -13961,7 +18393,6 @@ packages: /retry/0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} - dev: false /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -13992,6 +18423,78 @@ packages: hash-base: 3.1.0 inherits: 2.0.4 + /rollup-plugin-copy/3.4.0: + resolution: {integrity: sha512-rGUmYYsYsceRJRqLVlE9FivJMxJ7X6jDlP79fmFkL8sJs7VVMSVyA2yfyL+PGyO/vJs4A87hwhgVfz61njI+uQ==} + engines: {node: '>=8.3'} + dependencies: + '@types/fs-extra': 8.1.2 + colorette: 1.4.0 + fs-extra: 8.1.0 + globby: 10.0.1 + is-plain-object: 3.0.1 + dev: true + + /rollup-plugin-peer-deps-external/2.2.4_rollup@2.60.0: + resolution: {integrity: sha512-AWdukIM1+k5JDdAqV/Cxd+nejvno2FVLVeZ74NKggm3Q5s9cbbcOgUPGdbxPi4BXu7xGaZ8HG12F+thImYu/0g==} + peerDependencies: + rollup: '*' + dependencies: + rollup: 2.60.0 + dev: true + + /rollup-plugin-postcss/4.0.1_postcss@8.3.0+ts-node@9.1.1: + resolution: {integrity: sha512-kUJHlpDGl9+kDfdUUbnerW0Mx1R0PL/6dgciUE/w19swYDBjug7RQfxIRvRGtO/cvCkynYyU8e/YFMI544vskA==} + engines: {node: '>=10'} + peerDependencies: + postcss: 8.x + dependencies: + chalk: 4.1.2 + concat-with-sourcemaps: 1.1.0 + cssnano: 5.0.11_postcss@8.3.0 + import-cwd: 3.0.0 + p-queue: 6.6.2 + pify: 5.0.0 + postcss: 8.3.0 + postcss-load-config: 3.1.0_ts-node@9.1.1 + postcss-modules: 4.2.2_postcss@8.3.0 + promise.series: 0.2.0 + resolve: 1.20.0 + rollup-pluginutils: 2.8.2 + safe-identifier: 0.4.2 + style-inject: 0.3.0 + transitivePeerDependencies: + - ts-node + dev: true + + /rollup-plugin-typescript2/0.30.0_rollup@2.60.0+typescript@4.2.4: + resolution: {integrity: sha512-NUFszIQyhgDdhRS9ya/VEmsnpTe+GERDMmFo0Y+kf8ds51Xy57nPNGglJY+W6x1vcouA7Au7nsTgsLFj2I0PxQ==} + peerDependencies: + rollup: '>=1.26.3' + typescript: '>=2.4.0' + dependencies: + '@rollup/pluginutils': 4.1.1 + find-cache-dir: 3.3.2 + fs-extra: 8.1.0 + resolve: 1.20.0 + rollup: 2.60.0 + tslib: 2.1.0 + typescript: 4.2.4 + dev: true + + /rollup-pluginutils/2.8.2: + resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} + dependencies: + estree-walker: 0.6.1 + dev: true + + /rollup/2.60.0: + resolution: {integrity: sha512-cHdv9GWd58v58rdseC8e8XIaPUo8a9cgZpnCMMDGZFDZKEODOiPPEQFXLriWr/TjXzhPPmG5bkAztPsOARIcGQ==} + engines: {node: '>=10.0.0'} + hasBin: true + optionalDependencies: + fsevents: 2.3.2 + dev: true + /rst-selector-parser/2.2.3: resolution: {integrity: sha1-gbIw6i/MYGbInjRy3nlChdmwPZE=} dependencies: @@ -14054,6 +18557,10 @@ packages: /safe-buffer/5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + /safe-identifier/0.4.2: + resolution: {integrity: sha512-6pNbSMW6OhAi9j+N8V+U715yBQsaWJ7eyEUaOrawX+isg5ZxhUlV1NipNtgaKHmFGiABwt+ZF04Ii+3Xjkg+8w==} + dev: true + /safe-json-parse/1.0.1: resolution: {integrity: sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=} dev: true @@ -14080,7 +18587,7 @@ packages: fb-watchman: 2.0.1 micromatch: 3.1.10 minimist: 1.2.5 - walker: 1.0.7 + walker: 1.0.8 /sass-graph/2.2.5: resolution: {integrity: sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==} @@ -14092,9 +18599,38 @@ packages: yargs: 13.3.2 dev: true + /sass-loader/12.3.0_sass@1.43.4+webpack@5.64.1: + resolution: {integrity: sha512-6l9qwhdOb7qSrtOu96QQ81LVl8v6Dp9j1w3akOm0aWHyrTYtagDt5+kS32N4yq4hHk3M+rdqoRMH+lIdqvW6HA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + fibers: '>= 3.1.0' + node-sass: ^4.0.0 || ^5.0.0 || ^6.0.0 + sass: ^1.3.0 + webpack: ^5.0.0 + peerDependenciesMeta: + fibers: + optional: true + node-sass: + optional: true + sass: + optional: true + dependencies: + klona: 2.0.5 + neo-async: 2.6.2 + sass: 1.43.4 + webpack: 5.64.1 + dev: true + + /sass/1.43.4: + resolution: {integrity: sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==} + engines: {node: '>=8.9.0'} + hasBin: true + dependencies: + chokidar: 3.5.2 + dev: true + /sax/1.2.4: resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==} - dev: false /saxes/3.1.11: resolution: {integrity: sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==} @@ -14132,6 +18668,33 @@ packages: ajv-keywords: 3.5.2_ajv@6.12.6 dev: true + /schema-utils/2.7.0: + resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.9 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + + /schema-utils/2.7.1: + resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==} + engines: {node: '>= 8.9.0'} + dependencies: + '@types/json-schema': 7.0.9 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + + /schema-utils/3.1.1: + resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.9 + ajv: 6.12.6 + ajv-keywords: 3.5.2_ajv@6.12.6 + dev: true + /scss-tokenizer/0.2.3: resolution: {integrity: sha1-jrBtualyMzOCTT9VMGQRSYR85dE=} dependencies: @@ -14139,6 +18702,20 @@ packages: source-map: 0.4.4 dev: true + /secure-compare/3.0.1: + resolution: {integrity: sha1-8aAymzCLIh+uN7mXTz1XjQypmeM=} + dev: true + + /select-hose/2.0.0: + resolution: {integrity: sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=} + dev: true + + /selfsigned/1.10.11: + resolution: {integrity: sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==} + dependencies: + node-forge: 0.10.0 + dev: true + /semver-compare/1.0.0: resolution: {integrity: sha1-De4hahyUGrN+nvsXiPavxf9VN/w=} dev: true @@ -14187,12 +18764,60 @@ packages: dependencies: lru-cache: 6.0.0 + /send/0.17.1: + resolution: {integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 1.1.2 + destroy: 1.0.4 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 1.7.3 + mime: 1.6.0 + ms: 2.1.1 + on-finished: 2.3.0 + range-parser: 1.2.1 + statuses: 1.5.0 + dev: true + /serialize-javascript/4.0.0: resolution: {integrity: sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==} dependencies: randombytes: 2.1.0 dev: true + /serialize-javascript/6.0.0: + resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} + dependencies: + randombytes: 2.1.0 + dev: true + + /serve-index/1.9.1: + resolution: {integrity: sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=} + engines: {node: '>= 0.8.0'} + dependencies: + accepts: 1.3.7 + batch: 0.6.1 + debug: 2.6.9 + escape-html: 1.0.3 + http-errors: 1.6.3 + mime-types: 2.1.34 + parseurl: 1.3.3 + dev: true + + /serve-static/1.14.1: + resolution: {integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.17.1 + dev: true + /set-blocking/2.0.0: resolution: {integrity: sha1-BF+XgtARrppoA93TgrJDkrPYkPc=} @@ -14209,6 +18834,14 @@ packages: resolution: {integrity: sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=} dev: true + /setprototypeof/1.1.0: + resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + dev: true + + /setprototypeof/1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: true + /sha.js/2.4.11: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true @@ -14226,6 +18859,13 @@ packages: mixin-object: 2.0.1 dev: false + /shallow-clone/3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + dependencies: + kind-of: 6.0.3 + dev: true + /shebang-command/1.2.0: resolution: {integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=} engines: {node: '>=0.10.0'} @@ -14246,8 +18886,8 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - /shell-quote/1.7.2: - resolution: {integrity: sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==} + /shell-quote/1.7.3: + resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==} dev: true /shellwords/0.1.1: @@ -14323,10 +18963,35 @@ packages: source-map-resolve: 0.5.3 use: 3.1.1 + /sockjs/0.3.21: + resolution: {integrity: sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==} + dependencies: + faye-websocket: 0.11.4 + uuid: 3.4.0 + websocket-driver: 0.7.4 + dev: true + /source-list-map/2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} dev: true + /source-map-js/0.6.2: + resolution: {integrity: sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==} + engines: {node: '>=0.10.0'} + dev: true + + /source-map-loader/3.0.0_webpack@5.64.1: + resolution: {integrity: sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + abab: 2.0.5 + iconv-lite: 0.6.3 + source-map-js: 0.6.2 + webpack: 5.64.1 + dev: true + /source-map-resolve/0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} dependencies: @@ -14336,6 +19001,13 @@ packages: source-map-url: 0.4.1 urix: 0.1.0 + /source-map-resolve/0.6.0: + resolution: {integrity: sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==} + dependencies: + atob: 2.1.2 + decode-uri-component: 0.2.0 + dev: true + /source-map-support/0.5.20: resolution: {integrity: sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==} dependencies: @@ -14364,6 +19036,10 @@ packages: resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} engines: {node: '>= 8'} + /sourcemap-codec/1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + dev: true + /spawnd/4.4.0: resolution: {integrity: sha512-jLPOfB6QOEgMOQY15Z6+lwZEhH3F5ncXxIaZ7WHPIapwNNLyjrs61okj3VJ3K6tmP5TZ6cO0VAu9rEY4MD4YQg==} dependencies: @@ -14379,7 +19055,7 @@ packages: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.10 + spdx-license-ids: 3.0.11 /spdx-exceptions/2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} @@ -14388,10 +19064,36 @@ packages: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} dependencies: spdx-exceptions: 2.3.0 - spdx-license-ids: 3.0.10 + spdx-license-ids: 3.0.11 - /spdx-license-ids/3.0.10: - resolution: {integrity: sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==} + /spdx-license-ids/3.0.11: + resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + + /spdy-transport/3.0.0: + resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} + dependencies: + debug: 4.3.2 + detect-node: 2.1.0 + hpack.js: 2.1.6 + obuf: 1.1.2 + readable-stream: 3.6.0 + wbuf: 1.7.3 + transitivePeerDependencies: + - supports-color + dev: true + + /spdy/4.0.2: + resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} + engines: {node: '>=6.0.0'} + dependencies: + debug: 4.3.2 + handle-thing: 2.0.1 + http-deceiver: 1.2.7 + select-hose: 2.0.0 + spdy-transport: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true /specificity/0.4.1: resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==} @@ -14415,7 +19117,7 @@ packages: engines: {node: '>=0.10.0'} hasBin: true dependencies: - asn1: 0.2.4 + asn1: 0.2.6 assert-plus: 1.0.0 bcrypt-pbkdf: 1.0.2 dashdash: 1.14.1 @@ -14431,6 +19133,10 @@ packages: figgy-pudding: 3.5.2 dev: true + /stable/0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + dev: true + /stack-utils/1.0.5: resolution: {integrity: sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==} engines: {node: '>=8'} @@ -14443,6 +19149,10 @@ packages: dependencies: escape-string-regexp: 2.0.0 + /stackframe/1.2.0: + resolution: {integrity: sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==} + dev: true + /static-extend/0.1.2: resolution: {integrity: sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=} engines: {node: '>=0.10.0'} @@ -14450,6 +19160,11 @@ packages: define-property: 0.2.5 object-copy: 0.1.0 + /statuses/1.5.0: + resolution: {integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=} + engines: {node: '>= 0.6'} + dev: true + /stdout-stream/1.4.1: resolution: {integrity: sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==} dependencies: @@ -14493,6 +19208,10 @@ packages: engines: {node: '>=0.6.19'} dev: true + /string-hash/1.1.3: + resolution: {integrity: sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=} + dev: true + /string-length/2.0.0: resolution: {integrity: sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=} engines: {node: '>=4'} @@ -14651,6 +19370,13 @@ packages: dependencies: ansi-regex: 5.0.1 + /strip-ansi/7.0.1: + resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + /strip-bom/2.0.0: resolution: {integrity: sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=} engines: {node: '>=0.10.0'} @@ -14698,10 +19424,45 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + /style-inject/0.3.0: + resolution: {integrity: sha512-IezA2qp+vcdlhJaVm5SOdPPTUu0FCEqfNSli2vRuSIBbu5Nq5UvygTk/VzeCqfLz2Atj3dVII5QBKGZRZ0edzw==} + dev: true + + /style-loader/3.3.1_webpack@5.64.1: + resolution: {integrity: sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.0.0 + dependencies: + webpack: 5.64.1 + dev: true + /style-search/0.1.0: resolution: {integrity: sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=} dev: true + /stylehacks/5.0.1_postcss@8.3.0: + resolution: {integrity: sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + postcss: 8.3.0 + postcss-selector-parser: 6.0.6 + dev: true + + /stylehacks/5.0.1_postcss@8.3.11: + resolution: {integrity: sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + dependencies: + browserslist: 4.18.1 + postcss: 8.3.11 + postcss-selector-parser: 6.0.6 + dev: true + /stylelint-config-recommended-scss/4.3.0_d55469ff7b1b68c43b61270d19a60ab6: resolution: {integrity: sha512-/noGjXlO8pJTr/Z3qGMoaRFK8n1BFfOqmAbX1RjTIcl4Yalr+LUb1zb9iQ7pRx1GsEBXOAm4g2z5/jou/pfMPg==} peerDependencies: @@ -14813,6 +19574,34 @@ packages: - supports-color dev: true + /stylus-loader/6.2.0_stylus@0.55.0+webpack@5.64.1: + resolution: {integrity: sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==} + engines: {node: '>= 12.13.0'} + peerDependencies: + stylus: '>=0.52.4' + webpack: ^5.0.0 + dependencies: + fast-glob: 3.2.7 + klona: 2.0.5 + normalize-path: 3.0.0 + stylus: 0.55.0 + webpack: 5.64.1 + dev: true + + /stylus/0.55.0: + resolution: {integrity: sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==} + hasBin: true + dependencies: + css: 3.0.0 + debug: 3.1.0 + glob: 7.2.0 + mkdirp: 1.0.4 + safer-buffer: 2.1.2 + sax: 1.2.4 + semver: 6.3.0 + source-map: 0.7.3 + dev: true + /sugarss/2.0.0: resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==} dependencies: @@ -14903,6 +19692,20 @@ packages: resolution: {integrity: sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=} dev: true + /svgo/2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.1.3 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + /symbol-observable/1.2.0: resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==} engines: {node: '>=0.10.0'} @@ -14932,6 +19735,17 @@ packages: strip-ansi: 6.0.1 dev: true + /table/6.7.3: + resolution: {integrity: sha512-5DkIxeA7XERBqMwJq0aHZOdMadBx4e6eDoFRuyT5VR82J0Ycg2DwM6GfA/EQAhJ+toRTaS1lIdSQCqgrmhPnlw==} + engines: {node: '>=10.0.0'} + dependencies: + ajv: 8.8.1 + lodash.truncate: 4.4.2 + slice-ansi: 4.0.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + /tannin/1.2.0: resolution: {integrity: sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==} dependencies: @@ -14943,6 +19757,11 @@ packages: engines: {node: '>=6'} dev: true + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + /tar/2.2.2: resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==} deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. @@ -14984,6 +19803,68 @@ packages: worker-farm: 1.7.0 dev: true + /terser-webpack-plugin/5.2.5_acorn@8.5.0+webpack@5.64.1: + resolution: {integrity: sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + jest-worker: 27.3.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + source-map: 0.6.1 + terser: 5.10.0_acorn@8.5.0 + webpack: 5.64.1 + transitivePeerDependencies: + - acorn + dev: true + + /terser-webpack-plugin/5.2.5_webpack@5.64.1: + resolution: {integrity: sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + jest-worker: 27.3.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + source-map: 0.6.1 + terser: 5.10.0 + webpack: 5.64.1 + transitivePeerDependencies: + - acorn + dev: true + + /terser/4.3.8: + resolution: {integrity: sha512-otmIRlRVmLChAWsnSFNO0Bfk6YySuBp6G9qrHiJwlLDd4mxe2ta4sjI7TzIR+W1nBMjilzrMcPOz9pSusgx3hQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + commander: 2.20.3 + source-map: 0.6.1 + source-map-support: 0.5.20 + dev: true + /terser/4.8.0: resolution: {integrity: sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==} engines: {node: '>=6.0.0'} @@ -14994,6 +19875,37 @@ packages: source-map-support: 0.5.20 dev: true + /terser/5.10.0: + resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==} + engines: {node: '>=10'} + hasBin: true + peerDependencies: + acorn: ^8.5.0 + peerDependenciesMeta: + acorn: + optional: true + dependencies: + commander: 2.20.3 + source-map: 0.7.3 + source-map-support: 0.5.20 + dev: true + + /terser/5.10.0_acorn@8.5.0: + resolution: {integrity: sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==} + engines: {node: '>=10'} + hasBin: true + peerDependencies: + acorn: ^8.5.0 + peerDependenciesMeta: + acorn: + optional: true + dependencies: + acorn: 8.5.0 + commander: 2.20.3 + source-map: 0.7.3 + source-map-support: 0.5.20 + dev: true + /test-exclude/5.2.3: resolution: {integrity: sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==} engines: {node: '>=6'} @@ -15036,6 +19948,10 @@ packages: xtend: 4.0.2 dev: true + /thunky/1.1.0: + resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + dev: true + /timed-out/4.0.1: resolution: {integrity: sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=} engines: {node: '>=0.10.0'} @@ -15048,6 +19964,10 @@ packages: setimmediate: 1.0.5 dev: true + /timsort/0.3.0: + resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=} + dev: true + /tiny-lr/1.1.1: resolution: {integrity: sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA==} dependencies: @@ -15116,6 +20036,11 @@ packages: regex-not: 1.0.2 safe-regex: 1.1.0 + /toidentifier/1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: true + /tough-cookie/2.5.0: resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} engines: {node: '>=0.8'} @@ -15186,15 +20111,7 @@ packages: glob: 7.2.0 dev: true - /ts-essentials/7.0.3_typescript@3.9.7: - resolution: {integrity: sha512-8+gr5+lqO3G84KdiTSMRLtuyJ+nTBVRKuCrK4lidMPdVeEp0uqC875uE5NMcaA7YYMN7XsNiFQuMvasF8HT/xQ==} - peerDependencies: - typescript: '>=3.7.0' - dependencies: - typescript: 3.9.7 - dev: true - - /ts-jest/25.5.0_jest@25.5.4+typescript@3.9.7: + /ts-jest/25.5.0_jest@27.3.1+typescript@4.4.4: resolution: {integrity: sha512-govrjbOk1UEzcJ5cX5k8X8IUtFuP3lp3mrF3ZuKtCdAOQzdeCM7qualhb/U8s8SWFwEDutOqfF5PLkJ+oaYD4w==} engines: {node: '>= 8'} hasBin: true @@ -15205,17 +20122,56 @@ packages: bs-logger: 0.2.6 buffer-from: 1.1.2 fast-json-stable-stringify: 2.1.0 - jest: 25.5.4 + jest: 27.3.1 json5: 2.2.0 lodash.memoize: 4.1.2 make-error: 1.3.6 micromatch: 4.0.4 mkdirp: 0.5.5 semver: 6.3.0 - typescript: 3.9.7 + typescript: 4.4.4 yargs-parser: 18.1.3 dev: true + /ts-loader/9.2.6_typescript@4.2.4+webpack@5.64.1: + resolution: {integrity: sha512-QMTC4UFzHmu9wU2VHZEmWWE9cUajjfcdcws+Gh7FhiO+Dy0RnR1bNz0YCHqhI0yRowCE9arVnNxYHqELOy9Hjw==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.8.3 + micromatch: 4.0.4 + semver: 7.3.5 + typescript: 4.2.4 + webpack: 5.64.1 + dev: true + + /ts-node/9.1.1_typescript@4.2.4: + resolution: {integrity: sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg==} + engines: {node: '>=10.0.0'} + hasBin: true + peerDependencies: + typescript: '>=2.7' + dependencies: + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + source-map-support: 0.5.20 + typescript: 4.2.4 + yn: 3.1.1 + dev: true + + /tsconfig-paths-webpack-plugin/3.4.1: + resolution: {integrity: sha512-HN1aWCPOXLF3dDke1w4z3RfCgmm9yTppg51FMCqZ02p6leKD4JZvvnPZtqhvnQVmoWWaQjbpO93h2WFjRJjQcA==} + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.8.3 + tsconfig-paths: 3.11.0 + dev: true + /tsconfig-paths/3.11.0: resolution: {integrity: sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==} dependencies: @@ -15228,6 +20184,10 @@ packages: /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + /tslib/2.1.0: + resolution: {integrity: sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==} + dev: true + /tslib/2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} @@ -15251,6 +20211,16 @@ packages: typescript: 4.2.4 dev: true + /tsutils/3.21.0_typescript@4.4.4: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.4.4 + dev: true + /tty-browserify/0.0.0: resolution: {integrity: sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=} dev: true @@ -15302,6 +20272,14 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.34 + dev: true + /typedarray-to-buffer/3.1.5: resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} dependencies: @@ -15322,6 +20300,12 @@ packages: hasBin: true dev: true + /typescript/4.4.4: + resolution: {integrity: sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: true + /uglify-js/3.14.2: resolution: {integrity: sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==} engines: {node: '>=0.8.0'} @@ -15387,6 +20371,13 @@ packages: is-extendable: 0.1.1 set-value: 2.0.1 + /union/0.5.0: + resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} + engines: {node: '>= 0.8.0'} + dependencies: + qs: 6.10.1 + dev: true + /unique-filename/1.1.1: resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} dependencies: @@ -15432,6 +20423,11 @@ packages: engines: {node: '>= 10.0.0'} dev: true + /unpipe/1.0.0: + resolution: {integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=} + engines: {node: '>= 0.8'} + dev: true + /unset-value/1.0.0: resolution: {integrity: sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=} engines: {node: '>=0.10.0'} @@ -15479,6 +20475,10 @@ packages: resolution: {integrity: sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=} deprecated: Please see https://github.com/lydell/urix#deprecated + /url-join/2.0.5: + resolution: {integrity: sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=} + dev: true + /url-parse-lax/1.0.0: resolution: {integrity: sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=} engines: {node: '>=0.10.0'} @@ -15522,6 +20522,11 @@ packages: inherits: 2.0.3 dev: true + /utils-merge/1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + dev: true + /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -15565,6 +20570,11 @@ packages: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 + /vary/1.1.2: + resolution: {integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=} + engines: {node: '>= 0.8'} + dev: true + /verror/1.10.0: resolution: {integrity: sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=} engines: {'0': node >=0.6.0} @@ -15641,6 +20651,11 @@ packages: dependencies: makeerror: 1.0.11 + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + /watchpack-chokidar2/2.0.1: resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} requiresBuild: true @@ -15659,6 +20674,20 @@ packages: watchpack-chokidar2: 2.0.1 dev: true + /watchpack/2.2.0: + resolution: {integrity: sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.8 + dev: true + + /wbuf/1.7.3: + resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} + dependencies: + minimalistic-assert: 1.0.1 + dev: true + /webidl-conversions/3.0.1: resolution: {integrity: sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=} dev: false @@ -15696,6 +20725,77 @@ packages: yargs: 13.3.2 dev: true + /webpack-dev-middleware/5.2.1_webpack@5.64.1: + resolution: {integrity: sha512-Kx1X+36Rn9JaZcQMrJ7qN3PMAuKmEDD9ZISjUj3Cgq4A6PtwYsC4mpaKotSRYH3iOF6HsUa8viHKS59FlyVifQ==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + dependencies: + colorette: 2.0.16 + memfs: 3.3.0 + mime-types: 2.1.34 + range-parser: 1.2.1 + schema-utils: 3.1.1 + webpack: 5.64.1 + dev: true + + /webpack-dev-server/4.5.0_webpack@5.64.1: + resolution: {integrity: sha512-Ss4WptsUjYa+3hPI4iYZYEc8FrtnfkaPrm5WTjk9ux5kiCS718836srs0ppKMHRaCHP5mQ6g4JZGcfDdGbCjpQ==} + engines: {node: '>= 12.13.0'} + hasBin: true + peerDependencies: + webpack: ^4.37.0 || ^5.0.0 + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + ansi-html-community: 0.0.8 + bonjour: 3.5.0 + chokidar: 3.5.2 + colorette: 2.0.16 + compression: 1.7.4 + connect-history-api-fallback: 1.6.0 + del: 6.0.0 + express: 4.17.1 + graceful-fs: 4.2.8 + html-entities: 2.3.2 + http-proxy-middleware: 2.0.1 + internal-ip: 6.2.0 + ipaddr.js: 2.0.1 + open: 8.4.0 + p-retry: 4.6.1 + portfinder: 1.0.28 + schema-utils: 3.1.1 + selfsigned: 1.10.11 + serve-index: 1.9.1 + sockjs: 0.3.21 + spdy: 4.0.2 + strip-ansi: 7.0.1 + url: 0.11.0 + webpack: 5.64.1 + webpack-dev-middleware: 5.2.1_webpack@5.64.1 + ws: 8.2.3 + transitivePeerDependencies: + - bufferutil + - debug + - supports-color + - utf-8-validate + dev: true + + /webpack-merge/5.8.0: + resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==} + engines: {node: '>=10.0.0'} + dependencies: + clone-deep: 4.0.1 + wildcard: 2.0.0 + dev: true + + /webpack-node-externals/3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + dev: true + /webpack-sources/1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} dependencies: @@ -15703,6 +20803,25 @@ packages: source-map: 0.6.1 dev: true + /webpack-sources/3.2.2: + resolution: {integrity: sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==} + engines: {node: '>=10.13.0'} + dev: true + + /webpack-subresource-integrity/1.5.2_webpack@5.64.1: + resolution: {integrity: sha512-GBWYBoyalbo5YClwWop9qe6Zclp8CIXYGIz12OPclJhIrSplDxs1Ls1JDMH8xBPPrg1T6ISaTW9Y6zOrwEiAzw==} + engines: {node: '>=4'} + peerDependencies: + html-webpack-plugin: '>= 2.21.0 < 5' + webpack: '>= 1.12.11 < 6' + peerDependenciesMeta: + html-webpack-plugin: + optional: true + dependencies: + webpack: 5.64.1 + webpack-sources: 1.4.3 + dev: true + /webpack/4.44.2_webpack-cli@3.3.12: resolution: {integrity: sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==} engines: {node: '>=6.11.5'} @@ -15742,6 +20861,46 @@ packages: webpack-sources: 1.4.3 dev: true + /webpack/5.64.1: + resolution: {integrity: sha512-b4FHmRgaaAjP+aVOVz41a9Qa5SmkUPQ+u8FntTQ1roPHahSComB6rXnLwc976VhUY4CqTaLu5mCswuHiNhOfVw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.1 + '@types/estree': 0.0.50 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.5.0 + acorn-import-assertions: 1.8.0_acorn@8.5.0 + browserslist: 4.18.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.8.3 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.8 + json-parse-better-errors: 1.0.2 + loader-runner: 4.2.0 + mime-types: 2.1.34 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.2.5_acorn@8.5.0+webpack@5.64.1 + watchpack: 2.2.0 + webpack-sources: 3.2.2 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /websocket-driver/0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} engines: {node: '>=0.8.0'} @@ -15852,6 +21011,10 @@ packages: string-width: 2.1.1 dev: true + /wildcard/2.0.0: + resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} + dev: true + /word-wrap/1.2.3: resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==} engines: {node: '>=0.10.0'} @@ -15866,6 +21029,15 @@ packages: errno: 0.1.8 dev: true + /worker-plugin/3.2.0_webpack@5.64.1: + resolution: {integrity: sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==} + peerDependencies: + webpack: '>= 4' + dependencies: + loader-utils: 1.4.0 + webpack: 5.64.1 + dev: true + /wp-prettier/1.19.1: resolution: {integrity: sha512-mqAC2r1NDmRjG+z3KCJ/i61tycKlmADIjxnDhQab+KBxSAGbF/W7/zwB2guy/ypIeKrrftNsIYkNZZQKf3vJcg==} engines: {node: '>=4'} @@ -15982,6 +21154,19 @@ packages: utf-8-validate: optional: true + /ws/8.2.3: + resolution: {integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: true + /xdg-basedir/3.0.0: resolution: {integrity: sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=} engines: {node: '>=4'} @@ -16107,6 +21292,16 @@ packages: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 + /yn/3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue/0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true + /zwitch/1.0.5: resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==} dev: true @@ -16130,9 +21325,9 @@ packages: version: 0.0.1 requiresBuild: true dependencies: - '@babel/cli': 7.12.8_@babel+core@7.15.8 - '@babel/core': 7.15.8 - '@babel/preset-env': 7.15.8_@babel+core@7.15.8 + '@babel/cli': 7.12.8_@babel+core@7.16.0 + '@babel/core': 7.16.0 + '@babel/preset-env': 7.16.4_@babel+core@7.16.0 '@slack/web-api': 5.15.0 '@wordpress/e2e-test-utils': 3.0.0_jest@24.9.0+puppeteer@2.1.1 config: 3.3.6 diff --git a/tools/changelogger/Formatter.php b/tools/changelogger/Formatter.php new file mode 100644 index 00000000000..f24f63d007a --- /dev/null +++ b/tools/changelogger/Formatter.php @@ -0,0 +1,279 @@ + 'https://www.npmjs.com/package/@woocommerce/components/v/', + 'plugins/woocommerce' => 'https://github.com/woocommerce/woocommerce/releases/tag/', + ); + + // Catpure anything past /woocommerce in the current working directory. + preg_match( '/\/woocommerce\/(.+)/', getcwd(), $path ); + + if ( ! count( $path ) ) { + throw new \InvalidArgumentException( 'Invalid directory.' ); + } + + $release_url = $path_map[ $path[1] ]; + + if ( ! $release_url ) { + throw new \InvalidArgumentException( 'Release URL not found.' ); + } + + return $release_url . $version; + } + + /** + * Modified version of parse() from KeepAChangelogParser. + * + * @param string $changelog Changelog contents. + * @return Changelog + * @throws \InvalidArgumentException If the changelog data cannot be parsed. + */ + public function parse( $changelog ) { + $ret = new Changelog(); + + // Fix newlines and expand tabs. + $changelog = strtr( $changelog, array( "\r\n" => "\n" ) ); + $changelog = strtr( $changelog, array( "\r" => "\n" ) ); + while ( strpos( $changelog, "\t" ) !== false ) { + $changelog = preg_replace_callback( + '/^([^\t\n]*)\t/m', + function ( $m ) { + return $m[1] . str_repeat( ' ', 4 - ( mb_strlen( $m[1] ) % 4 ) ); + }, + $changelog + ); + } + + // Entries make up the rest of the document. + $entries = array(); + $entry_pattern = $this->entry_pattern; + preg_match_all( $entry_pattern, $changelog, $matches ); + + foreach ( $matches[0] as $section ) { + // Remove the epilogue, if it exists. + $section = str_replace( $this->epilogue, '', $section ); + + $heading_pattern = $this->heading_pattern; + $subentry_pattern = $this->subentry_pattern; + + // Parse the heading and create a ChangelogEntry for it. + preg_match( $heading_pattern, $section, $heading ); + + // Check if the heading may be a sub-heading. + preg_match( $subentry_pattern, $section, $subheading ); + $is_subentry = count( $subheading ) > 0; + + if ( ! count( $heading ) && ! count( $subheading ) ) { + throw new \InvalidArgumentException( 'Invalid heading' ); + } + + $version = ''; + $timestamp = new DateTime( 'now', new DateTimeZone( 'UTC' ) ); + $entry_timestamp = new DateTime( 'now', new DateTimeZone( 'UTC' ) ); + + if ( count( $heading ) ) { + $version = $heading[1]; + $timestamp = $heading[2]; + + try { + $timestamp = new DateTime( $timestamp, new DateTimeZone( 'UTC' ) ); + } catch ( \Exception $ex ) { + throw new \InvalidArgumentException( "Heading has an invalid timestamp: $heading", 0, $ex ); + } + + if ( strtotime( $heading[2], 0 ) !== strtotime( $heading[2], 1000000000 ) ) { + throw new \InvalidArgumentException( "Heading has a relative timestamp: $heading" ); + } + $entry_timestamp = $timestamp; + + $content = trim( preg_replace( $heading_pattern, '', $section ) ); + } elseif ( $is_subentry ) { + // It must be a subheading. + $version = $subheading[0]; // For now. + $content = trim( preg_replace( $subentry_pattern, '', $section ) ); + } + + $entry = $this->newChangelogEntry( + $version, + array( + 'timestamp' => $timestamp, + ) + ); + + $entries[] = $entry; + + if ( '' === $content ) { + // Huh, no changes. + continue; + } + + // Now parse all the subheadings and changes. + while ( '' !== $content ) { + $changes = array(); + $rows = explode( "\n", $content ); + foreach ( $rows as $row ) { + $row = trim( $row ); + $row = preg_replace( '/' . $this->bullet . '/', '', $row, 1 ); + $row_segments = explode( ' - ', $row ); + + array_push( + $changes, + array( + 'subheading' => $is_subentry ? '' : trim( $row_segments[0] ), + 'content' => $is_subentry ? trim( $row ) : trim( $row_segments[1] ), + ) + ); + } + + foreach ( $changes as $change ) { + $entry->appendChange( + $this->newChangeEntry( + array( + 'subheading' => $change['subheading'], + 'content' => $change['content'], + 'timestamp' => $entry_timestamp, + ) + ) + ); + } + $content = ''; + } + } + + $ret->setEntries( $entries ); + $ret->setPrologue( $this->prologue ); + $ret->setEpilogue( $this->epilogue ); + return $ret; + } + + /** + * Write a Changelog object to a string. + * + * @param Changelog $changelog Changelog object. + * @return string + */ + public function format( Changelog $changelog ) { + $ret = ''; + $date_format = 'Y-m-d'; + $bullet = $this->bullet; + $indent = str_repeat( ' ', strlen( $bullet ) ); + + $prologue = trim( $changelog->getPrologue() ); + if ( '' !== $prologue ) { + $ret .= "$prologue\n\n"; + } + + foreach ( $changelog->getEntries() as $entry ) { + $version = $entry->getVersion(); + $is_subentry = preg_match( $this->subentry_pattern, $version, $subentry ); + $timestamp = $entry->getTimestamp(); + error_log(print_r($version, true)); + $release_link = $this->getReleaseLink( $version ); + + if ( $is_subentry ) { + $ret .= '###' . $subentry[1] . " \n\n"; + } else { + $ret .= '## [' . $version . '](' . $release_link . ') - ' . $timestamp->format( $date_format ) . " \n\n"; + } + + $prologue = trim( $entry->getPrologue() ); + + if ( '' !== $prologue ) { + $ret .= "$prologue\n\n"; + } + + foreach ( $entry->getChangesBySubheading() as $heading => $changes ) { + foreach ( $changes as $change ) { + $breaking_change = 'major' === $change->getSignificance() ? ' [ **BREAKING CHANGE** ]' : ''; + $text = trim( $change->getContent() ); + if ( '' !== $text ) { + $preamble = $is_subentry ? '' : $bullet . $heading . $breaking_change . ' - '; + $ret .= $preamble . str_replace( "\n", "\n$indent", $text ) . "\n"; + } + } + } + $ret = trim( $ret ) . "\n\n"; + } + + $epilogue = trim( $changelog->getEpilogue() ); + if ( '' !== $epilogue ) { + $ret .= "$epilogue\n"; + } + + $ret = trim( $ret ) . "\n"; + + return $ret; + } +} diff --git a/tools/changelogger/PackageFormatter.php b/tools/changelogger/PackageFormatter.php new file mode 100644 index 00000000000..0763aedc631 --- /dev/null +++ b/tools/changelogger/PackageFormatter.php @@ -0,0 +1,32 @@ +