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..dde107c7df1 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..5090b57c36b 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. @@ -73,16 +73,17 @@ jobs: with: path: package/woocommerce - - name: Run npm install. - working-directory: package/woocommerce/plugins/woocommerce - npm install -g pnpm - pnpm install + - 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 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 +104,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/DEVELOPMENT.md b/DEVELOPMENT.md index 901f3a1db27..3138c399b4e 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -34,9 +34,8 @@ The port # might be different depending on your `.wp-env.override.json` configur Once you have WP-ENV container up, we need to run a few commands to start developing. 1. Run `pnpm install` to install npm modules. -2. Navigate to Core WooCommerce `cd plugins/woocommerce`. -3. Run `pnpm run build:core` -4. Run `composer install` to install PHP dependencies. +2. Run `pnpm nx build woocommerce` to build core. +3. Run `pnpm nx composer-install woocommerce` to install PHP dependencies. If you don't have Composer available locally, run the following command. It runs the command in WP-ENV container. 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/CHANGELOG.md b/packages/js/api-core-tests/CHANGELOG.md index f9c672179e7..7c54c9528d8 100644 --- a/packages/js/api-core-tests/CHANGELOG.md +++ b/packages/js/api-core-tests/CHANGELOG.md @@ -6,3 +6,5 @@ - Coupons API Tests - Refunds API Tests - Products API Tests +- CRUD tests for the Orders API +- Order Search API Tests 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..13f3c93fdf3 --- /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": "Fixes an existing bug", + "add": "Adds functionality", + "update": "Update existing functionality", + "dev": "Development related task", + "tweak": "A minor adjustment to the codebase", + "performance": "Address performance issues", + "enhancement": "Improve existing functionality" + }, + "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..953df08b4f4 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.', @@ -15,5 +14,5 @@ }; module.exports = { - refund: refund, + refund, }; diff --git a/packages/js/api-core-tests/endpoints/orders.js b/packages/js/api-core-tests/endpoints/orders.js index 1ff3cc81854..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,14 +29,16 @@ 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', method: 'GET', path: 'orders', responseCode: 200, - orders: async () => getRequest( 'orders' ), + orders: async ( ordersQuery = {} ) => + getRequest( 'orders', ordersQuery ), }, update: { name: 'Update an order', @@ -39,7 +46,8 @@ const ordersApi = { path: 'orders/', responseCode: 200, payload: getOrderExample(), - order: async ( orderId, orderDetails ) => putRequest( `orders/${orderId}`, orderDetails ), + order: async ( orderId, orderDetails ) => + putRequest( `orders/${ orderId }`, orderDetails ), }, delete: { name: 'Delete an order', @@ -47,9 +55,10 @@ const ordersApi = { path: 'orders/', responseCode: 200, payload: { - force: false + force: false, }, - order: async ( orderId, deletePermanently ) => deleteRequest( `orders/${orderId}`, deletePermanently ), + order: async ( orderId, deletePermanently ) => + deleteRequest( `orders/${ orderId }`, deletePermanently ), }, batch: { name: 'Batch update orders', @@ -57,7 +66,8 @@ const ordersApi = { path: 'orders/batch', responseCode: 200, payload: shared.getBatchPayloadExample( getOrderExample() ), - orders: async ( batchUpdatePayload ) => postRequest( `orders/batch`, batchUpdatePayload ), + orders: async ( batchUpdatePayload ) => + postRequest( `orders/batch`, batchUpdatePayload ), }, }; 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/order-search.test.js b/packages/js/api-core-tests/tests/orders/order-search.test.js new file mode 100644 index 00000000000..500681dae0a --- /dev/null +++ b/packages/js/api-core-tests/tests/orders/order-search.test.js @@ -0,0 +1,86 @@ +const { ordersApi } = require( '../../endpoints' ); +const { getOrderExample, shared } = require( '../../data' ); + +/** + * Order to be searched + */ +const order = { + ...getOrderExample(), + shipping: { + ...shared.customerShipping, + company: 'Murphy LLC', + phone: '6146524353', + }, + shipping_lines: [], + fee_lines: [], + coupon_lines: [], +}; + +/** + * Search parameters to be used. + * The following scenarios are not covered in this test suite because they're already covered in the `List all orders > search` test in `orders.test.js` + * ``` + * can search by billing address 1 + * can search by shipping address 1 + * can search by billing last name + * can search by billing email + * can search by item name + * ``` + */ +const searchParams = [ + [ 'orderId', 'orderId' ], + [ 'billing first name', order.billing.first_name ], + [ 'billing company name', order.billing.company ], + [ 'billing address 2', order.billing.address_2 ], + [ 'billing city name', order.billing.city ], + [ 'billing post code', order.billing.postcode ], + [ 'billing phone', order.billing.phone ], + [ 'billing state', order.billing.state ], + [ 'shipping first name', order.shipping.first_name ], + [ 'shipping last name', order.shipping.last_name ], + [ 'shipping address 2', order.shipping.address_2 ], + [ 'shipping city', order.shipping.city ], + [ 'shipping post code', order.shipping.postcode ], + [ 'shipping state', order.shipping.state ], +]; + +/** + * Tests for the WooCommerce Order Search API. + * + * @group api + * @group orders + * + */ +describe( 'Order Search API tests', () => { + beforeAll( async () => { + // Create an order and save its ID + const { body } = await ordersApi.create.order( order ); + order.id = body.id; + } ); + + afterAll( async () => { + // Cleanup: Delete the order + await ordersApi.delete.order( order.id, true ); + } ); + + it.each( searchParams )( 'can search by %s', async ( title, param ) => { + const searchValue = param === 'orderId' ? order.id : param; + + const { status, body } = await ordersApi.listAll.orders( { + search: searchValue, + } ); + + expect( status ).toEqual( ordersApi.listAll.responseCode ); + expect( body ).toHaveLength( 1 ); + expect( body[ 0 ].id ).toEqual( order.id ); + } ); + + it( 'can return an empty result set when no matches were found', async () => { + const { status, body } = await ordersApi.listAll.orders( { + search: 'Chauncey Smith Kunde', + } ); + + expect( status ).toEqual( ordersApi.listAll.responseCode ); + expect( body ).toEqual( [] ); + } ); +} ); diff --git a/packages/js/api-core-tests/tests/orders/orders-crud.test.js b/packages/js/api-core-tests/tests/orders/orders-crud.test.js new file mode 100644 index 00000000000..82e04b56e5b --- /dev/null +++ b/packages/js/api-core-tests/tests/orders/orders-crud.test.js @@ -0,0 +1,215 @@ +const { ordersApi, productsApi } = require( '../../endpoints' ); +const { order } = require( '../../data' ); + +/** + * Billing properties to update. + */ +const updatedCustomerBilling = { + first_name: 'Jane', + last_name: 'Doe', + company: 'Automattic', + country: 'US', + address_1: '123 Market Street', + address_2: 'Suite 500', + city: 'Austin', + state: 'TX', + postcode: '73301', + phone: '123456789', + email: 'jane.doe@example.com', +}; + +/** + * Shipping properties to update. + */ +const updatedCustomerShipping = { + first_name: 'Mike', + last_name: 'Anderson', + company: 'Automattic', + country: 'US', + address_1: '123 Ocean Ave', + address_2: '', + city: 'New York', + state: 'NY', + postcode: '10013', + phone: '123456789', +}; + +/** + * Data tables to be used for testing the 'Create an order' API. + */ +const statusesDataTable = [ + 'pending', + 'processing', + 'on-hold', + 'completed', + 'cancelled', + 'refunded', + 'failed', +]; + +/** + * A simple product that will be added to an order. + */ +const simpleProduct = { + name: 'Incredible Plastic Table', + regular_price: '48', +}; + +/** + * Tests for the WooCommerce Orders API. + * + * @group api + * @group orders + * + */ +describe( 'Orders API tests: CRUD', () => { + let orderId; + + describe( 'Create an order', () => { + it( 'can create a pending order by default', async () => { + // Create an order that has a null status + const requestPayload = { + ...order, + status: null, + }; + const { body, status } = await ordersApi.create.order( + requestPayload + ); + // Save the order ID. It will be used by the retrieve, update, and delete tests. + orderId = body.id; + + // Verify that the order status is 'pending' + expect( status ).toEqual( ordersApi.create.responseCode ); + expect( typeof body.id ).toEqual( 'number' ); + expect( body.status ).toEqual( 'pending' ); + } ); + + it.each( statusesDataTable )( + "can create an order with status '%s'", + async ( expectedStatus ) => { + const requestPayload = { + ...order, + status: expectedStatus, + }; + const { status, body } = await ordersApi.create.order( + requestPayload + ); + + expect( status ).toEqual( ordersApi.create.responseCode ); + expect( typeof body.id ).toEqual( 'number' ); + expect( body.status ).toEqual( expectedStatus ); + + // Cleanup: Delete this order + await ordersApi.delete.order( body.id, true ); + } + ); + } ); + + describe( 'Retrieve an order', () => { + 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 ); + } ); + } ); + + describe( 'Update an order', () => { + beforeAll( async () => { + // Create the product and save its id + const { body } = await productsApi.create.product( simpleProduct ); + simpleProduct.id = body.id; + } ); + + afterAll( async () => { + // Delete the created product + await productsApi.delete.product( simpleProduct.id, true ); + } ); + + it.each( statusesDataTable )( + "can update status of an order to '%s'", + async ( expectedOrderStatus ) => { + const requestPayload = { + status: expectedOrderStatus, + }; + const { status, body } = await ordersApi.update.order( + orderId, + requestPayload + ); + + expect( status ).toEqual( ordersApi.update.responseCode ); + expect( body.id ).toEqual( orderId ); + expect( body.status ).toEqual( expectedOrderStatus ); + } + ); + + 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.body.billing ).toEqual( updatedCustomerBilling ); + expect( response.body.shipping ).toEqual( updatedCustomerShipping ); + } ); + + it( 'can add a product to an order', async () => { + // Add the product to the order + const requestPayload = { + line_items: [ { product_id: simpleProduct.id } ], + }; + const { body, status } = await ordersApi.update.order( + orderId, + requestPayload + ); + + // Verify that the added product has the correct values + expect( status ).toEqual( ordersApi.update.responseCode ); + expect( body.line_items ).toHaveLength( 1 ); + expect( body.line_items[ 0 ].product_id ).toEqual( + simpleProduct.id + ); + expect( body.line_items[ 0 ].name ).toEqual( simpleProduct.name ); + } ); + + it( 'can pay for an order', async () => { + // Setup: Set order status to 'pending' + await ordersApi.update.order( orderId, { + status: 'pending', + } ); + + // Pay for the order by setting `set_paid` to true + const updateRequestPayload = { + set_paid: true, + }; + const { status, body } = await ordersApi.update.order( + orderId, + updateRequestPayload + ); + expect( status ).toEqual( ordersApi.update.responseCode ); + expect( body.id ).toEqual( orderId ); + + // Validate that the status of the order was automatically set to 'processing' + expect( body.status ).toEqual( 'processing' ); + + // Validate that the date_paid and date_paid_gmt properties are no longer null + expect( body.date_paid ).not.toBeNull(); + expect( body.date_paid_gmt ).not.toBeNull(); + } ); + } ); + + describe( 'Delete an order', () => { + it( 'can permanently delete an order', async () => { + // Delete the order. + const response = await ordersApi.delete.order( orderId, true ); + expect( response.status ).toEqual( ordersApi.delete.responseCode ); + + // Verify that the order can no longer be retrieved. + const getOrderResponse = await ordersApi.retrieve.order( orderId ); + expect( getOrderResponse.status ).toEqual( 404 ); + } ); + } ); +} ); 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..13a6e177056 --- /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": "Fixes an existing bug", + "add": "Adds functionality", + "update": "Update existing functionality", + "dev": "Development related task", + "tweak": "A minor adjustment to the codebase", + "performance": "Address performance issues", + "enhancement": "Improve existing functionality" + }, + "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/.gitignore b/packages/js/e2e-core-tests/.gitignore new file mode 100644 index 00000000000..5585f5a8863 --- /dev/null +++ b/packages/js/e2e-core-tests/.gitignore @@ -0,0 +1 @@ +/test-data/sample_products.csv diff --git a/packages/js/e2e-core-tests/CHANGELOG.md b/packages/js/e2e-core-tests/CHANGELOG.md index ab6ce9e8c6a..d0a15fbe6e0 100644 --- a/packages/js/e2e-core-tests/CHANGELOG.md +++ b/packages/js/e2e-core-tests/CHANGELOG.md @@ -1,8 +1,14 @@ # Unreleased +## Added + +- A `specs/data` folder to store page element data. +- Tests to verify that different top-level menu and their associated sub-menus load successfully. + ## Changed - New coupon test deletes the coupon instead of trashing it. +- A copy of sample_data.csv is included in the package. # 0.1.6 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/README.md b/packages/js/e2e-core-tests/README.md index 463eaf9ed81..1c48455197b 100644 --- a/packages/js/e2e-core-tests/README.md +++ b/packages/js/e2e-core-tests/README.md @@ -72,6 +72,7 @@ The functions to access the core tests are: - `runAnalyticsPageLoadsTest` - Merchant can load and see all pages in Analytics - `runImportProductsTest` - Merchant can import products via CSV file - `runInitiateWccomConnectionTest` - Merchant can initiate connection to WooCommerce.com + - `runAdminPageLoadTests` - Merchant can load pages from the WP Admin sidebar ### Shopper diff --git a/packages/js/e2e-core-tests/bin/build.sh b/packages/js/e2e-core-tests/bin/build.sh new file mode 100755 index 00000000000..07f76e7c05d --- /dev/null +++ b/packages/js/e2e-core-tests/bin/build.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +# +# Copy the WooCommerce sample data file to the package +# + +PACKAGEPATH=$(dirname $(dirname "$0")) + +cp -v $PACKAGEPATH/../../../plugins/woocommerce/sample-data/sample_products.csv $PACKAGEPATH/test-data 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..4cb5b6f4746 --- /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": "Fixes an existing bug", + "add": "Adds functionality", + "update": "Update existing functionality", + "dev": "Development related task", + "tweak": "A minor adjustment to the codebase", + "performance": "Address performance issues", + "enhancement": "Improve existing functionality" + }, + "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/package.json b/packages/js/e2e-core-tests/package.json index a45ebf68ec9..6081cfb045b 100644 --- a/packages/js/e2e-core-tests/package.json +++ b/packages/js/e2e-core-tests/package.json @@ -11,6 +11,7 @@ "main": "index.js", "dependencies": { "@jest/globals": "^26.4.2", + "@wordpress/deprecated": "^3.2.3", "config": "3.3.3", "faker": "^5.1.0" }, @@ -20,5 +21,9 @@ }, "publishConfig": { "access": "public" + }, + "scripts": { + "build": "./bin/build.sh", + "prepare": "pnpm run build" } } 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/activate-and-setup/activate.test.js b/packages/js/e2e-core-tests/specs/activate-and-setup/activate.test.js index 0de8815b9e6..da8e6af9a89 100644 --- a/packages/js/e2e-core-tests/specs/activate-and-setup/activate.test.js +++ b/packages/js/e2e-core-tests/specs/activate-and-setup/activate.test.js @@ -11,6 +11,7 @@ const { describe, beforeAll, } = require( '@jest/globals' ); +import deprecated from '@wordpress/deprecated'; const runActivationTest = () => { describe('Store owner can login and make sure WooCommerce is activated', () => { @@ -19,6 +20,10 @@ const runActivationTest = () => { }); it('can make sure WooCommerce is activated. If not, activate it', async () => { + deprecated( 'runActivationTest', { + alternative: '@woocommerce/admin-e2e-tests `testAdminBasicSetup()`', + }); + const slug = 'woocommerce'; await merchant.openPlugins(); const disableLink = await page.$(`tr[data-slug="${slug}"] .deactivate a`); diff --git a/packages/js/e2e-core-tests/specs/activate-and-setup/onboarding-tasklist.test.js b/packages/js/e2e-core-tests/specs/activate-and-setup/onboarding-tasklist.test.js index 4f777265352..a54fabc13c7 100644 --- a/packages/js/e2e-core-tests/specs/activate-and-setup/onboarding-tasklist.test.js +++ b/packages/js/e2e-core-tests/specs/activate-and-setup/onboarding-tasklist.test.js @@ -13,6 +13,7 @@ const { * External dependencies */ const config = require( 'config' ); +import deprecated from '@wordpress/deprecated'; const { it, describe, @@ -47,6 +48,9 @@ const runOnboardingFlowTest = () => { } it('can start and complete onboarding when visiting the site for the first time.', async () => { + deprecated( 'runOnboardingFlowTest', { + alternative: '@woocommerce/admin-e2e-tests `testAdminOnboardingWizard()`', + }); await completeOnboardingWizard(); }); }); @@ -59,6 +63,9 @@ const runTaskListTest = () => { }); it('can setup shipping', async () => { + deprecated( 'runTaskListTest', { + alternative: '@woocommerce/admin-e2e-tests `testAdminHomescreenTasklist()`', + }); await page.evaluate(() => { document.querySelector('.woocommerce-list__item-title').scrollIntoView(); }); diff --git a/packages/js/e2e-core-tests/specs/activate-and-setup/setup.test.js b/packages/js/e2e-core-tests/specs/activate-and-setup/setup.test.js index 9fcdeb74f5a..a24a5b4aef2 100644 --- a/packages/js/e2e-core-tests/specs/activate-and-setup/setup.test.js +++ b/packages/js/e2e-core-tests/specs/activate-and-setup/setup.test.js @@ -6,6 +6,7 @@ const { it, describe, } = require( '@jest/globals' ); +import deprecated from '@wordpress/deprecated'; /** * Internal dependencies @@ -31,6 +32,9 @@ const runInitialStoreSettingsTest = () => { }); it('can enable tax rates and calculations', async () => { + deprecated( 'runInitialStoreSettingsTest', { + alternative: '@woocommerce/admin-e2e-tests `testAdminBasicSetup()`', + }); // Go to general settings page await merchant.openSettings('general'); 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/data/elements.js b/packages/js/e2e-core-tests/specs/data/elements.js new file mode 100644 index 00000000000..003b8a38b72 --- /dev/null +++ b/packages/js/e2e-core-tests/specs/data/elements.js @@ -0,0 +1,85 @@ +/** + * WP top-level menu items and their associated sub-menus + */ + +export const MENUS = [ + [ + 'WooCommerce', + '#adminmenu > li:nth-child(8) > a', + [ + [ + 'Home', + '#toplevel_page_woocommerce > ul > li:nth-child(2) > a', + 'Home', + ], + [ + 'Orders', + '#toplevel_page_woocommerce > ul > li:nth-child(3) > a', + 'Orders', + ], + [ + 'Reports', + '#toplevel_page_woocommerce > ul > li:nth-child(6) > a', + 'Orders', + ], + [ + 'Settings', + '#toplevel_page_woocommerce > ul > li:nth-child(7) > a', + 'General', + ], + [ + 'Status', + '#toplevel_page_woocommerce > ul > li:nth-child(8) > a', + 'System status', + ], + // [ 'Extensions', '#toplevel_page_woocommerce > ul > li:nth-child(9)', 'Extensions' ], + ], + ], + [ + 'Products', + '#adminmenu > li:nth-child(9) > a', + [ + [ + 'All Products', + '#menu-posts-product > ul > li:nth-child(2) > a', + 'Products', + ], + [ + 'Add New', + '#menu-posts-product > ul > li:nth-child(3) > a', + 'Add New', + ], + [ + 'Categories', + '#menu-posts-product > ul > li:nth-child(4) > a', + 'Product categories', + ], + [ + 'Product tags', + '#menu-posts-product > ul > li:nth-child(5) > a', + 'Product tags', + ], + [ + 'Attributes', + '#menu-posts-product > ul > li:nth-child(6) > a', + 'Attributes', + ], + ], + ], + [ + 'Marketing', + '#adminmenu > li:nth-child(11) > a', + [ + [ + 'Overview', + '#toplevel_page_woocommerce-marketing > ul > li:nth-child(2) > a', + 'Overview', + ], + [ + 'Coupons', + '#toplevel_page_woocommerce-marketing > ul > li:nth-child(3) > a', + 'Coupons', + ], + ], + ], +]; diff --git a/packages/js/e2e-core-tests/specs/index.js b/packages/js/e2e-core-tests/specs/index.js index 91960dd7fec..ed79e109d31 100644 --- a/packages/js/e2e-core-tests/specs/index.js +++ b/packages/js/e2e-core-tests/specs/index.js @@ -37,6 +37,7 @@ const runProductSettingsTest = require( './merchant/wp-admin-settings-product.te const runTaxSettingsTest = require( './merchant/wp-admin-settings-tax.test' ); const runOrderStatusFiltersTest = require( './merchant/wp-admin-order-status-filters.test' ); const runOrderRefundTest = require( './merchant/wp-admin-order-refund.test' ); +const runOrderRefundRestockTest = require( './merchant/wp-admin-order-refund-restock.test' ); const runOrderApplyCouponTest = require( './merchant/wp-admin-order-apply-coupon.test' ); const runProductEditDetailsTest = require( './merchant/wp-admin-product-edit-details.test' ); const runProductSearchTest = require( './merchant/wp-admin-product-search.test' ); @@ -46,6 +47,7 @@ const runOrderSearchingTest = require( './merchant/wp-admin-order-searching.test const runAnalyticsPageLoadsTest = require( './merchant/wp-admin-analytics-page-loads.test' ); const runImportProductsTest = require( './merchant/wp-admin-product-import-csv.test' ); const runInitiateWccomConnectionTest = require( './merchant/wp-admin-extensions-connect-wccom.test' ); +const runAdminPageLoadTests = require( './merchant/wp-admin-page-loads.test.js' ); // REST API tests const runExternalProductAPITest = require( './api/external-product.test' ); @@ -95,12 +97,14 @@ const runMerchantTests = () => { runTaxSettingsTest(); runOrderStatusFiltersTest(); runOrderRefundTest(); + runOrderRefundRestockTest(); runOrderApplyCouponTest(); runProductEditDetailsTest(); runProductSearchTest(); runMerchantOrdersCustomerPaymentPage(); runAnalyticsPageLoadsTest(); runInitiateWccomConnectionTest(); + runAdminPageLoadTests(); } const runApiTests = () => { @@ -142,6 +146,7 @@ module.exports = { runOrderApiTest, runOrderStatusFiltersTest, runOrderRefundTest, + runOrderRefundRestockTest, runOrderApplyCouponTest, runProductEditDetailsTest, runProductSearchTest, @@ -163,4 +168,5 @@ module.exports = { runOrderEmailReceivingTest, runInitiateWccomConnectionTest, runTelemetryAPITest, + runAdminPageLoadTests, }; 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-analytics-page-loads.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-analytics-page-loads.test.js index 6065c75fe41..cde11b5a8b8 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-analytics-page-loads.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-analytics-page-loads.test.js @@ -15,6 +15,7 @@ const { describe, beforeAll, } = require( '@jest/globals' ); +import deprecated from '@wordpress/deprecated'; /** * Quick check for page title and no data message. @@ -57,6 +58,10 @@ const runAnalyticsPageLoadsTest = () => { await merchant.login(); }); + deprecated( 'runAnalyticsPageLoadsTest', { + alternative: '@woocommerce/admin-e2e-tests `testAdminAnalyticsPages()`', + }); + it.each(pages)( 'can see %s page properly', async (pageTitle, element, elementText) => { 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-restock.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-refund-restock.test.js new file mode 100644 index 00000000000..90a3ce4193b --- /dev/null +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-order-refund-restock.test.js @@ -0,0 +1,117 @@ +/** + * Internal dependencies + */ +const { + merchant, + createOrder, + createSimpleProduct, + verifyCheckboxIsSet, + uiUnblocked, + evalAndClick, + clickUpdateOrder, +} = require( '@woocommerce/e2e-utils' ); +const { waitForSelector } = require( '@woocommerce/e2e-environment' ); + +/** + * 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 + * @param {string} resultSelector + * @returns {Promise} + */ +const clickAndWaitForSelector = async ( buttonSelector, resultSelector ) => { + await evalAndClick( buttonSelector ); + await waitForSelector( page, resultSelector, { + timeout: 5000, + } ); +}; + +const getRefundQuantityInputSelector = ( productName ) => + `td.name[data-sort-value="${ productName }"] ~ td.quantity input.refund_order_item_qty`; + +const runOrderRefundRestockTest = () => { + describe( 'WooCommerce Orders > Refund and restock an order item', () => { + // See: https://github.com/woocommerce/woocommerce/issues/30618 + it( 'Can update order after refunding item without automatic stock adjustment', async () => { + const noInventoryProductId = await createSimpleProduct(); + const productToRestockId = await createSimpleProduct( + 'Product with Stock', + '10', + { + trackInventory: true, + remainingStock: 10, + } + ); + + const orderId = await createOrder( { + status: 'completed', + lineItems: [ + { + product_id: noInventoryProductId, + }, + { + product_id: productToRestockId, + quantity: 2, + }, + ], + } ); + + await merchant.login(); + await merchant.goToOrder( orderId ); + + // Get the currency symbol for the store's selected currency + await page.waitForSelector( '.woocommerce-Price-currencySymbol' ); + + // Verify stock reduction system note was added + await expect( page ).toMatchElement( '.system-note', { + text: `Stock levels reduced: Product with Stock (#${ productToRestockId }) 10→8`, + } ); + + // Click the Refund button + await expect( page ).toClick( 'button.refund-items' ); + + // Verify the refund section shows + await page.waitForSelector( 'div.wc-order-refund-items', { + visible: true, + } ); + await verifyCheckboxIsSet( '#restock_refunded_items' ); + + // Initiate a refund + await expect( page ).toFill( + getRefundQuantityInputSelector( 'Product with Stock' ), + '2' + ); + await expect( page ).toFill( '#refund_reason', 'No longer wanted' ); + + await clickAndWaitForSelector( + '.do-manual-refund', + '.quantity .refunded' + ); + await uiUnblocked(); + + // Verify restock system note was added + await expect( page ).toMatchElement( '.system-note', { + text: `Item #${ productToRestockId } stock increased from 8 to 10.`, + } ); + + // Update the order. + await clickUpdateOrder( 'Order updated.' ); + + // Verify that inventory wasn't modified. + // For some reason using expect().not.toMatchElement() did not work for this case. + expect( + await page.$$eval( '.note', ( notes ) => + notes.every( + ( note ) => + ! note.textContent.match( + /Adjusted stock: Product with Stock \(10→8\)/ + ) + ) + ) + ).toEqual( true ); + } ); + } ); +}; + +module.exports = runOrderRefundRestockTest; 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-page-loads.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-page-loads.test.js new file mode 100644 index 00000000000..075bca5d0a0 --- /dev/null +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-page-loads.test.js @@ -0,0 +1,49 @@ +/** + * Internal dependencies + */ +const { merchant } = require( '@woocommerce/e2e-utils' ); +const { MENUS } = require( '../data/elements' ); + +/** + * External dependencies + */ +const { it, describe, beforeAll } = require( '@jest/globals' ); + +const runPageLoadTest = () => { + describe.each( MENUS )( + ' %s > Opening Top Level Pages', + ( menuTitle, menuElement, subMenus ) => { + beforeAll( async () => { + await merchant.login(); + } ); + + afterAll( async () => { + await merchant.logout(); + } ); + + it.each( subMenus )( + 'can see %s page properly', + async ( subMenuTitle, subMenuElement, subMenuText ) => { + // Go to Top Level Menu + await Promise.all( [ + page.click( menuElement ), + page.waitForNavigation( { waitUntil: 'networkidle0' } ), + ] ); + + // Click sub-menu item and wait for the page to finish loading + await Promise.all( [ + page.click( subMenuElement ), + page.waitForNavigation( { waitUntil: 'networkidle0' } ), + ] ); + + await expect( page ).toMatchElement( 'h1', { + text: subMenuText, + } ); + } + ); + } + ); +}; + +// eslint-disable-next-line jest/no-export +module.exports = runPageLoadTest; 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..62864898353 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 @@ -17,8 +17,8 @@ const { it, describe, beforeAll, afterAll } = require( '@jest/globals' ); const path = require( 'path' ); const coreTestsPath = getCoreTestsRoot(); const filePath = path.resolve( - coreTestsPath.appRoot, - 'plugins/woocommerce/sample-data/sample_products.csv' + coreTestsPath.packageRoot, + 'test-data/sample_products.csv' ); const filePathOverride = path.resolve( coreTestsPath.packageRoot, @@ -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-product-new.test.js b/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-new.test.js index 2b5ede5e7c0..d22f6f33834 100644 --- a/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-new.test.js +++ b/packages/js/e2e-core-tests/specs/merchant/wp-admin-product-new.test.js @@ -8,12 +8,13 @@ const { uiUnblocked, evalAndClick, setCheckbox, + setBrowserViewport, verifyAndPublish, + waitForSelector, waitForSelectorWithoutThrow } = require( '@woocommerce/e2e-utils' ); const { waitAndClick, - waitForSelector, } = require( '@woocommerce/e2e-environment' ); /** @@ -45,6 +46,13 @@ const runAddSimpleProductTest = () => { }); it('can create simple virtual product and add it to the cart', async () => { + + // @todo: remove this once https://github.com/woocommerce/woocommerce/issues/31337 has been addressed + await setBrowserViewport( { + width: 970, + height: 700, + } ); + await openNewProductAndVerify(); // Set product data and publish the product @@ -72,6 +80,12 @@ const runAddSimpleProductTest = () => { }); it('can create simple non-virtual product and add it to the cart', async () => { + // @todo: remove this once https://github.com/woocommerce/woocommerce/issues/31337 has been addressed + await setBrowserViewport( { + width: 960, + height: 700, + } ); + await merchant.login(); await openNewProductAndVerify(); 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..bbd0ee0f366 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,10 +35,14 @@ const runAddNewShippingZoneTest = () => { beforeAll(async () => { productId = await createSimpleProduct(); - await withRestApi.deleteAllShippingZones(); + await withRestApi.deleteAllShippingZones( false ); await merchant.login(); }); + afterAll( async () => { + shopper.logout(); + } ); + it('add shipping zone for San Francisco with free Local pickup', async () => { // Add a new shipping zone for San Francisco 94107, CA, US with Local pickup await addShippingZoneAndMethod(shippingZoneNameSF, california, sanFranciscoZIP, 'local_pickup'); 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/shopper/front-end-my-account-create-account.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-create-account.test.js index e3de06c1338..b4f09282808 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-create-account.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-create-account.test.js @@ -25,6 +25,10 @@ const runMyAccountCreateAccountTest = () => { await merchant.logout(); }); + afterAll( async () => { + shopper.logout(); + } ); + it('can create a new account via my account', async () => { await shopper.gotoMyAccount(); await page.waitForSelector('.woocommerce-form-register'); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-pay-order.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-pay-order.test.js index 9ae0790f87f..6416ba43951 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-pay-order.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-my-account-pay-order.test.js @@ -34,6 +34,10 @@ const runMyAccountPayOrderTest = () => { await merchant.logout(); }); + afterAll( async () => { + shopper.logout(); + } ); + it('allows customer to pay for their order in My Account', async () => { await shopper.login(); await shopper.goToOrders(); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-my-account.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-my-account.test.js index 32bb78b9958..277337b3a39 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-my-account.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-my-account.test.js @@ -15,6 +15,10 @@ const pages = [ const runMyAccountPageTest = () => { describe('My account page', () => { + afterAll( async () => { + shopper.logout(); + } ); + it('allows customer to login', async () => { await shopper.login(); expect(page).toMatch('Hello'); diff --git a/packages/js/e2e-core-tests/specs/shopper/front-end-order-email-receiving.test.js b/packages/js/e2e-core-tests/specs/shopper/front-end-order-email-receiving.test.js index 595879c8973..f451a640d3b 100644 --- a/packages/js/e2e-core-tests/specs/shopper/front-end-order-email-receiving.test.js +++ b/packages/js/e2e-core-tests/specs/shopper/front-end-order-email-receiving.test.js @@ -30,12 +30,16 @@ const runOrderEmailReceivingTest = () => { describe('Shopper Order Email Receiving', () => { beforeAll(async () => { simplePostIdValue = await createSimpleProduct(); - + await merchant.login(); await deleteAllEmailLogs(); await merchant.logout(); }); + afterAll( async () => { + shopper.logout(); + } ); + it('should receive order email after purchasing an item', async () => { await shopper.login(); 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 5e3285bf984..091ce2028fc 100644 --- a/packages/js/e2e-environment/CHANGELOG.md +++ b/packages/js/e2e-environment/CHANGELOG.md @@ -1,9 +1,19 @@ # Unreleased +## Fixed + +- Updated the browserViewport in `jest.setup.js` to match the `defaultViewport` dimensions defined in `jest-puppeteer.config.js` ## Added - 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 +- `resolveLocalE2ePath` to resolve path to local E2E file +- `WC_E2E_FOLDER` for mapping plugin root to path within repo + +## Fixed + +- Use consistent `defaultViewport` in both headless and non-headless context # 0.2.3 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.js b/packages/js/e2e-environment/bin/docker-compose.js index fe9742da568..b6046773bae 100755 --- a/packages/js/e2e-environment/bin/docker-compose.js +++ b/packages/js/e2e-environment/bin/docker-compose.js @@ -10,6 +10,7 @@ const { getAppRoot, getAppName, getTestConfig, + resolveLocalE2ePath, } = require( '../utils' ); const dockerArgs = []; @@ -56,10 +57,7 @@ if ( appPath ) { const appInitFile = customInitFile ? customInitFile - : path.resolve( - appPath, - 'plugins/woocommerce/tests/e2e/docker/initialize.sh' - ); + : resolveLocalE2ePath( 'docker/initialize.sh' ); // If found, copy it into the wp-cli Docker context so // it gets picked up by the entrypoint script. if ( fs.existsSync( appInitFile ) ) { @@ -84,11 +82,6 @@ if ( ! process.env.WC_E2E_FOLDER_MAPPING ) { '/var/www/html/wp-content/plugins/' + getAppBase(); } -// Set some environment variables -if ( ! process.env.WC_CORE_PATH ) { - envVars.WC_CORE_PATH = 'plugins/woocommerce'; -} - if ( ! process.env.WORDPRESS_PORT ) { process.env.WORDPRESS_PORT = testConfig.port; } 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/bin/e2e-test-integration.js b/packages/js/e2e-environment/bin/e2e-test-integration.js index 709e385333e..09f0c95dcf5 100755 --- a/packages/js/e2e-environment/bin/e2e-test-integration.js +++ b/packages/js/e2e-environment/bin/e2e-test-integration.js @@ -4,7 +4,7 @@ const { spawnSync } = require( 'child_process' ); const program = require( 'commander' ); const path = require( 'path' ); const fs = require( 'fs' ); -const { getAppRoot } = require( '../utils' ); +const { getAppRoot, resolveLocalE2ePath } = require( '../utils' ); const { WC_E2E_SCREENSHOTS, JEST_PUPPETEER_CONFIG, @@ -21,10 +21,7 @@ const appPath = getAppRoot(); // clear the screenshots folder before running tests. if ( WC_E2E_SCREENSHOTS ) { - const screenshotPath = path.resolve( - appPath, - 'plugins/woocommerce/tests/e2e/screenshots' - ); + const screenshotPath = resolveLocalE2ePath( 'screenshots' ); if ( fs.existsSync( screenshotPath ) ) { fs.readdirSync( screenshotPath ).forEach( ( file, index ) => { const filename = path.join( screenshotPath, file ); @@ -36,9 +33,7 @@ if ( WC_E2E_SCREENSHOTS ) { const nodeConfigDirs = [ path.resolve( __dirname, '../config' ) ]; if ( appPath ) { - nodeConfigDirs.unshift( - path.resolve( appPath, 'plugins/woocommerce/tests/e2e/config' ) - ); + nodeConfigDirs.unshift( resolveLocalE2ePath( 'config' ) ); } const testEnvVars = { @@ -55,10 +50,7 @@ if ( DEFAULT_TIMEOUT_OVERRIDE ) { if ( ! JEST_PUPPETEER_CONFIG ) { // Use local Puppeteer config if there is one. // Load test configuration file into an object. - const localJestConfigFile = path.resolve( - appPath, - 'tests/e2e/config/jest-puppeteer.config.js' - ); + const localJestConfigFile = resolveLocalE2ePath( 'config/jest-puppeteer.config.js' ); const jestConfigFile = path.resolve( __dirname, '../config/jest-puppeteer.config.js' @@ -100,10 +92,7 @@ let configPath = path.resolve( __dirname, '../config/jest.config.js' ); // Look for a Jest config in the dependent app's path. if ( appPath ) { - const appConfig = path.resolve( - appPath, - 'plugins/woocommerce/tests/e2e/config/jest.config.js' - ); + const appConfig = resolveLocalE2ePath( 'config/jest.config.js' ); if ( fs.existsSync( appConfig ) ) { configPath = appConfig; diff --git a/packages/js/e2e-environment/bin/wait-for-build.sh b/packages/js/e2e-environment/bin/wait-for-build.sh index e01f87a28f0..a3a59e61219 100755 --- a/packages/js/e2e-environment/bin/wait-for-build.sh +++ b/packages/js/e2e-environment/bin/wait-for-build.sh @@ -11,7 +11,8 @@ count=0 WP_BASE_URL=$(node utils/get-base-url.js) printf "Testing URL: $WP_BASE_URL\n\n" -while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' ${WP_BASE_URL}/?pagename=ready)" != "200" ]] +RAWDATA=$(curl -s -o /dev/null -w '%{http_code}' ${WP_BASE_URL}/?pagename=ready) +while [[ "${RAWDATA: -3}" != "200" ]] do echo "$(date) - Waiting for testing environment" @@ -23,6 +24,7 @@ do echo "$(date) - Testing environment couldn't be found" exit 1 fi + RAWDATA=$(curl -s -o /dev/null -w '%{http_code}' ${WP_BASE_URL}/?pagename=ready) done if [[ $count -gt 0 ]]; then diff --git a/packages/js/e2e-environment/bin/wc-e2e.sh b/packages/js/e2e-environment/bin/wc-e2e.sh index d5fee2dc478..11be2f572bb 100755 --- a/packages/js/e2e-environment/bin/wc-e2e.sh +++ b/packages/js/e2e-environment/bin/wc-e2e.sh @@ -33,6 +33,18 @@ SCRIPTPATH=$(dirname "$0") REALPATH=$(readlink "$0") cd "$SCRIPTPATH/$(dirname "$REALPATH")/.." +# Set a flag to distinguish between the development repo and npm package +DEV_PATH=$(echo $0 | rev | cut -f4 -d/ | rev) +if [ "$DEV_PATH" != "node_modules" ]; then + export WC_E2E_WOOCOMMERCE_DEV='true' + export WC_E2E_FOLDER='plugins/woocommerce' +else + export WC_E2E_WOOCOMMERCE_DEV='' + if [ -z $WC_E2E_FOLDER ]; then + export WC_E2E_FOLDER='' + fi +fi + # Run scripts case $1 in 'docker:up') diff --git a/packages/js/e2e-environment/builtin.md b/packages/js/e2e-environment/builtin.md index 80ab9064bc7..2b91b80bd98 100644 --- a/packages/js/e2e-environment/builtin.md +++ b/packages/js/e2e-environment/builtin.md @@ -119,16 +119,29 @@ You can override these in `/tests/e2e/config/default.json`. ### Folder Mapping -The built in container defaults to mapping the root folder of the repository to a folder in the `plugins` folder. For example `woocommerce` is mapped to `/var/www/html/wp-content/plugins/woocommerce`. Use the `WC_E2E_FOLDER_MAPPING` environment variable to override this mapping. +The built in container defaults to mapping the root folder of the repository to a folder in the `plugins` folder. Use the environment variables `WC_E2E_FOLDER` and `WC_E2E_FOLDER_MAPPING` to override this mapping. The `WC_E2E_FOLDER` is a path relative to the root of the project. For example, in the `woocommerce` repository this mapping is: + +- `WC_E2E_FOLDER=plugins/woocommerce` +- `WC_E2E_FOLDER_MAPPING=/var/www/html/wp-content/plugins/woocommerce` + +Other repository examples: - Storefront Theme - ```WC_E2E_FOLDER_MAPPING=/var/www/html/wp-content/themes/storefront npx wc-e2e docker:up``` - Site Project - ```WC_E2E_FOLDER_MAPPING=/var/www/html/wp-content npx wc-e2e docker:up``` 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..c23e27df553 --- /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": "Fixes an existing bug", + "add": "Adds functionality", + "update": "Update existing functionality", + "dev": "Development related task", + "tweak": "A minor adjustment to the codebase", + "performance": "Address performance issues", + "enhancement": "Improve existing functionality" + }, + "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/config/jest-puppeteer.config.js b/packages/js/e2e-environment/config/jest-puppeteer.config.js index 0966adb1ca1..c00f69b4e47 100644 --- a/packages/js/e2e-environment/config/jest-puppeteer.config.js +++ b/packages/js/e2e-environment/config/jest-puppeteer.config.js @@ -1,28 +1,46 @@ /** @format */ -const { jestPuppeteerConfig } = require( '@automattic/puppeteer-utils' ); +/** + * For a detailed explanation of configuration properties, visit: + * https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#puppeteerlaunchoptions + */ +const { CI, E2E_DEBUG, PUPPETEER_SLOWMO, E2E_EXE_PATH } = process.env; +let executablePath = ''; +let dumpio = false; let puppeteerConfig; + +if ( ! CI && E2E_EXE_PATH !== '' ) { + executablePath = E2E_EXE_PATH; +} + +if ( E2E_DEBUG ) { + dumpio = true; +} +const jestPuppeteerLaunch = { + // Required for the logged out and logged in tests so they don't share app state/token. + browserContext: 'incognito', + defaultViewport: { + width: 1280, + height: 800, + }, +}; + if ( 'no' == global.process.env.node_config_dev ) { puppeteerConfig = { - launch: { - // Required for the logged out and logged in tests so they don't share app state/token. - browserContext: 'incognito', - }, + launch: jestPuppeteerLaunch, }; } else { puppeteerConfig = { launch: { - ...jestPuppeteerConfig.launch, - slowMo: process.env.PUPPETEER_SLOWMO ? process.env.PUPPETEER_SLOWMO : 50, + ...jestPuppeteerLaunch, + executablePath, + dumpio, + slowMo: PUPPETEER_SLOWMO ? PUPPETEER_SLOWMO : 50, headless: false, ignoreHTTPSErrors: true, args: [ '--window-size=1920,1080', '--user-agent=chrome' ], devtools: true, - defaultViewport: { - width: 1280, - height: 800, - }, }, }; } diff --git a/packages/js/e2e-environment/config/jest.config.js b/packages/js/e2e-environment/config/jest.config.js index bdb0493cf4f..c0505439b60 100644 --- a/packages/js/e2e-environment/config/jest.config.js +++ b/packages/js/e2e-environment/config/jest.config.js @@ -1,7 +1,6 @@ /** * External Dependencies */ -const { jestConfig } = require( '@automattic/puppeteer-utils' ); const { WC_E2E_SCREENSHOTS } = process.env; const path = require( 'path' ); const fs = require( 'fs' ); @@ -9,7 +8,7 @@ const fs = require( 'fs' ); /** * Internal Dependencies */ -const { getAppRoot } = require( '../utils' ); +const { resolveLocalE2ePath } = require( '../utils' ); const failureSetup = []; if ( WC_E2E_SCREENSHOTS ) { @@ -23,19 +22,24 @@ const setupFilesAfterEnv = [ 'expect-puppeteer', ]; -const appPath = getAppRoot(); -const localJestSetupFile = path.resolve( - appPath, - 'plugins/woocommerce/tests/e2e/config/jest.setup.js' -); +const localJestSetupFile = resolveLocalE2ePath( 'config/jest.setup.js' ); +const moduleNameMap = resolveLocalE2ePath( '$1' ); +const testSpecs = resolveLocalE2ePath( 'specs' ); + if ( fs.existsSync( localJestSetupFile ) ) { setupFilesAfterEnv.push( localJestSetupFile ); } const combinedConfig = { - ...jestConfig, + preset: 'jest-puppeteer', + clearMocks: true, + moduleFileExtensions: [ 'js' ], + testMatch: [ + '**/*.(test|spec).js', + '*.(test|spec).js' + ], moduleNameMapper: { - '@woocommerce/e2e/tests/(.*)': appPath + 'tests/e2e/$1', + '@woocommerce/e2e/tests/(.*)': moduleNameMap, }, setupFiles: [ '/config/env.setup.js' ], @@ -49,10 +53,9 @@ const combinedConfig = { testTimeout: parseInt( global.process.env.jest_test_timeout ), transformIgnorePatterns: [ - ...jestConfig.transformIgnorePatterns, 'node_modules/(?!(woocommerce)/)', ], - roots: [ appPath + 'tests/e2e/specs' ], + roots: [ testSpecs ], }; if ( process.env.jest_test_spec ) { diff --git a/packages/js/e2e-environment/docker-compose.yaml b/packages/js/e2e-environment/docker-compose.yaml index 52129ddf746..db7f1c91049 100644 --- a/packages/js/e2e-environment/docker-compose.yaml +++ b/packages/js/e2e-environment/docker-compose.yaml @@ -35,7 +35,7 @@ services: WORDPRESS_DEBUG: 1 volumes: - wordpress:/var/www/html - - "../../../${WC_CORE_PATH}:${WC_E2E_FOLDER_MAPPING}" + - "../../../${WC_E2E_FOLDER}:${WC_E2E_FOLDER_MAPPING}" wordpress-cli: container_name: "${APP_NAME}_wordpress-cli" @@ -60,7 +60,7 @@ services: volumes: - wordpress:/var/www/html - - "../../../plugins/woocommerce:${WC_E2E_FOLDER_MAPPING}" + - "../../../${WC_E2E_FOLDER}:${WC_E2E_FOLDER_MAPPING}" volumes: db: 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-environment/src/setup/jest.setup.js b/packages/js/e2e-environment/src/setup/jest.setup.js index 3a88c83a653..2481a9b5771 100644 --- a/packages/js/e2e-environment/src/setup/jest.setup.js +++ b/packages/js/e2e-environment/src/setup/jest.setup.js @@ -38,7 +38,10 @@ const OBSERVED_CONSOLE_MESSAGE_TYPES = { async function setupBrowser() { await clearLocalStorage(); - await setBrowserViewport( 'large' ); + await setBrowserViewport( { + width: 1280, + height: 800, + }); } /** diff --git a/packages/js/e2e-environment/utils/index.js b/packages/js/e2e-environment/utils/index.js index 3a3e220c88c..baf54dc1b82 100644 --- a/packages/js/e2e-environment/utils/index.js +++ b/packages/js/e2e-environment/utils/index.js @@ -1,6 +1,6 @@ const getAppRoot = require( './app-root' ); const { getAppName, getAppBase } = require( './app-name' ); -const { getTestConfig, getAdminConfig } = require( './test-config' ); +const { getTestConfig, getAdminConfig, resolveLocalE2ePath } = require( './test-config' ); const { getRemotePluginZip, getLatestReleaseZipUrl } = require('./get-plugin-zip'); const takeScreenshotFor = require( './take-screenshot' ); const updateReadyPageStatus = require('./update-ready-page'); @@ -12,6 +12,7 @@ module.exports = { getAppName, getTestConfig, getAdminConfig, + resolveLocalE2ePath, getRemotePluginZip, getLatestReleaseZipUrl, takeScreenshotFor, diff --git a/packages/js/e2e-environment/utils/take-screenshot.js b/packages/js/e2e-environment/utils/take-screenshot.js index dfe9b500e70..b76db7c2e4c 100644 --- a/packages/js/e2e-environment/utils/take-screenshot.js +++ b/packages/js/e2e-environment/utils/take-screenshot.js @@ -1,6 +1,6 @@ const path = require( 'path' ); const mkdirp = require( 'mkdirp' ); -const getAppRoot = require( './app-root' ); +const { resolveLocalE2ePath } = require( './test-config' ); /** * Take a screenshot if browser context exists. @@ -10,11 +10,7 @@ const getAppRoot = require( './app-root' ); */ const takeScreenshotFor = async ( message ) => { const title = message.replace( /\.$/, '' ); - const appPath = getAppRoot(); - const savePath = path.resolve( - appPath, - 'plugins/woocommerce/tests/e2e/screenshots' - ); + const savePath = resolveLocalE2ePath( 'screenshots' ); const filePath = path.join( savePath, `${ title }.png`.replace( /[^a-z0-9.-]+/gi, '-' ) diff --git a/packages/js/e2e-environment/utils/test-config.js b/packages/js/e2e-environment/utils/test-config.js index 0f423db30d9..2f4f187e5c3 100644 --- a/packages/js/e2e-environment/utils/test-config.js +++ b/packages/js/e2e-environment/utils/test-config.js @@ -2,12 +2,27 @@ const path = require( 'path' ); const fs = require( 'fs' ); const getAppRoot = require( './app-root' ); -// Copy local test configuration file if it exists. const appPath = getAppRoot(); -const localTestConfigFile = path.resolve( - appPath, - 'plugins/woocommerce/tests/e2e/config/default.json' -); + +/** + * Resolve a local E2E file. + * + * @param {string} filename Filename to append to the path. + * @return {string} + */ +const resolveLocalE2ePath = ( filename = '' ) => { + const { WC_E2E_FOLDER } = process.env; + const localPath = `${WC_E2E_FOLDER}/tests/e2e/${filename}`; + const resolvedPath = path.resolve( + appPath, + localPath.indexOf( '/' ) == 0 ? localPath.slice( 1 ) : localPath + ); + + return resolvedPath; +} + +// Copy local test configuration file if it exists. +const localTestConfigFile = resolveLocalE2ePath( 'config/default.json' ); const defaultConfigFile = path.resolve( __dirname, '../config/default/default.json' @@ -78,4 +93,5 @@ const getAdminConfig = () => { module.exports = { getTestConfig, getAdminConfig, + resolveLocalE2ePath, }; 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..2306f34425d 100644 --- a/packages/js/e2e-utils/CHANGELOG.md +++ b/packages/js/e2e-utils/CHANGELOG.md @@ -7,6 +7,14 @@ - 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()` +- `shopper.logout()` to log out the shopper account # 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..b6b9fee51ad 100644 --- a/packages/js/e2e-utils/README.md +++ b/packages/js/e2e-utils/README.md @@ -129,6 +129,7 @@ This package provides support for enabling retries in tests: | `goToProduct` | `productId` | Go to a single product in the shop | | `goToShop` | | Go to the shop page | | `login` | | Log in as the shopper | +| `logout` | | Log out of the shopper account | | `placeOrder` | | Place an order from the checkout page | | `productIsInCheckout` | `productTitle, quantity, total, cartSubtotal` | Verify product is in cart on checkout page | | `removeFromCart` | `productIdOrTitle` | Remove a product from the cart on the cart page | @@ -142,22 +143,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 +234,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..1c2ac52373d --- /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": "Fixes an existing bug", + "add": "Adds functionality", + "update": "Update existing functionality", + "dev": "Development related task", + "tweak": "A minor adjustment to the codebase", + "performance": "Address performance issues", + "enhancement": "Improve existing functionality" + }, + "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..43b2d77d749 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": { - "@wordpress/deprecated": "^2.10.0", + "@automattic/puppeteer-utils": "github:Automattic/puppeteer-utils#0f3ec50", + "@wordpress/deprecated": "^3.2.3", "@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..31738064a1a 100644 --- a/packages/js/e2e-utils/src/components.js +++ b/packages/js/e2e-utils/src/components.js @@ -190,16 +190,23 @@ const completeOnboardingWizard = async () => { /** * Create simple product. * - * @param productTitle - Defaults to Simple Product. Customizable title. - * @param productPrice - Defaults to $9.99. Customizable pricing. + * @param {string} productTitle Defaults to Simple Product. Customizable title. + * @param {string} productPrice Defaults to $9.99. Customizable pricing. + * @param {Object} additionalProps Defaults to nothing. Additional product properties. */ -const createSimpleProduct = async ( productTitle = simpleProductName, productPrice = simpleProductPrice ) => { - const product = await factories.products.simple.create( { +const createSimpleProduct = async ( + productTitle = simpleProductName, + productPrice = simpleProductPrice, + additionalProps = {} +) => { + const newProduct = { name: productTitle, - regularPrice: productPrice - } ); + regularPrice: productPrice, + ...additionalProps, + }; + const product = await factories.products.simple.create( newProduct ); return product.id; -} ; +}; /** * Create simple product with categories @@ -335,21 +342,29 @@ const createGroupedProduct = async (groupedProduct = defaultGroupedProduct) => { */ const createOrder = async ( orderOptions = {} ) => { const newOrder = { - ...( orderOptions.status ) && { status: orderOptions.status }, - ...( orderOptions.customerId ) && { customer_id: orderOptions.customerId }, - ...( orderOptions.customerBilling ) && { billing: orderOptions.customerBilling }, - ...( orderOptions.customerShipping ) && { shipping: orderOptions.customerShipping }, - ...( orderOptions.productId ) && { line_items: [ - { product_id: orderOptions.productId }, - ] - }, + ...( orderOptions.status && { status: orderOptions.status } ), + ...( orderOptions.customerId && { + customer_id: orderOptions.customerId, + } ), + ...( orderOptions.customerBilling && { + billing: orderOptions.customerBilling, + } ), + ...( orderOptions.customerShipping && { + shipping: orderOptions.customerShipping, + } ), + ...( orderOptions.productId && { + line_items: [ { product_id: orderOptions.productId } ], + } ), + ...( orderOptions.lineItems && { + line_items: orderOptions.lineItems, + } ), }; const repository = Order.restRepository( client ); const order = await repository.create( newOrder ); return order.id; -} +}; /** * Create a basic order with the provided order status. diff --git a/packages/js/e2e-utils/src/flows/shopper.js b/packages/js/e2e-utils/src/flows/shopper.js index 9e80a63be91..d172eb32d08 100644 --- a/packages/js/e2e-utils/src/flows/shopper.js +++ b/packages/js/e2e-utils/src/flows/shopper.js @@ -24,7 +24,7 @@ const { SHOP_PRODUCT_PAGE } = require( './constants' ); -const { uiUnblocked } = require( '../page-utils' ); +const { uiUnblocked, clickAndWaitForSelector } = require( '../page-utils' ); const gotoMyAccount = async () => { await page.goto( SHOP_MY_ACCOUNT_PAGE, { @@ -235,6 +235,13 @@ const shopper = { page.click( 'button[name="login"]' ), ] ); }, + logout: async () => { + await gotoMyAccount(); + + await expect( page.title() ).resolves.toMatch( 'My account' ); + await page.click( '.woocommerce-MyAccount-navigation-link--customer-logout a' ); + await page.waitForNavigation( { waitUntil: 'networkidle0' } ); + }, }; module.exports = shopper; 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..a1b101778ef 100644 --- a/packages/js/e2e-utils/src/page-utils.js +++ b/packages/js/e2e-utils/src/page-utils.js @@ -220,11 +220,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 +234,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 +255,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 +278,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 +296,42 @@ 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 + } + ); +}; +/** + * Waits for selector to be present in DOM. + * Throws a `TimeoutError` if element was not found after 30 sec. + * Behavior can be modified with @param options. Possible keys: `visible`, `hidden`, `timeout`. + * More details at: https://pptr.dev/#?product=Puppeteer&show=api-pagewaitforselectorselector-options + * + * @param {Puppeteer.Page} page Puppeteer representation of the page. + * @param {string} selector CSS selector of the element + * @param {Object} options Custom options to modify function behavior. + */ +export async function waitForSelector( page, selector, options = {} ) { + // set up default options + const defaultOptions = { timeout: 30000, logHTML: false }; + options = Object.assign( defaultOptions, options ); + + const element = await page.waitForSelector( selector, options ); + return element; +} diff --git a/plugins/woocommerce/.distignore b/plugins/woocommerce/.distignore index 64c332f0cbb..7e7886d4f94 100644 --- a/plugins/woocommerce/.distignore +++ b/plugins/woocommerce/.distignore @@ -5,12 +5,12 @@ *.zip /bin/ /build/ +/changelog/ /node_modules/ /tests/ babel.config.js changelog.txt composer.* -tsconfig.* contributors.html docker-compose.yaml Dockerfile @@ -22,6 +22,8 @@ packages/woocommerce-admin/docs phpcs.xml phpunit.xml phpunit.xml.dist +project.json README.md renovate.json +tsconfig.* webpack.config.js diff --git a/plugins/woocommerce/.gitignore b/plugins/woocommerce/.gitignore index 841fe64ce6e..65ccaf64123 100644 --- a/plugins/woocommerce/.gitignore +++ b/plugins/woocommerce/.gitignore @@ -1,37 +1,19 @@ # Editors -project.xml -project.properties /nbproject/private/ -.buildpath -.project -.settings* -.idea -.vscode -.eslintcache -*.sublime-project -*.sublime-workspace -.sublimelinterrc -*.swp # Grunt -node_modules/ none # Sass .sass-cache/ -# Compiled CSS +# All CSS +/assets/css/** /assets/css/*.css -/assets/css/photoswipe/**/*.min.css -# Minified JS -/assets/js/**/*.min.js - -# OS X metadata -.DS_Store - -# Windows junk -Thumbs.db +# All JS +/assets/js/** +/assets/js/*.js # Behat/CLI Tests tests/cli/installer @@ -46,19 +28,16 @@ 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 +# TypeScript files +tsconfig.tsbuildinfo + # Composer /vendor/ /bin/composer/**/vendor/ @@ -73,12 +52,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/Gruntfile.js b/plugins/woocommerce/Gruntfile.js deleted file mode 100644 index dc04e689442..00000000000 --- a/plugins/woocommerce/Gruntfile.js +++ /dev/null @@ -1,231 +0,0 @@ -module.exports = function( grunt ) { - 'use strict'; - var sass = require( 'node-sass' ); - - grunt.initConfig({ - - // Setting folder templates. - dirs: { - css: 'assets/css', - fonts: 'assets/fonts', - images: 'assets/images', - js: 'assets/js', - php: 'includes' - }, - - // JavaScript linting with ESLint. - eslint: { - src: [ - '<%= dirs.js %>/admin/*.js', - '!<%= dirs.js %>/admin/*.min.js', - '<%= dirs.js %>/frontend/*.js', - '!<%= dirs.js %>/frontend/*.min.js' - ] - }, - - // Sass linting with Stylelint. - stylelint: { - options: { - configFile: '.stylelintrc' - }, - all: [ - '<%= dirs.css %>/*.scss', - '!<%= dirs.css %>/select2.scss' - ] - }, - - // Minify .js files. - uglify: { - options: { - ie8: true, - parse: { - strict: false - }, - output: { - comments : /@license|@preserve|^!/ - } - }, - js_assets: { - files: [{ - expand: true, - cwd: '<%= dirs.js %>/', - src: [ - '**/*.js', - '!**/*.min.js' - ], - extDot: 'last', - dest: '<%= dirs.js %>', - ext: '.min.js' - }] - } - }, - - // Compile all .scss files. - sass: { - compile: { - options: { - implementation: sass, - sourceMap: 'none' - }, - files: [{ - expand: true, - cwd: '<%= dirs.css %>/', - src: ['*.scss'], - dest: '<%= dirs.css %>/', - ext: '.css' - }] - } - }, - - // Generate RTL .css files. - rtlcss: { - woocommerce: { - expand: true, - cwd: '<%= dirs.css %>', - src: [ - '*.css', - '!select2.css', - '!*-rtl.css' - ], - dest: '<%= dirs.css %>/', - ext: '-rtl.css' - } - }, - - // Minify all .css files. - cssmin: { - minify: { - files: [ - { - expand: true, - cwd: '<%= dirs.css %>/', - src: ['*.css'], - dest: '<%= dirs.css %>/', - ext: '.css' - }, - { - expand: true, - cwd: '<%= dirs.css %>/photoswipe/', - src: ['*.css', '!*.min.css'], - dest: '<%= dirs.css %>/photoswipe/', - ext: '.min.css' - }, - { - expand: true, - cwd: '<%= dirs.css %>/photoswipe/default-skin/', - src: ['*.css', '!*.min.css'], - dest: '<%= dirs.css %>/photoswipe/default-skin/', - ext: '.min.css' - } - ] - } - }, - - // Concatenate select2.css onto the admin.css files. - concat: { - admin: { - files: { - '<%= dirs.css %>/admin.css' : ['<%= dirs.css %>/select2.css', '<%= dirs.css %>/admin.css'], - '<%= dirs.css %>/admin-rtl.css' : ['<%= dirs.css %>/select2.css', '<%= dirs.css %>/admin-rtl.css'] - } - } - }, - - // Watch changes for assets. - watch: { - css: { - files: ['<%= dirs.css %>/*.scss'], - tasks: ['sass', 'rtlcss', 'postcss', 'cssmin', 'concat'] - }, - js: { - files: [ - 'GruntFile.js', - '<%= dirs.js %>/**/*.js', - '!<%= dirs.js %>/**/*.min.js' - ], - tasks: ['eslint','newer:uglify'] - } - }, - - // PHP Code Sniffer. - phpcs: { - options: { - bin: 'vendor/bin/phpcs' - }, - dist: { - src: [ - '**/*.php', // Include all php files. - '!includes/api/legacy/**', - '!includes/libraries/**', - '!node_modules/**', - '!tests/cli/**', - '!tmp/**', - '!vendor/**' - ] - } - }, - - // Autoprefixer. - postcss: { - options: { - processors: [ - require( 'autoprefixer' ) - ] - }, - dist: { - src: [ - '<%= dirs.css %>/*.css' - ] - } - } - }); - - // Load NPM tasks to be used here. - grunt.loadNpmTasks( 'grunt-sass' ); - grunt.loadNpmTasks( 'grunt-phpcs' ); - grunt.loadNpmTasks( 'grunt-rtlcss' ); - grunt.loadNpmTasks( 'grunt-postcss' ); - grunt.loadNpmTasks( 'grunt-stylelint' ); - grunt.loadNpmTasks( 'gruntify-eslint' ); - grunt.loadNpmTasks( 'grunt-contrib-uglify' ); - grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); - grunt.loadNpmTasks( 'grunt-contrib-concat' ); - grunt.loadNpmTasks( 'grunt-contrib-copy' ); - grunt.loadNpmTasks( 'grunt-contrib-watch' ); - grunt.loadNpmTasks( 'grunt-contrib-clean' ); - grunt.loadNpmTasks( 'grunt-newer' ); - - // Register tasks. - grunt.registerTask( 'default', [ - 'js', - 'css' - ]); - - grunt.registerTask( 'js', [ - 'eslint', - 'uglify:js_assets' - ]); - - grunt.registerTask( 'css', [ - 'sass', - 'rtlcss', - 'postcss', - 'cssmin', - 'concat' - ]); - - grunt.registerTask( 'assets', [ - 'js', - 'css' - ]); - - grunt.registerTask( 'e2e-build', [ - 'uglify:js_assets', - 'css' - ]); - - // Only an alias to 'default' task. - grunt.registerTask( 'dev', [ - 'default' - ]); -}; 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/.gitkeep b/plugins/woocommerce/assets/css/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d diff --git a/plugins/woocommerce/assets/js/.gitkeep b/plugins/woocommerce/assets/js/.gitkeep new file mode 100644 index 00000000000..e69de29bb2d 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..9da39549075 100644 --- a/plugins/woocommerce/bin/composer/mozart/composer.lock +++ b/plugins/woocommerce/bin/composer/mozart/composer.lock @@ -33,7 +33,6 @@ "squizlabs/php_codesniffer": "^3.5", "vimeo/psalm": "^4.4" }, - "default-branch": true, "bin": [ "bin/mozart" ], @@ -54,10 +53,6 @@ } ], "description": "Composes all dependencies as a package inside a WordPress plugin", - "support": { - "issues": "https://github.com/coenjacobs/mozart/issues", - "source": "https://github.com/coenjacobs/mozart/tree/master" - }, "funding": [ { "url": "https://github.com/coenjacobs", @@ -68,16 +63,16 @@ }, { "name": "league/flysystem", - "version": "1.1.5", + "version": "1.1.8", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea" + "reference": "c995bb0c23c58c9813d081f9523c9b7bb496698e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/18634df356bfd4119fe3d6156bdb990c414c14ea", - "reference": "18634df356bfd4119fe3d6156bdb990c414c14ea", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/c995bb0c23c58c9813d081f9523c9b7bb496698e", + "reference": "c995bb0c23c58c9813d081f9523c9b7bb496698e", "shasum": "" }, "require": { @@ -148,30 +143,26 @@ "sftp", "storage" ], - "support": { - "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.5" - }, "funding": [ { "url": "https://offset.earth/frankdejonge", "type": "other" } ], - "time": "2021-08-17T13:49:42+00:00" + "time": "2021-11-28T21:50:23+00:00" }, { "name": "league/mime-type-detection", - "version": "1.8.0", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/thephpleague/mime-type-detection.git", - "reference": "b38b25d7b372e9fddb00335400467b223349fd7e" + "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/b38b25d7b372e9fddb00335400467b223349fd7e", - "reference": "b38b25d7b372e9fddb00335400467b223349fd7e", + "url": "https://api.github.com/repos/thephpleague/mime-type-detection/zipball/aa70e813a6ad3d1558fc927863d47309b4c23e69", + "reference": "aa70e813a6ad3d1558fc927863d47309b4c23e69", "shasum": "" }, "require": { @@ -179,7 +170,7 @@ "php": "^7.2 || ^8.0" }, "require-dev": { - "friendsofphp/php-cs-fixer": "^2.18", + "friendsofphp/php-cs-fixer": "^3.2", "phpstan/phpstan": "^0.12.68", "phpunit/phpunit": "^8.5.8 || ^9.3" }, @@ -200,10 +191,6 @@ } ], "description": "Mime-type detection for Flysystem", - "support": { - "issues": "https://github.com/thephpleague/mime-type-detection/issues", - "source": "https://github.com/thephpleague/mime-type-detection/tree/1.8.0" - }, "funding": [ { "url": "https://github.com/frankdejonge", @@ -214,7 +201,7 @@ "type": "tidelift" } ], - "time": "2021-09-25T08:23:19+00:00" + "time": "2021-11-21T11:48:40+00:00" }, { "name": "psr/container", @@ -258,34 +245,30 @@ "container-interop", "psr" ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/1.1.1" - }, "time": "2021-03-05T17:36:06+00:00" }, { "name": "symfony/console", - "version": "v5.3.7", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a" + "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/8b1008344647462ae6ec57559da166c2bfa5e16a", - "reference": "8b1008344647462ae6ec57559da166c2bfa5e16a", + "url": "https://api.github.com/repos/symfony/console/zipball/ec3661faca1d110d6c307e124b44f99ac54179e3", + "reference": "ec3661faca1d110d6c307e124b44f99ac54179e3", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "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" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { "psr/log": ">=3", @@ -300,12 +283,12 @@ }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "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", @@ -344,9 +327,6 @@ "console", "terminal" ], - "support": { - "source": "https://github.com/symfony/console/tree/v5.3.7" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -361,20 +341,20 @@ "type": "tidelift" } ], - "time": "2021-08-25T20:02:16+00:00" + "time": "2021-11-29T15:30:56+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627" + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/5f38c8804a9e97d23e0c8d63341088cd8a22d627", - "reference": "5f38c8804a9e97d23e0c8d63341088cd8a22d627", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", "shasum": "" }, "require": { @@ -383,7 +363,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -411,9 +391,6 @@ ], "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -428,24 +405,25 @@ "type": "tidelift" } ], - "time": "2021-03-23T23:28:01+00:00" + "time": "2021-07-12T14:48:14+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/d2f29dac98e96a98be467627bd49c2efb1bc2590", + "reference": "d2f29dac98e96a98be467627bd49c2efb1bc2590", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -473,9 +451,6 @@ ], "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -490,7 +465,7 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" + "time": "2021-11-28T15:25:38+00:00" }, { "name": "symfony/polyfill-ctype", @@ -552,9 +527,6 @@ "polyfill", "portable" ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -633,9 +605,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.23.1" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -717,9 +686,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -797,9 +763,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.23.1" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -876,9 +839,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.23.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -959,9 +919,6 @@ "portable", "shim" ], - "support": { - "source": "https://github.com/symfony/polyfill-php80/tree/v1.23.1" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -980,21 +937,25 @@ }, { "name": "symfony/service-contracts", - "version": "v2.4.0", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb" + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", - "reference": "f040a30e04b57fbcc9c6cbcf4dbaa96bd318b9bb", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1" + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1" + }, + "conflict": { + "ext-psr": "<1.1|>=2" }, "suggest": { "symfony/service-implementation": "" @@ -1002,7 +963,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.4-dev" + "dev-main": "2.5-dev" }, "thanks": { "name": "symfony/contracts", @@ -1038,9 +999,6 @@ "interoperability", "standards" ], - "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.4.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1055,20 +1013,20 @@ "type": "tidelift" } ], - "time": "2021-04-01T10:43:52+00:00" + "time": "2021-11-04T16:48:04+00:00" }, { "name": "symfony/string", - "version": "v5.3.7", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5" + "reference": "9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/8d224396e28d30f81969f083a58763b8b9ceb0a5", - "reference": "8d224396e28d30f81969f083a58763b8b9ceb0a5", + "url": "https://api.github.com/repos/symfony/string/zipball/9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d", + "reference": "9ffaaba53c61ba75a3c7a3a779051d1e9ec4fd2d", "shasum": "" }, "require": { @@ -1079,11 +1037,14 @@ "symfony/polyfill-mbstring": "~1.0", "symfony/polyfill-php80": "~1.15" }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", + "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" + "symfony/var-exporter": "^4.4|^5.0|^6.0" }, "type": "library", "autoload": { @@ -1121,9 +1082,6 @@ "utf-8", "utf8" ], - "support": { - "source": "https://github.com/symfony/string/tree/v5.3.7" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1138,7 +1096,7 @@ "type": "tidelift" } ], - "time": "2021-08-26T08:00:08+00:00" + "time": "2021-11-24T10:02:00+00:00" } ], "aliases": [], @@ -1153,5 +1111,5 @@ "platform-overrides": { "php": "7.3" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "1.1.0" } diff --git a/plugins/woocommerce/bin/composer/phpcs/composer.lock b/plugins/woocommerce/bin/composer/phpcs/composer.lock index c672998035f..e403ebd2db2 100644 --- a/plugins/woocommerce/bin/composer/phpcs/composer.lock +++ b/plugins/woocommerce/bin/composer/phpcs/composer.lock @@ -71,10 +71,6 @@ "stylecheck", "tests" ], - "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" - }, "time": "2020-12-07T18:04:37+00:00" }, { @@ -133,10 +129,6 @@ "phpcs", "standards" ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibility/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibility" - }, "time": "2019-12-27T09:44:58+00:00" }, { @@ -189,10 +181,6 @@ "polyfill", "standards" ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" - }, "time": "2021-02-15T10:24:51+00:00" }, { @@ -243,10 +231,6 @@ "standards", "wordpress" ], - "support": { - "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", - "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" - }, "time": "2021-07-21T11:09:57+00:00" }, { @@ -298,11 +282,6 @@ "phpcs", "standards" ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, "time": "2021-10-11T04:00:11+00:00" }, { @@ -343,10 +322,6 @@ "woocommerce", "wordpress" ], - "support": { - "issues": "https://github.com/woocommerce/woocommerce-sniffs/issues", - "source": "https://github.com/woocommerce/woocommerce-sniffs/tree/0.1.1" - }, "time": "2021-07-29T17:25:16+00:00" }, { @@ -393,11 +368,6 @@ "standards", "wordpress" ], - "support": { - "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", - "source": "https://github.com/WordPress/WordPress-Coding-Standards", - "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" - }, "time": "2020-05-13T23:57:56+00:00" } ], @@ -411,5 +381,5 @@ "platform-overrides": { "php": "7.0" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "1.1.0" } diff --git a/plugins/woocommerce/bin/composer/phpunit/composer.lock b/plugins/woocommerce/bin/composer/phpunit/composer.lock index b3eb88d717f..da5c88186dd 100644 --- a/plugins/woocommerce/bin/composer/phpunit/composer.lock +++ b/plugins/woocommerce/bin/composer/phpunit/composer.lock @@ -59,10 +59,6 @@ "constructor", "instantiate" ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/master" - }, "time": "2015-06-14T21:17:01+00:00" }, { @@ -108,10 +104,6 @@ "object", "object graph" ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.x" - }, "time": "2017-10-19T19:58:43+00:00" }, { @@ -167,10 +159,6 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" - }, "time": "2017-03-05T18:14:27+00:00" }, { @@ -218,10 +206,6 @@ } ], "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/master" - }, "time": "2017-03-05T17:38:23+00:00" }, { @@ -276,10 +260,6 @@ "reflection", "static analysis" ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" - }, "time": "2017-09-11T18:02:19+00:00" }, { @@ -332,10 +312,6 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x" - }, "time": "2019-12-28T18:55:12+00:00" }, { @@ -381,10 +357,6 @@ "email": "me@mikevanriel.com" } ], - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/master" - }, "time": "2017-12-30T13:23:38+00:00" }, { @@ -448,10 +420,6 @@ "spy", "stub" ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" - }, "time": "2020-03-05T15:02:03+00:00" }, { @@ -515,10 +483,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/5.3" - }, "time": "2018-04-06T15:36:58+00:00" }, { @@ -566,11 +530,6 @@ "filesystem", "iterator" ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" - }, "time": "2017-11-27T13:52:08+00:00" }, { @@ -612,10 +571,6 @@ "keywords": [ "template" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" - }, "time": "2015-06-21T13:50:34+00:00" }, { @@ -665,10 +620,6 @@ "keywords": [ "timer" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" - }, "time": "2017-02-26T11:10:40+00:00" }, { @@ -718,10 +669,6 @@ "keywords": [ "tokenizer" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" - }, "abandoned": true, "time": "2017-11-27T05:48:46+00:00" }, @@ -807,10 +754,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/6.5.14" - }, "time": "2019-02-01T05:22:47+00:00" }, { @@ -870,10 +813,6 @@ "mock", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", - "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/5.0.10" - }, "abandoned": true, "time": "2018-08-09T05:50:03+00:00" }, @@ -920,10 +859,6 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -994,10 +929,6 @@ "compare", "equality" ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/master" - }, "time": "2018-02-01T13:46:46+00:00" }, { @@ -1050,10 +981,6 @@ "keywords": [ "diff" ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" - }, "time": "2017-08-03T08:09:46+00:00" }, { @@ -1104,24 +1031,20 @@ "environment", "hhvm" ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/master" - }, "time": "2017-07-01T08:51:00+00:00" }, { "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 +1053,7 @@ }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1175,17 +1098,13 @@ "export", "exporter" ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2020-11-30T07:47:53+00:00" + "time": "2021-11-11T13:51:24+00:00" }, { "name": "sebastian/global-state", @@ -1236,10 +1155,6 @@ "keywords": [ "global state" ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" - }, "time": "2017-04-27T15:39:26+00:00" }, { @@ -1287,10 +1202,6 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -1342,10 +1253,6 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -1405,10 +1312,6 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -1457,10 +1360,6 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" - }, "time": "2015-07-28T20:34:47+00:00" }, { @@ -1504,10 +1403,6 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" - }, "time": "2016-10-03T07:35:21+00:00" }, { @@ -1570,9 +1465,6 @@ "polyfill", "portable" ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -1627,10 +1519,6 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" - }, "time": "2019-06-13T22:48:21+00:00" }, { @@ -1680,10 +1568,6 @@ "check", "validate" ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.9.1" - }, "time": "2020-07-08T17:02:28+00:00" } ], @@ -1697,5 +1581,5 @@ "platform-overrides": { "php": "7.0" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "1.1.0" } diff --git a/plugins/woocommerce/bin/composer/wp/composer.lock b/plugins/woocommerce/bin/composer/wp/composer.lock index 52f554a2577..ffa8fc9cd15 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": { @@ -67,11 +67,6 @@ "po", "translation" ], - "support": { - "email": "oom@oscarotero.com", - "issues": "https://github.com/oscarotero/Gettext/issues", - "source": "https://github.com/php-gettext/Gettext/tree/v4.8.5" - }, "funding": [ { "url": "https://paypal.me/oscarotero", @@ -86,20 +81,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": { @@ -146,10 +141,6 @@ "translations", "unicode" ], - "support": { - "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.8.1" - }, "funding": [ { "url": "https://paypal.me/mlocati", @@ -160,20 +151,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 +176,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.13.8-dev" + "dev-master": "1.13.9-dev" } }, "autoload": { @@ -205,11 +196,7 @@ } ], "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" - }, - "time": "2021-09-11T10:28:18+00:00" + "time": "2021-11-12T13:44:49+00:00" }, { "name": "mustache/mustache", @@ -255,10 +242,6 @@ "mustache", "templating" ], - "support": { - "issues": "https://github.com/bobthecow/mustache.php/issues", - "source": "https://github.com/bobthecow/mustache.php/tree/master" - }, "time": "2019-11-23T21:40:31+00:00" }, { @@ -315,10 +298,6 @@ "iri", "sockets" ], - "support": { - "issues": "https://github.com/WordPress/Requests/issues", - "source": "https://github.com/WordPress/Requests/tree/v1.8.1" - }, "time": "2021-06-04T09:56:25+00:00" }, { @@ -368,9 +347,6 @@ ], "description": "Symfony Finder Component", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/finder/tree/3.3" - }, "time": "2017-06-01T21:01:25+00:00" }, { @@ -431,10 +407,6 @@ ], "description": "Provides internationalization tools for WordPress projects.", "homepage": "https://github.com/wp-cli/i18n-command", - "support": { - "issues": "https://github.com/wp-cli/i18n-command/issues", - "source": "https://github.com/wp-cli/i18n-command/tree/v2.2.9" - }, "time": "2021-07-20T21:25:54+00:00" }, { @@ -483,9 +455,6 @@ ], "description": "A simple YAML loader/dumper class for PHP (WP-CLI fork)", "homepage": "https://github.com/mustangostang/spyc/", - "support": { - "source": "https://github.com/wp-cli/spyc/tree/autoload" - }, "time": "2017-04-25T11:26:20+00:00" }, { @@ -536,10 +505,6 @@ "cli", "console" ], - "support": { - "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.13" - }, "time": "2021-07-01T15:08:16+00:00" }, { @@ -606,11 +571,6 @@ "cli", "wordpress" ], - "support": { - "docs": "https://make.wordpress.org/cli/handbook/", - "issues": "https://github.com/wp-cli/wp-cli/issues", - "source": "https://github.com/wp-cli/wp-cli" - }, "time": "2021-05-14T13:44:51+00:00" } ], @@ -624,5 +584,5 @@ "platform-overrides": { "php": "7.0" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "1.1.0" } 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..03dcd447a10 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.4.0", + "woocommerce/woocommerce-admin": "2.9.0", + "woocommerce/woocommerce-blocks": "6.3.3" + }, + "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": "Fixes an existing bug", + "add": "Adds functionality", + "update": "Update existing functionality", + "dev": "Development related task", + "tweak": "A minor adjustment to the codebase", + "performance": "Address performance issues", + "enhancement": "Improve existing functionality" + }, + "versioning": "wordpress", + "changelog": "NEXT_CHANGELOG.md" + } + } } diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index 29ff15be7ba..9bb901cb071 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": "ec7987721f51ed5c0faf6251128ba110", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -51,9 +51,6 @@ "GPL-2.0-or-later" ], "description": "Creates a custom autoloader for a plugin or theme.", - "support": { - "source": "https://github.com/Automattic/jetpack-autoloader/tree/2.10.1" - }, "time": "2021-03-30T15:15:59+00:00" }, { @@ -85,9 +82,6 @@ "GPL-2.0-or-later" ], "description": "A wrapper for defining constants in a more testable way.", - "support": { - "source": "https://github.com/Automattic/jetpack-constants/tree/v1.5.1" - }, "time": "2020-10-28T19:00:31+00:00" }, { @@ -221,10 +215,6 @@ "zend", "zikula" ], - "support": { - "issues": "https://github.com/composer/installers/issues", - "source": "https://github.com/composer/installers/tree/v1.12.0" - }, "funding": [ { "url": "https://packagist.com", @@ -299,10 +289,6 @@ "geolocation", "maxmind" ], - "support": { - "issues": "https://github.com/maxmind/MaxMind-DB-Reader-php/issues", - "source": "https://github.com/maxmind/MaxMind-DB-Reader-php/tree/v1.6.0" - }, "time": "2019-12-19T22:59:03+00:00" }, { @@ -377,10 +363,6 @@ "email", "pre-processing" ], - "support": { - "issues": "https://github.com/MyIntervals/emogrifier/issues", - "source": "https://github.com/MyIntervals/emogrifier" - }, "time": "2019-12-26T19:37:31+00:00" }, { @@ -430,35 +412,26 @@ "container-interop", "psr" ], - "support": { - "issues": "https://github.com/php-fig/container/issues", - "source": "https://github.com/php-fig/container/tree/master" - }, "time": "2017-02-14T16:28:37+00:00" }, { "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 +445,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" @@ -487,29 +460,41 @@ ], "description": "Symfony CssSelector Component", "homepage": "https://symfony.com", - "support": { - "source": "https://github.com/symfony/css-selector/tree/master" - }, - "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", - "version": "3.3.0", + "version": "3.4.0", "source": { "type": "git", "url": "https://github.com/woocommerce/action-scheduler.git", - "reference": "5588a831cd2453ecf7d4803f3a81063e13cde93d" + "reference": "3218a33ff14b968f8cb05de9656c2efa1eeb1330" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/action-scheduler/zipball/5588a831cd2453ecf7d4803f3a81063e13cde93d", - "reference": "5588a831cd2453ecf7d4803f3a81063e13cde93d", + "url": "https://api.github.com/repos/woocommerce/action-scheduler/zipball/3218a33ff14b968f8cb05de9656c2efa1eeb1330", + "reference": "3218a33ff14b968f8cb05de9656c2efa1eeb1330", "shasum": "" }, "require-dev": { "phpunit/phpunit": "^7.5", "woocommerce/woocommerce-sniffs": "0.1.0", - "wp-cli/wp-cli": "~2.5.0" + "wp-cli/wp-cli": "~2.5.0", + "yoast/phpunit-polyfills": "^1.0" }, "type": "wordpress-plugin", "extra": { @@ -525,24 +510,20 @@ ], "description": "Action Scheduler for WordPress and WooCommerce", "homepage": "https://actionscheduler.org/", - "support": { - "issues": "https://github.com/woocommerce/action-scheduler/issues", - "source": "https://github.com/woocommerce/action-scheduler/tree/3.3.0" - }, - "time": "2021-09-15T21:08:48+00:00" + "time": "2021-10-28T17:09:12+00:00" }, { "name": "woocommerce/woocommerce-admin", - "version": "2.8.0", + "version": "2.9.0", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-admin.git", - "reference": "63b93a95db4bf788f42587a41f2378128a2adfdf" + "reference": "8040a6ac2af1b217324ae83a4137b0bfe3edbc23" }, "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/8040a6ac2af1b217324ae83a4137b0bfe3edbc23", + "reference": "8040a6ac2af1b217324ae83a4137b0bfe3edbc23", "shasum": "" }, "require": { @@ -596,24 +577,20 @@ ], "description": "A modern, javascript-driven WooCommerce Admin experience.", "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" - }, - "time": "2021-11-02T19:28:38+00:00" + "time": "2021-11-29T23:28:44+00:00" }, { "name": "woocommerce/woocommerce-blocks", - "version": "v6.1.0", + "version": "v6.3.3", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-gutenberg-products-block.git", - "reference": "8556efd69e85c01f5571d39e6581d9b8486b682f" + "reference": "38975ad6de9c6a556059c4de6e9ffc586ab82245" }, "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/38975ad6de9c6a556059c4de6e9ffc586ab82245", + "reference": "38975ad6de9c6a556059c4de6e9ffc586ab82245", "shasum": "" }, "require": { @@ -621,6 +598,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 +629,66 @@ ], "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.3" }, - "time": "2021-10-12T13:07:11+00:00" + "time": "2021-11-25T09:47:27+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.", + "time": "2021-11-02T14:06:49+00:00" + }, { "name": "bamarni/composer-bin-plugin", "version": "1.4.1", @@ -700,10 +733,6 @@ "isolation", "tool" ], - "support": { - "issues": "https://github.com/bamarni/composer-bin-plugin/issues", - "source": "https://github.com/bamarni/composer-bin-plugin/tree/master" - }, "time": "2020-05-03T08:27:20+00:00" }, { @@ -758,10 +787,6 @@ "constructor", "instantiate" ], - "support": { - "issues": "https://github.com/doctrine/instantiator/issues", - "source": "https://github.com/doctrine/instantiator/tree/master" - }, "time": "2015-06-14T21:17:01+00:00" }, { @@ -807,10 +832,6 @@ "object", "object graph" ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.x" - }, "time": "2017-10-19T19:58:43+00:00" }, { @@ -866,10 +887,6 @@ } ], "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/master" - }, "time": "2017-03-05T18:14:27+00:00" }, { @@ -917,10 +934,6 @@ } ], "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/master" - }, "time": "2017-03-05T17:38:23+00:00" }, { @@ -975,10 +988,6 @@ "reflection", "static analysis" ], - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", - "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/master" - }, "time": "2017-09-11T18:02:19+00:00" }, { @@ -1031,10 +1040,6 @@ } ], "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "support": { - "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", - "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/release/4.x" - }, "time": "2019-12-28T18:55:12+00:00" }, { @@ -1080,10 +1085,6 @@ "email": "me@mikevanriel.com" } ], - "support": { - "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/master" - }, "time": "2017-12-30T13:23:38+00:00" }, { @@ -1147,10 +1148,6 @@ "spy", "stub" ], - "support": { - "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/v1.10.3" - }, "time": "2020-03-05T15:02:03+00:00" }, { @@ -1214,10 +1211,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/5.3" - }, "time": "2018-04-06T15:36:58+00:00" }, { @@ -1265,11 +1258,6 @@ "filesystem", "iterator" ], - "support": { - "irc": "irc://irc.freenode.net/phpunit", - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/1.4.5" - }, "time": "2017-11-27T13:52:08+00:00" }, { @@ -1311,10 +1299,6 @@ "keywords": [ "template" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" - }, "time": "2015-06-21T13:50:34+00:00" }, { @@ -1364,10 +1348,6 @@ "keywords": [ "timer" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/master" - }, "time": "2017-02-26T11:10:40+00:00" }, { @@ -1417,10 +1397,6 @@ "keywords": [ "tokenizer" ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" - }, "abandoned": true, "time": "2017-11-27T05:48:46+00:00" }, @@ -1506,10 +1482,6 @@ "testing", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/6.5.14" - }, "time": "2019-02-01T05:22:47+00:00" }, { @@ -1569,13 +1541,56 @@ "mock", "xunit" ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit-mock-objects/issues", - "source": "https://github.com/sebastianbergmann/phpunit-mock-objects/tree/5.0.10" - }, "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" + ], + "time": "2021-05-03T11:20:27+00:00" + }, { "name": "sebastian/code-unit-reverse-lookup", "version": "1.0.2", @@ -1619,10 +1634,6 @@ ], "description": "Looks up which function or method a line of code belongs to", "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -1693,10 +1704,6 @@ "compare", "equality" ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/master" - }, "time": "2018-02-01T13:46:46+00:00" }, { @@ -1749,10 +1756,6 @@ "keywords": [ "diff" ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/master" - }, "time": "2017-08-03T08:09:46+00:00" }, { @@ -1803,24 +1806,20 @@ "environment", "hhvm" ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/master" - }, "time": "2017-07-01T08:51:00+00:00" }, { "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 +1828,7 @@ }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^8.5" }, "type": "library", "extra": { @@ -1874,17 +1873,13 @@ "export", "exporter" ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.3" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", "type": "github" } ], - "time": "2020-11-30T07:47:53+00:00" + "time": "2021-11-11T13:51:24+00:00" }, { "name": "sebastian/global-state", @@ -1935,10 +1930,6 @@ "keywords": [ "global state" ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/2.0.0" - }, "time": "2017-04-27T15:39:26+00:00" }, { @@ -1986,10 +1977,6 @@ ], "description": "Traverses array structures and object graphs to enumerate all referenced objects", "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -2041,10 +2028,6 @@ ], "description": "Allows reflection of object attributes, including inherited and non-public ones", "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -2104,10 +2087,6 @@ ], "description": "Provides functionality to recursively process PHP variables", "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" - }, "funding": [ { "url": "https://github.com/sebastianbergmann", @@ -2156,10 +2135,6 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/master" - }, "time": "2015-07-28T20:34:47+00:00" }, { @@ -2203,12 +2178,154 @@ ], "description": "Library that helps with managing the version number of Git-hosted PHP projects", "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" - }, "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", + "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", + "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", @@ -2269,9 +2386,6 @@ "polyfill", "portable" ], - "support": { - "source": "https://github.com/symfony/polyfill-ctype/tree/v1.19.0" - }, "funding": [ { "url": "https://symfony.com/sponsor", @@ -2288,6 +2402,141 @@ ], "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" + ], + "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", + "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", @@ -2326,10 +2575,6 @@ } ], "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/master" - }, "time": "2019-06-13T22:48:21+00:00" }, { @@ -2379,24 +2624,72 @@ "check", "validate" ], - "support": { - "issues": "https://github.com/webmozarts/assert/issues", - "source": "https://github.com/webmozarts/assert/tree/1.9.1" - }, "time": "2020-07-08T17:02:28+00:00" }, { - "name": "yoast/phpunit-polyfills", - "version": "1.0.2", + "name": "wikimedia/at-ease", + "version": "v2.0.0", "source": { "type": "git", - "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", - "reference": "1a582ab1d91e86aa450340c4d35631a85314ff9f" + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "013ac61929797839c80a111a3f1a4710d8248e7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/1a582ab1d91e86aa450340c4d35631a85314ff9f", - "reference": "1a582ab1d91e86aa450340c4d35631a85314ff9f", + "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", + "time": "2018-10-10T15:39:06+00:00" + }, + { + "name": "yoast/phpunit-polyfills", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", + "reference": "5ea3536428944955f969bc764bbe09738e151ada" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/5ea3536428944955f969bc764bbe09738e151ada", + "reference": "5ea3536428944955f969bc764bbe09738e151ada", "shasum": "" }, "require": { @@ -2440,11 +2733,7 @@ "polyfill", "testing" ], - "support": { - "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", - "source": "https://github.com/Yoast/PHPUnit-Polyfills" - }, - "time": "2021-10-03T08:40:26+00:00" + "time": "2021-11-23T01:37:03+00:00" } ], "aliases": [], @@ -2457,7 +2746,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..a0ebe7f452c 100644 --- a/plugins/woocommerce/i18n/states.php +++ b/plugins/woocommerce/i18n/states.php @@ -15,6 +15,20 @@ defined( 'ABSPATH' ) || exit; return array( 'AF' => array(), + 'AL' => array( // Albania states. + 'AL-01' => __( 'Berat', 'woocommerce' ), + 'AL-09' => __( 'Dibër', 'woocommerce' ), + 'AL-02' => __( 'Durrës', 'woocommerce' ), + 'AL-03' => __( 'Elbasan', 'woocommerce' ), + 'AL-04' => __( 'Fier', 'woocommerce' ), + 'AL-05' => __( 'Gjirokastër', 'woocommerce' ), + 'AL-06' => __( 'Korçë', 'woocommerce' ), + 'AL-07' => __( 'Kukës', 'woocommerce' ), + 'AL-08' => __( 'Lezhë', 'woocommerce' ), + 'AL-10' => __( 'Shkodër', 'woocommerce' ), + 'AL-11' => __( 'Tirana', 'woocommerce' ), + 'AL-12' => __( 'Vlorë', 'woocommerce' ), + ), 'AO' => array( // Angola states. 'BGO' => __( 'Bengo', 'woocommerce' ), 'BLU' => __( 'Benguela', 'woocommerce' ), @@ -187,15 +201,15 @@ return array( 'ZO' => __( 'Zou', 'woocommerce' ), ), 'BO' => array( // Bolivian states. - 'B' => __( 'Chuquisaca', 'woocommerce' ), - 'H' => __( 'Beni', 'woocommerce' ), - 'C' => __( 'Cochabamba', 'woocommerce' ), - 'L' => __( 'La Paz', 'woocommerce' ), - 'O' => __( 'Oruro', 'woocommerce' ), - 'N' => __( 'Pando', 'woocommerce' ), - 'P' => __( 'Potosí', 'woocommerce' ), - 'S' => __( 'Santa Cruz', 'woocommerce' ), - 'T' => __( 'Tarija', 'woocommerce' ), + 'BO-B' => __( 'Beni', 'woocommerce' ), + 'BO-H' => __( 'Chuquisaca', 'woocommerce' ), + 'BO-C' => __( 'Cochabamba', 'woocommerce' ), + 'BO-L' => __( 'La Paz', 'woocommerce' ), + 'BO-O' => __( 'Oruro', 'woocommerce' ), + 'BO-N' => __( 'Pando', 'woocommerce' ), + 'BO-P' => __( 'Potosí', 'woocommerce' ), + 'BO-S' => __( 'Santa Cruz', 'woocommerce' ), + 'BO-T' => __( 'Tarija', 'woocommerce' ), ), 'BR' => array( // Brazillian states. 'AC' => __( 'Acre', 'woocommerce' ), @@ -269,6 +283,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' ), @@ -303,6 +335,50 @@ return array( 'CN31' => __( 'Tibet / 西藏', 'woocommerce' ), 'CN32' => __( 'Xinjiang / 新疆', 'woocommerce' ), ), + 'CO' => array( // Colombia States. + 'CO-AMA' => __( 'Amazonas', 'woocommerce' ), + 'CO-ANT' => __( 'Antioquia', 'woocommerce' ), + 'CO-ARA' => __( 'Arauca', 'woocommerce' ), + 'CO-ATL' => __( 'Atlántico', 'woocommerce' ), + 'CO-BOL' => __( 'Bolívar', 'woocommerce' ), + 'CO-BOY' => __( 'Boyacá', 'woocommerce' ), + 'CO-CAL' => __( 'Caldas', 'woocommerce' ), + 'CO-CAQ' => __( 'Caquetá', 'woocommerce' ), + 'CO-CAS' => __( 'Casanare', 'woocommerce' ), + 'CO-CAU' => __( 'Cauca', 'woocommerce' ), + 'CO-CES' => __( 'Cesar', 'woocommerce' ), + 'CO-CHO' => __( 'Chocó', 'woocommerce' ), + 'CO-COR' => __( 'Córdoba', 'woocommerce' ), + 'CO-CUN' => __( 'Cundinamarca', 'woocommerce' ), + 'CO-DC' => __( 'Capital District', 'woocommerce' ), + 'CO-GUA' => __( 'Guainía', 'woocommerce' ), + 'CO-GUV' => __( 'Guaviare', 'woocommerce' ), + 'CO-HUI' => __( 'Huila', 'woocommerce' ), + 'CO-LAG' => __( 'La Guajira', 'woocommerce' ), + 'CO-MAG' => __( 'Magdalena', 'woocommerce' ), + 'CO-MET' => __( 'Meta', 'woocommerce' ), + 'CO-NAR' => __( 'Nariño', 'woocommerce' ), + 'CO-NSA' => __( 'Norte de Santander', 'woocommerce' ), + 'CO-PUT' => __( 'Putumayo', 'woocommerce' ), + 'CO-QUI' => __( 'Quindío', 'woocommerce' ), + 'CO-RIS' => __( 'Risaralda', 'woocommerce' ), + 'CO-SAN' => __( 'Santander', 'woocommerce' ), + 'CO-SAP' => __( 'San Andrés & Providencia', 'woocommerce' ), + 'CO-SUC' => __( 'Sucre', 'woocommerce' ), + 'CO-TOL' => __( 'Tolima', 'woocommerce' ), + 'CO-VAC' => __( 'Valle del Cauca', 'woocommerce' ), + 'CO-VAU' => __( 'Vaupés', 'woocommerce' ), + 'CO-VID' => __( 'Vichada', 'woocommerce' ), + ), + 'CR' => array( // Costa Rica states. + 'CR-A' => __( 'Alajuela', 'woocommerce' ), + 'CR-C' => __( 'Cartago', 'woocommerce' ), + 'CR-G' => __( 'Guanacaste', 'woocommerce' ), + 'CR-H' => __( 'Heredia', 'woocommerce' ), + 'CR-L' => __( 'Limón', 'woocommerce' ), + 'CR-P' => __( 'Puntarenas', 'woocommerce' ), + 'CR-SJ' => __( 'San José', 'woocommerce' ), + ), 'CZ' => array(), 'DE' => array(), 'DK' => array(), @@ -311,34 +387,44 @@ return array( 'DO-02' => __( 'Azua', 'woocommerce' ), 'DO-03' => __( 'Baoruco', 'woocommerce' ), 'DO-04' => __( 'Barahona', 'woocommerce' ), + 'DO-33' => __( 'Cibao Nordeste', 'woocommerce' ), + 'DO-34' => __( 'Cibao Noroeste', 'woocommerce' ), + 'DO-35' => __( 'Cibao Norte', 'woocommerce' ), + 'DO-36' => __( 'Cibao Sur', 'woocommerce' ), 'DO-05' => __( 'Dajabón', 'woocommerce' ), 'DO-06' => __( 'Duarte', 'woocommerce' ), - 'DO-07' => __( 'Elías Piña', 'woocommerce' ), 'DO-08' => __( 'El Seibo', 'woocommerce' ), + 'DO-37' => __( 'El Valle', 'woocommerce' ), + 'DO-07' => __( 'Elías Piña', 'woocommerce' ), + 'DO-38' => __( 'Enriquillo', 'woocommerce' ), 'DO-09' => __( 'Espaillat', 'woocommerce' ), + 'DO-30' => __( 'Hato Mayor', 'woocommerce' ), + 'DO-19' => __( 'Hermanas Mirabal', 'woocommerce' ), + 'DO-39' => __( 'Higüamo', 'woocommerce' ), 'DO-10' => __( 'Independencia', 'woocommerce' ), 'DO-11' => __( 'La Altagracia', 'woocommerce' ), 'DO-12' => __( 'La Romana', 'woocommerce' ), 'DO-13' => __( 'La Vega', 'woocommerce' ), 'DO-14' => __( 'María Trinidad Sánchez', 'woocommerce' ), + 'DO-28' => __( 'Monseñor Nouel', 'woocommerce' ), 'DO-15' => __( 'Monte Cristi', 'woocommerce' ), + 'DO-29' => __( 'Monte Plata', 'woocommerce' ), + 'DO-40' => __( 'Ozama', 'woocommerce' ), 'DO-16' => __( 'Pedernales', 'woocommerce' ), 'DO-17' => __( 'Peravia', 'woocommerce' ), 'DO-18' => __( 'Puerto Plata', 'woocommerce' ), - 'DO-19' => __( 'Hermanas Mirabal', 'woocommerce' ), 'DO-20' => __( 'Samaná', 'woocommerce' ), 'DO-21' => __( 'San Cristóbal', 'woocommerce' ), + 'DO-31' => __( 'San José de Ocoa', 'woocommerce' ), 'DO-22' => __( 'San Juan', 'woocommerce' ), 'DO-23' => __( 'San Pedro de Macorís', 'woocommerce' ), 'DO-24' => __( 'Sánchez Ramírez', 'woocommerce' ), 'DO-25' => __( 'Santiago', 'woocommerce' ), 'DO-26' => __( 'Santiago Rodríguez', 'woocommerce' ), - 'DO-27' => __( 'Valverde', 'woocommerce' ), - 'DO-28' => __( 'Monseñor Nouel', 'woocommerce' ), - 'DO-29' => __( 'Monte Plata', 'woocommerce' ), - 'DO-30' => __( 'Hato Mayor', 'woocommerce' ), - 'DO-31' => __( 'San José de Ocoa', 'woocommerce' ), 'DO-32' => __( 'Santo Domingo', 'woocommerce' ), + 'DO-41' => __( 'Valdesia', 'woocommerce' ), + 'DO-27' => __( 'Valverde', 'woocommerce' ), + 'DO-42' => __( 'Yuma', 'woocommerce' ), ), 'DZ' => array( 'DZ-01' => __( 'Adrar', 'woocommerce' ), @@ -391,6 +477,32 @@ return array( 'DZ-48' => __( 'Relizane', 'woocommerce' ), ), 'EE' => array(), + 'EC' => array( // Ecuador states. + 'EC-A' => __( 'Azuay', 'woocommerce' ), + 'EC-B' => __( 'Bolívar', 'woocommerce' ), + 'EC-F' => __( 'Cañar', 'woocommerce' ), + 'EC-C' => __( 'Carchi', 'woocommerce' ), + 'EC-H' => __( 'Chimborazo', 'woocommerce' ), + 'EC-X' => __( 'Cotopaxi', 'woocommerce' ), + 'EC-O' => __( 'El Oro', 'woocommerce' ), + 'EC-E' => __( 'Esmeraldas', 'woocommerce' ), + 'EC-W' => __( 'Galápagos', 'woocommerce' ), + 'EC-G' => __( 'Guayas', 'woocommerce' ), + 'EC-I' => __( 'Imbabura', 'woocommerce' ), + 'EC-L' => __( 'Loja', 'woocommerce' ), + 'EC-R' => __( 'Los Ríos', 'woocommerce' ), + 'EC-M' => __( 'Manabí', 'woocommerce' ), + 'EC-S' => __( 'Morona-Santiago', 'woocommerce' ), + 'EC-N' => __( 'Napo', 'woocommerce' ), + 'EC-D' => __( 'Orellana', 'woocommerce' ), + 'EC-Y' => __( 'Pastaza', 'woocommerce' ), + 'EC-P' => __( 'Pichincha', 'woocommerce' ), + 'EC-SE' => __( 'Santa Elena', 'woocommerce' ), + 'EC-SD' => __( 'Santo Domingo de los Tsáchilas', 'woocommerce' ), + 'EC-U' => __( 'Sucumbíos', 'woocommerce' ), + 'EC-T' => __( 'Tungurahua', 'woocommerce' ), + 'EC-Z' => __( 'Zamora-Chinchipe', 'woocommerce' ), + ), 'EG' => array( // Egypt states. 'EGALX' => __( 'Alexandria', 'woocommerce' ), 'EGASN' => __( 'Aswan', 'woocommerce' ), @@ -513,34 +625,54 @@ return array( 'M' => __( 'Crete', 'woocommerce' ), ), 'GT' => array( // Guatemalan states. - 'AV' => __( 'Alta Verapaz', 'woocommerce' ), - 'BV' => __( 'Baja Verapaz', 'woocommerce' ), - 'CM' => __( 'Chimaltenango', 'woocommerce' ), - 'CQ' => __( 'Chiquimula', 'woocommerce' ), - 'PR' => __( 'El Progreso', 'woocommerce' ), - 'ES' => __( 'Escuintla', 'woocommerce' ), - 'GU' => __( 'Guatemala', 'woocommerce' ), - 'HU' => __( 'Huehuetenango', 'woocommerce' ), - 'IZ' => __( 'Izabal', 'woocommerce' ), - 'JA' => __( 'Jalapa', 'woocommerce' ), - 'JU' => __( 'Jutiapa', 'woocommerce' ), - 'PE' => __( 'Petén', 'woocommerce' ), - 'QZ' => __( 'Quetzaltenango', 'woocommerce' ), - 'QC' => __( 'Quiché', 'woocommerce' ), - 'RE' => __( 'Retalhuleu', 'woocommerce' ), - 'SA' => __( 'Sacatepéquez', 'woocommerce' ), - 'SM' => __( 'San Marcos', 'woocommerce' ), - 'SR' => __( 'Santa Rosa', 'woocommerce' ), - 'SO' => __( 'Sololá', 'woocommerce' ), - 'SU' => __( 'Suchitepéquez', 'woocommerce' ), - 'TO' => __( 'Totonicapán', 'woocommerce' ), - 'ZA' => __( 'Zacapa', 'woocommerce' ) + 'GT-AV' => __( 'Alta Verapaz', 'woocommerce' ), + 'GT-BV' => __( 'Baja Verapaz', 'woocommerce' ), + 'GT-CM' => __( 'Chimaltenango', 'woocommerce' ), + 'GT-CQ' => __( 'Chiquimula', 'woocommerce' ), + 'GT-PR' => __( 'El Progreso', 'woocommerce' ), + 'GT-ES' => __( 'Escuintla', 'woocommerce' ), + 'GT-GU' => __( 'Guatemala', 'woocommerce' ), + 'GT-HU' => __( 'Huehuetenango', 'woocommerce' ), + 'GT-IZ' => __( 'Izabal', 'woocommerce' ), + 'GT-JA' => __( 'Jalapa', 'woocommerce' ), + 'GT-JU' => __( 'Jutiapa', 'woocommerce' ), + 'GT-PE' => __( 'Petén', 'woocommerce' ), + 'GT-QZ' => __( 'Quetzaltenango', 'woocommerce' ), + 'GT-QC' => __( 'Quiché', 'woocommerce' ), + 'GT-RE' => __( 'Retalhuleu', 'woocommerce' ), + 'GT-SA' => __( 'Sacatepéquez', 'woocommerce' ), + 'GT-SM' => __( 'San Marcos', 'woocommerce' ), + 'GT-SR' => __( 'Santa Rosa', 'woocommerce' ), + 'GT-SO' => __( 'Sololá', 'woocommerce' ), + 'GT-SU' => __( 'Suchitepéquez', 'woocommerce' ), + 'GT-TO' => __( 'Totonicapán', 'woocommerce' ), + 'GT-ZA' => __( 'Zacapa', 'woocommerce' ), ), 'HK' => array( // Hong Kong states. 'HONG KONG' => __( 'Hong Kong Island', 'woocommerce' ), 'KOWLOON' => __( 'Kowloon', 'woocommerce' ), 'NEW TERRITORIES' => __( 'New Territories', 'woocommerce' ), ), + 'HN' => array( // Honduras states. + 'HN-AT' => __( 'Atlántida', 'woocommerce' ), + 'HN-IB' => __( 'Bay Islands', 'woocommerce' ), + 'HN-CH' => __( 'Choluteca', 'woocommerce' ), + 'HN-CL' => __( 'Colón', 'woocommerce' ), + 'HN-CM' => __( 'Comayagua', 'woocommerce' ), + 'HN-CP' => __( 'Copán', 'woocommerce' ), + 'HN-CR' => __( 'Cortés', 'woocommerce' ), + 'HN-EP' => __( 'El Paraíso', 'woocommerce' ), + 'HN-FM' => __( 'Francisco Morazán', 'woocommerce' ), + 'HN-GD' => __( 'Gracias a Dios', 'woocommerce' ), + 'HN-IN' => __( 'Intibucá', 'woocommerce' ), + 'HN-LE' => __( 'Lempira', 'woocommerce' ), + 'HN-LP' => __( 'La Paz', 'woocommerce' ), + 'HN-OC' => __( 'Ocotepeque', 'woocommerce' ), + 'HN-OL' => __( 'Olancho', 'woocommerce' ), + 'HN-SB' => __( 'Santa Bárbara', 'woocommerce' ), + 'HN-VA' => __( 'Valle', 'woocommerce' ), + 'HN-YO' => __( 'Yoro', 'woocommerce' ), + ), 'HU' => array( // Hungary states. 'BK' => __( 'Bács-Kiskun', 'woocommerce' ), 'BE' => __( 'Békés', 'woocommerce' ), @@ -1150,6 +1282,25 @@ return array( 'SAG' => __( 'Sagarmatha', 'woocommerce' ), 'SET' => __( 'Seti', 'woocommerce' ), ), + 'NI' => array( // Nicaragua states + 'NI-AN' => __( 'Atlántico Norte', 'woocommerce' ), + 'NI-AS' => __( 'Atlántico Sur', 'woocommerce' ), + 'NI-BO' => __( 'Boaco', 'woocommerce' ), + 'NI-CA' => __( 'Carazo', 'woocommerce' ), + 'NI-CI' => __( 'Chinandega', 'woocommerce' ), + 'NI-CO' => __( 'Chontales', 'woocommerce' ), + 'NI-ES' => __( 'Estelí', 'woocommerce' ), + 'NI-GR' => __( 'Granada', 'woocommerce' ), + 'NI-JI' => __( 'Jinotega', 'woocommerce' ), + 'NI-LE' => __( 'León', 'woocommerce' ), + 'NI-MD' => __( 'Madriz', 'woocommerce' ), + 'NI-MN' => __( 'Managua', 'woocommerce' ), + 'NI-MS' => __( 'Masaya', 'woocommerce' ), + 'NI-MT' => __( 'Matagalpa', 'woocommerce' ), + 'NI-NS' => __( 'Nueva Segovia', 'woocommerce' ), + 'NI-RI' => __( 'Rivas', 'woocommerce' ), + 'NI-SJ' => __( 'Río San Juan', 'woocommerce' ), + ), 'NZ' => array( // New Zealand States. 'NL' => __( 'Northland', 'woocommerce' ), 'AK' => __( 'Auckland', 'woocommerce' ), @@ -1168,6 +1319,21 @@ return array( 'OT' => __( 'Otago', 'woocommerce' ), 'SL' => __( 'Southland', 'woocommerce' ), ), + 'PA' => array( // Panama states. + 'PA-1' => __( 'Bocas del Toro', 'woocommerce' ), + 'PA-2' => __( 'Coclé', 'woocommerce' ), + 'PA-3' => __( 'Colón', 'woocommerce' ), + 'PA-4' => __( 'Chiriquí', 'woocommerce' ), + 'PA-5' => __( 'Darién', 'woocommerce' ), + 'PA-6' => __( 'Herrera', 'woocommerce' ), + 'PA-7' => __( 'Los Santos', 'woocommerce' ), + 'PA-8' => __( 'Panamá', 'woocommerce' ), + 'PA-9' => __( 'Veraguas', 'woocommerce' ), + 'PA-10' => __( 'West Panamá', 'woocommerce' ), + 'PA-EM' => __( 'Emberá', 'woocommerce' ), + 'PA-KY' => __( 'Guna Yala', 'woocommerce' ), + 'PA-NB' => __( 'Ngöbe-Buglé', 'woocommerce' ), + ), 'PE' => array( // Peru states. 'CAL' => __( 'El Callao', 'woocommerce' ), 'LMA' => __( 'Municipalidad Metropolitana de Lima', 'woocommerce' ), @@ -1365,6 +1531,22 @@ return array( 'SG' => array(), 'SK' => array(), 'SI' => array(), + 'SV' => array( // El Salvador states. + 'SV-AH' => __( 'Ahuachapán', 'woocommerce' ), + 'SV-CA' => __( 'Cabañas', 'woocommerce' ), + 'SV-CH' => __( 'Chalatenango', 'woocommerce' ), + 'SV-CU' => __( 'Cuscatlán', 'woocommerce' ), + 'SV-LI' => __( 'La Libertad', 'woocommerce' ), + 'SV-MO' => __( 'Morazán', 'woocommerce' ), + 'SV-PA' => __( 'La Paz', 'woocommerce' ), + 'SV-SA' => __( 'Santa Ana', 'woocommerce' ), + 'SV-SM' => __( 'San Miguel', 'woocommerce' ), + 'SV-SO' => __( 'Sonsonate', 'woocommerce' ), + 'SV-SS' => __( 'San Salvador', 'woocommerce' ), + 'SV-SV' => __( 'San Vicente', 'woocommerce' ), + 'SV-UN' => __( 'La Unión', 'woocommerce' ), + 'SV-US' => __( 'Usulután', 'woocommerce' ), + ), 'TH' => array( // Thailand states. 'TH-37' => __( 'Amnat Charoen', 'woocommerce' ), 'TH-15' => __( 'Ang Thong', 'woocommerce' ), @@ -1818,32 +2000,53 @@ 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 - 'A' => __( 'Capital', 'woocommerce' ), - 'B' => __( 'Anzoátegui', 'woocommerce' ), - 'C' => __( 'Apure', 'woocommerce' ), - 'D' => __( 'Aragua', 'woocommerce' ), - 'E' => __( 'Barinas', 'woocommerce' ), - 'F' => __( 'Bolívar', 'woocommerce' ), - 'G' => __( 'Carabobo', 'woocommerce' ), - 'H' => __( 'Cojedes', 'woocommerce' ), - 'I' => __( 'Falcón', 'woocommerce' ), - 'J' => __( 'Guárico', 'woocommerce' ), - 'K' => __( 'Lara', 'woocommerce' ), - 'L' => __( 'Mérida', 'woocommerce' ), - 'M' => __( 'Miranda', 'woocommerce' ), - 'N' => __( 'Monagas', 'woocommerce' ), - 'O' => __( 'Nueva Esparta', 'woocommerce' ), - 'P' => __( 'Portuguesa', 'woocommerce' ), - 'R' => __( 'Sucre', 'woocommerce' ), - 'S' => __( 'Táchira', 'woocommerce' ), - 'T' => __( 'Trujillo', 'woocommerce' ), - 'U' => __( 'Yaracuy', 'woocommerce' ), - 'V' => __( 'Zulia', 'woocommerce' ), - 'W' => __( 'Federal Dependencies', 'woocommerce' ), - 'X' => __( 'Vargas', 'woocommerce' ), - 'Y' => __( 'Delta Amacuro', 'woocommerce' ), - 'Z' => __( 'Amazonas', 'woocommerce' ) + 'UY' => array( // Uruguay States. + 'UY-AR' => __( 'Artigas', 'woocommerce' ), + 'UY-CA' => __( 'Canelones', 'woocommerce' ), + 'UY-CL' => __( 'Cerro Largo', 'woocommerce' ), + 'UY-CO' => __( 'Colonia', 'woocommerce' ), + 'UY-DU' => __( 'Durazno', 'woocommerce' ), + 'UY-FS' => __( 'Flores', 'woocommerce' ), + 'UY-FD' => __( 'Florida', 'woocommerce' ), + 'UY-LA' => __( 'Lavalleja', 'woocommerce' ), + 'UY-MA' => __( 'Maldonado', 'woocommerce' ), + 'UY-MO' => __( 'Montevideo', 'woocommerce' ), + 'UY-PA' => __( 'Paysandú', 'woocommerce' ), + 'UY-RN' => __( 'Río Negro', 'woocommerce' ), + 'UY-RV' => __( 'Rivera', 'woocommerce' ), + 'UY-RO' => __( 'Rocha', 'woocommerce' ), + 'UY-SA' => __( 'Salto', 'woocommerce' ), + 'UY-SJ' => __( 'San José', 'woocommerce' ), + 'UY-SO' => __( 'Soriano', 'woocommerce' ), + 'UY-TA' => __( 'Tacuarembó', 'woocommerce' ), + 'UY-TT' => __( 'Treinta y Tres', 'woocommerce' ), + ), + 'VE' => array( // Venezuela States. + 'VE-A' => __( 'Capital', 'woocommerce' ), + 'VE-B' => __( 'Anzoátegui', 'woocommerce' ), + 'VE-C' => __( 'Apure', 'woocommerce' ), + 'VE-D' => __( 'Aragua', 'woocommerce' ), + 'VE-E' => __( 'Barinas', 'woocommerce' ), + 'VE-F' => __( 'Bolívar', 'woocommerce' ), + 'VE-G' => __( 'Carabobo', 'woocommerce' ), + 'VE-H' => __( 'Cojedes', 'woocommerce' ), + 'VE-I' => __( 'Falcón', 'woocommerce' ), + 'VE-J' => __( 'Guárico', 'woocommerce' ), + 'VE-K' => __( 'Lara', 'woocommerce' ), + 'VE-L' => __( 'Mérida', 'woocommerce' ), + 'VE-M' => __( 'Miranda', 'woocommerce' ), + 'VE-N' => __( 'Monagas', 'woocommerce' ), + 'VE-O' => __( 'Nueva Esparta', 'woocommerce' ), + 'VE-P' => __( 'Portuguesa', 'woocommerce' ), + 'VE-R' => __( 'Sucre', 'woocommerce' ), + 'VE-S' => __( 'Táchira', 'woocommerce' ), + 'VE-T' => __( 'Trujillo', 'woocommerce' ), + 'VE-U' => __( 'Yaracuy', 'woocommerce' ), + 'VE-V' => __( 'Zulia', 'woocommerce' ), + 'VE-W' => __( 'Federal Dependencies', 'woocommerce' ), + 'VE-X' => __( 'La Guaira (Vargas)', 'woocommerce' ), + 'VE-Y' => __( 'Delta Amacuro', 'woocommerce' ), + 'VE-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..9fca11d5ec8 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 ); } } } @@ -87,17 +87,57 @@ 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 ); - } + if ( is_wp_error( $raw_featured ) ) { + do_action( 'woocommerce_page_wc-addons_connection_error', $raw_featured->get_error_message() ); + + $message = self::is_ssl_error( $raw_featured->get_error_message() ) + ? __( 'We encountered an SSL error. Please ensure your site supports TLS version 1.2 or above.', 'woocommerce' ) + : $raw_featured->get_error_message(); + + self::output_empty( $message ); + + return; + } + + $response_code = (int) wp_remote_retrieve_response_code( $raw_featured ); + if ( 200 !== $response_code ) { + do_action( 'woocommerce_page_wc-addons_connection_error', $response_code ); + + /* translators: %d: HTTP error code. */ + $message = sprintf( + esc_html( + __( + 'Our request to the featured API got error code %d.', + 'woocommerce' + ) + ), + $response_code + ); + + self::output_empty( $message ); + + return; + } + + $featured = json_decode( wp_remote_retrieve_body( $raw_featured ) ); + if ( empty( $featured ) || ! is_array( $featured ) ) { + do_action( 'woocommerce_page_wc-addons_connection_error', 'Empty or malformed response' ); + $message = __( 'Our request to the featured API got a malformed response.', 'woocommerce' ); + self::output_empty( $message ); + + return; + } + + if ( $featured ) { + set_transient( 'wc_addons_featured', $featured, DAY_IN_SECONDS ); } } - if ( ! empty( $featured ) ) { - self::output_featured( $featured ); - } + self::output_featured( $featured ); + } + + public static function is_ssl_error( $error_message ) { + return false !== stripos( $error_message, 'cURL error 35' ); } /** @@ -127,7 +167,7 @@ class WC_Admin_Addons { * @param string $term Search terms. * @param string $country Store country. * - * @return object of extensions and promotions. + * @return object|WP_Error Object with products and promotions properties, or WP_Error */ public static function get_extension_data( $category, $term, $country ) { $parameters = self::build_parameter_string( $category, $term, $country ); @@ -144,9 +184,24 @@ class WC_Admin_Addons { array( 'headers' => $headers ) ); - if ( ! is_wp_error( $raw_extensions ) ) { - $addons = json_decode( wp_remote_retrieve_body( $raw_extensions ) ); + if ( is_wp_error( $raw_extensions ) ) { + do_action( 'woocommerce_page_wc-addons_connection_error', $raw_extensions->get_error_message() ); + return $raw_extensions; } + + $response_code = (int) wp_remote_retrieve_response_code( $raw_extensions ); + if ( 200 !== $response_code ) { + do_action( 'woocommerce_page_wc-addons_connection_error', $response_code ); + return new WP_Error( 'error', __( "Our request to the search API got response code $response_code.", 'woocommerce' ) ); + } + + $addons = json_decode( wp_remote_retrieve_body( $raw_extensions ) ); + + if ( ! is_object( $addons ) || ! isset( $addons->products ) ) { + do_action( 'woocommerce_page_wc-addons_connection_error', 'Empty or malformed response' ); + return new WP_Error( 'error', __( "Our request to the search API got a malformed response.", 'woocommerce' ) ); + } + return $addons; } @@ -758,7 +813,7 @@ class WC_Admin_Addons { $product_list_classes = 'products addons-products-' . $product_list_classes; ?>
-

title ); ?>

+

title ); ?>

description ) ) : ?>
@@ -891,6 +946,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 ) { @@ -907,6 +963,31 @@ class WC_Admin_Addons { +
+

+ +

+ +

+ WooCommerce.com, where you\'ll find the most popular WooCommerce extensions.', + 'woocommerce' + ) + ), + 'https://woocommerce.com/products/?utm_source=extensionsscreen&utm_medium=product&utm_campaign=connectionerror' + ); + ?> +

+
+ countries->get_base_country(); $extension_data = self::get_extension_data( $category, $term, $country ); - $addons = $extension_data->products; + $addons = is_wp_error( $extension_data ) ? $extension_data : $extension_data->products; $promotions = ! empty( $extension_data->promotions ) ? $extension_data->promotions : array(); } @@ -1056,7 +1137,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 +1241,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 +1277,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 +1336,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 +1430,15 @@ class WC_Admin_Addons { ); ?> - + + price_suffix ) ) { + $price_suffix = $mapped->price_suffix; + } + echo esc_html( $price_suffix ); + ?> +
    reviews_count ) && ! empty( $mapped->rating ) ) : ?> @@ -1303,6 +1457,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..05a291d427d 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,37 +41,41 @@ $current_section_name = __( 'Browse Categories', 'woocommerce' );
    + + + +
    - + +

    - 0 ) : ?> + 0 ) : ?>

    @@ -81,41 +87,46 @@ $current_section_name = __( 'Browse Categories', 'woocommerce' );

    - - is_wc_admin_active() ) { - foreach ( $promotions as $promotion ) { - WC_Admin_Addons::output_search_promotion_block( $promotion ); - } - } - ?> -
      - - countries->get_base_country(); - if ( 'US' === $country - && false !== strpos( - $addon->link, - 'woocommerce.com/products/usps-shipping-method' - ) - ) { - continue; - } - if ( 'CA' === $country - && false !== strpos( - $addon->link, - 'woocommerce.com/products/canada-post-shipping-method' - ) - ) { - continue; - } + + + get_error_message() ); ?> + + is_wc_admin_active() ) { + foreach ( $promotions as $promotion ) { + WC_Admin_Addons::output_search_promotion_block( $promotion ); } - ?> - - -
    + } + ?> +
      + + countries->get_base_country(); + if ( 'US' === $country + && false !== strpos( + $addon->link, + 'woocommerce.com/products/usps-shipping-method' + ) + ) { + continue; + } + if ( 'CA' === $country + && false !== strpos( + $addon->link, + 'woocommerce.com/products/canada-post-shipping-method' + ) + ) { + 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-countries.php b/plugins/woocommerce/includes/class-wc-countries.php index fd11b798b12..3ad821411c4 100644 --- a/plugins/woocommerce/includes/class-wc-countries.php +++ b/plugins/woocommerce/includes/class-wc-countries.php @@ -812,6 +812,11 @@ class WC_Countries { 'hidden' => true, ), ), + 'AL' => array( + 'state' => array( + 'label' => __( 'County', 'woocommerce' ), + ), + ), 'AO' => array( 'postcode' => array( 'required' => false, @@ -897,6 +902,9 @@ class WC_Countries { 'required' => false, 'hidden' => true, ), + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), ), 'BS' => array( 'postcode' => array( @@ -941,6 +949,14 @@ class WC_Countries { 'postcode' => array( 'required' => false, ), + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), + ), + 'CR' => array( + 'state' => array( + 'label' => __( 'Province', 'woocommerce' ), + ), ), 'CW' => array( 'postcode' => array( @@ -975,6 +991,16 @@ class WC_Countries { 'hidden' => true, ), ), + 'DO' => array( + 'state' => array( + 'label' => __( 'Province', 'woocommerce' ), + ), + ), + 'EC' => array( + 'state' => array( + 'label' => __( 'Province', 'woocommerce' ), + ), + ), 'EE' => array( 'postcode' => array( 'priority' => 65, @@ -1047,6 +1073,11 @@ class WC_Countries { 'label' => __( 'Region', 'woocommerce' ), ), ), + 'HN' => array( + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), + ), 'HU' => array( 'last_name' => array( 'class' => array( 'form-row-first' ), @@ -1214,6 +1245,11 @@ class WC_Countries { 'label' => __( 'Province', 'woocommerce' ), ), ), + 'NI' => array( + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), + ), 'NL' => array( 'postcode' => array( 'priority' => 65, @@ -1259,6 +1295,11 @@ class WC_Countries { 'required' => false, ), ), + 'PA' => array( + 'state' => array( + 'label' => __( 'Province', 'woocommerce' ), + ), + ), 'PL' => array( 'postcode' => array( 'priority' => 65, @@ -1283,6 +1324,11 @@ class WC_Countries { 'hidden' => true, ), ), + 'PY' => array( + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), + ), 'RE' => array( 'state' => array( 'required' => false, @@ -1340,6 +1386,11 @@ class WC_Countries { 'hidden' => true, ), ), + 'SV' => array( + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), + ), 'ES' => array( 'postcode' => array( 'priority' => 65, @@ -1413,6 +1464,11 @@ class WC_Countries { 'label' => __( 'State', 'woocommerce' ), ), ), + 'UY' => array( + 'state' => array( + 'label' => __( 'Department', 'woocommerce' ), + ), + ), 'GB' => array( 'postcode' => array( 'label' => __( 'Postcode', 'woocommerce' ), diff --git a/plugins/woocommerce/includes/class-wc-customer-download.php b/plugins/woocommerce/includes/class-wc-customer-download.php index 1e1a6d35323..43d5a2101af 100644 --- a/plugins/woocommerce/includes/class-wc-customer-download.php +++ b/plugins/woocommerce/includes/class-wc-customer-download.php @@ -311,14 +311,15 @@ downloads_remaining = IF( downloads_remaining = '', '', GREATEST( 0, downloads_r WHERE permission_id = %d", $this->get_id() ); - $wpdb->query( $query ); // WPCS: unprepared SQL ok. + // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( $query ); // Re-read this download from the data store to pull updated counts. $this->data_store->read( $this ); // Track download in download log. $download_log = new WC_Customer_Download_Log(); - $download_log->set_timestamp( current_time( 'timestamp', true ) ); + $download_log->set_timestamp( time() ); $download_log->set_permission_id( $this->get_id() ); if ( ! is_null( $user_id ) ) { @@ -341,9 +342,10 @@ WHERE permission_id = %d", /** * OffsetGet. * - * @param string $offset Offset. + * @param mixed $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { if ( is_callable( array( $this, "get_$offset" ) ) ) { return $this->{"get_$offset"}(); @@ -353,9 +355,10 @@ WHERE permission_id = %d", /** * OffsetSet. * - * @param string $offset Offset. - * @param mixed $value Value. + * @param mixed $offset Offset. + * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { if ( is_callable( array( $this, "set_$offset" ) ) ) { $this->{"set_$offset"}( $value ); @@ -365,8 +368,9 @@ WHERE permission_id = %d", /** * OffsetUnset * - * @param string $offset Offset. + * @param mixed $offset Offset. */ + #[\ReturnTypeWillChange] public function offsetUnset( $offset ) { if ( is_callable( array( $this, "set_$offset" ) ) ) { $this->{"set_$offset"}( '' ); @@ -376,9 +380,10 @@ WHERE permission_id = %d", /** * OffsetExists. * - * @param string $offset Offset. + * @param mixed $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { return in_array( $offset, array_keys( $this->data ), true ); } diff --git a/plugins/woocommerce/includes/class-wc-download-handler.php b/plugins/woocommerce/includes/class-wc-download-handler.php index c5241e19671..97f0961fed5 100644 --- a/plugins/woocommerce/includes/class-wc-download-handler.php +++ b/plugins/woocommerce/includes/class-wc-download-handler.php @@ -270,7 +270,7 @@ class WC_Download_Handler { ); $count = 0; - $file_path = str_replace( array_keys( $replacements ), array_values( $replacements ), $file_path ); + $file_path = str_replace( array_keys( $replacements ), array_values( $replacements ), $file_path, $count ); $parsed_file_path = wp_parse_url( $file_path ); $remote_file = null === $count || 0 === $count; // Remote file only if there were no replacements. diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index da64bb85fdd..181d0222503 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -1046,7 +1046,7 @@ CREATE TABLE {$wpdb->prefix}wc_reserved_stock ( `expires` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`order_id`, `product_id`) ) $collate; -CREATE TABLE {$wpdb->prefix}woocommerce_rate_limits ( +CREATE TABLE {$wpdb->prefix}wc_rate_limits ( rate_limit_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, rate_limit_key varchar(200) NOT NULL, rate_limit_expiry BIGINT UNSIGNED NOT NULL, @@ -1087,7 +1087,7 @@ CREATE TABLE {$wpdb->prefix}woocommerce_rate_limits ( "{$wpdb->prefix}woocommerce_tax_rate_locations", "{$wpdb->prefix}woocommerce_tax_rates", "{$wpdb->prefix}wc_reserved_stock", - "{$wpdb->prefix}woocommerce_rate_limits", + "{$wpdb->prefix}wc_rate_limits", ); /** diff --git a/plugins/woocommerce/includes/class-wc-order-item-coupon.php b/plugins/woocommerce/includes/class-wc-order-item-coupon.php index 1a8aa50702a..df54e312a68 100644 --- a/plugins/woocommerce/includes/class-wc-order-item-coupon.php +++ b/plugins/woocommerce/includes/class-wc-order-item-coupon.php @@ -140,6 +140,7 @@ class WC_Order_Item_Coupon extends WC_Order_Item { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { wc_deprecated_function( 'WC_Order_Item_Coupon::offsetGet', '4.4.0', '' ); if ( 'discount_amount' === $offset ) { @@ -157,6 +158,7 @@ class WC_Order_Item_Coupon extends WC_Order_Item { * @param string $offset Offset. * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { wc_deprecated_function( 'WC_Order_Item_Coupon::offsetSet', '4.4.0', '' ); if ( 'discount_amount' === $offset ) { @@ -173,6 +175,7 @@ class WC_Order_Item_Coupon extends WC_Order_Item { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { if ( in_array( $offset, array( 'discount_amount', 'discount_amount_tax' ), true ) ) { return true; diff --git a/plugins/woocommerce/includes/class-wc-order-item-fee.php b/plugins/woocommerce/includes/class-wc-order-item-fee.php index 44e1ee12d2c..bb7cf4da838 100644 --- a/plugins/woocommerce/includes/class-wc-order-item-fee.php +++ b/plugins/woocommerce/includes/class-wc-order-item-fee.php @@ -293,6 +293,7 @@ class WC_Order_Item_Fee extends WC_Order_Item { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { if ( 'line_total' === $offset ) { $offset = 'total'; @@ -311,6 +312,7 @@ class WC_Order_Item_Fee extends WC_Order_Item { * @param string $offset Offset. * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { wc_deprecated_function( 'WC_Order_Item_Fee::offsetSet', '4.4.0', '' ); if ( 'line_total' === $offset ) { @@ -329,6 +331,7 @@ class WC_Order_Item_Fee extends WC_Order_Item { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { if ( in_array( $offset, array( 'line_total', 'line_tax', 'line_tax_data' ), true ) ) { return true; diff --git a/plugins/woocommerce/includes/class-wc-order-item-product.php b/plugins/woocommerce/includes/class-wc-order-item-product.php index a32a6268357..0f7f82654eb 100644 --- a/plugins/woocommerce/includes/class-wc-order-item-product.php +++ b/plugins/woocommerce/includes/class-wc-order-item-product.php @@ -428,6 +428,7 @@ class WC_Order_Item_Product extends WC_Order_Item { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { if ( 'line_subtotal' === $offset ) { $offset = 'subtotal'; @@ -452,6 +453,7 @@ class WC_Order_Item_Product extends WC_Order_Item { * @param string $offset Offset. * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { wc_deprecated_function( 'WC_Order_Item_Product::offsetSet', '4.4.0', '' ); if ( 'line_subtotal' === $offset ) { @@ -476,6 +478,7 @@ class WC_Order_Item_Product extends WC_Order_Item { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { if ( in_array( $offset, array( 'line_subtotal', 'line_subtotal_tax', 'line_total', 'line_tax', 'line_tax_data', 'item_meta_array', 'item_meta', 'qty' ), true ) ) { return true; diff --git a/plugins/woocommerce/includes/class-wc-order-item-shipping.php b/plugins/woocommerce/includes/class-wc-order-item-shipping.php index 6602e87ae24..f2da5c1eea1 100644 --- a/plugins/woocommerce/includes/class-wc-order-item-shipping.php +++ b/plugins/woocommerce/includes/class-wc-order-item-shipping.php @@ -279,6 +279,7 @@ class WC_Order_Item_Shipping extends WC_Order_Item { * @param string $offset Key. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { if ( 'cost' === $offset ) { $offset = 'total'; @@ -293,6 +294,7 @@ class WC_Order_Item_Shipping extends WC_Order_Item { * @param string $offset Key. * @param mixed $value Value to set. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { wc_deprecated_function( 'WC_Order_Item_Shipping::offsetSet', '4.4.0', '' ); if ( 'cost' === $offset ) { @@ -307,6 +309,7 @@ class WC_Order_Item_Shipping extends WC_Order_Item { * @param string $offset Key. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { if ( in_array( $offset, array( 'cost' ), true ) ) { return true; diff --git a/plugins/woocommerce/includes/class-wc-order-item-tax.php b/plugins/woocommerce/includes/class-wc-order-item-tax.php index c41e3881f9f..4248839d93a 100644 --- a/plugins/woocommerce/includes/class-wc-order-item-tax.php +++ b/plugins/woocommerce/includes/class-wc-order-item-tax.php @@ -247,6 +247,7 @@ class WC_Order_Item_Tax extends WC_Order_Item { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { if ( 'tax_amount' === $offset ) { $offset = 'tax_total'; @@ -263,6 +264,7 @@ class WC_Order_Item_Tax extends WC_Order_Item { * @param string $offset Offset. * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { wc_deprecated_function( 'WC_Order_Item_Tax::offsetSet', '4.4.0', '' ); if ( 'tax_amount' === $offset ) { @@ -279,6 +281,7 @@ class WC_Order_Item_Tax extends WC_Order_Item { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { if ( in_array( $offset, array( 'tax_amount', 'shipping_tax_amount' ), true ) ) { return true; diff --git a/plugins/woocommerce/includes/class-wc-order-item.php b/plugins/woocommerce/includes/class-wc-order-item.php index e7c916157cb..a65b1baf0cf 100644 --- a/plugins/woocommerce/includes/class-wc-order-item.php +++ b/plugins/woocommerce/includes/class-wc-order-item.php @@ -310,6 +310,7 @@ class WC_Order_Item extends WC_Data implements ArrayAccess { * @param string $offset Offset. * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { if ( 'item_meta_array' === $offset ) { foreach ( $value as $meta_id => $meta ) { @@ -334,6 +335,7 @@ class WC_Order_Item extends WC_Data implements ArrayAccess { * * @param string $offset Offset. */ + #[\ReturnTypeWillChange] public function offsetUnset( $offset ) { $this->maybe_read_meta_data(); @@ -359,6 +361,7 @@ class WC_Order_Item extends WC_Data implements ArrayAccess { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { $this->maybe_read_meta_data(); if ( 'item_meta_array' === $offset || 'item_meta' === $offset || array_key_exists( $offset, $this->data ) ) { @@ -373,6 +376,7 @@ class WC_Order_Item extends WC_Data implements ArrayAccess { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { $this->maybe_read_meta_data(); 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-product-attribute.php b/plugins/woocommerce/includes/class-wc-product-attribute.php index 14f1901c7aa..8aae62fc8fe 100644 --- a/plugins/woocommerce/includes/class-wc-product-attribute.php +++ b/plugins/woocommerce/includes/class-wc-product-attribute.php @@ -266,6 +266,7 @@ class WC_Product_Attribute implements ArrayAccess { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { switch ( $offset ) { case 'is_variation': @@ -291,6 +292,7 @@ class WC_Product_Attribute implements ArrayAccess { * @param string $offset Offset. * @param mixed $value Value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { switch ( $offset ) { case 'is_variation': @@ -304,7 +306,7 @@ class WC_Product_Attribute implements ArrayAccess { break; default: if ( is_callable( array( $this, "set_$offset" ) ) ) { - return $this->{"set_$offset"}( $value ); + $this->{"set_$offset"}( $value ); } break; } @@ -315,6 +317,7 @@ class WC_Product_Attribute implements ArrayAccess { * * @param string $offset Offset. */ + #[\ReturnTypeWillChange] public function offsetUnset( $offset ) {} /** @@ -323,6 +326,7 @@ class WC_Product_Attribute implements ArrayAccess { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { return in_array( $offset, array_merge( array( 'is_variation', 'is_visible', 'is_taxonomy', 'value' ), array_keys( $this->data ) ), true ); } diff --git a/plugins/woocommerce/includes/class-wc-product-download.php b/plugins/woocommerce/includes/class-wc-product-download.php index 8ab4108b900..c6f7e69e911 100644 --- a/plugins/woocommerce/includes/class-wc-product-download.php +++ b/plugins/woocommerce/includes/class-wc-product-download.php @@ -53,14 +53,14 @@ class WC_Product_Download implements ArrayAccess { * @return string absolute, relative, or shortcode. */ public function get_type_of_file_path( $file_path = '' ) { - $file_path = $file_path ? $file_path : $this->get_file(); - $parsed_url = parse_url( $file_path ); + $file_path = $file_path ? $file_path : $this->get_file(); + $parsed_url = wp_parse_url( $file_path ); if ( $parsed_url && isset( $parsed_url['host'] ) && // Absolute url means that it has a host. ( // Theoretically we could permit any scheme (like ftp as well), but that has not been the case before. So we allow none or http(s). ! isset( $parsed_url['scheme'] ) || - in_array( $parsed_url['scheme'], array( 'http', 'https' ) ) + in_array( $parsed_url['scheme'], array( 'http', 'https' ), true ) ) ) { return 'absolute'; @@ -255,6 +255,7 @@ class WC_Product_Download implements ArrayAccess { * @param string $offset Offset. * @return mixed */ + #[\ReturnTypeWillChange] public function offsetGet( $offset ) { switch ( $offset ) { default: @@ -272,11 +273,12 @@ class WC_Product_Download implements ArrayAccess { * @param string $offset Offset. * @param mixed $value Offset value. */ + #[\ReturnTypeWillChange] public function offsetSet( $offset, $value ) { switch ( $offset ) { default: if ( is_callable( array( $this, "set_$offset" ) ) ) { - return $this->{"set_$offset"}( $value ); + $this->{"set_$offset"}( $value ); } break; } @@ -287,6 +289,7 @@ class WC_Product_Download implements ArrayAccess { * * @param string $offset Offset. */ + #[\ReturnTypeWillChange] public function offsetUnset( $offset ) {} /** @@ -295,6 +298,7 @@ class WC_Product_Download implements ArrayAccess { * @param string $offset Offset. * @return bool */ + #[\ReturnTypeWillChange] public function offsetExists( $offset ) { return in_array( $offset, array_keys( $this->data ), true ); } diff --git a/plugins/woocommerce/includes/class-wc-rate-limiter.php b/plugins/woocommerce/includes/class-wc-rate-limiter.php index a47f2f21fe9..482f0e63da6 100644 --- a/plugins/woocommerce/includes/class-wc-rate-limiter.php +++ b/plugins/woocommerce/includes/class-wc-rate-limiter.php @@ -101,7 +101,7 @@ class WC_Rate_Limiter { $wpdb->prepare( " SELECT rate_limit_expiry - FROM {$wpdb->prefix}woocommerce_rate_limits + FROM {$wpdb->prefix}wc_rate_limits WHERE rate_limit_key = %s ", $action_id @@ -138,7 +138,7 @@ class WC_Rate_Limiter { $next_try_allowed_at = time() + $delay; $result = $wpdb->replace( - $wpdb->prefix . 'woocommerce_rate_limits', + $wpdb->prefix . 'wc_rate_limits', array( 'rate_limit_key' => $action_id, 'rate_limit_expiry' => $next_try_allowed_at, @@ -159,7 +159,7 @@ class WC_Rate_Limiter { $wpdb->query( $wpdb->prepare( - "DELETE FROM {$wpdb->prefix}woocommerce_rate_limits WHERE rate_limit_expiry < %d", + "DELETE FROM {$wpdb->prefix}wc_rate_limits WHERE rate_limit_expiry < %d", time() ) ); 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/class-woocommerce.php b/plugins/woocommerce/includes/class-woocommerce.php index 9e302bf4b0a..9469f688855 100644 --- a/plugins/woocommerce/includes/class-woocommerce.php +++ b/plugins/woocommerce/includes/class-woocommerce.php @@ -27,7 +27,7 @@ final class WooCommerce { * * @var string */ - public $version = '6.0.0'; + public $version = '6.1.0'; /** * WooCommerce Schema version. @@ -932,7 +932,7 @@ final class WooCommerce { return; } - $message_one = __( 'You have installed a development version of WooCommerce which requires files to be built and minified. From the plugin directory, run grunt assets to build and minify assets.', 'woocommerce' ); + $message_one = __( 'You have installed a development version of WooCommerce which requires files to be built and minified. From the plugin directory, run pnpm install and then pnpm nx build woocommerce-legacy-assets to build and minify assets.', 'woocommerce' ); $message_two = sprintf( /* translators: 1: URL of WordPress.org Repository 2: URL of the GitHub Repository release page */ __( 'Or you can download a pre-built version of the plugin from the WordPress.org repository or by visiting the releases page in the GitHub repository.', 'woocommerce' ), diff --git a/plugins/woocommerce/includes/emails/class-wc-email-customer-new-account.php b/plugins/woocommerce/includes/emails/class-wc-email-customer-new-account.php index 3cd0a825b58..f660d88ebdf 100644 --- a/plugins/woocommerce/includes/emails/class-wc-email-customer-new-account.php +++ b/plugins/woocommerce/includes/emails/class-wc-email-customer-new-account.php @@ -51,6 +51,13 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) : */ public $password_generated; + /** + * Magic link to set initial password. + * + * @var string + */ + public $set_password_url; + /** * Constructor. */ @@ -104,6 +111,7 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) : $this->user_email = stripslashes( $this->object->user_email ); $this->recipient = $this->user_email; $this->password_generated = $password_generated; + $this->set_password_url = $this->generate_set_password_url(); } if ( $this->is_enabled() && $this->get_recipient() ) { @@ -131,6 +139,7 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) : 'sent_to_admin' => false, 'plain_text' => false, 'email' => $this, + 'set_password_url' => $this->set_password_url, ) ); } @@ -153,6 +162,7 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) : 'sent_to_admin' => false, 'plain_text' => true, 'email' => $this, + 'set_password_url' => $this->set_password_url, ) ); } @@ -166,6 +176,26 @@ if ( ! class_exists( 'WC_Email_Customer_New_Account', false ) ) : public function get_default_additional_content() { return __( 'We look forward to seeing you soon.', 'woocommerce' ); } + + /** + * Generate set password URL link for a new user. + * + * See also Automattic\WooCommerce\Blocks\Domain\Services\Email\CustomerNewAccount and wp_new_user_notification. + * + * @since 6.0.0 + * @return string + */ + protected function generate_set_password_url() { + // Generate a magic link so user can set initial password. + $key = get_password_reset_key( $this->object ); + if ( ! is_wp_error( $key ) ) { + $action = 'newaccount'; + return wc_get_account_endpoint_url( 'lost-password' ) . "?action=$action&key=$key&login=" . rawurlencode( $this->object->user_login ); + } else { + // Something went wrong while getting the key for new password URL, send customer to the generic password reset. + return wc_get_account_endpoint_url( 'lost-password' ); + } + } } endif; 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/rest-api/Controllers/Version1/class-wc-rest-taxes-v1-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version1/class-wc-rest-taxes-v1-controller.php index 19ba9b67ff5..2af61aa7a99 100644 --- a/plugins/woocommerce/includes/rest-api/Controllers/Version1/class-wc-rest-taxes-v1-controller.php +++ b/plugins/woocommerce/includes/rest-api/Controllers/Version1/class-wc-rest-taxes-v1-controller.php @@ -275,24 +275,31 @@ class WC_REST_Taxes_V1_Controller extends WC_REST_Controller { $response = rest_ensure_response( $taxes ); - // Store pagination values for headers then unset for count query. $per_page = (int) $prepared_args['number']; $page = ceil( ( ( (int) $prepared_args['offset'] ) / $per_page ) + 1 ); - // Query only for ids. - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared - $query = str_replace( 'SELECT *', 'SELECT tax_rate_id', $query ); - $wpdb->get_results( - $wpdb->prepare( - $query, - $wpdb_prepare_args - ) + // Unset LIMIT args. + array_splice( $wpdb_prepare_args, -2 ); + + // Count query. + $query = str_replace( + array( + 'SELECT *', + 'LIMIT %d, %d', + ), + array( + 'SELECT COUNT(*)', + '', + ), + $query ); + + // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared + $total_taxes = (int) $wpdb->get_var( empty( $wpdb_prepare_args ) ? $query : $wpdb->prepare( $query, $wpdb_prepare_args ) ); // phpcs:enable WordPress.DB.PreparedSQL.NotPrepared // Calculate totals. - $total_taxes = (int) $wpdb->num_rows; - $response->header( 'X-WP-Total', (int) $total_taxes ); + $response->header( 'X-WP-Total', $total_taxes ); $max_pages = ceil( $total_taxes / $per_page ); $response->header( 'X-WP-TotalPages', (int) $max_pages ); diff --git a/plugins/woocommerce/includes/tracks/class-wc-tracks.php b/plugins/woocommerce/includes/tracks/class-wc-tracks.php index 7528906ef45..f91121420d2 100644 --- a/plugins/woocommerce/includes/tracks/class-wc-tracks.php +++ b/plugins/woocommerce/includes/tracks/class-wc-tracks.php @@ -68,6 +68,7 @@ class WC_Tracks { /** * Record an event in Tracks - this is the preferred way to record events from PHP. + * Note: the event request won't be made if $properties has a member called `error`. * * @param string $event_name The name of the event. * @param array $properties Custom properties to send with the event. diff --git a/plugins/woocommerce/includes/tracks/events/class-wc-extensions-tracking.php b/plugins/woocommerce/includes/tracks/events/class-wc-extensions-tracking.php index 498e55490bf..cbd16c61744 100644 --- a/plugins/woocommerce/includes/tracks/events/class-wc-extensions-tracking.php +++ b/plugins/woocommerce/includes/tracks/events/class-wc-extensions-tracking.php @@ -22,6 +22,7 @@ class WC_Extensions_Tracking { add_action( 'woocommerce_helper_disconnected', array( $this, 'track_helper_disconnected' ) ); add_action( 'woocommerce_helper_subscriptions_refresh', array( $this, 'track_helper_subscriptions_refresh' ) ); add_action( 'woocommerce_addon_installed', array( $this, 'track_addon_install' ), 10, 2 ); + add_action( 'woocommerce_page_wc-addons_connection_error', array( $this, 'track_extensions_page_connection_error' ), 10, 1 ); } /** @@ -47,6 +48,29 @@ class WC_Extensions_Tracking { WC_Tracks::record_event( $event, $properties ); } + /** + * Send a Tracks event when the Extensions page gets a bad response or no response + * from the WCCOM extensions API. + * + * @param string $error + */ + public function track_extensions_page_connection_error( string $error = '' ) { + // phpcs:disable WordPress.Security.NonceVerification.Recommended + $properties = array( + 'section' => empty( $_REQUEST['section'] ) ? '_featured' : wc_clean( wp_unslash( $_REQUEST['section'] ) ), + ); + + if ( ! empty( $_REQUEST['search'] ) ) { + $properties['search_term'] = wc_clean( wp_unslash( $_REQUEST['search'] ) ); + } + // phpcs:enable + + if ( ! empty( $error ) ) { + $properties['error_data'] = $error; + } + WC_Tracks::record_event( 'extensions_view_connection_error', $properties ); + } + /** * Send a Tracks even when a Helper connection process is initiated. */ 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-order-functions.php b/plugins/woocommerce/includes/wc-order-functions.php index eca35d8c375..c65bc037866 100644 --- a/plugins/woocommerce/includes/wc-order-functions.php +++ b/plugins/woocommerce/includes/wc-order-functions.php @@ -715,16 +715,11 @@ function wc_restock_refunded_items( $order, $refunded_line_items ) { // Update _reduced_stock meta to track changes. $item_stock_reduced = $item_stock_reduced - $qty_to_refund; - if ( 0 < $item_stock_reduced ) { - // Keeps track of total running tally of reduced stock. - $item->update_meta_data( '_reduced_stock', $item_stock_reduced ); + // Keeps track of total running tally of reduced stock. + $item->update_meta_data( '_reduced_stock', $item_stock_reduced ); - // Keeps track of only refunded items that needs restock. - $item->update_meta_data( '_restock_refunded_items', $qty_to_refund + $restock_refunded_items ); - } else { - $item->delete_meta_data( '_reduced_stock' ); - $item->delete_meta_data( '_restock_refunded_items' ); - } + // Keeps track of only refunded items that needs restock. + $item->update_meta_data( '_restock_refunded_items', $qty_to_refund + $restock_refunded_items ); /* translators: 1: product ID 2: old stock level 3: new stock level */ $order->add_order_note( sprintf( __( 'Item #%1$s stock increased from %2$s to %3$s.', 'woocommerce' ), $product->get_id(), $old_stock, $new_stock ) ); 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/legacy/.browserslistrc b/plugins/woocommerce/legacy/.browserslistrc new file mode 100644 index 00000000000..5d191931ac1 --- /dev/null +++ b/plugins/woocommerce/legacy/.browserslistrc @@ -0,0 +1,3 @@ +> 0.1% +ie 8 +ie 9 diff --git a/plugins/woocommerce/legacy/.eslintignore b/plugins/woocommerce/legacy/.eslintignore new file mode 100644 index 00000000000..d677257dbd8 --- /dev/null +++ b/plugins/woocommerce/legacy/.eslintignore @@ -0,0 +1,21 @@ +*.min.js + +/js/accounting/** +/js/flexslider/** +/js/jquery-blockui/** +/js/jquery-cookie/** +/js/jquery-flot/** +/js/jquery-payment/** +/js/jquery-qrcode/** +/js/jquery-serializejson/** +/js/jquery-tiptip/** +/js/jquery-ui-touch-punch/** +/js/js-cookie/** +/js/photoswipe/** +/js/prettyPhoto/** +/js/round/** +/js/select2/** +/js/selectWoo/** +/js/stupidtable/** +/js/zeroclipboard/** +/js/zoom/** diff --git a/plugins/woocommerce/legacy/.eslintrc.js b/plugins/woocommerce/legacy/.eslintrc.js new file mode 100644 index 00000000000..7c90a4dbbb8 --- /dev/null +++ b/plugins/woocommerce/legacy/.eslintrc.js @@ -0,0 +1,31 @@ +/** @format */ + +module.exports = { + root: true, + env: { + browser: true, + es6: true, + node: true + }, + globals: { + wp: true, + wpApiSettings: true, + wcSettings: true, + es6: true + }, + rules: { + camelcase: 0, + indent: 0, + 'max-len': [ 2, { 'code': 140 } ], + 'no-console': 1 + }, + parser: 'babel-eslint', + parserOptions: { + ecmaVersion: 8, + ecmaFeatures: { + modules: true, + experimentalObjectRestSpread: true, + jsx: true + } + }, +}; diff --git a/plugins/woocommerce/legacy/.gitignore b/plugins/woocommerce/legacy/.gitignore new file mode 100644 index 00000000000..e966da9c4be --- /dev/null +++ b/plugins/woocommerce/legacy/.gitignore @@ -0,0 +1,3 @@ +js/**/*.min.js +css/*.css +css/photoswipe/**/*.min.css diff --git a/plugins/woocommerce/legacy/.stylelintrc b/plugins/woocommerce/legacy/.stylelintrc new file mode 100644 index 00000000000..59af9ca1e9b --- /dev/null +++ b/plugins/woocommerce/legacy/.stylelintrc @@ -0,0 +1,3 @@ +{ + "extends": "stylelint-config-wordpress", +} diff --git a/plugins/woocommerce/legacy/Gruntfile.js b/plugins/woocommerce/legacy/Gruntfile.js new file mode 100644 index 00000000000..8a252ef610a --- /dev/null +++ b/plugins/woocommerce/legacy/Gruntfile.js @@ -0,0 +1,271 @@ +module.exports = function ( grunt ) { + 'use strict'; + var sass = require( 'node-sass' ); + + grunt.initConfig( { + // Setting folder templates. + dirs: { + css: 'css', + cssDest: '../assets/css', + fonts: 'assets/fonts', + images: 'assets/images', + js: 'js', + jsDest: '../assets/js', + php: 'includes', + }, + + // JavaScript linting with ESLint. + eslint: { + src: [ + '<%= dirs.js %>/admin/*.js', + '!<%= dirs.js %>/admin/*.min.js', + '<%= dirs.js %>/frontend/*.js', + '!<%= dirs.js %>/frontend/*.min.js', + ], + }, + + // Sass linting with Stylelint. + stylelint: { + options: { + configFile: '.stylelintrc', + }, + all: [ '<%= dirs.css %>/*.scss', '!<%= dirs.css %>/select2.scss' ], + }, + + // Minify .js files. + uglify: { + options: { + ie8: true, + parse: { + strict: false, + }, + output: { + comments: /@license|@preserve|^!/, + }, + }, + js_assets: { + files: [ + { + expand: true, + cwd: '<%= dirs.jsDest %>/', + src: [ '**/*.js', '!**/*.min.js' ], + extDot: 'last', + dest: '<%= dirs.jsDest %>', + ext: '.min.js', + }, + ], + }, + }, + + // Compile all .scss files. + sass: { + compile: { + options: { + implementation: sass, + sourceMap: false, + }, + files: [ + { + expand: true, + cwd: '<%= dirs.css %>/', + src: [ '*.scss' ], + dest: '<%= dirs.css %>/', + ext: '.css', + }, + ], + }, + }, + + // Generate RTL .css files. + rtlcss: { + woocommerce: { + expand: true, + cwd: '<%= dirs.css %>', + src: [ '*.css', '!select2.css', '!*-rtl.css' ], + dest: '<%= dirs.css %>/', + ext: '-rtl.css', + }, + }, + + // Minify all .css files. + cssmin: { + minify: { + files: [ + { + expand: true, + cwd: '<%= dirs.css %>/', + src: [ '*.css' ], + dest: '<%= dirs.css %>/', + ext: '.css', + }, + { + expand: true, + cwd: '<%= dirs.css %>/photoswipe/', + src: [ '*.css', '!*.min.css' ], + dest: '<%= dirs.css %>/photoswipe/', + ext: '.min.css', + }, + { + expand: true, + cwd: '<%= dirs.css %>/photoswipe/default-skin/', + src: [ '*.css', '!*.min.css' ], + dest: '<%= dirs.css %>/photoswipe/default-skin/', + ext: '.min.css', + }, + ], + }, + }, + + // Concatenate select2.css onto the admin.css files. + concat: { + admin: { + files: { + '<%= dirs.css %>/admin.css': [ + '<%= dirs.css %>/select2.css', + '<%= dirs.css %>/admin.css', + ], + '<%= dirs.css %>/admin-rtl.css': [ + '<%= dirs.css %>/select2.css', + '<%= dirs.css %>/admin-rtl.css', + ], + }, + }, + }, + + // Watch changes for assets. + watch: { + css: { + files: [ '<%= dirs.css %>/*.scss' ], + tasks: [ + 'sass', + 'rtlcss', + 'postcss', + 'cssmin', + 'concat', + 'move:css', + 'copy:css', + ], + }, + js: { + files: [ + 'GruntFile.js', + '<%= dirs.js %>/**/*.js', + '!<%= dirs.js %>/**/*.min.js', + ], + tasks: [ 'eslint', 'copy:js', 'newer:uglify' ], + }, + }, + + // PHP Code Sniffer. + phpcs: { + options: { + bin: 'vendor/bin/phpcs', + }, + dist: { + src: [ + '**/*.php', // Include all php files. + '!includes/api/legacy/**', + '!includes/libraries/**', + '!node_modules/**', + '!tests/cli/**', + '!tmp/**', + '!vendor/**', + ], + }, + }, + + // Autoprefixer. + postcss: { + options: { + processors: [ require( 'autoprefixer' ) ], + }, + dist: { + src: [ '<%= dirs.css %>/*.css' ], + }, + }, + + // Specifying different src/dest for postcss broke everything, + // so we'll just move files to their new location afterwards. + move: { + css: { + files: [ + { + src: '<%= dirs.css %>/*.css', + dest: '<%= dirs.cssDest %>/', + }, + { + src: '<%= dirs.css %>/photoswipe/*.min.css', + dest: '<%= dirs.cssDest %>/photoswipe/', + }, + { + src: + '<%= dirs.css %>/photoswipe/default-skin/*.min.css', + dest: '<%= dirs.cssDest %>/photoswipe/default-skin/', + }, + ], + }, + }, + copy: { + css: { + files: [ + { + cwd: '<%= dirs.css %>', + expand: true, + src: 'photoswipe/**', + dest: '<%= dirs.cssDest %>/', + }, + { + cwd: '<%= dirs.css %>', + expand: true, + src: 'jquery-ui/**', + dest: '<%= dirs.cssDest %>/', + }, + ], + }, + js: { + cwd: '<%= dirs.js %>/', + expand: true, + src: '**', + dest: '<%= dirs.jsDest %>/', + }, + }, + } ); + + // Load NPM tasks to be used here. + grunt.loadNpmTasks( 'grunt-sass' ); + grunt.loadNpmTasks( 'grunt-phpcs' ); + grunt.loadNpmTasks( 'grunt-rtlcss' ); + grunt.loadNpmTasks( 'grunt-postcss' ); + grunt.loadNpmTasks( 'grunt-stylelint' ); + grunt.loadNpmTasks( 'gruntify-eslint' ); + grunt.loadNpmTasks( 'grunt-contrib-uglify' ); + grunt.loadNpmTasks( 'grunt-contrib-cssmin' ); + grunt.loadNpmTasks( 'grunt-contrib-concat' ); + grunt.loadNpmTasks( 'grunt-contrib-copy' ); + grunt.loadNpmTasks( 'grunt-contrib-watch' ); + grunt.loadNpmTasks( 'grunt-contrib-clean' ); + grunt.loadNpmTasks( 'grunt-newer' ); + grunt.loadNpmTasks( 'grunt-move' ); + + // Register tasks. + grunt.registerTask( 'default', [ 'js', 'css' ] ); + + grunt.registerTask( 'js', [ 'eslint', 'copy:js', 'uglify:js_assets' ] ); + + grunt.registerTask( 'css', [ + 'sass', + 'rtlcss', + 'postcss', + 'cssmin', + 'concat', + 'move:css', + 'copy:css', + ] ); + + grunt.registerTask( 'assets', [ 'js', 'css' ] ); + + grunt.registerTask( 'e2e-build', [ 'uglify:js_assets', 'css' ] ); + + // Only an alias to 'default' task. + grunt.registerTask( 'dev', [ 'default' ] ); +}; diff --git a/plugins/woocommerce/assets/css/_animation.scss b/plugins/woocommerce/legacy/css/_animation.scss similarity index 100% rename from plugins/woocommerce/assets/css/_animation.scss rename to plugins/woocommerce/legacy/css/_animation.scss diff --git a/plugins/woocommerce/assets/css/_fonts.scss b/plugins/woocommerce/legacy/css/_fonts.scss similarity index 100% rename from plugins/woocommerce/assets/css/_fonts.scss rename to plugins/woocommerce/legacy/css/_fonts.scss diff --git a/plugins/woocommerce/assets/css/_mixins.scss b/plugins/woocommerce/legacy/css/_mixins.scss similarity index 100% rename from plugins/woocommerce/assets/css/_mixins.scss rename to plugins/woocommerce/legacy/css/_mixins.scss diff --git a/plugins/woocommerce/assets/css/_variables.scss b/plugins/woocommerce/legacy/css/_variables.scss similarity index 100% rename from plugins/woocommerce/assets/css/_variables.scss rename to plugins/woocommerce/legacy/css/_variables.scss diff --git a/plugins/woocommerce/assets/css/activation.scss b/plugins/woocommerce/legacy/css/activation.scss similarity index 100% rename from plugins/woocommerce/assets/css/activation.scss rename to plugins/woocommerce/legacy/css/activation.scss diff --git a/plugins/woocommerce/assets/css/admin.scss b/plugins/woocommerce/legacy/css/admin.scss similarity index 96% rename from plugins/woocommerce/assets/css/admin.scss rename to plugins/woocommerce/legacy/css/admin.scss index 1de1eb48349..38b751a93cb 100644 --- a/plugins/woocommerce/assets/css/admin.scss +++ b/plugins/woocommerce/legacy/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 { @@ -7622,6 +7733,22 @@ table.bar_chart { font-weight: bold; } +.wc-addons__empty { + margin: 48px auto; + max-width: 640px; + + h2 { + font-size: 20px; + font-weight: 400; + line-height: 1.2; + } + + p { + font-size: 16px; + line-height: 1.5; + } +} + @media screen and (min-width: 600px) { .wc-addons-wrap { @@ -7643,4 +7770,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/assets/css/auth.scss b/plugins/woocommerce/legacy/css/auth.scss similarity index 100% rename from plugins/woocommerce/assets/css/auth.scss rename to plugins/woocommerce/legacy/css/auth.scss diff --git a/plugins/woocommerce/assets/css/dashboard-setup.scss b/plugins/woocommerce/legacy/css/dashboard-setup.scss similarity index 100% rename from plugins/woocommerce/assets/css/dashboard-setup.scss rename to plugins/woocommerce/legacy/css/dashboard-setup.scss diff --git a/plugins/woocommerce/assets/css/dashboard.scss b/plugins/woocommerce/legacy/css/dashboard.scss similarity index 100% rename from plugins/woocommerce/assets/css/dashboard.scss rename to plugins/woocommerce/legacy/css/dashboard.scss diff --git a/plugins/woocommerce/assets/css/helper.scss b/plugins/woocommerce/legacy/css/helper.scss similarity index 100% rename from plugins/woocommerce/assets/css/helper.scss rename to plugins/woocommerce/legacy/css/helper.scss diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_flat_0_aaaaaa_40x100.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_flat_75_ffffff_40x100.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_55_fbf9ee_1x400.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_75_dadada_1x400.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_75_e6e6e6_1x400.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_glass_95_fef1ec_1x400.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-bg_highlight-soft_75_cccccc_1x100.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_222222_256x240.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_222222_256x240.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_222222_256x240.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_222222_256x240.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_2e83ff_256x240.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_2e83ff_256x240.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_2e83ff_256x240.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_2e83ff_256x240.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_454545_256x240.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_454545_256x240.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_454545_256x240.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_454545_256x240.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_888888_256x240.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_888888_256x240.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_888888_256x240.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_888888_256x240.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png b/plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png rename to plugins/woocommerce/legacy/css/jquery-ui/images/ui-icons_cd0a0a_256x240.png diff --git a/plugins/woocommerce/assets/css/jquery-ui/jquery-ui-rtl.css b/plugins/woocommerce/legacy/css/jquery-ui/jquery-ui-rtl.css similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/jquery-ui-rtl.css rename to plugins/woocommerce/legacy/css/jquery-ui/jquery-ui-rtl.css diff --git a/plugins/woocommerce/assets/css/jquery-ui/jquery-ui.css b/plugins/woocommerce/legacy/css/jquery-ui/jquery-ui.css similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/jquery-ui.css rename to plugins/woocommerce/legacy/css/jquery-ui/jquery-ui.css diff --git a/plugins/woocommerce/assets/css/jquery-ui/jquery-ui.min.css b/plugins/woocommerce/legacy/css/jquery-ui/jquery-ui.min.css similarity index 100% rename from plugins/woocommerce/assets/css/jquery-ui/jquery-ui.min.css rename to plugins/woocommerce/legacy/css/jquery-ui/jquery-ui.min.css diff --git a/plugins/woocommerce/assets/css/marketplace-suggestions.scss b/plugins/woocommerce/legacy/css/marketplace-suggestions.scss similarity index 100% rename from plugins/woocommerce/assets/css/marketplace-suggestions.scss rename to plugins/woocommerce/legacy/css/marketplace-suggestions.scss diff --git a/plugins/woocommerce/assets/css/menu.scss b/plugins/woocommerce/legacy/css/menu.scss similarity index 100% rename from plugins/woocommerce/assets/css/menu.scss rename to plugins/woocommerce/legacy/css/menu.scss diff --git a/plugins/woocommerce/assets/css/network-order-widget.scss b/plugins/woocommerce/legacy/css/network-order-widget.scss similarity index 100% rename from plugins/woocommerce/assets/css/network-order-widget.scss rename to plugins/woocommerce/legacy/css/network-order-widget.scss diff --git a/plugins/woocommerce/assets/css/photoswipe/default-skin/default-skin.css b/plugins/woocommerce/legacy/css/photoswipe/default-skin/default-skin.css similarity index 100% rename from plugins/woocommerce/assets/css/photoswipe/default-skin/default-skin.css rename to plugins/woocommerce/legacy/css/photoswipe/default-skin/default-skin.css diff --git a/plugins/woocommerce/assets/css/photoswipe/default-skin/default-skin.png b/plugins/woocommerce/legacy/css/photoswipe/default-skin/default-skin.png similarity index 100% rename from plugins/woocommerce/assets/css/photoswipe/default-skin/default-skin.png rename to plugins/woocommerce/legacy/css/photoswipe/default-skin/default-skin.png diff --git a/plugins/woocommerce/assets/css/photoswipe/default-skin/default-skin.svg b/plugins/woocommerce/legacy/css/photoswipe/default-skin/default-skin.svg similarity index 100% rename from plugins/woocommerce/assets/css/photoswipe/default-skin/default-skin.svg rename to plugins/woocommerce/legacy/css/photoswipe/default-skin/default-skin.svg diff --git a/plugins/woocommerce/assets/css/photoswipe/default-skin/preloader.gif b/plugins/woocommerce/legacy/css/photoswipe/default-skin/preloader.gif similarity index 100% rename from plugins/woocommerce/assets/css/photoswipe/default-skin/preloader.gif rename to plugins/woocommerce/legacy/css/photoswipe/default-skin/preloader.gif diff --git a/plugins/woocommerce/assets/css/photoswipe/photoswipe.css b/plugins/woocommerce/legacy/css/photoswipe/photoswipe.css similarity index 100% rename from plugins/woocommerce/assets/css/photoswipe/photoswipe.css rename to plugins/woocommerce/legacy/css/photoswipe/photoswipe.css diff --git a/plugins/woocommerce/assets/css/prettyPhoto.scss b/plugins/woocommerce/legacy/css/prettyPhoto.scss similarity index 100% rename from plugins/woocommerce/assets/css/prettyPhoto.scss rename to plugins/woocommerce/legacy/css/prettyPhoto.scss diff --git a/plugins/woocommerce/assets/css/privacy.scss b/plugins/woocommerce/legacy/css/privacy.scss similarity index 100% rename from plugins/woocommerce/assets/css/privacy.scss rename to plugins/woocommerce/legacy/css/privacy.scss diff --git a/plugins/woocommerce/assets/css/reports-print.scss b/plugins/woocommerce/legacy/css/reports-print.scss similarity index 100% rename from plugins/woocommerce/assets/css/reports-print.scss rename to plugins/woocommerce/legacy/css/reports-print.scss diff --git a/plugins/woocommerce/assets/css/select2.scss b/plugins/woocommerce/legacy/css/select2.scss similarity index 100% rename from plugins/woocommerce/assets/css/select2.scss rename to plugins/woocommerce/legacy/css/select2.scss diff --git a/plugins/woocommerce/assets/css/twenty-nineteen.scss b/plugins/woocommerce/legacy/css/twenty-nineteen.scss similarity index 100% rename from plugins/woocommerce/assets/css/twenty-nineteen.scss rename to plugins/woocommerce/legacy/css/twenty-nineteen.scss diff --git a/plugins/woocommerce/assets/css/twenty-seventeen.scss b/plugins/woocommerce/legacy/css/twenty-seventeen.scss similarity index 100% rename from plugins/woocommerce/assets/css/twenty-seventeen.scss rename to plugins/woocommerce/legacy/css/twenty-seventeen.scss diff --git a/plugins/woocommerce/assets/css/twenty-twenty-one-admin.scss b/plugins/woocommerce/legacy/css/twenty-twenty-one-admin.scss similarity index 100% rename from plugins/woocommerce/assets/css/twenty-twenty-one-admin.scss rename to plugins/woocommerce/legacy/css/twenty-twenty-one-admin.scss diff --git a/plugins/woocommerce/assets/css/twenty-twenty-one.scss b/plugins/woocommerce/legacy/css/twenty-twenty-one.scss similarity index 100% rename from plugins/woocommerce/assets/css/twenty-twenty-one.scss rename to plugins/woocommerce/legacy/css/twenty-twenty-one.scss diff --git a/plugins/woocommerce/assets/css/twenty-twenty.scss b/plugins/woocommerce/legacy/css/twenty-twenty.scss similarity index 100% rename from plugins/woocommerce/assets/css/twenty-twenty.scss rename to plugins/woocommerce/legacy/css/twenty-twenty.scss diff --git a/plugins/woocommerce/assets/css/wc-setup.scss b/plugins/woocommerce/legacy/css/wc-setup.scss similarity index 100% rename from plugins/woocommerce/assets/css/wc-setup.scss rename to plugins/woocommerce/legacy/css/wc-setup.scss diff --git a/plugins/woocommerce/assets/css/woocommerce-layout.scss b/plugins/woocommerce/legacy/css/woocommerce-layout.scss similarity index 100% rename from plugins/woocommerce/assets/css/woocommerce-layout.scss rename to plugins/woocommerce/legacy/css/woocommerce-layout.scss diff --git a/plugins/woocommerce/assets/css/woocommerce-smallscreen.scss b/plugins/woocommerce/legacy/css/woocommerce-smallscreen.scss similarity index 100% rename from plugins/woocommerce/assets/css/woocommerce-smallscreen.scss rename to plugins/woocommerce/legacy/css/woocommerce-smallscreen.scss diff --git a/plugins/woocommerce/assets/css/woocommerce.scss b/plugins/woocommerce/legacy/css/woocommerce.scss similarity index 100% rename from plugins/woocommerce/assets/css/woocommerce.scss rename to plugins/woocommerce/legacy/css/woocommerce.scss diff --git a/plugins/woocommerce/assets/js/accounting/accounting.js b/plugins/woocommerce/legacy/js/accounting/accounting.js similarity index 100% rename from plugins/woocommerce/assets/js/accounting/accounting.js rename to plugins/woocommerce/legacy/js/accounting/accounting.js diff --git a/plugins/woocommerce/assets/js/admin/api-keys.js b/plugins/woocommerce/legacy/js/admin/api-keys.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/api-keys.js rename to plugins/woocommerce/legacy/js/admin/api-keys.js diff --git a/plugins/woocommerce/assets/js/admin/backbone-modal.js b/plugins/woocommerce/legacy/js/admin/backbone-modal.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/backbone-modal.js rename to plugins/woocommerce/legacy/js/admin/backbone-modal.js diff --git a/plugins/woocommerce/assets/js/admin/marketplace-suggestions.js b/plugins/woocommerce/legacy/js/admin/marketplace-suggestions.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/marketplace-suggestions.js rename to plugins/woocommerce/legacy/js/admin/marketplace-suggestions.js diff --git a/plugins/woocommerce/assets/js/admin/meta-boxes-coupon.js b/plugins/woocommerce/legacy/js/admin/meta-boxes-coupon.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/meta-boxes-coupon.js rename to plugins/woocommerce/legacy/js/admin/meta-boxes-coupon.js diff --git a/plugins/woocommerce/assets/js/admin/meta-boxes-order.js b/plugins/woocommerce/legacy/js/admin/meta-boxes-order.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/meta-boxes-order.js rename to plugins/woocommerce/legacy/js/admin/meta-boxes-order.js diff --git a/plugins/woocommerce/assets/js/admin/meta-boxes-product-variation.js b/plugins/woocommerce/legacy/js/admin/meta-boxes-product-variation.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/meta-boxes-product-variation.js rename to plugins/woocommerce/legacy/js/admin/meta-boxes-product-variation.js diff --git a/plugins/woocommerce/assets/js/admin/meta-boxes-product.js b/plugins/woocommerce/legacy/js/admin/meta-boxes-product.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/meta-boxes-product.js rename to plugins/woocommerce/legacy/js/admin/meta-boxes-product.js diff --git a/plugins/woocommerce/assets/js/admin/meta-boxes.js b/plugins/woocommerce/legacy/js/admin/meta-boxes.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/meta-boxes.js rename to plugins/woocommerce/legacy/js/admin/meta-boxes.js diff --git a/plugins/woocommerce/assets/js/admin/network-orders.js b/plugins/woocommerce/legacy/js/admin/network-orders.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/network-orders.js rename to plugins/woocommerce/legacy/js/admin/network-orders.js diff --git a/plugins/woocommerce/assets/js/admin/product-ordering.js b/plugins/woocommerce/legacy/js/admin/product-ordering.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/product-ordering.js rename to plugins/woocommerce/legacy/js/admin/product-ordering.js diff --git a/plugins/woocommerce/assets/js/admin/quick-edit.js b/plugins/woocommerce/legacy/js/admin/quick-edit.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/quick-edit.js rename to plugins/woocommerce/legacy/js/admin/quick-edit.js diff --git a/plugins/woocommerce/assets/js/admin/reports.js b/plugins/woocommerce/legacy/js/admin/reports.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/reports.js rename to plugins/woocommerce/legacy/js/admin/reports.js diff --git a/plugins/woocommerce/assets/js/admin/settings-views-html-settings-tax.js b/plugins/woocommerce/legacy/js/admin/settings-views-html-settings-tax.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/settings-views-html-settings-tax.js rename to plugins/woocommerce/legacy/js/admin/settings-views-html-settings-tax.js diff --git a/plugins/woocommerce/assets/js/admin/settings.js b/plugins/woocommerce/legacy/js/admin/settings.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/settings.js rename to plugins/woocommerce/legacy/js/admin/settings.js diff --git a/plugins/woocommerce/assets/js/admin/system-status.js b/plugins/woocommerce/legacy/js/admin/system-status.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/system-status.js rename to plugins/woocommerce/legacy/js/admin/system-status.js diff --git a/plugins/woocommerce/assets/js/admin/term-ordering.js b/plugins/woocommerce/legacy/js/admin/term-ordering.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/term-ordering.js rename to plugins/woocommerce/legacy/js/admin/term-ordering.js diff --git a/plugins/woocommerce/assets/js/admin/users.js b/plugins/woocommerce/legacy/js/admin/users.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/users.js rename to plugins/woocommerce/legacy/js/admin/users.js diff --git a/plugins/woocommerce/assets/js/admin/wc-clipboard.js b/plugins/woocommerce/legacy/js/admin/wc-clipboard.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-clipboard.js rename to plugins/woocommerce/legacy/js/admin/wc-clipboard.js diff --git a/plugins/woocommerce/assets/js/admin/wc-enhanced-select.js b/plugins/woocommerce/legacy/js/admin/wc-enhanced-select.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-enhanced-select.js rename to plugins/woocommerce/legacy/js/admin/wc-enhanced-select.js diff --git a/plugins/woocommerce/assets/js/admin/wc-orders.js b/plugins/woocommerce/legacy/js/admin/wc-orders.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-orders.js rename to plugins/woocommerce/legacy/js/admin/wc-orders.js diff --git a/plugins/woocommerce/assets/js/admin/wc-product-export.js b/plugins/woocommerce/legacy/js/admin/wc-product-export.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-product-export.js rename to plugins/woocommerce/legacy/js/admin/wc-product-export.js diff --git a/plugins/woocommerce/assets/js/admin/wc-product-import.js b/plugins/woocommerce/legacy/js/admin/wc-product-import.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-product-import.js rename to plugins/woocommerce/legacy/js/admin/wc-product-import.js diff --git a/plugins/woocommerce/assets/js/admin/wc-setup.js b/plugins/woocommerce/legacy/js/admin/wc-setup.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-setup.js rename to plugins/woocommerce/legacy/js/admin/wc-setup.js diff --git a/plugins/woocommerce/assets/js/admin/wc-shipping-classes.js b/plugins/woocommerce/legacy/js/admin/wc-shipping-classes.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-shipping-classes.js rename to plugins/woocommerce/legacy/js/admin/wc-shipping-classes.js diff --git a/plugins/woocommerce/assets/js/admin/wc-shipping-zone-methods.js b/plugins/woocommerce/legacy/js/admin/wc-shipping-zone-methods.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-shipping-zone-methods.js rename to plugins/woocommerce/legacy/js/admin/wc-shipping-zone-methods.js diff --git a/plugins/woocommerce/assets/js/admin/wc-shipping-zones.js b/plugins/woocommerce/legacy/js/admin/wc-shipping-zones.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-shipping-zones.js rename to plugins/woocommerce/legacy/js/admin/wc-shipping-zones.js diff --git a/plugins/woocommerce/assets/js/admin/wc-status-widget.js b/plugins/woocommerce/legacy/js/admin/wc-status-widget.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/wc-status-widget.js rename to plugins/woocommerce/legacy/js/admin/wc-status-widget.js diff --git a/plugins/woocommerce/assets/js/admin/woocommerce_admin.js b/plugins/woocommerce/legacy/js/admin/woocommerce_admin.js similarity index 100% rename from plugins/woocommerce/assets/js/admin/woocommerce_admin.js rename to plugins/woocommerce/legacy/js/admin/woocommerce_admin.js diff --git a/plugins/woocommerce/assets/js/flexslider/jquery.flexslider.js b/plugins/woocommerce/legacy/js/flexslider/jquery.flexslider.js similarity index 100% rename from plugins/woocommerce/assets/js/flexslider/jquery.flexslider.js rename to plugins/woocommerce/legacy/js/flexslider/jquery.flexslider.js diff --git a/plugins/woocommerce/assets/js/frontend/add-payment-method.js b/plugins/woocommerce/legacy/js/frontend/add-payment-method.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/add-payment-method.js rename to plugins/woocommerce/legacy/js/frontend/add-payment-method.js diff --git a/plugins/woocommerce/assets/js/frontend/add-to-cart-variation.js b/plugins/woocommerce/legacy/js/frontend/add-to-cart-variation.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/add-to-cart-variation.js rename to plugins/woocommerce/legacy/js/frontend/add-to-cart-variation.js diff --git a/plugins/woocommerce/assets/js/frontend/add-to-cart.js b/plugins/woocommerce/legacy/js/frontend/add-to-cart.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/add-to-cart.js rename to plugins/woocommerce/legacy/js/frontend/add-to-cart.js diff --git a/plugins/woocommerce/assets/js/frontend/address-i18n.js b/plugins/woocommerce/legacy/js/frontend/address-i18n.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/address-i18n.js rename to plugins/woocommerce/legacy/js/frontend/address-i18n.js diff --git a/plugins/woocommerce/assets/js/frontend/cart-fragments.js b/plugins/woocommerce/legacy/js/frontend/cart-fragments.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/cart-fragments.js rename to plugins/woocommerce/legacy/js/frontend/cart-fragments.js diff --git a/plugins/woocommerce/assets/js/frontend/cart.js b/plugins/woocommerce/legacy/js/frontend/cart.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/cart.js rename to plugins/woocommerce/legacy/js/frontend/cart.js diff --git a/plugins/woocommerce/assets/js/frontend/checkout.js b/plugins/woocommerce/legacy/js/frontend/checkout.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/checkout.js rename to plugins/woocommerce/legacy/js/frontend/checkout.js diff --git a/plugins/woocommerce/assets/js/frontend/country-select.js b/plugins/woocommerce/legacy/js/frontend/country-select.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/country-select.js rename to plugins/woocommerce/legacy/js/frontend/country-select.js diff --git a/plugins/woocommerce/assets/js/frontend/credit-card-form.js b/plugins/woocommerce/legacy/js/frontend/credit-card-form.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/credit-card-form.js rename to plugins/woocommerce/legacy/js/frontend/credit-card-form.js diff --git a/plugins/woocommerce/assets/js/frontend/geolocation.js b/plugins/woocommerce/legacy/js/frontend/geolocation.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/geolocation.js rename to plugins/woocommerce/legacy/js/frontend/geolocation.js diff --git a/plugins/woocommerce/assets/js/frontend/lost-password.js b/plugins/woocommerce/legacy/js/frontend/lost-password.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/lost-password.js rename to plugins/woocommerce/legacy/js/frontend/lost-password.js diff --git a/plugins/woocommerce/assets/js/frontend/password-strength-meter.js b/plugins/woocommerce/legacy/js/frontend/password-strength-meter.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/password-strength-meter.js rename to plugins/woocommerce/legacy/js/frontend/password-strength-meter.js diff --git a/plugins/woocommerce/assets/js/frontend/price-slider.js b/plugins/woocommerce/legacy/js/frontend/price-slider.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/price-slider.js rename to plugins/woocommerce/legacy/js/frontend/price-slider.js diff --git a/plugins/woocommerce/assets/js/frontend/single-product.js b/plugins/woocommerce/legacy/js/frontend/single-product.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/single-product.js rename to plugins/woocommerce/legacy/js/frontend/single-product.js diff --git a/plugins/woocommerce/assets/js/frontend/tokenization-form.js b/plugins/woocommerce/legacy/js/frontend/tokenization-form.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/tokenization-form.js rename to plugins/woocommerce/legacy/js/frontend/tokenization-form.js diff --git a/plugins/woocommerce/assets/js/frontend/woocommerce.js b/plugins/woocommerce/legacy/js/frontend/woocommerce.js similarity index 100% rename from plugins/woocommerce/assets/js/frontend/woocommerce.js rename to plugins/woocommerce/legacy/js/frontend/woocommerce.js diff --git a/plugins/woocommerce/assets/js/jquery-blockui/jquery.blockUI.js b/plugins/woocommerce/legacy/js/jquery-blockui/jquery.blockUI.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-blockui/jquery.blockUI.js rename to plugins/woocommerce/legacy/js/jquery-blockui/jquery.blockUI.js diff --git a/plugins/woocommerce/assets/js/jquery-cookie/jquery.cookie.js b/plugins/woocommerce/legacy/js/jquery-cookie/jquery.cookie.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-cookie/jquery.cookie.js rename to plugins/woocommerce/legacy/js/jquery-cookie/jquery.cookie.js diff --git a/plugins/woocommerce/assets/js/jquery-flot/jquery.flot.js b/plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-flot/jquery.flot.js rename to plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.js diff --git a/plugins/woocommerce/assets/js/jquery-flot/jquery.flot.pie.js b/plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.pie.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-flot/jquery.flot.pie.js rename to plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.pie.js diff --git a/plugins/woocommerce/assets/js/jquery-flot/jquery.flot.resize.js b/plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.resize.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-flot/jquery.flot.resize.js rename to plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.resize.js diff --git a/plugins/woocommerce/assets/js/jquery-flot/jquery.flot.stack.js b/plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.stack.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-flot/jquery.flot.stack.js rename to plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.stack.js diff --git a/plugins/woocommerce/assets/js/jquery-flot/jquery.flot.time.js b/plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.time.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-flot/jquery.flot.time.js rename to plugins/woocommerce/legacy/js/jquery-flot/jquery.flot.time.js diff --git a/plugins/woocommerce/assets/js/jquery-payment/jquery.payment.js b/plugins/woocommerce/legacy/js/jquery-payment/jquery.payment.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-payment/jquery.payment.js rename to plugins/woocommerce/legacy/js/jquery-payment/jquery.payment.js diff --git a/plugins/woocommerce/assets/js/jquery-qrcode/jquery.qrcode.js b/plugins/woocommerce/legacy/js/jquery-qrcode/jquery.qrcode.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-qrcode/jquery.qrcode.js rename to plugins/woocommerce/legacy/js/jquery-qrcode/jquery.qrcode.js diff --git a/plugins/woocommerce/assets/js/jquery-serializejson/jquery.serializejson.js b/plugins/woocommerce/legacy/js/jquery-serializejson/jquery.serializejson.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-serializejson/jquery.serializejson.js rename to plugins/woocommerce/legacy/js/jquery-serializejson/jquery.serializejson.js diff --git a/plugins/woocommerce/assets/js/jquery-tiptip/jquery.tipTip.js b/plugins/woocommerce/legacy/js/jquery-tiptip/jquery.tipTip.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-tiptip/jquery.tipTip.js rename to plugins/woocommerce/legacy/js/jquery-tiptip/jquery.tipTip.js diff --git a/plugins/woocommerce/assets/js/jquery-ui-touch-punch/jquery-ui-touch-punch.js b/plugins/woocommerce/legacy/js/jquery-ui-touch-punch/jquery-ui-touch-punch.js similarity index 100% rename from plugins/woocommerce/assets/js/jquery-ui-touch-punch/jquery-ui-touch-punch.js rename to plugins/woocommerce/legacy/js/jquery-ui-touch-punch/jquery-ui-touch-punch.js diff --git a/plugins/woocommerce/assets/js/js-cookie/js.cookie.js b/plugins/woocommerce/legacy/js/js-cookie/js.cookie.js similarity index 100% rename from plugins/woocommerce/assets/js/js-cookie/js.cookie.js rename to plugins/woocommerce/legacy/js/js-cookie/js.cookie.js diff --git a/plugins/woocommerce/assets/js/photoswipe/photoswipe-ui-default.js b/plugins/woocommerce/legacy/js/photoswipe/photoswipe-ui-default.js similarity index 100% rename from plugins/woocommerce/assets/js/photoswipe/photoswipe-ui-default.js rename to plugins/woocommerce/legacy/js/photoswipe/photoswipe-ui-default.js diff --git a/plugins/woocommerce/assets/js/photoswipe/photoswipe.js b/plugins/woocommerce/legacy/js/photoswipe/photoswipe.js similarity index 100% rename from plugins/woocommerce/assets/js/photoswipe/photoswipe.js rename to plugins/woocommerce/legacy/js/photoswipe/photoswipe.js diff --git a/plugins/woocommerce/assets/js/prettyPhoto/jquery.prettyPhoto.init.js b/plugins/woocommerce/legacy/js/prettyPhoto/jquery.prettyPhoto.init.js similarity index 100% rename from plugins/woocommerce/assets/js/prettyPhoto/jquery.prettyPhoto.init.js rename to plugins/woocommerce/legacy/js/prettyPhoto/jquery.prettyPhoto.init.js diff --git a/plugins/woocommerce/assets/js/prettyPhoto/jquery.prettyPhoto.js b/plugins/woocommerce/legacy/js/prettyPhoto/jquery.prettyPhoto.js similarity index 100% rename from plugins/woocommerce/assets/js/prettyPhoto/jquery.prettyPhoto.js rename to plugins/woocommerce/legacy/js/prettyPhoto/jquery.prettyPhoto.js diff --git a/plugins/woocommerce/assets/js/round/round.js b/plugins/woocommerce/legacy/js/round/round.js similarity index 100% rename from plugins/woocommerce/assets/js/round/round.js rename to plugins/woocommerce/legacy/js/round/round.js diff --git a/plugins/woocommerce/assets/js/select2/select2.full.js b/plugins/woocommerce/legacy/js/select2/select2.full.js similarity index 100% rename from plugins/woocommerce/assets/js/select2/select2.full.js rename to plugins/woocommerce/legacy/js/select2/select2.full.js diff --git a/plugins/woocommerce/assets/js/select2/select2.js b/plugins/woocommerce/legacy/js/select2/select2.js similarity index 100% rename from plugins/woocommerce/assets/js/select2/select2.js rename to plugins/woocommerce/legacy/js/select2/select2.js diff --git a/plugins/woocommerce/assets/js/selectWoo/selectWoo.full.js b/plugins/woocommerce/legacy/js/selectWoo/selectWoo.full.js similarity index 100% rename from plugins/woocommerce/assets/js/selectWoo/selectWoo.full.js rename to plugins/woocommerce/legacy/js/selectWoo/selectWoo.full.js diff --git a/plugins/woocommerce/assets/js/selectWoo/selectWoo.js b/plugins/woocommerce/legacy/js/selectWoo/selectWoo.js similarity index 100% rename from plugins/woocommerce/assets/js/selectWoo/selectWoo.js rename to plugins/woocommerce/legacy/js/selectWoo/selectWoo.js diff --git a/plugins/woocommerce/assets/js/stupidtable/stupidtable.js b/plugins/woocommerce/legacy/js/stupidtable/stupidtable.js similarity index 100% rename from plugins/woocommerce/assets/js/stupidtable/stupidtable.js rename to plugins/woocommerce/legacy/js/stupidtable/stupidtable.js diff --git a/plugins/woocommerce/assets/js/zeroclipboard/ZeroClipboard.swf b/plugins/woocommerce/legacy/js/zeroclipboard/ZeroClipboard.swf similarity index 100% rename from plugins/woocommerce/assets/js/zeroclipboard/ZeroClipboard.swf rename to plugins/woocommerce/legacy/js/zeroclipboard/ZeroClipboard.swf diff --git a/plugins/woocommerce/assets/js/zeroclipboard/jquery.zeroclipboard.js b/plugins/woocommerce/legacy/js/zeroclipboard/jquery.zeroclipboard.js similarity index 100% rename from plugins/woocommerce/assets/js/zeroclipboard/jquery.zeroclipboard.js rename to plugins/woocommerce/legacy/js/zeroclipboard/jquery.zeroclipboard.js diff --git a/plugins/woocommerce/assets/js/zoom/jquery.zoom.js b/plugins/woocommerce/legacy/js/zoom/jquery.zoom.js similarity index 100% rename from plugins/woocommerce/assets/js/zoom/jquery.zoom.js rename to plugins/woocommerce/legacy/js/zoom/jquery.zoom.js diff --git a/plugins/woocommerce/legacy/package.json b/plugins/woocommerce/legacy/package.json new file mode 100644 index 00000000000..378e4721758 --- /dev/null +++ b/plugins/woocommerce/legacy/package.json @@ -0,0 +1,31 @@ +{ + "name": "woocommerce-legacy-assets", + "version": "1.0.0", + "author": "Automattic", + "license": "GPL-2.0-or-later", + "private": true, + "main": "Gruntfile.js", + "devDependencies": { + "autoprefixer": "9.8.6", + "browserslist": "4.14.5", + "caniuse-lite": "1.0.30001146", + "grunt": "1.3.0", + "grunt-contrib-clean": "2.0.0", + "grunt-contrib-concat": "1.0.1", + "grunt-contrib-copy": "1.0.0", + "grunt-contrib-cssmin": "3.0.0", + "grunt-contrib-uglify": "4.0.1", + "grunt-contrib-watch": "1.1.0", + "grunt-move": "1.0.3", + "grunt-newer": "1.3.0", + "grunt-phpcs": "0.4.0", + "grunt-postcss": "0.9.0", + "grunt-rtlcss": "2.0.2", + "grunt-sass": "3.1.0", + "grunt-stylelint": "0.16.0", + "gruntify-eslint": "5.0.0", + "node-sass": "6.0.1", + "stylelint": "13.8.0", + "stylelint-config-wordpress": "17.0.0" + } +} diff --git a/plugins/woocommerce/legacy/project.json b/plugins/woocommerce/legacy/project.json new file mode 100644 index 00000000000..12ae5f2a2f9 --- /dev/null +++ b/plugins/woocommerce/legacy/project.json @@ -0,0 +1,40 @@ +{ + "root": "plugins/woocommerce/legacy", + "sourceRoot": "plugins/woocommerce/legacy", + "type": "application", + "implicitDependencies": [], + "targets": { + "build": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "commands": [ + { + "command": "grunt assets", + "forwardAllArgs": false + } + ], + "cwd": "plugins/woocommerce/legacy" + }, + "outputs": [ + "plugins/woocommerce/assets/css", + "plugins/woocommerce/assets/js" + ] + }, + "lint": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "commands": [ + { + "command": "grunt eslint", + "forwardAllArgs": false + }, + { + "command": "grunt stylelint", + "forwardAllArgs": false + } + ], + "cwd": "plugins/woocommerce/legacy" + } + } + } +} diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index aec725fc788..60b302e6cc6 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -1,26 +1,21 @@ { "name": "woocommerce", "title": "WooCommerce", - "version": "6.0.0", + "version": "6.1.0", "homepage": "https://woocommerce.com/", "repository": { "type": "git", "url": "https://github.com/woocommerce/woocommerce.git" }, "license": "GPL-3.0+", - "main": "Gruntfile.js", "config": { "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", + "build:core": "pnpm nx build woocommerce-legacy-assets && pnpm run makepot", "build:zip": "pnpm run build", - "build:assets": "grunt assets", "lint:js": "eslint assets/js --ext=js", "docker:down": "pnpx wc-e2e docker:down", "docker:ssh": "pnpx wc-e2e docker:ssh", @@ -64,26 +59,12 @@ "eslint-config-wpcalypso": "5.0.0", "eslint-plugin-jest": "23.20.0", "github-contributors-list": "https://github.com/woocommerce/github-contributors-list/tarball/master", - "grunt": "1.3.0", - "grunt-contrib-clean": "2.0.0", - "grunt-contrib-concat": "1.0.1", - "grunt-contrib-copy": "1.0.0", - "grunt-contrib-cssmin": "3.0.0", - "grunt-contrib-uglify": "4.0.1", - "grunt-contrib-watch": "1.1.0", - "grunt-newer": "^1.3.0", - "grunt-phpcs": "0.4.0", - "grunt-postcss": "0.9.0", - "grunt-rtlcss": "2.0.2", - "grunt-sass": "3.1.0", - "grunt-stylelint": "0.16.0", - "gruntify-eslint": "5.0.0", "husky": "4.3.0", "istanbul": "1.0.0-alpha.2", "jest": "^25.1.0", "lint-staged": "9.5.0", "mocha": "7.2.0", - "node-sass": "4.14.1", + "node-sass": "6.0.1", "prettier": "npm:wp-prettier@2.0.5", "stylelint": "^13.8.0", "stylelint-config-wordpress": "17.0.0", @@ -125,17 +106,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..03cf6e733cd --- /dev/null +++ b/plugins/woocommerce/project.json @@ -0,0 +1,153 @@ +{ + "root": "plugins/woocommerce/", + "sourceRoot": "plugins/woocommerce", + "projectType": "application", + "implicitDependencies": [ "woocommerce-legacy-assets" ], + "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-commands", + "options": { + "command": "grunt watch", + "cwd": "plugins/woocommerce/legacy" + } + }, + "build-assets": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "command": "pnpm nx build woocommerce-legacy-assets", + "cwd": "plugins/woocommerce" + } + }, + "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/emails/customer-new-account.php b/plugins/woocommerce/templates/emails/customer-new-account.php index 3154c7cdde2..3b98e1712e3 100644 --- a/plugins/woocommerce/templates/emails/customer-new-account.php +++ b/plugins/woocommerce/templates/emails/customer-new-account.php @@ -12,7 +12,7 @@ * * @see https://docs.woocommerce.com/document/template-structure/ * @package WooCommerce\Templates\Emails - * @version 3.7.0 + * @version 6.0.0 */ defined( 'ABSPATH' ) || exit; @@ -23,9 +23,9 @@ do_action( 'woocommerce_email_header', $email_heading, $email ); ?>

    ' . esc_html( $user_login ) . '', make_clickable( esc_url( wc_get_page_permalink( 'myaccount' ) ) ) ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>

    - - -

    ' . esc_html( $user_pass ) . '' ); ?>

    + + +

    " size="4" placeholder="" - inputmode="" /> + inputmode="" + autocomplete="" + />
    -

    +

    diff --git a/plugins/woocommerce/tests/README.md b/plugins/woocommerce/tests/README.md index 345a2589130..bcd6e5088c5 100644 --- a/plugins/woocommerce/tests/README.md +++ b/plugins/woocommerce/tests/README.md @@ -1,6 +1,6 @@ # WooCommerce Tests -This document discusses unit tests. See [the e2e README](https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/tests/e2e) to learn how to setup testing environment for running e2e tests and run them. +This document discusses unit tests. See [the e2e README](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/tests/e2e/README.md) to learn how to setup testing environment for running e2e tests and run them. ## Table of contents @@ -29,7 +29,7 @@ To run the tests, you need to create a test database. You can: ### Setup instructions -Once you have database, from the WooCommerce root directory run the following: +Once you have database, from the WooCommerce root directory "cd" into `plugins/woocommerce` directory and run the following: 1. Install [PHPUnit](http://phpunit.de/) via Composer by running: ``` @@ -96,7 +96,7 @@ To workaround this, the testing strategy used by WooCommerce is as follows: * We normally use PHPUnit 6.5.14 * For PHP 8 we use [a custom fork of PHPUnit 7.5.20 with support for PHP 8](https://github.com/woocommerce/phpunit/pull/1). WooCommerce's GitHub Actions CI workflow is configured to use this fork instead of the old version 6 when running in PHP 8. -If you want to run the tests locally under PHP 8 you'll need to temporarily modify `composer.json` to use the custom PHPUnit fork in the same way that the GitHub Actions CI workflow file does. These are the commands that you'll need (run them after a regular `composer install`): +If you want to run the tests locally under PHP 8 you'll need to temporarily modify `composer.json` to use the custom PHPUnit fork in the same way that the GitHub Actions CI workflow file does. These are the commands that you'll need (run them after a regular `composer install` from within the `plugins/woocommerce` directory): ```shell curl -L https://github.com/woocommerce/phpunit/archive/add-compatibility-with-php8-to-phpunit-7.zip -o /tmp/phpunit-7.5-fork.zip @@ -104,6 +104,8 @@ unzip -d /tmp/phpunit-7.5-fork /tmp/phpunit-7.5-fork.zip composer bin phpunit config --unset platform 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 ``` Just remember that you can't include the modified `composer.json` in any commit! diff --git a/plugins/woocommerce/tests/e2e/README.md b/plugins/woocommerce/tests/e2e/README.md index 1026a5fb183..dfd265a4010 100644 --- a/plugins/woocommerce/tests/e2e/README.md +++ b/plugins/woocommerce/tests/e2e/README.md @@ -30,6 +30,14 @@ Automated end-to-end tests for WooCommerce. ## Pre-requisites +### Install Nx + +Follow [instructions on nx.dev site](https://nx.dev/l/r/getting-started/nx-setup) to install Nx. + +### Install pnpm + +Follow [instructions on pnpm.io site](https://pnpm.io/installation) to install pnpm. + ### Install Node.js Follow [instructions on the node.js site](https://nodejs.org/en/download/) to install Node.js. @@ -83,11 +91,11 @@ If you need to modify the port for your local test environment (eg. port is alre [Jest](https://jestjs.io/) is being used to run e2e tests. Jest sequencer introduces tools that can be used to specify the order in which the tests are being run. In our case, they are being run in alphabetical order of the directories where tests are located. This way, tests in the directory `activate-and-setup` will run first. By default, jest runs tests ordered by the time it takes to run the test (the test that takes longer to run will be run first, the test that takes less time to run will run last). -The Setup Wizard e2e test runs first to ensure that WooCommerce is active and that the setup wizard has been completed. This is necessary because `docker:up` creates a brand new install of WordPress and WooCommerce. +The Setup Wizard e2e test runs first to ensure that WooCommerce is active and that the setup wizard has been completed. This is necessary because `docker-up` creates a brand new install of WordPress and WooCommerce. ### Chromium Download -By default, `Puppeteer` downloads the `Chromium` package every time you run `npm install` or `npm update`. To disable that download add the following to your `.bash_profile` or `.zshrc` (whichever you use): +By default, `Puppeteer` downloads the `Chromium` package every time you run `pnpm install` or `pnpm update`. To disable that download add the following to your `.bash_profile` or `.zshrc` (whichever you use): ```shell script export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true @@ -97,25 +105,27 @@ Puppeteer will still automatically download Chromium when needed. ## Running tests +If you are using Windows, we recommend using [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/) for End-to-end testing. Follow the [WSL Setup Instructions](./WSL_SETUP_INSTRUCTIONS.md) first before proceeding with the steps below. + ### Prep work for running tests Run the following in a terminal/command line window -- `cd` to the WooCommerce plugin folder +- `cd` to the WooCommerce monorepo folder - `git checkout trunk` (or the branch where you need to run tests) - `nvm use` -- `npm install` +- `pnpm install` -- `composer install --no-dev` +- `pnpm nx composer-install woocommerce` -- `npm run build:assets` +- `pnpm nx build-assets woocommerce` - `npm install jest --global` (this only needs to be done once) -- `npx wc-e2e docker:up` (this will build the test site using Docker) +- `pnpm nx docker-up woocommerce` (this will build the test site using Docker) - Use `docker ps` to confirm that the Docker containers are running. You should see a log similar to one below indicating that everything had been built as expected: @@ -141,16 +151,16 @@ Username: admin PW: password ``` -- Run `npx wc-e2e docker:down` when you are done with running e2e tests and before making any changes to test site configuration. +- Run `pnpm nx docker-down woocommerce` when you are done with running e2e tests and before making any changes to test site configuration. -Note that running `npx wc-e2e docker:down` and then `npx wc-e2e docker:up` re-initializes the test container. +Note that running `pnpm nx docker-down woocommerce` and then `pnpm nx docker-up woocommerce` re-initializes the test container. ### How to run tests in headless mode To run e2e tests in headless mode use the following command: ```bash -npx wc-e2e test:e2e +pnpm nx test-e2e woocommerce ``` ### How to run tests in non-headless mode @@ -158,7 +168,7 @@ npx wc-e2e test:e2e Tests run in headless mode by default. However, sometimes it's useful to observe the browser while running or developing tests. To do so, you can run tests in a non-headless (dev) mode: ```bash -npx wc-e2e test:e2e-dev +pnpm nx test-e2e-dev woocommerce ``` The dev mode also enables SlowMo mode. SlowMo slows down Puppeteer’s operations. This makes it easier to see what is happening in the browser. @@ -166,7 +176,7 @@ The dev mode also enables SlowMo mode. SlowMo slows down Puppeteer’s operation By default, SlowMo mode adds a 50 millisecond delay between test steps. If you'd like to override the length of the delay and have the tests run faster or slower in the `-dev` mode, pass `PUPPETEER_SLOWMO` variable when running tests as shown below: ``` -PUPPETEER_SLOWMO=10 npx wc-e2e test:e2e-dev +PUPPETEER_SLOWMO=10 pnpm nx test-e2e-dev woocommerce ``` The faster you want the tests to run, the lower the value should be of `PUPPETEER_SLOWMO` should be. @@ -181,7 +191,7 @@ For example: Tests run in headless mode by default. While writing tests it may be useful to have the debugger loaded while running a test in non-headless mode. To run tests in debug mode: ```bash -npx wc-e2e test:e2e-debug +pnpm nx test-e2e-debug woocommerce ``` When all tests have been completed the debugger remains active. Control doesn't return to the command line until the debugger is closed. Otherwise, debug mode functions the same as non-headless mode. @@ -191,7 +201,8 @@ When all tests have been completed the debugger remains active. Control doesn't To run an individual test, use the direct path to the spec. For example: ```bash -npx wc-e2e test:e2e ./tests/e2e/specs/wp-admin/test-create-order.js +cd plugins/woocommerce +pnpx wc-e2e test:e2e ./tests/e2e/specs/wp-admin/create-order.test.js ``` ### How to skip tests @@ -251,7 +262,7 @@ The following variables can be used to specify the versions of WordPress, PHP an The full command to build the site will look as follows: ``` -TRAVIS_MARIADB_VERSION=10.5.3 TRAVIS_PHP_VERSION=7.4.5 WP_VERSION=5.4.1 npx wc-e2e docker:up +TRAVIS_MARIADB_VERSION=10.5.3 TRAVIS_PHP_VERSION=7.4.5 WP_VERSION=5.4.1 pnpm nx docker-up woocommerce ``` ## Guide for writing e2e tests @@ -353,6 +364,6 @@ In the example above, you can see that `allows customer to see downloads` part o ## Debugging tests -The test sequencer (`npx wc-e2e test:e2e`) includes support for saving [screenshots on test errors](https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/e2e-environment#test-screenshots) which can be sent to a Slack channel via a [Slackbot](https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/e2e-environment#slackbot-setup). +The test sequencer (`pnpm nx test-e2e woocommerce`) includes support for saving [screenshots on test errors](https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/e2e-environment#test-screenshots) which can be sent to a Slack channel via a [Slackbot](https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/e2e-environment#slackbot-setup). For Puppeteer debugging, follow [Google's documentation](https://developers.google.com/web/tools/puppeteer/debugging). diff --git a/plugins/woocommerce/tests/e2e/WSL_SETUP_INSTRUCTIONS.md b/plugins/woocommerce/tests/e2e/WSL_SETUP_INSTRUCTIONS.md new file mode 100644 index 00000000000..7e6b7e88dfe --- /dev/null +++ b/plugins/woocommerce/tests/e2e/WSL_SETUP_INSTRUCTIONS.md @@ -0,0 +1,58 @@ +# Setup Instructions for Windows Subsystem for Linux (WSL) + +You can set up a local development environment on Windows with [Windows Subsystem for Linux (WSL)](https://docs.microsoft.com/en-us/windows/wsl/). The following instructions are for Ubuntu 20.04. + +## Pre-requisites + +You should have the following already set up on your Windows computer: +- **Docker Desktop for Windows** - https://docs.docker.com/docker-for-windows/install/ +- **WSL 2** - https://docs.microsoft.com/en-us/windows/wsl/install +- **Ubuntu 20.04 set as default Linux distribution** - https://docs.microsoft.com/en-us/windows/wsl/wsl-config#list-installed-distributions + +## Setup Steps + +Update and upgrade packages. +```bash +sudo apt update -y && sudo apt upgrade -y +``` + +In order for Composer commands to work later on, you have to install the following: +- PHP +- Composer +- `php-xml` +- `php-mbstring` +```bash +sudo apt install php-cli unzip -y + +cd ~ + +curl -sS https://getcomposer.org/installer -o composer-setup.php + +HASH=`curl -sS https://composer.github.io/installer.sig` + +echo $HASH + +php -r "if (hash_file('SHA384', 'composer-setup.php') === '$HASH') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" + +sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer + +composer --version --no-interaction # Verify that Composer installation was successful + +sudo apt install php-xml -y + +sudo apt install php-mbstring -y +``` + +For Puppeteer to run in headless mode you'll need to install additional packages: +```bash +sudo apt install -y ca-certificates fonts-liberation gconf-service libappindicator1 libasound2 libatk-bridge2.0-0 libatk1.0-0 libc6 libcairo2 libcups2 libdbus-1-3 libexpat1 libfontconfig1 libgbm1 libgcc1 libgconf-2-4 libgdk-pixbuf2.0-0 libglib2.0-0 libgtk-3-0 libnspr4 libnss3 libpango-1.0-0 libpangocairo-1.0-0 libstdc++6 libx11-6 libx11-xcb1 libxcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrandr2 libxrender1 libxss1 libxtst6 lsb-release wget xdg-utils +``` + +Add your username to the `docker` group to avoid having to type `sudo` when you run Docker commands. +```bash +sudo usermod -aG docker ${YOUR_USERNAME} + +su - ${YOUR_USERNAME} +``` + +At this point, you're now ready to proceed with the steps in [Prep work for running tests](./README.md#prep-work-for-running-tests). diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/data/refund.js b/plugins/woocommerce/tests/e2e/api-core-tests/data/refund.js deleted file mode 100644 index 13a35f0cb58..00000000000 --- a/plugins/woocommerce/tests/e2e/api-core-tests/data/refund.js +++ /dev/null @@ -1,18 +0,0 @@ -/** - * A basic refund. - * - * For more details on the order refund properties, see: - * - * https://woocommerce.github.io/woocommerce-rest-api-docs/#order-refund-properties - * - */ -const refund = { - api_refund: false, - amount: '1.00', - reason: 'Late delivery refund.', - line_items: [], -}; - -module.exports = { - refund: refund, -}; diff --git a/plugins/woocommerce/tests/e2e/api-core-tests/endpoints/refunds.js b/plugins/woocommerce/tests/e2e/api-core-tests/endpoints/refunds.js deleted file mode 100644 index 8a958fee3d0..00000000000 --- a/plugins/woocommerce/tests/e2e/api-core-tests/endpoints/refunds.js +++ /dev/null @@ -1,60 +0,0 @@ -/** - * Internal dependencies - */ -const { - getRequest, - postRequest, - putRequest, - deleteRequest, -} = require( '../utils/request' ); - -/** - * WooCommerce Refunds endpoints. - * - * https://woocommerce.github.io/woocommerce-rest-api-docs/#refunds - */ -const refundsApi = { - name: 'Refunds', - create: { - name: 'Create a refund', - method: 'POST', - path: 'orders//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/config/jest.setup.js b/plugins/woocommerce/tests/e2e/config/jest.setup.js index ebf80556653..5fd474f804f 100644 --- a/plugins/woocommerce/tests/e2e/config/jest.setup.js +++ b/plugins/woocommerce/tests/e2e/config/jest.setup.js @@ -58,7 +58,10 @@ beforeAll(async () => { await page.goto(WP_ADMIN_LOGIN); await clearLocalStorage(); - await setBrowserViewport('large'); + await setBrowserViewport( { + width: 1280, + height: 800, + }); }); // Clear browser cookies and cache using DevTools. 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/e2e/specs/activate-and-setup/setup-onboarding.js b/plugins/woocommerce/tests/e2e/specs/activate-and-setup/setup-onboarding.js index a97918b19d3..f3de8c5841b 100644 --- a/plugins/woocommerce/tests/e2e/specs/activate-and-setup/setup-onboarding.js +++ b/plugins/woocommerce/tests/e2e/specs/activate-and-setup/setup-onboarding.js @@ -1,6 +1,8 @@ /* * Internal dependencies */ -const { runSetupOnboardingTests } = require( '@woocommerce/e2e-core-tests' ); +const { runActivationTest, runInitialStoreSettingsTest, runSetupOnboardingTests } = require( '@woocommerce/e2e-core-tests' ); +runActivationTest(); +runInitialStoreSettingsTest(); runSetupOnboardingTests(); diff --git a/plugins/woocommerce/tests/e2e/specs/wp-admin/order-refund-restock.test.js b/plugins/woocommerce/tests/e2e/specs/wp-admin/order-refund-restock.test.js new file mode 100644 index 00000000000..d036c409845 --- /dev/null +++ b/plugins/woocommerce/tests/e2e/specs/wp-admin/order-refund-restock.test.js @@ -0,0 +1,6 @@ +/* + * Internal dependencies + */ +const { runOrderRefundRestockTest } = require( '@woocommerce/e2e-core-tests' ); + +runOrderRefundRestockTest(); diff --git a/plugins/woocommerce/tests/e2e/specs/wp-admin/page-loads.test.js b/plugins/woocommerce/tests/e2e/specs/wp-admin/page-loads.test.js new file mode 100644 index 00000000000..2fc1c01aa00 --- /dev/null +++ b/plugins/woocommerce/tests/e2e/specs/wp-admin/page-loads.test.js @@ -0,0 +1,6 @@ +/* + Internal dependencies + */ +const { runAdminPageLoadTests } = require( '@woocommerce/e2e-core-tests' ); + +runAdminPageLoadTests(); 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/legacy/unit-tests/util/class-wc-rate-limiter.php b/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-rate-limiter.php index 2ac073511f0..703a475467e 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-rate-limiter.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-rate-limiter.php @@ -93,7 +93,7 @@ class WC_Tests_Rate_Limiter extends WC_Unit_Test_Case { wc_update_600_migrate_rate_limit_options(); // Ensure that only the _123 limit was migrated. - $migrated = $wpdb->get_col( "SELECT rate_limit_key FROM {$wpdb->prefix}woocommerce_rate_limits" ); + $migrated = $wpdb->get_col( "SELECT rate_limit_key FROM {$wpdb->prefix}wc_rate_limits" ); $this->assertCount( 1, $migrated ); $this->assertEquals( 'add_payment_method_123', $migrated[0] ); 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/class-wc-download-handler-tests.php b/plugins/woocommerce/tests/php/includes/class-wc-download-handler-tests.php new file mode 100644 index 00000000000..6fd7b5c765f --- /dev/null +++ b/plugins/woocommerce/tests/php/includes/class-wc-download-handler-tests.php @@ -0,0 +1,52 @@ +assertFalse( $parsed_file_path['remote_file'] ); + } + + /** + * Test for local URL without protocol. + */ + public function test_parse_file_path_for_local_url() { + $local_file_path = trailingslashit( wp_upload_dir()['baseurl'] ) . 'dummy_file.jpg'; + $parsed_file_path = WC_Download_Handler::parse_file_path( $local_file_path ); + $this->assertFalse( $parsed_file_path['remote_file'] ); + } + + /** + * Test for local file with `file` protocol. + */ + public function test_parse_file_path_for_local_file_protocol() { + $local_file_path = 'file:/' . trailingslashit( wp_upload_dir()['basedir'] ) . 'dummy_file.jpg'; + $parsed_file_path = WC_Download_Handler::parse_file_path( $local_file_path ); + $this->assertFalse( $parsed_file_path['remote_file'] ); + } + + /** + * Test for local file with https protocom. + */ + public function test_parse_file_path_for_local_file_https_protocol() { + $local_file_path = site_url( '/', 'https' ) . 'dummy_file.jpg'; + $parsed_file_path = WC_Download_Handler::parse_file_path( $local_file_path ); + $this->assertFalse( $parsed_file_path['remote_file'] ); + } + + /** + * Test for remote file. + */ + public function test_parse_file_path_for_remote_file() { + $remote_file_path = 'https://dummy.woocommerce.com/dummy_file.jpg'; + $parsed_file_path = WC_Download_Handler::parse_file_path( $remote_file_path ); + $this->assertTrue( $parsed_file_path['remote_file'] ); + } +} 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/tests/php/includes/wc-order-functions-test.php b/plugins/woocommerce/tests/php/includes/wc-order-functions-test.php new file mode 100644 index 00000000000..9a024eb4636 --- /dev/null +++ b/plugins/woocommerce/tests/php/includes/wc-order-functions-test.php @@ -0,0 +1,59 @@ + true, + 'stock_quantity' => 10, + ) + ); + + // Place an order for the product, qty 2. + WC()->cart->empty_cart(); + WC()->cart->add_to_cart( $product->get_id(), 2 ); + WC()->cart->calculate_totals(); + + $checkout = WC_Checkout::instance(); + $order = new WC_Order(); + $checkout->set_data_from_cart( $order ); + $order->set_status( 'wc-processing' ); + $order->save(); + + // Get the line item. + $items = $order->get_items(); + $line_item = reset( $items ); + + // Force a restock of one item. + $refunded_items = array(); + $refunded_items[ $line_item->get_id() ] = array( + 'qty' => 1, + ); + wc_restock_refunded_items( $order, $refunded_items ); + + // Verify metadata. + $this->assertEquals( 1, (int) $line_item->get_meta( '_reduced_stock', true ) ); + $this->assertEquals( 1, (int) $line_item->get_meta( '_restock_refunded_items', true ) ); + + // Force another restock of one item. + wc_restock_refunded_items( $order, $refunded_items ); + + // Verify metadata. + $this->assertEquals( 0, (int) $line_item->get_meta( '_reduced_stock', true ) ); + $this->assertEquals( 2, (int) $line_item->get_meta( '_restock_refunded_items', true ) ); + } +} 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/plugins/woocommerce/woocommerce.php b/plugins/woocommerce/woocommerce.php index 3a31f5fdae4..a1698901f83 100644 --- a/plugins/woocommerce/woocommerce.php +++ b/plugins/woocommerce/woocommerce.php @@ -3,7 +3,7 @@ * Plugin Name: WooCommerce * Plugin URI: https://woocommerce.com/ * Description: An eCommerce toolkit that helps you sell anything. Beautifully. - * Version: 6.0.0-dev + * Version: 6.1.0-dev * Author: Automattic * Author URI: https://woocommerce.com * Text Domain: woocommerce diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1914e20272f..fc6a9fd1b00 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.2.3 + '@nrwl/linter': 13.1.4 + '@nrwl/tao': 13.2.3 + '@nrwl/web': 13.1.4_42cab1dece2b2240094de84cfd414406 + '@nrwl/workspace': 13.2.3_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: @@ -91,10 +99,12 @@ importers: packages/js/e2e-core-tests: specifiers: '@jest/globals': ^26.4.2 + '@wordpress/deprecated': ^3.2.3 config: 3.3.3 faker: ^5.1.0 dependencies: '@jest/globals': 26.6.2 + '@wordpress/deprecated': 3.2.3 config: 3.3.3 faker: 5.5.3 @@ -113,6 +123,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 +150,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: - '@wordpress/deprecated': ^2.10.0 + '@automattic/puppeteer-utils': github:Automattic/puppeteer-utils#0f3ec50 + '@typescript-eslint/eslint-plugin': ^5.3.0 + '@typescript-eslint/parser': ^5.3.0 + '@wordpress/deprecated': ^3.2.3 '@wordpress/e2e-test-utils': ^4.16.1 config: 3.3.3 + eslint: ^8.1.0 faker: ^5.1.0 fishery: ^1.2.0 dependencies: - '@wordpress/deprecated': 2.12.3 - '@wordpress/e2e-test-utils': 4.16.1_jest@27.2.4 + '@automattic/puppeteer-utils': github.com/Automattic/puppeteer-utils/0f3ec50 + '@wordpress/deprecated': 3.2.3 + '@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: @@ -187,26 +208,12 @@ importers: eslint-config-wpcalypso: 5.0.0 eslint-plugin-jest: 23.20.0 github-contributors-list: https://github.com/woocommerce/github-contributors-list/tarball/master - grunt: 1.3.0 - grunt-contrib-clean: 2.0.0 - grunt-contrib-concat: 1.0.1 - grunt-contrib-copy: 1.0.0 - grunt-contrib-cssmin: 3.0.0 - grunt-contrib-uglify: 4.0.1 - grunt-contrib-watch: 1.1.0 - grunt-newer: ^1.3.0 - grunt-phpcs: 0.4.0 - grunt-postcss: 0.9.0 - grunt-rtlcss: 2.0.2 - grunt-sass: 3.1.0 - grunt-stylelint: 0.16.0 - gruntify-eslint: 5.0.0 husky: 4.3.0 istanbul: 1.0.0-alpha.2 jest: ^25.1.0 lint-staged: 9.5.0 mocha: 7.2.0 - node-sass: 4.14.1 + node-sass: 6.0.1 prettier: npm:wp-prettier@2.0.5 stylelint: ^13.8.0 stylelint-config-wordpress: 17.0.0 @@ -243,26 +250,12 @@ importers: eslint-config-wpcalypso: 5.0.0_eslint@6.8.0 eslint-plugin-jest: 23.20.0_eslint@6.8.0+typescript@3.9.7 github-contributors-list: '@github.com/woocommerce/github-contributors-list/tarball/master' - grunt: 1.3.0 - grunt-contrib-clean: 2.0.0_grunt@1.3.0 - grunt-contrib-concat: 1.0.1_grunt@1.3.0 - grunt-contrib-copy: 1.0.0 - grunt-contrib-cssmin: 3.0.0 - grunt-contrib-uglify: 4.0.1 - grunt-contrib-watch: 1.1.0 - grunt-newer: 1.3.0_grunt@1.3.0 - grunt-phpcs: 0.4.0 - grunt-postcss: 0.9.0_grunt@1.3.0 - grunt-rtlcss: 2.0.2 - grunt-sass: 3.1.0_grunt@1.3.0 - grunt-stylelint: 0.16.0_stylelint@13.13.1 - gruntify-eslint: 5.0.0_grunt@1.3.0 husky: 4.3.0 istanbul: 1.0.0-alpha.2 jest: 25.5.4 lint-staged: 9.5.0 mocha: 7.2.0 - node-sass: 4.14.1 + node-sass: 6.0.1 prettier: /wp-prettier/2.0.5 stylelint: 13.13.1 stylelint-config-wordpress: 17.0.0_stylelint@13.13.1 @@ -271,8 +264,60 @@ importers: webpack-cli: 3.3.12_webpack@4.44.2 wp-textdomain: 1.0.1 + plugins/woocommerce/legacy: + specifiers: + autoprefixer: 9.8.6 + browserslist: 4.14.5 + caniuse-lite: 1.0.30001146 + grunt: 1.3.0 + grunt-contrib-clean: 2.0.0 + grunt-contrib-concat: 1.0.1 + grunt-contrib-copy: 1.0.0 + grunt-contrib-cssmin: 3.0.0 + grunt-contrib-uglify: 4.0.1 + grunt-contrib-watch: 1.1.0 + grunt-move: 1.0.3 + grunt-newer: 1.3.0 + grunt-phpcs: 0.4.0 + grunt-postcss: 0.9.0 + grunt-rtlcss: 2.0.2 + grunt-sass: 3.1.0 + grunt-stylelint: 0.16.0 + gruntify-eslint: 5.0.0 + node-sass: 6.0.1 + stylelint: 13.8.0 + stylelint-config-wordpress: 17.0.0 + devDependencies: + autoprefixer: 9.8.6 + browserslist: 4.14.5 + caniuse-lite: 1.0.30001146 + grunt: 1.3.0 + grunt-contrib-clean: 2.0.0_grunt@1.3.0 + grunt-contrib-concat: 1.0.1_grunt@1.3.0 + grunt-contrib-copy: 1.0.0 + grunt-contrib-cssmin: 3.0.0 + grunt-contrib-uglify: 4.0.1 + grunt-contrib-watch: 1.1.0 + grunt-move: 1.0.3 + grunt-newer: 1.3.0_grunt@1.3.0 + grunt-phpcs: 0.4.0 + grunt-postcss: 0.9.0_grunt@1.3.0 + grunt-rtlcss: 2.0.2 + grunt-sass: 3.1.0_grunt@1.3.0 + grunt-stylelint: 0.16.0_stylelint@13.8.0 + gruntify-eslint: 5.0.0_grunt@1.3.0 + node-sass: 6.0.1 + stylelint: 13.8.0 + stylelint-config-wordpress: 17.0.0_stylelint@13.8.0 + 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 +338,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 +361,42 @@ 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'} + dev: true + + /@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 +412,38 @@ 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 + json5: 2.2.0 + semver: 6.3.0 + source-map: 0.5.7 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core/7.16.0: + resolution: {integrity: sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@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 @@ -374,11 +453,11 @@ packages: transitivePeerDependencies: - supports-color - /@babel/generator/7.15.8: - resolution: {integrity: sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==} + /@babel/generator/7.16.0: + resolution: {integrity: sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 jsesc: 2.5.2 source-map: 0.5.7 @@ -386,14 +465,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 +498,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 +511,20 @@ 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 + dev: true + + /@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 +559,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 +631,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 +652,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 +682,105 @@ 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 + dev: true + + /@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 + dev: true + + /@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 +789,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 +805,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 +826,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 +849,40 @@ packages: resolution: {integrity: sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.15.6 + '@babel/types': 7.16.0 + dev: true + + /@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 +896,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 +919,25 @@ 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 + dev: true + + /@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.14.5: - resolution: {integrity: sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==} + /@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 +948,27 @@ 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 + dev: 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 +980,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 +1019,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 +1041,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 +1054,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 +1079,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 +1133,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 +1165,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 +1197,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 +1229,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 +1261,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 +1293,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 +1331,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 +1366,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 +1400,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 +1437,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 +1458,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 +1500,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==} @@ -983,6 +1527,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -993,12 +1546,12 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.15.8: + /@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.15.8 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.12.9: @@ -1016,6 +1569,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1025,6 +1587,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 +1624,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 +1650,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==} @@ -1069,12 +1669,12 @@ packages: '@babel/helper-plugin-utils': 7.14.5 dev: false - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.15.8: + /@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.15.8 + '@babel/core': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.12.9: @@ -1092,6 +1692,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1101,6 +1710,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==} @@ -1117,6 +1737,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1133,6 +1762,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1149,6 +1787,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1165,6 +1812,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1181,6 +1837,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1197,6 +1862,15 @@ packages: dependencies: '@babel/core': 7.15.8 '@babel/helper-plugin-utils': 7.14.5 + dev: true + + /@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==} @@ -1206,6 +1880,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 +1909,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 +1947,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 +1984,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 +2017,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 +2046,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 +2091,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 +2128,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 +2157,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 +2188,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 +2218,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 +2249,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 +2279,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 +2310,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 +2340,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 +2369,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 +2406,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 +2449,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 +2495,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 +2536,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 +2568,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 +2597,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 +2632,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 +2664,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 +2693,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 +2715,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 +2750,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 +2779,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 +2805,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 +2841,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 +2872,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 +2902,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 +2931,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 +2960,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 +3002,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 +3033,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 +3203,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 +3211,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 +3321,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 +3361,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 +3375,65 @@ 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 + dev: true + + /@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 +3445,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 +3472,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 +3498,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 +3508,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 +3578,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 +3633,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 +3719,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 +3728,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 +3793,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 +3833,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 +3861,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: @@ -2621,11 +3913,11 @@ packages: 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 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.0.5 jest-haste-map: 25.5.1 jest-resolve: 25.5.1 jest-util: 25.5.0 @@ -2650,24 +3942,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 +3969,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 +3979,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 +4055,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 +4098,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 +4114,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 @@ -2845,9 +4138,9 @@ packages: resolution: {integrity: sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==} engines: {node: '>= 8.3'} dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@jest/types': 25.5.0 - babel-plugin-istanbul: 6.0.0 + babel-plugin-istanbul: 6.1.1 chalk: 3.0.0 convert-source-map: 1.8.0 fast-json-stable-stringify: 2.1.0 @@ -2864,20 +4157,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 +4208,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 +4257,106 @@ 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/cli/13.2.3: + resolution: {integrity: sha512-4hrOYQ9MqhWOdjQTwuQqHTfPu8lYgdFCE39PVWAcePtoi67mUeba54HkyT6nkTHI1TbO7q8Kf+R73dRhhxDlpA==} + hasBin: true + dependencies: + '@nrwl/tao': 13.2.3 + 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/devkit/13.2.3: + resolution: {integrity: sha512-/cp8hFclOXSAjj9pwb6bOU8yw593HfelcCBi8o8Jhb0Luhn1RzLCOpmHNsOf2hWzSUPEr0BuI0R55ubCEB+k6A==} + dependencies: + '@nrwl/tao': 13.2.3 + 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 +4373,95 @@ 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/jest/13.2.3: + resolution: {integrity: sha512-M9/x0uZNSVKkcyNHcA2+Muj23KRo9SDiCsTb7HnkHhtSbhIWMd1knKP45bOr8CjeeiKNPeervx7uiN5516z8JA==} + dependencies: + '@jest/reporters': 27.2.2 + '@jest/test-result': 27.2.2 + '@nrwl/devkit': 13.2.3 + chalk: 4.1.0 + identity-obj-proxy: 3.0.0 + jest-config: 27.2.2 + jest-resolve: 27.2.2 + jest-util: 27.2.0 + resolve.exports: 1.1.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 + tslib: 2.3.1 + transitivePeerDependencies: + - bufferutil + - canvas + - node-notifier + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@nrwl/linter/13.2.3: + resolution: {integrity: sha512-kdzPWYzR96XYghJ5yIaYSybDrtcAcSxgcscwP1UWvME19O2W8DHbhIj3AzBgjSG0X6hBEh6k9kpyQ49jNkUMCw==} + dependencies: + '@nrwl/devkit': 13.2.3 + '@nrwl/jest': 13.2.3 + eslint: 7.32.0 glob: 7.1.4 minimatch: 3.0.4 tmp: 0.2.1 @@ -3043,15 +4492,166 @@ 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/tao/13.2.3: + resolution: {integrity: sha512-vn+GqvFVinqAXzvbHznPBtCg9OCfirh3hF68sZgY2C6jZ3m47XwST3mLTRSDTtSDy9QfUrSZ6p4uAk2Iht0yBQ==} + hasBin: true + dependencies: + chalk: 4.1.0 + enquirer: 2.3.6 + fs-extra: 9.1.0 + jsonc-parser: 3.0.0 + nx: 13.2.3 + 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 +4661,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.2.3_wp-prettier@2.2.1-beta-1: + resolution: {integrity: sha512-dFB6XXDLP4Nmh/Sw8Euwdt7f0tg1O6JxJNvXV2BfWG1rK3dmhTz4Q+8fgxl7AxsrToVrXDAh16mPyfAzpqH4pw==} + peerDependencies: + prettier: ^2.3.0 + peerDependenciesMeta: + prettier: + optional: true + dependencies: + '@nrwl/cli': 13.2.3 + '@nrwl/devkit': 13.2.3 + '@nrwl/jest': 13.2.3 + '@nrwl/linter': 13.2.3 + '@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 +4735,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 +4889,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 @@ -3191,7 +4962,7 @@ packages: postcss: '>=7.0.0' postcss-syntax: '>=0.36.2' dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 postcss: 7.0.39 postcss-syntax: 0.36.2_postcss@7.0.39 transitivePeerDependencies: @@ -3200,6 +4971,7 @@ packages: /@stylelint/postcss-markdown/0.36.2_4f7b71a942b8b7a555b8adf78f88122b: resolution: {integrity: sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==} + deprecated: 'Use the original unforked package instead: postcss-markdown' peerDependencies: postcss: '>=7.0.0' postcss-syntax: '>=0.36.2' @@ -3238,11 +5010,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 +5027,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 +5052,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 +5091,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 +5134,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 +5141,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 +5174,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 +5195,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 +5206,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 +5244,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 +5296,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 +5364,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 +5372,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 +5432,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 +5509,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 +5557,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 +5583,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 +5700,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 +5757,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 +5788,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 +5828,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 +5862,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 +5920,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 +5940,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 +5958,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 +5991,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 +6024,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 +6051,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 +6077,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 @@ -3961,11 +6107,12 @@ packages: engines: {node: '>=12'} dev: false - /@wordpress/deprecated/2.12.3: - resolution: {integrity: sha512-qr+yDfTQfI3M4h6oY6IeHWwoHr4jxbILjSlV+Ht6Jjto9Owap6OuzSqR13Ev4xqIoG4C7b5B3gZXVfwVDae1zg==} + /@wordpress/deprecated/3.2.3: + resolution: {integrity: sha512-YoJos/hW216PIlxbtNyb24kPR3TUFTSsfeVT23SxudW4jhmwM12vkl3KY1RDbhD/qi89OE4k+8xsBo5cM3lCSw==} + engines: {node: '>=12'} dependencies: - '@babel/runtime': 7.15.4 - '@wordpress/hooks': 2.12.3 + '@babel/runtime': 7.16.3 + '@wordpress/hooks': 3.2.2 dev: false /@wordpress/e2e-test-utils/3.0.0_jest@24.9.0+puppeteer@2.1.1: @@ -3975,7 +6122,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 +6150,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 +6160,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 +6211,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 +6246,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 +6265,21 @@ 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/hooks/3.2.2: + resolution: {integrity: sha512-MlFWyu2ttJhmzDFBVWPRwZwIMqQdHFZTjFWFWm50NlzUzIJ3gEtNA95mHNtav1Fone24N+I2YkaYMNb6PEPTyA==} + engines: {node: '>=12'} + dependencies: + '@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 +6294,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 +6323,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 +6341,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 +6372,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 +6393,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 +6416,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 +6533,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 +6577,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 +6600,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 +6668,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: @@ -4498,9 +6709,12 @@ packages: /array-equal/1.0.0: resolution: {integrity: sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=} - /array-find-index/1.0.2: - resolution: {integrity: sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=} - engines: {node: '>=0.10.0'} + /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: @@ -4578,8 +6792,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 @@ -4640,6 +6854,10 @@ packages: lodash: 4.17.21 dev: true + /async/3.1.1: + resolution: {integrity: sha512-X5Dj8hK1pJNC2Wzo2Rcp9FBVdJMGRR/S7V+lH46s8GVFhtbo5O4Le5GECCF/8PISVdkUA6mMPvgz7qTTD1rf1g==} + dev: true + /async/3.2.1: resolution: {integrity: sha512-XdD5lRO/87udXCMC9meWdYiR+Nq6ZjUfXidViUZGu2F1MO4T3XwZ1et0hb2++BgLfhyJwy44BGB/yx80ABx8hg==} dev: true @@ -4657,12 +6875,28 @@ 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 dependencies: - browserslist: 4.17.3 - caniuse-lite: 1.0.30001265 + browserslist: 4.18.1 + caniuse-lite: 1.0.30001280 colorette: 1.4.0 normalize-range: 0.1.2 num2fraction: 1.2.2 @@ -4681,17 +6915,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 +6967,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 +7003,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 +7034,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 +7062,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 @@ -4819,36 +7071,36 @@ packages: - supports-color dev: false - /babel-jest/25.5.1_@babel+core@7.15.8: + /babel-jest/25.5.1_@babel+core@7.16.0: resolution: {integrity: sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==} engines: {node: '>= 8.3'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@jest/transform': 25.5.1 '@jest/types': 25.5.0 '@types/babel__core': 7.1.16 - babel-plugin-istanbul: 6.0.0 - babel-preset-jest: 25.5.0_@babel+core@7.15.8 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 25.5.0_@babel+core@7.16.0 chalk: 3.0.0 graceful-fs: 4.2.8 slash: 3.0.0 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 +7108,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: @@ -4879,14 +7159,14 @@ packages: - supports-color dev: false - /babel-plugin-istanbul/6.0.0: - resolution: {integrity: sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==} + /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: 4.0.3 + istanbul-lib-instrument: 5.1.0 test-exclude: 6.0.0 transitivePeerDependencies: - supports-color @@ -4902,20 +7182,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 +7215,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 +7239,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 +7261,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==} @@ -4968,52 +7302,52 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 dev: false - /babel-preset-current-node-syntax/0.1.4_@babel+core@7.15.8: + /babel-preset-current-node-syntax/0.1.4_@babel+core@7.16.0: resolution: {integrity: sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==} 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/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-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 @@ -5028,25 +7362,25 @@ packages: babel-preset-current-node-syntax: 0.1.4_@babel+core@7.12.9 dev: false - /babel-preset-jest/25.5.0_@babel+core@7.15.8: + /babel-preset-jest/25.5.0_@babel+core@7.16.0: resolution: {integrity: sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==} engines: {node: '>= 8.3'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 babel-plugin-jest-hoist: 25.5.0 - babel-preset-current-node-syntax: 0.1.4_@babel+core@7.15.8 + babel-preset-current-node-syntax: 0.1.4_@babel+core@7.16.0 - /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 +7454,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: @@ -5143,13 +7486,6 @@ packages: dependencies: file-uri-to-path: 1.0.0 - /block-stream/0.0.9: - resolution: {integrity: sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=} - engines: {node: 0.4 || >=0.5.8} - dependencies: - inherits: 2.0.4 - dev: true - /bluebird/3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} dev: true @@ -5162,6 +7498,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 +7523,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==} @@ -5286,16 +7648,39 @@ packages: pako: 1.0.11 dev: true - /browserslist/4.17.3: - resolution: {integrity: sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ==} + /browserslist/4.14.5: + resolution: {integrity: sha512-Z+vsCZIvCBvqLoYkBFTwEYH3v5MCQbsAjp50ERycpOjnPmolg1Gjy4+KaWWpm8QOJt9GHkhdqAl14NpCX73CWA==} 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.30001280 + electron-to-chromium: 1.3.899 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 + dev: true + + /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 +7715,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 +7738,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 +7751,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: @@ -5420,14 +7829,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - /camelcase-keys/2.1.0: - resolution: {integrity: sha1-MIvur/3ygRkFHvodkyITyRuPkuc=} - engines: {node: '>=0.10.0'} - dependencies: - camelcase: 2.1.1 - map-obj: 1.0.1 - dev: true - /camelcase-keys/6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -5437,11 +7838,6 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase/2.1.1: - resolution: {integrity: sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=} - engines: {node: '>=0.10.0'} - dev: true - /camelcase/4.1.0: resolution: {integrity: sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=} engines: {node: '>=4'} @@ -5451,13 +7847,30 @@ 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-lite/1.0.30001265: - resolution: {integrity: sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw==} + /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.30001146: + resolution: {integrity: sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==} + dev: true + + /caniuse-lite/1.0.30001278: + resolution: {integrity: sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==} + dev: true + + /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==} @@ -5650,6 +8063,11 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: true + /chownr/2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: true + /chrome-trace-event/1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -5764,6 +8182,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 +8234,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 +8278,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 +8303,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 +8335,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 +8365,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 +8382,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 +8403,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 +8431,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 +8469,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 +8479,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 +8504,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 +8559,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'} @@ -6029,13 +8571,6 @@ packages: cross-spawn: 7.0.3 dev: true - /cross-spawn/3.0.1: - resolution: {integrity: sha1-ElYDfsufDF9549bvE14wdwGEuYI=} - dependencies: - lru-cache: 4.1.5 - which: 1.3.1 - dev: true - /cross-spawn/5.1.0: resolution: {integrity: sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=} dependencies: @@ -6083,6 +8618,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 +8688,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 +8715,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,17 +8860,10 @@ 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: - resolution: {integrity: sha1-mI3zP+qxke95mmE2nddsF635V+o=} - engines: {node: '>=0.10.0'} - dependencies: - array-find-index: 1.0.2 - dev: true - /cwd/0.10.0: resolution: {integrity: sha1-FyQAaUBXwioTsM8WFix+S3p/5Wc=} engines: {node: '>=0.8'} @@ -6193,6 +8924,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 +8985,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 +9008,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 +9022,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 +9066,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 +9088,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 +9100,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 +9125,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 +9152,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 +9176,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 +9219,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 +9255,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 +9269,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 +9304,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 +9327,12 @@ 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==} + dev: true + + /electron-to-chromium/1.3.899: + resolution: {integrity: sha512-w16Dtd2zl7VZ4N4Db+FIa7n36sgPGCKjrKvUUmp5ialsikvcQLjcJR9RWnlYNxIyEHLdHaoIZEqKsPxU9MdyBg==} /elegant-spinner/1.0.1: resolution: {integrity: sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=} @@ -6541,11 +9366,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 +9401,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'} @@ -6580,6 +9423,11 @@ packages: /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + /env-paths/2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: true + /enzyme-adapter-react-16/1.15.6_enzyme@3.11.0: resolution: {integrity: sha512-yFlVJCXh8T+mcQo8M6my9sPgeGzj85HSHi6Apgf1Cvq/7EL/J9+1JoJmJsRxZgyTvPMAqOEpRSu/Ii/ZpyOk0g==} peerDependencies: @@ -6662,6 +9510,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 +9520,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 +9561,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 +9587,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 +9622,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 +9639,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 +9676,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 +9697,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 +9720,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 +9750,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 +9786,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 +9824,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 +9838,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 +9916,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 +9925,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 +9934,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 +9975,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 +9984,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 +9998,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 +10049,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 +10080,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,12 +10109,17 @@ 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} 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 @@ -7260,7 +10164,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 +10276,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 +10293,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 +10420,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 +10438,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 +10453,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 +10490,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 +10651,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 +10798,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 +10853,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 +10904,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 +10926,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'} @@ -7857,14 +10961,6 @@ packages: - supports-color dev: false - /find-up/1.1.2: - resolution: {integrity: sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=} - engines: {node: '>=0.10.0'} - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - dev: true - /find-up/2.1.0: resolution: {integrity: sha1-RdG35QbHF93UgndaK3eSCjwMV6c=} engines: {node: '>=4'} @@ -7885,6 +10981,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 +11057,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 +11076,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 +11087,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 +11128,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 +11161,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 +11170,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 +11208,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 +11227,17 @@ packages: universalify: 2.0.0 dev: true + /fs-minipass/2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.5 + 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==} @@ -8123,16 +11280,6 @@ packages: requiresBuild: true optional: true - /fstream/1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - dependencies: - graceful-fs: 4.2.8 - inherits: 2.0.4 - mkdirp: 0.5.5 - rimraf: 2.7.1 - dev: true - /function-bind/1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} @@ -8173,6 +11320,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 +11431,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 +11573,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 +11620,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 @@ -8596,6 +11781,14 @@ packages: which: 2.0.2 dev: true + /grunt-move/1.0.3: + resolution: {integrity: sha512-hzfoRZZeq04bOz/iOgUNhza3T3ahd6yw86+bAZtCNfXLcg3z5QWaaow/cbV0SGdlb19VuG5bbKHUdK+NtseoiA==} + engines: {node: '>=6'} + dependencies: + async: 3.1.1 + chalk: 2.4.2 + dev: true + /grunt-newer/1.3.0_grunt@1.3.0: resolution: {integrity: sha1-g8y3od2ny9irI7BZAk6+YUrS80I=} engines: {node: '>= 0.8.0'} @@ -8641,14 +11834,14 @@ packages: grunt: 1.3.0 dev: true - /grunt-stylelint/0.16.0_stylelint@13.13.1: + /grunt-stylelint/0.16.0_stylelint@13.8.0: resolution: {integrity: sha512-ullm0h9iCdgPEDq1TNwKL5HteXA4zke6wbYoRtsO32ATCU3zfUXmDN9unhu+joEcdgJKOPcd2+7UhRNXO1rr+w==} engines: {node: '>=10'} peerDependencies: stylelint: ^13.8.0 dependencies: chalk: 4.1.2 - stylelint: 13.13.1 + stylelint: 13.8.0 dev: true /grunt/1.3.0: @@ -8692,6 +11885,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 +12041,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 +12069,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 +12101,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 +12152,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 +12277,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 +12314,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 +12349,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'} @@ -9058,18 +12386,6 @@ packages: resolution: {integrity: sha1-khi5srkoojixPcT7a21XbyMUU+o=} engines: {node: '>=0.8.19'} - /in-publish/2.0.1: - resolution: {integrity: sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==} - hasBin: true - dev: true - - /indent-string/2.1.0: - resolution: {integrity: sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=} - engines: {node: '>=0.10.0'} - dependencies: - repeating: 2.0.1 - dev: true - /indent-string/3.2.0: resolution: {integrity: sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=} engines: {node: '>=4'} @@ -9141,6 +12457,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 +12493,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 +12548,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 +12577,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,15 +12614,15 @@ 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 dev: true - /is-core-module/2.7.0: - resolution: {integrity: sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==} + /is-core-module/2.8.0: + resolution: {integrity: sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==} dependencies: has: 1.0.3 @@ -9377,6 +12740,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 +12815,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 +12844,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 +12874,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'} @@ -9610,8 +13004,8 @@ packages: engines: {node: '>=6'} dev: false - /istanbul-lib-coverage/3.0.1: - resolution: {integrity: sha512-GvCYYTxaCPqwMjobtVcVKvSHtAGe48MNhGjpK8LtVF8K0ISX7hCKl85LgtuaSneWVyQmaGcW3iXVV3GaZSLpmQ==} + /istanbul-lib-coverage/3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} engines: {node: '>=8'} /istanbul-lib-hook/1.2.2: @@ -9636,11 +13030,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 +13045,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 +13086,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 @@ -9707,12 +13113,12 @@ packages: - supports-color dev: false - /istanbul-lib-source-maps/4.0.0: - resolution: {integrity: sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==} - engines: {node: '>=8'} + /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.0.1 + istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: - supports-color @@ -9730,8 +13136,8 @@ packages: html-escaper: 2.0.2 dev: false - /istanbul-reports/3.0.3: - resolution: {integrity: sha512-0i77ZFLsb9U3DHi22WzmIngVzfoyxxbQcZRqlF3KoKmCJGq9nhFHoGi8FqBztN2rE8w6hURnZghetn0xpkVb6A==} + /istanbul-reports/3.0.5: + resolution: {integrity: sha512-5+19PlhnGabNWB7kOFnuxT8H3T/iIyQzIbQMxXsURmmvKg86P2sbkrGOT77VnHw0Qr0gc2XzRaRfMZYYbSQCJQ==} engines: {node: '>=8'} dependencies: html-escaper: 2.0.2 @@ -9778,35 +13184,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 +13235,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 +13267,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 +13277,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 +13301,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 @@ -9920,10 +13326,10 @@ packages: resolution: {integrity: sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==} engines: {node: '>= 8.3'} dependencies: - '@babel/core': 7.15.8 + '@babel/core': 7.16.0 '@jest/test-sequencer': 25.5.4 '@jest/types': 25.5.0 - babel-jest: 25.5.1_@babel+core@7.15.8 + babel-jest: 25.5.1_@babel+core@7.16.0 chalk: 3.0.0 deepmerge: 4.2.2 glob: 7.2.0 @@ -9954,27 +13360,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 +13388,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 +13397,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 +13469,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 +13505,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 +13556,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 +13596,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 +13638,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 +13674,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 +13693,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 @@ -10268,16 +13712,16 @@ packages: jest-worker: 25.5.0 micromatch: 4.0.4 sane: 4.1.0 - walker: 1.0.7 + walker: 1.0.8 which: 2.0.2 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 +13729,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 +13741,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 +13765,7 @@ packages: resolution: {integrity: sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==} engines: {node: '>= 8.3'} dependencies: - '@babel/traverse': 7.15.4 + '@babel/traverse': 7.16.3 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -10344,27 +13788,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 +13829,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 +13865,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 +13893,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 +13916,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 +13951,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 +13994,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 +14003,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 +14052,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 +14092,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 +14184,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 +14286,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 +14305,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 +14343,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 +14362,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 +14378,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 +14453,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 +14496,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 +14532,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 +14560,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 +14594,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 +14604,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 +14641,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 +14823,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 +14885,15 @@ 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.20.0: + resolution: {integrity: sha512-URvsjaA9ypfreqJ2/ylDr5MUERhJZ+DhguoWRr2xgS5C7aGCalXo+ewL+GixgKBfhT2vuL02nbIgNGqVWgTOYw==} + dev: true + /known-css-properties/0.21.0: resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==} dev: true @@ -11476,6 +14930,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 +14977,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 +14998,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=} @@ -11593,17 +15087,6 @@ packages: resolution: {integrity: sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw==} dev: true - /load-json-file/1.1.0: - resolution: {integrity: sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.8 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - dev: true - /load-json-file/4.0.0: resolution: {integrity: sha1-L19Fq5HjMhYjT9U62rZo607AmTs=} engines: {node: '>=4'} @@ -11618,6 +15101,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 +15124,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 +15154,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 +15203,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==} @@ -11735,14 +15256,6 @@ packages: dependencies: js-tokens: 4.0.0 - /loud-rejection/1.6.0: - resolution: {integrity: sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=} - engines: {node: '>=0.10.0'} - dependencies: - currently-unhandled: 0.4.1 - signal-exit: 3.0.5 - dev: true - /lowercase-keys/1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -11767,6 +15280,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 +15296,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 @@ -11798,8 +15318,8 @@ packages: kind-of: 6.0.3 dev: true - /makeerror/1.0.11: - resolution: {integrity: sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=} + /makeerror/1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} dependencies: tmpl: 1.0.5 @@ -11877,6 +15397,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 @@ -11901,20 +15437,21 @@ packages: engines: {node: '>= 0.10.0'} dev: true - /meow/3.7.0: - resolution: {integrity: sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=} - engines: {node: '>=0.10.0'} + /meow/8.1.2: + resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} + engines: {node: '>=10'} dependencies: - camelcase-keys: 2.1.0 - decamelize: 1.2.0 - loud-rejection: 1.6.0 - map-obj: 1.0.1 - minimist: 1.2.5 - normalize-package-data: 2.5.0 - object-assign: 4.1.1 - read-pkg-up: 1.0.1 - redent: 1.0.0 - trim-newlines: 1.0.0 + '@types/minimist': 1.2.2 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.0 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 3.0.3 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.18.1 + yargs-parser: 20.2.9 dev: true /meow/9.0.0: @@ -11944,6 +15481,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 +15500,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 +15548,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 +15565,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 +15596,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 @@ -12079,6 +15640,21 @@ packages: /minimist/1.2.5: resolution: {integrity: sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==} + /minipass/3.1.5: + resolution: {integrity: sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: true + + /minizlib/2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.1.5 + yallist: 4.0.0 + dev: true + /mississippi/3.0.0: resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==} engines: {node: '>=4.0.0'} @@ -12171,14 +15747,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 +15761,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 +15783,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 +15805,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 +15845,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,28 +15886,31 @@ 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 dev: true - /node-gyp/3.8.0: - resolution: {integrity: sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==} - engines: {node: '>= 0.8.0'} + /node-gyp/7.1.2: + resolution: {integrity: sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==} + engines: {node: '>= 10.12.0'} hasBin: true dependencies: - fstream: 1.0.12 + env-paths: 2.2.1 glob: 7.2.0 graceful-fs: 4.2.8 - mkdirp: 0.5.5 - nopt: 3.0.6 + nopt: 5.0.0 npmlog: 4.1.2 - osenv: 0.1.5 request: 2.88.2 - rimraf: 2.7.1 - semver: 5.3.0 - tar: 2.2.2 - which: 1.3.1 + rimraf: 3.0.2 + semver: 7.3.5 + tar: 6.1.11 + which: 2.0.2 dev: true /node-int64/0.4.0: @@ -12379,25 +15979,27 @@ packages: /node-releases/1.1.77: resolution: {integrity: sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==} + dev: true - /node-sass/4.14.1: - resolution: {integrity: sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==} - engines: {node: '>=0.10.0'} + /node-releases/2.0.1: + resolution: {integrity: sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==} + + /node-sass/6.0.1: + resolution: {integrity: sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==} + engines: {node: '>=12'} hasBin: true requiresBuild: true dependencies: async-foreach: 0.1.3 chalk: 1.1.3 - cross-spawn: 3.0.1 + cross-spawn: 7.0.3 gaze: 1.1.3 get-stdin: 4.0.1 glob: 7.2.0 - in-publish: 2.0.1 lodash: 4.17.21 - meow: 3.7.0 - mkdirp: 0.5.5 + meow: 9.0.0 nan: 2.15.0 - node-gyp: 3.8.0 + node-gyp: 7.1.2 npmlog: 4.1.2 request: 2.88.2 sass-graph: 2.2.5 @@ -12424,6 +16026,14 @@ packages: osenv: 0.1.5 dev: true + /nopt/5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: true + /normalize-package-data/2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -12437,7 +16047,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.0.2 - is-core-module: 2.7.0 + is-core-module: 2.8.0 semver: 7.3.5 validate-npm-package-license: 3.0.4 dev: true @@ -12461,6 +16071,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 +16088,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 +16124,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 +16141,21 @@ packages: resolution: {integrity: sha512-LpCfZCWsVEtmD2SI1j2KRaw1uIyn4DJ3eRzsjnDYitbq38aORpkvYO+L0zVMZRNDSYSRGTsuj0nHCS3OOxK/Cg==} hasBin: true dependencies: - '@nrwl/cli': 12.10.0 + '@nrwl/cli': 13.2.3 + dev: true + + /nx/13.1.4: + resolution: {integrity: sha512-m2j3wymaFlEl/7EoGxlgRzdmgQV1Rsh42df1cM8xFzAzV8ZGtR3Zq19qK7r9SUabpq8jMzp1e6rLQTHewCJWig==} + hasBin: true + dependencies: + '@nrwl/cli': 13.2.3 + dev: true + + /nx/13.2.3: + resolution: {integrity: sha512-aNRbPjArROZazOKAiUhG5uZAZmL1uXdsGoA3p5mDt5fCLSj/CX1V/myuRx+Js0qsAV78W6dSf2z6TiQeIgieXg==} + hasBin: true + dependencies: + '@nrwl/cli': 13.2.3 dev: true /oauth-1.0a/2.2.6: @@ -12558,7 +16186,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 +16279,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 +16321,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 +16400,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 +16428,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 +16454,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 +16473,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 +16498,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=} @@ -12890,13 +16572,6 @@ packages: path-root: 0.1.1 dev: true - /parse-json/2.2.0: - resolution: {integrity: sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=} - engines: {node: '>=0.10.0'} - dependencies: - error-ex: 1.3.2 - dev: true - /parse-json/4.0.0: resolution: {integrity: sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=} engines: {node: '>=4'} @@ -12908,7 +16583,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 +16592,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 +16620,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'} @@ -12945,13 +16637,6 @@ packages: resolution: {integrity: sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=} optional: true - /path-exists/2.1.0: - resolution: {integrity: sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=} - engines: {node: '>=0.10.0'} - dependencies: - pinkie-promise: 2.0.1 - dev: true - /path-exists/3.0.0: resolution: {integrity: sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=} engines: {node: '>=4'} @@ -12991,13 +16676,8 @@ packages: path-root-regex: 0.1.2 dev: true - /path-type/1.1.0: - resolution: {integrity: sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=} - engines: {node: '>=0.10.0'} - dependencies: - graceful-fs: 4.2.8 - pify: 2.3.0 - pinkie-promise: 2.0.1 + /path-to-regexp/0.1.7: + resolution: {integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=} dev: true /path-type/3.0.0: @@ -13037,6 +16717,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,16 +16745,9 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - /pinkie-promise/2.0.1: - resolution: {integrity: sha1-ITXW36ejWMBprJsXh3YogihFD/o=} - engines: {node: '>=0.10.0'} - dependencies: - pinkie: 2.0.4 - dev: true - - /pinkie/2.0.4: - resolution: {integrity: sha1-clVrgM+g1IqXToDnckjoDtT3+HA=} - engines: {node: '>=0.10.0'} + /pify/5.0.0: + resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} + engines: {node: '>=10'} dev: true /pirates/4.0.1: @@ -13098,13 +16775,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 +16784,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 +16946,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 +16965,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 +17484,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 +17514,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 +17557,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 +17655,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 +17681,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 +17693,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 +17715,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 +17808,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 +17832,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 +17888,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 +17901,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 +17957,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,20 +17981,10 @@ packages: object-assign: 4.1.1 dev: false - /read-pkg-up/1.0.1: - resolution: {integrity: sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=} - engines: {node: '>=0.10.0'} + /read-cache/1.0.0: + resolution: {integrity: sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=} dependencies: - find-up: 1.1.2 - 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 + pify: 2.3.0 dev: true /read-pkg-up/4.0.0: @@ -13584,15 +18003,6 @@ packages: read-pkg: 5.2.0 type-fest: 0.8.1 - /read-pkg/1.1.0: - resolution: {integrity: sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=} - engines: {node: '>=0.10.0'} - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - dev: true - /read-pkg/3.0.0: resolution: {integrity: sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=} engines: {node: '>=4'} @@ -13669,14 +18079,6 @@ packages: resolve: 1.20.0 dev: true - /redent/1.0.0: - resolution: {integrity: sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=} - engines: {node: '>=0.10.0'} - dependencies: - indent-string: 2.1.0 - strip-indent: 1.0.1 - dev: true - /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -13708,7 +18110,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 +18255,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 +18281,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 +18329,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 +18372,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 +18402,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 +18536,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 +18566,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 +18578,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 +18647,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 +18681,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 @@ -14155,11 +18711,6 @@ packages: engines: {node: '>=6'} dev: true - /semver/5.3.0: - resolution: {integrity: sha1-myzl094C0XxgEq0yaqa00M9U+U8=} - hasBin: true - dev: true - /semver/5.7.1: resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} hasBin: true @@ -14187,12 +18738,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 +18808,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 +18833,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 +18860,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 +18937,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 +18975,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 +19010,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 +19029,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 +19038,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 +19091,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 +19107,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 +19123,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 +19134,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 +19182,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 +19344,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'} @@ -14674,14 +19374,6 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} - /strip-indent/1.0.1: - resolution: {integrity: sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=} - engines: {node: '>=0.10.0'} - hasBin: true - dependencies: - get-stdin: 4.0.1 - dev: true - /strip-indent/3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -14698,10 +19390,56 @@ 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_748c5b2cfae76328890a14c0b5cd0d73: + resolution: {integrity: sha512-/noGjXlO8pJTr/Z3qGMoaRFK8n1BFfOqmAbX1RjTIcl4Yalr+LUb1zb9iQ7pRx1GsEBXOAm4g2z5/jou/pfMPg==} + peerDependencies: + stylelint: ^10.1.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + stylelint-scss: ^3.0.0 + dependencies: + stylelint: 13.8.0 + stylelint-config-recommended: 5.0.0_stylelint@13.8.0 + stylelint-scss: 3.21.0_stylelint@13.8.0 + dev: true + /stylelint-config-recommended-scss/4.3.0_d55469ff7b1b68c43b61270d19a60ab6: resolution: {integrity: sha512-/noGjXlO8pJTr/Z3qGMoaRFK8n1BFfOqmAbX1RjTIcl4Yalr+LUb1zb9iQ7pRx1GsEBXOAm4g2z5/jou/pfMPg==} peerDependencies: @@ -14721,6 +19459,14 @@ packages: stylelint: 13.13.1 dev: true + /stylelint-config-recommended/3.0.0_stylelint@13.8.0: + resolution: {integrity: sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==} + peerDependencies: + stylelint: '>=10.1.0' + dependencies: + stylelint: 13.8.0 + dev: true + /stylelint-config-recommended/5.0.0_stylelint@13.13.1: resolution: {integrity: sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==} peerDependencies: @@ -14729,6 +19475,14 @@ packages: stylelint: 13.13.1 dev: true + /stylelint-config-recommended/5.0.0_stylelint@13.8.0: + resolution: {integrity: sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==} + peerDependencies: + stylelint: ^13.13.0 + dependencies: + stylelint: 13.8.0 + dev: true + /stylelint-config-wordpress/17.0.0_stylelint@13.13.1: resolution: {integrity: sha512-qUU2kVMd2ezIV9AzRdgietIfnavRRENt4180A1OMoVXIowRjjhohZgBiyVPV5EtNKo3GTO63l8g/QGNG27/h9g==} engines: {node: '>=10'} @@ -14742,6 +19496,19 @@ packages: stylelint-scss: 3.21.0_stylelint@13.13.1 dev: true + /stylelint-config-wordpress/17.0.0_stylelint@13.8.0: + resolution: {integrity: sha512-qUU2kVMd2ezIV9AzRdgietIfnavRRENt4180A1OMoVXIowRjjhohZgBiyVPV5EtNKo3GTO63l8g/QGNG27/h9g==} + engines: {node: '>=10'} + deprecated: This package has been deprecated, please use @wordpress/stylelint-config or @wordpress/scripts + peerDependencies: + stylelint: ^10.1.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + dependencies: + stylelint: 13.8.0 + stylelint-config-recommended: 3.0.0_stylelint@13.8.0 + stylelint-config-recommended-scss: 4.3.0_748c5b2cfae76328890a14c0b5cd0d73 + stylelint-scss: 3.21.0_stylelint@13.8.0 + dev: true + /stylelint-scss/3.21.0_stylelint@13.13.1: resolution: {integrity: sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==} engines: {node: '>=8'} @@ -14756,6 +19523,20 @@ packages: stylelint: 13.13.1 dev: true + /stylelint-scss/3.21.0_stylelint@13.8.0: + resolution: {integrity: sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==} + engines: {node: '>=8'} + peerDependencies: + stylelint: ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 + dependencies: + lodash: 4.17.21 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-selector-parser: 6.0.6 + postcss-value-parser: 4.1.0 + stylelint: 13.8.0 + dev: true + /stylelint/13.13.1: resolution: {integrity: sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==} engines: {node: '>=10.13.0'} @@ -14813,6 +19594,91 @@ packages: - supports-color dev: true + /stylelint/13.8.0: + resolution: {integrity: sha512-iHH3dv3UI23SLDrH4zMQDjLT9/dDIz/IpoFeuNxZmEx86KtfpjDOscxLTFioQyv+2vQjPlRZnK0UoJtfxLICXQ==} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@stylelint/postcss-css-in-js': 0.37.2_4f7b71a942b8b7a555b8adf78f88122b + '@stylelint/postcss-markdown': 0.36.2_4f7b71a942b8b7a555b8adf78f88122b + autoprefixer: 9.8.6 + balanced-match: 1.0.2 + chalk: 4.1.2 + cosmiconfig: 7.0.1 + debug: 4.3.2 + execall: 2.0.0 + fast-glob: 3.2.7 + fastest-levenshtein: 1.0.12 + file-entry-cache: 6.0.1 + get-stdin: 8.0.0 + global-modules: 2.0.0 + globby: 11.0.4 + globjoin: 0.1.4 + html-tags: 3.1.0 + ignore: 5.1.9 + import-lazy: 4.0.0 + imurmurhash: 0.1.4 + known-css-properties: 0.20.0 + lodash: 4.17.21 + log-symbols: 4.1.0 + mathml-tag-names: 2.1.3 + meow: 8.1.2 + micromatch: 4.0.4 + normalize-selector: 0.2.0 + postcss: 7.0.39 + postcss-html: 0.36.0_4f7b71a942b8b7a555b8adf78f88122b + postcss-less: 3.1.4 + postcss-media-query-parser: 0.2.3 + postcss-resolve-nested-selector: 0.1.1 + postcss-safe-parser: 4.0.2 + postcss-sass: 0.4.4 + postcss-scss: 2.1.1 + postcss-selector-parser: 6.0.6 + postcss-syntax: 0.36.2_postcss@7.0.39 + postcss-value-parser: 4.1.0 + resolve-from: 5.0.0 + slash: 3.0.0 + specificity: 0.4.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + style-search: 0.1.0 + sugarss: 2.0.0 + svg-tags: 1.0.0 + table: 6.7.3 + v8-compile-cache: 2.3.0 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - 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 +19769,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 +19812,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,13 +19834,21 @@ packages: 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. + /tapable/2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar/6.1.11: + resolution: {integrity: sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==} + engines: {node: '>= 10'} dependencies: - block-stream: 0.0.9 - fstream: 1.0.12 - inherits: 2.0.4 + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 3.1.5 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 dev: true /term-size/1.2.0: @@ -14984,6 +19883,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 +19955,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 +20028,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 +20044,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 +20116,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'} @@ -15161,11 +20166,6 @@ packages: hasBin: true dev: false - /trim-newlines/1.0.0: - resolution: {integrity: sha1-WIeWa7WCpFA6QetST301ARgVphM=} - engines: {node: '>=0.10.0'} - dev: true - /trim-newlines/3.0.1: resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} engines: {node: '>=8'} @@ -15186,15 +20186,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 +20197,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 +20259,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 +20286,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 +20347,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 +20375,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 +20446,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 +20498,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 +20550,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 +20597,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 +20645,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} @@ -15636,10 +20721,10 @@ packages: - supports-color dev: false - /walker/1.0.7: - resolution: {integrity: sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=} + /walker/1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: - makeerror: 1.0.11 + makeerror: 1.0.12 /watchpack-chokidar2/2.0.1: resolution: {integrity: sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==} @@ -15659,6 +20744,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 +20795,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 +20873,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 +20931,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 +21081,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 +21099,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 +21224,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 +21362,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 +21395,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..d4c86ced11c --- /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(); + $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 ) { + $significance = $change->getSignificance(); + $breaking_change = 'major' === $significance ? ' [ **BREAKING CHANGE** ]' : ''; + $text = trim( $change->getContent() ); + if ( '' !== $text ) { + $preamble = $is_subentry ? '' : $bullet . ucfirst( $significance ) . $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 @@ +