From 33b2bdc0cd31824a62acdacd724820a9ae66c2f5 Mon Sep 17 00:00:00 2001 From: Florian DANIEL aka Facyla Date: Fri, 23 Sep 2022 12:47:44 +0200 Subject: [PATCH 0001/1680] Error message in logs on CSV export error Provide a useful feedback message when CSV export fails due to wrong permissions on wp-content/upload/ folder (or any other folder set by WC CSV Exporter module). This helps understand why CSV export fails under some conditions, by providing a hint on the error cause, instead of silently failing. --- .../includes/export/abstract-wc-csv-batch-exporter.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/woocommerce/includes/export/abstract-wc-csv-batch-exporter.php b/plugins/woocommerce/includes/export/abstract-wc-csv-batch-exporter.php index d65f36bed17..e6f518d269d 100644 --- a/plugins/woocommerce/includes/export/abstract-wc-csv-batch-exporter.php +++ b/plugins/woocommerce/includes/export/abstract-wc-csv-batch-exporter.php @@ -127,6 +127,7 @@ abstract class WC_CSV_Batch_Exporter extends WC_CSV_Exporter { protected function write_csv_data( $data ) { if ( ! file_exists( $this->get_file_path() ) || ! is_writeable( $this->get_file_path() ) ) { + error_log(__("ERROR : Cannot create temporary CSV export file : please check permissions on upload directory.", 'woocommerce')); return false; } From 29c9dfce165ea3a18a67f77e31e080b0e1fe1b37 Mon Sep 17 00:00:00 2001 From: Dion Hulse Date: Mon, 10 Oct 2022 09:45:50 +1000 Subject: [PATCH 0002/1680] Get the first array item for the alt_text. Props galbaras --- plugins/woocommerce/includes/wc-product-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/wc-product-functions.php b/plugins/woocommerce/includes/wc-product-functions.php index 188c8096d44..222ad109eb2 100644 --- a/plugins/woocommerce/includes/wc-product-functions.php +++ b/plugins/woocommerce/includes/wc-product-functions.php @@ -819,7 +819,7 @@ function wc_get_product_attachment_props( $attachment_id = null, $product = fals } $alt_text = array_filter( $alt_text ); - $props['alt'] = isset( $alt_text[0] ) ? $alt_text[0] : ''; + $props['alt'] = $alt_text ? reset( $alt_text ) : ''; // Large version. $full_size = apply_filters( 'woocommerce_gallery_full_size', apply_filters( 'woocommerce_product_thumbnails_large_size', 'full' ) ); From 2a034c0df4108e7e954a71d3a8917b2b54f79485 Mon Sep 17 00:00:00 2001 From: Phill <38789408+SavPhill@users.noreply.github.com> Date: Sat, 15 Oct 2022 15:43:52 +0700 Subject: [PATCH 0003/1680] Update tooltip text The tooltip for the Header Image field currently reads: "URL to an image you want to show in the email header. Upload images using the media uploader (Admin > Media)." I believe my small edit to the description text makes it more clearer for how the user should do this. --- .../includes/admin/settings/class-wc-settings-emails.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/admin/settings/class-wc-settings-emails.php b/plugins/woocommerce/includes/admin/settings/class-wc-settings-emails.php index 9086d7fd8b8..36705f13c50 100644 --- a/plugins/woocommerce/includes/admin/settings/class-wc-settings-emails.php +++ b/plugins/woocommerce/includes/admin/settings/class-wc-settings-emails.php @@ -120,7 +120,7 @@ class WC_Settings_Emails extends WC_Settings_Page { array( 'title' => __( 'Header image', 'woocommerce' ), - 'desc' => __( 'URL to an image you want to show in the email header. Upload images using the media uploader (Admin > Media).', 'woocommerce' ), + 'desc' => __( 'Paste the URL of an image you want to show in the email header. Upload images using the media uploader (Media > Add New).', 'woocommerce' ), 'id' => 'woocommerce_email_header_image', 'type' => 'text', 'css' => 'min-width:400px;', From 7daf26ce39f51ac2a7f50fa684b37987fd8d8d2e Mon Sep 17 00:00:00 2001 From: Jon Lane Date: Mon, 24 Oct 2022 15:44:13 -0700 Subject: [PATCH 0004/1680] Update e2e test command for consistency --- plugins/woocommerce/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index bddcf4c5ef0..1942d54bc0f 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -31,7 +31,7 @@ "docker:up": "pnpm exec wc-e2e docker:up", "env:dev": "pnpm wp-env start", "env:test": "pnpm run env:dev && ./tests/e2e-pw/bin/test-env-setup.sh", - "e2e-pw": "USE_WP_ENV=1 pnpm playwright test --config=tests/e2e-pw/playwright.config.js", + "test:e2e-pw": "USE_WP_ENV=1 pnpm playwright test --config=tests/e2e-pw/playwright.config.js", "env:test:cot": "pnpm run env:dev && ./tests/e2e-pw/bin/test-env-setup.sh --cot", "env:performance-init": "./tests/performance/bin/init-sample-products.sh", "env:down": "pnpm wp-env stop", From e916ac3fcaa2f1ce4b6fdcc6a85aee36648610de Mon Sep 17 00:00:00 2001 From: Jon Lane Date: Mon, 24 Oct 2022 15:51:13 -0700 Subject: [PATCH 0005/1680] README update --- plugins/woocommerce/tests/e2e-pw/README.md | 113 ++++++++++----------- 1 file changed, 54 insertions(+), 59 deletions(-) diff --git a/plugins/woocommerce/tests/e2e-pw/README.md b/plugins/woocommerce/tests/e2e-pw/README.md index 5016e479715..cc63c6a0d0d 100644 --- a/plugins/woocommerce/tests/e2e-pw/README.md +++ b/plugins/woocommerce/tests/e2e-pw/README.md @@ -4,22 +4,22 @@ This is the documentation for the new e2e testing setup based on Playwright and ## Table of contents -- [Pre-requisites](#pre-requisites) -- [Introduction](#introduction) -- [About the Environment](#about-the-environment) -- [Test Variables](#test-variables) -- [Guide for writing e2e tests](#guide-for-writing-e2e-tests) - - [Tools for writing tests](#tools-for-writing-tests) - - [Creating test structure](#creating-test-structure) - - [Writing the test](#writing-the-test) -- [Debugging tests](#debugging-tests) +- [Pre-requisites](#pre-requisites) +- [Introduction](#introduction) +- [About the Environment](#about-the-environment) +- [Test Variables](#test-variables) +- [Guide for writing e2e tests](#guide-for-writing-e2e-tests) + - [Tools for writing tests](#tools-for-writing-tests) + - [Creating test structure](#creating-test-structure) + - [Writing the test](#writing-the-test) +- [Debugging tests](#debugging-tests) ## Pre-requisites -- Node.js ([Installation instructions](https://nodejs.org/en/download/)) -- NVM ([Installation instructions](https://github.com/nvm-sh/nvm)) -- PNPM ([Installation instructions](https://pnpm.io/installation)) -- Docker and Docker Compose ([Installation instructions](https://docs.docker.com/engine/install/)) +- Node.js ([Installation instructions](https://nodejs.org/en/download/)) +- NVM ([Installation instructions](https://github.com/nvm-sh/nvm)) +- PNPM ([Installation instructions](https://pnpm.io/installation)) +- Docker and Docker Compose ([Installation instructions](https://docs.docker.com/engine/install/)) Note, that if you are on Mac and you install docker through other methods such as homebrew, for example, your steps to set it up might be different. The commands listed in steps below may also vary. @@ -31,22 +31,24 @@ End-to-end tests are powered by Playwright. The test site is spinned up using `w **Running tests for the first time:** -- `nvm use` -- `pnpm install` -- `pnpm run build --filter=woocommerce` -- `pnpm env:test --filter=woocommerce` +- `nvm use` +- `pnpm install` +- `pnpm run build --filter=woocommerce` +- `cd plugins/woocommerce` +- `pnpm env:test` +- `pnpm test:e2e-pw` To run the test again, re-create the environment to start with a fresh state: -- `pnpm env:destroy --filter=woocommerce` -- `pnpm env:test --filter=woocommerce` +- `pnpm env:destroy` +- `pnpm env:test` Other ways of running tests: -- `pnpm env:test --filter=woocommerce` (headless) -- `cd plugin/woocommerce && USE_WP_ENV=1 pnpm playwright test --config=tests/e2e-pw/playwright.config.js --headed` (headed) -- `cd plugins/woocommerce && USE_WP_ENV=1 pnpm playwright test --config=tests/e2e-pw/playwright.config.js --debug` (debug) -- `cd plugins/woocommerce && USE_WP_ENV=1 pnpm playwright test --config=tests/e2e-pw/playwright.config.js ./tests/e2e-pw/tests/activate-and-setup/basic-setup.spec.js` (running a single test) +- `pnpm test:e2e-pw` (usual, headless run) +- `pnpm test:e2e-pw --headed` (headed -- browser window shown) +- `pnpm test:e2e-pw --debug` (runs tests in debug mode) +- `pnpm test:e2e-pw ./tests/e2e-pw/tests/activate-and-setup/basic-setup.spec.js` (runs a single test) To see all options, run `cd plugins/woocommerce && pnpm playwright test --help` @@ -54,15 +56,14 @@ To see all options, run `cd plugins/woocommerce && pnpm playwright test --help` The default values are: -- Latest stable WordPress version -- PHP 7.4 -- MariaDB -- URL: `http://localhost:8086/` -- Admin credentials: `admin/password` +- Latest stable WordPress version +- PHP 7.4 +- MariaDB +- URL: `http://localhost:8086/` +- Admin credentials: `admin/password` If you want to customize these, check the [Test Variables](#test-variables) section. - For more information how to configure the test environment for `wp-env`, please checkout the [documentation](https://github.com/WordPress/gutenberg/tree/trunk/packages/env) documentation. ### Test Variables @@ -70,18 +71,18 @@ For more information how to configure the test environment for `wp-env`, please The test environment uses the following test variables: ```json -{ - "url": "http://localhost:8086/", - "users": { - "admin": { - "username": "admin", - "password": "password" - }, - "customer": { - "username": "customer", - "password": "password" - } - } +{ + "url": "http://localhost:8086/", + "users": { + "admin": { + "username": "admin", + "password": "password" + }, + "customer": { + "username": "customer", + "password": "password" + } + } } ``` @@ -93,14 +94,14 @@ Edit [.wp-env.json](https://github.com/woocommerce/woocommerce/blob/trunk/plugin **Modiify port for e2e-environment** -Edit [tests/e2e/config/default.json](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/tests/e2e/config/default.json).**** +Edit [tests/e2e/config/default.json](https://github.com/woocommerce/woocommerce/blob/trunk/plugins/woocommerce/tests/e2e/config/default.json).\*\*\*\* ### Starting/stopping the environment After you run a test, it's best to restart the environment to start from a fresh state. We are currently working to reset the state more efficiently to avoid the restart being needed, but this is a work-in-progress. -- `pnpm env:down --filter=woocommerce` to stop the environment -- `pnpm env:destroy --filter=woocommerce` when you make changes to `.wp-env.json` +- `pnpm env:down --filter=woocommerce` to stop the environment +- `pnpm env:destroy --filter=woocommerce` when you make changes to `.wp-env.json` ## Guide for writing e2e tests @@ -108,10 +109,10 @@ After you run a test, it's best to restart the environment to start from a fresh It is a good practice to start working on the test by identifying what needs to be tested on the higher and lower levels. For example, if you are writing a test to verify that merchant can create a virtual product, the overview of the test will be as follows: -- Merchant can create virtual product - - Merchant can log in - - Merchant can create virtual product - - Merchant can verify that virtual product was created +- Merchant can create virtual product + - Merchant can log in + - Merchant can create virtual product + - Merchant can verify that virtual product was created Once you identify the structure of the test, you can move on to writing it. @@ -119,24 +120,18 @@ Once you identify the structure of the test, you can move on to writing it. The structure of the test serves as a skeleton for the test itself. You can turn it into a test by using `describe()` and `it()` methods of Playwright: -- [`test.describe()`](https://playwright.dev/docs/api/class-test#test-describe) - creates a block that groups together several related tests; -- [`test()`](https://playwright.dev/docs/api/class-test#test-call) - actual method that runs the test. +- [`test.describe()`](https://playwright.dev/docs/api/class-test#test-describe) - creates a block that groups together several related tests; +- [`test()`](https://playwright.dev/docs/api/class-test#test-call) - actual method that runs the test. Based on our example, the test skeleton would look as follows: ```js test.describe( 'Merchant can create virtual product', () => { - test( 'merchant can log in', async () => { + test( 'merchant can log in', async () => {} ); - } ); + test( 'merchant can create virtual product', async () => {} ); - test( 'merchant can create virtual product', async () => { - - } ); - - test( 'merchant can verify that virtual product was created', async () => { - - } ); + test( 'merchant can verify that virtual product was created', async () => {} ); } ); ``` From 807ed2821fbe4c7a7da2e70a139aa8eead4b71c2 Mon Sep 17 00:00:00 2001 From: Jon Lane Date: Mon, 24 Oct 2022 15:52:51 -0700 Subject: [PATCH 0006/1680] Add changelog --- plugins/woocommerce/changelog/e2e-update-command-for-e2e | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/e2e-update-command-for-e2e diff --git a/plugins/woocommerce/changelog/e2e-update-command-for-e2e b/plugins/woocommerce/changelog/e2e-update-command-for-e2e new file mode 100644 index 00000000000..d6398300f19 --- /dev/null +++ b/plugins/woocommerce/changelog/e2e-update-command-for-e2e @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update pnpm command to run e2e tests for consistency. Also update docs with new command. From 19f0410bc1919bc909879c886b3a3eef2c739d8a Mon Sep 17 00:00:00 2001 From: Paul Sealock Date: Tue, 1 Nov 2022 07:53:01 +1300 Subject: [PATCH 0007/1680] PHPCS: Lint only changes (#35407) Add `sirbrillig/phpcs-changed` to run PHPCS only on changes, not entire files --- .../setup-woocommerce-monorepo/action.yml | 2 +- .github/workflows/pr-code-sniff.yml | 75 ++++++++++--------- .../changelog/try-add-phpcs-changed | 5 ++ .../admin/class-wc-admin-exporters.php | 2 +- 4 files changed, 47 insertions(+), 37 deletions(-) create mode 100644 plugins/woocommerce/changelog/try-add-phpcs-changed diff --git a/.github/actions/setup-woocommerce-monorepo/action.yml b/.github/actions/setup-woocommerce-monorepo/action.yml index 3ca1431d678..b31441bce31 100644 --- a/.github/actions/setup-woocommerce-monorepo/action.yml +++ b/.github/actions/setup-woocommerce-monorepo/action.yml @@ -42,7 +42,7 @@ runs: with: php-version: ${{ inputs.php-version }} coverage: none - tools: cs2pr, phpcs + tools: phpcs, sirbrillig/phpcs-changed - name: Cache Composer Dependencies uses: actions/cache@fd5de65bc895cf536527842281bea11763fefd77 diff --git a/.github/workflows/pr-code-sniff.yml b/.github/workflows/pr-code-sniff.yml index 7a8254850d8..2eee0a02a3a 100644 --- a/.github/workflows/pr-code-sniff.yml +++ b/.github/workflows/pr-code-sniff.yml @@ -1,41 +1,46 @@ name: Run code sniff on PR -on: - pull_request +on: pull_request defaults: - run: - shell: bash -concurrency: - group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + run: + shell: bash +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true +env: + PHPCS: ./plugins/woocommerce/vendor/bin/phpcs # Run WooCommerce phpcs setup in phpcs-changed instead of default jobs: - test: - name: Code sniff (PHP 7.4, WP Latest) - timeout-minutes: 15 - runs-on: ubuntu-20.04 - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 - - - name: Get Changed Files - id: changed-files - uses: tj-actions/changed-files@v32 - with: - files: | - **/*.php + test: + name: Code sniff (PHP 7.4, WP Latest) + timeout-minutes: 15 + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 - - name: Setup WooCommerce Monorepo - if: steps.changed-files.outputs.any_changed == 'true' - uses: ./.github/actions/setup-woocommerce-monorepo - with: - build: false + - name: Get Changed Files + id: changed-files + uses: tj-actions/changed-files@v32 + with: + files: | + **/*.php - - name: Tool versions - if: steps.changed-files.outputs.any_changed == 'true' - run: | - php --version - composer --version + - name: Setup WooCommerce Monorepo + if: steps.changed-files.outputs.any_changed == 'true' + uses: ./.github/actions/setup-woocommerce-monorepo + with: + build: false - - name: Run PHPCS - if: steps.changed-files.outputs.any_changed == 'true' - run: ./plugins/woocommerce/vendor/bin/phpcs -n -q --report=checkstyle ${{ steps.changed-files.outputs.all_changed_files }} | cs2pr + - name: Tool versions + if: steps.changed-files.outputs.any_changed == 'true' + run: | + php --version + composer --version + phpcs-changed --version + + - name: Run PHPCS + if: steps.changed-files.outputs.any_changed == 'true' + run: | + HEAD_REF=$(git rev-parse HEAD) + git checkout $HEAD_REF + phpcs-changed --git --git-base ${{ github.base_ref }} ${{ steps.changed-files.outputs.all_changed_files }} diff --git a/plugins/woocommerce/changelog/try-add-phpcs-changed b/plugins/woocommerce/changelog/try-add-phpcs-changed new file mode 100644 index 00000000000..a235f670cdf --- /dev/null +++ b/plugins/woocommerce/changelog/try-add-phpcs-changed @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Just whitespace change, no entry required + + diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-exporters.php b/plugins/woocommerce/includes/admin/class-wc-admin-exporters.php index 9a0758ff26d..07b4526bc9f 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-exporters.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-exporters.php @@ -199,7 +199,7 @@ class WC_Admin_Exporters { * @return array The product types keys and labels. */ public static function get_product_types() { - $product_types = wc_get_product_types(); + $product_types = wc_get_product_types(); $product_types['variation'] = __( 'Product variations', 'woocommerce' ); /** From edb59aef4defb03d428d5ac7a56914f410ee8578 Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Mon, 31 Oct 2022 14:22:15 -0500 Subject: [PATCH 0008/1680] Update/blocks 8.7.5 (#35428) * Update blocks to 8.7.5 * Add changelog file --- plugins/woocommerce/changelog/update-blocks-8.7.5 | 4 ++++ plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/composer.lock | 14 +++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-blocks-8.7.5 diff --git a/plugins/woocommerce/changelog/update-blocks-8.7.5 b/plugins/woocommerce/changelog/update-blocks-8.7.5 new file mode 100644 index 00000000000..e102e49b550 --- /dev/null +++ b/plugins/woocommerce/changelog/update-blocks-8.7.5 @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update WooCommerce Blocks to 8.7.5 diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 1da4b8966b2..f2a9ca4ef70 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -21,7 +21,7 @@ "maxmind-db/reader": "^1.11", "pelago/emogrifier": "^6.0", "woocommerce/action-scheduler": "3.4.2", - "woocommerce/woocommerce-blocks": "8.7.4" + "woocommerce/woocommerce-blocks": "8.7.5" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4", diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index d5d420dea28..809b2e3c2e7 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": "9d9a10e340f2c9d2366a082eb3b91344", + "content-hash": "08d58a387b373d546fb53025a230e768", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -628,16 +628,16 @@ }, { "name": "woocommerce/woocommerce-blocks", - "version": "v8.7.4", + "version": "v8.7.5", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-blocks.git", - "reference": "8553c41d5141725f2e399dab8527b573492402ea" + "reference": "0436c8afb8c3c34dd38aed2b7a0868e771036031" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/8553c41d5141725f2e399dab8527b573492402ea", - "reference": "8553c41d5141725f2e399dab8527b573492402ea", + "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/0436c8afb8c3c34dd38aed2b7a0868e771036031", + "reference": "0436c8afb8c3c34dd38aed2b7a0868e771036031", "shasum": "" }, "require": { @@ -683,9 +683,9 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-blocks/issues", - "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v8.7.4" + "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v8.7.5" }, - "time": "2022-10-21T15:55:49+00:00" + "time": "2022-10-31T14:54:55+00:00" } ], "packages-dev": [ From 613be5a990f1becb0553d5737b640274b45005ae Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Mon, 31 Oct 2022 19:23:10 +0000 Subject: [PATCH 0009/1680] add/a2p data api-core-tests (#35347) * add data api-core-tests * add newline to see if this resolves changelog issue * add newline to see if this resolves changelog issue --- .../add-api-core-tests-data-crud-tests | 4 + .../tests/data/data-crud.test.js | 27365 ++++++++++++++++ 2 files changed, 27369 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-api-core-tests-data-crud-tests create mode 100644 plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js diff --git a/plugins/woocommerce/changelog/add-api-core-tests-data-crud-tests b/plugins/woocommerce/changelog/add-api-core-tests-data-crud-tests new file mode 100644 index 00000000000..d2bec88cc88 --- /dev/null +++ b/plugins/woocommerce/changelog/add-api-core-tests-data-crud-tests @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Add playwright api-core-tests for data crud operations \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js new file mode 100644 index 00000000000..bcf5d752d9d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js @@ -0,0 +1,27365 @@ +const { + test, + expect +} = require('@playwright/test'); +const exp = require('constants'); +const { + refund +} = require('../../data'); + +/** + * Tests for the WooCommerce Refunds API. + * + * @group api + * @group data + * + */ +test.describe('Data API tests', () => { + + test('can list all data', async ({ + request + }) => { + // call API to retrieve data values + const response = await request.get('/wp-json/wc/v3/data'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "continents", + "description": "List of supported continents, countries, and states.", + }), + + expect.objectContaining({ + "slug": "countries", + "description": "List of supported states in a given country.", + }), + + expect.objectContaining({ + "slug": "currencies", + "description": "List of supported currencies.", + }), + + ]) + ); + }); + + test('can view all continents', async ({ + request + }) => { + // call API to retrieve all continents + const response = await request.get('/wp-json/wc/v3/data/continents'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "AF", + "name": "Africa", + "countries": [{ + "code": "AO", + "name": "Angolan kwanza", + "currency_code": "AOA", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "BGO", + "name": "Bengo" + }, + { + "code": "BLU", + "name": "Benguela" + }, + { + "code": "BIE", + "name": "Bié" + }, + { + "code": "CAB", + "name": "Cabinda" + }, + { + "code": "CNN", + "name": "Cunene" + }, + { + "code": "HUA", + "name": "Huambo" + }, + { + "code": "HUI", + "name": "Huíla" + }, + { + "code": "CCU", + "name": "Kuando Kubango" + }, + { + "code": "CNO", + "name": "Kwanza-Norte" + }, + { + "code": "CUS", + "name": "Kwanza-Sul" + }, + { + "code": "LUA", + "name": "Luanda" + }, + { + "code": "LNO", + "name": "Lunda-Norte" + }, + { + "code": "LSU", + "name": "Lunda-Sul" + }, + { + "code": "MAL", + "name": "Malanje" + }, + { + "code": "MOX", + "name": "Moxico" + }, + { + "code": "NAM", + "name": "Namibe" + }, + { + "code": "UIG", + "name": "Uíge" + }, + { + "code": "ZAI", + "name": "Zaire" + } + ] + }, + { + "code": "BF", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BI", + "name": "Burundian franc", + "currency_code": "BIF", + "currency_pos": "right", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BJ", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "AL", + "name": "Alibori" + }, + { + "code": "AK", + "name": "Atakora" + }, + { + "code": "AQ", + "name": "Atlantique" + }, + { + "code": "BO", + "name": "Borgou" + }, + { + "code": "CO", + "name": "Collines" + }, + { + "code": "KO", + "name": "Kouffo" + }, + { + "code": "DO", + "name": "Donga" + }, + { + "code": "LI", + "name": "Littoral" + }, + { + "code": "MO", + "name": "Mono" + }, + { + "code": "OU", + "name": "Ouémé" + }, + { + "code": "PL", + "name": "Plateau" + }, + { + "code": "ZO", + "name": "Zou" + } + ] + }, + { + "code": "BW", + "name": "Botswana pula", + "currency_code": "BWP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CD", + "name": "Congolese franc", + "currency_code": "CDF", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CF", + "name": "Central African CFA franc", + "currency_code": "XAF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CG", + "name": "Central African CFA franc", + "currency_code": "XAF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CI", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CM", + "name": "Central African CFA franc", + "currency_code": "XAF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CV", + "name": "Cape Verdean escudo", + "currency_code": "CVE", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "DJ", + "name": "Djiboutian franc", + "currency_code": "DJF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "DZ", + "name": "Algerian dinar", + "currency_code": "DZD", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "DZ-01", + "name": "Adrar" + }, + { + "code": "DZ-02", + "name": "Chlef" + }, + { + "code": "DZ-03", + "name": "Laghouat" + }, + { + "code": "DZ-04", + "name": "Oum El Bouaghi" + }, + { + "code": "DZ-05", + "name": "Batna" + }, + { + "code": "DZ-06", + "name": "Béjaïa" + }, + { + "code": "DZ-07", + "name": "Biskra" + }, + { + "code": "DZ-08", + "name": "Béchar" + }, + { + "code": "DZ-09", + "name": "Blida" + }, + { + "code": "DZ-10", + "name": "Bouira" + }, + { + "code": "DZ-11", + "name": "Tamanghasset" + }, + { + "code": "DZ-12", + "name": "Tébessa" + }, + { + "code": "DZ-13", + "name": "Tlemcen" + }, + { + "code": "DZ-14", + "name": "Tiaret" + }, + { + "code": "DZ-15", + "name": "Tizi Ouzou" + }, + { + "code": "DZ-16", + "name": "Algiers" + }, + { + "code": "DZ-17", + "name": "Djelfa" + }, + { + "code": "DZ-18", + "name": "Jijel" + }, + { + "code": "DZ-19", + "name": "Sétif" + }, + { + "code": "DZ-20", + "name": "Saïda" + }, + { + "code": "DZ-21", + "name": "Skikda" + }, + { + "code": "DZ-22", + "name": "Sidi Bel Abbès" + }, + { + "code": "DZ-23", + "name": "Annaba" + }, + { + "code": "DZ-24", + "name": "Guelma" + }, + { + "code": "DZ-25", + "name": "Constantine" + }, + { + "code": "DZ-26", + "name": "Médéa" + }, + { + "code": "DZ-27", + "name": "Mostaganem" + }, + { + "code": "DZ-28", + "name": "M’Sila" + }, + { + "code": "DZ-29", + "name": "Mascara" + }, + { + "code": "DZ-30", + "name": "Ouargla" + }, + { + "code": "DZ-31", + "name": "Oran" + }, + { + "code": "DZ-32", + "name": "El Bayadh" + }, + { + "code": "DZ-33", + "name": "Illizi" + }, + { + "code": "DZ-34", + "name": "Bordj Bou Arréridj" + }, + { + "code": "DZ-35", + "name": "Boumerdès" + }, + { + "code": "DZ-36", + "name": "El Tarf" + }, + { + "code": "DZ-37", + "name": "Tindouf" + }, + { + "code": "DZ-38", + "name": "Tissemsilt" + }, + { + "code": "DZ-39", + "name": "El Oued" + }, + { + "code": "DZ-40", + "name": "Khenchela" + }, + { + "code": "DZ-41", + "name": "Souk Ahras" + }, + { + "code": "DZ-42", + "name": "Tipasa" + }, + { + "code": "DZ-43", + "name": "Mila" + }, + { + "code": "DZ-44", + "name": "Aïn Defla" + }, + { + "code": "DZ-45", + "name": "Naama" + }, + { + "code": "DZ-46", + "name": "Aïn Témouchent" + }, + { + "code": "DZ-47", + "name": "Ghardaïa" + }, + { + "code": "DZ-48", + "name": "Relizane" + } + ] + }, + { + "code": "EG", + "name": "Egyptian pound", + "currency_code": "EGP", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "EGALX", + "name": "Alexandria" + }, + { + "code": "EGASN", + "name": "Aswan" + }, + { + "code": "EGAST", + "name": "Asyut" + }, + { + "code": "EGBA", + "name": "Red Sea" + }, + { + "code": "EGBH", + "name": "Beheira" + }, + { + "code": "EGBNS", + "name": "Beni Suef" + }, + { + "code": "EGC", + "name": "Cairo" + }, + { + "code": "EGDK", + "name": "Dakahlia" + }, + { + "code": "EGDT", + "name": "Damietta" + }, + { + "code": "EGFYM", + "name": "Faiyum" + }, + { + "code": "EGGH", + "name": "Gharbia" + }, + { + "code": "EGGZ", + "name": "Giza" + }, + { + "code": "EGIS", + "name": "Ismailia" + }, + { + "code": "EGJS", + "name": "South Sinai" + }, + { + "code": "EGKB", + "name": "Qalyubia" + }, + { + "code": "EGKFS", + "name": "Kafr el-Sheikh" + }, + { + "code": "EGKN", + "name": "Qena" + }, + { + "code": "EGLX", + "name": "Luxor" + }, + { + "code": "EGMN", + "name": "Minya" + }, + { + "code": "EGMNF", + "name": "Monufia" + }, + { + "code": "EGMT", + "name": "Matrouh" + }, + { + "code": "EGPTS", + "name": "Port Said" + }, + { + "code": "EGSHG", + "name": "Sohag" + }, + { + "code": "EGSHR", + "name": "Al Sharqia" + }, + { + "code": "EGSIN", + "name": "North Sinai" + }, + { + "code": "EGSUZ", + "name": "Suez" + }, + { + "code": "EGWAD", + "name": "New Valley" + } + ] + }, + { + "code": "EH", + "name": "Moroccan dirham", + "currency_code": "MAD", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ER", + "name": "Eritrean nakfa", + "currency_code": "ERN", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ET", + "name": "Ethiopian birr", + "currency_code": "ETB", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GA", + "name": "Central African CFA franc", + "currency_code": "XAF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GH", + "name": "Ghana cedi", + "currency_code": "GHS", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "AF", + "name": "Ahafo" + }, + { + "code": "AH", + "name": "Ashanti" + }, + { + "code": "BA", + "name": "Brong-Ahafo" + }, + { + "code": "BO", + "name": "Bono" + }, + { + "code": "BE", + "name": "Bono East" + }, + { + "code": "CP", + "name": "Central" + }, + { + "code": "EP", + "name": "Eastern" + }, + { + "code": "AA", + "name": "Greater Accra" + }, + { + "code": "NE", + "name": "North East" + }, + { + "code": "NP", + "name": "Northern" + }, + { + "code": "OT", + "name": "Oti" + }, + { + "code": "SV", + "name": "Savannah" + }, + { + "code": "UE", + "name": "Upper East" + }, + { + "code": "UW", + "name": "Upper West" + }, + { + "code": "TV", + "name": "Volta" + }, + { + "code": "WP", + "name": "Western" + }, + { + "code": "WN", + "name": "Western North" + } + ] + }, + { + "code": "GM", + "name": "Gambian dalasi", + "currency_code": "GMD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GN", + "name": "Guinean franc", + "currency_code": "GNF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GQ", + "name": "Central African CFA franc", + "currency_code": "XAF", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GW", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KE", + "name": "Kenyan shilling", + "currency_code": "KES", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "KE01", + "name": "Baringo" + }, + { + "code": "KE02", + "name": "Bomet" + }, + { + "code": "KE03", + "name": "Bungoma" + }, + { + "code": "KE04", + "name": "Busia" + }, + { + "code": "KE05", + "name": "Elgeyo-Marakwet" + }, + { + "code": "KE06", + "name": "Embu" + }, + { + "code": "KE07", + "name": "Garissa" + }, + { + "code": "KE08", + "name": "Homa Bay" + }, + { + "code": "KE09", + "name": "Isiolo" + }, + { + "code": "KE10", + "name": "Kajiado" + }, + { + "code": "KE11", + "name": "Kakamega" + }, + { + "code": "KE12", + "name": "Kericho" + }, + { + "code": "KE13", + "name": "Kiambu" + }, + { + "code": "KE14", + "name": "Kilifi" + }, + { + "code": "KE15", + "name": "Kirinyaga" + }, + { + "code": "KE16", + "name": "Kisii" + }, + { + "code": "KE17", + "name": "Kisumu" + }, + { + "code": "KE18", + "name": "Kitui" + }, + { + "code": "KE19", + "name": "Kwale" + }, + { + "code": "KE20", + "name": "Laikipia" + }, + { + "code": "KE21", + "name": "Lamu" + }, + { + "code": "KE22", + "name": "Machakos" + }, + { + "code": "KE23", + "name": "Makueni" + }, + { + "code": "KE24", + "name": "Mandera" + }, + { + "code": "KE25", + "name": "Marsabit" + }, + { + "code": "KE26", + "name": "Meru" + }, + { + "code": "KE27", + "name": "Migori" + }, + { + "code": "KE28", + "name": "Mombasa" + }, + { + "code": "KE29", + "name": "Murang’a" + }, + { + "code": "KE30", + "name": "Nairobi County" + }, + { + "code": "KE31", + "name": "Nakuru" + }, + { + "code": "KE32", + "name": "Nandi" + }, + { + "code": "KE33", + "name": "Narok" + }, + { + "code": "KE34", + "name": "Nyamira" + }, + { + "code": "KE35", + "name": "Nyandarua" + }, + { + "code": "KE36", + "name": "Nyeri" + }, + { + "code": "KE37", + "name": "Samburu" + }, + { + "code": "KE38", + "name": "Siaya" + }, + { + "code": "KE39", + "name": "Taita-Taveta" + }, + { + "code": "KE40", + "name": "Tana River" + }, + { + "code": "KE41", + "name": "Tharaka-Nithi" + }, + { + "code": "KE42", + "name": "Trans Nzoia" + }, + { + "code": "KE43", + "name": "Turkana" + }, + { + "code": "KE44", + "name": "Uasin Gishu" + }, + { + "code": "KE45", + "name": "Vihiga" + }, + { + "code": "KE46", + "name": "Wajir" + }, + { + "code": "KE47", + "name": "West Pokot" + } + ] + }, + { + "code": "KM", + "name": "Comorian franc", + "currency_code": "KMF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LR", + "name": "Liberian dollar", + "currency_code": "LRD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "BM", + "name": "Bomi" + }, + { + "code": "BN", + "name": "Bong" + }, + { + "code": "GA", + "name": "Gbarpolu" + }, + { + "code": "GB", + "name": "Grand Bassa" + }, + { + "code": "GC", + "name": "Grand Cape Mount" + }, + { + "code": "GG", + "name": "Grand Gedeh" + }, + { + "code": "GK", + "name": "Grand Kru" + }, + { + "code": "LO", + "name": "Lofa" + }, + { + "code": "MA", + "name": "Margibi" + }, + { + "code": "MY", + "name": "Maryland" + }, + { + "code": "MO", + "name": "Montserrado" + }, + { + "code": "NM", + "name": "Nimba" + }, + { + "code": "RV", + "name": "Rivercess" + }, + { + "code": "RG", + "name": "River Gee" + }, + { + "code": "SN", + "name": "Sinoe" + } + ] + }, + { + "code": "LS", + "name": "Lesotho loti", + "currency_code": "LSL", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LY", + "name": "Libyan dinar", + "currency_code": "LYD", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MA", + "name": "Moroccan dirham", + "currency_code": "MAD", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MG", + "name": "Malagasy ariary", + "currency_code": "MGA", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ML", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MR", + "name": "Mauritanian ouguiya", + "currency_code": "MRU", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MU", + "name": "Mauritian rupee", + "currency_code": "MUR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MW", + "name": "Malawian kwacha", + "currency_code": "MWK", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MZ", + "name": "Mozambican metical", + "currency_code": "MZN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "MZP", + "name": "Cabo Delgado" + }, + { + "code": "MZG", + "name": "Gaza" + }, + { + "code": "MZI", + "name": "Inhambane" + }, + { + "code": "MZB", + "name": "Manica" + }, + { + "code": "MZL", + "name": "Maputo Province" + }, + { + "code": "MZMPM", + "name": "Maputo" + }, + { + "code": "MZN", + "name": "Nampula" + }, + { + "code": "MZA", + "name": "Niassa" + }, + { + "code": "MZS", + "name": "Sofala" + }, + { + "code": "MZT", + "name": "Tete" + }, + { + "code": "MZQ", + "name": "Zambézia" + } + ] + }, + { + "code": "NA", + "name": "Namibian dollar", + "currency_code": "NAD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "ER", + "name": "Erongo" + }, + { + "code": "HA", + "name": "Hardap" + }, + { + "code": "KA", + "name": "Karas" + }, + { + "code": "KE", + "name": "Kavango East" + }, + { + "code": "KW", + "name": "Kavango West" + }, + { + "code": "KH", + "name": "Khomas" + }, + { + "code": "KU", + "name": "Kunene" + }, + { + "code": "OW", + "name": "Ohangwena" + }, + { + "code": "OH", + "name": "Omaheke" + }, + { + "code": "OS", + "name": "Omusati" + }, + { + "code": "ON", + "name": "Oshana" + }, + { + "code": "OT", + "name": "Oshikoto" + }, + { + "code": "OD", + "name": "Otjozondjupa" + }, + { + "code": "CA", + "name": "Zambezi" + } + ] + }, + { + "code": "NE", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NG", + "name": "Nigerian naira", + "currency_code": "NGN", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "AB", + "name": "Abia" + }, + { + "code": "FC", + "name": "Abuja" + }, + { + "code": "AD", + "name": "Adamawa" + }, + { + "code": "AK", + "name": "Akwa Ibom" + }, + { + "code": "AN", + "name": "Anambra" + }, + { + "code": "BA", + "name": "Bauchi" + }, + { + "code": "BY", + "name": "Bayelsa" + }, + { + "code": "BE", + "name": "Benue" + }, + { + "code": "BO", + "name": "Borno" + }, + { + "code": "CR", + "name": "Cross River" + }, + { + "code": "DE", + "name": "Delta" + }, + { + "code": "EB", + "name": "Ebonyi" + }, + { + "code": "ED", + "name": "Edo" + }, + { + "code": "EK", + "name": "Ekiti" + }, + { + "code": "EN", + "name": "Enugu" + }, + { + "code": "GO", + "name": "Gombe" + }, + { + "code": "IM", + "name": "Imo" + }, + { + "code": "JI", + "name": "Jigawa" + }, + { + "code": "KD", + "name": "Kaduna" + }, + { + "code": "KN", + "name": "Kano" + }, + { + "code": "KT", + "name": "Katsina" + }, + { + "code": "KE", + "name": "Kebbi" + }, + { + "code": "KO", + "name": "Kogi" + }, + { + "code": "KW", + "name": "Kwara" + }, + { + "code": "LA", + "name": "Lagos" + }, + { + "code": "NA", + "name": "Nasarawa" + }, + { + "code": "NI", + "name": "Niger" + }, + { + "code": "OG", + "name": "Ogun" + }, + { + "code": "ON", + "name": "Ondo" + }, + { + "code": "OS", + "name": "Osun" + }, + { + "code": "OY", + "name": "Oyo" + }, + { + "code": "PL", + "name": "Plateau" + }, + { + "code": "RI", + "name": "Rivers" + }, + { + "code": "SO", + "name": "Sokoto" + }, + { + "code": "TA", + "name": "Taraba" + }, + { + "code": "YO", + "name": "Yobe" + }, + { + "code": "ZA", + "name": "Zamfara" + } + ] + }, + { + "code": "RE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "RW", + "name": "Rwandan franc", + "currency_code": "RWF", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SC", + "name": "Seychellois rupee", + "currency_code": "SCR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SD", + "name": "Sudanese pound", + "currency_code": "SDG", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SH", + "name": "Saint Helena pound", + "currency_code": "SHP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SL", + "name": "Sierra Leonean leone", + "currency_code": "SLL", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SN", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "SNDB", + "name": "Diourbel" + }, + { + "code": "SNDK", + "name": "Dakar" + }, + { + "code": "SNFK", + "name": "Fatick" + }, + { + "code": "SNKA", + "name": "Kaffrine" + }, + { + "code": "SNKD", + "name": "Kolda" + }, + { + "code": "SNKE", + "name": "Kédougou" + }, + { + "code": "SNKL", + "name": "Kaolack" + }, + { + "code": "SNLG", + "name": "Louga" + }, + { + "code": "SNMT", + "name": "Matam" + }, + { + "code": "SNSE", + "name": "Sédhiou" + }, + { + "code": "SNSL", + "name": "Saint-Louis" + }, + { + "code": "SNTC", + "name": "Tambacounda" + }, + { + "code": "SNTH", + "name": "Thiès" + }, + { + "code": "SNZG", + "name": "Ziguinchor" + } + ] + }, + { + "code": "SO", + "name": "Somali shilling", + "currency_code": "SOS", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SS", + "name": "South Sudanese pound", + "currency_code": "SSP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ST", + "name": "São Tomé and Príncipe dobra", + "currency_code": "STN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SZ", + "name": "Swazi lilangeni", + "currency_code": "SZL", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TD", + "name": "Central African CFA franc", + "currency_code": "XAF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TG", + "name": "West African CFA franc", + "currency_code": "XOF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TN", + "name": "Tunisian dinar", + "currency_code": "TND", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TZ", + "name": "Tanzanian shilling", + "currency_code": "TZS", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "TZ01", + "name": "Arusha" + }, + { + "code": "TZ02", + "name": "Dar es Salaam" + }, + { + "code": "TZ03", + "name": "Dodoma" + }, + { + "code": "TZ04", + "name": "Iringa" + }, + { + "code": "TZ05", + "name": "Kagera" + }, + { + "code": "TZ06", + "name": "Pemba North" + }, + { + "code": "TZ07", + "name": "Zanzibar North" + }, + { + "code": "TZ08", + "name": "Kigoma" + }, + { + "code": "TZ09", + "name": "Kilimanjaro" + }, + { + "code": "TZ10", + "name": "Pemba South" + }, + { + "code": "TZ11", + "name": "Zanzibar South" + }, + { + "code": "TZ12", + "name": "Lindi" + }, + { + "code": "TZ13", + "name": "Mara" + }, + { + "code": "TZ14", + "name": "Mbeya" + }, + { + "code": "TZ15", + "name": "Zanzibar West" + }, + { + "code": "TZ16", + "name": "Morogoro" + }, + { + "code": "TZ17", + "name": "Mtwara" + }, + { + "code": "TZ18", + "name": "Mwanza" + }, + { + "code": "TZ19", + "name": "Coast" + }, + { + "code": "TZ20", + "name": "Rukwa" + }, + { + "code": "TZ21", + "name": "Ruvuma" + }, + { + "code": "TZ22", + "name": "Shinyanga" + }, + { + "code": "TZ23", + "name": "Singida" + }, + { + "code": "TZ24", + "name": "Tabora" + }, + { + "code": "TZ25", + "name": "Tanga" + }, + { + "code": "TZ26", + "name": "Manyara" + }, + { + "code": "TZ27", + "name": "Geita" + }, + { + "code": "TZ28", + "name": "Katavi" + }, + { + "code": "TZ29", + "name": "Njombe" + }, + { + "code": "TZ30", + "name": "Simiyu" + } + ] + }, + { + "code": "UG", + "name": "Ugandan shilling", + "currency_code": "UGX", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "UG314", + "name": "Abim" + }, + { + "code": "UG301", + "name": "Adjumani" + }, + { + "code": "UG322", + "name": "Agago" + }, + { + "code": "UG323", + "name": "Alebtong" + }, + { + "code": "UG315", + "name": "Amolatar" + }, + { + "code": "UG324", + "name": "Amudat" + }, + { + "code": "UG216", + "name": "Amuria" + }, + { + "code": "UG316", + "name": "Amuru" + }, + { + "code": "UG302", + "name": "Apac" + }, + { + "code": "UG303", + "name": "Arua" + }, + { + "code": "UG217", + "name": "Budaka" + }, + { + "code": "UG218", + "name": "Bududa" + }, + { + "code": "UG201", + "name": "Bugiri" + }, + { + "code": "UG235", + "name": "Bugweri" + }, + { + "code": "UG420", + "name": "Buhweju" + }, + { + "code": "UG117", + "name": "Buikwe" + }, + { + "code": "UG219", + "name": "Bukedea" + }, + { + "code": "UG118", + "name": "Bukomansimbi" + }, + { + "code": "UG220", + "name": "Bukwa" + }, + { + "code": "UG225", + "name": "Bulambuli" + }, + { + "code": "UG416", + "name": "Buliisa" + }, + { + "code": "UG401", + "name": "Bundibugyo" + }, + { + "code": "UG430", + "name": "Bunyangabu" + }, + { + "code": "UG402", + "name": "Bushenyi" + }, + { + "code": "UG202", + "name": "Busia" + }, + { + "code": "UG221", + "name": "Butaleja" + }, + { + "code": "UG119", + "name": "Butambala" + }, + { + "code": "UG233", + "name": "Butebo" + }, + { + "code": "UG120", + "name": "Buvuma" + }, + { + "code": "UG226", + "name": "Buyende" + }, + { + "code": "UG317", + "name": "Dokolo" + }, + { + "code": "UG121", + "name": "Gomba" + }, + { + "code": "UG304", + "name": "Gulu" + }, + { + "code": "UG403", + "name": "Hoima" + }, + { + "code": "UG417", + "name": "Ibanda" + }, + { + "code": "UG203", + "name": "Iganga" + }, + { + "code": "UG418", + "name": "Isingiro" + }, + { + "code": "UG204", + "name": "Jinja" + }, + { + "code": "UG318", + "name": "Kaabong" + }, + { + "code": "UG404", + "name": "Kabale" + }, + { + "code": "UG405", + "name": "Kabarole" + }, + { + "code": "UG213", + "name": "Kaberamaido" + }, + { + "code": "UG427", + "name": "Kagadi" + }, + { + "code": "UG428", + "name": "Kakumiro" + }, + { + "code": "UG101", + "name": "Kalangala" + }, + { + "code": "UG222", + "name": "Kaliro" + }, + { + "code": "UG122", + "name": "Kalungu" + }, + { + "code": "UG102", + "name": "Kampala" + }, + { + "code": "UG205", + "name": "Kamuli" + }, + { + "code": "UG413", + "name": "Kamwenge" + }, + { + "code": "UG414", + "name": "Kanungu" + }, + { + "code": "UG206", + "name": "Kapchorwa" + }, + { + "code": "UG236", + "name": "Kapelebyong" + }, + { + "code": "UG126", + "name": "Kasanda" + }, + { + "code": "UG406", + "name": "Kasese" + }, + { + "code": "UG207", + "name": "Katakwi" + }, + { + "code": "UG112", + "name": "Kayunga" + }, + { + "code": "UG407", + "name": "Kibaale" + }, + { + "code": "UG103", + "name": "Kiboga" + }, + { + "code": "UG227", + "name": "Kibuku" + }, + { + "code": "UG432", + "name": "Kikuube" + }, + { + "code": "UG419", + "name": "Kiruhura" + }, + { + "code": "UG421", + "name": "Kiryandongo" + }, + { + "code": "UG408", + "name": "Kisoro" + }, + { + "code": "UG305", + "name": "Kitgum" + }, + { + "code": "UG319", + "name": "Koboko" + }, + { + "code": "UG325", + "name": "Kole" + }, + { + "code": "UG306", + "name": "Kotido" + }, + { + "code": "UG208", + "name": "Kumi" + }, + { + "code": "UG333", + "name": "Kwania" + }, + { + "code": "UG228", + "name": "Kween" + }, + { + "code": "UG123", + "name": "Kyankwanzi" + }, + { + "code": "UG422", + "name": "Kyegegwa" + }, + { + "code": "UG415", + "name": "Kyenjojo" + }, + { + "code": "UG125", + "name": "Kyotera" + }, + { + "code": "UG326", + "name": "Lamwo" + }, + { + "code": "UG307", + "name": "Lira" + }, + { + "code": "UG229", + "name": "Luuka" + }, + { + "code": "UG104", + "name": "Luwero" + }, + { + "code": "UG124", + "name": "Lwengo" + }, + { + "code": "UG114", + "name": "Lyantonde" + }, + { + "code": "UG223", + "name": "Manafwa" + }, + { + "code": "UG320", + "name": "Maracha" + }, + { + "code": "UG105", + "name": "Masaka" + }, + { + "code": "UG409", + "name": "Masindi" + }, + { + "code": "UG214", + "name": "Mayuge" + }, + { + "code": "UG209", + "name": "Mbale" + }, + { + "code": "UG410", + "name": "Mbarara" + }, + { + "code": "UG423", + "name": "Mitooma" + }, + { + "code": "UG115", + "name": "Mityana" + }, + { + "code": "UG308", + "name": "Moroto" + }, + { + "code": "UG309", + "name": "Moyo" + }, + { + "code": "UG106", + "name": "Mpigi" + }, + { + "code": "UG107", + "name": "Mubende" + }, + { + "code": "UG108", + "name": "Mukono" + }, + { + "code": "UG334", + "name": "Nabilatuk" + }, + { + "code": "UG311", + "name": "Nakapiripirit" + }, + { + "code": "UG116", + "name": "Nakaseke" + }, + { + "code": "UG109", + "name": "Nakasongola" + }, + { + "code": "UG230", + "name": "Namayingo" + }, + { + "code": "UG234", + "name": "Namisindwa" + }, + { + "code": "UG224", + "name": "Namutumba" + }, + { + "code": "UG327", + "name": "Napak" + }, + { + "code": "UG310", + "name": "Nebbi" + }, + { + "code": "UG231", + "name": "Ngora" + }, + { + "code": "UG424", + "name": "Ntoroko" + }, + { + "code": "UG411", + "name": "Ntungamo" + }, + { + "code": "UG328", + "name": "Nwoya" + }, + { + "code": "UG331", + "name": "Omoro" + }, + { + "code": "UG329", + "name": "Otuke" + }, + { + "code": "UG321", + "name": "Oyam" + }, + { + "code": "UG312", + "name": "Pader" + }, + { + "code": "UG332", + "name": "Pakwach" + }, + { + "code": "UG210", + "name": "Pallisa" + }, + { + "code": "UG110", + "name": "Rakai" + }, + { + "code": "UG429", + "name": "Rubanda" + }, + { + "code": "UG425", + "name": "Rubirizi" + }, + { + "code": "UG431", + "name": "Rukiga" + }, + { + "code": "UG412", + "name": "Rukungiri" + }, + { + "code": "UG111", + "name": "Sembabule" + }, + { + "code": "UG232", + "name": "Serere" + }, + { + "code": "UG426", + "name": "Sheema" + }, + { + "code": "UG215", + "name": "Sironko" + }, + { + "code": "UG211", + "name": "Soroti" + }, + { + "code": "UG212", + "name": "Tororo" + }, + { + "code": "UG113", + "name": "Wakiso" + }, + { + "code": "UG313", + "name": "Yumbe" + }, + { + "code": "UG330", + "name": "Zombo" + } + ] + }, + { + "code": "YT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ZA", + "name": "South African rand", + "currency_code": "ZAR", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "EC", + "name": "Eastern Cape" + }, + { + "code": "FS", + "name": "Free State" + }, + { + "code": "GP", + "name": "Gauteng" + }, + { + "code": "KZN", + "name": "KwaZulu-Natal" + }, + { + "code": "LP", + "name": "Limpopo" + }, + { + "code": "MP", + "name": "Mpumalanga" + }, + { + "code": "NC", + "name": "Northern Cape" + }, + { + "code": "NW", + "name": "North West" + }, + { + "code": "WC", + "name": "Western Cape" + } + ] + }, + { + "code": "ZM", + "name": "Zambian kwacha", + "currency_code": "ZMW", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "ZM-01", + "name": "Western" + }, + { + "code": "ZM-02", + "name": "Central" + }, + { + "code": "ZM-03", + "name": "Eastern" + }, + { + "code": "ZM-04", + "name": "Luapula" + }, + { + "code": "ZM-05", + "name": "Northern" + }, + { + "code": "ZM-06", + "name": "North-Western" + }, + { + "code": "ZM-07", + "name": "Southern" + }, + { + "code": "ZM-08", + "name": "Copperbelt" + }, + { + "code": "ZM-09", + "name": "Lusaka" + }, + { + "code": "ZM-10", + "name": "Muchinga" + } + ] + }, + { + "code": "ZW", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + } + ], + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "AN", + "name": "Antarctica", + "countries": [{ + "code": "AQ", + "name": "Antarctica", + "states": [] + }, + { + "code": "BV", + "name": "Bouvet Island", + "states": [] + }, + { + "code": "GS", + "name": "South Georgia/Sandwich Islands", + "states": [] + }, + { + "code": "HM", + "name": "Heard Island and McDonald Islands", + "states": [] + }, + { + "code": "TF", + "name": "French Southern Territories", + "states": [] + } + ], + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "AS", + "name": "Asia", + "countries": [{ + "code": "AE", + "name": "United Arab Emirates dirham", + "currency_code": "AED", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AF", + "name": "Afghan afghani", + "currency_code": "AFN", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AM", + "name": "Armenian dram", + "currency_code": "AMD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AZ", + "name": "Azerbaijani manat", + "currency_code": "AZN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BD", + "name": "Bangladeshi taka", + "currency_code": "BDT", + "currency_pos": "right", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "BD-05", + "name": "Bagerhat" + }, + { + "code": "BD-01", + "name": "Bandarban" + }, + { + "code": "BD-02", + "name": "Barguna" + }, + { + "code": "BD-06", + "name": "Barishal" + }, + { + "code": "BD-07", + "name": "Bhola" + }, + { + "code": "BD-03", + "name": "Bogura" + }, + { + "code": "BD-04", + "name": "Brahmanbaria" + }, + { + "code": "BD-09", + "name": "Chandpur" + }, + { + "code": "BD-10", + "name": "Chattogram" + }, + { + "code": "BD-12", + "name": "Chuadanga" + }, + { + "code": "BD-11", + "name": "Cox's Bazar" + }, + { + "code": "BD-08", + "name": "Cumilla" + }, + { + "code": "BD-13", + "name": "Dhaka" + }, + { + "code": "BD-14", + "name": "Dinajpur" + }, + { + "code": "BD-15", + "name": "Faridpur " + }, + { + "code": "BD-16", + "name": "Feni" + }, + { + "code": "BD-19", + "name": "Gaibandha" + }, + { + "code": "BD-18", + "name": "Gazipur" + }, + { + "code": "BD-17", + "name": "Gopalganj" + }, + { + "code": "BD-20", + "name": "Habiganj" + }, + { + "code": "BD-21", + "name": "Jamalpur" + }, + { + "code": "BD-22", + "name": "Jashore" + }, + { + "code": "BD-25", + "name": "Jhalokati" + }, + { + "code": "BD-23", + "name": "Jhenaidah" + }, + { + "code": "BD-24", + "name": "Joypurhat" + }, + { + "code": "BD-29", + "name": "Khagrachhari" + }, + { + "code": "BD-27", + "name": "Khulna" + }, + { + "code": "BD-26", + "name": "Kishoreganj" + }, + { + "code": "BD-28", + "name": "Kurigram" + }, + { + "code": "BD-30", + "name": "Kushtia" + }, + { + "code": "BD-31", + "name": "Lakshmipur" + }, + { + "code": "BD-32", + "name": "Lalmonirhat" + }, + { + "code": "BD-36", + "name": "Madaripur" + }, + { + "code": "BD-37", + "name": "Magura" + }, + { + "code": "BD-33", + "name": "Manikganj " + }, + { + "code": "BD-39", + "name": "Meherpur" + }, + { + "code": "BD-38", + "name": "Moulvibazar" + }, + { + "code": "BD-35", + "name": "Munshiganj" + }, + { + "code": "BD-34", + "name": "Mymensingh" + }, + { + "code": "BD-48", + "name": "Naogaon" + }, + { + "code": "BD-43", + "name": "Narail" + }, + { + "code": "BD-40", + "name": "Narayanganj" + }, + { + "code": "BD-42", + "name": "Narsingdi" + }, + { + "code": "BD-44", + "name": "Natore" + }, + { + "code": "BD-45", + "name": "Nawabganj" + }, + { + "code": "BD-41", + "name": "Netrakona" + }, + { + "code": "BD-46", + "name": "Nilphamari" + }, + { + "code": "BD-47", + "name": "Noakhali" + }, + { + "code": "BD-49", + "name": "Pabna" + }, + { + "code": "BD-52", + "name": "Panchagarh" + }, + { + "code": "BD-51", + "name": "Patuakhali" + }, + { + "code": "BD-50", + "name": "Pirojpur" + }, + { + "code": "BD-53", + "name": "Rajbari" + }, + { + "code": "BD-54", + "name": "Rajshahi" + }, + { + "code": "BD-56", + "name": "Rangamati" + }, + { + "code": "BD-55", + "name": "Rangpur" + }, + { + "code": "BD-58", + "name": "Satkhira" + }, + { + "code": "BD-62", + "name": "Shariatpur" + }, + { + "code": "BD-57", + "name": "Sherpur" + }, + { + "code": "BD-59", + "name": "Sirajganj" + }, + { + "code": "BD-61", + "name": "Sunamganj" + }, + { + "code": "BD-60", + "name": "Sylhet" + }, + { + "code": "BD-63", + "name": "Tangail" + }, + { + "code": "BD-64", + "name": "Thakurgaon" + } + ] + }, + { + "code": "BH", + "name": "Bahraini dinar", + "currency_code": "BHD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BN", + "name": "Brunei dollar", + "currency_code": "BND", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BT", + "name": "Bhutanese ngultrum", + "currency_code": "BTN", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CC", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CN", + "name": "Chinese yuan", + "currency_code": "CNY", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "CN1", + "name": "Yunnan / 云南" + }, + { + "code": "CN2", + "name": "Beijing / 北京" + }, + { + "code": "CN3", + "name": "Tianjin / 天津" + }, + { + "code": "CN4", + "name": "Hebei / 河北" + }, + { + "code": "CN5", + "name": "Shanxi / 山西" + }, + { + "code": "CN6", + "name": "Inner Mongolia / 內蒙古" + }, + { + "code": "CN7", + "name": "Liaoning / 辽宁" + }, + { + "code": "CN8", + "name": "Jilin / 吉林" + }, + { + "code": "CN9", + "name": "Heilongjiang / 黑龙江" + }, + { + "code": "CN10", + "name": "Shanghai / 上海" + }, + { + "code": "CN11", + "name": "Jiangsu / 江苏" + }, + { + "code": "CN12", + "name": "Zhejiang / 浙江" + }, + { + "code": "CN13", + "name": "Anhui / 安徽" + }, + { + "code": "CN14", + "name": "Fujian / 福建" + }, + { + "code": "CN15", + "name": "Jiangxi / 江西" + }, + { + "code": "CN16", + "name": "Shandong / 山东" + }, + { + "code": "CN17", + "name": "Henan / 河南" + }, + { + "code": "CN18", + "name": "Hubei / 湖北" + }, + { + "code": "CN19", + "name": "Hunan / 湖南" + }, + { + "code": "CN20", + "name": "Guangdong / 广东" + }, + { + "code": "CN21", + "name": "Guangxi Zhuang / 广西壮族" + }, + { + "code": "CN22", + "name": "Hainan / 海南" + }, + { + "code": "CN23", + "name": "Chongqing / 重庆" + }, + { + "code": "CN24", + "name": "Sichuan / 四川" + }, + { + "code": "CN25", + "name": "Guizhou / 贵州" + }, + { + "code": "CN26", + "name": "Shaanxi / 陕西" + }, + { + "code": "CN27", + "name": "Gansu / 甘肃" + }, + { + "code": "CN28", + "name": "Qinghai / 青海" + }, + { + "code": "CN29", + "name": "Ningxia Hui / 宁夏" + }, + { + "code": "CN30", + "name": "Macao / 澳门" + }, + { + "code": "CN31", + "name": "Tibet / 西藏" + }, + { + "code": "CN32", + "name": "Xinjiang / 新疆" + } + ] + }, + { + "code": "CX", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CY", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GE", + "name": "Georgian lari", + "currency_code": "GEL", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "HK", + "name": "Hong Kong dollar", + "currency_code": "HKD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "HONG KONG", + "name": "Hong Kong Island" + }, + { + "code": "KOWLOON", + "name": "Kowloon" + }, + { + "code": "NEW TERRITORIES", + "name": "New Territories" + } + ] + }, + { + "code": "ID", + "name": "Indonesian rupiah", + "currency_code": "IDR", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AC", + "name": "Daerah Istimewa Aceh" + }, + { + "code": "SU", + "name": "Sumatera Utara" + }, + { + "code": "SB", + "name": "Sumatera Barat" + }, + { + "code": "RI", + "name": "Riau" + }, + { + "code": "KR", + "name": "Kepulauan Riau" + }, + { + "code": "JA", + "name": "Jambi" + }, + { + "code": "SS", + "name": "Sumatera Selatan" + }, + { + "code": "BB", + "name": "Bangka Belitung" + }, + { + "code": "BE", + "name": "Bengkulu" + }, + { + "code": "LA", + "name": "Lampung" + }, + { + "code": "JK", + "name": "DKI Jakarta" + }, + { + "code": "JB", + "name": "Jawa Barat" + }, + { + "code": "BT", + "name": "Banten" + }, + { + "code": "JT", + "name": "Jawa Tengah" + }, + { + "code": "JI", + "name": "Jawa Timur" + }, + { + "code": "YO", + "name": "Daerah Istimewa Yogyakarta" + }, + { + "code": "BA", + "name": "Bali" + }, + { + "code": "NB", + "name": "Nusa Tenggara Barat" + }, + { + "code": "NT", + "name": "Nusa Tenggara Timur" + }, + { + "code": "KB", + "name": "Kalimantan Barat" + }, + { + "code": "KT", + "name": "Kalimantan Tengah" + }, + { + "code": "KI", + "name": "Kalimantan Timur" + }, + { + "code": "KS", + "name": "Kalimantan Selatan" + }, + { + "code": "KU", + "name": "Kalimantan Utara" + }, + { + "code": "SA", + "name": "Sulawesi Utara" + }, + { + "code": "ST", + "name": "Sulawesi Tengah" + }, + { + "code": "SG", + "name": "Sulawesi Tenggara" + }, + { + "code": "SR", + "name": "Sulawesi Barat" + }, + { + "code": "SN", + "name": "Sulawesi Selatan" + }, + { + "code": "GO", + "name": "Gorontalo" + }, + { + "code": "MA", + "name": "Maluku" + }, + { + "code": "MU", + "name": "Maluku Utara" + }, + { + "code": "PA", + "name": "Papua" + }, + { + "code": "PB", + "name": "Papua Barat" + } + ] + }, + { + "code": "IL", + "name": "Israeli new shekel", + "currency_code": "ILS", + "currency_pos": "right_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IN", + "name": "Indian rupee", + "currency_code": "INR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "AP", + "name": "Andhra Pradesh" + }, + { + "code": "AR", + "name": "Arunachal Pradesh" + }, + { + "code": "AS", + "name": "Assam" + }, + { + "code": "BR", + "name": "Bihar" + }, + { + "code": "CT", + "name": "Chhattisgarh" + }, + { + "code": "GA", + "name": "Goa" + }, + { + "code": "GJ", + "name": "Gujarat" + }, + { + "code": "HR", + "name": "Haryana" + }, + { + "code": "HP", + "name": "Himachal Pradesh" + }, + { + "code": "JK", + "name": "Jammu and Kashmir" + }, + { + "code": "JH", + "name": "Jharkhand" + }, + { + "code": "KA", + "name": "Karnataka" + }, + { + "code": "KL", + "name": "Kerala" + }, + { + "code": "LA", + "name": "Ladakh" + }, + { + "code": "MP", + "name": "Madhya Pradesh" + }, + { + "code": "MH", + "name": "Maharashtra" + }, + { + "code": "MN", + "name": "Manipur" + }, + { + "code": "ML", + "name": "Meghalaya" + }, + { + "code": "MZ", + "name": "Mizoram" + }, + { + "code": "NL", + "name": "Nagaland" + }, + { + "code": "OR", + "name": "Odisha" + }, + { + "code": "PB", + "name": "Punjab" + }, + { + "code": "RJ", + "name": "Rajasthan" + }, + { + "code": "SK", + "name": "Sikkim" + }, + { + "code": "TN", + "name": "Tamil Nadu" + }, + { + "code": "TS", + "name": "Telangana" + }, + { + "code": "TR", + "name": "Tripura" + }, + { + "code": "UK", + "name": "Uttarakhand" + }, + { + "code": "UP", + "name": "Uttar Pradesh" + }, + { + "code": "WB", + "name": "West Bengal" + }, + { + "code": "AN", + "name": "Andaman and Nicobar Islands" + }, + { + "code": "CH", + "name": "Chandigarh" + }, + { + "code": "DN", + "name": "Dadra and Nagar Haveli" + }, + { + "code": "DD", + "name": "Daman and Diu" + }, + { + "code": "DL", + "name": "Delhi" + }, + { + "code": "LD", + "name": "Lakshadeep" + }, + { + "code": "PY", + "name": "Pondicherry (Puducherry)" + } + ] + }, + { + "code": "IO", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IQ", + "name": "Iraqi dinar", + "currency_code": "IQD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IR", + "name": "Iranian rial", + "currency_code": "IRR", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "KHZ", + "name": "Khuzestan (خوزستان)" + }, + { + "code": "THR", + "name": "Tehran (تهران)" + }, + { + "code": "ILM", + "name": "Ilaam (ایلام)" + }, + { + "code": "BHR", + "name": "Bushehr (بوشهر)" + }, + { + "code": "ADL", + "name": "Ardabil (اردبیل)" + }, + { + "code": "ESF", + "name": "Isfahan (اصفهان)" + }, + { + "code": "YZD", + "name": "Yazd (یزد)" + }, + { + "code": "KRH", + "name": "Kermanshah (کرمانشاه)" + }, + { + "code": "KRN", + "name": "Kerman (کرمان)" + }, + { + "code": "HDN", + "name": "Hamadan (همدان)" + }, + { + "code": "GZN", + "name": "Ghazvin (قزوین)" + }, + { + "code": "ZJN", + "name": "Zanjan (زنجان)" + }, + { + "code": "LRS", + "name": "Luristan (لرستان)" + }, + { + "code": "ABZ", + "name": "Alborz (البرز)" + }, + { + "code": "EAZ", + "name": "East Azarbaijan (آذربایجان شرقی)" + }, + { + "code": "WAZ", + "name": "West Azarbaijan (آذربایجان غربی)" + }, + { + "code": "CHB", + "name": "Chaharmahal and Bakhtiari (چهارمحال و بختیاری)" + }, + { + "code": "SKH", + "name": "South Khorasan (خراسان جنوبی)" + }, + { + "code": "RKH", + "name": "Razavi Khorasan (خراسان رضوی)" + }, + { + "code": "NKH", + "name": "North Khorasan (خراسان شمالی)" + }, + { + "code": "SMN", + "name": "Semnan (سمنان)" + }, + { + "code": "FRS", + "name": "Fars (فارس)" + }, + { + "code": "QHM", + "name": "Qom (قم)" + }, + { + "code": "KRD", + "name": "Kurdistan / کردستان)" + }, + { + "code": "KBD", + "name": "Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)" + }, + { + "code": "GLS", + "name": "Golestan (گلستان)" + }, + { + "code": "GIL", + "name": "Gilan (گیلان)" + }, + { + "code": "MZN", + "name": "Mazandaran (مازندران)" + }, + { + "code": "MKZ", + "name": "Markazi (مرکزی)" + }, + { + "code": "HRZ", + "name": "Hormozgan (هرمزگان)" + }, + { + "code": "SBN", + "name": "Sistan and Baluchestan (سیستان و بلوچستان)" + } + ] + }, + { + "code": "JO", + "name": "Jordanian dinar", + "currency_code": "JOD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "JP", + "name": "Japanese yen", + "currency_code": "JPY", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "JP01", + "name": "Hokkaido" + }, + { + "code": "JP02", + "name": "Aomori" + }, + { + "code": "JP03", + "name": "Iwate" + }, + { + "code": "JP04", + "name": "Miyagi" + }, + { + "code": "JP05", + "name": "Akita" + }, + { + "code": "JP06", + "name": "Yamagata" + }, + { + "code": "JP07", + "name": "Fukushima" + }, + { + "code": "JP08", + "name": "Ibaraki" + }, + { + "code": "JP09", + "name": "Tochigi" + }, + { + "code": "JP10", + "name": "Gunma" + }, + { + "code": "JP11", + "name": "Saitama" + }, + { + "code": "JP12", + "name": "Chiba" + }, + { + "code": "JP13", + "name": "Tokyo" + }, + { + "code": "JP14", + "name": "Kanagawa" + }, + { + "code": "JP15", + "name": "Niigata" + }, + { + "code": "JP16", + "name": "Toyama" + }, + { + "code": "JP17", + "name": "Ishikawa" + }, + { + "code": "JP18", + "name": "Fukui" + }, + { + "code": "JP19", + "name": "Yamanashi" + }, + { + "code": "JP20", + "name": "Nagano" + }, + { + "code": "JP21", + "name": "Gifu" + }, + { + "code": "JP22", + "name": "Shizuoka" + }, + { + "code": "JP23", + "name": "Aichi" + }, + { + "code": "JP24", + "name": "Mie" + }, + { + "code": "JP25", + "name": "Shiga" + }, + { + "code": "JP26", + "name": "Kyoto" + }, + { + "code": "JP27", + "name": "Osaka" + }, + { + "code": "JP28", + "name": "Hyogo" + }, + { + "code": "JP29", + "name": "Nara" + }, + { + "code": "JP30", + "name": "Wakayama" + }, + { + "code": "JP31", + "name": "Tottori" + }, + { + "code": "JP32", + "name": "Shimane" + }, + { + "code": "JP33", + "name": "Okayama" + }, + { + "code": "JP34", + "name": "Hiroshima" + }, + { + "code": "JP35", + "name": "Yamaguchi" + }, + { + "code": "JP36", + "name": "Tokushima" + }, + { + "code": "JP37", + "name": "Kagawa" + }, + { + "code": "JP38", + "name": "Ehime" + }, + { + "code": "JP39", + "name": "Kochi" + }, + { + "code": "JP40", + "name": "Fukuoka" + }, + { + "code": "JP41", + "name": "Saga" + }, + { + "code": "JP42", + "name": "Nagasaki" + }, + { + "code": "JP43", + "name": "Kumamoto" + }, + { + "code": "JP44", + "name": "Oita" + }, + { + "code": "JP45", + "name": "Miyazaki" + }, + { + "code": "JP46", + "name": "Kagoshima" + }, + { + "code": "JP47", + "name": "Okinawa" + } + ] + }, + { + "code": "KG", + "name": "Kyrgyzstani som", + "currency_code": "KGS", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KH", + "name": "Cambodian riel", + "currency_code": "KHR", + "currency_pos": "right", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KP", + "name": "North Korean won", + "currency_code": "KPW", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KR", + "name": "South Korean won", + "currency_code": "KRW", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KW", + "name": "Kuwaiti dinar", + "currency_code": "KWD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KZ", + "name": "Kazakhstani tenge", + "currency_code": "KZT", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LA", + "name": "Lao kip", + "currency_code": "LAK", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AT", + "name": "Attapeu" + }, + { + "code": "BK", + "name": "Bokeo" + }, + { + "code": "BL", + "name": "Bolikhamsai" + }, + { + "code": "CH", + "name": "Champasak" + }, + { + "code": "HO", + "name": "Houaphanh" + }, + { + "code": "KH", + "name": "Khammouane" + }, + { + "code": "LM", + "name": "Luang Namtha" + }, + { + "code": "LP", + "name": "Luang Prabang" + }, + { + "code": "OU", + "name": "Oudomxay" + }, + { + "code": "PH", + "name": "Phongsaly" + }, + { + "code": "SL", + "name": "Salavan" + }, + { + "code": "SV", + "name": "Savannakhet" + }, + { + "code": "VI", + "name": "Vientiane Province" + }, + { + "code": "VT", + "name": "Vientiane" + }, + { + "code": "XA", + "name": "Sainyabuli" + }, + { + "code": "XE", + "name": "Sekong" + }, + { + "code": "XI", + "name": "Xiangkhouang" + }, + { + "code": "XS", + "name": "Xaisomboun" + } + ] + }, + { + "code": "LB", + "name": "Lebanese pound", + "currency_code": "LBP", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LK", + "name": "Sri Lankan rupee", + "currency_code": "LKR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MM", + "name": "Burmese kyat", + "currency_code": "MMK", + "currency_pos": "right_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MN", + "name": "Mongolian tögrög", + "currency_code": "MNT", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MO", + "name": "Macanese pataca", + "currency_code": "MOP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MV", + "name": "Maldivian rufiyaa", + "currency_code": "MVR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MY", + "name": "Malaysian ringgit", + "currency_code": "MYR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "JHR", + "name": "Johor" + }, + { + "code": "KDH", + "name": "Kedah" + }, + { + "code": "KTN", + "name": "Kelantan" + }, + { + "code": "LBN", + "name": "Labuan" + }, + { + "code": "MLK", + "name": "Malacca (Melaka)" + }, + { + "code": "NSN", + "name": "Negeri Sembilan" + }, + { + "code": "PHG", + "name": "Pahang" + }, + { + "code": "PNG", + "name": "Penang (Pulau Pinang)" + }, + { + "code": "PRK", + "name": "Perak" + }, + { + "code": "PLS", + "name": "Perlis" + }, + { + "code": "SBH", + "name": "Sabah" + }, + { + "code": "SWK", + "name": "Sarawak" + }, + { + "code": "SGR", + "name": "Selangor" + }, + { + "code": "TRG", + "name": "Terengganu" + }, + { + "code": "PJY", + "name": "Putrajaya" + }, + { + "code": "KUL", + "name": "Kuala Lumpur" + } + ] + }, + { + "code": "NP", + "name": "Nepalese rupee", + "currency_code": "NPR", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "BAG", + "name": "Bagmati" + }, + { + "code": "BHE", + "name": "Bheri" + }, + { + "code": "DHA", + "name": "Dhaulagiri" + }, + { + "code": "GAN", + "name": "Gandaki" + }, + { + "code": "JAN", + "name": "Janakpur" + }, + { + "code": "KAR", + "name": "Karnali" + }, + { + "code": "KOS", + "name": "Koshi" + }, + { + "code": "LUM", + "name": "Lumbini" + }, + { + "code": "MAH", + "name": "Mahakali" + }, + { + "code": "MEC", + "name": "Mechi" + }, + { + "code": "NAR", + "name": "Narayani" + }, + { + "code": "RAP", + "name": "Rapti" + }, + { + "code": "SAG", + "name": "Sagarmatha" + }, + { + "code": "SET", + "name": "Seti" + } + ] + }, + { + "code": "OM", + "name": "Omani rial", + "currency_code": "OMR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PH", + "name": "Philippine peso", + "currency_code": "PHP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "ABR", + "name": "Abra" + }, + { + "code": "AGN", + "name": "Agusan del Norte" + }, + { + "code": "AGS", + "name": "Agusan del Sur" + }, + { + "code": "AKL", + "name": "Aklan" + }, + { + "code": "ALB", + "name": "Albay" + }, + { + "code": "ANT", + "name": "Antique" + }, + { + "code": "APA", + "name": "Apayao" + }, + { + "code": "AUR", + "name": "Aurora" + }, + { + "code": "BAS", + "name": "Basilan" + }, + { + "code": "BAN", + "name": "Bataan" + }, + { + "code": "BTN", + "name": "Batanes" + }, + { + "code": "BTG", + "name": "Batangas" + }, + { + "code": "BEN", + "name": "Benguet" + }, + { + "code": "BIL", + "name": "Biliran" + }, + { + "code": "BOH", + "name": "Bohol" + }, + { + "code": "BUK", + "name": "Bukidnon" + }, + { + "code": "BUL", + "name": "Bulacan" + }, + { + "code": "CAG", + "name": "Cagayan" + }, + { + "code": "CAN", + "name": "Camarines Norte" + }, + { + "code": "CAS", + "name": "Camarines Sur" + }, + { + "code": "CAM", + "name": "Camiguin" + }, + { + "code": "CAP", + "name": "Capiz" + }, + { + "code": "CAT", + "name": "Catanduanes" + }, + { + "code": "CAV", + "name": "Cavite" + }, + { + "code": "CEB", + "name": "Cebu" + }, + { + "code": "COM", + "name": "Compostela Valley" + }, + { + "code": "NCO", + "name": "Cotabato" + }, + { + "code": "DAV", + "name": "Davao del Norte" + }, + { + "code": "DAS", + "name": "Davao del Sur" + }, + { + "code": "DAC", + "name": "Davao Occidental" + }, + { + "code": "DAO", + "name": "Davao Oriental" + }, + { + "code": "DIN", + "name": "Dinagat Islands" + }, + { + "code": "EAS", + "name": "Eastern Samar" + }, + { + "code": "GUI", + "name": "Guimaras" + }, + { + "code": "IFU", + "name": "Ifugao" + }, + { + "code": "ILN", + "name": "Ilocos Norte" + }, + { + "code": "ILS", + "name": "Ilocos Sur" + }, + { + "code": "ILI", + "name": "Iloilo" + }, + { + "code": "ISA", + "name": "Isabela" + }, + { + "code": "KAL", + "name": "Kalinga" + }, + { + "code": "LUN", + "name": "La Union" + }, + { + "code": "LAG", + "name": "Laguna" + }, + { + "code": "LAN", + "name": "Lanao del Norte" + }, + { + "code": "LAS", + "name": "Lanao del Sur" + }, + { + "code": "LEY", + "name": "Leyte" + }, + { + "code": "MAG", + "name": "Maguindanao" + }, + { + "code": "MAD", + "name": "Marinduque" + }, + { + "code": "MAS", + "name": "Masbate" + }, + { + "code": "MSC", + "name": "Misamis Occidental" + }, + { + "code": "MSR", + "name": "Misamis Oriental" + }, + { + "code": "MOU", + "name": "Mountain Province" + }, + { + "code": "NEC", + "name": "Negros Occidental" + }, + { + "code": "NER", + "name": "Negros Oriental" + }, + { + "code": "NSA", + "name": "Northern Samar" + }, + { + "code": "NUE", + "name": "Nueva Ecija" + }, + { + "code": "NUV", + "name": "Nueva Vizcaya" + }, + { + "code": "MDC", + "name": "Occidental Mindoro" + }, + { + "code": "MDR", + "name": "Oriental Mindoro" + }, + { + "code": "PLW", + "name": "Palawan" + }, + { + "code": "PAM", + "name": "Pampanga" + }, + { + "code": "PAN", + "name": "Pangasinan" + }, + { + "code": "QUE", + "name": "Quezon" + }, + { + "code": "QUI", + "name": "Quirino" + }, + { + "code": "RIZ", + "name": "Rizal" + }, + { + "code": "ROM", + "name": "Romblon" + }, + { + "code": "WSA", + "name": "Samar" + }, + { + "code": "SAR", + "name": "Sarangani" + }, + { + "code": "SIQ", + "name": "Siquijor" + }, + { + "code": "SOR", + "name": "Sorsogon" + }, + { + "code": "SCO", + "name": "South Cotabato" + }, + { + "code": "SLE", + "name": "Southern Leyte" + }, + { + "code": "SUK", + "name": "Sultan Kudarat" + }, + { + "code": "SLU", + "name": "Sulu" + }, + { + "code": "SUN", + "name": "Surigao del Norte" + }, + { + "code": "SUR", + "name": "Surigao del Sur" + }, + { + "code": "TAR", + "name": "Tarlac" + }, + { + "code": "TAW", + "name": "Tawi-Tawi" + }, + { + "code": "ZMB", + "name": "Zambales" + }, + { + "code": "ZAN", + "name": "Zamboanga del Norte" + }, + { + "code": "ZAS", + "name": "Zamboanga del Sur" + }, + { + "code": "ZSI", + "name": "Zamboanga Sibugay" + }, + { + "code": "00", + "name": "Metro Manila" + } + ] + }, + { + "code": "PK", + "name": "Pakistani rupee", + "currency_code": "PKR", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "JK", + "name": "Azad Kashmir" + }, + { + "code": "BA", + "name": "Balochistan" + }, + { + "code": "TA", + "name": "FATA" + }, + { + "code": "GB", + "name": "Gilgit Baltistan" + }, + { + "code": "IS", + "name": "Islamabad Capital Territory" + }, + { + "code": "KP", + "name": "Khyber Pakhtunkhwa" + }, + { + "code": "PB", + "name": "Punjab" + }, + { + "code": "SD", + "name": "Sindh" + } + ] + }, + { + "code": "PS", + "name": "Jordanian dinar", + "currency_code": "JOD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 3, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "QA", + "name": "Qatari riyal", + "currency_code": "QAR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SA", + "name": "Saudi riyal", + "currency_code": "SAR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SG", + "name": "Singapore dollar", + "currency_code": "SGD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SY", + "name": "Syrian pound", + "currency_code": "SYP", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TH", + "name": "Thai baht", + "currency_code": "THB", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "TH-37", + "name": "Amnat Charoen" + }, + { + "code": "TH-15", + "name": "Ang Thong" + }, + { + "code": "TH-14", + "name": "Ayutthaya" + }, + { + "code": "TH-10", + "name": "Bangkok" + }, + { + "code": "TH-38", + "name": "Bueng Kan" + }, + { + "code": "TH-31", + "name": "Buri Ram" + }, + { + "code": "TH-24", + "name": "Chachoengsao" + }, + { + "code": "TH-18", + "name": "Chai Nat" + }, + { + "code": "TH-36", + "name": "Chaiyaphum" + }, + { + "code": "TH-22", + "name": "Chanthaburi" + }, + { + "code": "TH-50", + "name": "Chiang Mai" + }, + { + "code": "TH-57", + "name": "Chiang Rai" + }, + { + "code": "TH-20", + "name": "Chonburi" + }, + { + "code": "TH-86", + "name": "Chumphon" + }, + { + "code": "TH-46", + "name": "Kalasin" + }, + { + "code": "TH-62", + "name": "Kamphaeng Phet" + }, + { + "code": "TH-71", + "name": "Kanchanaburi" + }, + { + "code": "TH-40", + "name": "Khon Kaen" + }, + { + "code": "TH-81", + "name": "Krabi" + }, + { + "code": "TH-52", + "name": "Lampang" + }, + { + "code": "TH-51", + "name": "Lamphun" + }, + { + "code": "TH-42", + "name": "Loei" + }, + { + "code": "TH-16", + "name": "Lopburi" + }, + { + "code": "TH-58", + "name": "Mae Hong Son" + }, + { + "code": "TH-44", + "name": "Maha Sarakham" + }, + { + "code": "TH-49", + "name": "Mukdahan" + }, + { + "code": "TH-26", + "name": "Nakhon Nayok" + }, + { + "code": "TH-73", + "name": "Nakhon Pathom" + }, + { + "code": "TH-48", + "name": "Nakhon Phanom" + }, + { + "code": "TH-30", + "name": "Nakhon Ratchasima" + }, + { + "code": "TH-60", + "name": "Nakhon Sawan" + }, + { + "code": "TH-80", + "name": "Nakhon Si Thammarat" + }, + { + "code": "TH-55", + "name": "Nan" + }, + { + "code": "TH-96", + "name": "Narathiwat" + }, + { + "code": "TH-39", + "name": "Nong Bua Lam Phu" + }, + { + "code": "TH-43", + "name": "Nong Khai" + }, + { + "code": "TH-12", + "name": "Nonthaburi" + }, + { + "code": "TH-13", + "name": "Pathum Thani" + }, + { + "code": "TH-94", + "name": "Pattani" + }, + { + "code": "TH-82", + "name": "Phang Nga" + }, + { + "code": "TH-93", + "name": "Phatthalung" + }, + { + "code": "TH-56", + "name": "Phayao" + }, + { + "code": "TH-67", + "name": "Phetchabun" + }, + { + "code": "TH-76", + "name": "Phetchaburi" + }, + { + "code": "TH-66", + "name": "Phichit" + }, + { + "code": "TH-65", + "name": "Phitsanulok" + }, + { + "code": "TH-54", + "name": "Phrae" + }, + { + "code": "TH-83", + "name": "Phuket" + }, + { + "code": "TH-25", + "name": "Prachin Buri" + }, + { + "code": "TH-77", + "name": "Prachuap Khiri Khan" + }, + { + "code": "TH-85", + "name": "Ranong" + }, + { + "code": "TH-70", + "name": "Ratchaburi" + }, + { + "code": "TH-21", + "name": "Rayong" + }, + { + "code": "TH-45", + "name": "Roi Et" + }, + { + "code": "TH-27", + "name": "Sa Kaeo" + }, + { + "code": "TH-47", + "name": "Sakon Nakhon" + }, + { + "code": "TH-11", + "name": "Samut Prakan" + }, + { + "code": "TH-74", + "name": "Samut Sakhon" + }, + { + "code": "TH-75", + "name": "Samut Songkhram" + }, + { + "code": "TH-19", + "name": "Saraburi" + }, + { + "code": "TH-91", + "name": "Satun" + }, + { + "code": "TH-17", + "name": "Sing Buri" + }, + { + "code": "TH-33", + "name": "Sisaket" + }, + { + "code": "TH-90", + "name": "Songkhla" + }, + { + "code": "TH-64", + "name": "Sukhothai" + }, + { + "code": "TH-72", + "name": "Suphan Buri" + }, + { + "code": "TH-84", + "name": "Surat Thani" + }, + { + "code": "TH-32", + "name": "Surin" + }, + { + "code": "TH-63", + "name": "Tak" + }, + { + "code": "TH-92", + "name": "Trang" + }, + { + "code": "TH-23", + "name": "Trat" + }, + { + "code": "TH-34", + "name": "Ubon Ratchathani" + }, + { + "code": "TH-41", + "name": "Udon Thani" + }, + { + "code": "TH-61", + "name": "Uthai Thani" + }, + { + "code": "TH-53", + "name": "Uttaradit" + }, + { + "code": "TH-95", + "name": "Yala" + }, + { + "code": "TH-35", + "name": "Yasothon" + } + ] + }, + { + "code": "TJ", + "name": "Tajikistani somoni", + "currency_code": "TJS", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TL", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TM", + "name": "Turkmenistan manat", + "currency_code": "TMT", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TW", + "name": "New Taiwan dollar", + "currency_code": "TWD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "UZ", + "name": "Uzbekistani som", + "currency_code": "UZS", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "VN", + "name": "Vietnamese đồng", + "currency_code": "VND", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "YE", + "name": "Yemeni rial", + "currency_code": "YER", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + } + ], + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "EU", + "name": "Europe", + "countries": [{ + "code": "AD", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AL", + "name": "Albanian lek", + "currency_code": "ALL", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "AL-01", + "name": "Berat" + }, + { + "code": "AL-09", + "name": "Dibër" + }, + { + "code": "AL-02", + "name": "Durrës" + }, + { + "code": "AL-03", + "name": "Elbasan" + }, + { + "code": "AL-04", + "name": "Fier" + }, + { + "code": "AL-05", + "name": "Gjirokastër" + }, + { + "code": "AL-06", + "name": "Korçë" + }, + { + "code": "AL-07", + "name": "Kukës" + }, + { + "code": "AL-08", + "name": "Lezhë" + }, + { + "code": "AL-10", + "name": "Shkodër" + }, + { + "code": "AL-11", + "name": "Tirana" + }, + { + "code": "AL-12", + "name": "Vlorë" + } + ] + }, + { + "code": "AT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AX", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BA", + "name": "Bosnia and Herzegovina convertible mark", + "currency_code": "BAM", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BG", + "name": "Bulgarian lev", + "currency_code": "BGN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "BG-01", + "name": "Blagoevgrad" + }, + { + "code": "BG-02", + "name": "Burgas" + }, + { + "code": "BG-08", + "name": "Dobrich" + }, + { + "code": "BG-07", + "name": "Gabrovo" + }, + { + "code": "BG-26", + "name": "Haskovo" + }, + { + "code": "BG-09", + "name": "Kardzhali" + }, + { + "code": "BG-10", + "name": "Kyustendil" + }, + { + "code": "BG-11", + "name": "Lovech" + }, + { + "code": "BG-12", + "name": "Montana" + }, + { + "code": "BG-13", + "name": "Pazardzhik" + }, + { + "code": "BG-14", + "name": "Pernik" + }, + { + "code": "BG-15", + "name": "Pleven" + }, + { + "code": "BG-16", + "name": "Plovdiv" + }, + { + "code": "BG-17", + "name": "Razgrad" + }, + { + "code": "BG-18", + "name": "Ruse" + }, + { + "code": "BG-27", + "name": "Shumen" + }, + { + "code": "BG-19", + "name": "Silistra" + }, + { + "code": "BG-20", + "name": "Sliven" + }, + { + "code": "BG-21", + "name": "Smolyan" + }, + { + "code": "BG-23", + "name": "Sofia District" + }, + { + "code": "BG-22", + "name": "Sofia" + }, + { + "code": "BG-24", + "name": "Stara Zagora" + }, + { + "code": "BG-25", + "name": "Targovishte" + }, + { + "code": "BG-03", + "name": "Varna" + }, + { + "code": "BG-04", + "name": "Veliko Tarnovo" + }, + { + "code": "BG-05", + "name": "Vidin" + }, + { + "code": "BG-06", + "name": "Vratsa" + }, + { + "code": "BG-28", + "name": "Yambol" + } + ] + }, + { + "code": "BY", + "name": "Belarusian ruble", + "currency_code": "BYN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CH", + "name": "Swiss franc", + "currency_code": "CHF", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": "'", + "weight_unit": "kg", + "states": [{ + "code": "AG", + "name": "Aargau" + }, + { + "code": "AR", + "name": "Appenzell Ausserrhoden" + }, + { + "code": "AI", + "name": "Appenzell Innerrhoden" + }, + { + "code": "BL", + "name": "Basel-Landschaft" + }, + { + "code": "BS", + "name": "Basel-Stadt" + }, + { + "code": "BE", + "name": "Bern" + }, + { + "code": "FR", + "name": "Fribourg" + }, + { + "code": "GE", + "name": "Geneva" + }, + { + "code": "GL", + "name": "Glarus" + }, + { + "code": "GR", + "name": "Graubünden" + }, + { + "code": "JU", + "name": "Jura" + }, + { + "code": "LU", + "name": "Luzern" + }, + { + "code": "NE", + "name": "Neuchâtel" + }, + { + "code": "NW", + "name": "Nidwalden" + }, + { + "code": "OW", + "name": "Obwalden" + }, + { + "code": "SH", + "name": "Schaffhausen" + }, + { + "code": "SZ", + "name": "Schwyz" + }, + { + "code": "SO", + "name": "Solothurn" + }, + { + "code": "SG", + "name": "St. Gallen" + }, + { + "code": "TG", + "name": "Thurgau" + }, + { + "code": "TI", + "name": "Ticino" + }, + { + "code": "UR", + "name": "Uri" + }, + { + "code": "VS", + "name": "Valais" + }, + { + "code": "VD", + "name": "Vaud" + }, + { + "code": "ZG", + "name": "Zug" + }, + { + "code": "ZH", + "name": "Zürich" + } + ] + }, + { + "code": "CZ", + "name": "Czech koruna", + "currency_code": "CZK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "DE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "DE-BW", + "name": "Baden-Württemberg" + }, + { + "code": "DE-BY", + "name": "Bavaria" + }, + { + "code": "DE-BE", + "name": "Berlin" + }, + { + "code": "DE-BB", + "name": "Brandenburg" + }, + { + "code": "DE-HB", + "name": "Bremen" + }, + { + "code": "DE-HH", + "name": "Hamburg" + }, + { + "code": "DE-HE", + "name": "Hesse" + }, + { + "code": "DE-MV", + "name": "Mecklenburg-Vorpommern" + }, + { + "code": "DE-NI", + "name": "Lower Saxony" + }, + { + "code": "DE-NW", + "name": "North Rhine-Westphalia" + }, + { + "code": "DE-RP", + "name": "Rhineland-Palatinate" + }, + { + "code": "DE-SL", + "name": "Saarland" + }, + { + "code": "DE-SN", + "name": "Saxony" + }, + { + "code": "DE-ST", + "name": "Saxony-Anhalt" + }, + { + "code": "DE-SH", + "name": "Schleswig-Holstein" + }, + { + "code": "DE-TH", + "name": "Thuringia" + } + ] + }, + { + "code": "DK", + "name": "Danish krone", + "currency_code": "DKK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "EE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ES", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "C", + "name": "A Coruña" + }, + { + "code": "VI", + "name": "Araba/Álava" + }, + { + "code": "AB", + "name": "Albacete" + }, + { + "code": "A", + "name": "Alicante" + }, + { + "code": "AL", + "name": "Almería" + }, + { + "code": "O", + "name": "Asturias" + }, + { + "code": "AV", + "name": "Ávila" + }, + { + "code": "BA", + "name": "Badajoz" + }, + { + "code": "PM", + "name": "Baleares" + }, + { + "code": "B", + "name": "Barcelona" + }, + { + "code": "BU", + "name": "Burgos" + }, + { + "code": "CC", + "name": "Cáceres" + }, + { + "code": "CA", + "name": "Cádiz" + }, + { + "code": "S", + "name": "Cantabria" + }, + { + "code": "CS", + "name": "Castellón" + }, + { + "code": "CE", + "name": "Ceuta" + }, + { + "code": "CR", + "name": "Ciudad Real" + }, + { + "code": "CO", + "name": "Córdoba" + }, + { + "code": "CU", + "name": "Cuenca" + }, + { + "code": "GI", + "name": "Girona" + }, + { + "code": "GR", + "name": "Granada" + }, + { + "code": "GU", + "name": "Guadalajara" + }, + { + "code": "SS", + "name": "Gipuzkoa" + }, + { + "code": "H", + "name": "Huelva" + }, + { + "code": "HU", + "name": "Huesca" + }, + { + "code": "J", + "name": "Jaén" + }, + { + "code": "LO", + "name": "La Rioja" + }, + { + "code": "GC", + "name": "Las Palmas" + }, + { + "code": "LE", + "name": "León" + }, + { + "code": "L", + "name": "Lleida" + }, + { + "code": "LU", + "name": "Lugo" + }, + { + "code": "M", + "name": "Madrid" + }, + { + "code": "MA", + "name": "Málaga" + }, + { + "code": "ML", + "name": "Melilla" + }, + { + "code": "MU", + "name": "Murcia" + }, + { + "code": "NA", + "name": "Navarra" + }, + { + "code": "OR", + "name": "Ourense" + }, + { + "code": "P", + "name": "Palencia" + }, + { + "code": "PO", + "name": "Pontevedra" + }, + { + "code": "SA", + "name": "Salamanca" + }, + { + "code": "TF", + "name": "Santa Cruz de Tenerife" + }, + { + "code": "SG", + "name": "Segovia" + }, + { + "code": "SE", + "name": "Sevilla" + }, + { + "code": "SO", + "name": "Soria" + }, + { + "code": "T", + "name": "Tarragona" + }, + { + "code": "TE", + "name": "Teruel" + }, + { + "code": "TO", + "name": "Toledo" + }, + { + "code": "V", + "name": "Valencia" + }, + { + "code": "VA", + "name": "Valladolid" + }, + { + "code": "BI", + "name": "Biscay" + }, + { + "code": "ZA", + "name": "Zamora" + }, + { + "code": "Z", + "name": "Zaragoza" + } + ] + }, + { + "code": "FI", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "FO", + "name": "Danish krone", + "currency_code": "DKK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "FR", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GB", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "foot", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "oz", + "states": [] + }, + { + "code": "GG", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GI", + "name": "Gibraltar pound", + "currency_code": "GIP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GR", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "I", + "name": "Attica" + }, + { + "code": "A", + "name": "East Macedonia and Thrace" + }, + { + "code": "B", + "name": "Central Macedonia" + }, + { + "code": "C", + "name": "West Macedonia" + }, + { + "code": "D", + "name": "Epirus" + }, + { + "code": "E", + "name": "Thessaly" + }, + { + "code": "F", + "name": "Ionian Islands" + }, + { + "code": "G", + "name": "West Greece" + }, + { + "code": "H", + "name": "Central Greece" + }, + { + "code": "J", + "name": "Peloponnese" + }, + { + "code": "K", + "name": "North Aegean" + }, + { + "code": "L", + "name": "South Aegean" + }, + { + "code": "M", + "name": "Crete" + } + ] + }, + { + "code": "HR", + "name": "Croatian kuna", + "currency_code": "HRK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "HU", + "name": "Hungarian forint", + "currency_code": "HUF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "BK", + "name": "Bács-Kiskun" + }, + { + "code": "BE", + "name": "Békés" + }, + { + "code": "BA", + "name": "Baranya" + }, + { + "code": "BZ", + "name": "Borsod-Abaúj-Zemplén" + }, + { + "code": "BU", + "name": "Budapest" + }, + { + "code": "CS", + "name": "Csongrád-Csanád" + }, + { + "code": "FE", + "name": "Fejér" + }, + { + "code": "GS", + "name": "Győr-Moson-Sopron" + }, + { + "code": "HB", + "name": "Hajdú-Bihar" + }, + { + "code": "HE", + "name": "Heves" + }, + { + "code": "JN", + "name": "Jász-Nagykun-Szolnok" + }, + { + "code": "KE", + "name": "Komárom-Esztergom" + }, + { + "code": "NO", + "name": "Nógrád" + }, + { + "code": "PE", + "name": "Pest" + }, + { + "code": "SO", + "name": "Somogy" + }, + { + "code": "SZ", + "name": "Szabolcs-Szatmár-Bereg" + }, + { + "code": "TO", + "name": "Tolna" + }, + { + "code": "VA", + "name": "Vas" + }, + { + "code": "VE", + "name": "Veszprém" + }, + { + "code": "ZA", + "name": "Zala" + } + ] + }, + { + "code": "IE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "CW", + "name": "Carlow" + }, + { + "code": "CN", + "name": "Cavan" + }, + { + "code": "CE", + "name": "Clare" + }, + { + "code": "CO", + "name": "Cork" + }, + { + "code": "DL", + "name": "Donegal" + }, + { + "code": "D", + "name": "Dublin" + }, + { + "code": "G", + "name": "Galway" + }, + { + "code": "KY", + "name": "Kerry" + }, + { + "code": "KE", + "name": "Kildare" + }, + { + "code": "KK", + "name": "Kilkenny" + }, + { + "code": "LS", + "name": "Laois" + }, + { + "code": "LM", + "name": "Leitrim" + }, + { + "code": "LK", + "name": "Limerick" + }, + { + "code": "LD", + "name": "Longford" + }, + { + "code": "LH", + "name": "Louth" + }, + { + "code": "MO", + "name": "Mayo" + }, + { + "code": "MH", + "name": "Meath" + }, + { + "code": "MN", + "name": "Monaghan" + }, + { + "code": "OY", + "name": "Offaly" + }, + { + "code": "RN", + "name": "Roscommon" + }, + { + "code": "SO", + "name": "Sligo" + }, + { + "code": "TA", + "name": "Tipperary" + }, + { + "code": "WD", + "name": "Waterford" + }, + { + "code": "WH", + "name": "Westmeath" + }, + { + "code": "WX", + "name": "Wexford" + }, + { + "code": "WW", + "name": "Wicklow" + } + ] + }, + { + "code": "IM", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IS", + "name": "Icelandic króna", + "currency_code": "ISK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AG", + "name": "Agrigento" + }, + { + "code": "AL", + "name": "Alessandria" + }, + { + "code": "AN", + "name": "Ancona" + }, + { + "code": "AO", + "name": "Aosta" + }, + { + "code": "AR", + "name": "Arezzo" + }, + { + "code": "AP", + "name": "Ascoli Piceno" + }, + { + "code": "AT", + "name": "Asti" + }, + { + "code": "AV", + "name": "Avellino" + }, + { + "code": "BA", + "name": "Bari" + }, + { + "code": "BT", + "name": "Barletta-Andria-Trani" + }, + { + "code": "BL", + "name": "Belluno" + }, + { + "code": "BN", + "name": "Benevento" + }, + { + "code": "BG", + "name": "Bergamo" + }, + { + "code": "BI", + "name": "Biella" + }, + { + "code": "BO", + "name": "Bologna" + }, + { + "code": "BZ", + "name": "Bolzano" + }, + { + "code": "BS", + "name": "Brescia" + }, + { + "code": "BR", + "name": "Brindisi" + }, + { + "code": "CA", + "name": "Cagliari" + }, + { + "code": "CL", + "name": "Caltanissetta" + }, + { + "code": "CB", + "name": "Campobasso" + }, + { + "code": "CE", + "name": "Caserta" + }, + { + "code": "CT", + "name": "Catania" + }, + { + "code": "CZ", + "name": "Catanzaro" + }, + { + "code": "CH", + "name": "Chieti" + }, + { + "code": "CO", + "name": "Como" + }, + { + "code": "CS", + "name": "Cosenza" + }, + { + "code": "CR", + "name": "Cremona" + }, + { + "code": "KR", + "name": "Crotone" + }, + { + "code": "CN", + "name": "Cuneo" + }, + { + "code": "EN", + "name": "Enna" + }, + { + "code": "FM", + "name": "Fermo" + }, + { + "code": "FE", + "name": "Ferrara" + }, + { + "code": "FI", + "name": "Firenze" + }, + { + "code": "FG", + "name": "Foggia" + }, + { + "code": "FC", + "name": "Forlì-Cesena" + }, + { + "code": "FR", + "name": "Frosinone" + }, + { + "code": "GE", + "name": "Genova" + }, + { + "code": "GO", + "name": "Gorizia" + }, + { + "code": "GR", + "name": "Grosseto" + }, + { + "code": "IM", + "name": "Imperia" + }, + { + "code": "IS", + "name": "Isernia" + }, + { + "code": "SP", + "name": "La Spezia" + }, + { + "code": "AQ", + "name": "L'Aquila" + }, + { + "code": "LT", + "name": "Latina" + }, + { + "code": "LE", + "name": "Lecce" + }, + { + "code": "LC", + "name": "Lecco" + }, + { + "code": "LI", + "name": "Livorno" + }, + { + "code": "LO", + "name": "Lodi" + }, + { + "code": "LU", + "name": "Lucca" + }, + { + "code": "MC", + "name": "Macerata" + }, + { + "code": "MN", + "name": "Mantova" + }, + { + "code": "MS", + "name": "Massa-Carrara" + }, + { + "code": "MT", + "name": "Matera" + }, + { + "code": "ME", + "name": "Messina" + }, + { + "code": "MI", + "name": "Milano" + }, + { + "code": "MO", + "name": "Modena" + }, + { + "code": "MB", + "name": "Monza e della Brianza" + }, + { + "code": "NA", + "name": "Napoli" + }, + { + "code": "NO", + "name": "Novara" + }, + { + "code": "NU", + "name": "Nuoro" + }, + { + "code": "OR", + "name": "Oristano" + }, + { + "code": "PD", + "name": "Padova" + }, + { + "code": "PA", + "name": "Palermo" + }, + { + "code": "PR", + "name": "Parma" + }, + { + "code": "PV", + "name": "Pavia" + }, + { + "code": "PG", + "name": "Perugia" + }, + { + "code": "PU", + "name": "Pesaro e Urbino" + }, + { + "code": "PE", + "name": "Pescara" + }, + { + "code": "PC", + "name": "Piacenza" + }, + { + "code": "PI", + "name": "Pisa" + }, + { + "code": "PT", + "name": "Pistoia" + }, + { + "code": "PN", + "name": "Pordenone" + }, + { + "code": "PZ", + "name": "Potenza" + }, + { + "code": "PO", + "name": "Prato" + }, + { + "code": "RG", + "name": "Ragusa" + }, + { + "code": "RA", + "name": "Ravenna" + }, + { + "code": "RC", + "name": "Reggio Calabria" + }, + { + "code": "RE", + "name": "Reggio Emilia" + }, + { + "code": "RI", + "name": "Rieti" + }, + { + "code": "RN", + "name": "Rimini" + }, + { + "code": "RM", + "name": "Roma" + }, + { + "code": "RO", + "name": "Rovigo" + }, + { + "code": "SA", + "name": "Salerno" + }, + { + "code": "SS", + "name": "Sassari" + }, + { + "code": "SV", + "name": "Savona" + }, + { + "code": "SI", + "name": "Siena" + }, + { + "code": "SR", + "name": "Siracusa" + }, + { + "code": "SO", + "name": "Sondrio" + }, + { + "code": "SU", + "name": "Sud Sardegna" + }, + { + "code": "TA", + "name": "Taranto" + }, + { + "code": "TE", + "name": "Teramo" + }, + { + "code": "TR", + "name": "Terni" + }, + { + "code": "TO", + "name": "Torino" + }, + { + "code": "TP", + "name": "Trapani" + }, + { + "code": "TN", + "name": "Trento" + }, + { + "code": "TV", + "name": "Treviso" + }, + { + "code": "TS", + "name": "Trieste" + }, + { + "code": "UD", + "name": "Udine" + }, + { + "code": "VA", + "name": "Varese" + }, + { + "code": "VE", + "name": "Venezia" + }, + { + "code": "VB", + "name": "Verbano-Cusio-Ossola" + }, + { + "code": "VC", + "name": "Vercelli" + }, + { + "code": "VR", + "name": "Verona" + }, + { + "code": "VV", + "name": "Vibo Valentia" + }, + { + "code": "VI", + "name": "Vicenza" + }, + { + "code": "VT", + "name": "Viterbo" + } + ] + }, + { + "code": "JE", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LI", + "name": "Swiss franc", + "currency_code": "CHF", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": "'", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LU", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LV", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MC", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MD", + "name": "Moldovan leu", + "currency_code": "MDL", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "C", + "name": "Chișinău" + }, + { + "code": "BL", + "name": "Bălți" + }, + { + "code": "AN", + "name": "Anenii Noi" + }, + { + "code": "BS", + "name": "Basarabeasca" + }, + { + "code": "BR", + "name": "Briceni" + }, + { + "code": "CH", + "name": "Cahul" + }, + { + "code": "CT", + "name": "Cantemir" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Căușeni" + }, + { + "code": "CM", + "name": "Cimișlia" + }, + { + "code": "CR", + "name": "Criuleni" + }, + { + "code": "DN", + "name": "Dondușeni" + }, + { + "code": "DR", + "name": "Drochia" + }, + { + "code": "DB", + "name": "Dubăsari" + }, + { + "code": "ED", + "name": "Edineț" + }, + { + "code": "FL", + "name": "Fălești" + }, + { + "code": "FR", + "name": "Florești" + }, + { + "code": "GE", + "name": "UTA Găgăuzia" + }, + { + "code": "GL", + "name": "Glodeni" + }, + { + "code": "HN", + "name": "Hîncești" + }, + { + "code": "IL", + "name": "Ialoveni" + }, + { + "code": "LV", + "name": "Leova" + }, + { + "code": "NS", + "name": "Nisporeni" + }, + { + "code": "OC", + "name": "Ocnița" + }, + { + "code": "OR", + "name": "Orhei" + }, + { + "code": "RZ", + "name": "Rezina" + }, + { + "code": "RS", + "name": "Rîșcani" + }, + { + "code": "SG", + "name": "Sîngerei" + }, + { + "code": "SR", + "name": "Soroca" + }, + { + "code": "ST", + "name": "Strășeni" + }, + { + "code": "SD", + "name": "Șoldănești" + }, + { + "code": "SV", + "name": "Ștefan Vodă" + }, + { + "code": "TR", + "name": "Taraclia" + }, + { + "code": "TL", + "name": "Telenești" + }, + { + "code": "UN", + "name": "Ungheni" + } + ] + }, + { + "code": "ME", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MK", + "name": "Macedonian denar", + "currency_code": "MKD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NL", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NO", + "name": "Norwegian krone", + "currency_code": "NOK", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PL", + "name": "Polish złoty", + "currency_code": "PLN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "RO", + "name": "Romanian leu", + "currency_code": "RON", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AB", + "name": "Alba" + }, + { + "code": "AR", + "name": "Arad" + }, + { + "code": "AG", + "name": "Argeș" + }, + { + "code": "BC", + "name": "Bacău" + }, + { + "code": "BH", + "name": "Bihor" + }, + { + "code": "BN", + "name": "Bistrița-Năsăud" + }, + { + "code": "BT", + "name": "Botoșani" + }, + { + "code": "BR", + "name": "Brăila" + }, + { + "code": "BV", + "name": "Brașov" + }, + { + "code": "B", + "name": "București" + }, + { + "code": "BZ", + "name": "Buzău" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Caraș-Severin" + }, + { + "code": "CJ", + "name": "Cluj" + }, + { + "code": "CT", + "name": "Constanța" + }, + { + "code": "CV", + "name": "Covasna" + }, + { + "code": "DB", + "name": "Dâmbovița" + }, + { + "code": "DJ", + "name": "Dolj" + }, + { + "code": "GL", + "name": "Galați" + }, + { + "code": "GR", + "name": "Giurgiu" + }, + { + "code": "GJ", + "name": "Gorj" + }, + { + "code": "HR", + "name": "Harghita" + }, + { + "code": "HD", + "name": "Hunedoara" + }, + { + "code": "IL", + "name": "Ialomița" + }, + { + "code": "IS", + "name": "Iași" + }, + { + "code": "IF", + "name": "Ilfov" + }, + { + "code": "MM", + "name": "Maramureș" + }, + { + "code": "MH", + "name": "Mehedinți" + }, + { + "code": "MS", + "name": "Mureș" + }, + { + "code": "NT", + "name": "Neamț" + }, + { + "code": "OT", + "name": "Olt" + }, + { + "code": "PH", + "name": "Prahova" + }, + { + "code": "SJ", + "name": "Sălaj" + }, + { + "code": "SM", + "name": "Satu Mare" + }, + { + "code": "SB", + "name": "Sibiu" + }, + { + "code": "SV", + "name": "Suceava" + }, + { + "code": "TR", + "name": "Teleorman" + }, + { + "code": "TM", + "name": "Timiș" + }, + { + "code": "TL", + "name": "Tulcea" + }, + { + "code": "VL", + "name": "Vâlcea" + }, + { + "code": "VS", + "name": "Vaslui" + }, + { + "code": "VN", + "name": "Vrancea" + } + ] + }, + { + "code": "RS", + "name": "Serbian dinar", + "currency_code": "RSD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "RS00", + "name": "Belgrade" + }, + { + "code": "RS14", + "name": "Bor" + }, + { + "code": "RS11", + "name": "Braničevo" + }, + { + "code": "RS02", + "name": "Central Banat" + }, + { + "code": "RS10", + "name": "Danube" + }, + { + "code": "RS23", + "name": "Jablanica" + }, + { + "code": "RS09", + "name": "Kolubara" + }, + { + "code": "RS08", + "name": "Mačva" + }, + { + "code": "RS17", + "name": "Morava" + }, + { + "code": "RS20", + "name": "Nišava" + }, + { + "code": "RS01", + "name": "North Bačka" + }, + { + "code": "RS03", + "name": "North Banat" + }, + { + "code": "RS24", + "name": "Pčinja" + }, + { + "code": "RS22", + "name": "Pirot" + }, + { + "code": "RS13", + "name": "Pomoravlje" + }, + { + "code": "RS19", + "name": "Rasina" + }, + { + "code": "RS18", + "name": "Raška" + }, + { + "code": "RS06", + "name": "South Bačka" + }, + { + "code": "RS04", + "name": "South Banat" + }, + { + "code": "RS07", + "name": "Srem" + }, + { + "code": "RS12", + "name": "Šumadija" + }, + { + "code": "RS21", + "name": "Toplica" + }, + { + "code": "RS05", + "name": "West Bačka" + }, + { + "code": "RS15", + "name": "Zaječar" + }, + { + "code": "RS16", + "name": "Zlatibor" + }, + { + "code": "RS25", + "name": "Kosovo" + }, + { + "code": "RS26", + "name": "Peć" + }, + { + "code": "RS27", + "name": "Prizren" + }, + { + "code": "RS28", + "name": "Kosovska Mitrovica" + }, + { + "code": "RS29", + "name": "Kosovo-Pomoravlje" + }, + { + "code": "RSKM", + "name": "Kosovo-Metohija" + }, + { + "code": "RSVO", + "name": "Vojvodina" + } + ] + }, + { + "code": "RU", + "name": "Russian ruble", + "currency_code": "RUB", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SE", + "name": "Swedish krona", + "currency_code": "SEK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SI", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SJ", + "name": "Norwegian krone", + "currency_code": "NOK", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SK", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SM", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TR", + "name": "Turkish lira", + "currency_code": "TRY", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "TR01", + "name": "Adana" + }, + { + "code": "TR02", + "name": "Adıyaman" + }, + { + "code": "TR03", + "name": "Afyon" + }, + { + "code": "TR04", + "name": "Ağrı" + }, + { + "code": "TR05", + "name": "Amasya" + }, + { + "code": "TR06", + "name": "Ankara" + }, + { + "code": "TR07", + "name": "Antalya" + }, + { + "code": "TR08", + "name": "Artvin" + }, + { + "code": "TR09", + "name": "Aydın" + }, + { + "code": "TR10", + "name": "Balıkesir" + }, + { + "code": "TR11", + "name": "Bilecik" + }, + { + "code": "TR12", + "name": "Bingöl" + }, + { + "code": "TR13", + "name": "Bitlis" + }, + { + "code": "TR14", + "name": "Bolu" + }, + { + "code": "TR15", + "name": "Burdur" + }, + { + "code": "TR16", + "name": "Bursa" + }, + { + "code": "TR17", + "name": "Çanakkale" + }, + { + "code": "TR18", + "name": "Çankırı" + }, + { + "code": "TR19", + "name": "Çorum" + }, + { + "code": "TR20", + "name": "Denizli" + }, + { + "code": "TR21", + "name": "Diyarbakır" + }, + { + "code": "TR22", + "name": "Edirne" + }, + { + "code": "TR23", + "name": "Elazığ" + }, + { + "code": "TR24", + "name": "Erzincan" + }, + { + "code": "TR25", + "name": "Erzurum" + }, + { + "code": "TR26", + "name": "Eskişehir" + }, + { + "code": "TR27", + "name": "Gaziantep" + }, + { + "code": "TR28", + "name": "Giresun" + }, + { + "code": "TR29", + "name": "Gümüşhane" + }, + { + "code": "TR30", + "name": "Hakkari" + }, + { + "code": "TR31", + "name": "Hatay" + }, + { + "code": "TR32", + "name": "Isparta" + }, + { + "code": "TR33", + "name": "İçel" + }, + { + "code": "TR34", + "name": "İstanbul" + }, + { + "code": "TR35", + "name": "İzmir" + }, + { + "code": "TR36", + "name": "Kars" + }, + { + "code": "TR37", + "name": "Kastamonu" + }, + { + "code": "TR38", + "name": "Kayseri" + }, + { + "code": "TR39", + "name": "Kırklareli" + }, + { + "code": "TR40", + "name": "Kırşehir" + }, + { + "code": "TR41", + "name": "Kocaeli" + }, + { + "code": "TR42", + "name": "Konya" + }, + { + "code": "TR43", + "name": "Kütahya" + }, + { + "code": "TR44", + "name": "Malatya" + }, + { + "code": "TR45", + "name": "Manisa" + }, + { + "code": "TR46", + "name": "Kahramanmaraş" + }, + { + "code": "TR47", + "name": "Mardin" + }, + { + "code": "TR48", + "name": "Muğla" + }, + { + "code": "TR49", + "name": "Muş" + }, + { + "code": "TR50", + "name": "Nevşehir" + }, + { + "code": "TR51", + "name": "Niğde" + }, + { + "code": "TR52", + "name": "Ordu" + }, + { + "code": "TR53", + "name": "Rize" + }, + { + "code": "TR54", + "name": "Sakarya" + }, + { + "code": "TR55", + "name": "Samsun" + }, + { + "code": "TR56", + "name": "Siirt" + }, + { + "code": "TR57", + "name": "Sinop" + }, + { + "code": "TR58", + "name": "Sivas" + }, + { + "code": "TR59", + "name": "Tekirdağ" + }, + { + "code": "TR60", + "name": "Tokat" + }, + { + "code": "TR61", + "name": "Trabzon" + }, + { + "code": "TR62", + "name": "Tunceli" + }, + { + "code": "TR63", + "name": "Şanlıurfa" + }, + { + "code": "TR64", + "name": "Uşak" + }, + { + "code": "TR65", + "name": "Van" + }, + { + "code": "TR66", + "name": "Yozgat" + }, + { + "code": "TR67", + "name": "Zonguldak" + }, + { + "code": "TR68", + "name": "Aksaray" + }, + { + "code": "TR69", + "name": "Bayburt" + }, + { + "code": "TR70", + "name": "Karaman" + }, + { + "code": "TR71", + "name": "Kırıkkale" + }, + { + "code": "TR72", + "name": "Batman" + }, + { + "code": "TR73", + "name": "Şırnak" + }, + { + "code": "TR74", + "name": "Bartın" + }, + { + "code": "TR75", + "name": "Ardahan" + }, + { + "code": "TR76", + "name": "Iğdır" + }, + { + "code": "TR77", + "name": "Yalova" + }, + { + "code": "TR78", + "name": "Karabük" + }, + { + "code": "TR79", + "name": "Kilis" + }, + { + "code": "TR80", + "name": "Osmaniye" + }, + { + "code": "TR81", + "name": "Düzce" + } + ] + }, + { + "code": "UA", + "name": "Ukrainian hryvnia", + "currency_code": "UAH", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "VN", + "name": "Vinnytsia Oblast" + }, + { + "code": "VL", + "name": "Volyn Oblast" + }, + { + "code": "DP", + "name": "Dnipropetrovsk Oblast" + }, + { + "code": "DT", + "name": "Donetsk Oblast" + }, + { + "code": "ZT", + "name": "Zhytomyr Oblast" + }, + { + "code": "ZK", + "name": "Zakarpattia Oblast" + }, + { + "code": "ZP", + "name": "Zaporizhzhia Oblast" + }, + { + "code": "IF", + "name": "Ivano-Frankivsk Oblast" + }, + { + "code": "KV", + "name": "Kyiv Oblast" + }, + { + "code": "KH", + "name": "Kirovohrad Oblast" + }, + { + "code": "LH", + "name": "Luhansk Oblast" + }, + { + "code": "LV", + "name": "Lviv Oblast" + }, + { + "code": "MY", + "name": "Mykolaiv Oblast" + }, + { + "code": "OD", + "name": "Odessa Oblast" + }, + { + "code": "PL", + "name": "Poltava Oblast" + }, + { + "code": "RV", + "name": "Rivne Oblast" + }, + { + "code": "SM", + "name": "Sumy Oblast" + }, + { + "code": "TP", + "name": "Ternopil Oblast" + }, + { + "code": "KK", + "name": "Kharkiv Oblast" + }, + { + "code": "KS", + "name": "Kherson Oblast" + }, + { + "code": "KM", + "name": "Khmelnytskyi Oblast" + }, + { + "code": "CK", + "name": "Cherkasy Oblast" + }, + { + "code": "CH", + "name": "Chernihiv Oblast" + }, + { + "code": "CV", + "name": "Chernivtsi Oblast" + } + ] + }, + { + "code": "VA", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + } + ], + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "NA", + "name": "North America", + "countries": [{ + "code": "AG", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AI", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AW", + "name": "Aruban florin", + "currency_code": "AWG", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BB", + "name": "Barbadian dollar", + "currency_code": "BBD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BL", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BM", + "name": "Bermudian dollar", + "currency_code": "BMD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BQ", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BS", + "name": "Bahamian dollar", + "currency_code": "BSD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BZ", + "name": "Belize dollar", + "currency_code": "BZD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CA", + "name": "Canadian dollar", + "currency_code": "CAD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "AB", + "name": "Alberta" + }, + { + "code": "BC", + "name": "British Columbia" + }, + { + "code": "MB", + "name": "Manitoba" + }, + { + "code": "NB", + "name": "New Brunswick" + }, + { + "code": "NL", + "name": "Newfoundland and Labrador" + }, + { + "code": "NT", + "name": "Northwest Territories" + }, + { + "code": "NS", + "name": "Nova Scotia" + }, + { + "code": "NU", + "name": "Nunavut" + }, + { + "code": "ON", + "name": "Ontario" + }, + { + "code": "PE", + "name": "Prince Edward Island" + }, + { + "code": "QC", + "name": "Quebec" + }, + { + "code": "SK", + "name": "Saskatchewan" + }, + { + "code": "YT", + "name": "Yukon Territory" + } + ] + }, + { + "code": "CR", + "name": "Costa Rican colón", + "currency_code": "CRC", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "CR-A", + "name": "Alajuela" + }, + { + "code": "CR-C", + "name": "Cartago" + }, + { + "code": "CR-G", + "name": "Guanacaste" + }, + { + "code": "CR-H", + "name": "Heredia" + }, + { + "code": "CR-L", + "name": "Limón" + }, + { + "code": "CR-P", + "name": "Puntarenas" + }, + { + "code": "CR-SJ", + "name": "San José" + } + ] + }, + { + "code": "CU", + "name": "Cuban convertible peso", + "currency_code": "CUC", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CW", + "name": "Netherlands Antillean guilder", + "currency_code": "ANG", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "DM", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "DO", + "name": "Dominican peso", + "currency_code": "DOP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "DO-01", + "name": "Distrito Nacional" + }, + { + "code": "DO-02", + "name": "Azua" + }, + { + "code": "DO-03", + "name": "Baoruco" + }, + { + "code": "DO-04", + "name": "Barahona" + }, + { + "code": "DO-33", + "name": "Cibao Nordeste" + }, + { + "code": "DO-34", + "name": "Cibao Noroeste" + }, + { + "code": "DO-35", + "name": "Cibao Norte" + }, + { + "code": "DO-36", + "name": "Cibao Sur" + }, + { + "code": "DO-05", + "name": "Dajabón" + }, + { + "code": "DO-06", + "name": "Duarte" + }, + { + "code": "DO-08", + "name": "El Seibo" + }, + { + "code": "DO-37", + "name": "El Valle" + }, + { + "code": "DO-07", + "name": "Elías Piña" + }, + { + "code": "DO-38", + "name": "Enriquillo" + }, + { + "code": "DO-09", + "name": "Espaillat" + }, + { + "code": "DO-30", + "name": "Hato Mayor" + }, + { + "code": "DO-19", + "name": "Hermanas Mirabal" + }, + { + "code": "DO-39", + "name": "Higüamo" + }, + { + "code": "DO-10", + "name": "Independencia" + }, + { + "code": "DO-11", + "name": "La Altagracia" + }, + { + "code": "DO-12", + "name": "La Romana" + }, + { + "code": "DO-13", + "name": "La Vega" + }, + { + "code": "DO-14", + "name": "María Trinidad Sánchez" + }, + { + "code": "DO-28", + "name": "Monseñor Nouel" + }, + { + "code": "DO-15", + "name": "Monte Cristi" + }, + { + "code": "DO-29", + "name": "Monte Plata" + }, + { + "code": "DO-40", + "name": "Ozama" + }, + { + "code": "DO-16", + "name": "Pedernales" + }, + { + "code": "DO-17", + "name": "Peravia" + }, + { + "code": "DO-18", + "name": "Puerto Plata" + }, + { + "code": "DO-20", + "name": "Samaná" + }, + { + "code": "DO-21", + "name": "San Cristóbal" + }, + { + "code": "DO-31", + "name": "San José de Ocoa" + }, + { + "code": "DO-22", + "name": "San Juan" + }, + { + "code": "DO-23", + "name": "San Pedro de Macorís" + }, + { + "code": "DO-24", + "name": "Sánchez Ramírez" + }, + { + "code": "DO-25", + "name": "Santiago" + }, + { + "code": "DO-26", + "name": "Santiago Rodríguez" + }, + { + "code": "DO-32", + "name": "Santo Domingo" + }, + { + "code": "DO-41", + "name": "Valdesia" + }, + { + "code": "DO-27", + "name": "Valverde" + }, + { + "code": "DO-42", + "name": "Yuma" + } + ] + }, + { + "code": "GD", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GL", + "name": "Danish krone", + "currency_code": "DKK", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GP", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GT", + "name": "Guatemalan quetzal", + "currency_code": "GTQ", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "GT-AV", + "name": "Alta Verapaz" + }, + { + "code": "GT-BV", + "name": "Baja Verapaz" + }, + { + "code": "GT-CM", + "name": "Chimaltenango" + }, + { + "code": "GT-CQ", + "name": "Chiquimula" + }, + { + "code": "GT-PR", + "name": "El Progreso" + }, + { + "code": "GT-ES", + "name": "Escuintla" + }, + { + "code": "GT-GU", + "name": "Guatemala" + }, + { + "code": "GT-HU", + "name": "Huehuetenango" + }, + { + "code": "GT-IZ", + "name": "Izabal" + }, + { + "code": "GT-JA", + "name": "Jalapa" + }, + { + "code": "GT-JU", + "name": "Jutiapa" + }, + { + "code": "GT-PE", + "name": "Petén" + }, + { + "code": "GT-QZ", + "name": "Quetzaltenango" + }, + { + "code": "GT-QC", + "name": "Quiché" + }, + { + "code": "GT-RE", + "name": "Retalhuleu" + }, + { + "code": "GT-SA", + "name": "Sacatepéquez" + }, + { + "code": "GT-SM", + "name": "San Marcos" + }, + { + "code": "GT-SR", + "name": "Santa Rosa" + }, + { + "code": "GT-SO", + "name": "Sololá" + }, + { + "code": "GT-SU", + "name": "Suchitepéquez" + }, + { + "code": "GT-TO", + "name": "Totonicapán" + }, + { + "code": "GT-ZA", + "name": "Zacapa" + } + ] + }, + { + "code": "HN", + "name": "Honduran lempira", + "currency_code": "HNL", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "HN-AT", + "name": "Atlántida" + }, + { + "code": "HN-IB", + "name": "Bay Islands" + }, + { + "code": "HN-CH", + "name": "Choluteca" + }, + { + "code": "HN-CL", + "name": "Colón" + }, + { + "code": "HN-CM", + "name": "Comayagua" + }, + { + "code": "HN-CP", + "name": "Copán" + }, + { + "code": "HN-CR", + "name": "Cortés" + }, + { + "code": "HN-EP", + "name": "El Paraíso" + }, + { + "code": "HN-FM", + "name": "Francisco Morazán" + }, + { + "code": "HN-GD", + "name": "Gracias a Dios" + }, + { + "code": "HN-IN", + "name": "Intibucá" + }, + { + "code": "HN-LE", + "name": "Lempira" + }, + { + "code": "HN-LP", + "name": "La Paz" + }, + { + "code": "HN-OC", + "name": "Ocotepeque" + }, + { + "code": "HN-OL", + "name": "Olancho" + }, + { + "code": "HN-SB", + "name": "Santa Bárbara" + }, + { + "code": "HN-VA", + "name": "Valle" + }, + { + "code": "HN-YO", + "name": "Yoro" + } + ] + }, + { + "code": "HT", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "JM", + "name": "Jamaican dollar", + "currency_code": "JMD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "JM-01", + "name": "Kingston" + }, + { + "code": "JM-02", + "name": "Saint Andrew" + }, + { + "code": "JM-03", + "name": "Saint Thomas" + }, + { + "code": "JM-04", + "name": "Portland" + }, + { + "code": "JM-05", + "name": "Saint Mary" + }, + { + "code": "JM-06", + "name": "Saint Ann" + }, + { + "code": "JM-07", + "name": "Trelawny" + }, + { + "code": "JM-08", + "name": "Saint James" + }, + { + "code": "JM-09", + "name": "Hanover" + }, + { + "code": "JM-10", + "name": "Westmoreland" + }, + { + "code": "JM-11", + "name": "Saint Elizabeth" + }, + { + "code": "JM-12", + "name": "Manchester" + }, + { + "code": "JM-13", + "name": "Clarendon" + }, + { + "code": "JM-14", + "name": "Saint Catherine" + } + ] + }, + { + "code": "KN", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KY", + "name": "Cayman Islands dollar", + "currency_code": "KYD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LC", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MF", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MQ", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MS", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MX", + "name": "Mexican peso", + "currency_code": "MXN", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "DF", + "name": "Ciudad de México" + }, + { + "code": "JA", + "name": "Jalisco" + }, + { + "code": "NL", + "name": "Nuevo León" + }, + { + "code": "AG", + "name": "Aguascalientes" + }, + { + "code": "BC", + "name": "Baja California" + }, + { + "code": "BS", + "name": "Baja California Sur" + }, + { + "code": "CM", + "name": "Campeche" + }, + { + "code": "CS", + "name": "Chiapas" + }, + { + "code": "CH", + "name": "Chihuahua" + }, + { + "code": "CO", + "name": "Coahuila" + }, + { + "code": "CL", + "name": "Colima" + }, + { + "code": "DG", + "name": "Durango" + }, + { + "code": "GT", + "name": "Guanajuato" + }, + { + "code": "GR", + "name": "Guerrero" + }, + { + "code": "HG", + "name": "Hidalgo" + }, + { + "code": "MX", + "name": "Estado de México" + }, + { + "code": "MI", + "name": "Michoacán" + }, + { + "code": "MO", + "name": "Morelos" + }, + { + "code": "NA", + "name": "Nayarit" + }, + { + "code": "OA", + "name": "Oaxaca" + }, + { + "code": "PU", + "name": "Puebla" + }, + { + "code": "QT", + "name": "Querétaro" + }, + { + "code": "QR", + "name": "Quintana Roo" + }, + { + "code": "SL", + "name": "San Luis Potosí" + }, + { + "code": "SI", + "name": "Sinaloa" + }, + { + "code": "SO", + "name": "Sonora" + }, + { + "code": "TB", + "name": "Tabasco" + }, + { + "code": "TM", + "name": "Tamaulipas" + }, + { + "code": "TL", + "name": "Tlaxcala" + }, + { + "code": "VE", + "name": "Veracruz" + }, + { + "code": "YU", + "name": "Yucatán" + }, + { + "code": "ZA", + "name": "Zacatecas" + } + ] + }, + { + "code": "NI", + "name": "Nicaraguan córdoba", + "currency_code": "NIO", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "NI-AN", + "name": "Atlántico Norte" + }, + { + "code": "NI-AS", + "name": "Atlántico Sur" + }, + { + "code": "NI-BO", + "name": "Boaco" + }, + { + "code": "NI-CA", + "name": "Carazo" + }, + { + "code": "NI-CI", + "name": "Chinandega" + }, + { + "code": "NI-CO", + "name": "Chontales" + }, + { + "code": "NI-ES", + "name": "Estelí" + }, + { + "code": "NI-GR", + "name": "Granada" + }, + { + "code": "NI-JI", + "name": "Jinotega" + }, + { + "code": "NI-LE", + "name": "León" + }, + { + "code": "NI-MD", + "name": "Madriz" + }, + { + "code": "NI-MN", + "name": "Managua" + }, + { + "code": "NI-MS", + "name": "Masaya" + }, + { + "code": "NI-MT", + "name": "Matagalpa" + }, + { + "code": "NI-NS", + "name": "Nueva Segovia" + }, + { + "code": "NI-RI", + "name": "Rivas" + }, + { + "code": "NI-SJ", + "name": "Río San Juan" + } + ] + }, + { + "code": "PA", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "PA-1", + "name": "Bocas del Toro" + }, + { + "code": "PA-2", + "name": "Coclé" + }, + { + "code": "PA-3", + "name": "Colón" + }, + { + "code": "PA-4", + "name": "Chiriquí" + }, + { + "code": "PA-5", + "name": "Darién" + }, + { + "code": "PA-6", + "name": "Herrera" + }, + { + "code": "PA-7", + "name": "Los Santos" + }, + { + "code": "PA-8", + "name": "Panamá" + }, + { + "code": "PA-9", + "name": "Veraguas" + }, + { + "code": "PA-10", + "name": "West Panamá" + }, + { + "code": "PA-EM", + "name": "Emberá" + }, + { + "code": "PA-KY", + "name": "Guna Yala" + }, + { + "code": "PA-NB", + "name": "Ngöbe-Buglé" + } + ] + }, + { + "code": "PM", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PR", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SV", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "SV-AH", + "name": "Ahuachapán" + }, + { + "code": "SV-CA", + "name": "Cabañas" + }, + { + "code": "SV-CH", + "name": "Chalatenango" + }, + { + "code": "SV-CU", + "name": "Cuscatlán" + }, + { + "code": "SV-LI", + "name": "La Libertad" + }, + { + "code": "SV-MO", + "name": "Morazán" + }, + { + "code": "SV-PA", + "name": "La Paz" + }, + { + "code": "SV-SA", + "name": "Santa Ana" + }, + { + "code": "SV-SM", + "name": "San Miguel" + }, + { + "code": "SV-SO", + "name": "Sonsonate" + }, + { + "code": "SV-SS", + "name": "San Salvador" + }, + { + "code": "SV-SV", + "name": "San Vicente" + }, + { + "code": "SV-UN", + "name": "La Unión" + }, + { + "code": "SV-US", + "name": "Usulután" + } + ] + }, + { + "code": "SX", + "name": "Netherlands Antillean guilder", + "currency_code": "ANG", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TC", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TT", + "name": "Trinidad and Tobago dollar", + "currency_code": "TTD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "US", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "foot", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "oz", + "states": [{ + "code": "AL", + "name": "Alabama" + }, + { + "code": "AK", + "name": "Alaska" + }, + { + "code": "AZ", + "name": "Arizona" + }, + { + "code": "AR", + "name": "Arkansas" + }, + { + "code": "CA", + "name": "California" + }, + { + "code": "CO", + "name": "Colorado" + }, + { + "code": "CT", + "name": "Connecticut" + }, + { + "code": "DE", + "name": "Delaware" + }, + { + "code": "DC", + "name": "District Of Columbia" + }, + { + "code": "FL", + "name": "Florida" + }, + { + "code": "GA", + "name": "Georgia" + }, + { + "code": "HI", + "name": "Hawaii" + }, + { + "code": "ID", + "name": "Idaho" + }, + { + "code": "IL", + "name": "Illinois" + }, + { + "code": "IN", + "name": "Indiana" + }, + { + "code": "IA", + "name": "Iowa" + }, + { + "code": "KS", + "name": "Kansas" + }, + { + "code": "KY", + "name": "Kentucky" + }, + { + "code": "LA", + "name": "Louisiana" + }, + { + "code": "ME", + "name": "Maine" + }, + { + "code": "MD", + "name": "Maryland" + }, + { + "code": "MA", + "name": "Massachusetts" + }, + { + "code": "MI", + "name": "Michigan" + }, + { + "code": "MN", + "name": "Minnesota" + }, + { + "code": "MS", + "name": "Mississippi" + }, + { + "code": "MO", + "name": "Missouri" + }, + { + "code": "MT", + "name": "Montana" + }, + { + "code": "NE", + "name": "Nebraska" + }, + { + "code": "NV", + "name": "Nevada" + }, + { + "code": "NH", + "name": "New Hampshire" + }, + { + "code": "NJ", + "name": "New Jersey" + }, + { + "code": "NM", + "name": "New Mexico" + }, + { + "code": "NY", + "name": "New York" + }, + { + "code": "NC", + "name": "North Carolina" + }, + { + "code": "ND", + "name": "North Dakota" + }, + { + "code": "OH", + "name": "Ohio" + }, + { + "code": "OK", + "name": "Oklahoma" + }, + { + "code": "OR", + "name": "Oregon" + }, + { + "code": "PA", + "name": "Pennsylvania" + }, + { + "code": "RI", + "name": "Rhode Island" + }, + { + "code": "SC", + "name": "South Carolina" + }, + { + "code": "SD", + "name": "South Dakota" + }, + { + "code": "TN", + "name": "Tennessee" + }, + { + "code": "TX", + "name": "Texas" + }, + { + "code": "UT", + "name": "Utah" + }, + { + "code": "VT", + "name": "Vermont" + }, + { + "code": "VA", + "name": "Virginia" + }, + { + "code": "WA", + "name": "Washington" + }, + { + "code": "WV", + "name": "West Virginia" + }, + { + "code": "WI", + "name": "Wisconsin" + }, + { + "code": "WY", + "name": "Wyoming" + }, + { + "code": "AA", + "name": "Armed Forces (AA)" + }, + { + "code": "AE", + "name": "Armed Forces (AE)" + }, + { + "code": "AP", + "name": "Armed Forces (AP)" + } + ] + }, + { + "code": "VC", + "name": "East Caribbean dollar", + "currency_code": "XCD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "VG", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "VI", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + } + ], + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "OC", + "name": "Oceania", + "countries": [{ + "code": "AS", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AU", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "ACT", + "name": "Australian Capital Territory" + }, + { + "code": "NSW", + "name": "New South Wales" + }, + { + "code": "NT", + "name": "Northern Territory" + }, + { + "code": "QLD", + "name": "Queensland" + }, + { + "code": "SA", + "name": "South Australia" + }, + { + "code": "TAS", + "name": "Tasmania" + }, + { + "code": "VIC", + "name": "Victoria" + }, + { + "code": "WA", + "name": "Western Australia" + } + ] + }, + { + "code": "CK", + "name": "New Zealand dollar", + "currency_code": "NZD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "FJ", + "name": "Fijian dollar", + "currency_code": "FJD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "FM", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GU", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "KI", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MH", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MP", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NC", + "name": "CFP franc", + "currency_code": "XPF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NF", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NR", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NU", + "name": "New Zealand dollar", + "currency_code": "NZD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NZ", + "name": "New Zealand dollar", + "currency_code": "NZD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "NTL", + "name": "Northland" + }, + { + "code": "AUK", + "name": "Auckland" + }, + { + "code": "WKO", + "name": "Waikato" + }, + { + "code": "BOP", + "name": "Bay of Plenty" + }, + { + "code": "TKI", + "name": "Taranaki" + }, + { + "code": "GIS", + "name": "Gisborne" + }, + { + "code": "HKB", + "name": "Hawke’s Bay" + }, + { + "code": "MWT", + "name": "Manawatu-Wanganui" + }, + { + "code": "WGN", + "name": "Wellington" + }, + { + "code": "NSN", + "name": "Nelson" + }, + { + "code": "MBH", + "name": "Marlborough" + }, + { + "code": "TAS", + "name": "Tasman" + }, + { + "code": "WTC", + "name": "West Coast" + }, + { + "code": "CAN", + "name": "Canterbury" + }, + { + "code": "OTA", + "name": "Otago" + }, + { + "code": "STL", + "name": "Southland" + } + ] + }, + { + "code": "PF", + "name": "CFP franc", + "currency_code": "XPF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PG", + "name": "Papua New Guinean kina", + "currency_code": "PGK", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PN", + "name": "New Zealand dollar", + "currency_code": "NZD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PW", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SB", + "name": "Solomon Islands dollar", + "currency_code": "SBD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TK", + "name": "New Zealand dollar", + "currency_code": "NZD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TO", + "name": "Tongan paʻanga", + "currency_code": "TOP", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TV", + "name": "Australian dollar", + "currency_code": "AUD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "UM", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": 81, + "name": "Baker Island" + }, + { + "code": 84, + "name": "Howland Island" + }, + { + "code": 86, + "name": "Jarvis Island" + }, + { + "code": 67, + "name": "Johnston Atoll" + }, + { + "code": 89, + "name": "Kingman Reef" + }, + { + "code": 71, + "name": "Midway Atoll" + }, + { + "code": 76, + "name": "Navassa Island" + }, + { + "code": 95, + "name": "Palmyra Atoll" + }, + { + "code": 79, + "name": "Wake Island" + } + ] + }, + { + "code": "VU", + "name": "Vanuatu vatu", + "currency_code": "VUV", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "WF", + "name": "CFP franc", + "currency_code": "XPF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "WS", + "name": "Samoan tālā", + "currency_code": "WST", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + } + ], + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "code": "SA", + "name": "South America", + "countries": [{ + "code": "AR", + "name": "Argentine peso", + "currency_code": "ARS", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "C", + "name": "Ciudad Autónoma de Buenos Aires" + }, + { + "code": "B", + "name": "Buenos Aires" + }, + { + "code": "K", + "name": "Catamarca" + }, + { + "code": "H", + "name": "Chaco" + }, + { + "code": "U", + "name": "Chubut" + }, + { + "code": "X", + "name": "Córdoba" + }, + { + "code": "W", + "name": "Corrientes" + }, + { + "code": "E", + "name": "Entre Ríos" + }, + { + "code": "P", + "name": "Formosa" + }, + { + "code": "Y", + "name": "Jujuy" + }, + { + "code": "L", + "name": "La Pampa" + }, + { + "code": "F", + "name": "La Rioja" + }, + { + "code": "M", + "name": "Mendoza" + }, + { + "code": "N", + "name": "Misiones" + }, + { + "code": "Q", + "name": "Neuquén" + }, + { + "code": "R", + "name": "Río Negro" + }, + { + "code": "A", + "name": "Salta" + }, + { + "code": "J", + "name": "San Juan" + }, + { + "code": "D", + "name": "San Luis" + }, + { + "code": "Z", + "name": "Santa Cruz" + }, + { + "code": "S", + "name": "Santa Fe" + }, + { + "code": "G", + "name": "Santiago del Estero" + }, + { + "code": "V", + "name": "Tierra del Fuego" + }, + { + "code": "T", + "name": "Tucumán" + } + ] + }, + { + "code": "BO", + "name": "Bolivian boliviano", + "currency_code": "BOB", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "BO-B", + "name": "Beni" + }, + { + "code": "BO-H", + "name": "Chuquisaca" + }, + { + "code": "BO-C", + "name": "Cochabamba" + }, + { + "code": "BO-L", + "name": "La Paz" + }, + { + "code": "BO-O", + "name": "Oruro" + }, + { + "code": "BO-N", + "name": "Pando" + }, + { + "code": "BO-P", + "name": "Potosí" + }, + { + "code": "BO-S", + "name": "Santa Cruz" + }, + { + "code": "BO-T", + "name": "Tarija" + } + ] + }, + { + "code": "BR", + "name": "Brazilian real", + "currency_code": "BRL", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AC", + "name": "Acre" + }, + { + "code": "AL", + "name": "Alagoas" + }, + { + "code": "AP", + "name": "Amapá" + }, + { + "code": "AM", + "name": "Amazonas" + }, + { + "code": "BA", + "name": "Bahia" + }, + { + "code": "CE", + "name": "Ceará" + }, + { + "code": "DF", + "name": "Distrito Federal" + }, + { + "code": "ES", + "name": "Espírito Santo" + }, + { + "code": "GO", + "name": "Goiás" + }, + { + "code": "MA", + "name": "Maranhão" + }, + { + "code": "MT", + "name": "Mato Grosso" + }, + { + "code": "MS", + "name": "Mato Grosso do Sul" + }, + { + "code": "MG", + "name": "Minas Gerais" + }, + { + "code": "PA", + "name": "Pará" + }, + { + "code": "PB", + "name": "Paraíba" + }, + { + "code": "PR", + "name": "Paraná" + }, + { + "code": "PE", + "name": "Pernambuco" + }, + { + "code": "PI", + "name": "Piauí" + }, + { + "code": "RJ", + "name": "Rio de Janeiro" + }, + { + "code": "RN", + "name": "Rio Grande do Norte" + }, + { + "code": "RS", + "name": "Rio Grande do Sul" + }, + { + "code": "RO", + "name": "Rondônia" + }, + { + "code": "RR", + "name": "Roraima" + }, + { + "code": "SC", + "name": "Santa Catarina" + }, + { + "code": "SP", + "name": "São Paulo" + }, + { + "code": "SE", + "name": "Sergipe" + }, + { + "code": "TO", + "name": "Tocantins" + } + ] + }, + { + "code": "CL", + "name": "Chilean peso", + "currency_code": "CLP", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "CL-AI", + "name": "Aisén del General Carlos Ibañez del Campo" + }, + { + "code": "CL-AN", + "name": "Antofagasta" + }, + { + "code": "CL-AP", + "name": "Arica y Parinacota" + }, + { + "code": "CL-AR", + "name": "La Araucanía" + }, + { + "code": "CL-AT", + "name": "Atacama" + }, + { + "code": "CL-BI", + "name": "Biobío" + }, + { + "code": "CL-CO", + "name": "Coquimbo" + }, + { + "code": "CL-LI", + "name": "Libertador General Bernardo O'Higgins" + }, + { + "code": "CL-LL", + "name": "Los Lagos" + }, + { + "code": "CL-LR", + "name": "Los Ríos" + }, + { + "code": "CL-MA", + "name": "Magallanes" + }, + { + "code": "CL-ML", + "name": "Maule" + }, + { + "code": "CL-NB", + "name": "Ñuble" + }, + { + "code": "CL-RM", + "name": "Región Metropolitana de Santiago" + }, + { + "code": "CL-TA", + "name": "Tarapacá" + }, + { + "code": "CL-VS", + "name": "Valparaíso" + } + ] + }, + { + "code": "CO", + "name": "Colombian peso", + "currency_code": "COP", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "CO-AMA", + "name": "Amazonas" + }, + { + "code": "CO-ANT", + "name": "Antioquia" + }, + { + "code": "CO-ARA", + "name": "Arauca" + }, + { + "code": "CO-ATL", + "name": "Atlántico" + }, + { + "code": "CO-BOL", + "name": "Bolívar" + }, + { + "code": "CO-BOY", + "name": "Boyacá" + }, + { + "code": "CO-CAL", + "name": "Caldas" + }, + { + "code": "CO-CAQ", + "name": "Caquetá" + }, + { + "code": "CO-CAS", + "name": "Casanare" + }, + { + "code": "CO-CAU", + "name": "Cauca" + }, + { + "code": "CO-CES", + "name": "Cesar" + }, + { + "code": "CO-CHO", + "name": "Chocó" + }, + { + "code": "CO-COR", + "name": "Córdoba" + }, + { + "code": "CO-CUN", + "name": "Cundinamarca" + }, + { + "code": "CO-DC", + "name": "Capital District" + }, + { + "code": "CO-GUA", + "name": "Guainía" + }, + { + "code": "CO-GUV", + "name": "Guaviare" + }, + { + "code": "CO-HUI", + "name": "Huila" + }, + { + "code": "CO-LAG", + "name": "La Guajira" + }, + { + "code": "CO-MAG", + "name": "Magdalena" + }, + { + "code": "CO-MET", + "name": "Meta" + }, + { + "code": "CO-NAR", + "name": "Nariño" + }, + { + "code": "CO-NSA", + "name": "Norte de Santander" + }, + { + "code": "CO-PUT", + "name": "Putumayo" + }, + { + "code": "CO-QUI", + "name": "Quindío" + }, + { + "code": "CO-RIS", + "name": "Risaralda" + }, + { + "code": "CO-SAN", + "name": "Santander" + }, + { + "code": "CO-SAP", + "name": "San Andrés & Providencia" + }, + { + "code": "CO-SUC", + "name": "Sucre" + }, + { + "code": "CO-TOL", + "name": "Tolima" + }, + { + "code": "CO-VAC", + "name": "Valle del Cauca" + }, + { + "code": "CO-VAU", + "name": "Vaupés" + }, + { + "code": "CO-VID", + "name": "Vichada" + } + ] + }, + { + "code": "EC", + "name": "United States (US) dollar", + "currency_code": "USD", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "EC-A", + "name": "Azuay" + }, + { + "code": "EC-B", + "name": "Bolívar" + }, + { + "code": "EC-F", + "name": "Cañar" + }, + { + "code": "EC-C", + "name": "Carchi" + }, + { + "code": "EC-H", + "name": "Chimborazo" + }, + { + "code": "EC-X", + "name": "Cotopaxi" + }, + { + "code": "EC-O", + "name": "El Oro" + }, + { + "code": "EC-E", + "name": "Esmeraldas" + }, + { + "code": "EC-W", + "name": "Galápagos" + }, + { + "code": "EC-G", + "name": "Guayas" + }, + { + "code": "EC-I", + "name": "Imbabura" + }, + { + "code": "EC-L", + "name": "Loja" + }, + { + "code": "EC-R", + "name": "Los Ríos" + }, + { + "code": "EC-M", + "name": "Manabí" + }, + { + "code": "EC-S", + "name": "Morona-Santiago" + }, + { + "code": "EC-N", + "name": "Napo" + }, + { + "code": "EC-D", + "name": "Orellana" + }, + { + "code": "EC-Y", + "name": "Pastaza" + }, + { + "code": "EC-P", + "name": "Pichincha" + }, + { + "code": "EC-SE", + "name": "Santa Elena" + }, + { + "code": "EC-SD", + "name": "Santo Domingo de los Tsáchilas" + }, + { + "code": "EC-U", + "name": "Sucumbíos" + }, + { + "code": "EC-T", + "name": "Tungurahua" + }, + { + "code": "EC-Z", + "name": "Zamora-Chinchipe" + } + ] + }, + { + "code": "FK", + "name": "Falkland Islands pound", + "currency_code": "FKP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GF", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GY", + "name": "Guyanese dollar", + "currency_code": "GYD", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PE", + "name": "Sol", + "currency_code": "PEN", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "CAL", + "name": "El Callao" + }, + { + "code": "LMA", + "name": "Municipalidad Metropolitana de Lima" + }, + { + "code": "AMA", + "name": "Amazonas" + }, + { + "code": "ANC", + "name": "Ancash" + }, + { + "code": "APU", + "name": "Apurímac" + }, + { + "code": "ARE", + "name": "Arequipa" + }, + { + "code": "AYA", + "name": "Ayacucho" + }, + { + "code": "CAJ", + "name": "Cajamarca" + }, + { + "code": "CUS", + "name": "Cusco" + }, + { + "code": "HUV", + "name": "Huancavelica" + }, + { + "code": "HUC", + "name": "Huánuco" + }, + { + "code": "ICA", + "name": "Ica" + }, + { + "code": "JUN", + "name": "Junín" + }, + { + "code": "LAL", + "name": "La Libertad" + }, + { + "code": "LAM", + "name": "Lambayeque" + }, + { + "code": "LIM", + "name": "Lima" + }, + { + "code": "LOR", + "name": "Loreto" + }, + { + "code": "MDD", + "name": "Madre de Dios" + }, + { + "code": "MOQ", + "name": "Moquegua" + }, + { + "code": "PAS", + "name": "Pasco" + }, + { + "code": "PIU", + "name": "Piura" + }, + { + "code": "PUN", + "name": "Puno" + }, + { + "code": "SAM", + "name": "San Martín" + }, + { + "code": "TAC", + "name": "Tacna" + }, + { + "code": "TUM", + "name": "Tumbes" + }, + { + "code": "UCA", + "name": "Ucayali" + } + ] + }, + { + "code": "PY", + "name": "Paraguayan guaraní", + "currency_code": "PYG", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "PY-ASU", + "name": "Asunción" + }, + { + "code": "PY-1", + "name": "Concepción" + }, + { + "code": "PY-2", + "name": "San Pedro" + }, + { + "code": "PY-3", + "name": "Cordillera" + }, + { + "code": "PY-4", + "name": "Guairá" + }, + { + "code": "PY-5", + "name": "Caaguazú" + }, + { + "code": "PY-6", + "name": "Caazapá" + }, + { + "code": "PY-7", + "name": "Itapúa" + }, + { + "code": "PY-8", + "name": "Misiones" + }, + { + "code": "PY-9", + "name": "Paraguarí" + }, + { + "code": "PY-10", + "name": "Alto Paraná" + }, + { + "code": "PY-11", + "name": "Central" + }, + { + "code": "PY-12", + "name": "Ñeembucú" + }, + { + "code": "PY-13", + "name": "Amambay" + }, + { + "code": "PY-14", + "name": "Canindeyú" + }, + { + "code": "PY-15", + "name": "Presidente Hayes" + }, + { + "code": "PY-16", + "name": "Alto Paraguay" + }, + { + "code": "PY-17", + "name": "Boquerón" + } + ] + }, + { + "code": "SR", + "name": "Surinamese dollar", + "currency_code": "SRD", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "UY", + "name": "Uruguayan peso", + "currency_code": "UYU", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "UY-AR", + "name": "Artigas" + }, + { + "code": "UY-CA", + "name": "Canelones" + }, + { + "code": "UY-CL", + "name": "Cerro Largo" + }, + { + "code": "UY-CO", + "name": "Colonia" + }, + { + "code": "UY-DU", + "name": "Durazno" + }, + { + "code": "UY-FS", + "name": "Flores" + }, + { + "code": "UY-FD", + "name": "Florida" + }, + { + "code": "UY-LA", + "name": "Lavalleja" + }, + { + "code": "UY-MA", + "name": "Maldonado" + }, + { + "code": "UY-MO", + "name": "Montevideo" + }, + { + "code": "UY-PA", + "name": "Paysandú" + }, + { + "code": "UY-RN", + "name": "Río Negro" + }, + { + "code": "UY-RV", + "name": "Rivera" + }, + { + "code": "UY-RO", + "name": "Rocha" + }, + { + "code": "UY-SA", + "name": "Salto" + }, + { + "code": "UY-SJ", + "name": "San José" + }, + { + "code": "UY-SO", + "name": "Soriano" + }, + { + "code": "UY-TA", + "name": "Tacuarembó" + }, + { + "code": "UY-TT", + "name": "Treinta y Tres" + } + ] + }, + { + "code": "VE", + "name": "Bolívar soberano", + "currency_code": "VES", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "VE-A", + "name": "Capital" + }, + { + "code": "VE-B", + "name": "Anzoátegui" + }, + { + "code": "VE-C", + "name": "Apure" + }, + { + "code": "VE-D", + "name": "Aragua" + }, + { + "code": "VE-E", + "name": "Barinas" + }, + { + "code": "VE-F", + "name": "Bolívar" + }, + { + "code": "VE-G", + "name": "Carabobo" + }, + { + "code": "VE-H", + "name": "Cojedes" + }, + { + "code": "VE-I", + "name": "Falcón" + }, + { + "code": "VE-J", + "name": "Guárico" + }, + { + "code": "VE-K", + "name": "Lara" + }, + { + "code": "VE-L", + "name": "Mérida" + }, + { + "code": "VE-M", + "name": "Miranda" + }, + { + "code": "VE-N", + "name": "Monagas" + }, + { + "code": "VE-O", + "name": "Nueva Esparta" + }, + { + "code": "VE-P", + "name": "Portuguesa" + }, + { + "code": "VE-R", + "name": "Sucre" + }, + { + "code": "VE-S", + "name": "Táchira" + }, + { + "code": "VE-T", + "name": "Trujillo" + }, + { + "code": "VE-U", + "name": "Yaracuy" + }, + { + "code": "VE-V", + "name": "Zulia" + }, + { + "code": "VE-W", + "name": "Federal Dependencies" + }, + { + "code": "VE-X", + "name": "La Guaira (Vargas)" + }, + { + "code": "VE-Y", + "name": "Delta Amacuro" + }, + { + "code": "VE-Z", + "name": "Amazonas" + } + ] + } + ], + }) + ]) + ); + }); + + test('can view continent data', async ({ + request + }) => { + // call API to retrieve a specific continent data + const response = await request.get('/wp-json/wc/v3/data/continents/eu'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(false); + + expect(responseJSON).toEqual( + expect.objectContaining({ + "code": "EU", + "name": "Europe", + "countries": [{ + "code": "AD", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AL", + "name": "Albanian lek", + "currency_code": "ALL", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "AL-01", + "name": "Berat" + }, + { + "code": "AL-09", + "name": "Dibër" + }, + { + "code": "AL-02", + "name": "Durrës" + }, + { + "code": "AL-03", + "name": "Elbasan" + }, + { + "code": "AL-04", + "name": "Fier" + }, + { + "code": "AL-05", + "name": "Gjirokastër" + }, + { + "code": "AL-06", + "name": "Korçë" + }, + { + "code": "AL-07", + "name": "Kukës" + }, + { + "code": "AL-08", + "name": "Lezhë" + }, + { + "code": "AL-10", + "name": "Shkodër" + }, + { + "code": "AL-11", + "name": "Tirana" + }, + { + "code": "AL-12", + "name": "Vlorë" + } + ] + }, + { + "code": "AT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "AX", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BA", + "name": "Bosnia and Herzegovina convertible mark", + "currency_code": "BAM", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "BG", + "name": "Bulgarian lev", + "currency_code": "BGN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "BG-01", + "name": "Blagoevgrad" + }, + { + "code": "BG-02", + "name": "Burgas" + }, + { + "code": "BG-08", + "name": "Dobrich" + }, + { + "code": "BG-07", + "name": "Gabrovo" + }, + { + "code": "BG-26", + "name": "Haskovo" + }, + { + "code": "BG-09", + "name": "Kardzhali" + }, + { + "code": "BG-10", + "name": "Kyustendil" + }, + { + "code": "BG-11", + "name": "Lovech" + }, + { + "code": "BG-12", + "name": "Montana" + }, + { + "code": "BG-13", + "name": "Pazardzhik" + }, + { + "code": "BG-14", + "name": "Pernik" + }, + { + "code": "BG-15", + "name": "Pleven" + }, + { + "code": "BG-16", + "name": "Plovdiv" + }, + { + "code": "BG-17", + "name": "Razgrad" + }, + { + "code": "BG-18", + "name": "Ruse" + }, + { + "code": "BG-27", + "name": "Shumen" + }, + { + "code": "BG-19", + "name": "Silistra" + }, + { + "code": "BG-20", + "name": "Sliven" + }, + { + "code": "BG-21", + "name": "Smolyan" + }, + { + "code": "BG-23", + "name": "Sofia District" + }, + { + "code": "BG-22", + "name": "Sofia" + }, + { + "code": "BG-24", + "name": "Stara Zagora" + }, + { + "code": "BG-25", + "name": "Targovishte" + }, + { + "code": "BG-03", + "name": "Varna" + }, + { + "code": "BG-04", + "name": "Veliko Tarnovo" + }, + { + "code": "BG-05", + "name": "Vidin" + }, + { + "code": "BG-06", + "name": "Vratsa" + }, + { + "code": "BG-28", + "name": "Yambol" + } + ] + }, + { + "code": "BY", + "name": "Belarusian ruble", + "currency_code": "BYN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "CH", + "name": "Swiss franc", + "currency_code": "CHF", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": "'", + "weight_unit": "kg", + "states": [{ + "code": "AG", + "name": "Aargau" + }, + { + "code": "AR", + "name": "Appenzell Ausserrhoden" + }, + { + "code": "AI", + "name": "Appenzell Innerrhoden" + }, + { + "code": "BL", + "name": "Basel-Landschaft" + }, + { + "code": "BS", + "name": "Basel-Stadt" + }, + { + "code": "BE", + "name": "Bern" + }, + { + "code": "FR", + "name": "Fribourg" + }, + { + "code": "GE", + "name": "Geneva" + }, + { + "code": "GL", + "name": "Glarus" + }, + { + "code": "GR", + "name": "Graubünden" + }, + { + "code": "JU", + "name": "Jura" + }, + { + "code": "LU", + "name": "Luzern" + }, + { + "code": "NE", + "name": "Neuchâtel" + }, + { + "code": "NW", + "name": "Nidwalden" + }, + { + "code": "OW", + "name": "Obwalden" + }, + { + "code": "SH", + "name": "Schaffhausen" + }, + { + "code": "SZ", + "name": "Schwyz" + }, + { + "code": "SO", + "name": "Solothurn" + }, + { + "code": "SG", + "name": "St. Gallen" + }, + { + "code": "TG", + "name": "Thurgau" + }, + { + "code": "TI", + "name": "Ticino" + }, + { + "code": "UR", + "name": "Uri" + }, + { + "code": "VS", + "name": "Valais" + }, + { + "code": "VD", + "name": "Vaud" + }, + { + "code": "ZG", + "name": "Zug" + }, + { + "code": "ZH", + "name": "Zürich" + } + ] + }, + { + "code": "CZ", + "name": "Czech koruna", + "currency_code": "CZK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "DE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "DE-BW", + "name": "Baden-Württemberg" + }, + { + "code": "DE-BY", + "name": "Bavaria" + }, + { + "code": "DE-BE", + "name": "Berlin" + }, + { + "code": "DE-BB", + "name": "Brandenburg" + }, + { + "code": "DE-HB", + "name": "Bremen" + }, + { + "code": "DE-HH", + "name": "Hamburg" + }, + { + "code": "DE-HE", + "name": "Hesse" + }, + { + "code": "DE-MV", + "name": "Mecklenburg-Vorpommern" + }, + { + "code": "DE-NI", + "name": "Lower Saxony" + }, + { + "code": "DE-NW", + "name": "North Rhine-Westphalia" + }, + { + "code": "DE-RP", + "name": "Rhineland-Palatinate" + }, + { + "code": "DE-SL", + "name": "Saarland" + }, + { + "code": "DE-SN", + "name": "Saxony" + }, + { + "code": "DE-ST", + "name": "Saxony-Anhalt" + }, + { + "code": "DE-SH", + "name": "Schleswig-Holstein" + }, + { + "code": "DE-TH", + "name": "Thuringia" + } + ] + }, + { + "code": "DK", + "name": "Danish krone", + "currency_code": "DKK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "EE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "ES", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "C", + "name": "A Coruña" + }, + { + "code": "VI", + "name": "Araba/Álava" + }, + { + "code": "AB", + "name": "Albacete" + }, + { + "code": "A", + "name": "Alicante" + }, + { + "code": "AL", + "name": "Almería" + }, + { + "code": "O", + "name": "Asturias" + }, + { + "code": "AV", + "name": "Ávila" + }, + { + "code": "BA", + "name": "Badajoz" + }, + { + "code": "PM", + "name": "Baleares" + }, + { + "code": "B", + "name": "Barcelona" + }, + { + "code": "BU", + "name": "Burgos" + }, + { + "code": "CC", + "name": "Cáceres" + }, + { + "code": "CA", + "name": "Cádiz" + }, + { + "code": "S", + "name": "Cantabria" + }, + { + "code": "CS", + "name": "Castellón" + }, + { + "code": "CE", + "name": "Ceuta" + }, + { + "code": "CR", + "name": "Ciudad Real" + }, + { + "code": "CO", + "name": "Córdoba" + }, + { + "code": "CU", + "name": "Cuenca" + }, + { + "code": "GI", + "name": "Girona" + }, + { + "code": "GR", + "name": "Granada" + }, + { + "code": "GU", + "name": "Guadalajara" + }, + { + "code": "SS", + "name": "Gipuzkoa" + }, + { + "code": "H", + "name": "Huelva" + }, + { + "code": "HU", + "name": "Huesca" + }, + { + "code": "J", + "name": "Jaén" + }, + { + "code": "LO", + "name": "La Rioja" + }, + { + "code": "GC", + "name": "Las Palmas" + }, + { + "code": "LE", + "name": "León" + }, + { + "code": "L", + "name": "Lleida" + }, + { + "code": "LU", + "name": "Lugo" + }, + { + "code": "M", + "name": "Madrid" + }, + { + "code": "MA", + "name": "Málaga" + }, + { + "code": "ML", + "name": "Melilla" + }, + { + "code": "MU", + "name": "Murcia" + }, + { + "code": "NA", + "name": "Navarra" + }, + { + "code": "OR", + "name": "Ourense" + }, + { + "code": "P", + "name": "Palencia" + }, + { + "code": "PO", + "name": "Pontevedra" + }, + { + "code": "SA", + "name": "Salamanca" + }, + { + "code": "TF", + "name": "Santa Cruz de Tenerife" + }, + { + "code": "SG", + "name": "Segovia" + }, + { + "code": "SE", + "name": "Sevilla" + }, + { + "code": "SO", + "name": "Soria" + }, + { + "code": "T", + "name": "Tarragona" + }, + { + "code": "TE", + "name": "Teruel" + }, + { + "code": "TO", + "name": "Toledo" + }, + { + "code": "V", + "name": "Valencia" + }, + { + "code": "VA", + "name": "Valladolid" + }, + { + "code": "BI", + "name": "Biscay" + }, + { + "code": "ZA", + "name": "Zamora" + }, + { + "code": "Z", + "name": "Zaragoza" + } + ] + }, + { + "code": "FI", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "FO", + "name": "Danish krone", + "currency_code": "DKK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "FR", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GB", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "foot", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "oz", + "states": [] + }, + { + "code": "GG", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GI", + "name": "Gibraltar pound", + "currency_code": "GIP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "GR", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "I", + "name": "Attica" + }, + { + "code": "A", + "name": "East Macedonia and Thrace" + }, + { + "code": "B", + "name": "Central Macedonia" + }, + { + "code": "C", + "name": "West Macedonia" + }, + { + "code": "D", + "name": "Epirus" + }, + { + "code": "E", + "name": "Thessaly" + }, + { + "code": "F", + "name": "Ionian Islands" + }, + { + "code": "G", + "name": "West Greece" + }, + { + "code": "H", + "name": "Central Greece" + }, + { + "code": "J", + "name": "Peloponnese" + }, + { + "code": "K", + "name": "North Aegean" + }, + { + "code": "L", + "name": "South Aegean" + }, + { + "code": "M", + "name": "Crete" + } + ] + }, + { + "code": "HR", + "name": "Croatian kuna", + "currency_code": "HRK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "HU", + "name": "Hungarian forint", + "currency_code": "HUF", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "BK", + "name": "Bács-Kiskun" + }, + { + "code": "BE", + "name": "Békés" + }, + { + "code": "BA", + "name": "Baranya" + }, + { + "code": "BZ", + "name": "Borsod-Abaúj-Zemplén" + }, + { + "code": "BU", + "name": "Budapest" + }, + { + "code": "CS", + "name": "Csongrád-Csanád" + }, + { + "code": "FE", + "name": "Fejér" + }, + { + "code": "GS", + "name": "Győr-Moson-Sopron" + }, + { + "code": "HB", + "name": "Hajdú-Bihar" + }, + { + "code": "HE", + "name": "Heves" + }, + { + "code": "JN", + "name": "Jász-Nagykun-Szolnok" + }, + { + "code": "KE", + "name": "Komárom-Esztergom" + }, + { + "code": "NO", + "name": "Nógrád" + }, + { + "code": "PE", + "name": "Pest" + }, + { + "code": "SO", + "name": "Somogy" + }, + { + "code": "SZ", + "name": "Szabolcs-Szatmár-Bereg" + }, + { + "code": "TO", + "name": "Tolna" + }, + { + "code": "VA", + "name": "Vas" + }, + { + "code": "VE", + "name": "Veszprém" + }, + { + "code": "ZA", + "name": "Zala" + } + ] + }, + { + "code": "IE", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [{ + "code": "CW", + "name": "Carlow" + }, + { + "code": "CN", + "name": "Cavan" + }, + { + "code": "CE", + "name": "Clare" + }, + { + "code": "CO", + "name": "Cork" + }, + { + "code": "DL", + "name": "Donegal" + }, + { + "code": "D", + "name": "Dublin" + }, + { + "code": "G", + "name": "Galway" + }, + { + "code": "KY", + "name": "Kerry" + }, + { + "code": "KE", + "name": "Kildare" + }, + { + "code": "KK", + "name": "Kilkenny" + }, + { + "code": "LS", + "name": "Laois" + }, + { + "code": "LM", + "name": "Leitrim" + }, + { + "code": "LK", + "name": "Limerick" + }, + { + "code": "LD", + "name": "Longford" + }, + { + "code": "LH", + "name": "Louth" + }, + { + "code": "MO", + "name": "Mayo" + }, + { + "code": "MH", + "name": "Meath" + }, + { + "code": "MN", + "name": "Monaghan" + }, + { + "code": "OY", + "name": "Offaly" + }, + { + "code": "RN", + "name": "Roscommon" + }, + { + "code": "SO", + "name": "Sligo" + }, + { + "code": "TA", + "name": "Tipperary" + }, + { + "code": "WD", + "name": "Waterford" + }, + { + "code": "WH", + "name": "Westmeath" + }, + { + "code": "WX", + "name": "Wexford" + }, + { + "code": "WW", + "name": "Wicklow" + } + ] + }, + { + "code": "IM", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IS", + "name": "Icelandic króna", + "currency_code": "ISK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "IT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AG", + "name": "Agrigento" + }, + { + "code": "AL", + "name": "Alessandria" + }, + { + "code": "AN", + "name": "Ancona" + }, + { + "code": "AO", + "name": "Aosta" + }, + { + "code": "AR", + "name": "Arezzo" + }, + { + "code": "AP", + "name": "Ascoli Piceno" + }, + { + "code": "AT", + "name": "Asti" + }, + { + "code": "AV", + "name": "Avellino" + }, + { + "code": "BA", + "name": "Bari" + }, + { + "code": "BT", + "name": "Barletta-Andria-Trani" + }, + { + "code": "BL", + "name": "Belluno" + }, + { + "code": "BN", + "name": "Benevento" + }, + { + "code": "BG", + "name": "Bergamo" + }, + { + "code": "BI", + "name": "Biella" + }, + { + "code": "BO", + "name": "Bologna" + }, + { + "code": "BZ", + "name": "Bolzano" + }, + { + "code": "BS", + "name": "Brescia" + }, + { + "code": "BR", + "name": "Brindisi" + }, + { + "code": "CA", + "name": "Cagliari" + }, + { + "code": "CL", + "name": "Caltanissetta" + }, + { + "code": "CB", + "name": "Campobasso" + }, + { + "code": "CE", + "name": "Caserta" + }, + { + "code": "CT", + "name": "Catania" + }, + { + "code": "CZ", + "name": "Catanzaro" + }, + { + "code": "CH", + "name": "Chieti" + }, + { + "code": "CO", + "name": "Como" + }, + { + "code": "CS", + "name": "Cosenza" + }, + { + "code": "CR", + "name": "Cremona" + }, + { + "code": "KR", + "name": "Crotone" + }, + { + "code": "CN", + "name": "Cuneo" + }, + { + "code": "EN", + "name": "Enna" + }, + { + "code": "FM", + "name": "Fermo" + }, + { + "code": "FE", + "name": "Ferrara" + }, + { + "code": "FI", + "name": "Firenze" + }, + { + "code": "FG", + "name": "Foggia" + }, + { + "code": "FC", + "name": "Forlì-Cesena" + }, + { + "code": "FR", + "name": "Frosinone" + }, + { + "code": "GE", + "name": "Genova" + }, + { + "code": "GO", + "name": "Gorizia" + }, + { + "code": "GR", + "name": "Grosseto" + }, + { + "code": "IM", + "name": "Imperia" + }, + { + "code": "IS", + "name": "Isernia" + }, + { + "code": "SP", + "name": "La Spezia" + }, + { + "code": "AQ", + "name": "L'Aquila" + }, + { + "code": "LT", + "name": "Latina" + }, + { + "code": "LE", + "name": "Lecce" + }, + { + "code": "LC", + "name": "Lecco" + }, + { + "code": "LI", + "name": "Livorno" + }, + { + "code": "LO", + "name": "Lodi" + }, + { + "code": "LU", + "name": "Lucca" + }, + { + "code": "MC", + "name": "Macerata" + }, + { + "code": "MN", + "name": "Mantova" + }, + { + "code": "MS", + "name": "Massa-Carrara" + }, + { + "code": "MT", + "name": "Matera" + }, + { + "code": "ME", + "name": "Messina" + }, + { + "code": "MI", + "name": "Milano" + }, + { + "code": "MO", + "name": "Modena" + }, + { + "code": "MB", + "name": "Monza e della Brianza" + }, + { + "code": "NA", + "name": "Napoli" + }, + { + "code": "NO", + "name": "Novara" + }, + { + "code": "NU", + "name": "Nuoro" + }, + { + "code": "OR", + "name": "Oristano" + }, + { + "code": "PD", + "name": "Padova" + }, + { + "code": "PA", + "name": "Palermo" + }, + { + "code": "PR", + "name": "Parma" + }, + { + "code": "PV", + "name": "Pavia" + }, + { + "code": "PG", + "name": "Perugia" + }, + { + "code": "PU", + "name": "Pesaro e Urbino" + }, + { + "code": "PE", + "name": "Pescara" + }, + { + "code": "PC", + "name": "Piacenza" + }, + { + "code": "PI", + "name": "Pisa" + }, + { + "code": "PT", + "name": "Pistoia" + }, + { + "code": "PN", + "name": "Pordenone" + }, + { + "code": "PZ", + "name": "Potenza" + }, + { + "code": "PO", + "name": "Prato" + }, + { + "code": "RG", + "name": "Ragusa" + }, + { + "code": "RA", + "name": "Ravenna" + }, + { + "code": "RC", + "name": "Reggio Calabria" + }, + { + "code": "RE", + "name": "Reggio Emilia" + }, + { + "code": "RI", + "name": "Rieti" + }, + { + "code": "RN", + "name": "Rimini" + }, + { + "code": "RM", + "name": "Roma" + }, + { + "code": "RO", + "name": "Rovigo" + }, + { + "code": "SA", + "name": "Salerno" + }, + { + "code": "SS", + "name": "Sassari" + }, + { + "code": "SV", + "name": "Savona" + }, + { + "code": "SI", + "name": "Siena" + }, + { + "code": "SR", + "name": "Siracusa" + }, + { + "code": "SO", + "name": "Sondrio" + }, + { + "code": "SU", + "name": "Sud Sardegna" + }, + { + "code": "TA", + "name": "Taranto" + }, + { + "code": "TE", + "name": "Teramo" + }, + { + "code": "TR", + "name": "Terni" + }, + { + "code": "TO", + "name": "Torino" + }, + { + "code": "TP", + "name": "Trapani" + }, + { + "code": "TN", + "name": "Trento" + }, + { + "code": "TV", + "name": "Treviso" + }, + { + "code": "TS", + "name": "Trieste" + }, + { + "code": "UD", + "name": "Udine" + }, + { + "code": "VA", + "name": "Varese" + }, + { + "code": "VE", + "name": "Venezia" + }, + { + "code": "VB", + "name": "Verbano-Cusio-Ossola" + }, + { + "code": "VC", + "name": "Vercelli" + }, + { + "code": "VR", + "name": "Verona" + }, + { + "code": "VV", + "name": "Vibo Valentia" + }, + { + "code": "VI", + "name": "Vicenza" + }, + { + "code": "VT", + "name": "Viterbo" + } + ] + }, + { + "code": "JE", + "name": "Pound sterling", + "currency_code": "GBP", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LI", + "name": "Swiss franc", + "currency_code": "CHF", + "currency_pos": "left_space", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": "'", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LU", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "LV", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MC", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MD", + "name": "Moldovan leu", + "currency_code": "MDL", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "C", + "name": "Chișinău" + }, + { + "code": "BL", + "name": "Bălți" + }, + { + "code": "AN", + "name": "Anenii Noi" + }, + { + "code": "BS", + "name": "Basarabeasca" + }, + { + "code": "BR", + "name": "Briceni" + }, + { + "code": "CH", + "name": "Cahul" + }, + { + "code": "CT", + "name": "Cantemir" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Căușeni" + }, + { + "code": "CM", + "name": "Cimișlia" + }, + { + "code": "CR", + "name": "Criuleni" + }, + { + "code": "DN", + "name": "Dondușeni" + }, + { + "code": "DR", + "name": "Drochia" + }, + { + "code": "DB", + "name": "Dubăsari" + }, + { + "code": "ED", + "name": "Edineț" + }, + { + "code": "FL", + "name": "Fălești" + }, + { + "code": "FR", + "name": "Florești" + }, + { + "code": "GE", + "name": "UTA Găgăuzia" + }, + { + "code": "GL", + "name": "Glodeni" + }, + { + "code": "HN", + "name": "Hîncești" + }, + { + "code": "IL", + "name": "Ialoveni" + }, + { + "code": "LV", + "name": "Leova" + }, + { + "code": "NS", + "name": "Nisporeni" + }, + { + "code": "OC", + "name": "Ocnița" + }, + { + "code": "OR", + "name": "Orhei" + }, + { + "code": "RZ", + "name": "Rezina" + }, + { + "code": "RS", + "name": "Rîșcani" + }, + { + "code": "SG", + "name": "Sîngerei" + }, + { + "code": "SR", + "name": "Soroca" + }, + { + "code": "ST", + "name": "Strășeni" + }, + { + "code": "SD", + "name": "Șoldănești" + }, + { + "code": "SV", + "name": "Ștefan Vodă" + }, + { + "code": "TR", + "name": "Taraclia" + }, + { + "code": "TL", + "name": "Telenești" + }, + { + "code": "UN", + "name": "Ungheni" + } + ] + }, + { + "code": "ME", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MK", + "name": "Macedonian denar", + "currency_code": "MKD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "MT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left", + "decimal_sep": ".", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ",", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NL", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "NO", + "name": "Norwegian krone", + "currency_code": "NOK", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PL", + "name": "Polish złoty", + "currency_code": "PLN", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "PT", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "RO", + "name": "Romanian leu", + "currency_code": "RON", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "AB", + "name": "Alba" + }, + { + "code": "AR", + "name": "Arad" + }, + { + "code": "AG", + "name": "Argeș" + }, + { + "code": "BC", + "name": "Bacău" + }, + { + "code": "BH", + "name": "Bihor" + }, + { + "code": "BN", + "name": "Bistrița-Năsăud" + }, + { + "code": "BT", + "name": "Botoșani" + }, + { + "code": "BR", + "name": "Brăila" + }, + { + "code": "BV", + "name": "Brașov" + }, + { + "code": "B", + "name": "București" + }, + { + "code": "BZ", + "name": "Buzău" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Caraș-Severin" + }, + { + "code": "CJ", + "name": "Cluj" + }, + { + "code": "CT", + "name": "Constanța" + }, + { + "code": "CV", + "name": "Covasna" + }, + { + "code": "DB", + "name": "Dâmbovița" + }, + { + "code": "DJ", + "name": "Dolj" + }, + { + "code": "GL", + "name": "Galați" + }, + { + "code": "GR", + "name": "Giurgiu" + }, + { + "code": "GJ", + "name": "Gorj" + }, + { + "code": "HR", + "name": "Harghita" + }, + { + "code": "HD", + "name": "Hunedoara" + }, + { + "code": "IL", + "name": "Ialomița" + }, + { + "code": "IS", + "name": "Iași" + }, + { + "code": "IF", + "name": "Ilfov" + }, + { + "code": "MM", + "name": "Maramureș" + }, + { + "code": "MH", + "name": "Mehedinți" + }, + { + "code": "MS", + "name": "Mureș" + }, + { + "code": "NT", + "name": "Neamț" + }, + { + "code": "OT", + "name": "Olt" + }, + { + "code": "PH", + "name": "Prahova" + }, + { + "code": "SJ", + "name": "Sălaj" + }, + { + "code": "SM", + "name": "Satu Mare" + }, + { + "code": "SB", + "name": "Sibiu" + }, + { + "code": "SV", + "name": "Suceava" + }, + { + "code": "TR", + "name": "Teleorman" + }, + { + "code": "TM", + "name": "Timiș" + }, + { + "code": "TL", + "name": "Tulcea" + }, + { + "code": "VL", + "name": "Vâlcea" + }, + { + "code": "VS", + "name": "Vaslui" + }, + { + "code": "VN", + "name": "Vrancea" + } + ] + }, + { + "code": "RS", + "name": "Serbian dinar", + "currency_code": "RSD", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "RS00", + "name": "Belgrade" + }, + { + "code": "RS14", + "name": "Bor" + }, + { + "code": "RS11", + "name": "Braničevo" + }, + { + "code": "RS02", + "name": "Central Banat" + }, + { + "code": "RS10", + "name": "Danube" + }, + { + "code": "RS23", + "name": "Jablanica" + }, + { + "code": "RS09", + "name": "Kolubara" + }, + { + "code": "RS08", + "name": "Mačva" + }, + { + "code": "RS17", + "name": "Morava" + }, + { + "code": "RS20", + "name": "Nišava" + }, + { + "code": "RS01", + "name": "North Bačka" + }, + { + "code": "RS03", + "name": "North Banat" + }, + { + "code": "RS24", + "name": "Pčinja" + }, + { + "code": "RS22", + "name": "Pirot" + }, + { + "code": "RS13", + "name": "Pomoravlje" + }, + { + "code": "RS19", + "name": "Rasina" + }, + { + "code": "RS18", + "name": "Raška" + }, + { + "code": "RS06", + "name": "South Bačka" + }, + { + "code": "RS04", + "name": "South Banat" + }, + { + "code": "RS07", + "name": "Srem" + }, + { + "code": "RS12", + "name": "Šumadija" + }, + { + "code": "RS21", + "name": "Toplica" + }, + { + "code": "RS05", + "name": "West Bačka" + }, + { + "code": "RS15", + "name": "Zaječar" + }, + { + "code": "RS16", + "name": "Zlatibor" + }, + { + "code": "RS25", + "name": "Kosovo" + }, + { + "code": "RS26", + "name": "Peć" + }, + { + "code": "RS27", + "name": "Prizren" + }, + { + "code": "RS28", + "name": "Kosovska Mitrovica" + }, + { + "code": "RS29", + "name": "Kosovo-Pomoravlje" + }, + { + "code": "RSKM", + "name": "Kosovo-Metohija" + }, + { + "code": "RSVO", + "name": "Vojvodina" + } + ] + }, + { + "code": "RU", + "name": "Russian ruble", + "currency_code": "RUB", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SE", + "name": "Swedish krona", + "currency_code": "SEK", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SI", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SJ", + "name": "Norwegian krone", + "currency_code": "NOK", + "currency_pos": "left_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 0, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SK", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [] + }, + { + "code": "SM", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + }, + { + "code": "TR", + "name": "Turkish lira", + "currency_code": "TRY", + "currency_pos": "left", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [{ + "code": "TR01", + "name": "Adana" + }, + { + "code": "TR02", + "name": "Adıyaman" + }, + { + "code": "TR03", + "name": "Afyon" + }, + { + "code": "TR04", + "name": "Ağrı" + }, + { + "code": "TR05", + "name": "Amasya" + }, + { + "code": "TR06", + "name": "Ankara" + }, + { + "code": "TR07", + "name": "Antalya" + }, + { + "code": "TR08", + "name": "Artvin" + }, + { + "code": "TR09", + "name": "Aydın" + }, + { + "code": "TR10", + "name": "Balıkesir" + }, + { + "code": "TR11", + "name": "Bilecik" + }, + { + "code": "TR12", + "name": "Bingöl" + }, + { + "code": "TR13", + "name": "Bitlis" + }, + { + "code": "TR14", + "name": "Bolu" + }, + { + "code": "TR15", + "name": "Burdur" + }, + { + "code": "TR16", + "name": "Bursa" + }, + { + "code": "TR17", + "name": "Çanakkale" + }, + { + "code": "TR18", + "name": "Çankırı" + }, + { + "code": "TR19", + "name": "Çorum" + }, + { + "code": "TR20", + "name": "Denizli" + }, + { + "code": "TR21", + "name": "Diyarbakır" + }, + { + "code": "TR22", + "name": "Edirne" + }, + { + "code": "TR23", + "name": "Elazığ" + }, + { + "code": "TR24", + "name": "Erzincan" + }, + { + "code": "TR25", + "name": "Erzurum" + }, + { + "code": "TR26", + "name": "Eskişehir" + }, + { + "code": "TR27", + "name": "Gaziantep" + }, + { + "code": "TR28", + "name": "Giresun" + }, + { + "code": "TR29", + "name": "Gümüşhane" + }, + { + "code": "TR30", + "name": "Hakkari" + }, + { + "code": "TR31", + "name": "Hatay" + }, + { + "code": "TR32", + "name": "Isparta" + }, + { + "code": "TR33", + "name": "İçel" + }, + { + "code": "TR34", + "name": "İstanbul" + }, + { + "code": "TR35", + "name": "İzmir" + }, + { + "code": "TR36", + "name": "Kars" + }, + { + "code": "TR37", + "name": "Kastamonu" + }, + { + "code": "TR38", + "name": "Kayseri" + }, + { + "code": "TR39", + "name": "Kırklareli" + }, + { + "code": "TR40", + "name": "Kırşehir" + }, + { + "code": "TR41", + "name": "Kocaeli" + }, + { + "code": "TR42", + "name": "Konya" + }, + { + "code": "TR43", + "name": "Kütahya" + }, + { + "code": "TR44", + "name": "Malatya" + }, + { + "code": "TR45", + "name": "Manisa" + }, + { + "code": "TR46", + "name": "Kahramanmaraş" + }, + { + "code": "TR47", + "name": "Mardin" + }, + { + "code": "TR48", + "name": "Muğla" + }, + { + "code": "TR49", + "name": "Muş" + }, + { + "code": "TR50", + "name": "Nevşehir" + }, + { + "code": "TR51", + "name": "Niğde" + }, + { + "code": "TR52", + "name": "Ordu" + }, + { + "code": "TR53", + "name": "Rize" + }, + { + "code": "TR54", + "name": "Sakarya" + }, + { + "code": "TR55", + "name": "Samsun" + }, + { + "code": "TR56", + "name": "Siirt" + }, + { + "code": "TR57", + "name": "Sinop" + }, + { + "code": "TR58", + "name": "Sivas" + }, + { + "code": "TR59", + "name": "Tekirdağ" + }, + { + "code": "TR60", + "name": "Tokat" + }, + { + "code": "TR61", + "name": "Trabzon" + }, + { + "code": "TR62", + "name": "Tunceli" + }, + { + "code": "TR63", + "name": "Şanlıurfa" + }, + { + "code": "TR64", + "name": "Uşak" + }, + { + "code": "TR65", + "name": "Van" + }, + { + "code": "TR66", + "name": "Yozgat" + }, + { + "code": "TR67", + "name": "Zonguldak" + }, + { + "code": "TR68", + "name": "Aksaray" + }, + { + "code": "TR69", + "name": "Bayburt" + }, + { + "code": "TR70", + "name": "Karaman" + }, + { + "code": "TR71", + "name": "Kırıkkale" + }, + { + "code": "TR72", + "name": "Batman" + }, + { + "code": "TR73", + "name": "Şırnak" + }, + { + "code": "TR74", + "name": "Bartın" + }, + { + "code": "TR75", + "name": "Ardahan" + }, + { + "code": "TR76", + "name": "Iğdır" + }, + { + "code": "TR77", + "name": "Yalova" + }, + { + "code": "TR78", + "name": "Karabük" + }, + { + "code": "TR79", + "name": "Kilis" + }, + { + "code": "TR80", + "name": "Osmaniye" + }, + { + "code": "TR81", + "name": "Düzce" + } + ] + }, + { + "code": "UA", + "name": "Ukrainian hryvnia", + "currency_code": "UAH", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": " ", + "weight_unit": "kg", + "states": [{ + "code": "VN", + "name": "Vinnytsia Oblast" + }, + { + "code": "VL", + "name": "Volyn Oblast" + }, + { + "code": "DP", + "name": "Dnipropetrovsk Oblast" + }, + { + "code": "DT", + "name": "Donetsk Oblast" + }, + { + "code": "ZT", + "name": "Zhytomyr Oblast" + }, + { + "code": "ZK", + "name": "Zakarpattia Oblast" + }, + { + "code": "ZP", + "name": "Zaporizhzhia Oblast" + }, + { + "code": "IF", + "name": "Ivano-Frankivsk Oblast" + }, + { + "code": "KV", + "name": "Kyiv Oblast" + }, + { + "code": "KH", + "name": "Kirovohrad Oblast" + }, + { + "code": "LH", + "name": "Luhansk Oblast" + }, + { + "code": "LV", + "name": "Lviv Oblast" + }, + { + "code": "MY", + "name": "Mykolaiv Oblast" + }, + { + "code": "OD", + "name": "Odessa Oblast" + }, + { + "code": "PL", + "name": "Poltava Oblast" + }, + { + "code": "RV", + "name": "Rivne Oblast" + }, + { + "code": "SM", + "name": "Sumy Oblast" + }, + { + "code": "TP", + "name": "Ternopil Oblast" + }, + { + "code": "KK", + "name": "Kharkiv Oblast" + }, + { + "code": "KS", + "name": "Kherson Oblast" + }, + { + "code": "KM", + "name": "Khmelnytskyi Oblast" + }, + { + "code": "CK", + "name": "Cherkasy Oblast" + }, + { + "code": "CH", + "name": "Chernihiv Oblast" + }, + { + "code": "CV", + "name": "Chernivtsi Oblast" + } + ] + }, + { + "code": "VA", + "name": "Euro", + "currency_code": "EUR", + "currency_pos": "right_space", + "decimal_sep": ",", + "dimension_unit": "cm", + "num_decimals": 2, + "thousand_sep": ".", + "weight_unit": "kg", + "states": [] + } + ], + }) + ); + }); + + test('can view all countries', async ({ + request + }) => { + // call API to retrieve all countries + const response = await request.get('/wp-json/wc/v3/data/countries'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AF", + "name": "Afghanistan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AX", + "name": "Åland Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AL", + "name": "Albania", + "states": [{ + "code": "AL-01", + "name": "Berat" + }, + { + "code": "AL-09", + "name": "Dibër" + }, + { + "code": "AL-02", + "name": "Durrës" + }, + { + "code": "AL-03", + "name": "Elbasan" + }, + { + "code": "AL-04", + "name": "Fier" + }, + { + "code": "AL-05", + "name": "Gjirokastër" + }, + { + "code": "AL-06", + "name": "Korçë" + }, + { + "code": "AL-07", + "name": "Kukës" + }, + { + "code": "AL-08", + "name": "Lezhë" + }, + { + "code": "AL-10", + "name": "Shkodër" + }, + { + "code": "AL-11", + "name": "Tirana" + }, + { + "code": "AL-12", + "name": "Vlorë" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DZ", + "name": "Algeria", + "states": [{ + "code": "DZ-01", + "name": "Adrar" + }, + { + "code": "DZ-02", + "name": "Chlef" + }, + { + "code": "DZ-03", + "name": "Laghouat" + }, + { + "code": "DZ-04", + "name": "Oum El Bouaghi" + }, + { + "code": "DZ-05", + "name": "Batna" + }, + { + "code": "DZ-06", + "name": "Béjaïa" + }, + { + "code": "DZ-07", + "name": "Biskra" + }, + { + "code": "DZ-08", + "name": "Béchar" + }, + { + "code": "DZ-09", + "name": "Blida" + }, + { + "code": "DZ-10", + "name": "Bouira" + }, + { + "code": "DZ-11", + "name": "Tamanghasset" + }, + { + "code": "DZ-12", + "name": "Tébessa" + }, + { + "code": "DZ-13", + "name": "Tlemcen" + }, + { + "code": "DZ-14", + "name": "Tiaret" + }, + { + "code": "DZ-15", + "name": "Tizi Ouzou" + }, + { + "code": "DZ-16", + "name": "Algiers" + }, + { + "code": "DZ-17", + "name": "Djelfa" + }, + { + "code": "DZ-18", + "name": "Jijel" + }, + { + "code": "DZ-19", + "name": "Sétif" + }, + { + "code": "DZ-20", + "name": "Saïda" + }, + { + "code": "DZ-21", + "name": "Skikda" + }, + { + "code": "DZ-22", + "name": "Sidi Bel Abbès" + }, + { + "code": "DZ-23", + "name": "Annaba" + }, + { + "code": "DZ-24", + "name": "Guelma" + }, + { + "code": "DZ-25", + "name": "Constantine" + }, + { + "code": "DZ-26", + "name": "Médéa" + }, + { + "code": "DZ-27", + "name": "Mostaganem" + }, + { + "code": "DZ-28", + "name": "M’Sila" + }, + { + "code": "DZ-29", + "name": "Mascara" + }, + { + "code": "DZ-30", + "name": "Ouargla" + }, + { + "code": "DZ-31", + "name": "Oran" + }, + { + "code": "DZ-32", + "name": "El Bayadh" + }, + { + "code": "DZ-33", + "name": "Illizi" + }, + { + "code": "DZ-34", + "name": "Bordj Bou Arréridj" + }, + { + "code": "DZ-35", + "name": "Boumerdès" + }, + { + "code": "DZ-36", + "name": "El Tarf" + }, + { + "code": "DZ-37", + "name": "Tindouf" + }, + { + "code": "DZ-38", + "name": "Tissemsilt" + }, + { + "code": "DZ-39", + "name": "El Oued" + }, + { + "code": "DZ-40", + "name": "Khenchela" + }, + { + "code": "DZ-41", + "name": "Souk Ahras" + }, + { + "code": "DZ-42", + "name": "Tipasa" + }, + { + "code": "DZ-43", + "name": "Mila" + }, + { + "code": "DZ-44", + "name": "Aïn Defla" + }, + { + "code": "DZ-45", + "name": "Naama" + }, + { + "code": "DZ-46", + "name": "Aïn Témouchent" + }, + { + "code": "DZ-47", + "name": "Ghardaïa" + }, + { + "code": "DZ-48", + "name": "Relizane" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AS", + "name": "American Samoa", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AD", + "name": "Andorra", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AO", + "name": "Angola", + "states": [{ + "code": "BGO", + "name": "Bengo" + }, + { + "code": "BLU", + "name": "Benguela" + }, + { + "code": "BIE", + "name": "Bié" + }, + { + "code": "CAB", + "name": "Cabinda" + }, + { + "code": "CNN", + "name": "Cunene" + }, + { + "code": "HUA", + "name": "Huambo" + }, + { + "code": "HUI", + "name": "Huíla" + }, + { + "code": "CCU", + "name": "Kuando Kubango" + }, + { + "code": "CNO", + "name": "Kwanza-Norte" + }, + { + "code": "CUS", + "name": "Kwanza-Sul" + }, + { + "code": "LUA", + "name": "Luanda" + }, + { + "code": "LNO", + "name": "Lunda-Norte" + }, + { + "code": "LSU", + "name": "Lunda-Sul" + }, + { + "code": "MAL", + "name": "Malanje" + }, + { + "code": "MOX", + "name": "Moxico" + }, + { + "code": "NAM", + "name": "Namibe" + }, + { + "code": "UIG", + "name": "Uíge" + }, + { + "code": "ZAI", + "name": "Zaire" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AI", + "name": "Anguilla", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AQ", + "name": "Antarctica", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AG", + "name": "Antigua and Barbuda", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AR", + "name": "Argentina", + "states": [{ + "code": "C", + "name": "Ciudad Autónoma de Buenos Aires" + }, + { + "code": "B", + "name": "Buenos Aires" + }, + { + "code": "K", + "name": "Catamarca" + }, + { + "code": "H", + "name": "Chaco" + }, + { + "code": "U", + "name": "Chubut" + }, + { + "code": "X", + "name": "Córdoba" + }, + { + "code": "W", + "name": "Corrientes" + }, + { + "code": "E", + "name": "Entre Ríos" + }, + { + "code": "P", + "name": "Formosa" + }, + { + "code": "Y", + "name": "Jujuy" + }, + { + "code": "L", + "name": "La Pampa" + }, + { + "code": "F", + "name": "La Rioja" + }, + { + "code": "M", + "name": "Mendoza" + }, + { + "code": "N", + "name": "Misiones" + }, + { + "code": "Q", + "name": "Neuquén" + }, + { + "code": "R", + "name": "Río Negro" + }, + { + "code": "A", + "name": "Salta" + }, + { + "code": "J", + "name": "San Juan" + }, + { + "code": "D", + "name": "San Luis" + }, + { + "code": "Z", + "name": "Santa Cruz" + }, + { + "code": "S", + "name": "Santa Fe" + }, + { + "code": "G", + "name": "Santiago del Estero" + }, + { + "code": "V", + "name": "Tierra del Fuego" + }, + { + "code": "T", + "name": "Tucumán" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AM", + "name": "Armenia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AW", + "name": "Aruba", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AU", + "name": "Australia", + "states": [{ + "code": "ACT", + "name": "Australian Capital Territory" + }, + { + "code": "NSW", + "name": "New South Wales" + }, + { + "code": "NT", + "name": "Northern Territory" + }, + { + "code": "QLD", + "name": "Queensland" + }, + { + "code": "SA", + "name": "South Australia" + }, + { + "code": "TAS", + "name": "Tasmania" + }, + { + "code": "VIC", + "name": "Victoria" + }, + { + "code": "WA", + "name": "Western Australia" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AT", + "name": "Austria", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AZ", + "name": "Azerbaijan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BS", + "name": "Bahamas", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BH", + "name": "Bahrain", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BD", + "name": "Bangladesh", + "states": [{ + "code": "BD-05", + "name": "Bagerhat" + }, + { + "code": "BD-01", + "name": "Bandarban" + }, + { + "code": "BD-02", + "name": "Barguna" + }, + { + "code": "BD-06", + "name": "Barishal" + }, + { + "code": "BD-07", + "name": "Bhola" + }, + { + "code": "BD-03", + "name": "Bogura" + }, + { + "code": "BD-04", + "name": "Brahmanbaria" + }, + { + "code": "BD-09", + "name": "Chandpur" + }, + { + "code": "BD-10", + "name": "Chattogram" + }, + { + "code": "BD-12", + "name": "Chuadanga" + }, + { + "code": "BD-11", + "name": "Cox's Bazar" + }, + { + "code": "BD-08", + "name": "Cumilla" + }, + { + "code": "BD-13", + "name": "Dhaka" + }, + { + "code": "BD-14", + "name": "Dinajpur" + }, + { + "code": "BD-15", + "name": "Faridpur " + }, + { + "code": "BD-16", + "name": "Feni" + }, + { + "code": "BD-19", + "name": "Gaibandha" + }, + { + "code": "BD-18", + "name": "Gazipur" + }, + { + "code": "BD-17", + "name": "Gopalganj" + }, + { + "code": "BD-20", + "name": "Habiganj" + }, + { + "code": "BD-21", + "name": "Jamalpur" + }, + { + "code": "BD-22", + "name": "Jashore" + }, + { + "code": "BD-25", + "name": "Jhalokati" + }, + { + "code": "BD-23", + "name": "Jhenaidah" + }, + { + "code": "BD-24", + "name": "Joypurhat" + }, + { + "code": "BD-29", + "name": "Khagrachhari" + }, + { + "code": "BD-27", + "name": "Khulna" + }, + { + "code": "BD-26", + "name": "Kishoreganj" + }, + { + "code": "BD-28", + "name": "Kurigram" + }, + { + "code": "BD-30", + "name": "Kushtia" + }, + { + "code": "BD-31", + "name": "Lakshmipur" + }, + { + "code": "BD-32", + "name": "Lalmonirhat" + }, + { + "code": "BD-36", + "name": "Madaripur" + }, + { + "code": "BD-37", + "name": "Magura" + }, + { + "code": "BD-33", + "name": "Manikganj " + }, + { + "code": "BD-39", + "name": "Meherpur" + }, + { + "code": "BD-38", + "name": "Moulvibazar" + }, + { + "code": "BD-35", + "name": "Munshiganj" + }, + { + "code": "BD-34", + "name": "Mymensingh" + }, + { + "code": "BD-48", + "name": "Naogaon" + }, + { + "code": "BD-43", + "name": "Narail" + }, + { + "code": "BD-40", + "name": "Narayanganj" + }, + { + "code": "BD-42", + "name": "Narsingdi" + }, + { + "code": "BD-44", + "name": "Natore" + }, + { + "code": "BD-45", + "name": "Nawabganj" + }, + { + "code": "BD-41", + "name": "Netrakona" + }, + { + "code": "BD-46", + "name": "Nilphamari" + }, + { + "code": "BD-47", + "name": "Noakhali" + }, + { + "code": "BD-49", + "name": "Pabna" + }, + { + "code": "BD-52", + "name": "Panchagarh" + }, + { + "code": "BD-51", + "name": "Patuakhali" + }, + { + "code": "BD-50", + "name": "Pirojpur" + }, + { + "code": "BD-53", + "name": "Rajbari" + }, + { + "code": "BD-54", + "name": "Rajshahi" + }, + { + "code": "BD-56", + "name": "Rangamati" + }, + { + "code": "BD-55", + "name": "Rangpur" + }, + { + "code": "BD-58", + "name": "Satkhira" + }, + { + "code": "BD-62", + "name": "Shariatpur" + }, + { + "code": "BD-57", + "name": "Sherpur" + }, + { + "code": "BD-59", + "name": "Sirajganj" + }, + { + "code": "BD-61", + "name": "Sunamganj" + }, + { + "code": "BD-60", + "name": "Sylhet" + }, + { + "code": "BD-63", + "name": "Tangail" + }, + { + "code": "BD-64", + "name": "Thakurgaon" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BB", + "name": "Barbados", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BY", + "name": "Belarus", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PW", + "name": "Belau", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BE", + "name": "Belgium", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BZ", + "name": "Belize", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BJ", + "name": "Benin", + "states": [{ + "code": "AL", + "name": "Alibori" + }, + { + "code": "AK", + "name": "Atakora" + }, + { + "code": "AQ", + "name": "Atlantique" + }, + { + "code": "BO", + "name": "Borgou" + }, + { + "code": "CO", + "name": "Collines" + }, + { + "code": "KO", + "name": "Kouffo" + }, + { + "code": "DO", + "name": "Donga" + }, + { + "code": "LI", + "name": "Littoral" + }, + { + "code": "MO", + "name": "Mono" + }, + { + "code": "OU", + "name": "Ouémé" + }, + { + "code": "PL", + "name": "Plateau" + }, + { + "code": "ZO", + "name": "Zou" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BM", + "name": "Bermuda", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BT", + "name": "Bhutan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BO", + "name": "Bolivia", + "states": [{ + "code": "BO-B", + "name": "Beni" + }, + { + "code": "BO-H", + "name": "Chuquisaca" + }, + { + "code": "BO-C", + "name": "Cochabamba" + }, + { + "code": "BO-L", + "name": "La Paz" + }, + { + "code": "BO-O", + "name": "Oruro" + }, + { + "code": "BO-N", + "name": "Pando" + }, + { + "code": "BO-P", + "name": "Potosí" + }, + { + "code": "BO-S", + "name": "Santa Cruz" + }, + { + "code": "BO-T", + "name": "Tarija" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BQ", + "name": "Bonaire, Saint Eustatius and Saba", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BA", + "name": "Bosnia and Herzegovina", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BW", + "name": "Botswana", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BV", + "name": "Bouvet Island", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BR", + "name": "Brazil", + "states": [{ + "code": "AC", + "name": "Acre" + }, + { + "code": "AL", + "name": "Alagoas" + }, + { + "code": "AP", + "name": "Amapá" + }, + { + "code": "AM", + "name": "Amazonas" + }, + { + "code": "BA", + "name": "Bahia" + }, + { + "code": "CE", + "name": "Ceará" + }, + { + "code": "DF", + "name": "Distrito Federal" + }, + { + "code": "ES", + "name": "Espírito Santo" + }, + { + "code": "GO", + "name": "Goiás" + }, + { + "code": "MA", + "name": "Maranhão" + }, + { + "code": "MT", + "name": "Mato Grosso" + }, + { + "code": "MS", + "name": "Mato Grosso do Sul" + }, + { + "code": "MG", + "name": "Minas Gerais" + }, + { + "code": "PA", + "name": "Pará" + }, + { + "code": "PB", + "name": "Paraíba" + }, + { + "code": "PR", + "name": "Paraná" + }, + { + "code": "PE", + "name": "Pernambuco" + }, + { + "code": "PI", + "name": "Piauí" + }, + { + "code": "RJ", + "name": "Rio de Janeiro" + }, + { + "code": "RN", + "name": "Rio Grande do Norte" + }, + { + "code": "RS", + "name": "Rio Grande do Sul" + }, + { + "code": "RO", + "name": "Rondônia" + }, + { + "code": "RR", + "name": "Roraima" + }, + { + "code": "SC", + "name": "Santa Catarina" + }, + { + "code": "SP", + "name": "São Paulo" + }, + { + "code": "SE", + "name": "Sergipe" + }, + { + "code": "TO", + "name": "Tocantins" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IO", + "name": "British Indian Ocean Territory", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BN", + "name": "Brunei", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BG", + "name": "Bulgaria", + "states": [{ + "code": "BG-01", + "name": "Blagoevgrad" + }, + { + "code": "BG-02", + "name": "Burgas" + }, + { + "code": "BG-08", + "name": "Dobrich" + }, + { + "code": "BG-07", + "name": "Gabrovo" + }, + { + "code": "BG-26", + "name": "Haskovo" + }, + { + "code": "BG-09", + "name": "Kardzhali" + }, + { + "code": "BG-10", + "name": "Kyustendil" + }, + { + "code": "BG-11", + "name": "Lovech" + }, + { + "code": "BG-12", + "name": "Montana" + }, + { + "code": "BG-13", + "name": "Pazardzhik" + }, + { + "code": "BG-14", + "name": "Pernik" + }, + { + "code": "BG-15", + "name": "Pleven" + }, + { + "code": "BG-16", + "name": "Plovdiv" + }, + { + "code": "BG-17", + "name": "Razgrad" + }, + { + "code": "BG-18", + "name": "Ruse" + }, + { + "code": "BG-27", + "name": "Shumen" + }, + { + "code": "BG-19", + "name": "Silistra" + }, + { + "code": "BG-20", + "name": "Sliven" + }, + { + "code": "BG-21", + "name": "Smolyan" + }, + { + "code": "BG-23", + "name": "Sofia District" + }, + { + "code": "BG-22", + "name": "Sofia" + }, + { + "code": "BG-24", + "name": "Stara Zagora" + }, + { + "code": "BG-25", + "name": "Targovishte" + }, + { + "code": "BG-03", + "name": "Varna" + }, + { + "code": "BG-04", + "name": "Veliko Tarnovo" + }, + { + "code": "BG-05", + "name": "Vidin" + }, + { + "code": "BG-06", + "name": "Vratsa" + }, + { + "code": "BG-28", + "name": "Yambol" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BF", + "name": "Burkina Faso", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BI", + "name": "Burundi", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KH", + "name": "Cambodia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CM", + "name": "Cameroon", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CA", + "name": "Canada", + "states": [{ + "code": "AB", + "name": "Alberta" + }, + { + "code": "BC", + "name": "British Columbia" + }, + { + "code": "MB", + "name": "Manitoba" + }, + { + "code": "NB", + "name": "New Brunswick" + }, + { + "code": "NL", + "name": "Newfoundland and Labrador" + }, + { + "code": "NT", + "name": "Northwest Territories" + }, + { + "code": "NS", + "name": "Nova Scotia" + }, + { + "code": "NU", + "name": "Nunavut" + }, + { + "code": "ON", + "name": "Ontario" + }, + { + "code": "PE", + "name": "Prince Edward Island" + }, + { + "code": "QC", + "name": "Quebec" + }, + { + "code": "SK", + "name": "Saskatchewan" + }, + { + "code": "YT", + "name": "Yukon Territory" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CV", + "name": "Cape Verde", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KY", + "name": "Cayman Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CF", + "name": "Central African Republic", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TD", + "name": "Chad", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CL", + "name": "Chile", + "states": [{ + "code": "CL-AI", + "name": "Aisén del General Carlos Ibañez del Campo" + }, + { + "code": "CL-AN", + "name": "Antofagasta" + }, + { + "code": "CL-AP", + "name": "Arica y Parinacota" + }, + { + "code": "CL-AR", + "name": "La Araucanía" + }, + { + "code": "CL-AT", + "name": "Atacama" + }, + { + "code": "CL-BI", + "name": "Biobío" + }, + { + "code": "CL-CO", + "name": "Coquimbo" + }, + { + "code": "CL-LI", + "name": "Libertador General Bernardo O'Higgins" + }, + { + "code": "CL-LL", + "name": "Los Lagos" + }, + { + "code": "CL-LR", + "name": "Los Ríos" + }, + { + "code": "CL-MA", + "name": "Magallanes" + }, + { + "code": "CL-ML", + "name": "Maule" + }, + { + "code": "CL-NB", + "name": "Ñuble" + }, + { + "code": "CL-RM", + "name": "Región Metropolitana de Santiago" + }, + { + "code": "CL-TA", + "name": "Tarapacá" + }, + { + "code": "CL-VS", + "name": "Valparaíso" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CN", + "name": "China", + "states": [{ + "code": "CN1", + "name": "Yunnan / 云南" + }, + { + "code": "CN2", + "name": "Beijing / 北京" + }, + { + "code": "CN3", + "name": "Tianjin / 天津" + }, + { + "code": "CN4", + "name": "Hebei / 河北" + }, + { + "code": "CN5", + "name": "Shanxi / 山西" + }, + { + "code": "CN6", + "name": "Inner Mongolia / 內蒙古" + }, + { + "code": "CN7", + "name": "Liaoning / 辽宁" + }, + { + "code": "CN8", + "name": "Jilin / 吉林" + }, + { + "code": "CN9", + "name": "Heilongjiang / 黑龙江" + }, + { + "code": "CN10", + "name": "Shanghai / 上海" + }, + { + "code": "CN11", + "name": "Jiangsu / 江苏" + }, + { + "code": "CN12", + "name": "Zhejiang / 浙江" + }, + { + "code": "CN13", + "name": "Anhui / 安徽" + }, + { + "code": "CN14", + "name": "Fujian / 福建" + }, + { + "code": "CN15", + "name": "Jiangxi / 江西" + }, + { + "code": "CN16", + "name": "Shandong / 山东" + }, + { + "code": "CN17", + "name": "Henan / 河南" + }, + { + "code": "CN18", + "name": "Hubei / 湖北" + }, + { + "code": "CN19", + "name": "Hunan / 湖南" + }, + { + "code": "CN20", + "name": "Guangdong / 广东" + }, + { + "code": "CN21", + "name": "Guangxi Zhuang / 广西壮族" + }, + { + "code": "CN22", + "name": "Hainan / 海南" + }, + { + "code": "CN23", + "name": "Chongqing / 重庆" + }, + { + "code": "CN24", + "name": "Sichuan / 四川" + }, + { + "code": "CN25", + "name": "Guizhou / 贵州" + }, + { + "code": "CN26", + "name": "Shaanxi / 陕西" + }, + { + "code": "CN27", + "name": "Gansu / 甘肃" + }, + { + "code": "CN28", + "name": "Qinghai / 青海" + }, + { + "code": "CN29", + "name": "Ningxia Hui / 宁夏" + }, + { + "code": "CN30", + "name": "Macao / 澳门" + }, + { + "code": "CN31", + "name": "Tibet / 西藏" + }, + { + "code": "CN32", + "name": "Xinjiang / 新疆" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CX", + "name": "Christmas Island", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CC", + "name": "Cocos (Keeling) Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CO", + "name": "Colombia", + "states": [{ + "code": "CO-AMA", + "name": "Amazonas" + }, + { + "code": "CO-ANT", + "name": "Antioquia" + }, + { + "code": "CO-ARA", + "name": "Arauca" + }, + { + "code": "CO-ATL", + "name": "Atlántico" + }, + { + "code": "CO-BOL", + "name": "Bolívar" + }, + { + "code": "CO-BOY", + "name": "Boyacá" + }, + { + "code": "CO-CAL", + "name": "Caldas" + }, + { + "code": "CO-CAQ", + "name": "Caquetá" + }, + { + "code": "CO-CAS", + "name": "Casanare" + }, + { + "code": "CO-CAU", + "name": "Cauca" + }, + { + "code": "CO-CES", + "name": "Cesar" + }, + { + "code": "CO-CHO", + "name": "Chocó" + }, + { + "code": "CO-COR", + "name": "Córdoba" + }, + { + "code": "CO-CUN", + "name": "Cundinamarca" + }, + { + "code": "CO-DC", + "name": "Capital District" + }, + { + "code": "CO-GUA", + "name": "Guainía" + }, + { + "code": "CO-GUV", + "name": "Guaviare" + }, + { + "code": "CO-HUI", + "name": "Huila" + }, + { + "code": "CO-LAG", + "name": "La Guajira" + }, + { + "code": "CO-MAG", + "name": "Magdalena" + }, + { + "code": "CO-MET", + "name": "Meta" + }, + { + "code": "CO-NAR", + "name": "Nariño" + }, + { + "code": "CO-NSA", + "name": "Norte de Santander" + }, + { + "code": "CO-PUT", + "name": "Putumayo" + }, + { + "code": "CO-QUI", + "name": "Quindío" + }, + { + "code": "CO-RIS", + "name": "Risaralda" + }, + { + "code": "CO-SAN", + "name": "Santander" + }, + { + "code": "CO-SAP", + "name": "San Andrés & Providencia" + }, + { + "code": "CO-SUC", + "name": "Sucre" + }, + { + "code": "CO-TOL", + "name": "Tolima" + }, + { + "code": "CO-VAC", + "name": "Valle del Cauca" + }, + { + "code": "CO-VAU", + "name": "Vaupés" + }, + { + "code": "CO-VID", + "name": "Vichada" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KM", + "name": "Comoros", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CG", + "name": "Congo (Brazzaville)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CD", + "name": "Congo (Kinshasa)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CK", + "name": "Cook Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CR", + "name": "Costa Rica", + "states": [{ + "code": "CR-A", + "name": "Alajuela" + }, + { + "code": "CR-C", + "name": "Cartago" + }, + { + "code": "CR-G", + "name": "Guanacaste" + }, + { + "code": "CR-H", + "name": "Heredia" + }, + { + "code": "CR-L", + "name": "Limón" + }, + { + "code": "CR-P", + "name": "Puntarenas" + }, + { + "code": "CR-SJ", + "name": "San José" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HR", + "name": "Croatia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CU", + "name": "Cuba", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CW", + "name": "Curaçao", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CY", + "name": "Cyprus", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CZ", + "name": "Czech Republic", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DK", + "name": "Denmark", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DJ", + "name": "Djibouti", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DM", + "name": "Dominica", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DO", + "name": "Dominican Republic", + "states": [{ + "code": "DO-01", + "name": "Distrito Nacional" + }, + { + "code": "DO-02", + "name": "Azua" + }, + { + "code": "DO-03", + "name": "Baoruco" + }, + { + "code": "DO-04", + "name": "Barahona" + }, + { + "code": "DO-33", + "name": "Cibao Nordeste" + }, + { + "code": "DO-34", + "name": "Cibao Noroeste" + }, + { + "code": "DO-35", + "name": "Cibao Norte" + }, + { + "code": "DO-36", + "name": "Cibao Sur" + }, + { + "code": "DO-05", + "name": "Dajabón" + }, + { + "code": "DO-06", + "name": "Duarte" + }, + { + "code": "DO-08", + "name": "El Seibo" + }, + { + "code": "DO-37", + "name": "El Valle" + }, + { + "code": "DO-07", + "name": "Elías Piña" + }, + { + "code": "DO-38", + "name": "Enriquillo" + }, + { + "code": "DO-09", + "name": "Espaillat" + }, + { + "code": "DO-30", + "name": "Hato Mayor" + }, + { + "code": "DO-19", + "name": "Hermanas Mirabal" + }, + { + "code": "DO-39", + "name": "Higüamo" + }, + { + "code": "DO-10", + "name": "Independencia" + }, + { + "code": "DO-11", + "name": "La Altagracia" + }, + { + "code": "DO-12", + "name": "La Romana" + }, + { + "code": "DO-13", + "name": "La Vega" + }, + { + "code": "DO-14", + "name": "María Trinidad Sánchez" + }, + { + "code": "DO-28", + "name": "Monseñor Nouel" + }, + { + "code": "DO-15", + "name": "Monte Cristi" + }, + { + "code": "DO-29", + "name": "Monte Plata" + }, + { + "code": "DO-40", + "name": "Ozama" + }, + { + "code": "DO-16", + "name": "Pedernales" + }, + { + "code": "DO-17", + "name": "Peravia" + }, + { + "code": "DO-18", + "name": "Puerto Plata" + }, + { + "code": "DO-20", + "name": "Samaná" + }, + { + "code": "DO-21", + "name": "San Cristóbal" + }, + { + "code": "DO-31", + "name": "San José de Ocoa" + }, + { + "code": "DO-22", + "name": "San Juan" + }, + { + "code": "DO-23", + "name": "San Pedro de Macorís" + }, + { + "code": "DO-24", + "name": "Sánchez Ramírez" + }, + { + "code": "DO-25", + "name": "Santiago" + }, + { + "code": "DO-26", + "name": "Santiago Rodríguez" + }, + { + "code": "DO-32", + "name": "Santo Domingo" + }, + { + "code": "DO-41", + "name": "Valdesia" + }, + { + "code": "DO-27", + "name": "Valverde" + }, + { + "code": "DO-42", + "name": "Yuma" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "EC", + "name": "Ecuador", + "states": [{ + "code": "EC-A", + "name": "Azuay" + }, + { + "code": "EC-B", + "name": "Bolívar" + }, + { + "code": "EC-F", + "name": "Cañar" + }, + { + "code": "EC-C", + "name": "Carchi" + }, + { + "code": "EC-H", + "name": "Chimborazo" + }, + { + "code": "EC-X", + "name": "Cotopaxi" + }, + { + "code": "EC-O", + "name": "El Oro" + }, + { + "code": "EC-E", + "name": "Esmeraldas" + }, + { + "code": "EC-W", + "name": "Galápagos" + }, + { + "code": "EC-G", + "name": "Guayas" + }, + { + "code": "EC-I", + "name": "Imbabura" + }, + { + "code": "EC-L", + "name": "Loja" + }, + { + "code": "EC-R", + "name": "Los Ríos" + }, + { + "code": "EC-M", + "name": "Manabí" + }, + { + "code": "EC-S", + "name": "Morona-Santiago" + }, + { + "code": "EC-N", + "name": "Napo" + }, + { + "code": "EC-D", + "name": "Orellana" + }, + { + "code": "EC-Y", + "name": "Pastaza" + }, + { + "code": "EC-P", + "name": "Pichincha" + }, + { + "code": "EC-SE", + "name": "Santa Elena" + }, + { + "code": "EC-SD", + "name": "Santo Domingo de los Tsáchilas" + }, + { + "code": "EC-U", + "name": "Sucumbíos" + }, + { + "code": "EC-T", + "name": "Tungurahua" + }, + { + "code": "EC-Z", + "name": "Zamora-Chinchipe" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "EG", + "name": "Egypt", + "states": [{ + "code": "EGALX", + "name": "Alexandria" + }, + { + "code": "EGASN", + "name": "Aswan" + }, + { + "code": "EGAST", + "name": "Asyut" + }, + { + "code": "EGBA", + "name": "Red Sea" + }, + { + "code": "EGBH", + "name": "Beheira" + }, + { + "code": "EGBNS", + "name": "Beni Suef" + }, + { + "code": "EGC", + "name": "Cairo" + }, + { + "code": "EGDK", + "name": "Dakahlia" + }, + { + "code": "EGDT", + "name": "Damietta" + }, + { + "code": "EGFYM", + "name": "Faiyum" + }, + { + "code": "EGGH", + "name": "Gharbia" + }, + { + "code": "EGGZ", + "name": "Giza" + }, + { + "code": "EGIS", + "name": "Ismailia" + }, + { + "code": "EGJS", + "name": "South Sinai" + }, + { + "code": "EGKB", + "name": "Qalyubia" + }, + { + "code": "EGKFS", + "name": "Kafr el-Sheikh" + }, + { + "code": "EGKN", + "name": "Qena" + }, + { + "code": "EGLX", + "name": "Luxor" + }, + { + "code": "EGMN", + "name": "Minya" + }, + { + "code": "EGMNF", + "name": "Monufia" + }, + { + "code": "EGMT", + "name": "Matrouh" + }, + { + "code": "EGPTS", + "name": "Port Said" + }, + { + "code": "EGSHG", + "name": "Sohag" + }, + { + "code": "EGSHR", + "name": "Al Sharqia" + }, + { + "code": "EGSIN", + "name": "North Sinai" + }, + { + "code": "EGSUZ", + "name": "Suez" + }, + { + "code": "EGWAD", + "name": "New Valley" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SV", + "name": "El Salvador", + "states": [{ + "code": "SV-AH", + "name": "Ahuachapán" + }, + { + "code": "SV-CA", + "name": "Cabañas" + }, + { + "code": "SV-CH", + "name": "Chalatenango" + }, + { + "code": "SV-CU", + "name": "Cuscatlán" + }, + { + "code": "SV-LI", + "name": "La Libertad" + }, + { + "code": "SV-MO", + "name": "Morazán" + }, + { + "code": "SV-PA", + "name": "La Paz" + }, + { + "code": "SV-SA", + "name": "Santa Ana" + }, + { + "code": "SV-SM", + "name": "San Miguel" + }, + { + "code": "SV-SO", + "name": "Sonsonate" + }, + { + "code": "SV-SS", + "name": "San Salvador" + }, + { + "code": "SV-SV", + "name": "San Vicente" + }, + { + "code": "SV-UN", + "name": "La Unión" + }, + { + "code": "SV-US", + "name": "Usulután" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GQ", + "name": "Equatorial Guinea", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ER", + "name": "Eritrea", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "EE", + "name": "Estonia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SZ", + "name": "Eswatini", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ET", + "name": "Ethiopia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FK", + "name": "Falkland Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FO", + "name": "Faroe Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FJ", + "name": "Fiji", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FI", + "name": "Finland", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FR", + "name": "France", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GF", + "name": "French Guiana", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PF", + "name": "French Polynesia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TF", + "name": "French Southern Territories", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GA", + "name": "Gabon", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GM", + "name": "Gambia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GE", + "name": "Georgia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DE", + "name": "Germany", + "states": [{ + "code": "DE-BW", + "name": "Baden-Württemberg" + }, + { + "code": "DE-BY", + "name": "Bavaria" + }, + { + "code": "DE-BE", + "name": "Berlin" + }, + { + "code": "DE-BB", + "name": "Brandenburg" + }, + { + "code": "DE-HB", + "name": "Bremen" + }, + { + "code": "DE-HH", + "name": "Hamburg" + }, + { + "code": "DE-HE", + "name": "Hesse" + }, + { + "code": "DE-MV", + "name": "Mecklenburg-Vorpommern" + }, + { + "code": "DE-NI", + "name": "Lower Saxony" + }, + { + "code": "DE-NW", + "name": "North Rhine-Westphalia" + }, + { + "code": "DE-RP", + "name": "Rhineland-Palatinate" + }, + { + "code": "DE-SL", + "name": "Saarland" + }, + { + "code": "DE-SN", + "name": "Saxony" + }, + { + "code": "DE-ST", + "name": "Saxony-Anhalt" + }, + { + "code": "DE-SH", + "name": "Schleswig-Holstein" + }, + { + "code": "DE-TH", + "name": "Thuringia" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GH", + "name": "Ghana", + "states": [{ + "code": "AF", + "name": "Ahafo" + }, + { + "code": "AH", + "name": "Ashanti" + }, + { + "code": "BA", + "name": "Brong-Ahafo" + }, + { + "code": "BO", + "name": "Bono" + }, + { + "code": "BE", + "name": "Bono East" + }, + { + "code": "CP", + "name": "Central" + }, + { + "code": "EP", + "name": "Eastern" + }, + { + "code": "AA", + "name": "Greater Accra" + }, + { + "code": "NE", + "name": "North East" + }, + { + "code": "NP", + "name": "Northern" + }, + { + "code": "OT", + "name": "Oti" + }, + { + "code": "SV", + "name": "Savannah" + }, + { + "code": "UE", + "name": "Upper East" + }, + { + "code": "UW", + "name": "Upper West" + }, + { + "code": "TV", + "name": "Volta" + }, + { + "code": "WP", + "name": "Western" + }, + { + "code": "WN", + "name": "Western North" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GI", + "name": "Gibraltar", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GR", + "name": "Greece", + "states": [{ + "code": "I", + "name": "Attica" + }, + { + "code": "A", + "name": "East Macedonia and Thrace" + }, + { + "code": "B", + "name": "Central Macedonia" + }, + { + "code": "C", + "name": "West Macedonia" + }, + { + "code": "D", + "name": "Epirus" + }, + { + "code": "E", + "name": "Thessaly" + }, + { + "code": "F", + "name": "Ionian Islands" + }, + { + "code": "G", + "name": "West Greece" + }, + { + "code": "H", + "name": "Central Greece" + }, + { + "code": "J", + "name": "Peloponnese" + }, + { + "code": "K", + "name": "North Aegean" + }, + { + "code": "L", + "name": "South Aegean" + }, + { + "code": "M", + "name": "Crete" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GL", + "name": "Greenland", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GD", + "name": "Grenada", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GP", + "name": "Guadeloupe", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GU", + "name": "Guam", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GT", + "name": "Guatemala", + "states": [{ + "code": "GT-AV", + "name": "Alta Verapaz" + }, + { + "code": "GT-BV", + "name": "Baja Verapaz" + }, + { + "code": "GT-CM", + "name": "Chimaltenango" + }, + { + "code": "GT-CQ", + "name": "Chiquimula" + }, + { + "code": "GT-PR", + "name": "El Progreso" + }, + { + "code": "GT-ES", + "name": "Escuintla" + }, + { + "code": "GT-GU", + "name": "Guatemala" + }, + { + "code": "GT-HU", + "name": "Huehuetenango" + }, + { + "code": "GT-IZ", + "name": "Izabal" + }, + { + "code": "GT-JA", + "name": "Jalapa" + }, + { + "code": "GT-JU", + "name": "Jutiapa" + }, + { + "code": "GT-PE", + "name": "Petén" + }, + { + "code": "GT-QZ", + "name": "Quetzaltenango" + }, + { + "code": "GT-QC", + "name": "Quiché" + }, + { + "code": "GT-RE", + "name": "Retalhuleu" + }, + { + "code": "GT-SA", + "name": "Sacatepéquez" + }, + { + "code": "GT-SM", + "name": "San Marcos" + }, + { + "code": "GT-SR", + "name": "Santa Rosa" + }, + { + "code": "GT-SO", + "name": "Sololá" + }, + { + "code": "GT-SU", + "name": "Suchitepéquez" + }, + { + "code": "GT-TO", + "name": "Totonicapán" + }, + { + "code": "GT-ZA", + "name": "Zacapa" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GG", + "name": "Guernsey", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GN", + "name": "Guinea", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GW", + "name": "Guinea-Bissau", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GY", + "name": "Guyana", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HT", + "name": "Haiti", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HM", + "name": "Heard Island and McDonald Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HN", + "name": "Honduras", + "states": [{ + "code": "HN-AT", + "name": "Atlántida" + }, + { + "code": "HN-IB", + "name": "Bay Islands" + }, + { + "code": "HN-CH", + "name": "Choluteca" + }, + { + "code": "HN-CL", + "name": "Colón" + }, + { + "code": "HN-CM", + "name": "Comayagua" + }, + { + "code": "HN-CP", + "name": "Copán" + }, + { + "code": "HN-CR", + "name": "Cortés" + }, + { + "code": "HN-EP", + "name": "El Paraíso" + }, + { + "code": "HN-FM", + "name": "Francisco Morazán" + }, + { + "code": "HN-GD", + "name": "Gracias a Dios" + }, + { + "code": "HN-IN", + "name": "Intibucá" + }, + { + "code": "HN-LE", + "name": "Lempira" + }, + { + "code": "HN-LP", + "name": "La Paz" + }, + { + "code": "HN-OC", + "name": "Ocotepeque" + }, + { + "code": "HN-OL", + "name": "Olancho" + }, + { + "code": "HN-SB", + "name": "Santa Bárbara" + }, + { + "code": "HN-VA", + "name": "Valle" + }, + { + "code": "HN-YO", + "name": "Yoro" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HK", + "name": "Hong Kong", + "states": [{ + "code": "HONG KONG", + "name": "Hong Kong Island" + }, + { + "code": "KOWLOON", + "name": "Kowloon" + }, + { + "code": "NEW TERRITORIES", + "name": "New Territories" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HU", + "name": "Hungary", + "states": [{ + "code": "BK", + "name": "Bács-Kiskun" + }, + { + "code": "BE", + "name": "Békés" + }, + { + "code": "BA", + "name": "Baranya" + }, + { + "code": "BZ", + "name": "Borsod-Abaúj-Zemplén" + }, + { + "code": "BU", + "name": "Budapest" + }, + { + "code": "CS", + "name": "Csongrád-Csanád" + }, + { + "code": "FE", + "name": "Fejér" + }, + { + "code": "GS", + "name": "Győr-Moson-Sopron" + }, + { + "code": "HB", + "name": "Hajdú-Bihar" + }, + { + "code": "HE", + "name": "Heves" + }, + { + "code": "JN", + "name": "Jász-Nagykun-Szolnok" + }, + { + "code": "KE", + "name": "Komárom-Esztergom" + }, + { + "code": "NO", + "name": "Nógrád" + }, + { + "code": "PE", + "name": "Pest" + }, + { + "code": "SO", + "name": "Somogy" + }, + { + "code": "SZ", + "name": "Szabolcs-Szatmár-Bereg" + }, + { + "code": "TO", + "name": "Tolna" + }, + { + "code": "VA", + "name": "Vas" + }, + { + "code": "VE", + "name": "Veszprém" + }, + { + "code": "ZA", + "name": "Zala" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IS", + "name": "Iceland", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IN", + "name": "India", + "states": [{ + "code": "AP", + "name": "Andhra Pradesh" + }, + { + "code": "AR", + "name": "Arunachal Pradesh" + }, + { + "code": "AS", + "name": "Assam" + }, + { + "code": "BR", + "name": "Bihar" + }, + { + "code": "CT", + "name": "Chhattisgarh" + }, + { + "code": "GA", + "name": "Goa" + }, + { + "code": "GJ", + "name": "Gujarat" + }, + { + "code": "HR", + "name": "Haryana" + }, + { + "code": "HP", + "name": "Himachal Pradesh" + }, + { + "code": "JK", + "name": "Jammu and Kashmir" + }, + { + "code": "JH", + "name": "Jharkhand" + }, + { + "code": "KA", + "name": "Karnataka" + }, + { + "code": "KL", + "name": "Kerala" + }, + { + "code": "LA", + "name": "Ladakh" + }, + { + "code": "MP", + "name": "Madhya Pradesh" + }, + { + "code": "MH", + "name": "Maharashtra" + }, + { + "code": "MN", + "name": "Manipur" + }, + { + "code": "ML", + "name": "Meghalaya" + }, + { + "code": "MZ", + "name": "Mizoram" + }, + { + "code": "NL", + "name": "Nagaland" + }, + { + "code": "OR", + "name": "Odisha" + }, + { + "code": "PB", + "name": "Punjab" + }, + { + "code": "RJ", + "name": "Rajasthan" + }, + { + "code": "SK", + "name": "Sikkim" + }, + { + "code": "TN", + "name": "Tamil Nadu" + }, + { + "code": "TS", + "name": "Telangana" + }, + { + "code": "TR", + "name": "Tripura" + }, + { + "code": "UK", + "name": "Uttarakhand" + }, + { + "code": "UP", + "name": "Uttar Pradesh" + }, + { + "code": "WB", + "name": "West Bengal" + }, + { + "code": "AN", + "name": "Andaman and Nicobar Islands" + }, + { + "code": "CH", + "name": "Chandigarh" + }, + { + "code": "DN", + "name": "Dadra and Nagar Haveli" + }, + { + "code": "DD", + "name": "Daman and Diu" + }, + { + "code": "DL", + "name": "Delhi" + }, + { + "code": "LD", + "name": "Lakshadeep" + }, + { + "code": "PY", + "name": "Pondicherry (Puducherry)" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ID", + "name": "Indonesia", + "states": [{ + "code": "AC", + "name": "Daerah Istimewa Aceh" + }, + { + "code": "SU", + "name": "Sumatera Utara" + }, + { + "code": "SB", + "name": "Sumatera Barat" + }, + { + "code": "RI", + "name": "Riau" + }, + { + "code": "KR", + "name": "Kepulauan Riau" + }, + { + "code": "JA", + "name": "Jambi" + }, + { + "code": "SS", + "name": "Sumatera Selatan" + }, + { + "code": "BB", + "name": "Bangka Belitung" + }, + { + "code": "BE", + "name": "Bengkulu" + }, + { + "code": "LA", + "name": "Lampung" + }, + { + "code": "JK", + "name": "DKI Jakarta" + }, + { + "code": "JB", + "name": "Jawa Barat" + }, + { + "code": "BT", + "name": "Banten" + }, + { + "code": "JT", + "name": "Jawa Tengah" + }, + { + "code": "JI", + "name": "Jawa Timur" + }, + { + "code": "YO", + "name": "Daerah Istimewa Yogyakarta" + }, + { + "code": "BA", + "name": "Bali" + }, + { + "code": "NB", + "name": "Nusa Tenggara Barat" + }, + { + "code": "NT", + "name": "Nusa Tenggara Timur" + }, + { + "code": "KB", + "name": "Kalimantan Barat" + }, + { + "code": "KT", + "name": "Kalimantan Tengah" + }, + { + "code": "KI", + "name": "Kalimantan Timur" + }, + { + "code": "KS", + "name": "Kalimantan Selatan" + }, + { + "code": "KU", + "name": "Kalimantan Utara" + }, + { + "code": "SA", + "name": "Sulawesi Utara" + }, + { + "code": "ST", + "name": "Sulawesi Tengah" + }, + { + "code": "SG", + "name": "Sulawesi Tenggara" + }, + { + "code": "SR", + "name": "Sulawesi Barat" + }, + { + "code": "SN", + "name": "Sulawesi Selatan" + }, + { + "code": "GO", + "name": "Gorontalo" + }, + { + "code": "MA", + "name": "Maluku" + }, + { + "code": "MU", + "name": "Maluku Utara" + }, + { + "code": "PA", + "name": "Papua" + }, + { + "code": "PB", + "name": "Papua Barat" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IR", + "name": "Iran", + "states": [{ + "code": "KHZ", + "name": "Khuzestan (خوزستان)" + }, + { + "code": "THR", + "name": "Tehran (تهران)" + }, + { + "code": "ILM", + "name": "Ilaam (ایلام)" + }, + { + "code": "BHR", + "name": "Bushehr (بوشهر)" + }, + { + "code": "ADL", + "name": "Ardabil (اردبیل)" + }, + { + "code": "ESF", + "name": "Isfahan (اصفهان)" + }, + { + "code": "YZD", + "name": "Yazd (یزد)" + }, + { + "code": "KRH", + "name": "Kermanshah (کرمانشاه)" + }, + { + "code": "KRN", + "name": "Kerman (کرمان)" + }, + { + "code": "HDN", + "name": "Hamadan (همدان)" + }, + { + "code": "GZN", + "name": "Ghazvin (قزوین)" + }, + { + "code": "ZJN", + "name": "Zanjan (زنجان)" + }, + { + "code": "LRS", + "name": "Luristan (لرستان)" + }, + { + "code": "ABZ", + "name": "Alborz (البرز)" + }, + { + "code": "EAZ", + "name": "East Azarbaijan (آذربایجان شرقی)" + }, + { + "code": "WAZ", + "name": "West Azarbaijan (آذربایجان غربی)" + }, + { + "code": "CHB", + "name": "Chaharmahal and Bakhtiari (چهارمحال و بختیاری)" + }, + { + "code": "SKH", + "name": "South Khorasan (خراسان جنوبی)" + }, + { + "code": "RKH", + "name": "Razavi Khorasan (خراسان رضوی)" + }, + { + "code": "NKH", + "name": "North Khorasan (خراسان شمالی)" + }, + { + "code": "SMN", + "name": "Semnan (سمنان)" + }, + { + "code": "FRS", + "name": "Fars (فارس)" + }, + { + "code": "QHM", + "name": "Qom (قم)" + }, + { + "code": "KRD", + "name": "Kurdistan / کردستان)" + }, + { + "code": "KBD", + "name": "Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)" + }, + { + "code": "GLS", + "name": "Golestan (گلستان)" + }, + { + "code": "GIL", + "name": "Gilan (گیلان)" + }, + { + "code": "MZN", + "name": "Mazandaran (مازندران)" + }, + { + "code": "MKZ", + "name": "Markazi (مرکزی)" + }, + { + "code": "HRZ", + "name": "Hormozgan (هرمزگان)" + }, + { + "code": "SBN", + "name": "Sistan and Baluchestan (سیستان و بلوچستان)" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IQ", + "name": "Iraq", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IE", + "name": "Ireland", + "states": [{ + "code": "CW", + "name": "Carlow" + }, + { + "code": "CN", + "name": "Cavan" + }, + { + "code": "CE", + "name": "Clare" + }, + { + "code": "CO", + "name": "Cork" + }, + { + "code": "DL", + "name": "Donegal" + }, + { + "code": "D", + "name": "Dublin" + }, + { + "code": "G", + "name": "Galway" + }, + { + "code": "KY", + "name": "Kerry" + }, + { + "code": "KE", + "name": "Kildare" + }, + { + "code": "KK", + "name": "Kilkenny" + }, + { + "code": "LS", + "name": "Laois" + }, + { + "code": "LM", + "name": "Leitrim" + }, + { + "code": "LK", + "name": "Limerick" + }, + { + "code": "LD", + "name": "Longford" + }, + { + "code": "LH", + "name": "Louth" + }, + { + "code": "MO", + "name": "Mayo" + }, + { + "code": "MH", + "name": "Meath" + }, + { + "code": "MN", + "name": "Monaghan" + }, + { + "code": "OY", + "name": "Offaly" + }, + { + "code": "RN", + "name": "Roscommon" + }, + { + "code": "SO", + "name": "Sligo" + }, + { + "code": "TA", + "name": "Tipperary" + }, + { + "code": "WD", + "name": "Waterford" + }, + { + "code": "WH", + "name": "Westmeath" + }, + { + "code": "WX", + "name": "Wexford" + }, + { + "code": "WW", + "name": "Wicklow" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IM", + "name": "Isle of Man", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IL", + "name": "Israel", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IT", + "name": "Italy", + "states": [{ + "code": "AG", + "name": "Agrigento" + }, + { + "code": "AL", + "name": "Alessandria" + }, + { + "code": "AN", + "name": "Ancona" + }, + { + "code": "AO", + "name": "Aosta" + }, + { + "code": "AR", + "name": "Arezzo" + }, + { + "code": "AP", + "name": "Ascoli Piceno" + }, + { + "code": "AT", + "name": "Asti" + }, + { + "code": "AV", + "name": "Avellino" + }, + { + "code": "BA", + "name": "Bari" + }, + { + "code": "BT", + "name": "Barletta-Andria-Trani" + }, + { + "code": "BL", + "name": "Belluno" + }, + { + "code": "BN", + "name": "Benevento" + }, + { + "code": "BG", + "name": "Bergamo" + }, + { + "code": "BI", + "name": "Biella" + }, + { + "code": "BO", + "name": "Bologna" + }, + { + "code": "BZ", + "name": "Bolzano" + }, + { + "code": "BS", + "name": "Brescia" + }, + { + "code": "BR", + "name": "Brindisi" + }, + { + "code": "CA", + "name": "Cagliari" + }, + { + "code": "CL", + "name": "Caltanissetta" + }, + { + "code": "CB", + "name": "Campobasso" + }, + { + "code": "CE", + "name": "Caserta" + }, + { + "code": "CT", + "name": "Catania" + }, + { + "code": "CZ", + "name": "Catanzaro" + }, + { + "code": "CH", + "name": "Chieti" + }, + { + "code": "CO", + "name": "Como" + }, + { + "code": "CS", + "name": "Cosenza" + }, + { + "code": "CR", + "name": "Cremona" + }, + { + "code": "KR", + "name": "Crotone" + }, + { + "code": "CN", + "name": "Cuneo" + }, + { + "code": "EN", + "name": "Enna" + }, + { + "code": "FM", + "name": "Fermo" + }, + { + "code": "FE", + "name": "Ferrara" + }, + { + "code": "FI", + "name": "Firenze" + }, + { + "code": "FG", + "name": "Foggia" + }, + { + "code": "FC", + "name": "Forlì-Cesena" + }, + { + "code": "FR", + "name": "Frosinone" + }, + { + "code": "GE", + "name": "Genova" + }, + { + "code": "GO", + "name": "Gorizia" + }, + { + "code": "GR", + "name": "Grosseto" + }, + { + "code": "IM", + "name": "Imperia" + }, + { + "code": "IS", + "name": "Isernia" + }, + { + "code": "SP", + "name": "La Spezia" + }, + { + "code": "AQ", + "name": "L'Aquila" + }, + { + "code": "LT", + "name": "Latina" + }, + { + "code": "LE", + "name": "Lecce" + }, + { + "code": "LC", + "name": "Lecco" + }, + { + "code": "LI", + "name": "Livorno" + }, + { + "code": "LO", + "name": "Lodi" + }, + { + "code": "LU", + "name": "Lucca" + }, + { + "code": "MC", + "name": "Macerata" + }, + { + "code": "MN", + "name": "Mantova" + }, + { + "code": "MS", + "name": "Massa-Carrara" + }, + { + "code": "MT", + "name": "Matera" + }, + { + "code": "ME", + "name": "Messina" + }, + { + "code": "MI", + "name": "Milano" + }, + { + "code": "MO", + "name": "Modena" + }, + { + "code": "MB", + "name": "Monza e della Brianza" + }, + { + "code": "NA", + "name": "Napoli" + }, + { + "code": "NO", + "name": "Novara" + }, + { + "code": "NU", + "name": "Nuoro" + }, + { + "code": "OR", + "name": "Oristano" + }, + { + "code": "PD", + "name": "Padova" + }, + { + "code": "PA", + "name": "Palermo" + }, + { + "code": "PR", + "name": "Parma" + }, + { + "code": "PV", + "name": "Pavia" + }, + { + "code": "PG", + "name": "Perugia" + }, + { + "code": "PU", + "name": "Pesaro e Urbino" + }, + { + "code": "PE", + "name": "Pescara" + }, + { + "code": "PC", + "name": "Piacenza" + }, + { + "code": "PI", + "name": "Pisa" + }, + { + "code": "PT", + "name": "Pistoia" + }, + { + "code": "PN", + "name": "Pordenone" + }, + { + "code": "PZ", + "name": "Potenza" + }, + { + "code": "PO", + "name": "Prato" + }, + { + "code": "RG", + "name": "Ragusa" + }, + { + "code": "RA", + "name": "Ravenna" + }, + { + "code": "RC", + "name": "Reggio Calabria" + }, + { + "code": "RE", + "name": "Reggio Emilia" + }, + { + "code": "RI", + "name": "Rieti" + }, + { + "code": "RN", + "name": "Rimini" + }, + { + "code": "RM", + "name": "Roma" + }, + { + "code": "RO", + "name": "Rovigo" + }, + { + "code": "SA", + "name": "Salerno" + }, + { + "code": "SS", + "name": "Sassari" + }, + { + "code": "SV", + "name": "Savona" + }, + { + "code": "SI", + "name": "Siena" + }, + { + "code": "SR", + "name": "Siracusa" + }, + { + "code": "SO", + "name": "Sondrio" + }, + { + "code": "SU", + "name": "Sud Sardegna" + }, + { + "code": "TA", + "name": "Taranto" + }, + { + "code": "TE", + "name": "Teramo" + }, + { + "code": "TR", + "name": "Terni" + }, + { + "code": "TO", + "name": "Torino" + }, + { + "code": "TP", + "name": "Trapani" + }, + { + "code": "TN", + "name": "Trento" + }, + { + "code": "TV", + "name": "Treviso" + }, + { + "code": "TS", + "name": "Trieste" + }, + { + "code": "UD", + "name": "Udine" + }, + { + "code": "VA", + "name": "Varese" + }, + { + "code": "VE", + "name": "Venezia" + }, + { + "code": "VB", + "name": "Verbano-Cusio-Ossola" + }, + { + "code": "VC", + "name": "Vercelli" + }, + { + "code": "VR", + "name": "Verona" + }, + { + "code": "VV", + "name": "Vibo Valentia" + }, + { + "code": "VI", + "name": "Vicenza" + }, + { + "code": "VT", + "name": "Viterbo" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CI", + "name": "Ivory Coast", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JM", + "name": "Jamaica", + "states": [{ + "code": "JM-01", + "name": "Kingston" + }, + { + "code": "JM-02", + "name": "Saint Andrew" + }, + { + "code": "JM-03", + "name": "Saint Thomas" + }, + { + "code": "JM-04", + "name": "Portland" + }, + { + "code": "JM-05", + "name": "Saint Mary" + }, + { + "code": "JM-06", + "name": "Saint Ann" + }, + { + "code": "JM-07", + "name": "Trelawny" + }, + { + "code": "JM-08", + "name": "Saint James" + }, + { + "code": "JM-09", + "name": "Hanover" + }, + { + "code": "JM-10", + "name": "Westmoreland" + }, + { + "code": "JM-11", + "name": "Saint Elizabeth" + }, + { + "code": "JM-12", + "name": "Manchester" + }, + { + "code": "JM-13", + "name": "Clarendon" + }, + { + "code": "JM-14", + "name": "Saint Catherine" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JP", + "name": "Japan", + "states": [{ + "code": "JP01", + "name": "Hokkaido" + }, + { + "code": "JP02", + "name": "Aomori" + }, + { + "code": "JP03", + "name": "Iwate" + }, + { + "code": "JP04", + "name": "Miyagi" + }, + { + "code": "JP05", + "name": "Akita" + }, + { + "code": "JP06", + "name": "Yamagata" + }, + { + "code": "JP07", + "name": "Fukushima" + }, + { + "code": "JP08", + "name": "Ibaraki" + }, + { + "code": "JP09", + "name": "Tochigi" + }, + { + "code": "JP10", + "name": "Gunma" + }, + { + "code": "JP11", + "name": "Saitama" + }, + { + "code": "JP12", + "name": "Chiba" + }, + { + "code": "JP13", + "name": "Tokyo" + }, + { + "code": "JP14", + "name": "Kanagawa" + }, + { + "code": "JP15", + "name": "Niigata" + }, + { + "code": "JP16", + "name": "Toyama" + }, + { + "code": "JP17", + "name": "Ishikawa" + }, + { + "code": "JP18", + "name": "Fukui" + }, + { + "code": "JP19", + "name": "Yamanashi" + }, + { + "code": "JP20", + "name": "Nagano" + }, + { + "code": "JP21", + "name": "Gifu" + }, + { + "code": "JP22", + "name": "Shizuoka" + }, + { + "code": "JP23", + "name": "Aichi" + }, + { + "code": "JP24", + "name": "Mie" + }, + { + "code": "JP25", + "name": "Shiga" + }, + { + "code": "JP26", + "name": "Kyoto" + }, + { + "code": "JP27", + "name": "Osaka" + }, + { + "code": "JP28", + "name": "Hyogo" + }, + { + "code": "JP29", + "name": "Nara" + }, + { + "code": "JP30", + "name": "Wakayama" + }, + { + "code": "JP31", + "name": "Tottori" + }, + { + "code": "JP32", + "name": "Shimane" + }, + { + "code": "JP33", + "name": "Okayama" + }, + { + "code": "JP34", + "name": "Hiroshima" + }, + { + "code": "JP35", + "name": "Yamaguchi" + }, + { + "code": "JP36", + "name": "Tokushima" + }, + { + "code": "JP37", + "name": "Kagawa" + }, + { + "code": "JP38", + "name": "Ehime" + }, + { + "code": "JP39", + "name": "Kochi" + }, + { + "code": "JP40", + "name": "Fukuoka" + }, + { + "code": "JP41", + "name": "Saga" + }, + { + "code": "JP42", + "name": "Nagasaki" + }, + { + "code": "JP43", + "name": "Kumamoto" + }, + { + "code": "JP44", + "name": "Oita" + }, + { + "code": "JP45", + "name": "Miyazaki" + }, + { + "code": "JP46", + "name": "Kagoshima" + }, + { + "code": "JP47", + "name": "Okinawa" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JE", + "name": "Jersey", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JO", + "name": "Jordan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KZ", + "name": "Kazakhstan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KE", + "name": "Kenya", + "states": [{ + "code": "KE01", + "name": "Baringo" + }, + { + "code": "KE02", + "name": "Bomet" + }, + { + "code": "KE03", + "name": "Bungoma" + }, + { + "code": "KE04", + "name": "Busia" + }, + { + "code": "KE05", + "name": "Elgeyo-Marakwet" + }, + { + "code": "KE06", + "name": "Embu" + }, + { + "code": "KE07", + "name": "Garissa" + }, + { + "code": "KE08", + "name": "Homa Bay" + }, + { + "code": "KE09", + "name": "Isiolo" + }, + { + "code": "KE10", + "name": "Kajiado" + }, + { + "code": "KE11", + "name": "Kakamega" + }, + { + "code": "KE12", + "name": "Kericho" + }, + { + "code": "KE13", + "name": "Kiambu" + }, + { + "code": "KE14", + "name": "Kilifi" + }, + { + "code": "KE15", + "name": "Kirinyaga" + }, + { + "code": "KE16", + "name": "Kisii" + }, + { + "code": "KE17", + "name": "Kisumu" + }, + { + "code": "KE18", + "name": "Kitui" + }, + { + "code": "KE19", + "name": "Kwale" + }, + { + "code": "KE20", + "name": "Laikipia" + }, + { + "code": "KE21", + "name": "Lamu" + }, + { + "code": "KE22", + "name": "Machakos" + }, + { + "code": "KE23", + "name": "Makueni" + }, + { + "code": "KE24", + "name": "Mandera" + }, + { + "code": "KE25", + "name": "Marsabit" + }, + { + "code": "KE26", + "name": "Meru" + }, + { + "code": "KE27", + "name": "Migori" + }, + { + "code": "KE28", + "name": "Mombasa" + }, + { + "code": "KE29", + "name": "Murang’a" + }, + { + "code": "KE30", + "name": "Nairobi County" + }, + { + "code": "KE31", + "name": "Nakuru" + }, + { + "code": "KE32", + "name": "Nandi" + }, + { + "code": "KE33", + "name": "Narok" + }, + { + "code": "KE34", + "name": "Nyamira" + }, + { + "code": "KE35", + "name": "Nyandarua" + }, + { + "code": "KE36", + "name": "Nyeri" + }, + { + "code": "KE37", + "name": "Samburu" + }, + { + "code": "KE38", + "name": "Siaya" + }, + { + "code": "KE39", + "name": "Taita-Taveta" + }, + { + "code": "KE40", + "name": "Tana River" + }, + { + "code": "KE41", + "name": "Tharaka-Nithi" + }, + { + "code": "KE42", + "name": "Trans Nzoia" + }, + { + "code": "KE43", + "name": "Turkana" + }, + { + "code": "KE44", + "name": "Uasin Gishu" + }, + { + "code": "KE45", + "name": "Vihiga" + }, + { + "code": "KE46", + "name": "Wajir" + }, + { + "code": "KE47", + "name": "West Pokot" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KI", + "name": "Kiribati", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KW", + "name": "Kuwait", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KG", + "name": "Kyrgyzstan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LA", + "name": "Laos", + "states": [{ + "code": "AT", + "name": "Attapeu" + }, + { + "code": "BK", + "name": "Bokeo" + }, + { + "code": "BL", + "name": "Bolikhamsai" + }, + { + "code": "CH", + "name": "Champasak" + }, + { + "code": "HO", + "name": "Houaphanh" + }, + { + "code": "KH", + "name": "Khammouane" + }, + { + "code": "LM", + "name": "Luang Namtha" + }, + { + "code": "LP", + "name": "Luang Prabang" + }, + { + "code": "OU", + "name": "Oudomxay" + }, + { + "code": "PH", + "name": "Phongsaly" + }, + { + "code": "SL", + "name": "Salavan" + }, + { + "code": "SV", + "name": "Savannakhet" + }, + { + "code": "VI", + "name": "Vientiane Province" + }, + { + "code": "VT", + "name": "Vientiane" + }, + { + "code": "XA", + "name": "Sainyabuli" + }, + { + "code": "XE", + "name": "Sekong" + }, + { + "code": "XI", + "name": "Xiangkhouang" + }, + { + "code": "XS", + "name": "Xaisomboun" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LV", + "name": "Latvia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LB", + "name": "Lebanon", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LS", + "name": "Lesotho", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LR", + "name": "Liberia", + "states": [{ + "code": "BM", + "name": "Bomi" + }, + { + "code": "BN", + "name": "Bong" + }, + { + "code": "GA", + "name": "Gbarpolu" + }, + { + "code": "GB", + "name": "Grand Bassa" + }, + { + "code": "GC", + "name": "Grand Cape Mount" + }, + { + "code": "GG", + "name": "Grand Gedeh" + }, + { + "code": "GK", + "name": "Grand Kru" + }, + { + "code": "LO", + "name": "Lofa" + }, + { + "code": "MA", + "name": "Margibi" + }, + { + "code": "MY", + "name": "Maryland" + }, + { + "code": "MO", + "name": "Montserrado" + }, + { + "code": "NM", + "name": "Nimba" + }, + { + "code": "RV", + "name": "Rivercess" + }, + { + "code": "RG", + "name": "River Gee" + }, + { + "code": "SN", + "name": "Sinoe" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LY", + "name": "Libya", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LI", + "name": "Liechtenstein", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LT", + "name": "Lithuania", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LU", + "name": "Luxembourg", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MO", + "name": "Macao", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MG", + "name": "Madagascar", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MW", + "name": "Malawi", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MY", + "name": "Malaysia", + "states": [{ + "code": "JHR", + "name": "Johor" + }, + { + "code": "KDH", + "name": "Kedah" + }, + { + "code": "KTN", + "name": "Kelantan" + }, + { + "code": "LBN", + "name": "Labuan" + }, + { + "code": "MLK", + "name": "Malacca (Melaka)" + }, + { + "code": "NSN", + "name": "Negeri Sembilan" + }, + { + "code": "PHG", + "name": "Pahang" + }, + { + "code": "PNG", + "name": "Penang (Pulau Pinang)" + }, + { + "code": "PRK", + "name": "Perak" + }, + { + "code": "PLS", + "name": "Perlis" + }, + { + "code": "SBH", + "name": "Sabah" + }, + { + "code": "SWK", + "name": "Sarawak" + }, + { + "code": "SGR", + "name": "Selangor" + }, + { + "code": "TRG", + "name": "Terengganu" + }, + { + "code": "PJY", + "name": "Putrajaya" + }, + { + "code": "KUL", + "name": "Kuala Lumpur" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MV", + "name": "Maldives", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ML", + "name": "Mali", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MT", + "name": "Malta", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MH", + "name": "Marshall Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MQ", + "name": "Martinique", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MR", + "name": "Mauritania", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MU", + "name": "Mauritius", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "YT", + "name": "Mayotte", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MX", + "name": "Mexico", + "states": [{ + "code": "DF", + "name": "Ciudad de México" + }, + { + "code": "JA", + "name": "Jalisco" + }, + { + "code": "NL", + "name": "Nuevo León" + }, + { + "code": "AG", + "name": "Aguascalientes" + }, + { + "code": "BC", + "name": "Baja California" + }, + { + "code": "BS", + "name": "Baja California Sur" + }, + { + "code": "CM", + "name": "Campeche" + }, + { + "code": "CS", + "name": "Chiapas" + }, + { + "code": "CH", + "name": "Chihuahua" + }, + { + "code": "CO", + "name": "Coahuila" + }, + { + "code": "CL", + "name": "Colima" + }, + { + "code": "DG", + "name": "Durango" + }, + { + "code": "GT", + "name": "Guanajuato" + }, + { + "code": "GR", + "name": "Guerrero" + }, + { + "code": "HG", + "name": "Hidalgo" + }, + { + "code": "MX", + "name": "Estado de México" + }, + { + "code": "MI", + "name": "Michoacán" + }, + { + "code": "MO", + "name": "Morelos" + }, + { + "code": "NA", + "name": "Nayarit" + }, + { + "code": "OA", + "name": "Oaxaca" + }, + { + "code": "PU", + "name": "Puebla" + }, + { + "code": "QT", + "name": "Querétaro" + }, + { + "code": "QR", + "name": "Quintana Roo" + }, + { + "code": "SL", + "name": "San Luis Potosí" + }, + { + "code": "SI", + "name": "Sinaloa" + }, + { + "code": "SO", + "name": "Sonora" + }, + { + "code": "TB", + "name": "Tabasco" + }, + { + "code": "TM", + "name": "Tamaulipas" + }, + { + "code": "TL", + "name": "Tlaxcala" + }, + { + "code": "VE", + "name": "Veracruz" + }, + { + "code": "YU", + "name": "Yucatán" + }, + { + "code": "ZA", + "name": "Zacatecas" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FM", + "name": "Micronesia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MD", + "name": "Moldova", + "states": [{ + "code": "C", + "name": "Chișinău" + }, + { + "code": "BL", + "name": "Bălți" + }, + { + "code": "AN", + "name": "Anenii Noi" + }, + { + "code": "BS", + "name": "Basarabeasca" + }, + { + "code": "BR", + "name": "Briceni" + }, + { + "code": "CH", + "name": "Cahul" + }, + { + "code": "CT", + "name": "Cantemir" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Căușeni" + }, + { + "code": "CM", + "name": "Cimișlia" + }, + { + "code": "CR", + "name": "Criuleni" + }, + { + "code": "DN", + "name": "Dondușeni" + }, + { + "code": "DR", + "name": "Drochia" + }, + { + "code": "DB", + "name": "Dubăsari" + }, + { + "code": "ED", + "name": "Edineț" + }, + { + "code": "FL", + "name": "Fălești" + }, + { + "code": "FR", + "name": "Florești" + }, + { + "code": "GE", + "name": "UTA Găgăuzia" + }, + { + "code": "GL", + "name": "Glodeni" + }, + { + "code": "HN", + "name": "Hîncești" + }, + { + "code": "IL", + "name": "Ialoveni" + }, + { + "code": "LV", + "name": "Leova" + }, + { + "code": "NS", + "name": "Nisporeni" + }, + { + "code": "OC", + "name": "Ocnița" + }, + { + "code": "OR", + "name": "Orhei" + }, + { + "code": "RZ", + "name": "Rezina" + }, + { + "code": "RS", + "name": "Rîșcani" + }, + { + "code": "SG", + "name": "Sîngerei" + }, + { + "code": "SR", + "name": "Soroca" + }, + { + "code": "ST", + "name": "Strășeni" + }, + { + "code": "SD", + "name": "Șoldănești" + }, + { + "code": "SV", + "name": "Ștefan Vodă" + }, + { + "code": "TR", + "name": "Taraclia" + }, + { + "code": "TL", + "name": "Telenești" + }, + { + "code": "UN", + "name": "Ungheni" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MC", + "name": "Monaco", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MN", + "name": "Mongolia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ME", + "name": "Montenegro", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MS", + "name": "Montserrat", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MA", + "name": "Morocco", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MZ", + "name": "Mozambique", + "states": [{ + "code": "MZP", + "name": "Cabo Delgado" + }, + { + "code": "MZG", + "name": "Gaza" + }, + { + "code": "MZI", + "name": "Inhambane" + }, + { + "code": "MZB", + "name": "Manica" + }, + { + "code": "MZL", + "name": "Maputo Province" + }, + { + "code": "MZMPM", + "name": "Maputo" + }, + { + "code": "MZN", + "name": "Nampula" + }, + { + "code": "MZA", + "name": "Niassa" + }, + { + "code": "MZS", + "name": "Sofala" + }, + { + "code": "MZT", + "name": "Tete" + }, + { + "code": "MZQ", + "name": "Zambézia" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MM", + "name": "Myanmar", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NA", + "name": "Namibia", + "states": [{ + "code": "ER", + "name": "Erongo" + }, + { + "code": "HA", + "name": "Hardap" + }, + { + "code": "KA", + "name": "Karas" + }, + { + "code": "KE", + "name": "Kavango East" + }, + { + "code": "KW", + "name": "Kavango West" + }, + { + "code": "KH", + "name": "Khomas" + }, + { + "code": "KU", + "name": "Kunene" + }, + { + "code": "OW", + "name": "Ohangwena" + }, + { + "code": "OH", + "name": "Omaheke" + }, + { + "code": "OS", + "name": "Omusati" + }, + { + "code": "ON", + "name": "Oshana" + }, + { + "code": "OT", + "name": "Oshikoto" + }, + { + "code": "OD", + "name": "Otjozondjupa" + }, + { + "code": "CA", + "name": "Zambezi" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NR", + "name": "Nauru", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NP", + "name": "Nepal", + "states": [{ + "code": "BAG", + "name": "Bagmati" + }, + { + "code": "BHE", + "name": "Bheri" + }, + { + "code": "DHA", + "name": "Dhaulagiri" + }, + { + "code": "GAN", + "name": "Gandaki" + }, + { + "code": "JAN", + "name": "Janakpur" + }, + { + "code": "KAR", + "name": "Karnali" + }, + { + "code": "KOS", + "name": "Koshi" + }, + { + "code": "LUM", + "name": "Lumbini" + }, + { + "code": "MAH", + "name": "Mahakali" + }, + { + "code": "MEC", + "name": "Mechi" + }, + { + "code": "NAR", + "name": "Narayani" + }, + { + "code": "RAP", + "name": "Rapti" + }, + { + "code": "SAG", + "name": "Sagarmatha" + }, + { + "code": "SET", + "name": "Seti" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NL", + "name": "Netherlands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NC", + "name": "New Caledonia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NZ", + "name": "New Zealand", + "states": [{ + "code": "NTL", + "name": "Northland" + }, + { + "code": "AUK", + "name": "Auckland" + }, + { + "code": "WKO", + "name": "Waikato" + }, + { + "code": "BOP", + "name": "Bay of Plenty" + }, + { + "code": "TKI", + "name": "Taranaki" + }, + { + "code": "GIS", + "name": "Gisborne" + }, + { + "code": "HKB", + "name": "Hawke’s Bay" + }, + { + "code": "MWT", + "name": "Manawatu-Wanganui" + }, + { + "code": "WGN", + "name": "Wellington" + }, + { + "code": "NSN", + "name": "Nelson" + }, + { + "code": "MBH", + "name": "Marlborough" + }, + { + "code": "TAS", + "name": "Tasman" + }, + { + "code": "WTC", + "name": "West Coast" + }, + { + "code": "CAN", + "name": "Canterbury" + }, + { + "code": "OTA", + "name": "Otago" + }, + { + "code": "STL", + "name": "Southland" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NI", + "name": "Nicaragua", + "states": [{ + "code": "NI-AN", + "name": "Atlántico Norte" + }, + { + "code": "NI-AS", + "name": "Atlántico Sur" + }, + { + "code": "NI-BO", + "name": "Boaco" + }, + { + "code": "NI-CA", + "name": "Carazo" + }, + { + "code": "NI-CI", + "name": "Chinandega" + }, + { + "code": "NI-CO", + "name": "Chontales" + }, + { + "code": "NI-ES", + "name": "Estelí" + }, + { + "code": "NI-GR", + "name": "Granada" + }, + { + "code": "NI-JI", + "name": "Jinotega" + }, + { + "code": "NI-LE", + "name": "León" + }, + { + "code": "NI-MD", + "name": "Madriz" + }, + { + "code": "NI-MN", + "name": "Managua" + }, + { + "code": "NI-MS", + "name": "Masaya" + }, + { + "code": "NI-MT", + "name": "Matagalpa" + }, + { + "code": "NI-NS", + "name": "Nueva Segovia" + }, + { + "code": "NI-RI", + "name": "Rivas" + }, + { + "code": "NI-SJ", + "name": "Río San Juan" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NE", + "name": "Niger", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NG", + "name": "Nigeria", + "states": [{ + "code": "AB", + "name": "Abia" + }, + { + "code": "FC", + "name": "Abuja" + }, + { + "code": "AD", + "name": "Adamawa" + }, + { + "code": "AK", + "name": "Akwa Ibom" + }, + { + "code": "AN", + "name": "Anambra" + }, + { + "code": "BA", + "name": "Bauchi" + }, + { + "code": "BY", + "name": "Bayelsa" + }, + { + "code": "BE", + "name": "Benue" + }, + { + "code": "BO", + "name": "Borno" + }, + { + "code": "CR", + "name": "Cross River" + }, + { + "code": "DE", + "name": "Delta" + }, + { + "code": "EB", + "name": "Ebonyi" + }, + { + "code": "ED", + "name": "Edo" + }, + { + "code": "EK", + "name": "Ekiti" + }, + { + "code": "EN", + "name": "Enugu" + }, + { + "code": "GO", + "name": "Gombe" + }, + { + "code": "IM", + "name": "Imo" + }, + { + "code": "JI", + "name": "Jigawa" + }, + { + "code": "KD", + "name": "Kaduna" + }, + { + "code": "KN", + "name": "Kano" + }, + { + "code": "KT", + "name": "Katsina" + }, + { + "code": "KE", + "name": "Kebbi" + }, + { + "code": "KO", + "name": "Kogi" + }, + { + "code": "KW", + "name": "Kwara" + }, + { + "code": "LA", + "name": "Lagos" + }, + { + "code": "NA", + "name": "Nasarawa" + }, + { + "code": "NI", + "name": "Niger" + }, + { + "code": "OG", + "name": "Ogun" + }, + { + "code": "ON", + "name": "Ondo" + }, + { + "code": "OS", + "name": "Osun" + }, + { + "code": "OY", + "name": "Oyo" + }, + { + "code": "PL", + "name": "Plateau" + }, + { + "code": "RI", + "name": "Rivers" + }, + { + "code": "SO", + "name": "Sokoto" + }, + { + "code": "TA", + "name": "Taraba" + }, + { + "code": "YO", + "name": "Yobe" + }, + { + "code": "ZA", + "name": "Zamfara" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NU", + "name": "Niue", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NF", + "name": "Norfolk Island", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KP", + "name": "North Korea", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MK", + "name": "North Macedonia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MP", + "name": "Northern Mariana Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NO", + "name": "Norway", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "OM", + "name": "Oman", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PK", + "name": "Pakistan", + "states": [{ + "code": "JK", + "name": "Azad Kashmir" + }, + { + "code": "BA", + "name": "Balochistan" + }, + { + "code": "TA", + "name": "FATA" + }, + { + "code": "GB", + "name": "Gilgit Baltistan" + }, + { + "code": "IS", + "name": "Islamabad Capital Territory" + }, + { + "code": "KP", + "name": "Khyber Pakhtunkhwa" + }, + { + "code": "PB", + "name": "Punjab" + }, + { + "code": "SD", + "name": "Sindh" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PS", + "name": "Palestinian Territory", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PA", + "name": "Panama", + "states": [{ + "code": "PA-1", + "name": "Bocas del Toro" + }, + { + "code": "PA-2", + "name": "Coclé" + }, + { + "code": "PA-3", + "name": "Colón" + }, + { + "code": "PA-4", + "name": "Chiriquí" + }, + { + "code": "PA-5", + "name": "Darién" + }, + { + "code": "PA-6", + "name": "Herrera" + }, + { + "code": "PA-7", + "name": "Los Santos" + }, + { + "code": "PA-8", + "name": "Panamá" + }, + { + "code": "PA-9", + "name": "Veraguas" + }, + { + "code": "PA-10", + "name": "West Panamá" + }, + { + "code": "PA-EM", + "name": "Emberá" + }, + { + "code": "PA-KY", + "name": "Guna Yala" + }, + { + "code": "PA-NB", + "name": "Ngöbe-Buglé" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PG", + "name": "Papua New Guinea", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PY", + "name": "Paraguay", + "states": [{ + "code": "PY-ASU", + "name": "Asunción" + }, + { + "code": "PY-1", + "name": "Concepción" + }, + { + "code": "PY-2", + "name": "San Pedro" + }, + { + "code": "PY-3", + "name": "Cordillera" + }, + { + "code": "PY-4", + "name": "Guairá" + }, + { + "code": "PY-5", + "name": "Caaguazú" + }, + { + "code": "PY-6", + "name": "Caazapá" + }, + { + "code": "PY-7", + "name": "Itapúa" + }, + { + "code": "PY-8", + "name": "Misiones" + }, + { + "code": "PY-9", + "name": "Paraguarí" + }, + { + "code": "PY-10", + "name": "Alto Paraná" + }, + { + "code": "PY-11", + "name": "Central" + }, + { + "code": "PY-12", + "name": "Ñeembucú" + }, + { + "code": "PY-13", + "name": "Amambay" + }, + { + "code": "PY-14", + "name": "Canindeyú" + }, + { + "code": "PY-15", + "name": "Presidente Hayes" + }, + { + "code": "PY-16", + "name": "Alto Paraguay" + }, + { + "code": "PY-17", + "name": "Boquerón" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PE", + "name": "Peru", + "states": [{ + "code": "CAL", + "name": "El Callao" + }, + { + "code": "LMA", + "name": "Municipalidad Metropolitana de Lima" + }, + { + "code": "AMA", + "name": "Amazonas" + }, + { + "code": "ANC", + "name": "Ancash" + }, + { + "code": "APU", + "name": "Apurímac" + }, + { + "code": "ARE", + "name": "Arequipa" + }, + { + "code": "AYA", + "name": "Ayacucho" + }, + { + "code": "CAJ", + "name": "Cajamarca" + }, + { + "code": "CUS", + "name": "Cusco" + }, + { + "code": "HUV", + "name": "Huancavelica" + }, + { + "code": "HUC", + "name": "Huánuco" + }, + { + "code": "ICA", + "name": "Ica" + }, + { + "code": "JUN", + "name": "Junín" + }, + { + "code": "LAL", + "name": "La Libertad" + }, + { + "code": "LAM", + "name": "Lambayeque" + }, + { + "code": "LIM", + "name": "Lima" + }, + { + "code": "LOR", + "name": "Loreto" + }, + { + "code": "MDD", + "name": "Madre de Dios" + }, + { + "code": "MOQ", + "name": "Moquegua" + }, + { + "code": "PAS", + "name": "Pasco" + }, + { + "code": "PIU", + "name": "Piura" + }, + { + "code": "PUN", + "name": "Puno" + }, + { + "code": "SAM", + "name": "San Martín" + }, + { + "code": "TAC", + "name": "Tacna" + }, + { + "code": "TUM", + "name": "Tumbes" + }, + { + "code": "UCA", + "name": "Ucayali" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PH", + "name": "Philippines", + "states": [{ + "code": "ABR", + "name": "Abra" + }, + { + "code": "AGN", + "name": "Agusan del Norte" + }, + { + "code": "AGS", + "name": "Agusan del Sur" + }, + { + "code": "AKL", + "name": "Aklan" + }, + { + "code": "ALB", + "name": "Albay" + }, + { + "code": "ANT", + "name": "Antique" + }, + { + "code": "APA", + "name": "Apayao" + }, + { + "code": "AUR", + "name": "Aurora" + }, + { + "code": "BAS", + "name": "Basilan" + }, + { + "code": "BAN", + "name": "Bataan" + }, + { + "code": "BTN", + "name": "Batanes" + }, + { + "code": "BTG", + "name": "Batangas" + }, + { + "code": "BEN", + "name": "Benguet" + }, + { + "code": "BIL", + "name": "Biliran" + }, + { + "code": "BOH", + "name": "Bohol" + }, + { + "code": "BUK", + "name": "Bukidnon" + }, + { + "code": "BUL", + "name": "Bulacan" + }, + { + "code": "CAG", + "name": "Cagayan" + }, + { + "code": "CAN", + "name": "Camarines Norte" + }, + { + "code": "CAS", + "name": "Camarines Sur" + }, + { + "code": "CAM", + "name": "Camiguin" + }, + { + "code": "CAP", + "name": "Capiz" + }, + { + "code": "CAT", + "name": "Catanduanes" + }, + { + "code": "CAV", + "name": "Cavite" + }, + { + "code": "CEB", + "name": "Cebu" + }, + { + "code": "COM", + "name": "Compostela Valley" + }, + { + "code": "NCO", + "name": "Cotabato" + }, + { + "code": "DAV", + "name": "Davao del Norte" + }, + { + "code": "DAS", + "name": "Davao del Sur" + }, + { + "code": "DAC", + "name": "Davao Occidental" + }, + { + "code": "DAO", + "name": "Davao Oriental" + }, + { + "code": "DIN", + "name": "Dinagat Islands" + }, + { + "code": "EAS", + "name": "Eastern Samar" + }, + { + "code": "GUI", + "name": "Guimaras" + }, + { + "code": "IFU", + "name": "Ifugao" + }, + { + "code": "ILN", + "name": "Ilocos Norte" + }, + { + "code": "ILS", + "name": "Ilocos Sur" + }, + { + "code": "ILI", + "name": "Iloilo" + }, + { + "code": "ISA", + "name": "Isabela" + }, + { + "code": "KAL", + "name": "Kalinga" + }, + { + "code": "LUN", + "name": "La Union" + }, + { + "code": "LAG", + "name": "Laguna" + }, + { + "code": "LAN", + "name": "Lanao del Norte" + }, + { + "code": "LAS", + "name": "Lanao del Sur" + }, + { + "code": "LEY", + "name": "Leyte" + }, + { + "code": "MAG", + "name": "Maguindanao" + }, + { + "code": "MAD", + "name": "Marinduque" + }, + { + "code": "MAS", + "name": "Masbate" + }, + { + "code": "MSC", + "name": "Misamis Occidental" + }, + { + "code": "MSR", + "name": "Misamis Oriental" + }, + { + "code": "MOU", + "name": "Mountain Province" + }, + { + "code": "NEC", + "name": "Negros Occidental" + }, + { + "code": "NER", + "name": "Negros Oriental" + }, + { + "code": "NSA", + "name": "Northern Samar" + }, + { + "code": "NUE", + "name": "Nueva Ecija" + }, + { + "code": "NUV", + "name": "Nueva Vizcaya" + }, + { + "code": "MDC", + "name": "Occidental Mindoro" + }, + { + "code": "MDR", + "name": "Oriental Mindoro" + }, + { + "code": "PLW", + "name": "Palawan" + }, + { + "code": "PAM", + "name": "Pampanga" + }, + { + "code": "PAN", + "name": "Pangasinan" + }, + { + "code": "QUE", + "name": "Quezon" + }, + { + "code": "QUI", + "name": "Quirino" + }, + { + "code": "RIZ", + "name": "Rizal" + }, + { + "code": "ROM", + "name": "Romblon" + }, + { + "code": "WSA", + "name": "Samar" + }, + { + "code": "SAR", + "name": "Sarangani" + }, + { + "code": "SIQ", + "name": "Siquijor" + }, + { + "code": "SOR", + "name": "Sorsogon" + }, + { + "code": "SCO", + "name": "South Cotabato" + }, + { + "code": "SLE", + "name": "Southern Leyte" + }, + { + "code": "SUK", + "name": "Sultan Kudarat" + }, + { + "code": "SLU", + "name": "Sulu" + }, + { + "code": "SUN", + "name": "Surigao del Norte" + }, + { + "code": "SUR", + "name": "Surigao del Sur" + }, + { + "code": "TAR", + "name": "Tarlac" + }, + { + "code": "TAW", + "name": "Tawi-Tawi" + }, + { + "code": "ZMB", + "name": "Zambales" + }, + { + "code": "ZAN", + "name": "Zamboanga del Norte" + }, + { + "code": "ZAS", + "name": "Zamboanga del Sur" + }, + { + "code": "ZSI", + "name": "Zamboanga Sibugay" + }, + { + "code": "00", + "name": "Metro Manila" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PN", + "name": "Pitcairn", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PL", + "name": "Poland", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PT", + "name": "Portugal", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PR", + "name": "Puerto Rico", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "QA", + "name": "Qatar", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RE", + "name": "Reunion", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RO", + "name": "Romania", + "states": [{ + "code": "AB", + "name": "Alba" + }, + { + "code": "AR", + "name": "Arad" + }, + { + "code": "AG", + "name": "Argeș" + }, + { + "code": "BC", + "name": "Bacău" + }, + { + "code": "BH", + "name": "Bihor" + }, + { + "code": "BN", + "name": "Bistrița-Năsăud" + }, + { + "code": "BT", + "name": "Botoșani" + }, + { + "code": "BR", + "name": "Brăila" + }, + { + "code": "BV", + "name": "Brașov" + }, + { + "code": "B", + "name": "București" + }, + { + "code": "BZ", + "name": "Buzău" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Caraș-Severin" + }, + { + "code": "CJ", + "name": "Cluj" + }, + { + "code": "CT", + "name": "Constanța" + }, + { + "code": "CV", + "name": "Covasna" + }, + { + "code": "DB", + "name": "Dâmbovița" + }, + { + "code": "DJ", + "name": "Dolj" + }, + { + "code": "GL", + "name": "Galați" + }, + { + "code": "GR", + "name": "Giurgiu" + }, + { + "code": "GJ", + "name": "Gorj" + }, + { + "code": "HR", + "name": "Harghita" + }, + { + "code": "HD", + "name": "Hunedoara" + }, + { + "code": "IL", + "name": "Ialomița" + }, + { + "code": "IS", + "name": "Iași" + }, + { + "code": "IF", + "name": "Ilfov" + }, + { + "code": "MM", + "name": "Maramureș" + }, + { + "code": "MH", + "name": "Mehedinți" + }, + { + "code": "MS", + "name": "Mureș" + }, + { + "code": "NT", + "name": "Neamț" + }, + { + "code": "OT", + "name": "Olt" + }, + { + "code": "PH", + "name": "Prahova" + }, + { + "code": "SJ", + "name": "Sălaj" + }, + { + "code": "SM", + "name": "Satu Mare" + }, + { + "code": "SB", + "name": "Sibiu" + }, + { + "code": "SV", + "name": "Suceava" + }, + { + "code": "TR", + "name": "Teleorman" + }, + { + "code": "TM", + "name": "Timiș" + }, + { + "code": "TL", + "name": "Tulcea" + }, + { + "code": "VL", + "name": "Vâlcea" + }, + { + "code": "VS", + "name": "Vaslui" + }, + { + "code": "VN", + "name": "Vrancea" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RU", + "name": "Russia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RW", + "name": "Rwanda", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ST", + "name": "São Tomé and Príncipe", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BL", + "name": "Saint Barthélemy", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SH", + "name": "Saint Helena", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KN", + "name": "Saint Kitts and Nevis", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LC", + "name": "Saint Lucia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SX", + "name": "Saint Martin (Dutch part)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MF", + "name": "Saint Martin (French part)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PM", + "name": "Saint Pierre and Miquelon", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VC", + "name": "Saint Vincent and the Grenadines", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "WS", + "name": "Samoa", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SM", + "name": "San Marino", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SA", + "name": "Saudi Arabia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SN", + "name": "Senegal", + "states": [{ + "code": "SNDB", + "name": "Diourbel" + }, + { + "code": "SNDK", + "name": "Dakar" + }, + { + "code": "SNFK", + "name": "Fatick" + }, + { + "code": "SNKA", + "name": "Kaffrine" + }, + { + "code": "SNKD", + "name": "Kolda" + }, + { + "code": "SNKE", + "name": "Kédougou" + }, + { + "code": "SNKL", + "name": "Kaolack" + }, + { + "code": "SNLG", + "name": "Louga" + }, + { + "code": "SNMT", + "name": "Matam" + }, + { + "code": "SNSE", + "name": "Sédhiou" + }, + { + "code": "SNSL", + "name": "Saint-Louis" + }, + { + "code": "SNTC", + "name": "Tambacounda" + }, + { + "code": "SNTH", + "name": "Thiès" + }, + { + "code": "SNZG", + "name": "Ziguinchor" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RS", + "name": "Serbia", + "states": [{ + "code": "RS00", + "name": "Belgrade" + }, + { + "code": "RS14", + "name": "Bor" + }, + { + "code": "RS11", + "name": "Braničevo" + }, + { + "code": "RS02", + "name": "Central Banat" + }, + { + "code": "RS10", + "name": "Danube" + }, + { + "code": "RS23", + "name": "Jablanica" + }, + { + "code": "RS09", + "name": "Kolubara" + }, + { + "code": "RS08", + "name": "Mačva" + }, + { + "code": "RS17", + "name": "Morava" + }, + { + "code": "RS20", + "name": "Nišava" + }, + { + "code": "RS01", + "name": "North Bačka" + }, + { + "code": "RS03", + "name": "North Banat" + }, + { + "code": "RS24", + "name": "Pčinja" + }, + { + "code": "RS22", + "name": "Pirot" + }, + { + "code": "RS13", + "name": "Pomoravlje" + }, + { + "code": "RS19", + "name": "Rasina" + }, + { + "code": "RS18", + "name": "Raška" + }, + { + "code": "RS06", + "name": "South Bačka" + }, + { + "code": "RS04", + "name": "South Banat" + }, + { + "code": "RS07", + "name": "Srem" + }, + { + "code": "RS12", + "name": "Šumadija" + }, + { + "code": "RS21", + "name": "Toplica" + }, + { + "code": "RS05", + "name": "West Bačka" + }, + { + "code": "RS15", + "name": "Zaječar" + }, + { + "code": "RS16", + "name": "Zlatibor" + }, + { + "code": "RS25", + "name": "Kosovo" + }, + { + "code": "RS26", + "name": "Peć" + }, + { + "code": "RS27", + "name": "Prizren" + }, + { + "code": "RS28", + "name": "Kosovska Mitrovica" + }, + { + "code": "RS29", + "name": "Kosovo-Pomoravlje" + }, + { + "code": "RSKM", + "name": "Kosovo-Metohija" + }, + { + "code": "RSVO", + "name": "Vojvodina" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SC", + "name": "Seychelles", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SL", + "name": "Sierra Leone", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SG", + "name": "Singapore", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SK", + "name": "Slovakia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SI", + "name": "Slovenia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SB", + "name": "Solomon Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SO", + "name": "Somalia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ZA", + "name": "South Africa", + "states": [{ + "code": "EC", + "name": "Eastern Cape" + }, + { + "code": "FS", + "name": "Free State" + }, + { + "code": "GP", + "name": "Gauteng" + }, + { + "code": "KZN", + "name": "KwaZulu-Natal" + }, + { + "code": "LP", + "name": "Limpopo" + }, + { + "code": "MP", + "name": "Mpumalanga" + }, + { + "code": "NC", + "name": "Northern Cape" + }, + { + "code": "NW", + "name": "North West" + }, + { + "code": "WC", + "name": "Western Cape" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GS", + "name": "South Georgia/Sandwich Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KR", + "name": "South Korea", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SS", + "name": "South Sudan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ES", + "name": "Spain", + "states": [{ + "code": "C", + "name": "A Coruña" + }, + { + "code": "VI", + "name": "Araba/Álava" + }, + { + "code": "AB", + "name": "Albacete" + }, + { + "code": "A", + "name": "Alicante" + }, + { + "code": "AL", + "name": "Almería" + }, + { + "code": "O", + "name": "Asturias" + }, + { + "code": "AV", + "name": "Ávila" + }, + { + "code": "BA", + "name": "Badajoz" + }, + { + "code": "PM", + "name": "Baleares" + }, + { + "code": "B", + "name": "Barcelona" + }, + { + "code": "BU", + "name": "Burgos" + }, + { + "code": "CC", + "name": "Cáceres" + }, + { + "code": "CA", + "name": "Cádiz" + }, + { + "code": "S", + "name": "Cantabria" + }, + { + "code": "CS", + "name": "Castellón" + }, + { + "code": "CE", + "name": "Ceuta" + }, + { + "code": "CR", + "name": "Ciudad Real" + }, + { + "code": "CO", + "name": "Córdoba" + }, + { + "code": "CU", + "name": "Cuenca" + }, + { + "code": "GI", + "name": "Girona" + }, + { + "code": "GR", + "name": "Granada" + }, + { + "code": "GU", + "name": "Guadalajara" + }, + { + "code": "SS", + "name": "Gipuzkoa" + }, + { + "code": "H", + "name": "Huelva" + }, + { + "code": "HU", + "name": "Huesca" + }, + { + "code": "J", + "name": "Jaén" + }, + { + "code": "LO", + "name": "La Rioja" + }, + { + "code": "GC", + "name": "Las Palmas" + }, + { + "code": "LE", + "name": "León" + }, + { + "code": "L", + "name": "Lleida" + }, + { + "code": "LU", + "name": "Lugo" + }, + { + "code": "M", + "name": "Madrid" + }, + { + "code": "MA", + "name": "Málaga" + }, + { + "code": "ML", + "name": "Melilla" + }, + { + "code": "MU", + "name": "Murcia" + }, + { + "code": "NA", + "name": "Navarra" + }, + { + "code": "OR", + "name": "Ourense" + }, + { + "code": "P", + "name": "Palencia" + }, + { + "code": "PO", + "name": "Pontevedra" + }, + { + "code": "SA", + "name": "Salamanca" + }, + { + "code": "TF", + "name": "Santa Cruz de Tenerife" + }, + { + "code": "SG", + "name": "Segovia" + }, + { + "code": "SE", + "name": "Sevilla" + }, + { + "code": "SO", + "name": "Soria" + }, + { + "code": "T", + "name": "Tarragona" + }, + { + "code": "TE", + "name": "Teruel" + }, + { + "code": "TO", + "name": "Toledo" + }, + { + "code": "V", + "name": "Valencia" + }, + { + "code": "VA", + "name": "Valladolid" + }, + { + "code": "BI", + "name": "Biscay" + }, + { + "code": "ZA", + "name": "Zamora" + }, + { + "code": "Z", + "name": "Zaragoza" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LK", + "name": "Sri Lanka", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SD", + "name": "Sudan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SR", + "name": "Suriname", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SJ", + "name": "Svalbard and Jan Mayen", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SE", + "name": "Sweden", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CH", + "name": "Switzerland", + "states": [{ + "code": "AG", + "name": "Aargau" + }, + { + "code": "AR", + "name": "Appenzell Ausserrhoden" + }, + { + "code": "AI", + "name": "Appenzell Innerrhoden" + }, + { + "code": "BL", + "name": "Basel-Landschaft" + }, + { + "code": "BS", + "name": "Basel-Stadt" + }, + { + "code": "BE", + "name": "Bern" + }, + { + "code": "FR", + "name": "Fribourg" + }, + { + "code": "GE", + "name": "Geneva" + }, + { + "code": "GL", + "name": "Glarus" + }, + { + "code": "GR", + "name": "Graubünden" + }, + { + "code": "JU", + "name": "Jura" + }, + { + "code": "LU", + "name": "Luzern" + }, + { + "code": "NE", + "name": "Neuchâtel" + }, + { + "code": "NW", + "name": "Nidwalden" + }, + { + "code": "OW", + "name": "Obwalden" + }, + { + "code": "SH", + "name": "Schaffhausen" + }, + { + "code": "SZ", + "name": "Schwyz" + }, + { + "code": "SO", + "name": "Solothurn" + }, + { + "code": "SG", + "name": "St. Gallen" + }, + { + "code": "TG", + "name": "Thurgau" + }, + { + "code": "TI", + "name": "Ticino" + }, + { + "code": "UR", + "name": "Uri" + }, + { + "code": "VS", + "name": "Valais" + }, + { + "code": "VD", + "name": "Vaud" + }, + { + "code": "ZG", + "name": "Zug" + }, + { + "code": "ZH", + "name": "Zürich" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SY", + "name": "Syria", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TW", + "name": "Taiwan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TJ", + "name": "Tajikistan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TZ", + "name": "Tanzania", + "states": [{ + "code": "TZ01", + "name": "Arusha" + }, + { + "code": "TZ02", + "name": "Dar es Salaam" + }, + { + "code": "TZ03", + "name": "Dodoma" + }, + { + "code": "TZ04", + "name": "Iringa" + }, + { + "code": "TZ05", + "name": "Kagera" + }, + { + "code": "TZ06", + "name": "Pemba North" + }, + { + "code": "TZ07", + "name": "Zanzibar North" + }, + { + "code": "TZ08", + "name": "Kigoma" + }, + { + "code": "TZ09", + "name": "Kilimanjaro" + }, + { + "code": "TZ10", + "name": "Pemba South" + }, + { + "code": "TZ11", + "name": "Zanzibar South" + }, + { + "code": "TZ12", + "name": "Lindi" + }, + { + "code": "TZ13", + "name": "Mara" + }, + { + "code": "TZ14", + "name": "Mbeya" + }, + { + "code": "TZ15", + "name": "Zanzibar West" + }, + { + "code": "TZ16", + "name": "Morogoro" + }, + { + "code": "TZ17", + "name": "Mtwara" + }, + { + "code": "TZ18", + "name": "Mwanza" + }, + { + "code": "TZ19", + "name": "Coast" + }, + { + "code": "TZ20", + "name": "Rukwa" + }, + { + "code": "TZ21", + "name": "Ruvuma" + }, + { + "code": "TZ22", + "name": "Shinyanga" + }, + { + "code": "TZ23", + "name": "Singida" + }, + { + "code": "TZ24", + "name": "Tabora" + }, + { + "code": "TZ25", + "name": "Tanga" + }, + { + "code": "TZ26", + "name": "Manyara" + }, + { + "code": "TZ27", + "name": "Geita" + }, + { + "code": "TZ28", + "name": "Katavi" + }, + { + "code": "TZ29", + "name": "Njombe" + }, + { + "code": "TZ30", + "name": "Simiyu" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TH", + "name": "Thailand", + "states": [{ + "code": "TH-37", + "name": "Amnat Charoen" + }, + { + "code": "TH-15", + "name": "Ang Thong" + }, + { + "code": "TH-14", + "name": "Ayutthaya" + }, + { + "code": "TH-10", + "name": "Bangkok" + }, + { + "code": "TH-38", + "name": "Bueng Kan" + }, + { + "code": "TH-31", + "name": "Buri Ram" + }, + { + "code": "TH-24", + "name": "Chachoengsao" + }, + { + "code": "TH-18", + "name": "Chai Nat" + }, + { + "code": "TH-36", + "name": "Chaiyaphum" + }, + { + "code": "TH-22", + "name": "Chanthaburi" + }, + { + "code": "TH-50", + "name": "Chiang Mai" + }, + { + "code": "TH-57", + "name": "Chiang Rai" + }, + { + "code": "TH-20", + "name": "Chonburi" + }, + { + "code": "TH-86", + "name": "Chumphon" + }, + { + "code": "TH-46", + "name": "Kalasin" + }, + { + "code": "TH-62", + "name": "Kamphaeng Phet" + }, + { + "code": "TH-71", + "name": "Kanchanaburi" + }, + { + "code": "TH-40", + "name": "Khon Kaen" + }, + { + "code": "TH-81", + "name": "Krabi" + }, + { + "code": "TH-52", + "name": "Lampang" + }, + { + "code": "TH-51", + "name": "Lamphun" + }, + { + "code": "TH-42", + "name": "Loei" + }, + { + "code": "TH-16", + "name": "Lopburi" + }, + { + "code": "TH-58", + "name": "Mae Hong Son" + }, + { + "code": "TH-44", + "name": "Maha Sarakham" + }, + { + "code": "TH-49", + "name": "Mukdahan" + }, + { + "code": "TH-26", + "name": "Nakhon Nayok" + }, + { + "code": "TH-73", + "name": "Nakhon Pathom" + }, + { + "code": "TH-48", + "name": "Nakhon Phanom" + }, + { + "code": "TH-30", + "name": "Nakhon Ratchasima" + }, + { + "code": "TH-60", + "name": "Nakhon Sawan" + }, + { + "code": "TH-80", + "name": "Nakhon Si Thammarat" + }, + { + "code": "TH-55", + "name": "Nan" + }, + { + "code": "TH-96", + "name": "Narathiwat" + }, + { + "code": "TH-39", + "name": "Nong Bua Lam Phu" + }, + { + "code": "TH-43", + "name": "Nong Khai" + }, + { + "code": "TH-12", + "name": "Nonthaburi" + }, + { + "code": "TH-13", + "name": "Pathum Thani" + }, + { + "code": "TH-94", + "name": "Pattani" + }, + { + "code": "TH-82", + "name": "Phang Nga" + }, + { + "code": "TH-93", + "name": "Phatthalung" + }, + { + "code": "TH-56", + "name": "Phayao" + }, + { + "code": "TH-67", + "name": "Phetchabun" + }, + { + "code": "TH-76", + "name": "Phetchaburi" + }, + { + "code": "TH-66", + "name": "Phichit" + }, + { + "code": "TH-65", + "name": "Phitsanulok" + }, + { + "code": "TH-54", + "name": "Phrae" + }, + { + "code": "TH-83", + "name": "Phuket" + }, + { + "code": "TH-25", + "name": "Prachin Buri" + }, + { + "code": "TH-77", + "name": "Prachuap Khiri Khan" + }, + { + "code": "TH-85", + "name": "Ranong" + }, + { + "code": "TH-70", + "name": "Ratchaburi" + }, + { + "code": "TH-21", + "name": "Rayong" + }, + { + "code": "TH-45", + "name": "Roi Et" + }, + { + "code": "TH-27", + "name": "Sa Kaeo" + }, + { + "code": "TH-47", + "name": "Sakon Nakhon" + }, + { + "code": "TH-11", + "name": "Samut Prakan" + }, + { + "code": "TH-74", + "name": "Samut Sakhon" + }, + { + "code": "TH-75", + "name": "Samut Songkhram" + }, + { + "code": "TH-19", + "name": "Saraburi" + }, + { + "code": "TH-91", + "name": "Satun" + }, + { + "code": "TH-17", + "name": "Sing Buri" + }, + { + "code": "TH-33", + "name": "Sisaket" + }, + { + "code": "TH-90", + "name": "Songkhla" + }, + { + "code": "TH-64", + "name": "Sukhothai" + }, + { + "code": "TH-72", + "name": "Suphan Buri" + }, + { + "code": "TH-84", + "name": "Surat Thani" + }, + { + "code": "TH-32", + "name": "Surin" + }, + { + "code": "TH-63", + "name": "Tak" + }, + { + "code": "TH-92", + "name": "Trang" + }, + { + "code": "TH-23", + "name": "Trat" + }, + { + "code": "TH-34", + "name": "Ubon Ratchathani" + }, + { + "code": "TH-41", + "name": "Udon Thani" + }, + { + "code": "TH-61", + "name": "Uthai Thani" + }, + { + "code": "TH-53", + "name": "Uttaradit" + }, + { + "code": "TH-95", + "name": "Yala" + }, + { + "code": "TH-35", + "name": "Yasothon" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TL", + "name": "Timor-Leste", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TG", + "name": "Togo", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TK", + "name": "Tokelau", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TO", + "name": "Tonga", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TT", + "name": "Trinidad and Tobago", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TN", + "name": "Tunisia", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TR", + "name": "Turkey", + "states": [{ + "code": "TR01", + "name": "Adana" + }, + { + "code": "TR02", + "name": "Adıyaman" + }, + { + "code": "TR03", + "name": "Afyon" + }, + { + "code": "TR04", + "name": "Ağrı" + }, + { + "code": "TR05", + "name": "Amasya" + }, + { + "code": "TR06", + "name": "Ankara" + }, + { + "code": "TR07", + "name": "Antalya" + }, + { + "code": "TR08", + "name": "Artvin" + }, + { + "code": "TR09", + "name": "Aydın" + }, + { + "code": "TR10", + "name": "Balıkesir" + }, + { + "code": "TR11", + "name": "Bilecik" + }, + { + "code": "TR12", + "name": "Bingöl" + }, + { + "code": "TR13", + "name": "Bitlis" + }, + { + "code": "TR14", + "name": "Bolu" + }, + { + "code": "TR15", + "name": "Burdur" + }, + { + "code": "TR16", + "name": "Bursa" + }, + { + "code": "TR17", + "name": "Çanakkale" + }, + { + "code": "TR18", + "name": "Çankırı" + }, + { + "code": "TR19", + "name": "Çorum" + }, + { + "code": "TR20", + "name": "Denizli" + }, + { + "code": "TR21", + "name": "Diyarbakır" + }, + { + "code": "TR22", + "name": "Edirne" + }, + { + "code": "TR23", + "name": "Elazığ" + }, + { + "code": "TR24", + "name": "Erzincan" + }, + { + "code": "TR25", + "name": "Erzurum" + }, + { + "code": "TR26", + "name": "Eskişehir" + }, + { + "code": "TR27", + "name": "Gaziantep" + }, + { + "code": "TR28", + "name": "Giresun" + }, + { + "code": "TR29", + "name": "Gümüşhane" + }, + { + "code": "TR30", + "name": "Hakkari" + }, + { + "code": "TR31", + "name": "Hatay" + }, + { + "code": "TR32", + "name": "Isparta" + }, + { + "code": "TR33", + "name": "İçel" + }, + { + "code": "TR34", + "name": "İstanbul" + }, + { + "code": "TR35", + "name": "İzmir" + }, + { + "code": "TR36", + "name": "Kars" + }, + { + "code": "TR37", + "name": "Kastamonu" + }, + { + "code": "TR38", + "name": "Kayseri" + }, + { + "code": "TR39", + "name": "Kırklareli" + }, + { + "code": "TR40", + "name": "Kırşehir" + }, + { + "code": "TR41", + "name": "Kocaeli" + }, + { + "code": "TR42", + "name": "Konya" + }, + { + "code": "TR43", + "name": "Kütahya" + }, + { + "code": "TR44", + "name": "Malatya" + }, + { + "code": "TR45", + "name": "Manisa" + }, + { + "code": "TR46", + "name": "Kahramanmaraş" + }, + { + "code": "TR47", + "name": "Mardin" + }, + { + "code": "TR48", + "name": "Muğla" + }, + { + "code": "TR49", + "name": "Muş" + }, + { + "code": "TR50", + "name": "Nevşehir" + }, + { + "code": "TR51", + "name": "Niğde" + }, + { + "code": "TR52", + "name": "Ordu" + }, + { + "code": "TR53", + "name": "Rize" + }, + { + "code": "TR54", + "name": "Sakarya" + }, + { + "code": "TR55", + "name": "Samsun" + }, + { + "code": "TR56", + "name": "Siirt" + }, + { + "code": "TR57", + "name": "Sinop" + }, + { + "code": "TR58", + "name": "Sivas" + }, + { + "code": "TR59", + "name": "Tekirdağ" + }, + { + "code": "TR60", + "name": "Tokat" + }, + { + "code": "TR61", + "name": "Trabzon" + }, + { + "code": "TR62", + "name": "Tunceli" + }, + { + "code": "TR63", + "name": "Şanlıurfa" + }, + { + "code": "TR64", + "name": "Uşak" + }, + { + "code": "TR65", + "name": "Van" + }, + { + "code": "TR66", + "name": "Yozgat" + }, + { + "code": "TR67", + "name": "Zonguldak" + }, + { + "code": "TR68", + "name": "Aksaray" + }, + { + "code": "TR69", + "name": "Bayburt" + }, + { + "code": "TR70", + "name": "Karaman" + }, + { + "code": "TR71", + "name": "Kırıkkale" + }, + { + "code": "TR72", + "name": "Batman" + }, + { + "code": "TR73", + "name": "Şırnak" + }, + { + "code": "TR74", + "name": "Bartın" + }, + { + "code": "TR75", + "name": "Ardahan" + }, + { + "code": "TR76", + "name": "Iğdır" + }, + { + "code": "TR77", + "name": "Yalova" + }, + { + "code": "TR78", + "name": "Karabük" + }, + { + "code": "TR79", + "name": "Kilis" + }, + { + "code": "TR80", + "name": "Osmaniye" + }, + { + "code": "TR81", + "name": "Düzce" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TM", + "name": "Turkmenistan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TC", + "name": "Turks and Caicos Islands", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TV", + "name": "Tuvalu", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UG", + "name": "Uganda", + "states": [{ + "code": "UG314", + "name": "Abim" + }, + { + "code": "UG301", + "name": "Adjumani" + }, + { + "code": "UG322", + "name": "Agago" + }, + { + "code": "UG323", + "name": "Alebtong" + }, + { + "code": "UG315", + "name": "Amolatar" + }, + { + "code": "UG324", + "name": "Amudat" + }, + { + "code": "UG216", + "name": "Amuria" + }, + { + "code": "UG316", + "name": "Amuru" + }, + { + "code": "UG302", + "name": "Apac" + }, + { + "code": "UG303", + "name": "Arua" + }, + { + "code": "UG217", + "name": "Budaka" + }, + { + "code": "UG218", + "name": "Bududa" + }, + { + "code": "UG201", + "name": "Bugiri" + }, + { + "code": "UG235", + "name": "Bugweri" + }, + { + "code": "UG420", + "name": "Buhweju" + }, + { + "code": "UG117", + "name": "Buikwe" + }, + { + "code": "UG219", + "name": "Bukedea" + }, + { + "code": "UG118", + "name": "Bukomansimbi" + }, + { + "code": "UG220", + "name": "Bukwa" + }, + { + "code": "UG225", + "name": "Bulambuli" + }, + { + "code": "UG416", + "name": "Buliisa" + }, + { + "code": "UG401", + "name": "Bundibugyo" + }, + { + "code": "UG430", + "name": "Bunyangabu" + }, + { + "code": "UG402", + "name": "Bushenyi" + }, + { + "code": "UG202", + "name": "Busia" + }, + { + "code": "UG221", + "name": "Butaleja" + }, + { + "code": "UG119", + "name": "Butambala" + }, + { + "code": "UG233", + "name": "Butebo" + }, + { + "code": "UG120", + "name": "Buvuma" + }, + { + "code": "UG226", + "name": "Buyende" + }, + { + "code": "UG317", + "name": "Dokolo" + }, + { + "code": "UG121", + "name": "Gomba" + }, + { + "code": "UG304", + "name": "Gulu" + }, + { + "code": "UG403", + "name": "Hoima" + }, + { + "code": "UG417", + "name": "Ibanda" + }, + { + "code": "UG203", + "name": "Iganga" + }, + { + "code": "UG418", + "name": "Isingiro" + }, + { + "code": "UG204", + "name": "Jinja" + }, + { + "code": "UG318", + "name": "Kaabong" + }, + { + "code": "UG404", + "name": "Kabale" + }, + { + "code": "UG405", + "name": "Kabarole" + }, + { + "code": "UG213", + "name": "Kaberamaido" + }, + { + "code": "UG427", + "name": "Kagadi" + }, + { + "code": "UG428", + "name": "Kakumiro" + }, + { + "code": "UG101", + "name": "Kalangala" + }, + { + "code": "UG222", + "name": "Kaliro" + }, + { + "code": "UG122", + "name": "Kalungu" + }, + { + "code": "UG102", + "name": "Kampala" + }, + { + "code": "UG205", + "name": "Kamuli" + }, + { + "code": "UG413", + "name": "Kamwenge" + }, + { + "code": "UG414", + "name": "Kanungu" + }, + { + "code": "UG206", + "name": "Kapchorwa" + }, + { + "code": "UG236", + "name": "Kapelebyong" + }, + { + "code": "UG126", + "name": "Kasanda" + }, + { + "code": "UG406", + "name": "Kasese" + }, + { + "code": "UG207", + "name": "Katakwi" + }, + { + "code": "UG112", + "name": "Kayunga" + }, + { + "code": "UG407", + "name": "Kibaale" + }, + { + "code": "UG103", + "name": "Kiboga" + }, + { + "code": "UG227", + "name": "Kibuku" + }, + { + "code": "UG432", + "name": "Kikuube" + }, + { + "code": "UG419", + "name": "Kiruhura" + }, + { + "code": "UG421", + "name": "Kiryandongo" + }, + { + "code": "UG408", + "name": "Kisoro" + }, + { + "code": "UG305", + "name": "Kitgum" + }, + { + "code": "UG319", + "name": "Koboko" + }, + { + "code": "UG325", + "name": "Kole" + }, + { + "code": "UG306", + "name": "Kotido" + }, + { + "code": "UG208", + "name": "Kumi" + }, + { + "code": "UG333", + "name": "Kwania" + }, + { + "code": "UG228", + "name": "Kween" + }, + { + "code": "UG123", + "name": "Kyankwanzi" + }, + { + "code": "UG422", + "name": "Kyegegwa" + }, + { + "code": "UG415", + "name": "Kyenjojo" + }, + { + "code": "UG125", + "name": "Kyotera" + }, + { + "code": "UG326", + "name": "Lamwo" + }, + { + "code": "UG307", + "name": "Lira" + }, + { + "code": "UG229", + "name": "Luuka" + }, + { + "code": "UG104", + "name": "Luwero" + }, + { + "code": "UG124", + "name": "Lwengo" + }, + { + "code": "UG114", + "name": "Lyantonde" + }, + { + "code": "UG223", + "name": "Manafwa" + }, + { + "code": "UG320", + "name": "Maracha" + }, + { + "code": "UG105", + "name": "Masaka" + }, + { + "code": "UG409", + "name": "Masindi" + }, + { + "code": "UG214", + "name": "Mayuge" + }, + { + "code": "UG209", + "name": "Mbale" + }, + { + "code": "UG410", + "name": "Mbarara" + }, + { + "code": "UG423", + "name": "Mitooma" + }, + { + "code": "UG115", + "name": "Mityana" + }, + { + "code": "UG308", + "name": "Moroto" + }, + { + "code": "UG309", + "name": "Moyo" + }, + { + "code": "UG106", + "name": "Mpigi" + }, + { + "code": "UG107", + "name": "Mubende" + }, + { + "code": "UG108", + "name": "Mukono" + }, + { + "code": "UG334", + "name": "Nabilatuk" + }, + { + "code": "UG311", + "name": "Nakapiripirit" + }, + { + "code": "UG116", + "name": "Nakaseke" + }, + { + "code": "UG109", + "name": "Nakasongola" + }, + { + "code": "UG230", + "name": "Namayingo" + }, + { + "code": "UG234", + "name": "Namisindwa" + }, + { + "code": "UG224", + "name": "Namutumba" + }, + { + "code": "UG327", + "name": "Napak" + }, + { + "code": "UG310", + "name": "Nebbi" + }, + { + "code": "UG231", + "name": "Ngora" + }, + { + "code": "UG424", + "name": "Ntoroko" + }, + { + "code": "UG411", + "name": "Ntungamo" + }, + { + "code": "UG328", + "name": "Nwoya" + }, + { + "code": "UG331", + "name": "Omoro" + }, + { + "code": "UG329", + "name": "Otuke" + }, + { + "code": "UG321", + "name": "Oyam" + }, + { + "code": "UG312", + "name": "Pader" + }, + { + "code": "UG332", + "name": "Pakwach" + }, + { + "code": "UG210", + "name": "Pallisa" + }, + { + "code": "UG110", + "name": "Rakai" + }, + { + "code": "UG429", + "name": "Rubanda" + }, + { + "code": "UG425", + "name": "Rubirizi" + }, + { + "code": "UG431", + "name": "Rukiga" + }, + { + "code": "UG412", + "name": "Rukungiri" + }, + { + "code": "UG111", + "name": "Sembabule" + }, + { + "code": "UG232", + "name": "Serere" + }, + { + "code": "UG426", + "name": "Sheema" + }, + { + "code": "UG215", + "name": "Sironko" + }, + { + "code": "UG211", + "name": "Soroti" + }, + { + "code": "UG212", + "name": "Tororo" + }, + { + "code": "UG113", + "name": "Wakiso" + }, + { + "code": "UG313", + "name": "Yumbe" + }, + { + "code": "UG330", + "name": "Zombo" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UA", + "name": "Ukraine", + "states": [{ + "code": "VN", + "name": "Vinnytsia Oblast" + }, + { + "code": "VL", + "name": "Volyn Oblast" + }, + { + "code": "DP", + "name": "Dnipropetrovsk Oblast" + }, + { + "code": "DT", + "name": "Donetsk Oblast" + }, + { + "code": "ZT", + "name": "Zhytomyr Oblast" + }, + { + "code": "ZK", + "name": "Zakarpattia Oblast" + }, + { + "code": "ZP", + "name": "Zaporizhzhia Oblast" + }, + { + "code": "IF", + "name": "Ivano-Frankivsk Oblast" + }, + { + "code": "KV", + "name": "Kyiv Oblast" + }, + { + "code": "KH", + "name": "Kirovohrad Oblast" + }, + { + "code": "LH", + "name": "Luhansk Oblast" + }, + { + "code": "LV", + "name": "Lviv Oblast" + }, + { + "code": "MY", + "name": "Mykolaiv Oblast" + }, + { + "code": "OD", + "name": "Odessa Oblast" + }, + { + "code": "PL", + "name": "Poltava Oblast" + }, + { + "code": "RV", + "name": "Rivne Oblast" + }, + { + "code": "SM", + "name": "Sumy Oblast" + }, + { + "code": "TP", + "name": "Ternopil Oblast" + }, + { + "code": "KK", + "name": "Kharkiv Oblast" + }, + { + "code": "KS", + "name": "Kherson Oblast" + }, + { + "code": "KM", + "name": "Khmelnytskyi Oblast" + }, + { + "code": "CK", + "name": "Cherkasy Oblast" + }, + { + "code": "CH", + "name": "Chernihiv Oblast" + }, + { + "code": "CV", + "name": "Chernivtsi Oblast" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AE", + "name": "United Arab Emirates", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GB", + "name": "United Kingdom (UK)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "US", + "name": "United States (US)", + "states": [{ + "code": "AL", + "name": "Alabama" + }, + { + "code": "AK", + "name": "Alaska" + }, + { + "code": "AZ", + "name": "Arizona" + }, + { + "code": "AR", + "name": "Arkansas" + }, + { + "code": "CA", + "name": "California" + }, + { + "code": "CO", + "name": "Colorado" + }, + { + "code": "CT", + "name": "Connecticut" + }, + { + "code": "DE", + "name": "Delaware" + }, + { + "code": "DC", + "name": "District Of Columbia" + }, + { + "code": "FL", + "name": "Florida" + }, + { + "code": "GA", + "name": "Georgia" + }, + { + "code": "HI", + "name": "Hawaii" + }, + { + "code": "ID", + "name": "Idaho" + }, + { + "code": "IL", + "name": "Illinois" + }, + { + "code": "IN", + "name": "Indiana" + }, + { + "code": "IA", + "name": "Iowa" + }, + { + "code": "KS", + "name": "Kansas" + }, + { + "code": "KY", + "name": "Kentucky" + }, + { + "code": "LA", + "name": "Louisiana" + }, + { + "code": "ME", + "name": "Maine" + }, + { + "code": "MD", + "name": "Maryland" + }, + { + "code": "MA", + "name": "Massachusetts" + }, + { + "code": "MI", + "name": "Michigan" + }, + { + "code": "MN", + "name": "Minnesota" + }, + { + "code": "MS", + "name": "Mississippi" + }, + { + "code": "MO", + "name": "Missouri" + }, + { + "code": "MT", + "name": "Montana" + }, + { + "code": "NE", + "name": "Nebraska" + }, + { + "code": "NV", + "name": "Nevada" + }, + { + "code": "NH", + "name": "New Hampshire" + }, + { + "code": "NJ", + "name": "New Jersey" + }, + { + "code": "NM", + "name": "New Mexico" + }, + { + "code": "NY", + "name": "New York" + }, + { + "code": "NC", + "name": "North Carolina" + }, + { + "code": "ND", + "name": "North Dakota" + }, + { + "code": "OH", + "name": "Ohio" + }, + { + "code": "OK", + "name": "Oklahoma" + }, + { + "code": "OR", + "name": "Oregon" + }, + { + "code": "PA", + "name": "Pennsylvania" + }, + { + "code": "RI", + "name": "Rhode Island" + }, + { + "code": "SC", + "name": "South Carolina" + }, + { + "code": "SD", + "name": "South Dakota" + }, + { + "code": "TN", + "name": "Tennessee" + }, + { + "code": "TX", + "name": "Texas" + }, + { + "code": "UT", + "name": "Utah" + }, + { + "code": "VT", + "name": "Vermont" + }, + { + "code": "VA", + "name": "Virginia" + }, + { + "code": "WA", + "name": "Washington" + }, + { + "code": "WV", + "name": "West Virginia" + }, + { + "code": "WI", + "name": "Wisconsin" + }, + { + "code": "WY", + "name": "Wyoming" + }, + { + "code": "AA", + "name": "Armed Forces (AA)" + }, + { + "code": "AE", + "name": "Armed Forces (AE)" + }, + { + "code": "AP", + "name": "Armed Forces (AP)" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UM", + "name": "United States (US) Minor Outlying Islands", + "states": [{ + "code": 81, + "name": "Baker Island" + }, + { + "code": 84, + "name": "Howland Island" + }, + { + "code": 86, + "name": "Jarvis Island" + }, + { + "code": 67, + "name": "Johnston Atoll" + }, + { + "code": 89, + "name": "Kingman Reef" + }, + { + "code": 71, + "name": "Midway Atoll" + }, + { + "code": 76, + "name": "Navassa Island" + }, + { + "code": 95, + "name": "Palmyra Atoll" + }, + { + "code": 79, + "name": "Wake Island" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UY", + "name": "Uruguay", + "states": [{ + "code": "UY-AR", + "name": "Artigas" + }, + { + "code": "UY-CA", + "name": "Canelones" + }, + { + "code": "UY-CL", + "name": "Cerro Largo" + }, + { + "code": "UY-CO", + "name": "Colonia" + }, + { + "code": "UY-DU", + "name": "Durazno" + }, + { + "code": "UY-FS", + "name": "Flores" + }, + { + "code": "UY-FD", + "name": "Florida" + }, + { + "code": "UY-LA", + "name": "Lavalleja" + }, + { + "code": "UY-MA", + "name": "Maldonado" + }, + { + "code": "UY-MO", + "name": "Montevideo" + }, + { + "code": "UY-PA", + "name": "Paysandú" + }, + { + "code": "UY-RN", + "name": "Río Negro" + }, + { + "code": "UY-RV", + "name": "Rivera" + }, + { + "code": "UY-RO", + "name": "Rocha" + }, + { + "code": "UY-SA", + "name": "Salto" + }, + { + "code": "UY-SJ", + "name": "San José" + }, + { + "code": "UY-SO", + "name": "Soriano" + }, + { + "code": "UY-TA", + "name": "Tacuarembó" + }, + { + "code": "UY-TT", + "name": "Treinta y Tres" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UZ", + "name": "Uzbekistan", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VU", + "name": "Vanuatu", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VA", + "name": "Vatican", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VE", + "name": "Venezuela", + "states": [{ + "code": "VE-A", + "name": "Capital" + }, + { + "code": "VE-B", + "name": "Anzoátegui" + }, + { + "code": "VE-C", + "name": "Apure" + }, + { + "code": "VE-D", + "name": "Aragua" + }, + { + "code": "VE-E", + "name": "Barinas" + }, + { + "code": "VE-F", + "name": "Bolívar" + }, + { + "code": "VE-G", + "name": "Carabobo" + }, + { + "code": "VE-H", + "name": "Cojedes" + }, + { + "code": "VE-I", + "name": "Falcón" + }, + { + "code": "VE-J", + "name": "Guárico" + }, + { + "code": "VE-K", + "name": "Lara" + }, + { + "code": "VE-L", + "name": "Mérida" + }, + { + "code": "VE-M", + "name": "Miranda" + }, + { + "code": "VE-N", + "name": "Monagas" + }, + { + "code": "VE-O", + "name": "Nueva Esparta" + }, + { + "code": "VE-P", + "name": "Portuguesa" + }, + { + "code": "VE-R", + "name": "Sucre" + }, + { + "code": "VE-S", + "name": "Táchira" + }, + { + "code": "VE-T", + "name": "Trujillo" + }, + { + "code": "VE-U", + "name": "Yaracuy" + }, + { + "code": "VE-V", + "name": "Zulia" + }, + { + "code": "VE-W", + "name": "Federal Dependencies" + }, + { + "code": "VE-X", + "name": "La Guaira (Vargas)" + }, + { + "code": "VE-Y", + "name": "Delta Amacuro" + }, + { + "code": "VE-Z", + "name": "Amazonas" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VN", + "name": "Vietnam", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VG", + "name": "Virgin Islands (British)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VI", + "name": "Virgin Islands (US)", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "WF", + "name": "Wallis and Futuna", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "EH", + "name": "Western Sahara", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "YE", + "name": "Yemen", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ZM", + "name": "Zambia", + "states": [{ + "code": "ZM-01", + "name": "Western" + }, + { + "code": "ZM-02", + "name": "Central" + }, + { + "code": "ZM-03", + "name": "Eastern" + }, + { + "code": "ZM-04", + "name": "Luapula" + }, + { + "code": "ZM-05", + "name": "Northern" + }, + { + "code": "ZM-06", + "name": "North-Western" + }, + { + "code": "ZM-07", + "name": "Southern" + }, + { + "code": "ZM-08", + "name": "Copperbelt" + }, + { + "code": "ZM-09", + "name": "Lusaka" + }, + { + "code": "ZM-10", + "name": "Muchinga" + } + ], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ZW", + "name": "Zimbabwe", + "states": [], + "_links": { + "self": [{ + "href": expect.any(String) + }], + "collection": [{ + "href": expect.any(String) + }] + } + }) + ])); + }); + + test('can view country data', async ({ + request + }) => { + // call API to retrieve a specific country data + const response = await request.get('/wp-json/wc/v3/data/countries/au'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(false); + + expect(responseJSON).toEqual( + expect.objectContaining({ + "code": "AU", + "name": "Australia", + "states": [{ + "code": "ACT", + "name": "Australian Capital Territory" + }, + { + "code": "NSW", + "name": "New South Wales" + }, + { + "code": "NT", + "name": "Northern Territory" + }, + { + "code": "QLD", + "name": "Queensland" + }, + { + "code": "SA", + "name": "South Australia" + }, + { + "code": "TAS", + "name": "Tasmania" + }, + { + "code": "VIC", + "name": "Victoria" + }, + { + "code": "WA", + "name": "Western Australia" + } + ], + }) + ); + }); + + test('can view all currencies', async ({ + request + }) => { + // call API to retrieve all currencies + const response = await request.get('/wp-json/wc/v3/data/currencies'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AED", + "name": "United Arab Emirates dirham", + "symbol": "د.إ", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AED") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AFN", + "name": "Afghan afghani", + "symbol": "؋", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AFN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ALL", + "name": "Albanian lek", + "symbol": "L", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ALL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AMD", + "name": "Armenian dram", + "symbol": "AMD", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AMD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ANG", + "name": "Netherlands Antillean guilder", + "symbol": "ƒ", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ANG") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AOA", + "name": "Angolan kwanza", + "symbol": "Kz", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AOA") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ARS", + "name": "Argentine peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ARS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AUD", + "name": "Australian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AUD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AWG", + "name": "Aruban florin", + "symbol": "Afl.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AWG") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "AZN", + "name": "Azerbaijani manat", + "symbol": "AZN", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/AZN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BAM", + "name": "Bosnia and Herzegovina convertible mark", + "symbol": "KM", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BAM") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BBD", + "name": "Barbadian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BBD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BDT", + "name": "Bangladeshi taka", + "symbol": "৳ ", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BDT") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BGN", + "name": "Bulgarian lev", + "symbol": "лв.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BGN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BHD", + "name": "Bahraini dinar", + "symbol": ".د.ب", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BHD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BIF", + "name": "Burundian franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BIF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BMD", + "name": "Bermudian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BMD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BND", + "name": "Brunei dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BND") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BOB", + "name": "Bolivian boliviano", + "symbol": "Bs.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BOB") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BRL", + "name": "Brazilian real", + "symbol": "R$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BRL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BSD", + "name": "Bahamian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BSD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BTC", + "name": "Bitcoin", + "symbol": "฿", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BTC") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BTN", + "name": "Bhutanese ngultrum", + "symbol": "Nu.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BTN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BWP", + "name": "Botswana pula", + "symbol": "P", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BWP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BYR", + "name": "Belarusian ruble (old)", + "symbol": "Br", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BYR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BYN", + "name": "Belarusian ruble", + "symbol": "Br", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BYN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "BZD", + "name": "Belize dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/BZD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CAD", + "name": "Canadian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CAD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CDF", + "name": "Congolese franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CDF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CHF", + "name": "Swiss franc", + "symbol": "CHF", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CHF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CLP", + "name": "Chilean peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CLP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CNY", + "name": "Chinese yuan", + "symbol": "¥", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CNY") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "COP", + "name": "Colombian peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/COP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CRC", + "name": "Costa Rican colón", + "symbol": "₡", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CRC") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CUC", + "name": "Cuban convertible peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CUC") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CUP", + "name": "Cuban peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CUP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CVE", + "name": "Cape Verdean escudo", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CVE") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "CZK", + "name": "Czech koruna", + "symbol": "Kč", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/CZK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DJF", + "name": "Djiboutian franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/DJF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DKK", + "name": "Danish krone", + "symbol": "kr.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/DKK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DOP", + "name": "Dominican peso", + "symbol": "RD$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/DOP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "DZD", + "name": "Algerian dinar", + "symbol": "د.ج", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/DZD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "EGP", + "name": "Egyptian pound", + "symbol": "EGP", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/EGP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ERN", + "name": "Eritrean nakfa", + "symbol": "Nfk", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ERN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ETB", + "name": "Ethiopian birr", + "symbol": "Br", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ETB") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "EUR", + "name": "Euro", + "symbol": "€", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/EUR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FJD", + "name": "Fijian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/FJD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "FKP", + "name": "Falkland Islands pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/FKP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GBP", + "name": "Pound sterling", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GBP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GEL", + "name": "Georgian lari", + "symbol": "₾", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GEL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GGP", + "name": "Guernsey pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GGP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GHS", + "name": "Ghana cedi", + "symbol": "₵", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GHS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GIP", + "name": "Gibraltar pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GIP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GMD", + "name": "Gambian dalasi", + "symbol": "D", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GMD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GNF", + "name": "Guinean franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GNF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GTQ", + "name": "Guatemalan quetzal", + "symbol": "Q", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GTQ") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "GYD", + "name": "Guyanese dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/GYD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HKD", + "name": "Hong Kong dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/HKD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HNL", + "name": "Honduran lempira", + "symbol": "L", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/HNL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HRK", + "name": "Croatian kuna", + "symbol": "kn", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/HRK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HTG", + "name": "Haitian gourde", + "symbol": "G", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/HTG") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "HUF", + "name": "Hungarian forint", + "symbol": "Ft", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/HUF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IDR", + "name": "Indonesian rupiah", + "symbol": "Rp", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/IDR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ILS", + "name": "Israeli new shekel", + "symbol": "₪", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ILS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IMP", + "name": "Manx pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/IMP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "INR", + "name": "Indian rupee", + "symbol": "₹", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/INR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IQD", + "name": "Iraqi dinar", + "symbol": "د.ع", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/IQD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IRR", + "name": "Iranian rial", + "symbol": "﷼", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/IRR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "IRT", + "name": "Iranian toman", + "symbol": "تومان", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/IRT") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ISK", + "name": "Icelandic króna", + "symbol": "kr.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ISK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JEP", + "name": "Jersey pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/JEP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JMD", + "name": "Jamaican dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/JMD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JOD", + "name": "Jordanian dinar", + "symbol": "د.ا", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/JOD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "JPY", + "name": "Japanese yen", + "symbol": "¥", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/JPY") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KES", + "name": "Kenyan shilling", + "symbol": "KSh", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KES") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KGS", + "name": "Kyrgyzstani som", + "symbol": "сом", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KGS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KHR", + "name": "Cambodian riel", + "symbol": "៛", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KHR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KMF", + "name": "Comorian franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KMF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KPW", + "name": "North Korean won", + "symbol": "₩", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KPW") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KRW", + "name": "South Korean won", + "symbol": "₩", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KRW") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KWD", + "name": "Kuwaiti dinar", + "symbol": "د.ك", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KWD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KYD", + "name": "Cayman Islands dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KYD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "KZT", + "name": "Kazakhstani tenge", + "symbol": "₸", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/KZT") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LAK", + "name": "Lao kip", + "symbol": "₭", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/LAK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LBP", + "name": "Lebanese pound", + "symbol": "ل.ل", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/LBP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LKR", + "name": "Sri Lankan rupee", + "symbol": "රු", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/LKR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LRD", + "name": "Liberian dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/LRD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LSL", + "name": "Lesotho loti", + "symbol": "L", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/LSL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "LYD", + "name": "Libyan dinar", + "symbol": "ل.د", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/LYD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MAD", + "name": "Moroccan dirham", + "symbol": "د.م.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MAD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MDL", + "name": "Moldovan leu", + "symbol": "MDL", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MDL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MGA", + "name": "Malagasy ariary", + "symbol": "Ar", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MGA") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MKD", + "name": "Macedonian denar", + "symbol": "ден", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MKD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MMK", + "name": "Burmese kyat", + "symbol": "Ks", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MMK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MNT", + "name": "Mongolian tögrög", + "symbol": "₮", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MNT") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MOP", + "name": "Macanese pataca", + "symbol": "P", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MOP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MRU", + "name": "Mauritanian ouguiya", + "symbol": "UM", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MRU") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MUR", + "name": "Mauritian rupee", + "symbol": "₨", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MUR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MVR", + "name": "Maldivian rufiyaa", + "symbol": ".ރ", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MVR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MWK", + "name": "Malawian kwacha", + "symbol": "MK", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MWK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MXN", + "name": "Mexican peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MXN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MYR", + "name": "Malaysian ringgit", + "symbol": "RM", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MYR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "MZN", + "name": "Mozambican metical", + "symbol": "MT", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/MZN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NAD", + "name": "Namibian dollar", + "symbol": "N$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/NAD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NGN", + "name": "Nigerian naira", + "symbol": "₦", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/NGN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NIO", + "name": "Nicaraguan córdoba", + "symbol": "C$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/NIO") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NOK", + "name": "Norwegian krone", + "symbol": "kr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/NOK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NPR", + "name": "Nepalese rupee", + "symbol": "₨", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/NPR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "NZD", + "name": "New Zealand dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/NZD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "OMR", + "name": "Omani rial", + "symbol": "ر.ع.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/OMR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PAB", + "name": "Panamanian balboa", + "symbol": "B/.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PAB") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PEN", + "name": "Sol", + "symbol": "S/", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PEN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PGK", + "name": "Papua New Guinean kina", + "symbol": "K", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PGK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PHP", + "name": "Philippine peso", + "symbol": "₱", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PHP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PKR", + "name": "Pakistani rupee", + "symbol": "₨", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PKR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PLN", + "name": "Polish złoty", + "symbol": "zł", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PLN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PRB", + "name": "Transnistrian ruble", + "symbol": "р.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PRB") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "PYG", + "name": "Paraguayan guaraní", + "symbol": "₲", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/PYG") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "QAR", + "name": "Qatari riyal", + "symbol": "ر.ق", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/QAR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RON", + "name": "Romanian leu", + "symbol": "lei", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/RON") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RSD", + "name": "Serbian dinar", + "symbol": "рсд", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/RSD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RUB", + "name": "Russian ruble", + "symbol": "₽", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/RUB") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "RWF", + "name": "Rwandan franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/RWF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SAR", + "name": "Saudi riyal", + "symbol": "ر.س", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SAR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SBD", + "name": "Solomon Islands dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SBD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SCR", + "name": "Seychellois rupee", + "symbol": "₨", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SCR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SDG", + "name": "Sudanese pound", + "symbol": "ج.س.", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SDG") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SEK", + "name": "Swedish krona", + "symbol": "kr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SEK") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SGD", + "name": "Singapore dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SGD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SHP", + "name": "Saint Helena pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SHP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SLL", + "name": "Sierra Leonean leone", + "symbol": "Le", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SLL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SOS", + "name": "Somali shilling", + "symbol": "Sh", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SOS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SRD", + "name": "Surinamese dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SRD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SSP", + "name": "South Sudanese pound", + "symbol": "£", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SSP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "STN", + "name": "São Tomé and Príncipe dobra", + "symbol": "Db", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/STN") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SYP", + "name": "Syrian pound", + "symbol": "ل.س", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SYP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "SZL", + "name": "Swazi lilangeni", + "symbol": "E", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/SZL") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "THB", + "name": "Thai baht", + "symbol": "฿", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/THB") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TJS", + "name": "Tajikistani somoni", + "symbol": "ЅМ", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TJS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TMT", + "name": "Turkmenistan manat", + "symbol": "m", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TMT") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TND", + "name": "Tunisian dinar", + "symbol": "د.ت", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TND") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TOP", + "name": "Tongan paʻanga", + "symbol": "T$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TOP") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TRY", + "name": "Turkish lira", + "symbol": "₺", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TRY") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TTD", + "name": "Trinidad and Tobago dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TTD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TWD", + "name": "New Taiwan dollar", + "symbol": "NT$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TWD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "TZS", + "name": "Tanzanian shilling", + "symbol": "Sh", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/TZS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UAH", + "name": "Ukrainian hryvnia", + "symbol": "₴", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/UAH") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UGX", + "name": "Ugandan shilling", + "symbol": "UGX", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/UGX") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "USD", + "name": "United States (US) dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/USD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UYU", + "name": "Uruguayan peso", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/UYU") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "UZS", + "name": "Uzbekistani som", + "symbol": "UZS", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/UZS") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VEF", + "name": "Venezuelan bolívar", + "symbol": "Bs F", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/VEF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VES", + "name": "Bolívar soberano", + "symbol": "Bs.S", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/VES") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VND", + "name": "Vietnamese đồng", + "symbol": "₫", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/VND") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "VUV", + "name": "Vanuatu vatu", + "symbol": "Vt", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/VUV") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "WST", + "name": "Samoan tālā", + "symbol": "T", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/WST") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "XAF", + "name": "Central African CFA franc", + "symbol": "CFA", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/XAF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "XCD", + "name": "East Caribbean dollar", + "symbol": "$", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/XCD") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "XOF", + "name": "West African CFA franc", + "symbol": "CFA", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/XOF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "XPF", + "name": "CFP franc", + "symbol": "Fr", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/XPF") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "YER", + "name": "Yemeni rial", + "symbol": "﷼", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/YER") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ZAR", + "name": "South African rand", + "symbol": "R", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ZAR") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": "ZMW", + "name": "Zambian kwacha", + "symbol": "ZK", + "_links": { + "self": [{ + "href": expect.stringContaining("data/currencies/ZMW") + }], + "collection": [{ + "href": expect.stringContaining("data/currencies") + }] + } + }) + ])); + }); + + test('can view currency data', async ({ + request + }) => { + // call API to retrieve a specific currency data + const response = await request.get('/wp-json/wc/v3/data/currencies/fkp'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(false); + + expect(responseJSON).toEqual( + expect.objectContaining({ + "code": "FKP", + "name": "Falkland Islands pound", + "symbol": "£" + })); + }); + + test('can view current currency', async ({ + request + }) => { + // call API to retrieve current currency data + const response = await request.get('/wp-json/wc/v3/data/currencies/current'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(false); + + expect(responseJSON).toEqual( + expect.objectContaining({ + "code": "USD", + "name": "United States (US) dollar", + "symbol": "$", + })); + }); +}); From 20bb576fb605b4ff4bb1ff12c4b4713ffc66453f Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Mon, 31 Oct 2022 12:29:43 -0700 Subject: [PATCH 0010/1680] Restore previously installed pnpm version (#35389) --- tools/code-analyzer/src/lib/scan-changes.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tools/code-analyzer/src/lib/scan-changes.ts b/tools/code-analyzer/src/lib/scan-changes.ts index 5042db58785..4ed137f97d3 100644 --- a/tools/code-analyzer/src/lib/scan-changes.ts +++ b/tools/code-analyzer/src/lib/scan-changes.ts @@ -70,6 +70,9 @@ export const scanForChanges = async ( ); const packageJSON = JSON.parse( fileStr ); + // Temporarily save the current PNPM version. + await execAsync( `tmpgPNPM="$(pnpm --version)"` ); + if ( packageJSON.engines && packageJSON.engines.pnpm ) { await execAsync( `npm i -g pnpm@${ packageJSON.engines.pnpm }`, @@ -101,6 +104,9 @@ export const scanForChanges = async ( schemaChanges = schemaDiff || []; + // Restore the previously saved PNPM version + await execAsync( `npm i -g pnpm@"$tmpgPNPM"` ); + Logger.endTask(); } From 1b2a94b030b8ca465a8fbcd76350d02c076e5eee Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Mon, 31 Oct 2022 20:01:21 +0000 Subject: [PATCH 0011/1680] add/a2p reports api-core-tests (#35388) add reports api-core-tests --- .../add-api-core-tests-reports-crud-tests | 4 + .../payment-gateways-crud.test.js | 3 - .../tests/reports/reports-crud.test.js | 407 ++++++++++++++++++ 3 files changed, 411 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-api-core-tests-reports-crud-tests create mode 100644 plugins/woocommerce/tests/api-core-tests/tests/reports/reports-crud.test.js diff --git a/plugins/woocommerce/changelog/add-api-core-tests-reports-crud-tests b/plugins/woocommerce/changelog/add-api-core-tests-reports-crud-tests new file mode 100644 index 00000000000..ded7697523f --- /dev/null +++ b/plugins/woocommerce/changelog/add-api-core-tests-reports-crud-tests @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Add playwright api-core-tests for reports crud operations \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js index fb7ef68bf0a..f1e83fe7dba 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js @@ -2,9 +2,6 @@ const { test, expect } = require('@playwright/test'); -const { - refund -} = require('../../data'); /** * Tests for the WooCommerce Refunds API. diff --git a/plugins/woocommerce/tests/api-core-tests/tests/reports/reports-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/reports/reports-crud.test.js new file mode 100644 index 00000000000..2766df5af22 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/tests/reports/reports-crud.test.js @@ -0,0 +1,407 @@ +const { + test, + expect +} = require('@playwright/test'); + +/** + * Tests for the WooCommerce Refunds API. + * + * @group api + * @group reports + * + */ +test.describe('Reports API tests', () => { + + test('can view all reports', async ({ + request + }) => { + // call API to retrieve the reports + const response = await request.get('/wp-json/wc/v3/reports'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "sales", + "description": "List of sales reports.", + }) + ])); + }); + + test('can view sales reports', async ({ + request + }) => { + // call API to retrieve the sales reports + const response = await request.get('/wp-json/wc/v3/reports/sales'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + const today = new Date(); + const dd = String(today.getDate()).padStart(2, '0'); + const mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0! + const yyyy = today.getFullYear(); + const dateString = yyyy + '-' + mm + '-' + dd; + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "total_sales": expect.any(String), + "net_sales": expect.any(String), + "average_sales": expect.any(String), + "total_orders": expect.any(Number), + "total_items": expect.any(Number), + "total_tax": expect.any(String), + "total_shipping": expect.any(String), + "total_refunds": expect.any(Number), + "total_discount": expect.any(String), + "totals_grouped_by": "day", + "totals": expect.objectContaining({ + [dateString]: { + "sales": expect.any(String), + "orders": expect.any(Number), + "items": expect.any(Number), + "tax": expect.any(String), + "shipping": expect.any(String), + "discount": expect.any(String), + "customers": expect.any(Number) + } + }), + "total_customers": expect.any(Number), + }) + ])); + }); + + test('can view top sellers reports', async ({ + request + }) => { + // call API to retrieve the top sellers + const response = await request.get('/wp-json/wc/v3/reports/top_sellers'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([])); + }); + + test('can view coupons totals', async ({ + request + }) => { + // call API to retrieve the coupons totals + const response = await request.get('/wp-json/wc/v3/reports/coupons/totals'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "percent", + "name": "Percentage discount", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "fixed_cart", + "name": "Fixed cart discount", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "fixed_product", + "name": "Fixed product discount", + "total": expect.any(Number) + }) + ])); + }); + + test('can view customers totals', async ({ + request + }) => { + // call API to retrieve the customers totals + const response = await request.get('/wp-json/wc/v3/reports/customers/totals'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "paying", + "name": "Paying customer", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "non_paying", + "name": "Non-paying customer", + "total": expect.any(Number) + }) + ])); + }); + + test('can view orders totals', async ({ + request + }) => { + // call API to retrieve the orders totals + const response = await request.get('/wp-json/wc/v3/reports/orders/totals'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "pending", + "name": "Pending payment", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "processing", + "name": "Processing", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "on-hold", + "name": "On hold", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "completed", + "name": "Completed", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "cancelled", + "name": "Cancelled", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "refunded", + "name": "Refunded", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "failed", + "name": "Failed", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "checkout-draft", + "name": "Draft", + "total": expect.any(Number) + }) + ])); + }); + + test('can view products totals', async ({ + request + }) => { + // call API to retrieve the products totals + const response = await request.get('/wp-json/wc/v3/reports/products/totals'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "external", + "name": "External/Affiliate product", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "grouped", + "name": "Grouped product", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "simple", + "name": "Simple product", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "variable", + "name": "Variable product", + "total": expect.any(Number) + }) + ])); + }); + + test('can view reviews totals', async ({ + request + }) => { + // call API to retrieve the reviews totals + const response = await request.get('/wp-json/wc/v3/reports/reviews/totals'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "rated_1_out_of_5", + "name": "Rated 1 out of 5", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "rated_2_out_of_5", + "name": "Rated 2 out of 5", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "rated_3_out_of_5", + "name": "Rated 3 out of 5", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "rated_4_out_of_5", + "name": "Rated 4 out of 5", + "total": expect.any(Number) + }) + ])); + expect(responseJSON).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + "slug": "rated_5_out_of_5", + "name": "Rated 5 out of 5", + "total": expect.any(Number) + }) + ])); + }); +}); From aea554bcdb5d248ebbbcbee230bbc2ca17017dc4 Mon Sep 17 00:00:00 2001 From: louwie17 Date: Mon, 31 Oct 2022 17:11:31 -0300 Subject: [PATCH 0012/1680] Fix/form ts error (#35394) * Fix forwardRef type in the Form component * Add changelog * Revert type changes --- packages/js/components/changelog/fix-form_ts_error | 4 ++++ packages/js/components/src/form/form-context.ts | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 packages/js/components/changelog/fix-form_ts_error diff --git a/packages/js/components/changelog/fix-form_ts_error b/packages/js/components/changelog/fix-form_ts_error new file mode 100644 index 00000000000..fc0ec73f0ee --- /dev/null +++ b/packages/js/components/changelog/fix-form_ts_error @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Update variable name within useFormContext. diff --git a/packages/js/components/src/form/form-context.ts b/packages/js/components/src/form/form-context.ts index be43a98a9d6..d7ca500810d 100644 --- a/packages/js/components/src/form/form-context.ts +++ b/packages/js/components/src/form/form-context.ts @@ -58,7 +58,7 @@ export const FormContext = createContext< FormContext< any > >( // eslint-disable-next-line @typescript-eslint/no-explicit-any export function useFormContext< Values extends Record< string, any > >() { - const formik = useContext< FormContext< Values > >( FormContext ); + const formContext = useContext< FormContext< Values > >( FormContext ); - return formik; + return formContext; } From 2355822ec5846d8895585327005c0bc775fd7255 Mon Sep 17 00:00:00 2001 From: Barry Hughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 31 Oct 2022 14:12:14 -0700 Subject: [PATCH 0013/1680] Ensure the HPOS/COT order status correctly tracks the CPT order status (#35402) Ensure the HPOS/COT order status correctly tracks the CPT order status (during manual order creation). * Linting. * Address coding standards (no need to prepare the query when there are no placeholders). * Woops! Restore use of `$wpdb->prepare()`, add phpcs:ignore rule. --- .../fix-35360-sync-on-manual-order-creation | 4 ++ .../DataStores/Orders/DataSynchronizer.php | 5 +- .../Orders/DataSynchronizerTests.php | 46 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation diff --git a/plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation b/plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation new file mode 100644 index 00000000000..c95d2cefa8a --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +When HPOS is enabled, posts are authoritative, and sync is enabled, ensure the HPOS record correctly tracks the CPT order record. diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php index 39b9b02ca02..b4849201ae2 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php @@ -68,6 +68,7 @@ class DataSynchronizer implements BatchProcessorInterface { */ public function __construct() { self::add_action( 'deleted_post', array( $this, 'handle_deleted_post' ), 10, 2 ); + self::add_action( 'woocommerce_new_order', array( $this, 'handle_updated_order' ), 100 ); self::add_action( 'woocommerce_update_order', array( $this, 'handle_updated_order' ), 100 ); self::add_filter( 'woocommerce_feature_description_tip', array( $this, 'handle_feature_description_tip' ), 10, 3 ); } @@ -255,7 +256,9 @@ SELECT( // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared switch ( $type ) { case self::ID_TYPE_MISSING_IN_ORDERS_TABLE: - $sql = $wpdb->prepare(" + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare -- $order_post_type_placeholders is prepared. + $sql = $wpdb->prepare( + " SELECT posts.ID FROM $wpdb->posts posts LEFT JOIN $orders_table orders ON posts.ID = orders.id WHERE diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php index f073b7c8076..e64999ec1f9 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php @@ -146,4 +146,50 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { 'The order was successfully copied to the COT table, outside of a dedicated synchronization batch.' ); } + + /** + * When sync is enbabled and the posts store is authoritative, creating an order and updating the status from + * draft to some non-draft status (as happens when an order is manually created in the admin environment) should + * result in the same status change being made in the duplicate COT record. + */ + public function test_status_syncs_correctly_after_order_creation() { + global $wpdb; + $orders_table = OrdersTableDataStore::get_orders_table_name(); + + // Enable sync, make the posts table authoritative. + update_option( $this->sut::ORDERS_DATA_SYNC_ENABLED_OPTION, 'yes' ); + update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'no' ); + + // When a new order is manually created in the admin environment, WordPress automatically creates an empty + // draft post for us. + $order_id = (int) wp_insert_post( + array( + 'post_type' => 'shop_order', + 'post_status' => 'draft', + ) + ); + + // Once the admin user decides to go ahead and save the order (ie, they click 'Create'), we start performing + // various updates to the order record. + wc_get_order( $order_id )->save(); + + // As soon as the order is saved via our own internal API, the DataSynchronizer should create a copy of the + // record in the COT table. + $this->assertEquals( + 'draft', + $wpdb->get_var( "SELECT status FROM $orders_table WHERE id = $order_id" ), // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + 'When HPOS is enabled but the posts data store is authoritative, saving an order will result in a duplicate with the same status being saved in the COT table.' + ); + + // In a separate operation, the status will be updated to an actual non-draft order status. This should also be + // observed by the DataSynchronizer and a further update made to the COT table. + $order = wc_get_order( $order_id ); + $order->set_status( 'pending' ); + $order->save(); + $this->assertEquals( + 'wc-pending', + $wpdb->get_var( "SELECT status FROM $orders_table WHERE id = $order_id" ), //phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + 'When the order status is updated, the change should be observed by the DataSynhronizer and a matching update will take place in the COT table.' + ); + } } From 66370c823f31865040e7863374b7425415afed4e Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Mon, 31 Oct 2022 14:36:33 -0700 Subject: [PATCH 0014/1680] Add inventory advanced section (#35164) * Add sold individually inventory option * Add backorder purchase options * Add margin around collapsible content areas * Add changelog entry * Add tests around inventory section * Fix up checkbox props after rebase * Check for disabled track quantity toggle * Update manage stock test * Fix nested radio control label margin --- .../products/layout/product-form-layout.scss | 3 +- .../layout/product-section-layout.scss | 4 + .../advanced-stock-section.tsx | 64 +++++++ .../product-inventory-section.tsx | 14 +- .../test/product-inventory-section.spec.tsx | 176 ++++++++++++++++++ plugins/woocommerce/changelog/add-34389 | 4 + 6 files changed, 260 insertions(+), 5 deletions(-) create mode 100644 plugins/woocommerce-admin/client/products/sections/product-inventory-section/advanced-stock-section.tsx create mode 100644 plugins/woocommerce-admin/client/products/sections/product-inventory-section/test/product-inventory-section.spec.tsx create mode 100644 plugins/woocommerce/changelog/add-34389 diff --git a/plugins/woocommerce-admin/client/products/layout/product-form-layout.scss b/plugins/woocommerce-admin/client/products/layout/product-form-layout.scss index 06772f0b89b..10288998954 100644 --- a/plugins/woocommerce-admin/client/products/layout/product-form-layout.scss +++ b/plugins/woocommerce-admin/client/products/layout/product-form-layout.scss @@ -11,7 +11,8 @@ text-transform: none; } - .components-card__body h4:first-child { + .components-card__body h4:first-child, + .components-radio-control:first-child .components-base-control__label { margin-top: 0; } diff --git a/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss b/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss index 87bb136736c..15b02e61f1f 100644 --- a/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss +++ b/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss @@ -32,6 +32,10 @@ .components-radio-control .components-v-stack { gap: $gap-small; } + + .woocommerce-collapsible-content { + margin-top: $gap-large; + } } &__header { diff --git a/plugins/woocommerce-admin/client/products/sections/product-inventory-section/advanced-stock-section.tsx b/plugins/woocommerce-admin/client/products/sections/product-inventory-section/advanced-stock-section.tsx new file mode 100644 index 00000000000..957d31a84b8 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/sections/product-inventory-section/advanced-stock-section.tsx @@ -0,0 +1,64 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { CheckboxControl, RadioControl } from '@wordpress/components'; +import { Product } from '@woocommerce/data'; +import { useFormContext } from '@woocommerce/components'; + +/** + * Internal dependencies + */ +import { getCheckboxTracks } from '../utils'; + +export const AdvancedStockSection: React.FC = () => { + const { getCheckboxControlProps, getInputProps, values } = + useFormContext< Product >(); + + const backordersProp = getInputProps( 'backorders' ); + // These properties cause issues with the RadioControl component. + // A fix to form upstream would help if we can identify what type of input is used. + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + delete backordersProp.checked; + delete backordersProp.value; + + return ( + <> + { values.manage_stock && ( + + ) } +

{ __( 'Restrictions', 'woocommerce' ) }

+ + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/sections/product-inventory-section/product-inventory-section.tsx b/plugins/woocommerce-admin/client/products/sections/product-inventory-section/product-inventory-section.tsx index 74a1e23d98f..a7d2c01b5a1 100644 --- a/plugins/woocommerce-admin/client/products/sections/product-inventory-section/product-inventory-section.tsx +++ b/plugins/woocommerce-admin/client/products/sections/product-inventory-section/product-inventory-section.tsx @@ -3,14 +3,11 @@ */ import { __ } from '@wordpress/i18n'; import { + CollapsibleContent, __experimentalConditionalWrapper as ConditionalWrapper, Link, useFormContext, } from '@woocommerce/components'; -import { cloneElement } from '@wordpress/element'; -import { getAdminLink } from '@woocommerce/settings'; -import { Product } from '@woocommerce/data'; -import { recordEvent } from '@woocommerce/tracks'; import { Card, CardBody, @@ -18,10 +15,14 @@ import { TextControl, Tooltip, } from '@wordpress/components'; +import { getAdminLink } from '@woocommerce/settings'; +import { Product } from '@woocommerce/data'; +import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies */ +import { AdvancedStockSection } from './advanced-stock-section'; import { getCheckboxTracks } from '../utils'; import { getAdminSetting } from '~/utils/admin-settings'; import { ProductSectionLayout } from '../../layout/product-section-layout'; @@ -109,6 +110,11 @@ export const ProductInventorySection: React.FC = () => { ) : ( ) } + + + diff --git a/plugins/woocommerce-admin/client/products/sections/product-inventory-section/test/product-inventory-section.spec.tsx b/plugins/woocommerce-admin/client/products/sections/product-inventory-section/test/product-inventory-section.spec.tsx new file mode 100644 index 00000000000..a3c80a454b5 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/sections/product-inventory-section/test/product-inventory-section.spec.tsx @@ -0,0 +1,176 @@ +/** + * External dependencies + */ +import { Form } from '@woocommerce/components'; +import { Product } from '@woocommerce/data'; +import { render, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +/** + * Internal dependencies + */ +import { getAdminSetting } from '~/utils/admin-settings'; +import { ProductInventorySection } from '../'; + +jest.mock( '@woocommerce/tracks', () => ( { recordEvent: jest.fn() } ) ); +jest.mock( '~/utils/admin-settings', () => ( { + getAdminSetting: jest.fn(), +} ) ); + +describe( 'ProductInventorySection', () => { + beforeEach( () => { + jest.clearAllMocks(); + ( getAdminSetting as jest.Mock ).mockImplementation( + ( key, value = false ) => { + const values = { + manageStock: 'yes', + notifyLowStockAmount: 5, + }; + if ( values.hasOwnProperty( key ) ) { + return values[ key as keyof typeof values ]; + } + return value; + } + ); + } ); + + const product: Partial< Product > = { + id: 1, + name: 'Lorem', + slug: 'lorem', + manage_stock: false, + }; + + it( 'should render the sku field', () => { + render( +
+ + + ); + + expect( + screen.getByLabelText( 'SKU (Stock Keeping Unit)' ) + ).toBeInTheDocument(); + } ); + + it( 'should disable the manage stock section if inventory management is turned off', () => { + ( getAdminSetting as jest.Mock ).mockImplementation( ( key, value ) => { + const values = { + manageStock: 'no', + }; + if ( values.hasOwnProperty( key ) ) { + return values[ key as keyof typeof values ]; + } + return value; + } ); + + render( +
+ + + ); + + expect( + screen.getByText( 'Track quantity for this product' ) + .previousSibling + ).toHaveClass( 'is-disabled' ); + } ); + + it( 'should not disable the manage stock section if inventory management is turned on', () => { + render( +
+ + + ); + + expect( + screen.getByText( 'Track quantity for this product' ) + .previousSibling + ).not.toHaveClass( 'is-disabled' ); + } ); + + it( 'should render the quantity field when product stock is being managed', () => { + render( +
+ + + ); + + expect( + screen.getByLabelText( 'Current quantity' ) + ).toBeInTheDocument(); + } ); + + it( 'should not render the quantity field when product stock is not being managed', () => { + render( +
+ + + ); + + expect( + screen.queryByLabelText( 'Current quantity' ) + ).not.toBeInTheDocument(); + } ); + + it( 'should render the default low stock amount in placeholder', () => { + render( +
+ + + ); + + expect( + screen.getByPlaceholderText( '5 (store default)' ) + ).toBeInTheDocument(); + } ); + + it( 'should not render the advanced section until clicked', () => { + render( +
+ + + ); + + expect( + screen.queryByLabelText( 'Limit purchases to 1 item per order' ) + ).not.toBeInTheDocument(); + } ); + + it( 'should render the advanced section after clicked', () => { + render( +
+ + + ); + + userEvent.click( screen.getByText( 'Advanced' ) ); + expect( + screen.getByLabelText( 'Limit purchases to 1 item per order' ) + ).toBeInTheDocument(); + } ); + + it( 'should not allow backorder settings when not managing stock', () => { + render( +
+ + + ); + + userEvent.click( screen.getByText( 'Advanced' ) ); + expect( + screen.queryByText( 'When out of stock' ) + ).not.toBeInTheDocument(); + } ); + + it( 'should allow backorder settings when managing stock', () => { + render( +
+ + + ); + + userEvent.click( screen.getByText( 'Advanced' ) ); + expect( screen.queryByText( 'When out of stock' ) ).toBeInTheDocument(); + } ); +} ); diff --git a/plugins/woocommerce/changelog/add-34389 b/plugins/woocommerce/changelog/add-34389 new file mode 100644 index 00000000000..abd13470fa6 --- /dev/null +++ b/plugins/woocommerce/changelog/add-34389 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product inventory advanced section From e1ebabba29082e24256ceca629cc19779820773c Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Mon, 31 Oct 2022 14:36:54 -0700 Subject: [PATCH 0015/1680] Fix up rich text editor initial selection and add blocks (#35286) * Fix double click toolbar behavior * Fix initial block selection on editor load * Add placeholder option to RichTextEditor * Add image and video blocks * Set toolbar height * Allow inserter to be shown * Allow media uploads in rich text editor * Add changelog entries * Fix media upload * Check for existence of selected blocks before checking length * Pass blocks to avoid race in detecting initially empty blocks --- .../changelog/fix-rich-text-editor-selection | 4 ++ .../rich-text-editor/editor-writing-flow.tsx | 41 +++++++++++------- .../src/rich-text-editor/rich-text-editor.tsx | 42 ++++++++++++++----- .../src/rich-text-editor/style.scss | 30 ++++++------- .../rich-text-editor/utils/register-blocks.ts | 4 ++ .../sections/product-details-section.tsx | 4 ++ .../changelog/fix-rich-text-editor-selection | 4 ++ 7 files changed, 90 insertions(+), 39 deletions(-) create mode 100644 packages/js/components/changelog/fix-rich-text-editor-selection create mode 100644 plugins/woocommerce/changelog/fix-rich-text-editor-selection diff --git a/packages/js/components/changelog/fix-rich-text-editor-selection b/packages/js/components/changelog/fix-rich-text-editor-selection new file mode 100644 index 00000000000..59caa9a16d8 --- /dev/null +++ b/packages/js/components/changelog/fix-rich-text-editor-selection @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Fix up initial block selection in RichTextEditor and add media blocks diff --git a/packages/js/components/src/rich-text-editor/editor-writing-flow.tsx b/packages/js/components/src/rich-text-editor/editor-writing-flow.tsx index b56a6ef08fd..2734c566484 100644 --- a/packages/js/components/src/rich-text-editor/editor-writing-flow.tsx +++ b/packages/js/components/src/rich-text-editor/editor-writing-flow.tsx @@ -3,8 +3,8 @@ */ import { useSelect, useDispatch } from '@wordpress/data'; import { useInstanceId } from '@wordpress/compose'; +import { BlockInstance, createBlock } from '@wordpress/blocks'; import { createElement, useEffect } from '@wordpress/element'; -import { createBlock } from '@wordpress/blocks'; import { BlockList, ObserveTyping, @@ -15,37 +15,50 @@ import { WritingFlow, } from '@wordpress/block-editor'; -export const EditorWritingFlow: React.VFC = () => { +type EditorWritingFlowProps = { + blocks: BlockInstance[]; + onChange: ( changes: BlockInstance[] ) => void; + placeholder?: string; +}; + +export const EditorWritingFlow = ( { + blocks, + onChange, + placeholder = '', +}: EditorWritingFlowProps ) => { const instanceId = useInstanceId( EditorWritingFlow ); + const firstBlock = blocks[ 0 ]; + const isEmpty = ! blocks.length; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore This action is available in the block editor data store. - const { insertBlock } = useDispatch( blockEditorStore ); - - const { isEmpty } = useSelect( ( select ) => { - const blocks = select( 'core/block-editor' ).getBlocks(); - + const { insertBlock, selectBlock } = useDispatch( blockEditorStore ); + const { selectedBlockClientIds } = useSelect( ( select ) => { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore This selector is available in the block editor data store. const { getSelectedBlockClientIds } = select( blockEditorStore ); return { - isEmpty: blocks.length - ? blocks.length <= 1 && - blocks[ 0 ].attributes?.content?.trim() === '' - : true, - firstBlock: blocks[ 0 ], selectedBlockClientIds: getSelectedBlockClientIds(), }; } ); + useEffect( () => { + if ( selectedBlockClientIds?.length || ! firstBlock ) { + return; + } + selectBlock( firstBlock.clientId ); + }, [ firstBlock, selectedBlockClientIds ] ); + useEffect( () => { if ( isEmpty ) { const initialBlock = createBlock( 'core/paragraph', { content: '', + placeholder, } ); insertBlock( initialBlock ); + onChange( [ initialBlock ] ); } - }, [] ); + }, [ isEmpty ] ); return ( /* Gutenberg handles the keyboard events when focusing the content editable area. */ @@ -60,8 +73,6 @@ export const EditorWritingFlow: React.VFC = () => { - { /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */ } - { /* @ts-ignore This action is available in the block editor data store. */ } diff --git a/packages/js/components/src/rich-text-editor/rich-text-editor.tsx b/packages/js/components/src/rich-text-editor/rich-text-editor.tsx index d256503271c..3920a283970 100644 --- a/packages/js/components/src/rich-text-editor/rich-text-editor.tsx +++ b/packages/js/components/src/rich-text-editor/rich-text-editor.tsx @@ -1,18 +1,14 @@ /** * External dependencies */ -import { BaseControl, SlotFillProvider } from '@wordpress/components'; +import { BaseControl, Popover, SlotFillProvider } from '@wordpress/components'; import { BlockEditorProvider } from '@wordpress/block-editor'; import { BlockInstance } from '@wordpress/blocks'; +import { createElement, useEffect, useState, useRef } from '@wordpress/element'; import { debounce } from 'lodash'; -import { - createElement, - useCallback, - useEffect, - useState, - useRef, -} from '@wordpress/element'; import React from 'react'; +import { uploadMedia } from '@wordpress/media-utils'; +import { useUser } from '@woocommerce/data'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore No types for this exist yet. // eslint-disable-next-line @woocommerce/dependency-group @@ -31,15 +27,17 @@ type RichTextEditorProps = { label?: string; onChange: ( changes: BlockInstance[] ) => void; entryId?: string; + placeholder?: string; }; export const RichTextEditor: React.VFC< RichTextEditorProps > = ( { blocks, label, onChange, + placeholder = '', } ) => { const blocksRef = useRef( blocks ); - + const { currentUserCan } = useUser(); const [ , setRefresh ] = useState( 0 ); // If there is a props change we need to update the ref and force re-render. @@ -61,6 +59,24 @@ export const RichTextEditor: React.VFC< RichTextEditorProps > = ( { forceRerender(); }, 200 ); + const mediaUpload = currentUserCan( 'upload_files' ) + ? ( { + onError, + ...rest + }: { + onError: ( message: string ) => void; + } ) => { + uploadMedia( + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore The upload function passes the remaining required props. + { + onError: ( { message } ) => onError( message ), + ...rest, + } + ); + } + : undefined; + return (
{ label && ( @@ -75,13 +91,19 @@ export const RichTextEditor: React.VFC< RichTextEditorProps > = ( { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore This property was recently added in the block editor data store. __experimentalClearBlockSelection: false, + mediaUpload, } } onInput={ debounceChange } onChange={ debounceChange } > - + +
diff --git a/packages/js/components/src/rich-text-editor/style.scss b/packages/js/components/src/rich-text-editor/style.scss index 47b277c8075..722e98d31bf 100644 --- a/packages/js/components/src/rich-text-editor/style.scss +++ b/packages/js/components/src/rich-text-editor/style.scss @@ -1,3 +1,5 @@ +$toolbar-height: 40px; + .woocommerce-rich-text-editor { .woocommerce-rich-text-editor__writing-flow { border: 1px solid $gray-600; @@ -9,21 +11,12 @@ box-sizing: border-box; } - .block-editor-inserter { - display: none; - } - .block-editor-block-contextual-toolbar.is-fixed, .block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar-group, .block-editor-block-contextual-toolbar.is-fixed .block-editor-block-toolbar .components-toolbar { border-color: $gray-600; } - /* Hide rich text placeholder text */ - .rich-text [data-rich-text-placeholder] { - display: none !important; - } - /* hide block boundary background styling */ .rich-text:focus *[data-rich-text-format-boundary] { background: none !important; @@ -39,11 +32,6 @@ outline: none; } - .block-editor-block-list__empty-block-inserter, - .block-editor-block-list__insertion-point { - display: none !important; - } - .block-editor-writing-flow { padding: $gap-small; } @@ -56,11 +44,25 @@ } .components-accessible-toolbar { + height: $toolbar-height; width: 100%; background-color: $white; border-color: $gray-700; border-bottom-left-radius: 0; border-bottom-right-radius: 0; + + .components-button { + height: $toolbar-height; + } + } + + .block-editor-block-mover:not(.is-horizontal) .block-editor-block-mover__move-button-container > * { + height: calc( $toolbar-height / 2 ); + } + + .block-editor-block-contextual-toolbar.is-fixed, + .components-toolbar-group { + min-height: $toolbar-height; } .wp-block-quote { diff --git a/packages/js/components/src/rich-text-editor/utils/register-blocks.ts b/packages/js/components/src/rich-text-editor/utils/register-blocks.ts index cdcf514835e..566ff239bef 100644 --- a/packages/js/components/src/rich-text-editor/utils/register-blocks.ts +++ b/packages/js/components/src/rich-text-editor/utils/register-blocks.ts @@ -14,6 +14,8 @@ export const HEADING_BLOCK_ID = 'core/heading'; export const LIST_BLOCK_ID = 'core/list'; export const LIST_ITEM_BLOCK_ID = 'core/list-item'; export const QUOTE_BLOCK_ID = 'core/quote'; +export const IMAGE_BLOCK_ID = 'core/image'; +export const VIDEO_BLOCK_ID = 'core/video'; const ALLOWED_CORE_BLOCKS = [ PARAGRAPH_BLOCK_ID, @@ -21,6 +23,8 @@ const ALLOWED_CORE_BLOCKS = [ LIST_BLOCK_ID, LIST_ITEM_BLOCK_ID, QUOTE_BLOCK_ID, + IMAGE_BLOCK_ID, + VIDEO_BLOCK_ID, ]; const registerCoreBlocks = () => { diff --git a/plugins/woocommerce-admin/client/products/sections/product-details-section.tsx b/plugins/woocommerce-admin/client/products/sections/product-details-section.tsx index 7f8bfd0b979..b452d8d3478 100644 --- a/plugins/woocommerce-admin/client/products/sections/product-details-section.tsx +++ b/plugins/woocommerce-admin/client/products/sections/product-details-section.tsx @@ -226,6 +226,10 @@ export const ProductDetailsSection: React.FC = () => { setDescriptionBlocks( blocks ); setValue( 'description', serialize( blocks ) ); } } + placeholder={ __( + 'Describe this product. What makes it unique? What are its most important features?', + 'woocommerce' + ) } /> diff --git a/plugins/woocommerce/changelog/fix-rich-text-editor-selection b/plugins/woocommerce/changelog/fix-rich-text-editor-selection new file mode 100644 index 00000000000..88bcd847753 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-rich-text-editor-selection @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add placeholder to description field From 8bc69e755e65a4cc1f0903c3b344107674ab8262 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:09:20 -0500 Subject: [PATCH 0016/1680] Delete changelog files based on PR 35428 (#35430) Delete changelog files for 35428 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/update-blocks-8.7.5 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-blocks-8.7.5 diff --git a/plugins/woocommerce/changelog/update-blocks-8.7.5 b/plugins/woocommerce/changelog/update-blocks-8.7.5 deleted file mode 100644 index e102e49b550..00000000000 --- a/plugins/woocommerce/changelog/update-blocks-8.7.5 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 8.7.5 From 6b770820e9e450d059d45f24c48a8950805790c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:14:47 -0500 Subject: [PATCH 0017/1680] Delete changelog files based on PR 35118 (#35433) Delete changelog files for 35118 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-35032 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-35032 diff --git a/plugins/woocommerce/changelog/fix-35032 b/plugins/woocommerce/changelog/fix-35032 deleted file mode 100644 index eec41196f73..00000000000 --- a/plugins/woocommerce/changelog/fix-35032 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Sync orders for stats table. From 1f0d4df8ed79bf9811a604de5f45862fda98d710 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:17:19 -0500 Subject: [PATCH 0018/1680] Delete changelog files based on PR 35366 (#35435) Delete changelog files for 35366 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-35112 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-35112 diff --git a/plugins/woocommerce/changelog/fix-35112 b/plugins/woocommerce/changelog/fix-35112 deleted file mode 100644 index 5375bc7a568..00000000000 --- a/plugins/woocommerce/changelog/fix-35112 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Allow line breaks in order note again. From f6f359e1cde0ece4e4b28c47d713e125b0b7bec2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:18:44 -0500 Subject: [PATCH 0019/1680] Delete changelog files based on PR 35402 (#35437) Delete changelog files for 35402 Co-authored-by: WooCommerce Bot --- .../changelog/fix-35360-sync-on-manual-order-creation | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation diff --git a/plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation b/plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation deleted file mode 100644 index c95d2cefa8a..00000000000 --- a/plugins/woocommerce/changelog/fix-35360-sync-on-manual-order-creation +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -When HPOS is enabled, posts are authoritative, and sync is enabled, ensure the HPOS record correctly tracks the CPT order record. From a7a7b5187fa76963262f7889112409ef751a11ed Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 31 Oct 2022 17:20:05 -0500 Subject: [PATCH 0020/1680] Delete changelog files based on PR 35333 (#35439) Delete changelog files for 35333 Co-authored-by: WooCommerce Bot --- .../remove_compatibility_warnings_for_inactive_plugins | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/remove_compatibility_warnings_for_inactive_plugins diff --git a/plugins/woocommerce/changelog/remove_compatibility_warnings_for_inactive_plugins b/plugins/woocommerce/changelog/remove_compatibility_warnings_for_inactive_plugins deleted file mode 100644 index 2731dfabc35..00000000000 --- a/plugins/woocommerce/changelog/remove_compatibility_warnings_for_inactive_plugins +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Don't show feature compatibility warnings for inactive plugins From 24f6acdc9cb01b16e34bc4b68b66d476f33555ed Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Mon, 31 Oct 2022 17:46:29 -0500 Subject: [PATCH 0021/1680] Remove change file for 35349 (#35443) --- plugins/woocommerce/changelog/fix-order_type | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-order_type diff --git a/plugins/woocommerce/changelog/fix-order_type b/plugins/woocommerce/changelog/fix-order_type deleted file mode 100644 index ba0073e6737..00000000000 --- a/plugins/woocommerce/changelog/fix-order_type +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Check order type is set before returning to prevent notice. From ff2b06c9af06e7ba85ea9cdc261d8e7df78b4ebc Mon Sep 17 00:00:00 2001 From: louwie17 Date: Tue, 1 Nov 2022 09:05:46 -0300 Subject: [PATCH 0022/1680] Add create attribute term modal (#35131) * Add create attribute term modal * Add back filter missed during rebase * Add changelog * Fix lint error * Address some feedback from PR review * Prevent first modal from closing if closing the second modal when clicking outside --- .../attribute-field/add-attribute-modal.tsx | 11 +- .../attribute-term-input-field.scss | 8 + .../attribute-term-input-field.tsx | 280 ++++++++++++------ .../create-attribute-term-modal.scss | 22 ++ .../create-attribute-term-modal.tsx | 175 +++++++++++ .../add-34331_create_attribute_term_modal | 4 + 6 files changed, 404 insertions(+), 96 deletions(-) create mode 100644 plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.scss create mode 100644 plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.tsx create mode 100644 plugins/woocommerce/changelog/add-34331_create_attribute_term_modal diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx index 6ead6cd435e..effe7a7ed37 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx @@ -138,7 +138,16 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { return ( onClose( values ) } + onRequestClose={ ( + event: + | React.KeyboardEvent< Element > + | React.MouseEvent< Element > + | React.FocusEvent< Element > + ) => { + if ( ! event.isPropagationStopped() ) { + onClose( values ); + } + } } className="woocommerce-add-attribute-modal" > diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss index b4836d8ce10..a3509b2b7ef 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss @@ -2,4 +2,12 @@ &__loading-spinner { padding: 12px 0; } + &__add-new { + display: flex; + align-items: center; + font-weight: 600; + } + &__add-new-icon { + margin-right: $gap-small; + } } diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx index 5d69aced711..dfa6f30a6fc 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx @@ -1,11 +1,12 @@ /** * External dependencies */ -import { __ } from '@wordpress/i18n'; -import { CheckboxControl, Spinner } from '@wordpress/components'; +import { sprintf, __ } from '@wordpress/i18n'; +import { CheckboxControl, Icon, Spinner } from '@wordpress/components'; import { resolveSelect } from '@wordpress/data'; -import { useCallback, useEffect, useState } from '@wordpress/element'; +import { useCallback, useEffect, useRef, useState } from '@wordpress/element'; import { useDebounce } from '@wordpress/compose'; +import { plus } from '@wordpress/icons'; import { EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME, ProductAttributeTerm, @@ -21,6 +22,7 @@ import { * Internal dependencies */ import './attribute-term-input-field.scss'; +import { CreateAttributeTermModal } from './create-attribute-term-modal'; type AttributeTermInputFieldProps = { value?: ProductAttributeTerm[]; @@ -30,13 +32,20 @@ type AttributeTermInputFieldProps = { disabled?: boolean; }; +let uniqueId = 0; + export const AttributeTermInputField: React.FC< AttributeTermInputFieldProps > = ( { value = [], onChange, placeholder, disabled, attributeId } ) => { + const attributeTermInputId = useRef( + `woocommerce-attribute-term-field-${ ++uniqueId }` + ); const [ fetchedItems, setFetchedItems ] = useState< ProductAttributeTerm[] >( [] ); const [ isFetching, setIsFetching ] = useState( false ); + const [ addNewAttributeTermName, setAddNewAttributeTermName ] = + useState< string >(); const fetchItems = useCallback( ( searchString: string | undefined ) => { @@ -80,6 +89,11 @@ export const AttributeTermInputField: React.FC< }; const onSelect = ( item: ProductAttributeTerm ) => { + // Add new item. + if ( item.id === -99 ) { + setAddNewAttributeTermName( item.name ); + return; + } const isSelected = value.find( ( i ) => i.slug === item.slug ); if ( isSelected ) { onRemove( item ); @@ -88,103 +102,179 @@ export const AttributeTermInputField: React.FC< onChange( [ ...value, item ] ); }; + const focusSelectControl = () => { + const selectControlInputField: HTMLInputElement | null = + document.querySelector( + '.' + + attributeTermInputId.current + + ' .woocommerce-experimental-select-control__input' + ); + if ( selectControlInputField ) { + setTimeout( () => { + selectControlInputField.focus(); + }, 0 ); + } + }; + const selectedTermSlugs = ( value || [] ).map( ( term ) => term.slug ); return ( - - items={ fetchedItems } - multiple - disabled={ disabled || ! attributeId } - label="" - getFilteredItems={ ( allItems ) => allItems } - onInputChange={ debouncedSearch } - placeholder={ placeholder || '' } - getItemLabel={ ( item ) => item?.name || '' } - getItemValue={ ( item ) => item?.slug || '' } - stateReducer={ ( state, actionAndChanges ) => { - const { changes, type } = actionAndChanges; - switch ( type ) { - case selectControlStateChangeTypes.ControlledPropUpdatedSelectedItem: - return { - ...changes, - inputValue: state.inputValue, - }; - case selectControlStateChangeTypes.ItemClick: - return { - ...changes, - isOpen: true, - inputValue: state.inputValue, - highlightedIndex: state.highlightedIndex, - }; - default: - return changes; + <> + + items={ fetchedItems } + multiple + disabled={ disabled || ! attributeId } + label="" + getFilteredItems={ ( allItems, inputValue ) => { + if ( + inputValue.length > 0 && + ! allItems.find( + ( item ) => + item.name.toLowerCase() === + inputValue.toLowerCase() + ) + ) { + return [ + ...allItems, + { + id: -99, + name: inputValue, + } as ProductAttributeTerm, + ]; + } + return allItems; + } } + onInputChange={ debouncedSearch } + placeholder={ placeholder || '' } + getItemLabel={ ( item ) => item?.name || '' } + getItemValue={ ( item ) => item?.slug || '' } + stateReducer={ ( state, actionAndChanges ) => { + const { changes, type } = actionAndChanges; + switch ( type ) { + case selectControlStateChangeTypes.ControlledPropUpdatedSelectedItem: + return { + ...changes, + inputValue: state.inputValue, + }; + case selectControlStateChangeTypes.ItemClick: + if ( + changes.selectedItem && + changes.selectedItem.id === -99 + ) { + return changes; + } + return { + ...changes, + isOpen: true, + inputValue: state.inputValue, + highlightedIndex: state.highlightedIndex, + }; + default: + return changes; + } + } } + selected={ value } + onSelect={ onSelect } + onRemove={ onRemove } + className={ + 'woocommerce-attribute-term-field ' + + attributeTermInputId.current } - } } - selected={ value } - onSelect={ onSelect } - onRemove={ onRemove } - className="woocommerce-attribute-term-field" - > - { ( { - items, - highlightedIndex, - getItemProps, - getMenuProps, - isOpen, - } ) => { - return ( - - { [ - isFetching ? ( -
- -
- ) : null, - ...items.map( ( item, menuIndex ) => { - const isSelected = selectedTermSlugs.includes( - item.slug - ); - - return ( - + { ( { + items, + highlightedIndex, + getItemProps, + getMenuProps, + isOpen, + } ) => { + return ( + + { [ + isFetching ? ( +
- <> - null } - checked={ isSelected } - label={ - - { item.name } + +
+ ) : null, + ...items.map( ( item, menuIndex ) => { + const isSelected = + selectedTermSlugs.includes( item.slug ); + + return ( + + { item.id !== -99 ? ( + null } + checked={ isSelected } + label={ + + { item.name } + + } + /> + ) : ( +
+ + + { sprintf( + /* translators: The name of the new attribute term to be created */ + __( + 'Create "%s"', + 'woocommerce' + ), + item.name + ) } - } - /> - - - ); - } ), - ].filter( - ( child ): child is JSX.Element => child !== null - ) } -
- ); - } } - + + ) } +
+ ); + } ), + ].filter( + ( child ): child is JSX.Element => + child !== null + ) } +
+ ); + } } + + { addNewAttributeTermName && attributeId !== undefined && ( + { + setAddNewAttributeTermName( undefined ); + focusSelectControl(); + } } + attributeId={ attributeId } + onCreated={ ( newAttribute ) => { + onSelect( newAttribute ); + setAddNewAttributeTermName( undefined ); + focusSelectControl(); + } } + /> + ) } + ); }; diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.scss b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.scss new file mode 100644 index 00000000000..87c014b3880 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.scss @@ -0,0 +1,22 @@ +.woocommerce-create-attribute-term-modal { + @mixin break-medium { + min-width: 650px; + } + + &__buttons { + margin-top: $gap-larger; + display: flex; + flex-direction: row; + gap: 8px; + justify-content: flex-end; + } + .has-error { + .components-base-control__help { + color: $studio-red-50; + } + } + .components-base-control:not(:first-child) { + margin-top: 16px; + margin-bottom: 0; + } +} diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.tsx new file mode 100644 index 00000000000..107b6ee6755 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/create-attribute-term-modal.tsx @@ -0,0 +1,175 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { + Button, + Modal, + TextareaControl, + TextControl, +} from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { useDispatch } from '@wordpress/data'; +import { cleanForSlug } from '@wordpress/url'; +import { Form, FormContext, FormErrors } from '@woocommerce/components'; +import { recordEvent } from '@woocommerce/tracks'; +import { + EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME, + ProductAttributeTerm, + QueryProductAttribute, +} from '@woocommerce/data'; + +/** + * Internal dependencies + */ +import './create-attribute-term-modal.scss'; + +type CreateAttributeTermModalProps = { + initialAttributeTermName: string; + attributeId: number; + onCancel?: () => void; + onCreated?: ( newAttribute: ProductAttributeTerm ) => void; +}; + +export const CreateAttributeTermModal: React.FC< + CreateAttributeTermModalProps +> = ( { + initialAttributeTermName, + attributeId, + onCancel = () => {}, + onCreated = () => {}, +} ) => { + const { createNotice } = useDispatch( 'core/notices' ); + const [ isCreating, setIsCreating ] = useState( false ); + const { createProductAttributeTerm, invalidateResolutionForStoreSelector } = + useDispatch( EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME ); + + const onAdd = async ( attribute: Partial< ProductAttributeTerm > ) => { + recordEvent( 'product_attribute_term_add', { + new_product_page: true, + } ); + setIsCreating( true ); + try { + const newAttribute: ProductAttributeTerm = + await createProductAttributeTerm( { + ...attribute, + attribute_id: attributeId, + } ); + recordEvent( 'product_attribute_term_add_success', { + new_product_page: true, + } ); + invalidateResolutionForStoreSelector( 'getProductAttributes' ); + setIsCreating( false ); + onCreated( newAttribute ); + } catch ( e ) { + recordEvent( 'product_attribute_term_add_failed', { + new_product_page: true, + } ); + createNotice( + 'error', + __( 'Failed to create attribute term.', 'woocommerce' ) + ); + setIsCreating( false ); + onCancel(); + } + }; + + function validateForm( + values: Partial< ProductAttributeTerm > + ): FormErrors< ProductAttributeTerm > { + const errors: FormErrors< ProductAttributeTerm > = {}; + + if ( ! values.name?.length ) { + errors.name = __( + 'The attribute term name is required.', + 'woocommerce' + ); + } + + return errors; + } + + return ( + + | React.MouseEvent< Element > + | React.FocusEvent< Element > + ) => { + event.stopPropagation(); + onCancel(); + } } + className="woocommerce-create-attribute-term-modal" + > + > + initialValues={ { + name: initialAttributeTermName, + slug: cleanForSlug( initialAttributeTermName ), + } } + validate={ validateForm } + errors={ {} } + onSubmit={ onAdd } + > + { ( { + getInputProps, + handleSubmit, + isValidForm, + setValue, + values, + }: FormContext< QueryProductAttribute > ) => { + const nameInputProps = getInputProps< string >( 'name' ); + return ( + <> + { + nameInputProps.onBlur(); + setValue( + 'slug', + cleanForSlug( values.name ) + ); + } } + /> + + +
+ + +
+ + ); + } } + +
+ ); +}; diff --git a/plugins/woocommerce/changelog/add-34331_create_attribute_term_modal b/plugins/woocommerce/changelog/add-34331_create_attribute_term_modal new file mode 100644 index 00000000000..b297668b20a --- /dev/null +++ b/plugins/woocommerce/changelog/add-34331_create_attribute_term_modal @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add option and modal to create new attribute terms within MVP attribute modal. From 9a7a75fdea393a8213f4b1cf8d0cbfe4388b9008 Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Tue, 1 Nov 2022 13:55:29 +0000 Subject: [PATCH 0023/1680] add/a2p product variations api-core-tests (#35355) * add product variations api-core-tests * add product variations api-core-tests * comments updates --- ...i-core-tests-product-variations-crud-tests | 4 + .../tests/products/products-crud.test.js | 206 ++++++++++++++++-- 2 files changed, 186 insertions(+), 24 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-api-core-tests-product-variations-crud-tests diff --git a/plugins/woocommerce/changelog/add-api-core-tests-product-variations-crud-tests b/plugins/woocommerce/changelog/add-api-core-tests-product-variations-crud-tests new file mode 100644 index 00000000000..56315464db6 --- /dev/null +++ b/plugins/woocommerce/changelog/add-api-core-tests-product-variations-crud-tests @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Add playwright api-core-tests for product variations crud operations \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js index efdf05f6fd4..098f686712a 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js @@ -405,7 +405,7 @@ test.describe('Products API tests: CRUD', () => { test('can retrieve all product categories', async ({ request }) => { - // call API to retrieve all product tags + // call API to retrieve all product categories const response = await request.get('/wp-json/wc/v3/products/categories'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -417,7 +417,7 @@ test.describe('Products API tests: CRUD', () => { test('can update a product category', async ({ request }) => { - // call API to retrieve all product tags + // call API to retrieve all product categories const response = await request.put(`wp-json/wc/v3/products/categories/${productCategoryId}`, { data: { description: 'Games played on a video games console or computer.' @@ -611,7 +611,7 @@ test.describe('Products API tests: CRUD', () => { test('can retrieve all product reviews', async ({ request }) => { - // call API to retrieve all product tags + // call API to retrieve all product reviews const response = await request.get('/wp-json/wc/v3/products/reviews'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -622,7 +622,7 @@ test.describe('Products API tests: CRUD', () => { test('can update a product review', async ({ request }) => { - // call API to retrieve all product tags + // call API to retrieve all product reviews const response = await request.put(`wp-json/wc/v3/products/reviews/${productReviewId}`, { data: { rating: 1 @@ -644,7 +644,7 @@ test.describe('Products API tests: CRUD', () => { test('can permanently delete a product review', async ({ request }) => { - // Delete the product category. + // Delete the product review. const response = await request.delete( `wp-json/wc/v3/products/reviews/${productReviewId}`, { data: { @@ -801,7 +801,7 @@ test.describe('Products API tests: CRUD', () => { test('can retrieve all product shipping classes', async ({ request }) => { - // call API to retrieve all product tags + // call API to retrieve all product shipping classes const response = await request.get('/wp-json/wc/v3/products/shipping_classes'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -812,7 +812,7 @@ test.describe('Products API tests: CRUD', () => { test('can update a product shipping class', async ({ request }) => { - // call API to retrieve all product tags + // call API to retrieve a product shipping class const response = await request.put(`wp-json/wc/v3/products/shipping_classes/${productShippingClassId}`, { data: { description: 'This is a description for the Priority shipping class.' @@ -959,7 +959,7 @@ test.describe('Products API tests: CRUD', () => { test('can update a product tag', async ({ request }) => { - // call API to retrieve all product tags + // call API to update a product tag const response = await request.put(`wp-json/wc/v3/products/tags/${productTagId}`, { data: { description: 'Genuine leather.' @@ -1098,25 +1098,183 @@ test.describe('Products API tests: CRUD', () => { }); }); - test('can add a variable product', async ({ - request - }) => { - const response = await request.post('wp-json/wc/v3/products', { - data: variableProduct, + test.describe('Product variation tests: CRUD', () => { + let variableProductId; + let productVariationId; + + test('can add a variable product', async ({ + request + }) => { + const response = await request.post('wp-json/wc/v3/products', { + data: variableProduct, + }); + const responseJSON = await response.json(); + variableProductId = responseJSON.id; + expect(response.status()).toEqual(201); + expect(typeof variableProductId).toEqual('number'); + expect(responseJSON).toMatchObject(variableProduct); + expect(responseJSON.status).toEqual('publish'); }); - const responseJSON = await response.json(); - const variableProductId = responseJSON.id; - expect(response.status()).toEqual(201); - expect(typeof variableProductId).toEqual('number'); - expect(responseJSON).toMatchObject(variableProduct); - expect(responseJSON.status).toEqual('publish'); + test('can add a product variation', async ({ + request + }) => { + const response = await request.post(`wp-json/wc/v3/products/${variableProductId}/variations`, { + data: { + "regular_price": "29.00", + "attributes": [{ + "name": "Colour", + "option": "Green" + }] + }, + }); + const responseJSON = await response.json(); + productVariationId = responseJSON.id; + expect(response.status()).toEqual(201); + expect(typeof productVariationId).toEqual('number'); + expect(responseJSON.regular_price).toEqual("29.00"); + }); - // Cleanup: Delete the variable product - await request.delete(`wp-json/wc/v3/products/${ variableProductId }`, { - data: { - force: true, - }, + test('can retrieve a product variation', async ({ + request + }) => { + const response = await request.get(`wp-json/wc/v3/products/${variableProductId}/variations/${productVariationId}`); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(responseJSON.id).toEqual(productVariationId); + expect(responseJSON.regular_price).toEqual('29.00'); + }); + + test('can retrieve all product variations', async ({ + request + }) => { + // call API to retrieve all product variations + const response = await request.get(`wp-json/wc/v3/products/${variableProductId}/variations`); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(true); + expect(responseJSON.length).toBeGreaterThan(0); + }); + + test('can update a product variation', async ({ + request + }) => { + // call API to update the product variation + const response = await request.put(`wp-json/wc/v3/products/${variableProductId}/variations/${productVariationId}`, { + data: { + "regular_price": "30.00", + } + }); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(responseJSON.id).toEqual(productVariationId); + expect(responseJSON.regular_price).toEqual('30.00'); + }); + + test('can permanently delete a product variation', async ({ + request + }) => { + // Delete the product variation. + const response = await request.delete( + `wp-json/wc/v3/products/${variableProductId}/variations/${productVariationId}`, { + data: { + force: true, + }, + } + ); + expect(response.status()).toEqual(200); + + // Verify that the product variation can no longer be retrieved. + const getDeletedProductVariationResponse = await request.get( + `wp-json/wc/v3/products/${variableProductId}/variations/${productVariationId}` + ); + expect(getDeletedProductVariationResponse.status()).toEqual(404); + }); + + test('can batch update product variations', async ({ + request + }) => { + // Batch create 2 product variations + const response = await request.post( + `wp-json/wc/v3/products/${variableProductId}/variations/batch`, { + data: { + create: [{ + "regular_price": "30.00", + "attributes": [{ + "name": "Colour", + "option": "Green" + }] + }, + { + "regular_price": "35.00", + "attributes": [{ + "name": "Colour", + "option": "Red" + }] + } + ] + } + } + ); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + const variation1Id = responseJSON.create[0].id; + const variation2Id = responseJSON.create[1].id; + expect(typeof variation1Id).toEqual('number'); + expect(typeof variation2Id).toEqual('number'); + expect(responseJSON.create[0].price).toEqual('30.00'); + expect(responseJSON.create[1].price).toEqual('35.00'); + + // Batch create a new variation, update a variation and delete another. + const responseBatchUpdate = await request.post( + `wp-json/wc/v3/products/${variableProductId}/variations/batch`, { + data: { + create: [{ + "regular_price": "25.99", + "attributes": [{ + "name": "Colour", + "option": "Blue" + }] + }], + update: [{ + id: variation2Id, + "regular_price": "35.99", + }], + delete: [ + variation1Id + ] + } + } + ); + + expect(response.status()).toEqual(200); + const responseBatchUpdateJSON = await responseBatchUpdate.json(); + const variation3Id = responseBatchUpdateJSON.create[0].id; + const responseUpdatedVariation = await request.get(`wp-json/wc/v3/products/${variableProductId}/variations/${variation2Id}`); + const responseUpdatedVariationJSON = await responseUpdatedVariation.json(); + expect(responseUpdatedVariationJSON.regular_price).toEqual('35.99'); + + // Verify that the deleted product variation can no longer be retrieved. + const getDeletedProductVariationResponse = await request.get( + `wp-json/wc/v3/products/${variableProductId}/variations/${variation1Id}` + ); + expect(getDeletedProductVariationResponse.status()).toEqual(404); + + // Batch delete the created product variations + await request.post( + `wp-json/wc/v3/products/${variableProductId}/variations/batch`, { + data: { + delete: [variation2Id, variation3Id] + } + } + ); + + // Cleanup: Delete the variable product + await request.delete(`wp-json/wc/v3/products/${ variableProductId }`, { + data: { + force: true, + }, + }); }); }); From c7282de4eeb2b5c9b92a4681f7ec9fbe43fe68c6 Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Tue, 1 Nov 2022 14:04:20 +0000 Subject: [PATCH 0024/1680] update/a2p update shipping api-core-tests (#35332) * update shipping api-core-tests * merge in trunk to see if this resolves changelog issue * comments updates --- .../update-api-core-tests-shipping-crud-tests | 4 + .../tests/shipping/shipping-method.test.js | 111 +++++++++++++++++- .../tests/shipping/shipping-zones.test.js | 11 -- 3 files changed, 110 insertions(+), 16 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-api-core-tests-shipping-crud-tests diff --git a/plugins/woocommerce/changelog/update-api-core-tests-shipping-crud-tests b/plugins/woocommerce/changelog/update-api-core-tests-shipping-crud-tests new file mode 100644 index 00000000000..cff840b283b --- /dev/null +++ b/plugins/woocommerce/changelog/update-api-core-tests-shipping-crud-tests @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update playwright api-core-tests for shipping crud operations \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js index d3c038b9ca8..5a66200f908 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js @@ -1,7 +1,12 @@ /* eslint-disable */ -const { test, expect } = require('@playwright/test'); +const { + test, + expect +} = require('@playwright/test'); -const { getShippingMethodExample } = require('../../data'); +const { + getShippingMethodExample +} = require('../../data'); /** * Shipping zone id for "Locations not covered by your other zones". @@ -30,11 +35,107 @@ const methodCostIndex = 2; */ test.describe('Shipping methods API tests', () => { + test('cannot create a shipping method', async ({ + request, + }) => { + /** + * call API to attempt to create a shipping method + * This call will not work as we have no ability to create new shipping methods, + * only retrieve the existing shipping methods + * i.e. Flat rate, Free shipping and Local pickup + */ + const response = await request.post( + '/wp-json/wc/v3/shipping_methods', { + data: { + title: "flat_rate", + description: "Lets you charge a fixed rate for shipping.", + }, + } + ); + const responseJSON = await response.json(); + expect(response.status()).toEqual(404); + expect(responseJSON.code).toEqual('rest_no_route'); + expect(responseJSON.message).toEqual('No route was found matching the URL and request method.'); + }); + + test('can retrieve all shipping methods', async ({ + request + }) => { + // call API to retrieve all shipping methods + const response = await request.get('/wp-json/wc/v3/shipping_methods'); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)); + expect(responseJSON.length).toEqual(3); + expect(responseJSON[0].id).toEqual("flat_rate"); + expect(responseJSON[1].id).toEqual("free_shipping"); + expect(responseJSON[2].id).toEqual("local_pickup"); + }); + + test('can retrieve a shipping method', async ({ + request + }) => { + // call API to retrieve a shipping method + const response = await request.get( + `/wp-json/wc/v3/shipping_methods/local_pickup` + ); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(Array.isArray(responseJSON)).toBe(false); + expect(typeof responseJSON.id).toEqual('string'); + }); + + test(`cannot update a shipping method`, async ({ + request, + }) => { + /** + * call API to attempt to update a shipping method + * This call will not work as we have no ability to update new shipping methods, + * only retrieve the existing shipping methods + * i.e. Flat rate, Free shipping and Local pickup + */ + const response = await request.put( + '/wp-json/wc/v3/shipping_methods/local_pickup', { + data: { + description: "update local pickup description" + } + } + ); + const responseJSON = await response.json(); + expect(response.status()).toEqual(404); + expect(responseJSON.code).toEqual('rest_no_route'); + expect(responseJSON.message).toEqual('No route was found matching the URL and request method.'); + }); + + + test('cannot delete a shipping method', async ({ + request + }) => { + /** + * call API to attempt to delete a shipping method + * This call will not work as we have no ability to delete shipping methods, + * only retrieve the existing shipping methods + * i.e. Flat rate, Free shipping and Local pickup + */ + const response = await request.delete('/wp-json/wc/v3/shipping_methods', { + data: { + force: true + } + }); + const responseJSON = await response.json(); + expect(response.status()).toEqual(404); + expect(responseJSON.code).toEqual('rest_no_route'); + expect(responseJSON.message).toEqual('No route was found matching the URL and request method.'); + }); + + //loop through each row from the shippingMethods test data table above for (const shippingMethodRow of shippingMethods) { test(`can add a ${shippingMethodRow[methodTitleIndex]} shipping method`, - async ({ request }) => { + async ({ + request + }) => { //create the shipping method const shippingMethod = getShippingMethodExample(shippingMethodRow[methodIdIndex], shippingMethodRow[methodCostIndex]); @@ -54,12 +155,12 @@ test.describe('Shipping methods API tests', () => { const shippingMethodInstanceId = responseJSON.id; - //if the shipping method is flat_rate OR local_pickup then based on the data, it should have a cost value + // if the shipping method is flat_rate OR local_pickup then based on the data, it should have a cost value if (['flat_rate', 'local_pickup'].includes(shippingMethodRow[methodIdIndex])) { expect(responseJSON.settings.cost.value).toEqual(shippingMethodRow[methodCostIndex]); } - // Cleanup: Delete the shipping method + // Cleanup: Remove the shipping method from the shipping zone const deleteResponse = await request.delete(`/wp-json/wc/v3/shipping/zones/${ shippingZoneId }/methods/${ shippingMethodInstanceId }`, { data: { force: true diff --git a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-zones.test.js b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-zones.test.js index 1316257c6f1..ef948dea1c4 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-zones.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-zones.test.js @@ -121,7 +121,6 @@ test.describe( 'Shipping zones API tests', () => { //call API to retrive the locations of the last created shipping zone const response = await request.get( `/wp-json/wc/v3/shipping/zones/${shippingZone.id}/locations`); - const responseJSON = await response.json(); expect( response.status() ).toEqual( 200 ); //no locations exist initially @@ -142,11 +141,6 @@ test.describe( 'Shipping zones API tests', () => { test( 'can update a shipping region on a shipping zone', async ({request}) => { - //call API to retrive the locations of the last created shipping zone - const response = await request.get( `/wp-json/wc/v3/shipping/zones/${shippingZone.id}/locations`); - const responseJSON = await response.json(); - expect( response.status() ).toEqual( 200 ); - //GB and US locations exist initially //update the locations of the shipping zone regions to contain an individual state const putResponseStateOnly = await request.put( `/wp-json/wc/v3/shipping/zones/${shippingZone.id}/locations`,{ @@ -166,11 +160,6 @@ test.describe( 'Shipping zones API tests', () => { test( 'can clear/delete a shipping region on a shipping zone', async ({request}) => { - //call API to retrive the locations of the last created shipping zone - const response = await request.get( `/wp-json/wc/v3/shipping/zones/${shippingZone.id}/locations`); - const responseJSON = await response.json(); - expect( response.status() ).toEqual( 200 ); - //GB and US locations exist initially //update the locations of the shipping zone regions to contain an individual state const putResponseStateOnly = await request.put( `/wp-json/wc/v3/shipping/zones/${shippingZone.id}/locations`,{ From c2473da79be9333fa0c3f0a3e24008c429107ba3 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Tue, 1 Nov 2022 11:46:36 -0700 Subject: [PATCH 0025/1680] Remove insight first product and payment note (#35309) * Remove InsightFirstProductAndPayment note * Add changelog entry * Remove obsolete note * Fix yoda condition --- ...ove-insight-first-product-and-payment-note | 4 ++ .../woocommerce/includes/class-wc-install.php | 1 + .../woocommerce/src/Internal/Admin/Events.php | 4 +- .../Notes/InsightFirstProductAndPayment.php | 69 ------------------- 4 files changed, 6 insertions(+), 72 deletions(-) create mode 100644 plugins/woocommerce/changelog/remove-insight-first-product-and-payment-note delete mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstProductAndPayment.php diff --git a/plugins/woocommerce/changelog/remove-insight-first-product-and-payment-note b/plugins/woocommerce/changelog/remove-insight-first-product-and-payment-note new file mode 100644 index 00000000000..d14bff55fda --- /dev/null +++ b/plugins/woocommerce/changelog/remove-insight-first-product-and-payment-note @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove InsightFirstProductAndPayment note diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index d73908d3013..e9b8f015ed3 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -822,6 +822,7 @@ class WC_Install { global $wpdb; $obsolete_notes_names = array( 'wc-admin-welcome-note', + 'wc-admin-insight-first-product-and-payment', 'wc-admin-store-notice-setting-moved', 'wc-admin-store-notice-giving-feedback', 'wc-admin-learn-more-about-product-settings', diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index 58e1fb89586..94ed2c4f4d7 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -20,7 +20,6 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\EditProductsOnTheMove; use \Automattic\WooCommerce\Internal\Admin\Notes\EUVATNumber; use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownlaodableProduct; use \Automattic\WooCommerce\Internal\Admin\Notes\FirstProduct; -use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstProductAndPayment; use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstSale; use \Automattic\WooCommerce\Internal\Admin\Notes\InstallJPAndWCSPlugins; use \Automattic\WooCommerce\Internal\Admin\Notes\LaunchChecklist; @@ -84,7 +83,6 @@ class Events { EUVATNumber::class, FirstDownlaodableProduct::class, FirstProduct::class, - InsightFirstProductAndPayment::class, InsightFirstSale::class, LaunchChecklist::class, MagentoMigration::class, @@ -129,7 +127,7 @@ class Events { * @return object Instance. */ final public static function instance() { - if ( static::$instance === null ) { + if ( null === static::$instance ) { static::$instance = new static(); } return static::$instance; diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstProductAndPayment.php b/plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstProductAndPayment.php deleted file mode 100644 index 8d78705ac2f..00000000000 --- a/plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstProductAndPayment.php +++ /dev/null @@ -1,69 +0,0 @@ -set_title( __( 'Insight', 'woocommerce' ) ); - $note->set_content( __( 'More than 80% of new merchants add the first product and have at least one payment method set up during the first week.

Do you find this type of insight useful?', 'woocommerce' ) ); - $note->set_type( Note::E_WC_ADMIN_NOTE_SURVEY ); - $note->set_name( self::NOTE_NAME ); - $note->set_content_data( (object) array() ); - $note->set_source( 'woocommerce-admin' ); - $note->add_action( - 'affirm-insight-first-product-and-payment', - __( 'Yes', 'woocommerce' ), - false, - Note::E_WC_ADMIN_NOTE_ACTIONED, - false, - __( 'Thanks for your feedback', 'woocommerce' ) - ); - - $note->add_action( - 'affirm-insight-first-product-and-payment', - __( 'No', 'woocommerce' ), - false, - Note::E_WC_ADMIN_NOTE_ACTIONED, - false, - __( 'Thanks for your feedback', 'woocommerce' ) - ); - - return $note; - } -} From 2fcb28b5df0b42fb3f138fcdb2445a4ab9f7c10d Mon Sep 17 00:00:00 2001 From: Barry Hughes <3594411+barryhughes@users.noreply.github.com> Date: Tue, 1 Nov 2022 15:36:11 -0700 Subject: [PATCH 0026/1680] Add filter hook `handle_bulk_actions-woocommerce_page_wc-orders` (#35442) Add filter hook `handle_bulk_actions-woocommerce_page_wc-orders` to the HPOS admin list table. This is a duplicate of core WP hook `handle_bulk_actions-` and allows for custom bulk actions to be handled in the context of the admin list table for HPOS orders. --- .../changelog/fix-35414-custom-bulk-actions | 4 ++++ .../src/Internal/Admin/Orders/ListTable.php | 17 ++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-35414-custom-bulk-actions diff --git a/plugins/woocommerce/changelog/fix-35414-custom-bulk-actions b/plugins/woocommerce/changelog/fix-35414-custom-bulk-actions new file mode 100644 index 00000000000..8436c71c4a3 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35414-custom-bulk-actions @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Make it possible to add custom bulk action handling to the admin order list screen (when HPOS is enabled). diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php index c98f1090b33..c16c42482f5 100644 --- a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php +++ b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php @@ -941,9 +941,24 @@ class ListTable extends WP_List_Table { if ( isset( $order_statuses[ 'wc-' . $new_status ] ) ) { $changed = $this->do_bulk_action_mark_orders( $ids, $new_status ); } + } else { + $screen = get_current_screen()->id; + + /** + * This action is documented in /wp-admin/edit.php (it is a core WordPress hook). + * + * @since 7.2.0 + * + * @param string $redirect_to The URL to redirect to after processing the bulk actions. + * @param string $action The current bulk action. + * @param int[] $ids IDs for the orders to be processed. + */ + $custom_sendback = apply_filters( "handle_bulk_actions-{$screen}", $redirect_to, $action, $ids ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores } - if ( $changed ) { + if ( ! empty( $custom_sendback ) ) { + $redirect_to = $custom_sendback; + } elseif ( $changed ) { $redirect_to = add_query_arg( array( 'bulk_action' => $report_action, From dc94b9b512b3273cc585aa0db1d7fed097ec8f26 Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Wed, 2 Nov 2022 03:19:29 +0100 Subject: [PATCH 0027/1680] Fix missing use FQCN for WP_Error (#35305) * add use WP_Error phpdoc was not using FQCN for WP_Error, however use is preferred to FQCN anyway Fix: https://github.com/woocommerce/woocommerce/issues/35304 * Revert "add use WP_Error" This reverts commit ff62deb10020689f96722e10c5c86669a1454125. * use FQCN in PHPDoc when using FQCN in code * add changelog --- plugins/woocommerce/changelog/fix-missing-use-fqcn-wp_error | 4 ++++ .../src/Admin/Features/OnboardingTasks/TaskLists.php | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-missing-use-fqcn-wp_error diff --git a/plugins/woocommerce/changelog/fix-missing-use-fqcn-wp_error b/plugins/woocommerce/changelog/fix-missing-use-fqcn-wp_error new file mode 100644 index 00000000000..f09f3d26109 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-missing-use-fqcn-wp_error @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +FQCN for WP_Error in PHPDoc. diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php index 31cd3a68bf6..03d5e0bf72d 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php @@ -262,7 +262,7 @@ class TaskLists { * Add a task list. * * @param array $args Task list properties. - * @return WP_Error|TaskList + * @return \WP_Error|TaskList */ public static function add_list( $args ) { if ( isset( self::$lists[ $args['id'] ] ) ) { @@ -281,7 +281,7 @@ class TaskLists { * * @param string $list_id List ID to add the task to. * @param array $args Task properties. - * @return WP_Error|Task + * @return \WP_Error|Task */ public static function add_task( $list_id, $args ) { if ( ! isset( self::$lists[ $list_id ] ) ) { From 84660ccf6f9f90075b0728155e0f2bb90729180d Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Wed, 2 Nov 2022 03:21:50 +0100 Subject: [PATCH 0028/1680] Fix class name for class FirstDownlaodableProduct (#35383) Spelling Fix https://github.com/woocommerce/woocommerce/issues/35307 --- .../changelog/fix-misspelled-first-downlaodable-product | 4 ++++ plugins/woocommerce/src/Internal/Admin/Events.php | 4 ++-- ...DownlaodableProduct.php => FirstDownloadableProduct.php} | 6 +++--- 3 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-misspelled-first-downlaodable-product rename plugins/woocommerce/src/Internal/Admin/Notes/{FirstDownlaodableProduct.php => FirstDownloadableProduct.php} (92%) diff --git a/plugins/woocommerce/changelog/fix-misspelled-first-downlaodable-product b/plugins/woocommerce/changelog/fix-misspelled-first-downlaodable-product new file mode 100644 index 00000000000..85864007047 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-misspelled-first-downlaodable-product @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Fix class name for class FirstDownlaodableProduct diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index 94ed2c4f4d7..1ede546c1e7 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -18,7 +18,7 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizeStoreWithBlocks; use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizingProductCatalog; use \Automattic\WooCommerce\Internal\Admin\Notes\EditProductsOnTheMove; use \Automattic\WooCommerce\Internal\Admin\Notes\EUVATNumber; -use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownlaodableProduct; +use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownloadableProduct; use \Automattic\WooCommerce\Internal\Admin\Notes\FirstProduct; use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstSale; use \Automattic\WooCommerce\Internal\Admin\Notes\InstallJPAndWCSPlugins; @@ -81,7 +81,7 @@ class Events { CustomizingProductCatalog::class, EditProductsOnTheMove::class, EUVATNumber::class, - FirstDownlaodableProduct::class, + FirstDownloadableProduct::class, FirstProduct::class, InsightFirstSale::class, LaunchChecklist::class, diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownlaodableProduct.php b/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php similarity index 92% rename from plugins/woocommerce/src/Internal/Admin/Notes/FirstDownlaodableProduct.php rename to plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php index 4e7fa864528..e38f22ce385 100644 --- a/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownlaodableProduct.php +++ b/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php @@ -2,7 +2,7 @@ /** * WooCommerce Admin Digital/Downloadable Producdt Handling note provider * - * Adds a note with a link to the downlaodable product handling + * Adds a note with a link to the downloadable product handling */ namespace Automattic\WooCommerce\Internal\Admin\Notes; @@ -13,9 +13,9 @@ use \Automattic\WooCommerce\Admin\Notes\Note; use \Automattic\WooCommerce\Admin\Notes\NoteTraits; /** - * FirstDownlaodableProduct. + * FirstDownloadableProduct. */ -class FirstDownlaodableProduct { +class FirstDownloadableProduct { /** * Note traits. */ From e60be03951abeb7ecbde10cf4624c5691023173a Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Wed, 2 Nov 2022 15:55:41 +0800 Subject: [PATCH 0029/1680] Fix invalid `wcadmin_install_plugin_error` event props (#35411) * Fix invalid wcadmin_install_plugin_error props * Add changelog * Update docblock comments to fix lint * Fix lint * Update prop name --- .../fix-103-install-plugin-error-track | 4 ++ .../woocommerce/src/Admin/PluginsHelper.php | 42 +++++++++++++++---- 2 files changed, 38 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-103-install-plugin-error-track diff --git a/plugins/woocommerce/changelog/fix-103-install-plugin-error-track b/plugins/woocommerce/changelog/fix-103-install-plugin-error-track new file mode 100644 index 00000000000..73059808c1f --- /dev/null +++ b/plugins/woocommerce/changelog/fix-103-install-plugin-error-track @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix invalid wcadmin_install_plugin_error event props diff --git a/plugins/woocommerce/src/Admin/PluginsHelper.php b/plugins/woocommerce/src/Admin/PluginsHelper.php index 29e22927262..c2c760d2378 100644 --- a/plugins/woocommerce/src/Admin/PluginsHelper.php +++ b/plugins/woocommerce/src/Admin/PluginsHelper.php @@ -150,6 +150,7 @@ class PluginsHelper { * Filter the list of plugins to install. * * @param array $plugins A list of the plugins to install. + * @since 6.4.0 */ $plugins = apply_filters( 'woocommerce_admin_plugins_pre_install', $plugins ); @@ -193,12 +194,19 @@ class PluginsHelper { if ( is_wp_error( $api ) ) { $properties = array( /* translators: %s: plugin slug (example: woocommerce-services) */ - 'error_message' => __( 'The requested plugin `%s` could not be installed. Plugin API call failed.', 'woocommerce' ), - 'api' => $api, - 'slug' => $slug, + 'error_message' => sprintf( __( 'The requested plugin `%s` could not be installed. Plugin API call failed.', 'woocommerce' ), $slug ), + 'api_error_message' => $api->get_error_message(), + 'slug' => $slug, ); wc_admin_record_tracks_event( 'install_plugin_error', $properties ); + /** + * Action triggered when a plugin API call failed. + * + * @param string $slug The plugin slug. + * @param \WP_Error $api The API response. + * @since 6.4.0 + */ do_action( 'woocommerce_plugins_install_api_error', $slug, $api ); $errors->add( @@ -221,14 +229,24 @@ class PluginsHelper { if ( is_wp_error( $result ) || is_null( $result ) ) { $properties = array( /* translators: %s: plugin slug (example: woocommerce-services) */ - 'error_message' => __( 'The requested plugin `%s` could not be installed.', 'woocommerce' ), - 'slug' => $slug, - 'api' => $api, - 'upgrader' => $upgrader, - 'result' => $result, + 'error_message' => sprintf( __( 'The requested plugin `%s` could not be installed.', 'woocommerce' ), $slug ), + 'slug' => $slug, + 'api_version' => $api->version, + 'api_download_link' => $api->download_link, + 'upgrader_skin_message' => implode( ',', $upgrader->skin->get_upgrade_messages() ), + 'result' => $result, ); wc_admin_record_tracks_event( 'install_plugin_error', $properties ); + /** + * Action triggered when a plugin installation fails. + * + * @param string $slug The plugin slug. + * @param object $api The plugin API object. + * @param \WP_Error|null $result The result of the plugin installation. + * @param \Plugin_Upgrader $upgrader The plugin upgrader. + * @since 6.4.0 + */ do_action( 'woocommerce_plugins_install_error', $slug, $api, $result, $upgrader ); $errors->add( @@ -292,6 +310,7 @@ class PluginsHelper { * Filter the list of plugins to activate. * * @param array $plugins A list of the plugins to activate. + * @since 6.4.0 */ $plugins = apply_filters( 'woocommerce_admin_plugins_pre_activate', $plugins ); @@ -314,6 +333,13 @@ class PluginsHelper { $result = activate_plugin( $path ); if ( ! is_null( $result ) ) { + /** + * Action triggered when a plugin activation fails. + * + * @param string $slug The plugin slug. + * @param null|\WP_Error $result The result of the plugin activation. + * @since 6.4.0 + */ do_action( 'woocommerce_plugins_activate_error', $slug, $result ); $errors->add( From d77f8fc5cdbaa693c28fb4c830962858a9021244 Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Wed, 2 Nov 2022 09:31:52 -0300 Subject: [PATCH 0030/1680] Product creation experience: shortcut to add variation price (#34948) * Add modal * Add modal style * Open modal * Add validations * Add button * Add changelog * Fix variations price setting * Fix warning for variations without price * Fix styles * Change row actions * Fix actions styles * Fix error text * Remove console.logs * Add save after setting prices * Modify modal copy * Change modal button text * Fix text * Fix text * Fix styles * Fix button * Fix code sniff errors * Fix more code sniff errors * Fix code sniff errors * Fix comments * Fix comment * Fix lint * Fix lint Co-authored-by: Fernando Marichal --- .../changelog/add-33554_variation-price | 4 + .../woocommerce/client/legacy/css/admin.scss | 71 +- .../js/admin/meta-boxes-product-variation.js | 1177 ++++++++++++----- .../legacy/js/admin/woocommerce_admin.js | 775 +++++++---- .../includes/admin/class-wc-admin-assets.php | 20 +- .../class-wc-meta-box-product-data.php | 17 +- .../views/html-product-data-variations.php | 38 + .../meta-boxes/views/html-variation-admin.php | 20 +- .../includes/admin/wc-admin-functions.php | 23 +- 9 files changed, 1483 insertions(+), 662 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-33554_variation-price diff --git a/plugins/woocommerce/changelog/add-33554_variation-price b/plugins/woocommerce/changelog/add-33554_variation-price new file mode 100644 index 00000000000..f6d8cbb756a --- /dev/null +++ b/plugins/woocommerce/changelog/add-33554_variation-price @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Add variation price shortcut diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index ecac8fccc44..f50bd3dbf54 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -952,7 +952,43 @@ #variable_product_options #message, #variable_product_options .notice { + display: flex; margin: 10px; + background-color: #FCFAE8; + > p { + width: 85%; + } + .woocommerce-add-variation-price-container { + width: 15%; + display: flex; + justify-content: flex-end; + > button { + align-self: center; + } + } +} + +.woocommerce-set-price-variations { + .woocommerce-usage-modal__wrapper{ + .woocommerce-usage-modal__message { + height: 60px; + flex-wrap: wrap; + display: flex; + > span { + padding-bottom: 16px; + } + } + .woocommerce-usage-modal__actions { + display: flex; + justify-content: flex-end; + margin-top: 20px; + > button{ + margin-left: 16px; + width: 88px; + display: unset; + } + } + } } #variable_product_options { @@ -5090,7 +5126,6 @@ img.help_tip { font-size: 15px; font-weight: 400; margin-right: 0.5em; - visibility: hidden; text-align: center; vertical-align: middle; @@ -5110,6 +5145,9 @@ img.help_tip { color: #777; } } + .edit_variation { + margin-left: 0.5em; + } h3:hover, &.ui-sortable-helper { @@ -5119,6 +5157,14 @@ img.help_tip { } } +.woocommerce_attribute { + h3 { + .sort, a.delete { + visibility: hidden; + } + } +} + .woocommerce_options_panel { min-height: 175px; box-sizing: border-box; @@ -5442,7 +5488,8 @@ img.help_tip { cursor: move; button, - a.delete { + a.delete, + a.edit { float: right; } @@ -5452,7 +5499,17 @@ img.help_tip { line-height: 26px; text-decoration: none; position: relative; - visibility: hidden; + } + + a.edit { + font-weight: normal; + line-height: 26px; + text-decoration: none; + position: relative; + } + + a.remove_variation { + margin: 0 0.5em; } strong { @@ -5484,11 +5541,19 @@ img.help_tip { padding: 0.5em 0.75em 0.5em 1em !important; a.delete, + a.edit, .handlediv, .sort { margin-top: 0.25em; } } + &.woocommerce_variation h3 { + a.delete, + a.edit, + .sort { + margin-top: 0.45em; + } + } h3:hover, &.ui-sortable-helper { diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js index e6949a5fb4b..84eab9d8bd5 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js @@ -1,27 +1,54 @@ /* global wp, woocommerce_admin_meta_boxes_variations, woocommerce_admin, accounting */ -jQuery( function( $ ) { - 'use strict'; +jQuery( function ( $ ) { + 'use strict'; /** * Variations actions */ var wc_meta_boxes_product_variations_actions = { - /** * Initialize variations actions */ - init: function() { + init: function () { $( '#variable_product_options' ) - .on( 'change', 'input.variable_is_downloadable', this.variable_is_downloadable ) - .on( 'change', 'input.variable_is_virtual', this.variable_is_virtual ) - .on( 'change', 'input.variable_manage_stock', this.variable_manage_stock ) + .on( + 'change', + 'input.variable_is_downloadable', + this.variable_is_downloadable + ) + .on( + 'change', + 'input.variable_is_virtual', + this.variable_is_virtual + ) + .on( + 'change', + 'input.variable_manage_stock', + this.variable_manage_stock + ) .on( 'click', 'button.notice-dismiss', this.notice_dismiss ) .on( 'click', 'h3 .sort', this.set_menu_order ) + .on( + 'click', + 'button.add_price_for_variations', + this.open_modal_to_set_variations_price + ) .on( 'reload', this.reload ); - $( 'input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock' ).trigger( 'change' ); - $( '#woocommerce-product-data' ).on( 'woocommerce_variations_loaded', this.variations_loaded ); - $( document.body ).on( 'woocommerce_variations_added', this.variation_added ); + $( + 'input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock' + ).trigger( 'change' ); + $( '#woocommerce-product-data' ).on( + 'woocommerce_variations_loaded', + this.variations_loaded + ); + $( document.body ) + .on( 'woocommerce_variations_added', this.variation_added ) + .on( + 'keyup', + '.wc_input_variations_price', + this.maybe_enable_button_to_add_price_to_variations + ); }, /** @@ -30,7 +57,7 @@ jQuery( function( $ ) { * @param {Object} event * @param {Int} qty */ - reload: function() { + reload: function () { wc_meta_boxes_product_variations_ajax.load_variations( 1 ); wc_meta_boxes_product_variations_pagenav.set_paginav( 0 ); }, @@ -38,47 +65,89 @@ jQuery( function( $ ) { /** * Check if variation is downloadable and show/hide elements */ - variable_is_downloadable: function() { - $( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_downloadable' ).hide(); + variable_is_downloadable: function () { + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.show_if_variation_downloadable' ) + .hide(); if ( $( this ).is( ':checked' ) ) { - $( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_downloadable' ).show(); + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.show_if_variation_downloadable' ) + .show(); } }, /** * Check if variation is virtual and show/hide elements */ - variable_is_virtual: function() { - $( this ).closest( '.woocommerce_variation' ).find( '.hide_if_variation_virtual' ).show(); + variable_is_virtual: function () { + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.hide_if_variation_virtual' ) + .show(); if ( $( this ).is( ':checked' ) ) { - $( this ).closest( '.woocommerce_variation' ).find( '.hide_if_variation_virtual' ).hide(); + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.hide_if_variation_virtual' ) + .hide(); + } + }, + + /** + * Maybe enable the button to add a price for every variation + */ + maybe_enable_button_to_add_price_to_variations: function () { + var variation_price = parseInt( + $( '.wc_input_variations_price' ).val(), + 10 + ); + if ( isNaN( variation_price ) ) { + $( '.add_variations_price_button' ).prop( 'disabled', true ); + } else { + $( '.add_variations_price_button' ).prop( 'disabled', false ); } }, /** * Check if variation manage stock and show/hide elements */ - variable_manage_stock: function() { - $( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_manage_stock' ).hide(); - $( this ).closest( '.woocommerce_variation' ).find( '.variable_stock_status' ).show(); + variable_manage_stock: function () { + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.show_if_variation_manage_stock' ) + .hide(); + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.variable_stock_status' ) + .show(); if ( $( this ).is( ':checked' ) ) { - $( this ).closest( '.woocommerce_variation' ).find( '.show_if_variation_manage_stock' ).show(); - $( this ).closest( '.woocommerce_variation' ).find( '.variable_stock_status' ).hide(); + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.show_if_variation_manage_stock' ) + .show(); + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.variable_stock_status' ) + .hide(); } // Parent level. if ( $( 'input#_manage_stock:checked' ).length ) { - $( this ).closest( '.woocommerce_variation' ).find( '.variable_stock_status' ).hide(); + $( this ) + .closest( '.woocommerce_variation' ) + .find( '.variable_stock_status' ) + .hide(); } }, /** * Notice dismiss */ - notice_dismiss: function() { + notice_dismiss: function () { $( this ).closest( 'div.notice' ).remove(); }, @@ -88,31 +157,43 @@ jQuery( function( $ ) { * @param {Object} event * @param {Int} needsUpdate */ - variations_loaded: function( event, needsUpdate ) { + variations_loaded: function ( event, needsUpdate ) { needsUpdate = needsUpdate || false; var wrapper = $( '#woocommerce-product-data' ); if ( ! needsUpdate ) { // Show/hide downloadable, virtual and stock fields - $( 'input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock', wrapper ).trigger( 'change' ); + $( + 'input.variable_is_downloadable, input.variable_is_virtual, input.variable_manage_stock', + wrapper + ).trigger( 'change' ); // Open sale schedule fields when have some sale price date - $( '.woocommerce_variation', wrapper ).each( function( index, el ) { - var $el = $( el ), + $( '.woocommerce_variation', wrapper ).each( function ( + index, + el + ) { + var $el = $( el ), date_from = $( '.sale_price_dates_from', $el ).val(), - date_to = $( '.sale_price_dates_to', $el ).val(); + date_to = $( '.sale_price_dates_to', $el ).val(); if ( '' !== date_from || '' !== date_to ) { $( 'a.sale_schedule', $el ).trigger( 'click' ); } - }); + } ); // Remove variation-needs-update classes - $( '.woocommerce_variations .variation-needs-update', wrapper ).removeClass( 'variation-needs-update' ); + $( + '.woocommerce_variations .variation-needs-update', + wrapper + ).removeClass( 'variation-needs-update' ); // Disable cancel and save buttons - $( 'button.cancel-variation-changes, button.save-variation-changes', wrapper ).attr( 'disabled', 'disabled' ); + $( + 'button.cancel-variation-changes, button.save-variation-changes', + wrapper + ).attr( 'disabled', 'disabled' ); } // Init TipTip @@ -120,48 +201,53 @@ jQuery( function( $ ) { $( '#tiptip_arrow' ).removeAttr( 'style' ); $( '.woocommerce_variations .tips, ' + - '.woocommerce_variations .help_tip, ' + - '.woocommerce_variations .woocommerce-help-tip, ' + - '.toolbar-variations-defaults .woocommerce-help-tip', + '.woocommerce_variations .help_tip, ' + + '.woocommerce_variations .woocommerce-help-tip, ' + + '.toolbar-variations-defaults .woocommerce-help-tip', wrapper - ) - .tipTip({ - 'attribute': 'data-tip', - 'fadeIn': 50, - 'fadeOut': 50, - 'delay': 200 - }); + ).tipTip( { + attribute: 'data-tip', + fadeIn: 50, + fadeOut: 50, + delay: 200, + } ); // Datepicker fields - $( '.sale_price_dates_fields', wrapper ).find( 'input' ).datepicker({ - defaultDate: '', - dateFormat: 'yy-mm-dd', - numberOfMonths: 1, - showButtonPanel: true, - onSelect: function() { - var option = $( this ).is( '.sale_price_dates_from' ) ? 'minDate' : 'maxDate', - dates = $( this ).closest( '.sale_price_dates_fields' ).find( 'input' ), - date = $( this ).datepicker( 'getDate' ); + $( '.sale_price_dates_fields', wrapper ) + .find( 'input' ) + .datepicker( { + defaultDate: '', + dateFormat: 'yy-mm-dd', + numberOfMonths: 1, + showButtonPanel: true, + onSelect: function () { + var option = $( this ).is( '.sale_price_dates_from' ) + ? 'minDate' + : 'maxDate', + dates = $( this ) + .closest( '.sale_price_dates_fields' ) + .find( 'input' ), + date = $( this ).datepicker( 'getDate' ); - dates.not( this ).datepicker( 'option', option, date ); - $( this ).trigger( 'change' ); - } - }); + dates.not( this ).datepicker( 'option', option, date ); + $( this ).trigger( 'change' ); + }, + } ); // Allow sorting - $( '.woocommerce_variations', wrapper ).sortable({ - items: '.woocommerce_variation', - cursor: 'move', - axis: 'y', - handle: '.sort', - scrollSensitivity: 40, + $( '.woocommerce_variations', wrapper ).sortable( { + items: '.woocommerce_variation', + cursor: 'move', + axis: 'y', + handle: '.sort', + scrollSensitivity: 40, forcePlaceholderSize: true, - helper: 'clone', - opacity: 0.65, - stop: function() { - wc_meta_boxes_product_variations_actions.variation_row_indexes(); - } - }); + helper: 'clone', + opacity: 0.65, + stop: function () { + wc_meta_boxes_product_variations_actions.variation_row_indexes(); + }, + } ); $( document.body ).trigger( 'wc-enhanced-select-init' ); }, @@ -172,32 +258,85 @@ jQuery( function( $ ) { * @param {Object} event * @param {Int} qty */ - variation_added: function( event, qty ) { + variation_added: function ( event, qty ) { if ( 1 === qty ) { - wc_meta_boxes_product_variations_actions.variations_loaded( null, true ); + wc_meta_boxes_product_variations_actions.variations_loaded( + null, + true + ); } }, + /** + * Sets a price for every variation + */ + set_variations_price: function () { + var variation_price = $( '.wc_input_variations_price' ).val(); + var product_type = $( 'select#product-type' ).val(); + var input_type = + 'variable-subscription' === product_type + ? 'variable_subscription_sign_up_fee' + : 'variable_regular_price'; + var input = $( `.wc_input_price[name^=${ input_type }]` ); + + // We don't want to override prices already set + input.each( function ( index, el ) { + if ( '0' === $( el ).val() || '' === $( el ).val() ) { + $( el ).val( variation_price ).trigger( 'change' ); + } + } ); + wc_meta_boxes_product_variations_ajax.save_variations(); + }, + + /** + * Opens the modal to set a price for every variation + */ + open_modal_to_set_variations_price: function () { + $( this ).WCBackboneModal( { + template: 'wc-modal-set-price-variations', + } ); + $( '.add_variations_price_button' ).on( + 'click', + wc_meta_boxes_product_variations_actions.set_variations_price + ); + }, + /** * Lets the user manually input menu order to move items around pages */ - set_menu_order: function( event ) { + set_menu_order: function ( event ) { event.preventDefault(); - var $menu_order = $( this ).closest( '.woocommerce_variation' ).find( '.variation_menu_order' ); - var variation_id = $( this ).closest( '.woocommerce_variation' ).find( '.variable_post_id' ).val(); - var value = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_enter_menu_order, $menu_order.val() ); + var $menu_order = $( this ) + .closest( '.woocommerce_variation' ) + .find( '.variation_menu_order' ); + var variation_id = $( this ) + .closest( '.woocommerce_variation' ) + .find( '.variable_post_id' ) + .val(); + var value = window.prompt( + woocommerce_admin_meta_boxes_variations.i18n_enter_menu_order, + $menu_order.val() + ); if ( value != null ) { // Set value, save changes and reload view $menu_order.val( parseInt( value, 10 ) ).trigger( 'change' ); - $( this ).closest( '.woocommerce_variation' ) - .append( '' ); + $( this ) + .closest( '.woocommerce_variation' ) + .append( + '' + ); - $( this ).closest( '.woocommerce_variation' ) - .append( '' ); + $( this ) + .closest( '.woocommerce_variation' ) + .append( + '' + ); wc_meta_boxes_product_variations_ajax.save_variations(); } @@ -206,25 +345,40 @@ jQuery( function( $ ) { /** * Set menu order */ - variation_row_indexes: function() { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), + variation_row_indexes: function () { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), current_page = parseInt( wrapper.attr( 'data-page' ), 10 ), - offset = parseInt( ( current_page - 1 ) * woocommerce_admin_meta_boxes_variations.variations_per_page, 10 ); + offset = parseInt( + ( current_page - 1 ) * + woocommerce_admin_meta_boxes_variations.variations_per_page, + 10 + ); - $( '.woocommerce_variations .woocommerce_variation' ).each( function ( index, el ) { - $( '.variation_menu_order', el ) - .val( parseInt( $( el ) - .index( '.woocommerce_variations .woocommerce_variation' ), 10 ) + 1 + offset ) - .trigger( 'change' ); - }); - } + $( '.woocommerce_variations .woocommerce_variation' ).each( + function ( index, el ) { + $( '.variation_menu_order', el ) + .val( + parseInt( + $( el ).index( + '.woocommerce_variations .woocommerce_variation' + ), + 10 + ) + + 1 + + offset + ) + .trigger( 'change' ); + } + ); + }, }; /** * Variations media actions */ var wc_meta_boxes_product_variations_media = { - /** * wp.media frame object * @@ -256,8 +410,12 @@ jQuery( function( $ ) { /** * Initialize media actions */ - init: function() { - $( '#variable_product_options' ).on( 'click', '.upload_image_button', this.add_image ); + init: function () { + $( '#variable_product_options' ).on( + 'click', + '.upload_image_button', + this.add_image + ); $( 'a.add_media' ).on( 'click', this.restore_wp_media_post_id ); }, @@ -266,64 +424,101 @@ jQuery( function( $ ) { * * @param {Object} event */ - add_image: function( event ) { + add_image: function ( event ) { var $button = $( this ), post_id = $button.attr( 'rel' ), $parent = $button.closest( '.upload_image' ); - wc_meta_boxes_product_variations_media.setting_variation_image = $parent; + wc_meta_boxes_product_variations_media.setting_variation_image = $parent; wc_meta_boxes_product_variations_media.setting_variation_image_id = post_id; event.preventDefault(); if ( $button.is( '.remove' ) ) { - - $( '.upload_image_id', wc_meta_boxes_product_variations_media.setting_variation_image ).val( '' ).trigger( 'change' ); - wc_meta_boxes_product_variations_media.setting_variation_image.find( 'img' ).eq( 0 ) - .attr( 'src', woocommerce_admin_meta_boxes_variations.woocommerce_placeholder_img_src ); - wc_meta_boxes_product_variations_media.setting_variation_image.find( '.upload_image_button' ).removeClass( 'remove' ); - + $( + '.upload_image_id', + wc_meta_boxes_product_variations_media.setting_variation_image + ) + .val( '' ) + .trigger( 'change' ); + wc_meta_boxes_product_variations_media.setting_variation_image + .find( 'img' ) + .eq( 0 ) + .attr( + 'src', + woocommerce_admin_meta_boxes_variations.woocommerce_placeholder_img_src + ); + wc_meta_boxes_product_variations_media.setting_variation_image + .find( '.upload_image_button' ) + .removeClass( 'remove' ); } else { - // If the media frame already exists, reopen it. - if ( wc_meta_boxes_product_variations_media.variable_image_frame ) { - wc_meta_boxes_product_variations_media.variable_image_frame.uploader.uploader - .param( 'post_id', wc_meta_boxes_product_variations_media.setting_variation_image_id ); + if ( + wc_meta_boxes_product_variations_media.variable_image_frame + ) { + wc_meta_boxes_product_variations_media.variable_image_frame.uploader.uploader.param( + 'post_id', + wc_meta_boxes_product_variations_media.setting_variation_image_id + ); wc_meta_boxes_product_variations_media.variable_image_frame.open(); return; } else { - wp.media.model.settings.post.id = wc_meta_boxes_product_variations_media.setting_variation_image_id; + wp.media.model.settings.post.id = + wc_meta_boxes_product_variations_media.setting_variation_image_id; } // Create the media frame. - wc_meta_boxes_product_variations_media.variable_image_frame = wp.media.frames.variable_image = wp.media({ - // Set the title of the modal. - title: woocommerce_admin_meta_boxes_variations.i18n_choose_image, - button: { - text: woocommerce_admin_meta_boxes_variations.i18n_set_image - }, - states: [ - new wp.media.controller.Library({ - title: woocommerce_admin_meta_boxes_variations.i18n_choose_image, - filterable: 'all' - }) - ] - }); + wc_meta_boxes_product_variations_media.variable_image_frame = wp.media.frames.variable_image = wp.media( + { + // Set the title of the modal. + title: + woocommerce_admin_meta_boxes_variations.i18n_choose_image, + button: { + text: + woocommerce_admin_meta_boxes_variations.i18n_set_image, + }, + states: [ + new wp.media.controller.Library( { + title: + woocommerce_admin_meta_boxes_variations.i18n_choose_image, + filterable: 'all', + } ), + ], + } + ); // When an image is selected, run a callback. - wc_meta_boxes_product_variations_media.variable_image_frame.on( 'select', function () { + wc_meta_boxes_product_variations_media.variable_image_frame.on( + 'select', + function () { + var attachment = wc_meta_boxes_product_variations_media.variable_image_frame + .state() + .get( 'selection' ) + .first() + .toJSON(), + url = + attachment.sizes && attachment.sizes.thumbnail + ? attachment.sizes.thumbnail.url + : attachment.url; - var attachment = wc_meta_boxes_product_variations_media.variable_image_frame.state() - .get( 'selection' ).first().toJSON(), - url = attachment.sizes && attachment.sizes.thumbnail ? attachment.sizes.thumbnail.url : attachment.url; + $( + '.upload_image_id', + wc_meta_boxes_product_variations_media.setting_variation_image + ) + .val( attachment.id ) + .trigger( 'change' ); + wc_meta_boxes_product_variations_media.setting_variation_image + .find( '.upload_image_button' ) + .addClass( 'remove' ); + wc_meta_boxes_product_variations_media.setting_variation_image + .find( 'img' ) + .eq( 0 ) + .attr( 'src', url ); - $( '.upload_image_id', wc_meta_boxes_product_variations_media.setting_variation_image ).val( attachment.id ) - .trigger( 'change' ); - wc_meta_boxes_product_variations_media.setting_variation_image.find( '.upload_image_button' ).addClass( 'remove' ); - wc_meta_boxes_product_variations_media.setting_variation_image.find( 'img' ).eq( 0 ).attr( 'src', url ); - - wp.media.model.settings.post.id = wc_meta_boxes_product_variations_media.wp_media_post_id; - }); + wp.media.model.settings.post.id = + wc_meta_boxes_product_variations_media.wp_media_post_id; + } + ); // Finally, open the modal. wc_meta_boxes_product_variations_media.variable_image_frame.open(); @@ -333,41 +528,65 @@ jQuery( function( $ ) { /** * Restore wp.media post ID. */ - restore_wp_media_post_id: function() { - wp.media.model.settings.post.id = wc_meta_boxes_product_variations_media.wp_media_post_id; - } + restore_wp_media_post_id: function () { + wp.media.model.settings.post.id = + wc_meta_boxes_product_variations_media.wp_media_post_id; + }, }; /** * Product variations metabox ajax methods */ var wc_meta_boxes_product_variations_ajax = { - /** * Initialize variations ajax methods */ - init: function() { + init: function () { $( 'li.variations_tab a' ).on( 'click', this.initial_load ); $( '#variable_product_options' ) - .on( 'click', 'button.save-variation-changes', this.save_variations ) - .on( 'click', 'button.cancel-variation-changes', this.cancel_variations ) + .on( + 'click', + 'button.save-variation-changes', + this.save_variations + ) + .on( + 'click', + 'button.cancel-variation-changes', + this.cancel_variations + ) .on( 'click', '.remove_variation', this.remove_variation ) - .on( 'click','.downloadable_files a.delete', this.input_changed ); + .on( + 'click', + '.downloadable_files a.delete', + this.input_changed + ); $( document.body ) - .on( 'change input', '#variable_product_options .woocommerce_variations :input', this.input_changed ) - .on( 'change', '.variations-defaults select', this.defaults_changed ); + .on( + 'change input', + '#variable_product_options .woocommerce_variations :input', + this.input_changed + ) + .on( + 'change', + '.variations-defaults select', + this.defaults_changed + ); var postForm = $( 'form#post' ); postForm.on( 'submit', this.save_on_submit ); - $( 'input:submit', postForm ).on( 'click keypress', function() { + $( 'input:submit', postForm ).on( 'click keypress', function () { postForm.data( 'callerid', this.id ); - }); + } ); - $( '.wc-metaboxes-wrapper' ).on( 'click', 'a.do_variation_action', this.do_variation_action ); + $( '.wc-metaboxes-wrapper' ).on( + 'click', + 'a.do_variation_action', + this.do_variation_action + ); }, /** @@ -375,11 +594,17 @@ jQuery( function( $ ) { * * @return {Bool} */ - check_for_changes: function() { - var need_update = $( '#variable_product_options' ).find( '.woocommerce_variations .variation-needs-update' ); + check_for_changes: function () { + var need_update = $( '#variable_product_options' ).find( + '.woocommerce_variations .variation-needs-update' + ); if ( 0 < need_update.length ) { - if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_edited_variations ) ) { + if ( + window.confirm( + woocommerce_admin_meta_boxes_variations.i18n_edited_variations + ) + ) { wc_meta_boxes_product_variations_ajax.save_changes(); } else { need_update.removeClass( 'variation-needs-update' ); @@ -393,20 +618,20 @@ jQuery( function( $ ) { /** * Block edit screen */ - block: function() { - $( '#woocommerce-product-data' ).block({ + block: function () { + $( '#woocommerce-product-data' ).block( { message: null, overlayCSS: { background: '#fff', - opacity: 0.6 - } - }); + opacity: 0.6, + }, + } ); }, /** * Unblock edit screen */ - unblock: function() { + unblock: function () { $( '#woocommerce-product-data' ).unblock(); }, @@ -415,8 +640,13 @@ jQuery( function( $ ) { * * @return {Bool} */ - initial_load: function() { - if ( 0 === $( '#variable_product_options' ).find( '.woocommerce_variations .woocommerce_variation' ).length ) { + initial_load: function () { + if ( + 0 === + $( '#variable_product_options' ).find( + '.woocommerce_variations .woocommerce_variation' + ).length + ) { wc_meta_boxes_product_variations_pagenav.go_to_page(); } }, @@ -427,33 +657,43 @@ jQuery( function( $ ) { * @param {Int} page (default: 1) * @param {Int} per_page (default: 10) */ - load_variations: function( page, per_page ) { - page = page || 1; - per_page = per_page || woocommerce_admin_meta_boxes_variations.variations_per_page; + load_variations: function ( page, per_page ) { + page = page || 1; + per_page = + per_page || + woocommerce_admin_meta_boxes_variations.variations_per_page; - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ); + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ); wc_meta_boxes_product_variations_ajax.block(); - $.ajax({ + $.ajax( { url: woocommerce_admin_meta_boxes_variations.ajax_url, data: { - action: 'woocommerce_load_variations', - security: woocommerce_admin_meta_boxes_variations.load_variations_nonce, + action: 'woocommerce_load_variations', + security: + woocommerce_admin_meta_boxes_variations.load_variations_nonce, product_id: woocommerce_admin_meta_boxes_variations.post_id, attributes: wrapper.data( 'attributes' ), - page: page, - per_page: per_page + page: page, + per_page: per_page, }, type: 'POST', - success: function( response ) { - wrapper.empty().append( response ).attr( 'data-page', page ); + success: function ( response ) { + wrapper + .empty() + .append( response ) + .attr( 'data-page', page ); - $( '#woocommerce-product-data' ).trigger( 'woocommerce_variations_loaded' ); + $( '#woocommerce-product-data' ).trigger( + 'woocommerce_variations_loaded' + ); wc_meta_boxes_product_variations_ajax.unblock(); - } - }); + }, + } ); }, /** @@ -463,13 +703,16 @@ jQuery( function( $ ) { * * @return {Object} */ - get_variations_fields: function( fields ) { + get_variations_fields: function ( fields ) { var data = $( ':input', fields ).serializeJSON(); - $( '.variations-defaults select' ).each( function( index, element ) { + $( '.variations-defaults select' ).each( function ( + index, + element + ) { var select = $( element ); data[ select.attr( 'name' ) ] = select.val(); - }); + } ); return data; }, @@ -479,39 +722,49 @@ jQuery( function( $ ) { * * @param {Function} callback Called once saving is complete */ - save_changes: function( callback ) { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), + save_changes: function ( callback ) { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), need_update = $( '.variation-needs-update', wrapper ), - data = {}; + data = {}; // Save only with products need update. if ( 0 < need_update.length ) { wc_meta_boxes_product_variations_ajax.block(); - data = wc_meta_boxes_product_variations_ajax.get_variations_fields( need_update ); - data.action = 'woocommerce_save_variations'; - data.security = woocommerce_admin_meta_boxes_variations.save_variations_nonce; - data.product_id = woocommerce_admin_meta_boxes_variations.post_id; - data['product-type'] = $( '#product-type' ).val(); + data = wc_meta_boxes_product_variations_ajax.get_variations_fields( + need_update + ); + data.action = 'woocommerce_save_variations'; + data.security = + woocommerce_admin_meta_boxes_variations.save_variations_nonce; + data.product_id = + woocommerce_admin_meta_boxes_variations.post_id; + data[ 'product-type' ] = $( '#product-type' ).val(); - $.ajax({ + $.ajax( { url: woocommerce_admin_meta_boxes_variations.ajax_url, data: data, type: 'POST', - success: function( response ) { + success: function ( response ) { // Allow change page, delete and add new variations need_update.removeClass( 'variation-needs-update' ); - $( 'button.cancel-variation-changes, button.save-variation-changes' ).attr( 'disabled', 'disabled' ); + $( + 'button.cancel-variation-changes, button.save-variation-changes' + ).attr( 'disabled', 'disabled' ); - $( '#woocommerce-product-data' ).trigger( 'woocommerce_variations_saved' ); + $( '#woocommerce-product-data' ).trigger( + 'woocommerce_variations_saved' + ); if ( typeof callback === 'function' ) { callback( response ); } wc_meta_boxes_product_variations_ajax.unblock(); - } - }); + }, + } ); } }, @@ -520,25 +773,33 @@ jQuery( function( $ ) { * * @return {Bool} */ - save_variations: function() { - $( '#variable_product_options' ).trigger( 'woocommerce_variations_save_variations_button' ); + save_variations: function () { + $( '#variable_product_options' ).trigger( + 'woocommerce_variations_save_variations_button' + ); - wc_meta_boxes_product_variations_ajax.save_changes( function( error ) { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), + wc_meta_boxes_product_variations_ajax.save_changes( function ( + error + ) { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), current = wrapper.attr( 'data-page' ); - $( '#variable_product_options' ).find( '#woocommerce_errors' ).remove(); + $( '#variable_product_options' ) + .find( '#woocommerce_errors' ) + .remove(); if ( error ) { wrapper.before( error ); } - $( '.variations-defaults select' ).each( function() { + $( '.variations-defaults select' ).each( function () { $( this ).attr( 'data-current', $( this ).val() ); - }); + } ); wc_meta_boxes_product_variations_pagenav.go_to_page( current ); - }); + } ); return false; }, @@ -546,27 +807,41 @@ jQuery( function( $ ) { /** * Save on post form submit */ - save_on_submit: function( e ) { - var need_update = $( '#variable_product_options' ).find( '.woocommerce_variations .variation-needs-update' ); + save_on_submit: function ( e ) { + var need_update = $( '#variable_product_options' ).find( + '.woocommerce_variations .variation-needs-update' + ); if ( 0 < need_update.length ) { e.preventDefault(); - $( '#variable_product_options' ).trigger( 'woocommerce_variations_save_variations_on_submit' ); - wc_meta_boxes_product_variations_ajax.save_changes( wc_meta_boxes_product_variations_ajax.save_on_submit_done ); + $( '#variable_product_options' ).trigger( + 'woocommerce_variations_save_variations_on_submit' + ); + wc_meta_boxes_product_variations_ajax.save_changes( + wc_meta_boxes_product_variations_ajax.save_on_submit_done + ); } }, /** * After saved, continue with form submission */ - save_on_submit_done: function() { + save_on_submit_done: function () { var postForm = $( 'form#post' ), callerid = postForm.data( 'callerid' ); if ( 'publish' === callerid ) { - postForm.append('').trigger( 'submit' ); + postForm + .append( + '' + ) + .trigger( 'submit' ); } else { - postForm.append('').trigger( 'submit' ); + postForm + .append( + '' + ) + .trigger( 'submit' ); } }, @@ -575,14 +850,20 @@ jQuery( function( $ ) { * * @return {Bool} */ - cancel_variations: function() { - var current = parseInt( $( '#variable_product_options' ).find( '.woocommerce_variations' ).attr( 'data-page' ), 10 ); + cancel_variations: function () { + var current = parseInt( + $( '#variable_product_options' ) + .find( '.woocommerce_variations' ) + .attr( 'data-page' ), + 10 + ); - $( '#variable_product_options' ).find( '.woocommerce_variations .variation-needs-update' ) + $( '#variable_product_options' ) + .find( '.woocommerce_variations .variation-needs-update' ) .removeClass( 'variation-needs-update' ); - $( '.variations-defaults select' ).each( function() { + $( '.variations-defaults select' ).each( function () { $( this ).val( $( this ).attr( 'data-current' ) ); - }); + } ); wc_meta_boxes_product_variations_pagenav.go_to_page( current ); @@ -594,26 +875,38 @@ jQuery( function( $ ) { * * @return {Bool} */ - add_variation: function() { + add_variation: function () { wc_meta_boxes_product_variations_ajax.block(); var data = { action: 'woocommerce_add_variation', post_id: woocommerce_admin_meta_boxes_variations.post_id, loop: $( '.woocommerce_variation' ).length, - security: woocommerce_admin_meta_boxes_variations.add_variation_nonce + security: + woocommerce_admin_meta_boxes_variations.add_variation_nonce, }; - $.post( woocommerce_admin_meta_boxes_variations.ajax_url, data, function( response ) { - var variation = $( response ); - variation.addClass( 'variation-needs-update' ); + $.post( + woocommerce_admin_meta_boxes_variations.ajax_url, + data, + function ( response ) { + var variation = $( response ); + variation.addClass( 'variation-needs-update' ); - $( '.woocommerce-notice-invalid-variation' ).remove(); - $( '#variable_product_options' ).find( '.woocommerce_variations' ).prepend( variation ); - $( 'button.cancel-variation-changes, button.save-variation-changes' ).prop( 'disabled', false ); - $( '#variable_product_options' ).trigger( 'woocommerce_variations_added', 1 ); - wc_meta_boxes_product_variations_ajax.unblock(); - }); + $( '.woocommerce-notice-invalid-variation' ).remove(); + $( '#variable_product_options' ) + .find( '.woocommerce_variations' ) + .prepend( variation ); + $( + 'button.cancel-variation-changes, button.save-variation-changes' + ).prop( 'disabled', false ); + $( '#variable_product_options' ).trigger( + 'woocommerce_variations_added', + 1 + ); + wc_meta_boxes_product_variations_ajax.unblock(); + } + ); return false; }, @@ -623,14 +916,18 @@ jQuery( function( $ ) { * * @return {Bool} */ - remove_variation: function() { + remove_variation: function () { wc_meta_boxes_product_variations_ajax.check_for_changes(); - if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_remove_variation ) ) { - var variation = $( this ).attr( 'rel' ), + if ( + window.confirm( + woocommerce_admin_meta_boxes_variations.i18n_remove_variation + ) + ) { + var variation = $( this ).attr( 'rel' ), variation_ids = [], - data = { - action: 'woocommerce_remove_variations' + data = { + action: 'woocommerce_remove_variations', }; wc_meta_boxes_product_variations_ajax.block(); @@ -639,27 +936,52 @@ jQuery( function( $ ) { variation_ids.push( variation ); data.variation_ids = variation_ids; - data.security = woocommerce_admin_meta_boxes_variations.delete_variations_nonce; + data.security = + woocommerce_admin_meta_boxes_variations.delete_variations_nonce; - $.post( woocommerce_admin_meta_boxes_variations.ajax_url, data, function() { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), - current_page = parseInt( wrapper.attr( 'data-page' ), 10 ), - total_pages = Math.ceil( ( - parseInt( wrapper.attr( 'data-total' ), 10 ) - 1 - ) / woocommerce_admin_meta_boxes_variations.variations_per_page ), - page = 1; + $.post( + woocommerce_admin_meta_boxes_variations.ajax_url, + data, + function () { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), + current_page = parseInt( + wrapper.attr( 'data-page' ), + 10 + ), + total_pages = Math.ceil( + ( parseInt( + wrapper.attr( 'data-total' ), + 10 + ) - + 1 ) / + woocommerce_admin_meta_boxes_variations.variations_per_page + ), + page = 1; - $( '#woocommerce-product-data' ).trigger( 'woocommerce_variations_removed' ); + $( '#woocommerce-product-data' ).trigger( + 'woocommerce_variations_removed' + ); - if ( current_page === total_pages || current_page <= total_pages ) { - page = current_page; - } else if ( current_page > total_pages && 0 !== total_pages ) { - page = total_pages; + if ( + current_page === total_pages || + current_page <= total_pages + ) { + page = current_page; + } else if ( + current_page > total_pages && + 0 !== total_pages + ) { + page = total_pages; + } + + wc_meta_boxes_product_variations_pagenav.go_to_page( + page, + -1 + ); } - - wc_meta_boxes_product_variations_pagenav.go_to_page( page, -1 ); - }); - + ); } else { wc_meta_boxes_product_variations_ajax.unblock(); } @@ -673,36 +995,61 @@ jQuery( function( $ ) { * * @return {Bool} */ - link_all_variations: function() { + link_all_variations: function () { wc_meta_boxes_product_variations_ajax.check_for_changes(); - if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_link_all_variations ) ) { + if ( + window.confirm( + woocommerce_admin_meta_boxes_variations.i18n_link_all_variations + ) + ) { wc_meta_boxes_product_variations_ajax.block(); var data = { action: 'woocommerce_link_all_variations', post_id: woocommerce_admin_meta_boxes_variations.post_id, - security: woocommerce_admin_meta_boxes_variations.link_variation_nonce + security: + woocommerce_admin_meta_boxes_variations.link_variation_nonce, }; - $.post( woocommerce_admin_meta_boxes_variations.ajax_url, data, function( response ) { - var count = parseInt( response, 10 ); + $.post( + woocommerce_admin_meta_boxes_variations.ajax_url, + data, + function ( response ) { + var count = parseInt( response, 10 ); - if ( 1 === count ) { - window.alert( count + ' ' + woocommerce_admin_meta_boxes_variations.i18n_variation_added ); - } else if ( 0 === count || count > 1 ) { - window.alert( count + ' ' + woocommerce_admin_meta_boxes_variations.i18n_variations_added ); - } else { - window.alert( woocommerce_admin_meta_boxes_variations.i18n_no_variations_added ); - } + if ( 1 === count ) { + window.alert( + count + + ' ' + + woocommerce_admin_meta_boxes_variations.i18n_variation_added + ); + } else if ( 0 === count || count > 1 ) { + window.alert( + count + + ' ' + + woocommerce_admin_meta_boxes_variations.i18n_variations_added + ); + } else { + window.alert( + woocommerce_admin_meta_boxes_variations.i18n_no_variations_added + ); + } - if ( count > 0 ) { - wc_meta_boxes_product_variations_pagenav.go_to_page( 1, count ); - $( '#variable_product_options' ).trigger( 'woocommerce_variations_added', count ); - } else { - wc_meta_boxes_product_variations_ajax.unblock(); + if ( count > 0 ) { + wc_meta_boxes_product_variations_pagenav.go_to_page( + 1, + count + ); + $( '#variable_product_options' ).trigger( + 'woocommerce_variations_added', + count + ); + } else { + wc_meta_boxes_product_variations_ajax.unblock(); + } } - }); + ); } return false; @@ -711,87 +1058,119 @@ jQuery( function( $ ) { /** * Add new class when have changes in some input */ - input_changed: function( event ) { + input_changed: function ( event ) { $( this ) .closest( '.woocommerce_variation' ) .addClass( 'variation-needs-update' ); - $( 'button.cancel-variation-changes, button.save-variation-changes' ).prop( 'disabled', false ); + $( + 'button.cancel-variation-changes, button.save-variation-changes' + ).prop( 'disabled', false ); // Do not trigger 'woocommerce_variations_input_changed' for 'input' events for backwards compat. if ( 'input' === event.type && $( this ).is( ':text' ) ) { return; } - $( '#variable_product_options' ).trigger( 'woocommerce_variations_input_changed' ); + $( '#variable_product_options' ).trigger( + 'woocommerce_variations_input_changed' + ); }, /** * Added new .variation-needs-update class when defaults is changed */ - defaults_changed: function() { + defaults_changed: function () { $( this ) .closest( '#variable_product_options' ) .find( '.woocommerce_variation:first' ) .addClass( 'variation-needs-update' ); - $( 'button.cancel-variation-changes, button.save-variation-changes' ).prop( 'disabled', false ); + $( + 'button.cancel-variation-changes, button.save-variation-changes' + ).prop( 'disabled', false ); - $( '#variable_product_options' ).trigger( 'woocommerce_variations_defaults_changed' ); + $( '#variable_product_options' ).trigger( + 'woocommerce_variations_defaults_changed' + ); }, /** * Actions */ - do_variation_action: function() { + do_variation_action: function () { var do_variation_action = $( 'select.variation_actions' ).val(), - data = {}, - changes = 0, + data = {}, + changes = 0, value; switch ( do_variation_action ) { - case 'add_variation' : + case 'add_variation': wc_meta_boxes_product_variations_ajax.add_variation(); return; - case 'link_all_variations' : + case 'link_all_variations': wc_meta_boxes_product_variations_ajax.link_all_variations(); return; - case 'delete_all' : - if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_delete_all_variations ) ) { - if ( window.confirm( woocommerce_admin_meta_boxes_variations.i18n_last_warning ) ) { + case 'delete_all': + if ( + window.confirm( + woocommerce_admin_meta_boxes_variations.i18n_delete_all_variations + ) + ) { + if ( + window.confirm( + woocommerce_admin_meta_boxes_variations.i18n_last_warning + ) + ) { data.allowed = true; - changes = parseInt( $( '#variable_product_options' ).find( '.woocommerce_variations' ) - .attr( 'data-total' ), 10 ) * -1; + changes = + parseInt( + $( '#variable_product_options' ) + .find( '.woocommerce_variations' ) + .attr( 'data-total' ), + 10 + ) * -1; } } break; - case 'variable_regular_price_increase' : - case 'variable_regular_price_decrease' : - case 'variable_sale_price_increase' : - case 'variable_sale_price_decrease' : - value = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_enter_a_value_fixed_or_percent ); + case 'variable_regular_price_increase': + case 'variable_regular_price_decrease': + case 'variable_sale_price_increase': + case 'variable_sale_price_decrease': + value = window.prompt( + woocommerce_admin_meta_boxes_variations.i18n_enter_a_value_fixed_or_percent + ); if ( value != null ) { if ( value.indexOf( '%' ) >= 0 ) { - data.value = accounting.unformat( value.replace( /\%/, '' ), woocommerce_admin.mon_decimal_point ) + '%'; + data.value = + accounting.unformat( + value.replace( /\%/, '' ), + woocommerce_admin.mon_decimal_point + ) + '%'; } else { - data.value = accounting.unformat( value, woocommerce_admin.mon_decimal_point ); + data.value = accounting.unformat( + value, + woocommerce_admin.mon_decimal_point + ); } } else { return; } break; - case 'variable_regular_price' : - case 'variable_sale_price' : - case 'variable_stock' : - case 'variable_low_stock_amount' : - case 'variable_weight' : - case 'variable_length' : - case 'variable_width' : - case 'variable_height' : - case 'variable_download_limit' : - case 'variable_download_expiry' : - value = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_enter_a_value ); + case 'variable_regular_price': + case 'variable_sale_price': + case 'variable_stock': + case 'variable_low_stock_amount': + case 'variable_weight': + case 'variable_length': + case 'variable_width': + case 'variable_height': + case 'variable_download_limit': + case 'variable_download_expiry': + value = window.prompt( + woocommerce_admin_meta_boxes_variations.i18n_enter_a_value + ); if ( value != null ) { data.value = value; @@ -799,9 +1178,13 @@ jQuery( function( $ ) { return; } break; - case 'variable_sale_schedule' : - data.date_from = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_start ); - data.date_to = window.prompt( woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_end ); + case 'variable_sale_schedule': + data.date_from = window.prompt( + woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_start + ); + data.date_to = window.prompt( + woocommerce_admin_meta_boxes_variations.i18n_scheduled_sale_end + ); if ( null === data.date_from ) { data.date_from = false; @@ -815,9 +1198,14 @@ jQuery( function( $ ) { return; } break; - default : - $( 'select.variation_actions' ).trigger( do_variation_action ); - data = $( 'select.variation_actions' ).triggerHandler( do_variation_action + '_ajax_data', data ); + default: + $( 'select.variation_actions' ).trigger( + do_variation_action + ); + data = $( 'select.variation_actions' ).triggerHandler( + do_variation_action + '_ajax_data', + data + ); if ( null === data ) { return; @@ -826,47 +1214,67 @@ jQuery( function( $ ) { } if ( 'delete_all' === do_variation_action && data.allowed ) { - $( '#variable_product_options' ).find( '.variation-needs-update' ).removeClass( 'variation-needs-update' ); + $( '#variable_product_options' ) + .find( '.variation-needs-update' ) + .removeClass( 'variation-needs-update' ); } else { wc_meta_boxes_product_variations_ajax.check_for_changes(); } wc_meta_boxes_product_variations_ajax.block(); - $.ajax({ + $.ajax( { url: woocommerce_admin_meta_boxes_variations.ajax_url, data: { - action: 'woocommerce_bulk_edit_variations', - security: woocommerce_admin_meta_boxes_variations.bulk_edit_variations_nonce, - product_id: woocommerce_admin_meta_boxes_variations.post_id, + action: 'woocommerce_bulk_edit_variations', + security: + woocommerce_admin_meta_boxes_variations.bulk_edit_variations_nonce, + product_id: woocommerce_admin_meta_boxes_variations.post_id, product_type: $( '#product-type' ).val(), - bulk_action: do_variation_action, - data: data + bulk_action: do_variation_action, + data: data, }, type: 'POST', - success: function() { - wc_meta_boxes_product_variations_pagenav.go_to_page( 1, changes ); - } - }); - } + success: function () { + wc_meta_boxes_product_variations_pagenav.go_to_page( + 1, + changes + ); + }, + } ); + }, }; /** * Product variations pagenav */ var wc_meta_boxes_product_variations_pagenav = { - /** * Initialize products variations meta box */ - init: function() { + init: function () { $( document.body ) - .on( 'woocommerce_variations_added', this.update_single_quantity ) - .on( 'change', '.variations-pagenav .page-selector', this.page_selector ) - .on( 'click', '.variations-pagenav .first-page', this.first_page ) + .on( + 'woocommerce_variations_added', + this.update_single_quantity + ) + .on( + 'change', + '.variations-pagenav .page-selector', + this.page_selector + ) + .on( + 'click', + '.variations-pagenav .first-page', + this.first_page + ) .on( 'click', '.variations-pagenav .prev-page', this.prev_page ) .on( 'click', '.variations-pagenav .next-page', this.next_page ) - .on( 'click', '.variations-pagenav .last-page', this.last_page ); + .on( + 'click', + '.variations-pagenav .last-page', + this.last_page + ); }, /** @@ -876,18 +1284,30 @@ jQuery( function( $ ) { * * @return {Int} */ - update_variations_count: function( qty ) { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), - total = parseInt( wrapper.attr( 'data-total' ), 10 ) + qty, + update_variations_count: function ( qty ) { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), + total = parseInt( wrapper.attr( 'data-total' ), 10 ) + qty, displaying_num = $( '.variations-pagenav .displaying-num' ); // Set the new total of variations wrapper.attr( 'data-total', total ); if ( 1 === total ) { - displaying_num.text( woocommerce_admin_meta_boxes_variations.i18n_variation_count_single.replace( '%qty%', total ) ); + displaying_num.text( + woocommerce_admin_meta_boxes_variations.i18n_variation_count_single.replace( + '%qty%', + total + ) + ); } else { - displaying_num.text( woocommerce_admin_meta_boxes_variations.i18n_variation_count_plural.replace( '%qty%', total ) ); + displaying_num.text( + woocommerce_admin_meta_boxes_variations.i18n_variation_count_plural.replace( + '%qty%', + total + ) + ); } return total; @@ -899,11 +1319,13 @@ jQuery( function( $ ) { * @param {Object} event * @param {Int} qty */ - update_single_quantity: function( event, qty ) { + update_single_quantity: function ( event, qty ) { if ( 1 === qty ) { var page_nav = $( '.variations-pagenav' ); - wc_meta_boxes_product_variations_pagenav.update_variations_count( qty ); + wc_meta_boxes_product_variations_pagenav.update_variations_count( + qty + ); if ( page_nav.is( ':hidden' ) ) { $( 'option, optgroup', '.variation_actions' ).show(); @@ -920,15 +1342,22 @@ jQuery( function( $ ) { * * @param {Int} qty */ - set_paginav: function( qty ) { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), - new_qty = wc_meta_boxes_product_variations_pagenav.update_variations_count( qty ), - toolbar = $( '#variable_product_options' ).find( '.toolbar' ), + set_paginav: function ( qty ) { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), + new_qty = wc_meta_boxes_product_variations_pagenav.update_variations_count( + qty + ), + toolbar = $( '#variable_product_options' ).find( '.toolbar' ), variation_action = $( '.variation_actions' ), - page_nav = $( '.variations-pagenav' ), + page_nav = $( '.variations-pagenav' ), displaying_links = $( '.pagination-links', page_nav ), - total_pages = Math.ceil( new_qty / woocommerce_admin_meta_boxes_variations.variations_per_page ), - options = ''; + total_pages = Math.ceil( + new_qty / + woocommerce_admin_meta_boxes_variations.variations_per_page + ), + options = ''; // Set the new total of pages wrapper.attr( 'data-total_pages', total_pages ); @@ -949,7 +1378,6 @@ jQuery( function( $ ) { $( 'option, optgroup', variation_action ).hide(); $( '.variation_actions' ).val( 'add_variation' ); $( 'option[data-global="true"]', variation_action ).show(); - } else { toolbar.show(); page_nav.show(); @@ -970,18 +1398,18 @@ jQuery( function( $ ) { * * @return {Bool} */ - check_is_enabled: function( current ) { + check_is_enabled: function ( current ) { return ! $( current ).hasClass( 'disabled' ); }, /** * Change "disabled" class on pagenav */ - change_classes: function( selected, total ) { + change_classes: function ( selected, total ) { var first_page = $( '.variations-pagenav .first-page' ), - prev_page = $( '.variations-pagenav .prev-page' ), - next_page = $( '.variations-pagenav .next-page' ), - last_page = $( '.variations-pagenav .last-page' ); + prev_page = $( '.variations-pagenav .prev-page' ), + next_page = $( '.variations-pagenav .next-page' ), + last_page = $( '.variations-pagenav .last-page' ); if ( 1 === selected ) { first_page.addClass( 'disabled' ); @@ -1003,8 +1431,11 @@ jQuery( function( $ ) { /** * Set page */ - set_page: function( page ) { - $( '.variations-pagenav .page-selector' ).val( page ).first().trigger( 'change' ); + set_page: function ( page ) { + $( '.variations-pagenav .page-selector' ) + .val( page ) + .first() + .trigger( 'change' ); }, /** @@ -1013,9 +1444,9 @@ jQuery( function( $ ) { * @param {Int} page * @param {Int} qty */ - go_to_page: function( page, qty ) { + go_to_page: function ( page, qty ) { page = page || 1; - qty = qty || 0; + qty = qty || 0; wc_meta_boxes_product_variations_pagenav.set_paginav( qty ); wc_meta_boxes_product_variations_pagenav.set_page( page ); @@ -1024,14 +1455,19 @@ jQuery( function( $ ) { /** * Paginav pagination selector */ - page_selector: function() { + page_selector: function () { var selected = parseInt( $( this ).val(), 10 ), - wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ); + wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ); $( '.variations-pagenav .page-selector' ).val( selected ); wc_meta_boxes_product_variations_ajax.check_for_changes(); - wc_meta_boxes_product_variations_pagenav.change_classes( selected, parseInt( wrapper.attr( 'data-total_pages' ), 10 ) ); + wc_meta_boxes_product_variations_pagenav.change_classes( + selected, + parseInt( wrapper.attr( 'data-total_pages' ), 10 ) + ); wc_meta_boxes_product_variations_ajax.load_variations( selected ); }, @@ -1040,8 +1476,12 @@ jQuery( function( $ ) { * * @return {Bool} */ - first_page: function() { - if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) { + first_page: function () { + if ( + wc_meta_boxes_product_variations_pagenav.check_is_enabled( + this + ) + ) { wc_meta_boxes_product_variations_pagenav.set_page( 1 ); } @@ -1053,11 +1493,17 @@ jQuery( function( $ ) { * * @return {Bool} */ - prev_page: function() { - if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), + prev_page: function () { + if ( + wc_meta_boxes_product_variations_pagenav.check_is_enabled( + this + ) + ) { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), prev_page = parseInt( wrapper.attr( 'data-page' ), 10 ) - 1, - new_page = ( 0 < prev_page ) ? prev_page : 1; + new_page = 0 < prev_page ? prev_page : 1; wc_meta_boxes_product_variations_pagenav.set_page( new_page ); } @@ -1070,12 +1516,22 @@ jQuery( function( $ ) { * * @return {Bool} */ - next_page: function() { - if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) { - var wrapper = $( '#variable_product_options' ).find( '.woocommerce_variations' ), - total_pages = parseInt( wrapper.attr( 'data-total_pages' ), 10 ), - next_page = parseInt( wrapper.attr( 'data-page' ), 10 ) + 1, - new_page = ( total_pages >= next_page ) ? next_page : total_pages; + next_page: function () { + if ( + wc_meta_boxes_product_variations_pagenav.check_is_enabled( + this + ) + ) { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ), + total_pages = parseInt( + wrapper.attr( 'data-total_pages' ), + 10 + ), + next_page = parseInt( wrapper.attr( 'data-page' ), 10 ) + 1, + new_page = + total_pages >= next_page ? next_page : total_pages; wc_meta_boxes_product_variations_pagenav.set_page( new_page ); } @@ -1088,20 +1544,25 @@ jQuery( function( $ ) { * * @return {Bool} */ - last_page: function() { - if ( wc_meta_boxes_product_variations_pagenav.check_is_enabled( this ) ) { - var last_page = $( '#variable_product_options' ).find( '.woocommerce_variations' ).attr( 'data-total_pages' ); + last_page: function () { + if ( + wc_meta_boxes_product_variations_pagenav.check_is_enabled( + this + ) + ) { + var last_page = $( '#variable_product_options' ) + .find( '.woocommerce_variations' ) + .attr( 'data-total_pages' ); wc_meta_boxes_product_variations_pagenav.set_page( last_page ); } return false; - } + }, }; wc_meta_boxes_product_variations_actions.init(); wc_meta_boxes_product_variations_media.init(); wc_meta_boxes_product_variations_ajax.init(); wc_meta_boxes_product_variations_pagenav.init(); - -}); +} ); diff --git a/plugins/woocommerce/client/legacy/js/admin/woocommerce_admin.js b/plugins/woocommerce/client/legacy/js/admin/woocommerce_admin.js index 7db81de1724..4b34a0d1302 100644 --- a/plugins/woocommerce/client/legacy/js/admin/woocommerce_admin.js +++ b/plugins/woocommerce/client/legacy/js/admin/woocommerce_admin.js @@ -1,32 +1,32 @@ /* global woocommerce_admin */ -( function( $, woocommerce_admin ) { - $( function() { +( function ( $, woocommerce_admin ) { + $( function () { if ( 'undefined' === typeof woocommerce_admin ) { return; } // Add buttons to product screen. var $product_screen = $( '.edit-php.post-type-product' ), - $title_action = $product_screen.find( '.page-title-action:first' ), - $blankslate = $product_screen.find( '.woocommerce-BlankState' ); + $title_action = $product_screen.find( '.page-title-action:first' ), + $blankslate = $product_screen.find( '.woocommerce-BlankState' ); if ( 0 === $blankslate.length ) { if ( woocommerce_admin.urls.export_products ) { $title_action.after( '' + - woocommerce_admin.strings.export_products + - '' + woocommerce_admin.urls.export_products + + '" class="page-title-action">' + + woocommerce_admin.strings.export_products + + '' ); } if ( woocommerce_admin.urls.import_products ) { $title_action.after( '' + - woocommerce_admin.strings.import_products + - '' + woocommerce_admin.urls.import_products + + '" class="page-title-action">' + + woocommerce_admin.strings.import_products + + '' ); } } else { @@ -34,60 +34,103 @@ } // Progress indicators when showing steps. - $( '.woocommerce-progress-form-wrapper .button-next' ).on( 'click', function() { - $('.wc-progress-form-content').block({ - message: null, - overlayCSS: { - background: '#fff', - opacity: 0.6 - } - }); - return true; - } ); + $( '.woocommerce-progress-form-wrapper .button-next' ).on( + 'click', + function () { + $( '.wc-progress-form-content' ).block( { + message: null, + overlayCSS: { + background: '#fff', + opacity: 0.6, + }, + } ); + return true; + } + ); // Field validation error tips $( document.body ) - - .on( 'wc_add_error_tip', function( e, element, error_type ) { + .on( 'wc_add_error_tip', function ( e, element, error_type ) { var offset = element.position(); if ( element.parent().find( '.wc_error_tip' ).length === 0 ) { - element.after( '
' + woocommerce_admin[error_type] + '
' ); - element.parent().find( '.wc_error_tip' ) - .css( 'left', offset.left + element.width() - ( element.width() / 2 ) - ( $( '.wc_error_tip' ).width() / 2 ) ) + element.after( + '
' + + woocommerce_admin[ error_type ] + + '
' + ); + element + .parent() + .find( '.wc_error_tip' ) + .css( + 'left', + offset.left + + element.width() - + element.width() / 2 - + $( '.wc_error_tip' ).width() / 2 + ) .css( 'top', offset.top + element.height() ) .fadeIn( '100' ); } - }) + } ) - .on( 'wc_remove_error_tip', function( e, element, error_type ) { - element.parent().find( '.wc_error_tip.' + error_type ).fadeOut( '100', function() { $( this ).remove(); } ); - }) + .on( 'wc_remove_error_tip', function ( e, element, error_type ) { + element + .parent() + .find( '.wc_error_tip.' + error_type ) + .fadeOut( '100', function () { + $( this ).remove(); + } ); + } ) - .on( 'click', function() { - $( '.wc_error_tip' ).fadeOut( '100', function() { $( this ).remove(); } ); - }) + .on( 'click', function () { + $( '.wc_error_tip' ).fadeOut( '100', function () { + $( this ).remove(); + } ); + } ) - .on( 'blur', '.wc_input_decimal[type=text], .wc_input_price[type=text], .wc_input_country_iso[type=text]', function() { - $( '.wc_error_tip' ).fadeOut( '100', function() { $( this ).remove(); } ); - }) + .on( + 'blur', + '.wc_input_decimal[type=text], .wc_input_price[type=text], .wc_input_country_iso[type=text]', + function () { + $( '.wc_error_tip' ).fadeOut( '100', function () { + $( this ).remove(); + } ); + } + ) .on( 'change', - '.wc_input_price[type=text], .wc_input_decimal[type=text], .wc-order-totals #refund_amount[type=text]', - function() { - var regex, decimalRegex, + '.wc_input_price[type=text], .wc_input_decimal[type=text], .wc-order-totals #refund_amount[type=text], ' + + '.wc_input_variations_price[type=text]', + function () { + var regex, + decimalRegex, decimailPoint = woocommerce_admin.decimal_point; - if ( $( this ).is( '.wc_input_price' ) || $( this ).is( '#refund_amount' ) ) { + if ( + $( this ).is( '.wc_input_price' ) || + $( this ).is( '.wc_input_variations_price' ) || + $( this ).is( '#refund_amount' ) + ) { decimailPoint = woocommerce_admin.mon_decimal_point; } - regex = new RegExp( '[^\-0-9\%\\' + decimailPoint + ']+', 'gi' ); - decimalRegex = new RegExp( '\\' + decimailPoint + '+', 'gi' ); + regex = new RegExp( + '[^-0-9%\\' + decimailPoint + ']+', + 'gi' + ); + decimalRegex = new RegExp( + '\\' + decimailPoint + '+', + 'gi' + ); - var value = $( this ).val(); - var newvalue = value.replace( regex, '' ).replace( decimalRegex, decimailPoint ); + var value = $( this ).val(); + var newvalue = value + .replace( regex, '' ) + .replace( decimalRegex, decimailPoint ); if ( value !== newvalue ) { $( this ).val( newvalue ); @@ -98,120 +141,197 @@ .on( 'keyup', // eslint-disable-next-line max-len - '.wc_input_price[type=text], .wc_input_decimal[type=text], .wc_input_country_iso[type=text], .wc-order-totals #refund_amount[type=text]', - function() { + '.wc_input_price[type=text], .wc_input_decimal[type=text], .wc_input_country_iso[type=text], .wc-order-totals #refund_amount[type=text], .wc_input_variations_price[type=text]', + function () { var regex, error, decimalRegex; var checkDecimalNumbers = false; - - if ( $( this ).is( '.wc_input_price' ) || $( this ).is( '#refund_amount' ) ) { + if ( + $( this ).is( '.wc_input_price' ) || + $( this ).is( '.wc_input_variations_price' ) || + $( this ).is( '#refund_amount' ) + ) { checkDecimalNumbers = true; - regex = new RegExp( '[^\-0-9\%\\' + woocommerce_admin.mon_decimal_point + ']+', 'gi' ); - decimalRegex = new RegExp( '[^\\' + woocommerce_admin.mon_decimal_point + ']', 'gi' ); + regex = new RegExp( + '[^-0-9%\\' + + woocommerce_admin.mon_decimal_point + + ']+', + 'gi' + ); + decimalRegex = new RegExp( + '[^\\' + woocommerce_admin.mon_decimal_point + ']', + 'gi' + ); error = 'i18n_mon_decimal_error'; } else if ( $( this ).is( '.wc_input_country_iso' ) ) { regex = new RegExp( '([^A-Z])+|(.){3,}', 'im' ); error = 'i18n_country_iso_error'; } else { checkDecimalNumbers = true; - regex = new RegExp( '[^\-0-9\%\\' + woocommerce_admin.decimal_point + ']+', 'gi' ); - decimalRegex = new RegExp( '[^\\' + woocommerce_admin.decimal_point + ']', 'gi' ); + regex = new RegExp( + '[^-0-9%\\' + + woocommerce_admin.decimal_point + + ']+', + 'gi' + ); + decimalRegex = new RegExp( + '[^\\' + woocommerce_admin.decimal_point + ']', + 'gi' + ); error = 'i18n_decimal_error'; } - var value = $( this ).val(); + var value = $( this ).val(); var newvalue = value.replace( regex, '' ); // Check if newvalue have more than one decimal point. - if ( checkDecimalNumbers && 1 < newvalue.replace( decimalRegex, '' ).length ) { + if ( + checkDecimalNumbers && + 1 < newvalue.replace( decimalRegex, '' ).length + ) { newvalue = newvalue.replace( decimalRegex, '' ); } if ( value !== newvalue ) { - $( document.body ).triggerHandler( 'wc_add_error_tip', [ $( this ), error ] ); + $( document.body ).triggerHandler( 'wc_add_error_tip', [ + $( this ), + error, + ] ); } else { - $( document.body ).triggerHandler( 'wc_remove_error_tip', [ $( this ), error ] ); + $( + document.body + ).triggerHandler( 'wc_remove_error_tip', [ + $( this ), + error, + ] ); } } ) - .on( 'change', '#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]', function() { - var sale_price_field = $( this ), regular_price_field; + .on( + 'change', + '#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]', + function () { + var sale_price_field = $( this ), + regular_price_field; - if ( sale_price_field.attr( 'name' ).indexOf( 'variable' ) !== -1 ) { - regular_price_field = sale_price_field - .parents( '.variable_pricing' ) - .find( '.wc_input_price[name^=variable_regular_price]' ); - } else { - regular_price_field = $( '#_regular_price' ); + if ( + sale_price_field + .attr( 'name' ) + .indexOf( 'variable' ) !== -1 + ) { + regular_price_field = sale_price_field + .parents( '.variable_pricing' ) + .find( + '.wc_input_price[name^=variable_regular_price]' + ); + } else { + regular_price_field = $( '#_regular_price' ); + } + + var sale_price = parseFloat( + window.accounting.unformat( + sale_price_field.val(), + woocommerce_admin.mon_decimal_point + ) + ); + var regular_price = parseFloat( + window.accounting.unformat( + regular_price_field.val(), + woocommerce_admin.mon_decimal_point + ) + ); + + if ( sale_price >= regular_price ) { + $( this ).val( '' ); + } } + ) - var sale_price = parseFloat( - window.accounting.unformat( sale_price_field.val(), woocommerce_admin.mon_decimal_point ) - ); - var regular_price = parseFloat( - window.accounting.unformat( regular_price_field.val(), woocommerce_admin.mon_decimal_point ) - ); + .on( + 'keyup', + '#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]', + function () { + var sale_price_field = $( this ), + regular_price_field; - if ( sale_price >= regular_price ) { - $( this ).val( '' ); + if ( + sale_price_field + .attr( 'name' ) + .indexOf( 'variable' ) !== -1 + ) { + regular_price_field = sale_price_field + .parents( '.variable_pricing' ) + .find( + '.wc_input_price[name^=variable_regular_price]' + ); + } else { + regular_price_field = $( '#_regular_price' ); + } + + var sale_price = parseFloat( + window.accounting.unformat( + sale_price_field.val(), + woocommerce_admin.mon_decimal_point + ) + ); + var regular_price = parseFloat( + window.accounting.unformat( + regular_price_field.val(), + woocommerce_admin.mon_decimal_point + ) + ); + + if ( sale_price >= regular_price ) { + $( document.body ).triggerHandler( 'wc_add_error_tip', [ + $( this ), + 'i18n_sale_less_than_regular_error', + ] ); + } else { + $( + document.body + ).triggerHandler( 'wc_remove_error_tip', [ + $( this ), + 'i18n_sale_less_than_regular_error', + ] ); + } } - }) - - .on( 'keyup', '#_sale_price.wc_input_price[type=text], .wc_input_price[name^=variable_sale_price]', function() { - var sale_price_field = $( this ), regular_price_field; - - if ( sale_price_field.attr( 'name' ).indexOf( 'variable' ) !== -1 ) { - regular_price_field = sale_price_field - .parents( '.variable_pricing' ) - .find( '.wc_input_price[name^=variable_regular_price]' ); - } else { - regular_price_field = $( '#_regular_price' ); - } - - var sale_price = parseFloat( - window.accounting.unformat( sale_price_field.val(), woocommerce_admin.mon_decimal_point ) - ); - var regular_price = parseFloat( - window.accounting.unformat( regular_price_field.val(), woocommerce_admin.mon_decimal_point ) - ); - - if ( sale_price >= regular_price ) { - $( document.body ).triggerHandler( 'wc_add_error_tip', [ $(this), 'i18n_sale_less_than_regular_error' ] ); - } else { - $( document.body ).triggerHandler( 'wc_remove_error_tip', [ $(this), 'i18n_sale_less_than_regular_error' ] ); - } - }) - - .on( 'init_tooltips', function() { + ) + .on( 'init_tooltips', function () { $( '.tips, .help_tip, .woocommerce-help-tip' ).tipTip( { - 'attribute': 'data-tip', - 'fadeIn': 50, - 'fadeOut': 50, - 'delay': 200, - 'keepAlive': true + attribute: 'data-tip', + fadeIn: 50, + fadeOut: 50, + delay: 200, + keepAlive: true, } ); $( '.column-wc_actions .wc-action-button' ).tipTip( { - 'fadeIn': 50, - 'fadeOut': 50, - 'delay': 200 + fadeIn: 50, + fadeOut: 50, + delay: 200, } ); // Add tiptip to parent element for widefat tables - $( '.parent-tips' ).each( function() { - $( this ).closest( 'a, th' ).attr( 'data-tip', $( this ).data( 'tip' ) ).tipTip( { - 'attribute': 'data-tip', - 'fadeIn': 50, - 'fadeOut': 50, - 'delay': 200, - 'keepAlive': true - } ).css( 'cursor', 'help' ); - }); - }) + $( '.parent-tips' ).each( function () { + $( this ) + .closest( 'a, th' ) + .attr( 'data-tip', $( this ).data( 'tip' ) ) + .tipTip( { + attribute: 'data-tip', + fadeIn: 50, + fadeOut: 50, + delay: 200, + keepAlive: true, + } ) + .css( 'cursor', 'help' ); + } ); + } ) - .on( 'click', '.wc-confirm-delete', function( event ) { - if ( ! window.confirm( woocommerce_admin.i18n_confirm_delete ) ) { + .on( 'click', '.wc-confirm-delete', function ( event ) { + if ( + ! window.confirm( woocommerce_admin.i18n_confirm_delete ) + ) { event.stopPropagation(); } } ); @@ -220,7 +340,7 @@ $( document.body ).trigger( 'init_tooltips' ); // wc_input_table tables - $( '.wc_input_table.sortable tbody' ).sortable({ + $( '.wc_input_table.sortable tbody' ).sortable( { items: 'tr', cursor: 'move', axis: 'y', @@ -229,205 +349,290 @@ helper: 'clone', opacity: 0.65, placeholder: 'wc-metabox-sortable-placeholder', - start: function( event, ui ) { + start: function ( event, ui ) { ui.item.css( 'background-color', '#f6f6f6' ); }, - stop: function( event, ui ) { + stop: function ( event, ui ) { ui.item.removeAttr( 'style' ); - } - }); + }, + } ); // Focus on inputs within the table if clicked instead of trying to sort. - $( '.wc_input_table.sortable tbody input' ).on( 'click', function() { + $( '.wc_input_table.sortable tbody input' ).on( 'click', function () { $( this ).trigger( 'focus' ); } ); - $( '.wc_input_table .remove_rows' ).on( 'click', function() { + $( '.wc_input_table .remove_rows' ).on( 'click', function () { var $tbody = $( this ).closest( '.wc_input_table' ).find( 'tbody' ); if ( $tbody.find( 'tr.current' ).length > 0 ) { var $current = $tbody.find( 'tr.current' ); - $current.each( function() { + $current.each( function () { $( this ).remove(); - }); + } ); } return false; - }); + } ); var controlled = false; - var shifted = false; - var hasFocus = false; + var shifted = false; + var hasFocus = false; - $( document.body ).on( 'keyup keydown', function( e ) { - shifted = e.shiftKey; + $( document.body ).on( 'keyup keydown', function ( e ) { + shifted = e.shiftKey; controlled = e.ctrlKey || e.metaKey; - }); + } ); - $( '.wc_input_table' ).on( 'focus click', 'input', function( e ) { - var $this_table = $( this ).closest( 'table, tbody' ); - var $this_row = $( this ).closest( 'tr' ); + $( '.wc_input_table' ) + .on( 'focus click', 'input', function ( e ) { + var $this_table = $( this ).closest( 'table, tbody' ); + var $this_row = $( this ).closest( 'tr' ); - if ( ( e.type === 'focus' && hasFocus !== $this_row.index() ) || ( e.type === 'click' && $( this ).is( ':focus' ) ) ) { - hasFocus = $this_row.index(); + if ( + ( e.type === 'focus' && hasFocus !== $this_row.index() ) || + ( e.type === 'click' && $( this ).is( ':focus' ) ) + ) { + hasFocus = $this_row.index(); - if ( ! shifted && ! controlled ) { - $( 'tr', $this_table ).removeClass( 'current' ).removeClass( 'last_selected' ); - $this_row.addClass( 'current' ).addClass( 'last_selected' ); - } else if ( shifted ) { - $( 'tr', $this_table ).removeClass( 'current' ); - $this_row.addClass( 'selected_now' ).addClass( 'current' ); + if ( ! shifted && ! controlled ) { + $( 'tr', $this_table ) + .removeClass( 'current' ) + .removeClass( 'last_selected' ); + $this_row + .addClass( 'current' ) + .addClass( 'last_selected' ); + } else if ( shifted ) { + $( 'tr', $this_table ).removeClass( 'current' ); + $this_row + .addClass( 'selected_now' ) + .addClass( 'current' ); - if ( $( 'tr.last_selected', $this_table ).length > 0 ) { - if ( $this_row.index() > $( 'tr.last_selected', $this_table ).index() ) { - $( 'tr', $this_table ) - .slice( $( 'tr.last_selected', $this_table ).index(), $this_row.index() ) - .addClass( 'current' ); + if ( $( 'tr.last_selected', $this_table ).length > 0 ) { + if ( + $this_row.index() > + $( 'tr.last_selected', $this_table ).index() + ) { + $( 'tr', $this_table ) + .slice( + $( + 'tr.last_selected', + $this_table + ).index(), + $this_row.index() + ) + .addClass( 'current' ); + } else { + $( 'tr', $this_table ) + .slice( + $this_row.index(), + $( + 'tr.last_selected', + $this_table + ).index() + 1 + ) + .addClass( 'current' ); + } + } + + $( 'tr', $this_table ).removeClass( 'last_selected' ); + $this_row.addClass( 'last_selected' ); + } else { + $( 'tr', $this_table ).removeClass( 'last_selected' ); + if ( + controlled && + $( this ).closest( 'tr' ).is( '.current' ) + ) { + $this_row.removeClass( 'current' ); } else { - $( 'tr', $this_table ) - .slice( $this_row.index(), $( 'tr.last_selected', $this_table ).index() + 1 ) - .addClass( 'current' ); + $this_row + .addClass( 'current' ) + .addClass( 'last_selected' ); } } - $( 'tr', $this_table ).removeClass( 'last_selected' ); - $this_row.addClass( 'last_selected' ); - } else { - $( 'tr', $this_table ).removeClass( 'last_selected' ); - if ( controlled && $( this ).closest( 'tr' ).is( '.current' ) ) { - $this_row.removeClass( 'current' ); - } else { - $this_row.addClass( 'current' ).addClass( 'last_selected' ); - } - } - - $( 'tr', $this_table ).removeClass( 'selected_now' ); - } - }).on( 'blur', 'input', function() { - hasFocus = false; - }); - - // Additional cost and Attribute term tables - $( '.woocommerce_page_wc-settings .shippingrows tbody tr:even, table.attributes-table tbody tr:nth-child(odd)' ) - .addClass( 'alternate' ); - - // Show order items on orders page - $( document.body ).on( 'click', '.show_order_items', function() { - $( this ).closest( 'td' ).find( 'table' ).toggle(); - return false; - }); - - // Select availability - $( 'select.availability' ).on( 'change', function() { - if ( $( this ).val() === 'all' ) { - $( this ).closest( 'tr' ).next( 'tr' ).hide(); - } else { - $( this ).closest( 'tr' ).next( 'tr' ).show(); - } - }).trigger( 'change' ); - - // Hidden options - $( '.hide_options_if_checked' ).each( function() { - $( this ).find( 'input:eq(0)' ).on( 'change', function() { - if ( $( this ).is( ':checked' ) ) { - $( this ) - .closest( 'fieldset, tr' ) - .nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option' ) - .hide(); - } else { - $( this ) - .closest( 'fieldset, tr' ) - .nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option' ) - .show(); - } - }).trigger( 'change' ); - }); - - $( '.show_options_if_checked' ).each( function() { - $( this ).find( 'input:eq(0)' ).on( 'change', function() { - if ( $( this ).is( ':checked' ) ) { - $( this ) - .closest( 'fieldset, tr' ) - .nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option' ) - .show(); - } else { - $( this ) - .closest( 'fieldset, tr' ) - .nextUntil( '.hide_options_if_checked, .show_options_if_checked', '.hidden_option' ) - .hide(); - } - }).trigger( 'change' ); - }); - - // Reviews. - $( 'input#woocommerce_enable_reviews' ).on( 'change', function() { - if ( $( this ).is( ':checked' ) ) { - $( '#woocommerce_enable_review_rating' ).closest( 'tr' ).show(); - } else { - $( '#woocommerce_enable_review_rating' ).closest( 'tr' ).hide(); - } - }).trigger( 'change' ); - - // Attribute term table - $( 'table.attributes-table tbody tr:nth-child(odd)' ).addClass( 'alternate' ); - - // Toggle gateway on/off. - $( '.wc_gateways' ).on( 'click', '.wc-payment-gateway-method-toggle-enabled', function() { - var $link = $( this ), - $row = $link.closest( 'tr' ), - $toggle = $link.find( '.woocommerce-input-toggle' ); - - var data = { - action: 'woocommerce_toggle_gateway_enabled', - security: woocommerce_admin.nonces.gateway_toggle, - gateway_id: $row.data( 'gateway_id' ) - }; - - $toggle.addClass( 'woocommerce-input-toggle--loading' ); - - $.ajax( { - url: woocommerce_admin.ajax_url, - data: data, - dataType : 'json', - type : 'POST', - success: function( response ) { - if ( true === response.data ) { - $toggle.removeClass( 'woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled' ); - $toggle.addClass( 'woocommerce-input-toggle--enabled' ); - $toggle.removeClass( 'woocommerce-input-toggle--loading' ); - } else if ( false === response.data ) { - $toggle.removeClass( 'woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled' ); - $toggle.addClass( 'woocommerce-input-toggle--disabled' ); - $toggle.removeClass( 'woocommerce-input-toggle--loading' ); - } else if ( 'needs_setup' === response.data ) { - window.location.href = $link.attr( 'href' ); - } + $( 'tr', $this_table ).removeClass( 'selected_now' ); } + } ) + .on( 'blur', 'input', function () { + hasFocus = false; } ); - return false; - }); + // Additional cost and Attribute term tables + $( + '.woocommerce_page_wc-settings .shippingrows tbody tr:even, table.attributes-table tbody tr:nth-child(odd)' + ).addClass( 'alternate' ); - $( '#wpbody' ).on( 'click', '#doaction, #doaction2', function() { - var action = $( this ).is( '#doaction' ) ? $( '#bulk-action-selector-top' ).val() : $( '#bulk-action-selector-bottom' ).val(); + // Show order items on orders page + $( document.body ).on( 'click', '.show_order_items', function () { + $( this ).closest( 'td' ).find( 'table' ).toggle(); + return false; + } ); + + // Select availability + $( 'select.availability' ) + .on( 'change', function () { + if ( $( this ).val() === 'all' ) { + $( this ).closest( 'tr' ).next( 'tr' ).hide(); + } else { + $( this ).closest( 'tr' ).next( 'tr' ).show(); + } + } ) + .trigger( 'change' ); + + // Hidden options + $( '.hide_options_if_checked' ).each( function () { + $( this ) + .find( 'input:eq(0)' ) + .on( 'change', function () { + if ( $( this ).is( ':checked' ) ) { + $( this ) + .closest( 'fieldset, tr' ) + .nextUntil( + '.hide_options_if_checked, .show_options_if_checked', + '.hidden_option' + ) + .hide(); + } else { + $( this ) + .closest( 'fieldset, tr' ) + .nextUntil( + '.hide_options_if_checked, .show_options_if_checked', + '.hidden_option' + ) + .show(); + } + } ) + .trigger( 'change' ); + } ); + + $( '.show_options_if_checked' ).each( function () { + $( this ) + .find( 'input:eq(0)' ) + .on( 'change', function () { + if ( $( this ).is( ':checked' ) ) { + $( this ) + .closest( 'fieldset, tr' ) + .nextUntil( + '.hide_options_if_checked, .show_options_if_checked', + '.hidden_option' + ) + .show(); + } else { + $( this ) + .closest( 'fieldset, tr' ) + .nextUntil( + '.hide_options_if_checked, .show_options_if_checked', + '.hidden_option' + ) + .hide(); + } + } ) + .trigger( 'change' ); + } ); + + // Reviews. + $( 'input#woocommerce_enable_reviews' ) + .on( 'change', function () { + if ( $( this ).is( ':checked' ) ) { + $( '#woocommerce_enable_review_rating' ) + .closest( 'tr' ) + .show(); + } else { + $( '#woocommerce_enable_review_rating' ) + .closest( 'tr' ) + .hide(); + } + } ) + .trigger( 'change' ); + + // Attribute term table + $( 'table.attributes-table tbody tr:nth-child(odd)' ).addClass( + 'alternate' + ); + + // Toggle gateway on/off. + $( '.wc_gateways' ).on( + 'click', + '.wc-payment-gateway-method-toggle-enabled', + function () { + var $link = $( this ), + $row = $link.closest( 'tr' ), + $toggle = $link.find( '.woocommerce-input-toggle' ); + + var data = { + action: 'woocommerce_toggle_gateway_enabled', + security: woocommerce_admin.nonces.gateway_toggle, + gateway_id: $row.data( 'gateway_id' ), + }; + + $toggle.addClass( 'woocommerce-input-toggle--loading' ); + + $.ajax( { + url: woocommerce_admin.ajax_url, + data: data, + dataType: 'json', + type: 'POST', + success: function ( response ) { + if ( true === response.data ) { + $toggle.removeClass( + 'woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled' + ); + $toggle.addClass( + 'woocommerce-input-toggle--enabled' + ); + $toggle.removeClass( + 'woocommerce-input-toggle--loading' + ); + } else if ( false === response.data ) { + $toggle.removeClass( + 'woocommerce-input-toggle--enabled, woocommerce-input-toggle--disabled' + ); + $toggle.addClass( + 'woocommerce-input-toggle--disabled' + ); + $toggle.removeClass( + 'woocommerce-input-toggle--loading' + ); + } else if ( 'needs_setup' === response.data ) { + window.location.href = $link.attr( 'href' ); + } + }, + } ); + + return false; + } + ); + + $( '#wpbody' ).on( 'click', '#doaction, #doaction2', function () { + var action = $( this ).is( '#doaction' ) + ? $( '#bulk-action-selector-top' ).val() + : $( '#bulk-action-selector-bottom' ).val(); if ( 'remove_personal_data' === action ) { - return window.confirm( woocommerce_admin.i18n_remove_personal_data_notice ); + return window.confirm( + woocommerce_admin.i18n_remove_personal_data_notice + ); } - }); + } ); - var marketplaceSectionDropdown = $( '#marketplace-current-section-dropdown' ); + var marketplaceSectionDropdown = $( + '#marketplace-current-section-dropdown' + ); var marketplaceSectionName = $( '#marketplace-current-section-name' ); var marketplaceMenuIsOpen = false; // Add event listener to toggle Marketplace menu on touch devices if ( marketplaceSectionDropdown.length ) { if ( isTouchDevice() ) { - marketplaceSectionName.on( 'click', function() { + marketplaceSectionName.on( 'click', function () { marketplaceMenuIsOpen = ! marketplaceMenuIsOpen; if ( marketplaceMenuIsOpen ) { marketplaceSectionDropdown.addClass( 'is-open' ); $( document ).on( 'click', maybeToggleMarketplaceMenu ); } else { marketplaceSectionDropdown.removeClass( 'is-open' ); - $( document ).off( 'click', maybeToggleMarketplaceMenu ); + $( document ).off( + 'click', + maybeToggleMarketplaceMenu + ); } } ); } else { @@ -438,8 +643,8 @@ // Close menu if the user clicks outside it function maybeToggleMarketplaceMenu( e ) { if ( - ! marketplaceSectionDropdown.is( e.target ) - && marketplaceSectionDropdown.has( e.target ).length === 0 + ! marketplaceSectionDropdown.is( e.target ) && + marketplaceSectionDropdown.has( e.target ).length === 0 ) { marketplaceSectionDropdown.removeClass( 'is-open' ); marketplaceMenuIsOpen = false; @@ -448,11 +653,11 @@ } function isTouchDevice() { - return ( ( 'ontouchstart' in window ) || - ( navigator.maxTouchPoints > 0 ) || - ( navigator.msMaxTouchPoints > 0 ) ); + return ( + 'ontouchstart' in window || + navigator.maxTouchPoints > 0 || + navigator.msMaxTouchPoints > 0 + ); } - - }); - -})( jQuery, woocommerce_admin ); + } ); +} )( jQuery, woocommerce_admin ); diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index 9dee92915e0..97e8bb32cc4 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -84,7 +84,9 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : // @deprecated 2.3. if ( has_action( 'woocommerce_admin_css' ) ) { + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_admin_css' ); + /* phpcs: enable */ wc_deprecated_function( 'The woocommerce_admin_css action', '2.3', 'admin_enqueue_scripts' ); } @@ -182,15 +184,15 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : wp_enqueue_script( 'jquery-ui-sortable' ); wp_enqueue_script( 'jquery-ui-autocomplete' ); - $locale = localeconv(); + $locale = localeconv(); $decimal_point = isset( $locale['decimal_point'] ) ? $locale['decimal_point'] : '.'; - $decimal = ( ! empty( wc_get_price_decimal_separator() ) ) ? wc_get_price_decimal_separator() : $decimal_point; + $decimal = ( ! empty( wc_get_price_decimal_separator() ) ) ? wc_get_price_decimal_separator() : $decimal_point; $params = array( /* translators: %s: decimal */ - 'i18n_decimal_error' => sprintf( __( 'Please enter with one decimal point (%s) without thousand separators.', 'woocommerce' ), $decimal ), + 'i18n_decimal_error' => sprintf( __( 'Please enter a value with one decimal point (%s) without thousand separators.', 'woocommerce' ), $decimal ), /* translators: %s: price decimal separator */ - 'i18n_mon_decimal_error' => sprintf( __( 'Please enter with one monetary decimal point (%s) without thousand separators and currency symbols.', 'woocommerce' ), wc_get_price_decimal_separator() ), + 'i18n_mon_decimal_error' => sprintf( __( 'Please enter a value with one monetary decimal point (%s) without thousand separators and currency symbols.', 'woocommerce' ), wc_get_price_decimal_separator() ), 'i18n_country_iso_error' => __( 'Please enter in country code with two capital letters.', 'woocommerce' ), 'i18n_sale_less_than_regular_error' => __( 'Please enter in a value less than the regular price.', 'woocommerce' ), 'i18n_delete_product_notice' => __( 'This product has produced sales and may be linked to existing orders. Are you sure you want to delete it?', 'woocommerce' ), @@ -247,10 +249,11 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : } // Meta boxes. + /* phpcs:disable */ if ( in_array( $screen_id, array( 'product', 'edit-product' ) ) ) { wp_enqueue_media(); wp_register_script( 'wc-admin-product-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-product' . $suffix . '.js', array( 'wc-admin-meta-boxes', 'media-models' ), $version ); - wp_register_script( 'wc-admin-variation-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-product-variation' . $suffix . '.js', array( 'wc-admin-meta-boxes', 'serializejson', 'media-models' ), $version ); + wp_register_script( 'wc-admin-variation-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-product-variation' . $suffix . '.js', array( 'wc-admin-meta-boxes', 'serializejson', 'media-models', 'backbone', 'jquery-ui-sortable', 'wc-backbone-modal' ), $version ); wp_enqueue_script( 'wc-admin-product-meta-boxes' ); wp_enqueue_script( 'wc-admin-variation-meta-boxes' ); @@ -289,6 +292,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : wp_localize_script( 'wc-admin-variation-meta-boxes', 'woocommerce_admin_meta_boxes_variations', $params ); } + /* phpcs: enable */ if ( $this->is_order_meta_box_screen( $screen_id ) ) { $default_location = wc_get_customer_default_location(); @@ -306,6 +310,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : ) ); } + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ if ( in_array( $screen_id, array( 'shop_coupon', 'edit-shop_coupon' ) ) ) { wp_enqueue_script( 'wc-admin-coupon-meta-boxes', WC()->plugin_url() . '/assets/js/admin/meta-boxes-coupon' . $suffix . '.js', array( 'wc-admin-meta-boxes' ), $version ); wp_localize_script( @@ -320,6 +325,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : ) ); } + /* phpcs: enable */ if ( in_array( str_replace( 'edit-', '', $screen_id ), array( 'shop_coupon', 'product' ), true ) || $this->is_order_meta_box_screen( $screen_id ) ) { $post_id = isset( $post->ID ) ? $post->ID : ''; $currency = ''; @@ -409,6 +415,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : } // Term ordering - only when sorting by term_order. + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ if ( ( strstr( $screen_id, 'edit-pa_' ) || ( ! empty( $_GET['taxonomy'] ) && in_array( wp_unslash( $_GET['taxonomy'] ), apply_filters( 'woocommerce_sortable_taxonomies', array( 'product_cat' ) ) ) ) ) && ! isset( $_GET['orderby'] ) ) { wp_register_script( 'woocommerce_term_ordering', WC()->plugin_url() . '/assets/js/admin/term-ordering' . $suffix . '.js', array( 'jquery-ui-sortable' ), $version ); @@ -422,6 +429,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : wp_localize_script( 'woocommerce_term_ordering', 'woocommerce_term_ordering_params', $woocommerce_term_order_params ); } + /* phpcs: enable */ // Product sorting - only when sorting by menu order on the products page. if ( current_user_can( 'edit_others_pages' ) && 'edit-product' === $screen_id && isset( $wp_query->query['orderby'] ) && 'menu_order title' === $wp_query->query['orderby'] ) { @@ -430,6 +438,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : } // Reports Pages. + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ if ( in_array( $screen_id, apply_filters( 'woocommerce_reports_screen_ids', array( $wc_screen_id . '_page_wc-reports', 'toplevel_page_wc-reports', 'dashboard' ) ) ) ) { wp_register_script( 'wc-reports', WC()->plugin_url() . '/assets/js/admin/reports' . $suffix . '.js', array( 'jquery', 'jquery-ui-datepicker' ), $version ); @@ -440,6 +449,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : wp_enqueue_script( 'flot-pie' ); wp_enqueue_script( 'flot-stack' ); } + /* phpcs: enable */ // API settings. if ( $wc_screen_id . '_page_wc-settings' === $screen_id && isset( $_GET['section'] ) && 'keys' == $_GET['section'] ) { diff --git a/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-product-data.php b/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-product-data.php index a7751b42284..560468487b4 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-product-data.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/class-wc-meta-box-product-data.php @@ -53,6 +53,7 @@ class WC_Meta_Box_Product_Data { * @return array */ private static function get_product_type_options() { + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ return apply_filters( 'product_type_options', array( @@ -72,6 +73,7 @@ class WC_Meta_Box_Product_Data { ), ) ); + /* phpcs: enable */ } /** @@ -80,6 +82,7 @@ class WC_Meta_Box_Product_Data { * @return array */ private static function get_product_data_tabs() { + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ $tabs = apply_filters( 'woocommerce_product_data_tabs', array( @@ -127,6 +130,7 @@ class WC_Meta_Box_Product_Data { ), ) ); + /* phpcs: enable */ // Sort tabs based on priority. uasort( $tabs, array( __CLASS__, 'product_data_tabs_sort' ) ); @@ -171,11 +175,14 @@ class WC_Meta_Box_Product_Data { public static function output_variations() { global $post, $wpdb, $product_object; + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ $variation_attributes = array_filter( $product_object->get_attributes(), array( __CLASS__, 'filter_variation_attributes' ) ); $default_attributes = $product_object->get_default_attributes(); $variations_count = absint( apply_filters( 'woocommerce_admin_meta_boxes_variations_count', $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM $wpdb->posts WHERE post_parent = %d AND post_type = 'product_variation' AND post_status IN ('publish', 'private')", $post->ID ) ), $post->ID ) ); $variations_per_page = absint( apply_filters( 'woocommerce_admin_meta_boxes_variations_per_page', 15 ) ); $variations_total_pages = ceil( $variations_count / $variations_per_page ); + $modal_title = get_bloginfo( 'name' ) . __( ' says', 'woocommerce' ); + /* phpcs: enable */ include __DIR__ . '/views/html-product-data-variations.php'; } @@ -272,7 +279,9 @@ class WC_Meta_Box_Product_Data { $attribute->set_position( $attribute_position[ $i ] ); $attribute->set_visible( isset( $attribute_visibility[ $i ] ) ); $attribute->set_variation( isset( $attribute_variation[ $i ] ) ); + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ $attributes[] = apply_filters( 'woocommerce_admin_meta_boxes_prepare_attribute', $attribute, $data, $i ); + /* phpcs: enable */ } } return $attributes; @@ -425,9 +434,9 @@ class WC_Meta_Box_Product_Data { $product->get_data_store()->sync_variation_names( $product, $original_post_title, $post_title ); } - + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_process_product_meta_' . $product_type, $post_id ); - // phpcs:enable WordPress.Security.NonceVerification.Missing + /* phpcs:enable WordPress.Security.NonceVerification.Missing and WooCommerce.Commenting.CommentHooks.MissingHookComment */ } /** @@ -448,7 +457,7 @@ class WC_Meta_Box_Product_Data { $max_loop = max( array_keys( wp_unslash( $_POST['variable_post_id'] ) ) ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $data_store = $parent->get_data_store(); $data_store->sort_all_product_variations( $parent->get_id() ); - $new_variation_menu_order_id = ! empty( $_POST['new_variation_menu_order_id'] ) ? wc_clean( wp_unslash( $_POST['new_variation_menu_order_id'] ) ) : false; + $new_variation_menu_order_id = ! empty( $_POST['new_variation_menu_order_id'] ) ? wc_clean( wp_unslash( $_POST['new_variation_menu_order_id'] ) ) : false; $new_variation_menu_order_value = ! empty( $_POST['new_variation_menu_order_value'] ) ? wc_clean( wp_unslash( $_POST['new_variation_menu_order_value'] ) ) : false; // Only perform this operation if setting menu order via the prompt. @@ -560,7 +569,9 @@ class WC_Meta_Box_Product_Data { do_action( 'woocommerce_admin_process_variation_object', $variation, $i ); $variation->save(); + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_save_product_variation', $variation_id, $i ); + /* phpcs: enable */ } } // phpcs:enable WordPress.Security.NonceVerification.Missing diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php index 5bff4c42b5a..6f69d8bd31b 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php @@ -16,7 +16,9 @@ if ( ! defined( 'ABSPATH' ) ) {

Attributes tab.', 'woocommerce' ) ); ?>

+

+
@@ -33,11 +35,15 @@ if ( ! defined( 'ABSPATH' ) ) { is_taxonomy() ) : ?> get_terms() as $option ) : ?> + + get_options() as $option ) : ?> + + @@ -48,7 +54,9 @@ if ( ! defined( 'ABSPATH' ) ) {
+ +
@@ -104,7 +114,9 @@ if ( ! defined( 'ABSPATH' ) ) { @@ -116,7 +128,9 @@ if ( ! defined( 'ABSPATH' ) ) {
+
+
@@ -135,7 +149,9 @@ if ( ! defined( 'ABSPATH' ) ) { @@ -150,3 +166,25 @@ if ( ! defined( 'ABSPATH' ) ) {
+ diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-variation-admin.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-variation-admin.php index 5402c3576d1..45202b0e407 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-variation-admin.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-variation-admin.php @@ -14,8 +14,8 @@ defined( 'ABSPATH' ) || exit; ?>

+ -
# is_taxonomy() ) : ?> get_terms() as $option ) : ?> + + get_options() as $option ) : ?> + + @@ -106,7 +110,9 @@ defined( 'ABSPATH' ) || exit; + +

@@ -152,6 +158,7 @@ defined( 'ABSPATH' ) || exit; $sale_price_dates_from = $sale_price_dates_from_timestamp ? date_i18n( 'Y-m-d', $sale_price_dates_from_timestamp ) : ''; $sale_price_dates_to = $sale_price_dates_to_timestamp ? date_i18n( 'Y-m-d', $sale_price_dates_to_timestamp ) : ''; + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ echo ''; + /* phpcs: enable */ /** * Variation options pricing action. @@ -236,7 +244,7 @@ defined( 'ABSPATH' ) || exit; 'custom_attributes' => array( 'step' => 'any', ), - 'wrapper_class' => 'form-row', + 'wrapper_class' => 'form-row', ) ); @@ -409,7 +417,7 @@ defined( 'ABSPATH' ) || exit; if ( $downloadable_files ) { foreach ( $downloadable_files as $key => $file ) { - $disabled_download = isset( $file['enabled'] ) && false === $file['enabled']; + $disabled_download = isset( $file['enabled'] ) && false === $file['enabled']; $disabled_downloads_count += (int) $disabled_download; include __DIR__ . '/html-product-variation-download.php'; } @@ -421,8 +429,8 @@ defined( 'ABSPATH' ) || exit; posts WHERE post_type='page' AND post_status NOT IN ( 'pending', 'trash', 'future', 'auto-draft' ) AND post_name = %s LIMIT 1;", $slug ) ); } + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ $valid_page_found = apply_filters( 'woocommerce_create_page_id', $valid_page_found, $slug, $page_content ); + /* phpcs: enable */ if ( $valid_page_found ) { if ( $option ) { @@ -145,7 +149,9 @@ function wc_create_page( $slug, $option = '', $page_title = '', $page_content = ); $page_id = wp_insert_post( $page_data ); + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_page_created', $page_id, $page_data ); + /* phpcs: enable */ } if ( $option ) { @@ -287,7 +293,9 @@ function wc_maybe_adjust_line_item_product_stock( $item, $item_quantity = -1 ) { */ function wc_save_order_items( $order_id, $items ) { // Allow other plugins to check change in order items before they are saved. + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_before_save_order_items', $order_id, $items ); + /* phpcs: enable */ $qty_change_order_notes = array(); $order = wc_get_order( $order_id ); @@ -361,7 +369,9 @@ function wc_save_order_items( $order_id, $items ) { } // Allow other plugins to change item object before it is saved. + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_before_save_order_item', $item ); + /* phpcs: enable */ $item->save(); @@ -438,7 +448,9 @@ function wc_save_order_items( $order_id, $items ) { $order->calculate_totals( false ); // Inform other plugins that the items have been saved. + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ do_action( 'woocommerce_saved_order_items', $order_id, $items ); + /* phpcs: enable */ } /** @@ -472,9 +484,11 @@ function wc_render_invalid_variation_notice( $product_object ) { global $wpdb; // Give ability for extensions to hide this notice. + /* phpcs:disable WooCommerce.Commenting.CommentHooks.MissingHookComment */ if ( ! apply_filters( 'woocommerce_show_invalid_variations_notice', true, $product_object ) ) { return; } + /* phpcs: enable */ $variation_ids = $product_object ? $product_object->get_children() : array(); @@ -490,8 +504,8 @@ function wc_render_invalid_variation_notice( $product_object ) { " SELECT count(post_id) FROM {$wpdb->postmeta} WHERE post_id in (" . implode( ',', array_map( 'absint', $variation_ids ) ) . ") - AND meta_key='_price' - AND meta_value >= 0 + AND ( meta_key='_subscription_sign_up_fee' OR meta_key='_price' ) + AND meta_value > 0 AND meta_value != '' " ); @@ -499,7 +513,7 @@ function wc_render_invalid_variation_notice( $product_object ) { if ( 0 < ( $variation_count - $invalid_variation_count ) ) { ?> -
+

+
+ +
Date: Wed, 2 Nov 2022 14:00:17 +0000 Subject: [PATCH 0031/1680] Update/a2p array checks in api-core-tests (#35462) * Update array checks * add changelog file --- .../changelog/update-array-checks-api-core-tests | 4 ++++ .../api-core-tests/tests/customers/customers-crud.test.js | 6 +++--- .../tests/api-core-tests/tests/orders/orders-crud.test.js | 2 +- .../api-core-tests/tests/shipping/shipping-method.test.js | 2 +- .../api-core-tests/tests/taxes/tax-classes-crud.test.js | 2 +- .../tests/api-core-tests/tests/taxes/tax-rates-crud.test.js | 2 +- .../api-core-tests/tests/webhooks/webhooks-crud.test.js | 2 +- 7 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-array-checks-api-core-tests diff --git a/plugins/woocommerce/changelog/update-array-checks-api-core-tests b/plugins/woocommerce/changelog/update-array-checks-api-core-tests new file mode 100644 index 00000000000..a3f9948da49 --- /dev/null +++ b/plugins/woocommerce/changelog/update-array-checks-api-core-tests @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update Array checks in playwright api-core-tests as some of the existing tests would produce false positives \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js index b241e223240..6234bf7e155 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js @@ -67,7 +67,7 @@ test.describe('Customers API tests: CRUD', () => { const response = await request.get('/wp-json/wc/v3/customers'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toEqual(0); }); @@ -85,7 +85,7 @@ test.describe('Customers API tests: CRUD', () => { }); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toBeGreaterThanOrEqual(2); }); }); @@ -132,7 +132,7 @@ test.describe('Customers API tests: CRUD', () => { const response = await request.get('/wp-json/wc/v3/customers'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toBeGreaterThan(0); }); }); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/orders/orders-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/orders/orders-crud.test.js index 5b50e8b5ee1..61a8f681f06 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/orders/orders-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/orders/orders-crud.test.js @@ -175,7 +175,7 @@ test.describe('Orders API tests: CRUD', () => { const response = await request.get(`/wp-json/wc/v3/orders/${orderId}/notes`); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toBeGreaterThan(0); }); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js index 5a66200f908..51f52e70144 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js @@ -65,7 +65,7 @@ test.describe('Shipping methods API tests', () => { const response = await request.get('/wp-json/wc/v3/shipping_methods'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toEqual(3); expect(responseJSON[0].id).toEqual("flat_rate"); expect(responseJSON[1].id).toEqual("free_shipping"); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-classes-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-classes-crud.test.js index 4396bf9a631..353a3dada79 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-classes-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-classes-crud.test.js @@ -74,7 +74,7 @@ test.describe('Tax Classes API tests: CRUD', () => { const response = await request.get('/wp-json/wc/v3/taxes/classes'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toBeGreaterThan(0); }); }); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-rates-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-rates-crud.test.js index 1d0a636a242..fcc339ba3e2 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-rates-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/taxes/tax-rates-crud.test.js @@ -89,7 +89,7 @@ test.describe('Tax Rates API tests: CRUD', () => { const response = await request.get('/wp-json/wc/v3/taxes'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toBeGreaterThan(0); }); }); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/webhooks/webhooks-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/webhooks/webhooks-crud.test.js index ff5895281d8..12993f5d539 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/webhooks/webhooks-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/webhooks/webhooks-crud.test.js @@ -82,7 +82,7 @@ test.describe('Webhooks API tests', () => { const response = await request.get('/wp-json/wc/v3/webhooks'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)); + expect(Array.isArray(responseJSON)).toBe(true); expect(responseJSON.length).toBeGreaterThan(0); }); }); From 1b5bc44c60810413d01e1430c7c8dca4fb990375 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 2 Nov 2022 20:14:55 +0530 Subject: [PATCH 0032/1680] Add changelog. --- plugins/woocommerce/changelog/pr-35107 | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 plugins/woocommerce/changelog/pr-35107 diff --git a/plugins/woocommerce/changelog/pr-35107 b/plugins/woocommerce/changelog/pr-35107 new file mode 100644 index 00000000000..4a03f11bfc9 --- /dev/null +++ b/plugins/woocommerce/changelog/pr-35107 @@ -0,0 +1,5 @@ +Significance: patch +Type: fix +Comment: Only a minor text change. + + From 3fc0ee338e77e1a4319cb702ac40a61462238703 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 3 Nov 2022 02:40:02 +0800 Subject: [PATCH 0033/1680] Fix business details step fails to display when Gutenberg plugin is active (#35448) * Fix business details tabs when Gutenberg is active Fix business details tabs when Gutenberg is active Fix business details tabs when Gutenberg is active * Add changelog --- .../steps/business-details/flows/selective-bundle/index.js | 6 +++++- .../changelog/fix-35417-bussiness-details-with-gutenberg | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg diff --git a/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/index.js b/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/index.js index 26d24a79218..08e18e6bd38 100644 --- a/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/index.js +++ b/plugins/woocommerce-admin/client/profile-wizard/steps/business-details/flows/selective-bundle/index.js @@ -766,7 +766,11 @@ class BusinessDetails extends Component { activeClass="is-active" initialTabName="current-tab" onSelect={ ( tabName ) => { - if ( this.state.currentTab !== tabName ) { + if ( + this.state.currentTab !== tabName && + // TabPanel calls onSelect on mount when initialTabName is provided, so we need to check if the tabName is valid. + tabName !== 'current-tab' + ) { this.setState( { currentTab: tabName, savedValues: diff --git a/plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg b/plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg new file mode 100644 index 00000000000..50a3c180825 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix business details step when Gutenberg is active From e92f95903b1c3376f4d39a34056cd663fa818c01 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 2 Nov 2022 13:56:40 -0500 Subject: [PATCH 0034/1680] Delete changelog files based on PR 35448 (#35475) Delete changelog files for 35448 Co-authored-by: WooCommerce Bot --- .../changelog/fix-35417-bussiness-details-with-gutenberg | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg diff --git a/plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg b/plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg deleted file mode 100644 index 50a3c180825..00000000000 --- a/plugins/woocommerce/changelog/fix-35417-bussiness-details-with-gutenberg +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix business details step when Gutenberg is active From 3df6dcd6be817c9e4f0811a83537d3a603a23f8b Mon Sep 17 00:00:00 2001 From: "Saif H. Hassan" <67080558+Babylon1999@users.noreply.github.com> Date: Thu, 3 Nov 2022 02:28:47 +0200 Subject: [PATCH 0035/1680] Libyan Dinar not formatted correctly (#35395) Update and correct the symbol for Libyan Dinars. * Update wc-core-functions.php * Update settings.js * Add changelog. * Update API test `can view all currencies` re Libyan Dinar. Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> --- plugins/woocommerce/changelog/libyan-dinar | 4 ++++ plugins/woocommerce/includes/wc-core-functions.php | 2 +- plugins/woocommerce/tests/api-core-tests/data/settings.js | 2 +- .../tests/api-core-tests/tests/data/data-crud.test.js | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/libyan-dinar diff --git a/plugins/woocommerce/changelog/libyan-dinar b/plugins/woocommerce/changelog/libyan-dinar new file mode 100644 index 00000000000..c97817a14c0 --- /dev/null +++ b/plugins/woocommerce/changelog/libyan-dinar @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Corrects the currency symbol for Libyan Dinar (LYD). diff --git a/plugins/woocommerce/includes/wc-core-functions.php b/plugins/woocommerce/includes/wc-core-functions.php index 63e8ee2e2b5..13fc2bee29f 100644 --- a/plugins/woocommerce/includes/wc-core-functions.php +++ b/plugins/woocommerce/includes/wc-core-functions.php @@ -752,7 +752,7 @@ function get_woocommerce_currency_symbols() { 'LKR' => 'රු', 'LRD' => '$', 'LSL' => 'L', - 'LYD' => 'ل.د', + 'LYD' => 'د.ل', 'MAD' => 'د.م.', 'MDL' => 'MDL', 'MGA' => 'Ar', diff --git a/plugins/woocommerce/tests/api-core-tests/data/settings.js b/plugins/woocommerce/tests/api-core-tests/data/settings.js index 925eddac81b..6ab0c22f2f7 100644 --- a/plugins/woocommerce/tests/api-core-tests/data/settings.js +++ b/plugins/woocommerce/tests/api-core-tests/data/settings.js @@ -96,7 +96,7 @@ const currencies = { "LKR": "Sri Lankan rupee (රු)", "LRD": "Liberian dollar ($)", "LSL": "Lesotho loti (L)", - "LYD": "Libyan dinar (ل.د)", + "LYD": "Libyan dinar (د.ل)", "MAD": "Moroccan dirham (د.م.)", "MDL": "Moldovan leu (MDL)", "MGA": "Malagasy ariary (Ar)", diff --git a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js index bcf5d752d9d..824c248d6bb 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js @@ -26206,7 +26206,7 @@ test.describe('Data API tests', () => { expect.objectContaining({ "code": "LYD", "name": "Libyan dinar", - "symbol": "ل.د", + "symbol": "د.ل", "_links": { "self": [{ "href": expect.stringContaining("data/currencies/LYD") From 76f99a482f6d05094078219225f896db9113f7d3 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 3 Nov 2022 09:22:36 +0800 Subject: [PATCH 0036/1680] Cleanup and deprecate task properties and methods (#35450) * Remove unused sectioned task code * Remove section task type and update getVisibleTasks logic * Clean up task list and deprecate methods/properties * Add changelog * Fix lint * Remove snooze tests * Remove snooze JS tests --- ...ev-clean-up-unused-task-properties-methods | 4 + packages/js/data/src/onboarding/types.ts | 10 - packages/js/data/src/onboarding/utils.ts | 6 +- .../woocommerce-admin/client/tasks/tasks.tsx | 4 +- .../client/tasks/test/task-list.test.tsx | 52 ----- .../headers/section-header.scss | 36 --- .../headers/section-header.tsx | 30 --- .../two-column-tasks/section-panel-title.tsx | 58 ----- .../sectioned-task-list-placeholder.tsx | 75 ------- .../two-column-tasks/sectioned-task-list.scss | 165 -------------- .../two-column-tasks/sectioned-task-list.tsx | 209 ------------------ .../two-column-tasks/task-list-item.tsx | 189 ---------------- .../two-column-tasks/test/task-list.test.tsx | 52 ----- ...ev-clean-up-unused-task-properties-methods | 4 + .../Admin/Features/OnboardingTasks/Init.php | 6 - .../Admin/Features/OnboardingTasks/Task.php | 41 +++- .../Features/OnboardingTasks/TaskList.php | 25 +-- .../OnboardingTasks/TaskListSection.php | 2 + .../OnboardingTasks/Tasks/Appearance.php | 6 - .../OnboardingTasks/Tasks/Marketing.php | 6 - .../OnboardingTasks/Tasks/Payments.php | 7 - .../OnboardingTasks/Tasks/Products.php | 6 - .../OnboardingTasks/Tasks/Shipping.php | 6 - .../Features/OnboardingTasks/Tasks/Tax.php | 6 - .../api/onboarding-tasks.php | 180 --------------- .../features/onboarding-tasks/task.php | 94 -------- 26 files changed, 57 insertions(+), 1222 deletions(-) create mode 100644 packages/js/data/changelog/dev-clean-up-unused-task-properties-methods delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.scss delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.tsx delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/section-panel-title.tsx delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list-placeholder.tsx delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.scss delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx delete mode 100644 plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx create mode 100644 plugins/woocommerce/changelog/dev-clean-up-unused-task-properties-methods diff --git a/packages/js/data/changelog/dev-clean-up-unused-task-properties-methods b/packages/js/data/changelog/dev-clean-up-unused-task-properties-methods new file mode 100644 index 00000000000..49ebaf5e3ee --- /dev/null +++ b/packages/js/data/changelog/dev-clean-up-unused-task-properties-methods @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Update task list types and getVisibleTasks logic diff --git a/packages/js/data/src/onboarding/types.ts b/packages/js/data/src/onboarding/types.ts index 15c9bd5fc27..24060daa19d 100644 --- a/packages/js/data/src/onboarding/types.ts +++ b/packages/js/data/src/onboarding/types.ts @@ -53,15 +53,6 @@ export type DeprecatedTaskType = { type?: string; }; -export type TaskListSection = { - id: string; - title: string; - description: string; - image: string; - tasks: string[]; - isComplete: boolean; -}; - export type TaskListType = { id: string; title: string; @@ -73,7 +64,6 @@ export type TaskListType = { displayProgressHeader: boolean; keepCompletedTaskList: 'yes' | 'no'; showCESFeedback?: boolean; - sections?: TaskListSection[]; isToggleable?: boolean; isCollapsible?: boolean; isExpandable?: boolean; diff --git a/packages/js/data/src/onboarding/utils.ts b/packages/js/data/src/onboarding/utils.ts index 9623eeff560..3fbca5364d2 100644 --- a/packages/js/data/src/onboarding/utils.ts +++ b/packages/js/data/src/onboarding/utils.ts @@ -7,8 +7,4 @@ import { TaskType } from './types'; * Filters tasks to only visible tasks, taking in account snoozed tasks. */ export const getVisibleTasks = ( tasks: TaskType[] ) => - tasks.filter( - ( task ) => - ! task.isDismissed && - ( ! task.isSnoozed || task.snoozedUntil < Date.now() ) - ); + tasks.filter( ( task ) => ! task.isDismissed ); diff --git a/plugins/woocommerce-admin/client/tasks/tasks.tsx b/plugins/woocommerce-admin/client/tasks/tasks.tsx index 7c6368a2fa2..84dd5c6ec65 100644 --- a/plugins/woocommerce-admin/client/tasks/tasks.tsx +++ b/plugins/woocommerce-admin/client/tasks/tasks.tsx @@ -20,15 +20,13 @@ import { recordEvent } from '@woocommerce/tracks'; */ import { DisplayOption } from '~/activity-panel/display-options'; import { Task } from './task'; -import { TasksPlaceholder, TasksPlaceholderProps } from './placeholder'; +import { TasksPlaceholder } from './placeholder'; import './tasks.scss'; import { TaskList } from './task-list'; import { TaskList as TwoColumnTaskList } from '../two-column-tasks/task-list'; -import { SectionedTaskList } from '../two-column-tasks/sectioned-task-list'; import TwoColumnTaskListPlaceholder from '../two-column-tasks/placeholder'; import '../two-column-tasks/style.scss'; import { getAdminSetting } from '~/utils/admin-settings'; -import { SectionedTaskListPlaceholder } from '~/two-column-tasks/sectioned-task-list-placeholder'; export type TasksProps = { query: { task?: string }; diff --git a/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx b/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx index fe6cd2e29b7..169c7b42b6e 100644 --- a/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx +++ b/plugins/woocommerce-admin/client/tasks/test/task-list.test.tsx @@ -235,56 +235,4 @@ describe( 'TaskList', () => { queryByText( dismissedTask[ 0 ].title ) ).not.toBeInTheDocument(); } ); - - it( 'should not display isSnoozed tasks', () => { - const dismissedTask = [ - { - ...tasks.setup[ 0 ], - isSnoozed: true, - snoozedUntil: Date.now() + 10000, - }, - ]; - const { queryByText } = render( - - ); - expect( - queryByText( dismissedTask[ 0 ].title ) - ).not.toBeInTheDocument(); - } ); - - it( 'should display a snoozed task if snoozedUntil passed the current timestamp', () => { - const dismissedTask = [ - { - ...tasks.setup[ 0 ], - isSnoozed: true, - snoozedUntil: Date.now() - 1000, - }, - ]; - const { queryByText } = render( - - ); - expect( queryByText( dismissedTask[ 0 ].title ) ).toBeInTheDocument(); - } ); } ); diff --git a/plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.scss b/plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.scss deleted file mode 100644 index 9a0ab073071..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.scss +++ /dev/null @@ -1,36 +0,0 @@ -.woocommerce-task-section-header__container { - display: flex; - - .woocommerce-task-header__illustration { - max-width: 150px; - width: 34%; - margin-left: auto; - margin-right: 7%; - display: flex; - align-items: center; - - .illustration-background { - max-width: 100%; - } - } - - @at-root .woocommerce-setup-panel & .woocommerce-task-header__contents p { - font-size: 13px; - } - - - .woocommerce-task-header__contents p { - font-size: 16px; - } - - @at-root .woocommerce-setup-panel & .woocommerce-task-header__contents h1 { - font-size: 14px; - font-weight: 600; - } - - .woocommerce-task-header__contents h1 { - font-size: 20px; - line-height: 28px; - padding: 0; - } -} diff --git a/plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.tsx b/plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.tsx deleted file mode 100644 index c84a892084e..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/headers/section-header.tsx +++ /dev/null @@ -1,30 +0,0 @@ -/** - * Internal dependencies - */ -import './section-header.scss'; - -type Props = { - title: string; - description: string; - image: string; -}; - -const SectionHeader: React.FC< Props > = ( { title, description, image } ) => { - return ( -
-
-

{ title }

-

{ description }

-
-
- { -
-
- ); -}; - -export default SectionHeader; diff --git a/plugins/woocommerce-admin/client/two-column-tasks/section-panel-title.tsx b/plugins/woocommerce-admin/client/two-column-tasks/section-panel-title.tsx deleted file mode 100644 index c2e0927d0b7..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/section-panel-title.tsx +++ /dev/null @@ -1,58 +0,0 @@ -/** - * External dependencies - */ -import { Badge } from '@woocommerce/components'; -import { TaskListSection, TaskType } from '@woocommerce/data'; -import { Icon, check } from '@wordpress/icons'; -import { Text } from '@woocommerce/experimental'; - -/** - * Internal dependencies - */ -import SectionHeader from './headers/section-header'; - -type SectionPanelTitleProps = { - section: TaskListSection; - active: boolean; - tasks: TaskType[]; -}; - -export const SectionPanelTitle: React.FC< SectionPanelTitleProps > = ( { - section, - active, - tasks, -} ) => { - if ( active ) { - return ( -
-
- -
-
- ); - } - - const uncompletedTasksCount = tasks.filter( - ( task ) => ! task.isComplete && section.tasks.includes( task.id ) - ).length; - const isComplete = section.isComplete || uncompletedTasksCount === 0; - - return ( - <> - - { section.title } - - { ! isComplete && } - { isComplete && ( -
- -
- ) } - - ); -}; diff --git a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list-placeholder.tsx b/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list-placeholder.tsx deleted file mode 100644 index 70b234eaf0a..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list-placeholder.tsx +++ /dev/null @@ -1,75 +0,0 @@ -/** - * Internal dependencies - */ -import './style.scss'; - -type TasksPlaceholderProps = { - numTasks?: number; - query: { - task?: string; - }; -}; - -const SectionedTaskListPlaceholder: React.FC< TasksPlaceholderProps > = ( - props -) => { - const { numTasks = 3 } = props; - - return ( -
-
-
-
-
-
-
-
    - { Array.from( new Array( numTasks ) ).map( ( v, i ) => ( -
  • -
    -
    -
    -
    -
    -
    -
  • - ) ) } -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ); -}; - -export { SectionedTaskListPlaceholder }; diff --git a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.scss b/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.scss deleted file mode 100644 index a55dea2a5aa..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.scss +++ /dev/null @@ -1,165 +0,0 @@ -.woocommerce-sectioned-task-list { - .components-panel { - width: 100%; - background: transparent; - border: 0; - } - - .components-panel__body { - padding-bottom: 0; - margin-bottom: $gap-smaller; - background: #fff; - border: 1px solid $gray-200; - - &.is-opened { - padding-bottom: 0; - } - - .components-panel__body-title { - margin-bottom: 0; - border-bottom: 1px solid #e0e0e0; - - &:hover { - border-bottom: 1px solid #e0e0e0; - } - - @at-root .woocommerce-setup-panel & > .components-button { - font-size: 14px; - } - - > .components-button { - font-size: 20px; - font-weight: 400; - padding-top: 20px; - padding-bottom: 20px; - } - - .components-panel__arrow { - right: $gap-large; - } - - .woocommerce-task-header__contents p:first-of-type { - margin-top: $gap-small; - } - } - .wooocommerce-task-card__header-container { - width: 100%; - border-bottom: none; - } - .components-panel__body-toggle { - box-shadow: none; - padding-left: $gap-large; - } - &.is-opened .components-panel__body-toggle { - width: 100%; - padding: 0; - .components-panel__arrow { - top: 32px; - } - } - - .woocommerce-experimental-list { - width: calc(100% + 32px); - margin: 0 -16px; - } - } - ul li.woocommerce-task-list__item { - padding-top: $gap; - padding-bottom: $gap; - min-height: 72px; - - &.is-disabled { - pointer-events: none; - } - - &:not(.complete) - .woocommerce-task-list__item-before - .woocommerce-task__icon { - border-color: $gray-300; - } - .woocommerce-task-list__item-expandable-content { - line-height: $gap; - } - } - - .woocommerce-task-list__item.complete .woocommerce-task__icon { - background-color: $alert-green; - } - - .components-panel__body-title { - .woocommerce-badge { - width: 28px; - height: 28px; - margin-left: $gap-small; - } - .woocommerce-task__icon { - margin-left: $gap; - background-color: $alert-green; - border-radius: 50%; - width: 24px; - height: 24px; - svg { - fill: #fff; - position: relative; - } - } - } - - > .is-loading { - border: none; - margin-bottom: 8px; - - .woocommerce-task-list__item .woocommerce-task-list__item-before { - padding: 0 0 0 $gap-large; - } - - &.components-panel__body .components-panel__body-title .woocommerce-task-list__item-text { - width: 50%; - - .is-placeholder { - width: 100%; - } - } - - &.components-panel__body .woocommerce-task-list__item-after { - margin-left: $gap; - - .is-placeholder { - height: 24px; - width: 24px; - border-radius: 50%; - } - } - } -} - -.woocommerce-setup-panel { - .two-column-experiment { - h1 { - font-size: 16px; - font-weight: 600; - } - } - - .woocommerce-task-header-collapsed { - font-size: 14px; - line-height: 20px; - font-weight: bold; - } - - .woocommerce-task-progress-header { - padding: $gap; - margin-bottom: $gap-smaller; - background: #fff; - border: 1px solid $gray-200; - - .woocommerce-task-progress-header__title { - padding-top: 4px; - } - - .woocommerce-ellipsis-menu { - display: none; - } - - } -} diff --git a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx b/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx deleted file mode 100644 index 147757bdae4..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/sectioned-task-list.tsx +++ /dev/null @@ -1,209 +0,0 @@ -/** - * External dependencies - */ -import { useEffect, useRef, useState, useContext } from '@wordpress/element'; -import { Panel, PanelBody, PanelRow } from '@wordpress/components'; -import { useSelect, useDispatch } from '@wordpress/data'; -import { ONBOARDING_STORE_NAME, getVisibleTasks } from '@woocommerce/data'; -import { recordEvent } from '@woocommerce/tracks'; -import { List } from '@woocommerce/experimental'; -import classnames from 'classnames'; - -/** - * Internal dependencies - */ -import '../tasks/task-list.scss'; -import './sectioned-task-list.scss'; -import TaskListCompleted from './completed'; -import { TaskListProps } from '~/tasks/task-list'; -import { ProgressHeader } from '~/task-lists/progress-header'; -import { SectionPanelTitle } from './section-panel-title'; -import { TaskListItem } from './task-list-item'; -import { TaskListCompletedHeader } from './completed-header'; -import { LayoutContext } from '~/layout'; - -type PanelBodyProps = Omit< PanelBody.Props, 'title' | 'onToggle' > & { - title: string | React.ReactNode | undefined; - onToggle?: ( isOpen: boolean ) => void; -}; -const PanelBodyWithUpdatedType = - PanelBody as React.ComponentType< PanelBodyProps >; - -export const SectionedTaskList: React.FC< TaskListProps > = ( { - query, - id, - eventPrefix, - tasks, - keepCompletedTaskList, - isComplete, - sections, - displayProgressHeader, - cesHeader = true, -} ) => { - const { profileItems } = useSelect( ( select ) => { - const { getProfileItems } = select( ONBOARDING_STORE_NAME ); - return { - profileItems: getProfileItems(), - }; - } ); - const { hideTaskList, keepCompletedTaskList: keepCompletedTasks } = - useDispatch( ONBOARDING_STORE_NAME ); - const [ openPanel, setOpenPanel ] = useState< string | null >( - sections?.find( ( section ) => ! section.isComplete )?.id || null - ); - const layoutContext = useContext( LayoutContext ); - - const prevQueryRef = useRef( query ); - - const visibleTasks = getVisibleTasks( tasks ); - - const recordTaskListView = () => { - if ( query.task ) { - return; - } - - recordEvent( `${ eventPrefix }view`, { - number_tasks: visibleTasks.length, - store_connected: profileItems.wccom_connected, - context: layoutContext.toString(), - } ); - }; - - useEffect( () => { - recordTaskListView(); - }, [] ); - - useEffect( () => { - const { task: prevTask } = prevQueryRef.current; - const { task } = query; - - if ( prevTask !== task ) { - window.document.documentElement.scrollTop = 0; - prevQueryRef.current = query; - } - }, [ query ] ); - - const hideTasks = () => { - hideTaskList( id ); - }; - - const keepTasks = () => { - keepCompletedTasks( id ); - }; - - let selectedHeaderCard = visibleTasks.find( - ( listTask ) => listTask.isComplete === false - ); - - // If nothing is selected, default to the last task since everything is completed. - if ( ! selectedHeaderCard ) { - selectedHeaderCard = visibleTasks[ visibleTasks.length - 1 ]; - } - - const getSectionTasks = ( sectionTaskIds: string[] ) => { - return visibleTasks.filter( ( task ) => - sectionTaskIds.includes( task.id ) - ); - }; - - if ( ! visibleTasks.length ) { - return
; - } - - if ( isComplete && keepCompletedTaskList !== 'yes' ) { - return ( - <> - { cesHeader ? ( - - ) : ( - - ) } - - ); - } - - return ( - <> - { displayProgressHeader ? ( - - ) : null } -
- - { ( sections || [] ).map( ( section ) => ( - - } - opened={ openPanel === section.id } - onToggle={ ( isOpen: boolean ) => { - if ( ! isOpen && openPanel === section.id ) { - recordEvent( - `${ eventPrefix }section_closed`, - { - id: section.id, - all: true, - } - ); - setOpenPanel( null ); - } else { - if ( openPanel ) { - recordEvent( - `${ eventPrefix }section_closed`, - { - id: openPanel, - all: false, - } - ); - } - setOpenPanel( section.id ); - } - if ( isOpen ) { - recordEvent( - `${ eventPrefix }section_opened`, - { - id: section.id, - } - ); - } - } } - initialOpen={ false } - > - - - { getSectionTasks( section.tasks ).map( - ( task ) => ( - - ) - ) } - - - - ) ) } - -
- - ); -}; - -export default SectionedTaskList; diff --git a/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx b/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx deleted file mode 100644 index bc280ce4a10..00000000000 --- a/plugins/woocommerce-admin/client/two-column-tasks/task-list-item.tsx +++ /dev/null @@ -1,189 +0,0 @@ -/** - * External dependencies - */ -import { __ } from '@wordpress/i18n'; -import { getNewPath, navigateTo } from '@woocommerce/navigation'; -import { - ONBOARDING_STORE_NAME, - TaskType, - useUserPreferences, -} from '@woocommerce/data'; -import { recordEvent } from '@woocommerce/tracks'; -import { TaskItem, useSlot } from '@woocommerce/experimental'; -import { useCallback, useContext } from '@wordpress/element'; -import { useDispatch } from '@wordpress/data'; -import { WooOnboardingTaskListItem } from '@woocommerce/onboarding'; -import classnames from 'classnames'; - -/** - * Internal dependencies - */ -import { LayoutContext } from '~/layout'; - -export type TaskListItemProps = { - task: TaskType; - eventPrefix?: string; -}; - -export const TaskListItem: React.FC< TaskListItemProps > = ( { - task, - eventPrefix, -} ) => { - const { createNotice } = useDispatch( 'core/notices' ); - - const { - visitedTask, - dismissTask, - undoDismissTask, - snoozeTask, - undoSnoozeTask, - } = useDispatch( ONBOARDING_STORE_NAME ); - - const layoutContext = useContext( LayoutContext ); - - const slot = useSlot( - `woocommerce_onboarding_task_list_item_${ task.id }` - ); - const hasFills = Boolean( slot?.fills?.length ); - - const userPreferences = useUserPreferences(); - - const getTaskStartedCount = () => { - const trackedStartedTasks = - userPreferences.task_list_tracked_started_tasks; - if ( ! trackedStartedTasks || ! trackedStartedTasks[ task.id ] ) { - return 0; - } - return trackedStartedTasks[ task.id ]; - }; - - const updateTrackStartedCount = () => { - const newCount = getTaskStartedCount() + 1; - const trackedStartedTasks = - userPreferences.task_list_tracked_started_tasks || {}; - - visitedTask( task.id ); - userPreferences.updateUserPreferences( { - task_list_tracked_started_tasks: { - ...( trackedStartedTasks || {} ), - [ task.id ]: newCount, - }, - } ); - }; - - const trackClick = () => { - recordEvent( `${ eventPrefix }click`, { - task_name: task.id, - context: layoutContext.toString(), - } ); - - if ( ! task.isComplete ) { - updateTrackStartedCount(); - } - }; - - const onTaskSelected = () => { - trackClick(); - - if ( task.actionUrl ) { - navigateTo( { - url: task.actionUrl, - } ); - return; - } - - navigateTo( { url: getNewPath( { task: task.id }, '/', {} ) } ); - }; - - const onDismiss = useCallback( () => { - dismissTask( task.id ); - createNotice( 'success', __( 'Task dismissed', 'woocommerce' ), { - actions: [ - { - label: __( 'Undo', 'woocommerce' ), - onClick: () => undoDismissTask( task.id ), - }, - ], - } ); - }, [ task.id ] ); - - const onSnooze = useCallback( () => { - snoozeTask( task.id ); - createNotice( - 'success', - __( 'Task postponed until tomorrow', 'woocommerce' ), - { - actions: [ - { - label: __( 'Undo', 'woocommerce' ), - onClick: () => undoSnoozeTask( task.id ), - }, - ], - } - ); - }, [ task.id ] ); - - const className = classnames( 'woocommerce-task-list__item', { - complete: task.isComplete, - 'is-disabled': task.isDisabled, - } ); - - const taskItemProps = { - completed: task.isComplete, - onSnooze: task.isSnoozeable && onSnooze, - onDismiss: task.isDismissable && onDismiss, - }; - - const DefaultTaskItem = useCallback( - ( props ) => { - const onClickActions = () => { - if ( props.onClick ) { - trackClick(); - return props.onClick(); - } - return onTaskSelected(); - }; - return ( - {} } - actionLabel={ task.actionLabel } - { ...props } - onClick={ ( e: React.ChangeEvent ) => { - if ( task.isDisabled || e.target.tagName === 'A' ) { - return; - } - onClickActions(); - } } - /> - ); - }, - [ - task.id, - task.title, - task.content, - task.time, - task.actionLabel, - task.isComplete, - ] - ); - - return hasFills ? ( - - ) : ( - - ); -}; diff --git a/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx b/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx index 1f7b5d69d7a..48a3366a71a 100644 --- a/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx +++ b/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx @@ -259,56 +259,4 @@ describe( 'TaskList', () => { queryByText( dismissedTask[ 0 ].title ) ).not.toBeInTheDocument(); } ); - - it( 'should not display isSnoozed tasks', () => { - const dismissedTask = [ - { - ...tasks.setup[ 0 ], - isSnoozed: true, - snoozedUntil: Date.now() + 10000, - }, - ]; - const { queryByText } = render( - - ); - expect( - queryByText( dismissedTask[ 0 ].title ) - ).not.toBeInTheDocument(); - } ); - - it( 'should display a snoozed task if snoozedUntil passed the current timestamp', () => { - const dismissedTask = [ - { - ...tasks.setup[ 0 ], - isSnoozed: true, - snoozedUntil: Date.now() - 1000, - }, - ]; - const { queryByText } = render( - - ); - expect( queryByText( dismissedTask[ 0 ].title ) ).toBeInTheDocument(); - } ); } ); diff --git a/plugins/woocommerce/changelog/dev-clean-up-unused-task-properties-methods b/plugins/woocommerce/changelog/dev-clean-up-unused-task-properties-methods new file mode 100644 index 00000000000..245dc1feca4 --- /dev/null +++ b/plugins/woocommerce/changelog/dev-clean-up-unused-task-properties-methods @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Cleanup and deprecate unused Task properties and methods diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Init.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Init.php index b2be20cff7f..83eba2630f4 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Init.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Init.php @@ -5,13 +5,7 @@ namespace Automattic\WooCommerce\Admin\Features\OnboardingTasks; -use \Automattic\WooCommerce\Internal\Admin\Loader; -use Automattic\WooCommerce\Admin\API\Reports\Taxes\Stats\DataStore as TaxDataStore; use Automattic\WooCommerce\Admin\Features\OnboardingTasks\DeprecatedOptions; -use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks\Appearance; -use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks\Products; -use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks\Tax; -use Automattic\WooCommerce\Admin\PluginsHelper; /** * Contains the logic for completing onboarding tasks. diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Task.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Task.php index 6285b7f5d6b..03944a04fe4 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Task.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Task.php @@ -27,6 +27,8 @@ abstract class Task { * Name of the snooze option. * * @var string + * + * @deprecated 7.2.0 */ const SNOOZED_OPTION = 'woocommerce_task_list_remind_me_later_tasks'; @@ -178,9 +180,13 @@ abstract class Task { /** * Level. * + * @deprecated 7.2.0 + * * @return string */ public function get_level() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + return 3; } @@ -267,18 +273,26 @@ abstract class Task { /** * Check if a task is snoozeable. * + * @deprecated 7.2.0 + * * @return bool */ public function is_snoozeable() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + return false; } /** * Get the snoozed until datetime. * + * @deprecated 7.2.0 + * * @return string */ public function get_snoozed_until() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + $snoozed_tasks = get_option( self::SNOOZED_OPTION, array() ); if ( isset( $snoozed_tasks[ $this->get_id() ] ) ) { return $snoozed_tasks[ $this->get_id() ]; @@ -290,9 +304,13 @@ abstract class Task { /** * Bool for task snoozed. * + * @deprecated 7.2.0 + * * @return bool */ public function is_snoozed() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + if ( ! $this->is_snoozeable() ) { return false; } @@ -306,9 +324,14 @@ abstract class Task { * Snooze the task. * * @param string $duration Duration to snooze. day|hour|week. + * + * @deprecated 7.2.0 + * * @return bool */ public function snooze( $duration = 'day' ) { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + if ( ! $this->is_snoozeable() ) { return false; } @@ -330,9 +353,13 @@ abstract class Task { /** * Undo task snooze. * + * @deprecated 7.2.0 + * * @return bool */ public function undo_snooze() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + $snoozed = get_option( self::SNOOZED_OPTION, array() ); unset( $snoozed[ $this->get_id() ] ); $update = update_option( self::SNOOZED_OPTION, $snoozed ); @@ -406,9 +433,13 @@ abstract class Task { /** * Check if task is disabled. * + * @deprecated 7.2.0 + * * @return bool */ public function is_disabled() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + return false; } @@ -453,15 +484,15 @@ abstract class Task { 'actionUrl' => $this->get_action_url(), 'isComplete' => $this->is_complete(), 'time' => $this->get_time(), - 'level' => $this->get_level(), + 'level' => 3, 'isActioned' => $this->is_actioned(), 'isDismissed' => $this->is_dismissed(), 'isDismissable' => $this->is_dismissable(), - 'isSnoozed' => $this->is_snoozed(), - 'isSnoozeable' => $this->is_snoozeable(), + 'isSnoozed' => false, + 'isSnoozeable' => false, 'isVisited' => $this->is_visited(), - 'isDisabled' => $this->is_disabled(), - 'snoozedUntil' => $this->get_snoozed_until(), + 'isDisabled' => false, + 'snoozedUntil' => null, 'additionalData' => self::convert_object_to_camelcase( $this->get_additional_data() ), 'eventPrefix' => $this->prefix_event( '' ), ); diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php index 2ea980c9106..b769263d19b 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskList.php @@ -99,6 +99,8 @@ class TaskList { /** * Array of TaskListSection. * + * @deprecated 7.2.0 + * * @var array */ private $sections = array(); @@ -106,6 +108,8 @@ class TaskList { /** * Key value map of task class and id used for sections. * + * @deprecated 7.2.0 + * * @var array */ public $task_class_id_map = array(); @@ -126,7 +130,6 @@ class TaskList { 'options' => array(), 'visible' => true, 'display_progress_header' => false, - 'sections' => array(), ); $data = wp_parse_args( $data, $defaults ); @@ -147,12 +150,6 @@ class TaskList { } $this->possibly_remove_reminder_bar(); - $this->sections = array_map( - function( $section ) { - return new TaskListSection( $section, $this ); - }, - $data['sections'] - ); } /** @@ -274,9 +271,7 @@ class TaskList { return; } - $task_class_name = substr( get_class( $task ), strrpos( get_class( $task ), '\\' ) + 1 ); - $this->task_class_id_map[ $task_class_name ] = $task->get_id(); - $this->tasks[] = $task; + $this->tasks[] = $task; } /** @@ -315,9 +310,13 @@ class TaskList { /** * Get task list sections. * + * @deprecated 7.2.0 + * * @return array */ public function get_sections() { + wc_deprecated_function( __CLASS__ . '::' . __FUNCTION__, '7.2.0' ); + return $this->sections; } @@ -420,12 +419,6 @@ class TaskList { 'eventPrefix' => $this->prefix_event( '' ), 'displayProgressHeader' => $this->display_progress_header, 'keepCompletedTaskList' => $this->get_keep_completed_task_list(), - 'sections' => array_map( - function( $section ) { - return $section->get_json(); - }, - $this->sections - ), ); } } diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskListSection.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskListSection.php index bc343781dd3..65c5f001163 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskListSection.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskListSection.php @@ -7,6 +7,8 @@ namespace Automattic\WooCommerce\Admin\Features\OnboardingTasks; /** * Task List section class. + * + * @deprecated 7.2.0 */ class TaskListSection { diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Appearance.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Appearance.php index e7ba5cdc3e7..cadd67a6d5b 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Appearance.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Appearance.php @@ -39,9 +39,6 @@ class Appearance extends Task { * @return string */ public function get_title() { - if ( count( $this->task_list->get_sections() ) > 0 && ! $this->is_complete() ) { - return __( 'Make your store stand out with unique design', 'woocommerce' ); - } if ( $this->get_parent_option( 'use_completed_title' ) === true ) { if ( $this->is_complete() ) { return __( 'You personalized your store', 'woocommerce' ); @@ -57,9 +54,6 @@ class Appearance extends Task { * @return string */ public function get_content() { - if ( count( $this->task_list->get_sections() ) > 0 ) { - return __( 'Upload your logo to adapt the store to your brand’s personality.', 'woocommerce' ); - } return __( 'Add your logo, create a homepage, and start designing your store.', 'woocommerce' diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Marketing.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Marketing.php index 9a35e05b5d5..1ec834bf758 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Marketing.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Marketing.php @@ -25,9 +25,6 @@ class Marketing extends Task { * @return string */ public function get_title() { - if ( count( $this->task_list->get_sections() ) > 0 && ! $this->is_complete() ) { - return __( 'Grow your business with marketing tools', 'woocommerce' ); - } if ( true === $this->get_parent_option( 'use_completed_title' ) ) { if ( $this->is_complete() ) { return __( 'You added sales channels', 'woocommerce' ); @@ -43,9 +40,6 @@ class Marketing extends Task { * @return string */ public function get_content() { - if ( count( $this->task_list->get_sections() ) > 0 ) { - return __( 'Promote your store in other sales channels, like email, Google, and Facebook.', 'woocommerce' ); - } return __( 'Add recommended marketing tools to reach new customers and grow your business', 'woocommerce' diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Payments.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Payments.php index 5570ed8dc2e..d12f0846cda 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Payments.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Payments.php @@ -3,7 +3,6 @@ namespace Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks; use Automattic\WooCommerce\Admin\Features\Features; -use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks\WooCommercePayments; use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task; /** @@ -32,9 +31,6 @@ class Payments extends Task { * @return string */ public function get_title() { - if ( count( $this->task_list->get_sections() ) > 0 && ! $this->is_complete() ) { - return __( 'Add a way to get paid', 'woocommerce' ); - } if ( true === $this->get_parent_option( 'use_completed_title' ) ) { if ( $this->is_complete() ) { return __( 'You set up payments', 'woocommerce' ); @@ -50,9 +46,6 @@ class Payments extends Task { * @return string */ public function get_content() { - if ( count( $this->task_list->get_sections() ) > 0 ) { - return __( 'Let your customers pay the way they like.', 'woocommerce' ); - } return __( 'Choose payment providers and enable payment methods at checkout.', 'woocommerce' diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php index bae2bafda6f..0b2ee58fbd3 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Products.php @@ -37,9 +37,6 @@ class Products extends Task { * @return string */ public function get_title() { - if ( count( $this->task_list->get_sections() ) > 0 && ! $this->is_complete() ) { - return __( 'Create or upload your first products', 'woocommerce' ); - } if ( $this->get_parent_option( 'use_completed_title' ) === true ) { if ( $this->is_complete() ) { return __( 'You added products', 'woocommerce' ); @@ -55,9 +52,6 @@ class Products extends Task { * @return string */ public function get_content() { - if ( count( $this->task_list->get_sections() ) > 0 ) { - return __( 'Add products to sell and build your catalog.', 'woocommerce' ); - } return __( 'Start by adding the first product to your store. You can add your products manually, via CSV, or import them from another service.', 'woocommerce' diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Shipping.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Shipping.php index 7fe8607b68b..d42d2322c26 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Shipping.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Shipping.php @@ -43,9 +43,6 @@ class Shipping extends Task { * @return string */ public function get_title() { - if ( count( $this->task_list->get_sections() ) > 0 && ! $this->is_complete() ) { - return __( 'Select how to ship your products', 'woocommerce' ); - } if ( true === $this->get_parent_option( 'use_completed_title' ) ) { if ( $this->is_complete() ) { return __( 'You added shipping costs', 'woocommerce' ); @@ -61,9 +58,6 @@ class Shipping extends Task { * @return string */ public function get_content() { - if ( count( $this->task_list->get_sections() ) > 0 ) { - return __( 'Set delivery costs and enable extra features, like shipping label printing.', 'woocommerce' ); - } return __( "Set your store location and where you'll ship to.", 'woocommerce' diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Tax.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Tax.php index ca508bd880e..57d52d2d726 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Tax.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/Tax.php @@ -62,9 +62,6 @@ class Tax extends Task { * @return string */ public function get_title() { - if ( count( $this->task_list->get_sections() ) > 0 && ! $this->is_complete() ) { - return __( 'Get taxes out of your mind', 'woocommerce' ); - } if ( $this->get_parent_option( 'use_completed_title' ) === true ) { if ( $this->is_complete() ) { return __( 'You added tax rates', 'woocommerce' ); @@ -80,9 +77,6 @@ class Tax extends Task { * @return string */ public function get_content() { - if ( count( $this->task_list->get_sections() ) > 0 ) { - return __( 'Have sales tax calculated automatically, or add the rates manually.', 'woocommerce' ); - } return self::can_use_automated_taxes() ? __( 'Good news! WooCommerce Services and Jetpack can automate your sales tax calculations for you.', diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/onboarding-tasks.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/onboarding-tasks.php index ad35e8b3103..495ae081525 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/onboarding-tasks.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/onboarding-tasks.php @@ -51,7 +51,6 @@ class WC_Admin_Tests_API_Onboarding_Tasks extends WC_REST_Unit_Test_Case { // Resetting task list options and lists. update_option( Task::DISMISSED_OPTION, array() ); - update_option( Task::SNOOZED_OPTION, array() ); TaskLists::clear_lists(); } @@ -185,185 +184,6 @@ class WC_Admin_Tests_API_Onboarding_Tasks extends WC_REST_Unit_Test_Case { $this->assertSame( 'Custom post content', get_the_content( null, null, $data['post_id'] ) ); } - - /** - * Test that a task can be snoozed. - * @group tasklist - */ - public function test_task_can_be_snoozed() { - wp_set_current_user( $this->user ); - - TaskLists::add_list( - array( - 'id' => 'test-list', - ) - ); - - TaskLists::add_task( - 'test-list', - new TestTask( - TaskLists::get_list( 'test-list' ), - array( - 'id' => 'test-task', - 'title' => 'Test Task', - 'is_snoozeable' => true, - ) - ) - ); - - $request = new WP_REST_Request( 'POST', $this->endpoint . '/test-task/snooze' ); - $request->set_headers( array( 'content-type' => 'application/json' ) ); - $response = $this->server->dispatch( $request ); - $data = $response->get_data(); - - $task = TaskLists::get_task( 'test-task' ); - - $this->assertEquals( $data['isSnoozed'], true ); - $this->assertEquals( isset( $data['snoozedUntil'] ), true ); - $this->assertEquals( $task->is_snoozed(), true ); - $this->assertNotNull( $task->get_snoozed_until() ); - - } - - /** - * Test that a task can be snoozed with determined list ID. - * @group tasklist - */ - public function test_task_can_be_snoozed_with_list_id() { - wp_set_current_user( $this->user ); - - TaskLists::add_list( - array( - 'id' => 'test-list', - ) - ); - - TaskLists::add_task( - 'test-list', - new TestTask( - TaskLists::get_list( 'test-list' ), - array( - 'id' => 'test-task', - 'title' => 'Test Task', - 'is_snoozeable' => true, - ) - ) - ); - - $request = new WP_REST_Request( 'POST', $this->endpoint . '/test-task/snooze' ); - $request->set_headers( array( 'content-type' => 'application/json' ) ); - $request->set_body( wp_json_encode( array( 'task_list_id' => 'test-list' ) ) ); - $response = $this->server->dispatch( $request ); - $data = $response->get_data(); - - $task = TaskLists::get_task( 'test-task' ); - - $this->assertEquals( $data['isSnoozed'], true ); - $this->assertEquals( isset( $data['snoozedUntil'] ), true ); - $this->assertEquals( $task->is_snoozed(), true ); - $this->assertNotNull( $task->get_snoozed_until() ); - } - - /** - * Test that a task can be snoozed with determined duration. - * @group tasklist - */ - public function test_task_can_be_snoozed_with_duration() { - wp_set_current_user( $this->user ); - - TaskLists::add_list( - array( - 'id' => 'test-list', - ) - ); - - TaskLists::add_task( - 'test-list', - new TestTask( - TaskLists::get_list( 'test-list' ), - array( - 'id' => 'test-task', - 'title' => 'Test Task', - 'is_snoozeable' => true, - ) - ) - ); - - $request = new WP_REST_Request( 'POST', $this->endpoint . '/test-task/snooze' ); - $request->set_headers( array( 'content-type' => 'application/json' ) ); - $request->set_body( wp_json_encode( array( 'duration' => 'week' ) ) ); - $response = $this->server->dispatch( $request ); - $data = $response->get_data(); - - $task = TaskLists::get_task( 'test-task' ); - - $week_in_ms = WEEK_IN_SECONDS * 1000; - // Taking off 1 minute as matching a week is very precise and we might run into some race conditions otherwise. - $week_in_ms -= MINUTE_IN_SECONDS * 1000; - - $this->assertEquals( $data['snoozedUntil'] >= ( ( time() * 1000 ) + $week_in_ms ), true ); - - } - - /** - * Test that a snoozed task can be undone. - * @group tasklist - */ - public function test_snoozed_task_can_be_undone() { - wp_set_current_user( $this->user ); - - TaskLists::add_list( - array( - 'id' => 'test-list', - ) - ); - - TaskLists::add_task( - 'test-list', - new TestTask( - TaskLists::get_list( 'test-list' ), - array( - 'id' => 'test-task', - 'title' => 'Test Task', - 'is_snoozeable' => true, - ) - ) - ); - - $task = TaskLists::get_task( 'test-task' ); - - $task->snooze(); - - $this->assertEquals( $task->is_snoozed(), true ); - - $request = new WP_REST_Request( 'POST', $this->endpoint . '/test-task/undo_snooze' ); - $request->set_headers( array( 'content-type' => 'application/json' ) ); - $response = $this->server->dispatch( $request ); - $data = $response->get_data(); - - $task_after_request = TaskLists::get_task( 'test-task' ); - - $this->assertEquals( $task_after_request->is_snoozed(), false ); - - } - - /** - * Test that snooze endpoint returns error for invalid task. - * @group tasklist - */ - public function test_snoozed_task_invalid() { - $this->markTestSkipped( 'Skipped temporarily due to change in endpoint behavior.' ); - wp_set_current_user( $this->user ); - - $request = new WP_REST_Request( 'POST', $this->endpoint . '/test-task/snooze' ); - $request->set_headers( array( 'content-type' => 'application/json' ) ); - $response = $this->server->dispatch( $request ); - $response_data = $response->get_data(); - - $this->assertEquals( $response_data['data']['status'], 404 ); - $this->assertEquals( $response_data['code'], 'woocommerce_rest_invalid_task' ); - } - /** * Test that a task can be dismissed. * @group tasklist diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task.php index ba2ee818c71..bebd752a96f 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task.php @@ -99,100 +99,6 @@ class WC_Admin_Tests_OnboardingTasks_Task extends WC_Unit_Test_Case { } - /** - * Tests that a task can be snoozed. - */ - public function test_snooze() { - $task = new TestTask( - new TaskList( array( 'id' => 'setup' ) ), - array( - 'id' => 'wc-unit-test-snoozeable-task', - 'is_snoozeable' => true, - ) - ); - - $update = $task->snooze(); - $snoozed = get_option( Task::SNOOZED_OPTION, array() ); - $this->assertEquals( true, $update ); - $this->assertArrayHasKey( $task->get_id(), $snoozed ); - } - - /** - * Tests that a task can be unsnoozed. - */ - public function test_undo_snooze() { - $task = new TestTask( - new TaskList( array( 'id' => 'setup' ) ), - array( - 'id' => 'wc-unit-test-snoozeable-task', - 'is_snoozeable' => true, - ) - ); - - $task->snooze(); - $task->undo_snooze(); - $snoozed = get_option( Task::SNOOZED_OPTION, array() ); - $this->assertArrayNotHasKey( $task->get_id(), $snoozed ); - } - - /** - * Tests that a task's snooze time is automatically added. - */ - public function test_snoozed_until() { - $time = time() * 1000; - $snoozed = get_option( Task::SNOOZED_OPTION, array() ); - $snoozed['wc-unit-test-task'] = $time; - update_option( Task::SNOOZED_OPTION, $snoozed ); - - $task = new TestTask( - new TaskList( array( 'id' => 'setup' ) ), - array( - 'id' => 'wc-unit-test-task', - 'is_snoozeable' => true, - ) - ); - - $this->assertEquals( $time, $task->get_snoozed_until() ); - - } - - /** - * Tests that a non snoozeable task cannot be snoozed. - */ - public function test_not_snoozeable() { - $task = new TestTask( - new TaskList( array( 'id' => 'setup' ) ), - array( - 'id' => 'wc-unit-test-snoozeable-task', - 'is_snoozeable' => false, - ) - ); - - $task->snooze(); - $this->assertEquals( false, $task->is_snoozed() ); - } - - /** - * Tests that a task is no longer consider snoozed after the time has passed. - */ - public function test_snooze_time() { - $task = new TestTask( - new TaskList( array( 'id' => 'setup' ) ), - array( - 'id' => 'wc-unit-test-snoozeable-task', - 'is_snoozeable' => true, - ) - ); - - $time = time() * 1000 - 1; - $snoozed = get_option( Task::SNOOZED_OPTION, array() ); - $snoozed['wc-unit-test-snoozeable-task'] = $time; - update_option( Task::SNOOZED_OPTION, $snoozed ); - - $this->assertEquals( false, $task->is_snoozed() ); - } - - /** * Tests that a task's properties are returned as JSON. */ From c561d7941dd5a369aceffc26fec63a253b539797 Mon Sep 17 00:00:00 2001 From: kkmuffme <11071985+kkmuffme@users.noreply.github.com> Date: Thu, 3 Nov 2022 11:08:14 +0100 Subject: [PATCH 0037/1680] Fix wrong return type get shipping tax (#35453) Was documented as returning array, now it's documented as returning float (and the ourput is converted to float). --- .../changelog/fix-wrong-return-type-get-shipping-tax | 4 ++++ plugins/woocommerce/includes/class-wc-shipping-rate.php | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-wrong-return-type-get-shipping-tax diff --git a/plugins/woocommerce/changelog/fix-wrong-return-type-get-shipping-tax b/plugins/woocommerce/changelog/fix-wrong-return-type-get-shipping-tax new file mode 100644 index 00000000000..bdc41c8d4e7 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-wrong-return-type-get-shipping-tax @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Fix inconsistent return type of class WC_Shipping_Rate->get_shipping_tax() diff --git a/plugins/woocommerce/includes/class-wc-shipping-rate.php b/plugins/woocommerce/includes/class-wc-shipping-rate.php index f7eedbf3045..a42893ef5a1 100644 --- a/plugins/woocommerce/includes/class-wc-shipping-rate.php +++ b/plugins/woocommerce/includes/class-wc-shipping-rate.php @@ -226,10 +226,10 @@ class WC_Shipping_Rate { /** * Get shipping tax. * - * @return array + * @return float */ public function get_shipping_tax() { - return apply_filters( 'woocommerce_get_shipping_tax', count( $this->taxes ) > 0 && ! WC()->customer->get_is_vat_exempt() ? array_sum( $this->taxes ) : 0, $this ); + return apply_filters( 'woocommerce_get_shipping_tax', count( $this->taxes ) > 0 && ! WC()->customer->get_is_vat_exempt() ? (float) array_sum( $this->taxes ) : 0.0, $this ); } /** From 925432aebee6edc3fdf926023559feb5d13e302b Mon Sep 17 00:00:00 2001 From: Barry Hughes <3594411+barryhughes@users.noreply.github.com> Date: Thu, 3 Nov 2022 03:29:15 -0700 Subject: [PATCH 0038/1680] Admin redirects for HPOS URLs (#35463) * Redirect COT/HPOS admin requests to the corresponding CPT screen, if COT is not authoritative. * Tidy handling of query parameters. * Linting fixes. --- .../fix-35074-hpos-cpt-admin-redirects | 4 + .../includes/admin/class-wc-admin-menus.php | 3 + .../Admin/Orders/COTRedirectionController.php | 75 ++++++++ .../OrderAdminServiceProvider.php | 3 + .../Orders/COTRedirectionControllerTest.php | 181 ++++++++++++++++++ 5 files changed, 266 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-35074-hpos-cpt-admin-redirects create mode 100644 plugins/woocommerce/src/Internal/Admin/Orders/COTRedirectionController.php create mode 100644 plugins/woocommerce/tests/php/src/Internal/Admin/Orders/COTRedirectionControllerTest.php diff --git a/plugins/woocommerce/changelog/fix-35074-hpos-cpt-admin-redirects b/plugins/woocommerce/changelog/fix-35074-hpos-cpt-admin-redirects new file mode 100644 index 00000000000..9a4fa61de72 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35074-hpos-cpt-admin-redirects @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +When custom order tables are not authoritative, admin UI requests will be redirected to the matching legacy order screen as appropriate. diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php index 191d65ca586..8b1491042b7 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php @@ -6,6 +6,7 @@ * @version 2.5.0 */ +use Automattic\WooCommerce\Internal\Admin\Orders\COTRedirectionController; use Automattic\WooCommerce\Internal\Admin\Orders\PageController as Custom_Orders_PageController; use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController; use Automattic\WooCommerce\Admin\Features\Features; @@ -316,6 +317,8 @@ class WC_Admin_Menus { if ( wc_get_container()->get( CustomOrdersTableController::class )->custom_orders_table_usage_is_enabled() ) { $this->orders_page_controller = new Custom_Orders_PageController(); $this->orders_page_controller->setup(); + } else { + wc_get_container()->get( COTRedirectionController::class )->setup(); } } diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/COTRedirectionController.php b/plugins/woocommerce/src/Internal/Admin/Orders/COTRedirectionController.php new file mode 100644 index 00000000000..f307bad74d7 --- /dev/null +++ b/plugins/woocommerce/src/Internal/Admin/Orders/COTRedirectionController.php @@ -0,0 +1,75 @@ +get( COTRedirectionController::class ), 'handle_hpos_admin_requests' ) + * ); + */ +class COTRedirectionController { + use AccessiblePrivateMethods; + + /** + * Add hooks needed to perform our magic. + */ + public function setup(): void { + // Only take action in cases where access to the admin screen would otherwise be denied. + self::add_action( 'admin_page_access_denied', array( $this, 'handle_hpos_admin_requests' ) ); + } + + /** + * Listen for denied admin requests and, if they appear to relate to HPOS admin screens, potentially + * redirect the user to the equivalent CPT-driven screens. + * + * @param array|null $query_params The query parameters to use when determining the redirect. If not provided, the $_GET superglobal will be used. + */ + private function handle_hpos_admin_requests( $query_params = null ) { + $query_params = is_array( $query_params ) ? $query_params : $_GET; + + if ( ! isset( $query_params['page'] ) || 'wc-orders' !== $query_params['page'] ) { + return; + } + + $params = wp_unslash( $query_params ); + $action = $params['action'] ?? ''; + unset( $params['page'] ); + + if ( 'edit' === $action && isset( $params['id'] ) ) { + $params['post'] = $params['id']; + unset( $params['id'] ); + $new_url = add_query_arg( $params, get_admin_url( null, 'post.php' ) ); + } elseif ( 'new' === $action ) { + unset( $params['action'] ); + $params['post_type'] = 'shop_order'; + $new_url = add_query_arg( $params, get_admin_url( null, 'post-new.php' ) ); + } else { + // If nonce parameters are present and valid, rebuild them for the CPT admin list table. + if ( isset( $params['_wpnonce'] ) && check_admin_referer( 'bulk-orders' ) ) { + $params['_wp_http_referer'] = get_admin_url( null, 'edit.php?post_type=shop_order' ); + $params['_wpnonce'] = wp_create_nonce( 'bulk-posts' ); + } + + // If an `order` array parameter is present, rename as `post`. + if ( isset( $params['order'] ) && is_array( $params['order'] ) ) { + $params['post'] = $params['order']; + unset( $params['order'] ); + } + + $params['post_type'] = 'shop_order'; + $new_url = add_query_arg( $params, get_admin_url( null, 'edit.php' ) ); + } + + if ( ! empty( $new_url ) && wp_safe_redirect( $new_url, 301 ) ) { + exit; + } + } +} diff --git a/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/OrderAdminServiceProvider.php b/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/OrderAdminServiceProvider.php index ee473150be7..bbdd2a83d43 100644 --- a/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/OrderAdminServiceProvider.php +++ b/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/OrderAdminServiceProvider.php @@ -5,6 +5,7 @@ namespace Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders; +use Automattic\WooCommerce\Internal\Admin\Orders\COTRedirectionController; use Automattic\WooCommerce\Internal\Admin\Orders\Edit; use Automattic\WooCommerce\Internal\Admin\Orders\ListTable; use Automattic\WooCommerce\Internal\Admin\Orders\PageController; @@ -21,6 +22,7 @@ class OrderAdminServiceProvider extends AbstractServiceProvider { * @var string[] */ protected $provides = array( + COTRedirectionController::class, PageController::class, Edit::class, ListTable::class, @@ -32,6 +34,7 @@ class OrderAdminServiceProvider extends AbstractServiceProvider { * @return void */ public function register() { + $this->share( COTRedirectionController::class ); $this->share( PageController::class ); $this->share( Edit::class )->addArgument( PageController::class ); $this->share( ListTable::class )->addArgument( PageController::class ); diff --git a/plugins/woocommerce/tests/php/src/Internal/Admin/Orders/COTRedirectionControllerTest.php b/plugins/woocommerce/tests/php/src/Internal/Admin/Orders/COTRedirectionControllerTest.php new file mode 100644 index 00000000000..f15a085ff47 --- /dev/null +++ b/plugins/woocommerce/tests/php/src/Internal/Admin/Orders/COTRedirectionControllerTest.php @@ -0,0 +1,181 @@ +sut = new COTRedirectionController(); + $this->sut->setup(); + $this->redirected_to = ''; + + add_filter( 'wp_redirect', array( $this, 'watch_and_anull_redirects' ) ); + } + + /** + * Remove our redirect listener. + * + * @return void + */ + public function tearDown(): void { + parent::tearDown(); + remove_filter( 'wp_redirect', array( $this, 'watch_and_anull_redirects' ) ); + } + + /** + * Captures the attempted redirect location, and stops the redirect from taking place. + * + * @param string $url Redirect location. + * + * @return null + */ + public function watch_and_anull_redirects( string $url ) { + $this->redirected_to = $url; + return null; + } + + /** + * Supplies the URL of the last attempted redirect, then resets ready for the next test. + * + * @return string + */ + private function get_redirect_attempt(): string { + $return = $this->redirected_to; + $this->redirected_to = ''; + return $return; + } + + /** + * Test that redirects only occur in relation to HPOS admin screen requests. + * + * @return void + */ + public function test_redirects_only_impact_hpos_admin_requests() { + $this->sut->handle_hpos_admin_requests( array( 'page' => 'wc-orders' ) ); + $this->assertNotEmpty( $this->get_redirect_attempt(), 'A redirect was attempted in relation to an HPOS admin request.' ); + + $this->sut->handle_hpos_admin_requests( array( 'page' => 'foo' ) ); + $this->assertEmpty( $this->get_redirect_attempt(), 'A redirect was not attempted in relation to a non-HPOS admin request.' ); + } + + /** + * Test order editor redirects work (in relation to creating new orders). + * + * @return void + */ + public function test_redirects_to_the_new_order_screen(): void { + $this->sut->handle_hpos_admin_requests( + array( + 'action' => 'new', + 'page' => 'wc-orders', + ) + ); + + $this->assertStringContainsString( + '/wp-admin/post-new.php?post_type=shop_order', + $this->get_redirect_attempt(), + 'Attempts to access the new order page (HPOS) are successfully redirected to the new order page (CPT).' + ); + } + + /** + * Test order editor redirects work (in relation to existing orders). + * + * @return void + */ + public function test_redirects_to_the_order_editor_screen(): void { + $this->sut->handle_hpos_admin_requests( + array( + 'action' => 'edit', + 'id' => 12345, + 'page' => 'wc-orders', + ) + ); + + $redirect_url = $this->get_redirect_attempt(); + $redirect_base = wp_parse_url( $redirect_url, PHP_URL_PATH ); + parse_str( wp_parse_url( $redirect_url, PHP_URL_QUERY ), $redirect_query ); + + $this->assertStringContainsString( + '/post.php', + $redirect_base, + 'Confirm order editor redirects go to the expected WordPress admin controller.' + ); + + $this->assertEquals( + '12345', + $redirect_query['post'], + 'Confirm order editor redirects maintain the correct order ID.' + ); + } + + /** + * Tests order list table redirects work. + * + * @return void + */ + public function test_redirects_to_the_order_admin_list_screen(): void { + $this->sut->handle_hpos_admin_requests( + array( + 'arbitrary' => '3pd-integration', + 'order' => array( + 123, + 456, + ), + 'page' => 'wc-orders', + ) + ); + + $redirect_url = $this->get_redirect_attempt(); + $redirect_base = wp_parse_url( $redirect_url, PHP_URL_PATH ); + parse_str( wp_parse_url( $redirect_url, PHP_URL_QUERY ), $redirect_query ); + + $this->assertStringContainsString( + '/edit.php', + $redirect_base, + 'Confirm order list table redirects go to the expected WordPress admin controller.' + ); + + $this->assertEquals( + array( + '123', + '456', + ), + $redirect_query['post'], + 'Confirm order list table redirects maintain a list of order IDs for bulk action requests (if one was passed).' + ); + + $this->assertEquals( + 'shop_order', + $redirect_query['post_type'], + 'Confirm order list table redirects reference the correct custom post type.' + ); + + $this->assertEquals( + '3pd-integration', + $redirect_query['arbitrary'], + 'Confirm that arbitrary query parameters are also passed across via order list table redirects.' + ); + } +} From 8ef8a380e5bea35ade8eb7302818e3945d45d914 Mon Sep 17 00:00:00 2001 From: Basti <51531217+crftwrk@users.noreply.github.com> Date: Thu, 3 Nov 2022 12:25:29 +0100 Subject: [PATCH 0039/1680] Fix version typo in form-login.php (#35479) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Néstor Soriano --- plugins/woocommerce/changelog/fix-version-typo-form-login | 4 ++++ plugins/woocommerce/templates/global/form-login.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-version-typo-form-login diff --git a/plugins/woocommerce/changelog/fix-version-typo-form-login b/plugins/woocommerce/changelog/fix-version-typo-form-login new file mode 100644 index 00000000000..04268cb2b3b --- /dev/null +++ b/plugins/woocommerce/changelog/fix-version-typo-form-login @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Fix @version header in form-login.php diff --git a/plugins/woocommerce/templates/global/form-login.php b/plugins/woocommerce/templates/global/form-login.php index 767d13ea60a..33776e45611 100644 --- a/plugins/woocommerce/templates/global/form-login.php +++ b/plugins/woocommerce/templates/global/form-login.php @@ -12,7 +12,7 @@ * * @see https://docs.woocommerce.com/document/template-structure/ * @package WooCommerce\Templates - * @version 7.1.0 + * @version 7.0.1 */ if ( ! defined( 'ABSPATH' ) ) { From dcafc4b5a5969b4643aacbf29a699fd7aaedc804 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 3 Nov 2022 18:12:50 +0530 Subject: [PATCH 0040/1680] Display correct order pending sync count on feature enabled screen. (#35480) * Display correct order pending sync count on feature enabled screen. * Add changelog. --- plugins/woocommerce/changelog/fix-percentage_type | 5 +++++ .../src/Internal/DataStores/Orders/DataSynchronizer.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-percentage_type diff --git a/plugins/woocommerce/changelog/fix-percentage_type b/plugins/woocommerce/changelog/fix-percentage_type new file mode 100644 index 00000000000..8b6580f80c0 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-percentage_type @@ -0,0 +1,5 @@ +Significance: patch +Type: fix +Comment: Minor type fix. + + diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php index b4849201ae2..2d30539c601 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php @@ -472,7 +472,7 @@ WHERE $extra_tip = sprintf( _n( "⚠ There's one order pending sync from the posts table to the orders table. The feature shouldn't be disabled until this order is synchronized.", - "⚠ There are %%1\$d orders pending sync from the posts table to the orders table. The feature shouldn't be disabled until these orders are synchronized.", + "⚠ There are %1\$d orders pending sync from the posts table to the orders table. The feature shouldn't be disabled until these orders are synchronized.", $pending_sync_count, 'woocommerce' ), From 1b0d8c077cfd13e1d41702fd8fd33b2f38bae44c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 09:25:02 -0500 Subject: [PATCH 0041/1680] Delete changelog files based on PR 35480 (#35484) Delete changelog files for 35480 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-percentage_type | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-percentage_type diff --git a/plugins/woocommerce/changelog/fix-percentage_type b/plugins/woocommerce/changelog/fix-percentage_type deleted file mode 100644 index 8b6580f80c0..00000000000 --- a/plugins/woocommerce/changelog/fix-percentage_type +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: fix -Comment: Minor type fix. - - From 5b1296fe45927cc03b2d286a64e5532afc6640e0 Mon Sep 17 00:00:00 2001 From: Joel Thiessen <444632+joelclimbsthings@users.noreply.github.com> Date: Thu, 3 Nov 2022 08:20:29 -0700 Subject: [PATCH 0042/1680] Adding attribute edit modal for products MVP (#35269) --- .../changelog/add-34332-add-attribute-edit | 4 + packages/js/components/package.json | 2 +- .../attribute-field/add-attribute-modal.tsx | 75 ++-- .../attribute-field/attribute-field.tsx | 157 ++++++- .../attribute-field/edit-attribute-modal.scss | 35 ++ .../attribute-field/edit-attribute-modal.tsx | 184 ++++++++ .../test/add-attribute-modal.spec.tsx | 22 +- .../test/attribute-field.spec.tsx | 255 ++++++----- .../products/fields/attribute-field/utils.ts | 4 +- .../attribute-input-field.tsx | 35 +- .../test/attribute-input-field.spec.tsx | 8 +- .../attribute-term-input-field.scss | 5 + .../attribute-term-input-field.tsx | 16 +- .../custom-attribute-term-input-field.tsx | 182 ++++++++ .../attribute-term-input-field/index.ts | 1 + .../products/sections/attributes-section.tsx | 9 +- .../changelog/add-34332-add-attribute-edit | 4 + pnpm-lock.yaml | 403 +++++++++--------- 18 files changed, 1027 insertions(+), 374 deletions(-) create mode 100644 packages/js/components/changelog/add-34332-add-attribute-edit create mode 100644 plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.scss create mode 100644 plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.tsx create mode 100644 plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/custom-attribute-term-input-field.tsx create mode 100644 plugins/woocommerce/changelog/add-34332-add-attribute-edit diff --git a/packages/js/components/changelog/add-34332-add-attribute-edit b/packages/js/components/changelog/add-34332-add-attribute-edit new file mode 100644 index 00000000000..42678d69bf9 --- /dev/null +++ b/packages/js/components/changelog/add-34332-add-attribute-edit @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Updating downshift to 6.1.12. diff --git a/packages/js/components/package.json b/packages/js/components/package.json index 3955a228b76..2a07a218727 100644 --- a/packages/js/components/package.json +++ b/packages/js/components/package.json @@ -74,7 +74,7 @@ "d3-shape": "^1.3.7", "d3-time-format": "^2.3.0", "dompurify": "^2.3.6", - "downshift": "^6.1.9", + "downshift": "^6.1.12", "emoji-flags": "^1.3.0", "gridicons": "^3.4.0", "memoize-one": "^6.0.0", diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx index effe7a7ed37..20bb4c5ab23 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx @@ -4,11 +4,11 @@ import { __ } from '@wordpress/i18n'; import { useState } from '@wordpress/element'; import { trash } from '@wordpress/icons'; -import { ProductAttribute, ProductAttributeTerm } from '@woocommerce/data'; import { Form, __experimentalSelectControlMenuSlot as SelectControlMenuSlot, } from '@woocommerce/components'; + import { Button, Modal, @@ -23,21 +23,19 @@ import { import './add-attribute-modal.scss'; import { AttributeInputField } from '../attribute-input-field'; import { AttributeTermInputField } from '../attribute-term-input-field'; +import { HydratedAttributeType } from '../attribute-field'; -type CreateCategoryModalProps = { +type AddAttributeModalProps = { onCancel: () => void; - onAdd: ( newCategories: ProductAttribute[] ) => void; + onAdd: ( newCategories: HydratedAttributeType[] ) => void; selectedAttributeIds?: number[]; }; type AttributeForm = { - attributes: { - attribute?: ProductAttribute; - terms: ProductAttributeTerm[]; - }[]; + attributes: Array< HydratedAttributeType | { id: undefined; terms: [] } >; }; -export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { +export const AddAttributeModal: React.FC< AddAttributeModalProps > = ( { onCancel, onAdd, selectedAttributeIds = [], @@ -53,23 +51,18 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { setValue( 'attributes', [ ...values.attributes, { - attribute: undefined, + id: undefined, terms: [], }, ] ); }; const onAddingAttributes = ( values: AttributeForm ) => { - const newAttributesToAdd: ProductAttribute[] = []; + const newAttributesToAdd: HydratedAttributeType[] = []; values.attributes.forEach( ( attr ) => { - if ( - attr.attribute && - attr.attribute.name && - attr.terms.length > 0 - ) { + if ( attr.id && attr.name && ( attr.terms || [] ).length > 0 ) { newAttributesToAdd.push( { - ...( attr.attribute as ProductAttribute ), - options: attr.terms.map( ( term ) => term.name ), + ...( attr as HydratedAttributeType ), } ); } } ); @@ -91,7 +84,7 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { ); } else { setValue( `attributes[${ index }]`, [ - { attribute: undefined, terms: [] }, + { id: undefined, terms: [] }, ] ); } }; @@ -111,7 +104,7 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { const onClose = ( values: AttributeForm ) => { const hasValuesSet = values.attributes.some( - ( value ) => value?.attribute?.id && value?.terms?.length > 0 + ( value ) => value?.id && value?.terms && value?.terms.length > 0 ); if ( hasValuesSet ) { setShowConfirmClose( true ); @@ -124,7 +117,7 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { <> initialValues={ { - attributes: [ { attribute: undefined, terms: [] } ], + attributes: [ { id: undefined, terms: [] } ], } } > { ( { @@ -169,7 +162,7 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { { values.attributes.map( - ( { attribute, terms }, index ) => ( + ( formAttr, index ) => ( = ( { 'Search or create attribute', 'woocommerce' ) } - value={ attribute } + value={ + formAttr.id && + formAttr.name + ? formAttr + : null + } onChange={ ( val ) => { setValue( 'attributes[' + index + - '].attribute', - val + ']', + { + ...val, + terms: [], + options: + undefined, + } ); if ( val ) { focusValueField( @@ -196,22 +199,20 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { ); } } } - filteredAttributeIds={ [ + ignoredAttributeIds={ [ ...selectedAttributeIds, ...values.attributes .map( ( attr ) => - attr - ?.attribute - ?.id + attr?.id ) .filter( ( - id - ): id is number => - id !== + attrId + ): attrId is number => + attrId !== undefined ), ] } @@ -224,12 +225,14 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { 'woocommerce' ) } disabled={ - ! attribute?.id + ! formAttr.id } attributeId={ - attribute?.id + formAttr.id + } + value={ + formAttr.terms } - value={ terms } onChange={ ( val ) => @@ -252,7 +255,6 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { 1 && ! values .attributes[ 0 ] - ?.attribute ?.id } label={ __( @@ -306,8 +308,7 @@ export const AddAttributeModal: React.FC< CreateCategoryModalProps > = ( { ) } disabled={ values.attributes.length === 1 && - ! values.attributes[ 0 ]?.attribute - ?.id && + ! values.attributes[ 0 ]?.id && values.attributes[ 0 ]?.terms ?.length === 0 } diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx index 5f855199f2d..9fea1840def 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx @@ -3,10 +3,19 @@ */ import { sprintf, __ } from '@wordpress/i18n'; import { Button, Card, CardBody } from '@wordpress/components'; -import { useState } from '@wordpress/element'; -import { ProductAttribute } from '@woocommerce/data'; +import { useState, useCallback, useEffect } from '@wordpress/element'; +import { + ProductAttribute, + EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME, + ProductAttributeTerm, +} from '@woocommerce/data'; +import { resolveSelect } from '@wordpress/data'; import { Text } from '@woocommerce/experimental'; -import { Sortable, ListItem } from '@woocommerce/components'; +import { + Sortable, + ListItem, + __experimentalSelectControlMenuSlot as SelectControlMenuSlot, +} from '@woocommerce/components'; import { closeSmall } from '@wordpress/icons'; /** @@ -15,29 +24,120 @@ import { closeSmall } from '@wordpress/icons'; import './attribute-field.scss'; import AttributeEmptyStateLogo from './attribute-empty-state-logo.svg'; import { AddAttributeModal } from './add-attribute-modal'; +import { EditAttributeModal } from './edit-attribute-modal'; import { reorderSortableProductAttributePositions } from './utils'; +import { sift } from '../../../utils'; type AttributeFieldProps = { value: ProductAttribute[]; onChange: ( value: ProductAttribute[] ) => void; + productId?: number; +}; + +export type HydratedAttributeType = Omit< ProductAttribute, 'options' > & { + options?: string[]; + terms?: ProductAttributeTerm[]; }; export const AttributeField: React.FC< AttributeFieldProps > = ( { value, onChange, + productId, } ) => { const [ showAddAttributeModal, setShowAddAttributeModal ] = useState( false ); + const [ hydrationComplete, setHydrationComplete ] = useState< boolean >( + value ? false : true + ); + const [ hydratedAttributes, setHydratedAttributes ] = useState< + HydratedAttributeType[] + >( [] ); + const [ editingAttributeId, setEditingAttributeId ] = useState< + null | string + >( null ); + + const fetchTerms = useCallback( + ( attributeId: number ) => { + return resolveSelect( + EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME + ) + .getProductAttributeTerms< ProductAttributeTerm[] >( { + attribute_id: attributeId, + product: productId, + } ) + .then( + ( attributeTerms ) => { + return attributeTerms; + }, + ( error ) => { + return error; + } + ); + }, + [ productId ] + ); + + useEffect( () => { + if ( ! value || hydrationComplete ) { + return; + } + + const [ customAttributes, globalAttributes ]: ProductAttribute[][] = + sift( value, ( attr: ProductAttribute ) => attr.id === 0 ); + + Promise.all( + globalAttributes.map( ( attr ) => fetchTerms( attr.id ) ) + ).then( ( allResults ) => { + setHydratedAttributes( [ + ...globalAttributes.map( ( attr, index ) => { + const newAttr = { + ...attr, + terms: allResults[ index ], + options: undefined, + }; + + return newAttr; + } ), + ...customAttributes, + ] ); + setHydrationComplete( true ); + } ); + }, [ productId, value, hydrationComplete ] ); + + const fetchAttributeId = ( attribute: { id: number; name: string } ) => + `${ attribute.id }-${ attribute.name }`; + + const updateAttributes = ( attributes: HydratedAttributeType[] ) => { + setHydratedAttributes( attributes ); + onChange( + attributes.map( ( attr ) => { + return { + ...attr, + options: attr.terms + ? attr.terms.map( ( term ) => term.name ) + : ( attr.options as string[] ), + terms: undefined, + }; + } ) + ); + }; + const onRemove = ( attribute: ProductAttribute ) => { // eslint-disable-next-line no-alert if ( window.confirm( __( 'Remove this attribute?', 'woocommerce' ) ) ) { - onChange( value.filter( ( attr ) => attr.id !== attribute.id ) ); + updateAttributes( + hydratedAttributes.filter( + ( attr ) => + fetchAttributeId( attr ) !== + fetchAttributeId( attribute ) + ) + ); } }; - const onAddNewAttributes = ( newAttributes: ProductAttribute[] ) => { - onChange( [ - ...( value || [] ), + const onAddNewAttributes = ( newAttributes: HydratedAttributeType[] ) => { + updateAttributes( [ + ...( hydratedAttributes || [] ), ...newAttributes .filter( ( newAttr ) => @@ -53,7 +153,7 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { setShowAddAttributeModal( false ); }; - if ( ! value || value.length === 0 ) { + if ( ! value || value.length === 0 || hydratedAttributes.length === 0 ) { return ( @@ -111,6 +211,7 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { }, {} as Record< number, ProductAttribute > ); + return (
= ( { } } > { sortedAttributes.map( ( attribute ) => ( - +
{ attribute.name }
{ attribute.options @@ -147,7 +248,14 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { ) }
-
); }; diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.scss b/plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.scss new file mode 100644 index 00000000000..420debdc77a --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.scss @@ -0,0 +1,35 @@ +.woocommerce-edit-attribute-modal { + overflow: visible; +} + +.woocommerce-edit-attribute-modal__body { + width: 500px; + max-width: 100%; + + .woocommerce-experimental-select-control + .woocommerce-experimental-select-control { + margin-top: 1.3em; + } + + .woocommerce-experimental-select-control__label, + .components-base-control__label { + font-size: 14px; + color: #757575; + font-weight: bold; + text-transform: none; + } + + .woocommerce-edit-attribute-modal__option-container { + display: flex; + flex-direction: row; + align-items: center; + } + + .woocommerce-attribute-term-field { + margin-bottom: 1.5em; + } + + .woocommerce-edit-attribute-modal__helper-text { + color: #757575; + margin: 0.5em 0 1.5em 0; + } +} diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.tsx new file mode 100644 index 00000000000..19e82720c5e --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/edit-attribute-modal.tsx @@ -0,0 +1,184 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { + Button, + Modal, + CheckboxControl, + TextControl, +} from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { + __experimentalTooltip as Tooltip, + Link, +} from '@woocommerce/components'; +import interpolateComponents from '@automattic/interpolate-components'; +import { getAdminLink } from '@woocommerce/settings'; + +/** + * Internal dependencies + */ +import { + AttributeTermInputField, + CustomAttributeTermInputField, +} from '../attribute-term-input-field'; +import { HydratedAttributeType } from './attribute-field'; + +import './edit-attribute-modal.scss'; + +type EditAttributeModalProps = { + onCancel: () => void; + onEdit: ( alteredAttribute: HydratedAttributeType ) => void; + attribute: HydratedAttributeType; +}; + +export const EditAttributeModal: React.FC< EditAttributeModalProps > = ( { + onCancel, + onEdit, + attribute, +} ) => { + const [ editableAttribute, setEditableAttribute ] = useState< + HydratedAttributeType | undefined + >( { ...attribute } ); + + const isCustomAttribute = editableAttribute?.id === 0; + + return ( + onCancel() } + className="woocommerce-edit-attribute-modal" + > +
+ + setEditableAttribute( { + ...( editableAttribute as HydratedAttributeType ), + name: val, + } ) + } + /> +

+ { ! isCustomAttribute + ? interpolateComponents( { + mixedString: __( + `You can change the attribute's name in {{link}}Attributes{{/link}}.`, + 'woocommerce' + ), + components: { + link: ( + + <> + + ), + }, + } ) + : __( + 'Your customers will see this on the product page', + 'woocommerce' + ) } +

+ { attribute.terms ? ( + { + setEditableAttribute( { + ...( editableAttribute as HydratedAttributeType ), + terms: val, + } ); + } } + /> + ) : ( + { + setEditableAttribute( { + ...( editableAttribute as HydratedAttributeType ), + options: val, + } ); + } } + /> + ) } + +
+ + setEditableAttribute( { + ...( editableAttribute as HydratedAttributeType ), + visible: val, + } ) + } + checked={ editableAttribute?.visible } + label={ __( 'Visible to customers', 'woocommerce' ) } + /> + +
+
+ + setEditableAttribute( { + ...( editableAttribute as HydratedAttributeType ), + variation: val, + } ) + } + checked={ editableAttribute?.variation } + label={ __( 'Used for filters', 'woocommerce' ) } + /> + +
+
+
+ + +
+
+ ); +}; diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/test/add-attribute-modal.spec.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/test/add-attribute-modal.spec.tsx index c88173c4fe9..d91848deb76 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/test/add-attribute-modal.spec.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/test/add-attribute-modal.spec.tsx @@ -259,7 +259,7 @@ describe( 'AddAttributeModal', () => { expect( onAddMock ).toHaveBeenCalledWith( [] ); } ); - it( 'should add attribute with terms as string of options', () => { + it( 'should add attribute with array of terms', () => { const onAddMock = jest.fn(); const { queryByRole } = render( { attributeTermList[ 1 ], ] ); queryByRole( 'button', { name: 'Add attributes' } )?.click(); - expect( onAddMock ).toHaveBeenCalledWith( [ - { - ...attributeList[ 0 ], - options: [ - attributeTermList[ 0 ].name, - attributeTermList[ 1 ].name, - ], - }, - ] ); + + const onAddMockCalls = onAddMock.mock.calls[ 0 ][ 0 ]; + + expect( onAddMockCalls ).toHaveLength( 1 ); + expect( onAddMockCalls[ 0 ].id ).toEqual( attributeList[ 0 ].id ); + expect( onAddMockCalls[ 0 ].terms[ 0 ].name ).toEqual( + attributeTermList[ 0 ].name + ); + expect( onAddMockCalls[ 0 ].terms[ 1 ].name ).toEqual( + attributeTermList[ 1 ].name + ); } ); } ); } ); diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx index d6152e19562..542a1fe7e07 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx @@ -1,48 +1,16 @@ /** * External dependencies */ -import { render } from '@testing-library/react'; +import { render, act, screen, waitFor } from '@testing-library/react'; import { useState, useEffect } from '@wordpress/element'; import { ProductAttribute } from '@woocommerce/data'; +import { resolveSelect } from '@wordpress/data'; /** * Internal dependencies */ import { AttributeField } from '../attribute-field'; -let triggerDrag: ( items: Array< { key: string } > ) => void; - -jest.mock( '@woocommerce/components', () => ( { - __esModule: true, - ListItem: ( { children }: { children: JSX.Element } ) => children, - Sortable: ( { - onOrderChange, - children, - }: { - onOrderChange: ( items: Array< { key: string } > ) => void; - children: JSX.Element[]; - } ) => { - const [ items, setItems ] = useState< JSX.Element[] >( [] ); - useEffect( () => { - if ( ! children ) { - return; - } - setItems( Array.isArray( children ) ? children : [ children ] ); - }, [ children ] ); - - triggerDrag = ( newItems: Array< { key: string } > ) => { - onOrderChange( newItems ); - }; - return ( - <> - { items.map( ( child, index ) => ( -
{ child }
- ) ) } - - ); - }, -} ) ); - const attributeList: ProductAttribute[] = [ { id: 15, @@ -75,6 +43,66 @@ const attributeList: ProductAttribute[] = [ }, ]; +let triggerDrag: ( items: Array< { key: string } > ) => void; + +jest.mock( '@wordpress/data', () => ( { + ...jest.requireActual( '@wordpress/data' ), + resolveSelect: jest.fn().mockReturnValue( { + getProductAttributeTerms: ( { + attribute_id, + }: { + attribute_id: number; + } ) => + new Promise( ( resolve ) => { + const attr = attributeList.find( + ( item ) => item.id === attribute_id + ); + resolve( + attr?.options.map( ( itemName, index ) => ( { + id: ++index, + slug: itemName.toLowerCase(), + name: itemName, + description: '', + menu_order: ++index, + count: ++index, + } ) ) + ); + } ), + } ), +} ) ); + +jest.mock( '@woocommerce/components', () => ( { + __esModule: true, + ListItem: ( { children }: { children: JSX.Element } ) => children, + __experimentalSelectControlMenuSlot: () => null, + Sortable: ( { + onOrderChange, + children, + }: { + onOrderChange: ( items: Array< { key: string } > ) => void; + children: JSX.Element[]; + } ) => { + const [ items, setItems ] = useState< JSX.Element[] >( [] ); + useEffect( () => { + if ( ! children ) { + return; + } + setItems( Array.isArray( children ) ? children : [ children ] ); + }, [ children ] ); + + triggerDrag = ( newItems: Array< { key: string } > ) => { + onOrderChange( newItems ); + }; + return ( + <> + { items.map( ( child, index ) => ( +
{ child }
+ ) ) } + + ); + }, +} ) ); + describe( 'AttributeField', () => { beforeEach( () => { jest.clearAllMocks(); @@ -90,103 +118,138 @@ describe( 'AttributeField', () => { } ); } ); - it( 'should render the list of existing attributes', () => { - const { queryByText } = render( - {} } - /> - ); - expect( queryByText( 'No attributes yet' ) ).not.toBeInTheDocument(); - expect( queryByText( 'Add first attribute' ) ).not.toBeInTheDocument(); - expect( queryByText( attributeList[ 0 ].name ) ).toBeInTheDocument(); - expect( queryByText( attributeList[ 1 ].name ) ).toBeInTheDocument(); - } ); + it( 'should render the list of existing attributes', async () => { + act( () => { + render( + {} } + /> + ); + } ); - it( 'should render the first two terms of each attribute, and show "+ n more" for the rest', () => { - const { queryByText } = render( - {} } - /> - ); expect( - queryByText( attributeList[ 0 ].options[ 0 ] ) - ).toBeInTheDocument(); - expect( - queryByText( attributeList[ 1 ].options[ 0 ] ) - ).toBeInTheDocument(); - expect( - queryByText( attributeList[ 1 ].options[ 1 ] ) - ).toBeInTheDocument(); - expect( - queryByText( attributeList[ 1 ].options[ 2 ] ) + await screen.findByText( 'No attributes yet' ) ).not.toBeInTheDocument(); expect( - queryByText( + await screen.findByText( attributeList[ 0 ].name ) + ).toBeInTheDocument(); + expect( + await screen.findByText( attributeList[ 1 ].name ) + ).toBeInTheDocument(); + } ); + + it( 'should render the first two terms of each attribute, and show "+ n more" for the rest', async () => { + act( () => { + render( + {} } + /> + ); + } ); + + expect( + await screen.findByText( attributeList[ 0 ].options[ 0 ] ) + ).toBeInTheDocument(); + expect( + await screen.findByText( attributeList[ 1 ].options[ 0 ] ) + ).toBeInTheDocument(); + expect( + await screen.findByText( attributeList[ 1 ].options[ 1 ] ) + ).toBeInTheDocument(); + expect( + await screen.queryByText( attributeList[ 1 ].options[ 2 ] ) + ).not.toBeInTheDocument(); + expect( + await screen.queryByText( `+ ${ attributeList[ 1 ].options.length - 2 } more` ) ).not.toBeInTheDocument(); } ); describe( 'deleting', () => { - it( 'should show a window confirm when trash icon is clicked', () => { + it( 'should show a window confirm when trash icon is clicked', async () => { jest.spyOn( global, 'confirm' ).mockReturnValueOnce( false ); - const { queryAllByLabelText } = render( - {} } - /> - ); - queryAllByLabelText( 'Remove attribute' )[ 0 ].click(); + act( () => { + render( + {} } + /> + ); + } ); + ( + await screen.findAllByLabelText( 'Remove attribute' ) + )[ 0 ].click(); expect( global.confirm ).toHaveBeenCalled(); } ); - it( 'should trigger onChange with removed item when user clicks ok on alert', () => { + it( 'should trigger onChange with removed item when user clicks ok on alert', async () => { jest.spyOn( global, 'confirm' ).mockReturnValueOnce( true ); const onChange = jest.fn(); - const { queryAllByLabelText } = render( - - ); - queryAllByLabelText( 'Remove attribute' )[ 0 ].click(); + + act( () => { + render( + + ); + } ); + + ( + await screen.findAllByLabelText( 'Remove attribute' ) + )[ 0 ].click(); + expect( global.confirm ).toHaveBeenCalled(); expect( onChange ).toHaveBeenCalledWith( [ attributeList[ 1 ] ] ); } ); - it( 'should not trigger onChange with removed item when user cancel', () => { + it( 'should not trigger onChange with removed item when user cancel', async () => { jest.spyOn( global, 'confirm' ).mockReturnValueOnce( false ); const onChange = jest.fn(); - const { queryAllByLabelText } = render( - - ); - queryAllByLabelText( 'Remove attribute' )[ 0 ].click(); + act( () => { + render( + + ); + } ); + ( + await screen.findAllByLabelText( 'Remove attribute' ) + )[ 0 ].click(); expect( global.confirm ).toHaveBeenCalled(); expect( onChange ).not.toHaveBeenCalled(); } ); } ); describe( 'dragging', () => { - it( 'should trigger onChange with new order when onOrderChange triggered', () => { + it.skip( 'should trigger onChange with new order when onOrderChange triggered', async () => { + jest.spyOn( global, 'confirm' ).mockReturnValueOnce( true ); const onChange = jest.fn(); - const { queryAllByLabelText } = render( - - ); + + act( () => { + render( + + ); + } ); + if ( triggerDrag ) { triggerDrag( [ { key: attributeList[ 1 ].id.toString() }, { key: attributeList[ 0 ].id.toString() }, ] ); } - queryAllByLabelText( 'Remove attribute' )[ 0 ].click(); + + ( + await screen.findAllByLabelText( 'Remove attribute' ) + )[ 0 ].click(); + expect( onChange ).toHaveBeenCalledWith( [ { ...attributeList[ 1 ], position: 0 }, { ...attributeList[ 0 ], position: 1 }, diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/utils.ts b/plugins/woocommerce-admin/client/products/fields/attribute-field/utils.ts index 2fc1aa6dfb3..5ff34d939e7 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/utils.ts +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/utils.ts @@ -6,8 +6,8 @@ import { ProductAttribute } from '@woocommerce/data'; /** * Updates the position of a product attribute from the new items JSX.Element list. * - * @param { JSX.Element[] } items list of JSX elements coming back from sortable container. - * @param { Object } attributeKeyValues key value pair of product attributes. + * @param { JSX.Element[] } items list of JSX elements coming back from sortable container. + * @param { Object } attributeKeyValues key value pair of product attributes. */ export function reorderSortableProductAttributePositions( items: JSX.Element[], diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx index 3563992023b..68210642193 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx @@ -16,24 +16,26 @@ import { __experimentalSelectControlMenuItem as MenuItem, } from '@woocommerce/components'; +type NarrowedQueryAttribute = Pick< QueryProductAttribute, 'id' | 'name' >; + type AttributeInputFieldProps = { - value?: ProductAttribute; + value?: Pick< QueryProductAttribute, 'id' | 'name' > | null; onChange: ( value?: Omit< ProductAttribute, 'position' | 'visible' | 'variation' > ) => void; label?: string; placeholder?: string; disabled?: boolean; - filteredAttributeIds?: number[]; + ignoredAttributeIds?: number[]; }; export const AttributeInputField: React.FC< AttributeInputFieldProps > = ( { - value, + value = null, onChange, placeholder, label, disabled, - filteredAttributeIds = [], + ignoredAttributeIds = [], } ) => { const { attributes, isLoading } = useSelect( ( select: WCDataSelector ) => { const { getProductAttributes, hasFinishedResolution } = select( @@ -46,26 +48,25 @@ export const AttributeInputField: React.FC< AttributeInputFieldProps > = ( { } ); const getFilteredItems = ( - allItems: Pick< QueryProductAttribute, 'id' | 'name' >[], + allItems: NarrowedQueryAttribute[], inputValue: string ) => { + const ignoreIdsFilter = ( item: NarrowedQueryAttribute ) => + ignoredAttributeIds.length + ? ! ignoredAttributeIds.includes( item.id ) + : true; + return allItems.filter( ( item ) => - filteredAttributeIds.indexOf( item.id ) < 0 && + ignoreIdsFilter( item ) && ( item.name || '' ) .toLowerCase() .startsWith( inputValue.toLowerCase() ) ); }; - const selected: Pick< QueryProductAttribute, 'id' | 'name' > | null = value - ? { - id: value.id, - name: value.name, - } - : null; return ( - > + items={ attributes || [] } label={ label || '' } disabled={ disabled } @@ -73,14 +74,14 @@ export const AttributeInputField: React.FC< AttributeInputFieldProps > = ( { placeholder={ placeholder } getItemLabel={ ( item ) => item?.name || '' } getItemValue={ ( item ) => item?.id || '' } - selected={ selected } - onSelect={ ( attribute ) => + selected={ value } + onSelect={ ( attribute ) => { onChange( { id: attribute.id, name: attribute.name, options: [], - } ) - } + } ); + } } onRemove={ () => onChange() } > { ( { diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-input-field/test/attribute-input-field.spec.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-input-field/test/attribute-input-field.spec.tsx index 3b38ce81b45..0458350ae90 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-input-field/test/attribute-input-field.spec.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-input-field/test/attribute-input-field.spec.tsx @@ -144,7 +144,7 @@ describe( 'AttributeInputField', () => { expect( queryByText( attributeList[ 1 ].name ) ).toBeInTheDocument(); } ); - it( 'should filter out attribute ids passed into filteredAttributeIds', () => { + it( 'should filter out attribute ids passed into ignoredAttributeIds', () => { ( useSelect as jest.Mock ).mockReturnValue( { isLoading: false, attributes: attributeList, @@ -152,7 +152,7 @@ describe( 'AttributeInputField', () => { const { queryByText } = render( ); expect( queryByText( 'spinner' ) ).not.toBeInTheDocument(); @@ -177,7 +177,7 @@ describe( 'AttributeInputField', () => { expect( queryByText( attributeList[ 1 ].name ) ).toBeInTheDocument(); } ); - it( 'should filter out attributes ids from filteredAttributeIds', () => { + it( 'should filter out attributes ids from ignoredAttributeIds', () => { ( useSelect as jest.Mock ).mockReturnValue( { isLoading: false, attributes: attributeList, @@ -185,7 +185,7 @@ describe( 'AttributeInputField', () => { const { queryByText } = render( ); expect( queryByText( attributeList[ 0 ].name ) ).toBeInTheDocument(); diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss index a3509b2b7ef..1bc3b232ed4 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.scss @@ -11,3 +11,8 @@ margin-right: $gap-small; } } + +.woocommerce-attribute-term-field__add-new { + display: flex; + align-items: center; +} diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx index dfa6f30a6fc..32fdc11d0d0 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx @@ -30,13 +30,21 @@ type AttributeTermInputFieldProps = { attributeId?: number; placeholder?: string; disabled?: boolean; + label?: string; }; let uniqueId = 0; export const AttributeTermInputField: React.FC< AttributeTermInputFieldProps -> = ( { value = [], onChange, placeholder, disabled, attributeId } ) => { +> = ( { + value = [], + onChange, + placeholder, + disabled, + attributeId, + label = '', +} ) => { const attributeTermInputId = useRef( `woocommerce-attribute-term-field-${ ++uniqueId }` ); @@ -48,7 +56,7 @@ export const AttributeTermInputField: React.FC< useState< string >(); const fetchItems = useCallback( - ( searchString: string | undefined ) => { + ( searchString?: string | undefined ) => { setIsFetching( true ); return resolveSelect( EXPERIMENTAL_PRODUCT_ATTRIBUTE_TERMS_STORE_NAME @@ -80,7 +88,7 @@ export const AttributeTermInputField: React.FC< attributeId !== undefined && ! fetchedItems.length ) { - fetchItems( '' ); + fetchItems(); } }, [ disabled, attributeId ] ); @@ -124,7 +132,7 @@ export const AttributeTermInputField: React.FC< items={ fetchedItems } multiple disabled={ disabled || ! attributeId } - label="" + label={ label } getFilteredItems={ ( allItems, inputValue ) => { if ( inputValue.length > 0 && diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/custom-attribute-term-input-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/custom-attribute-term-input-field.tsx new file mode 100644 index 00000000000..8ca43d15916 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/custom-attribute-term-input-field.tsx @@ -0,0 +1,182 @@ +/** + * External dependencies + */ +import { sprintf, __ } from '@wordpress/i18n'; +import { CheckboxControl, Icon } from '@wordpress/components'; +import { useState } from '@wordpress/element'; +import { plus } from '@wordpress/icons'; +import { + __experimentalSelectControl as SelectControl, + __experimentalSelectControlMenu as Menu, + __experimentalSelectControlMenuItem as MenuItem, +} from '@woocommerce/components'; + +/** + * Internal dependencies + */ +import './attribute-term-input-field.scss'; + +type CustomAttributeTermInputFieldProps = { + value?: string[]; + onChange: ( value: string[] ) => void; + placeholder?: string; + label?: string; + disabled?: boolean; +}; + +type NewTermItem = { + id: string; + label: string; +}; + +function isNewTermItem( + item: NewTermItem | string | null +): item is NewTermItem { + return item !== null && typeof item === 'object' && !! item.label; +} + +export const CustomAttributeTermInputField: React.FC< + CustomAttributeTermInputFieldProps +> = ( { value = [], onChange, placeholder, disabled, label } ) => { + const [ listItems, setListItems ] = + useState< Array< string | NewTermItem > >( value ); + + const onRemove = ( item: string | NewTermItem ) => { + onChange( value.filter( ( opt ) => opt !== item ) ); + }; + + const onSelect = ( item: string | NewTermItem ) => { + // Add new item. + if ( isNewTermItem( item ) ) { + setListItems( [ ...listItems, item.label ] ); + onChange( [ ...value, item.label ] ); + return; + } + const isSelected = value.includes( item ); + if ( isSelected ) { + onRemove( item ); + return; + } + onChange( [ ...value, item ] ); + }; + + return ( + <> + + items={ listItems } + multiple + disabled={ disabled } + label={ label || '' } + placeholder={ placeholder || '' } + getItemLabel={ ( item ) => + isNewTermItem( item ) ? item.label : item || '' + } + getItemValue={ ( item ) => + isNewTermItem( item ) ? item.id : item || '' + } + getFilteredItems={ ( allItems, inputValue ) => { + const filteredItems = allItems.filter( + ( item ) => + ! inputValue.length || + ( ! isNewTermItem( item ) && + item + .toLowerCase() + .includes( inputValue.toLowerCase() ) ) + ); + if ( + inputValue.length > 0 && + ! filteredItems.find( + ( item ) => + ! isNewTermItem( item ) && + item.toLowerCase() === inputValue.toLowerCase() + ) + ) { + return [ + ...filteredItems, + { + id: 'is-new', + label: inputValue, + }, + ]; + } + return filteredItems; + } } + selected={ value } + onSelect={ onSelect } + onRemove={ onRemove } + className="woocommerce-attribute-term-field" + > + { ( { + items, + highlightedIndex, + getItemProps, + getMenuProps, + isOpen, + } ) => { + return ( + + { items.map( ( item, menuIndex ) => { + return ( + + { isNewTermItem( item ) ? ( +
+ + + { sprintf( + /* translators: The name of the new attribute term to be created */ + __( + 'Create "%s"', + 'woocommerce' + ), + item.label + ) } + +
+ ) : ( + null } + checked={ value.includes( + item + ) } + label={ + + { item } + + } + /> + ) } +
+ ); + } ) } +
+ ); + } } + + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/index.ts b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/index.ts index 562b73ccb93..f7a35f4a1e1 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/index.ts +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/index.ts @@ -1 +1,2 @@ export * from './attribute-term-input-field'; +export * from './custom-attribute-term-input-field'; diff --git a/plugins/woocommerce-admin/client/products/sections/attributes-section.tsx b/plugins/woocommerce-admin/client/products/sections/attributes-section.tsx index ecd11453fd1..e2141df7e9c 100644 --- a/plugins/woocommerce-admin/client/products/sections/attributes-section.tsx +++ b/plugins/woocommerce-admin/client/products/sections/attributes-section.tsx @@ -14,7 +14,10 @@ import { ProductSectionLayout } from '../layout/product-section-layout'; import { AttributeField } from '../fields/attribute-field'; export const AttributesSection: React.FC = () => { - const { getInputProps } = useFormContext< Product >(); + const { + getInputProps, + values: { id: productId }, + } = useFormContext< Product >(); return ( { } > - + ); }; diff --git a/plugins/woocommerce/changelog/add-34332-add-attribute-edit b/plugins/woocommerce/changelog/add-34332-add-attribute-edit new file mode 100644 index 00000000000..a2a242fb00e --- /dev/null +++ b/plugins/woocommerce/changelog/add-34332-add-attribute-edit @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Adding attribute edit modal for new product screen. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb65b4dd2c9..178406855ec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -257,7 +257,7 @@ importers: d3-shape: ^1.3.7 d3-time-format: ^2.3.0 dompurify: ^2.3.6 - downshift: ^6.1.9 + downshift: ^6.1.12 emoji-flags: ^1.3.0 eslint: ^8.12.0 gridicons: ^3.4.0 @@ -325,7 +325,7 @@ importers: d3-shape: 1.3.7 d3-time-format: 2.3.0 dompurify: 2.3.6 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 emoji-flags: 1.3.0 gridicons: 3.4.0_react@17.0.2 lodash: 4.17.21 @@ -2571,6 +2571,7 @@ packages: dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 '@babel/types': 7.19.3 + dev: true /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} @@ -2878,6 +2879,24 @@ packages: - supports-color dev: true + /@babel/helper-define-polyfill-provider/0.3.0_@babel+core@7.16.12: + resolution: {integrity: sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/traverse': 7.19.3 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-define-polyfill-provider/0.3.0_@babel+core@7.17.8: resolution: {integrity: sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==} peerDependencies: @@ -3142,7 +3161,6 @@ packages: /@babel/helper-plugin-utils/7.14.5: resolution: {integrity: sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-plugin-utils/7.18.9: resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==} @@ -3280,7 +3298,6 @@ packages: /@babel/helper-validator-identifier/7.15.7: resolution: {integrity: sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==} engines: {node: '>=6.9.0'} - dev: true /@babel/helper-validator-identifier/7.16.7: resolution: {integrity: sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==} @@ -3373,7 +3390,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.16.12: @@ -3383,7 +3400,7 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: @@ -3473,7 +3490,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-remap-async-to-generator': 7.16.8 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 transitivePeerDependencies: @@ -3487,7 +3504,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-remap-async-to-generator': 7.16.8 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 transitivePeerDependencies: @@ -3542,8 +3559,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: - supports-color dev: true @@ -3555,8 +3572,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: - supports-color dev: false @@ -3593,7 +3610,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 transitivePeerDependencies: - supports-color @@ -3607,7 +3624,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 transitivePeerDependencies: - supports-color @@ -3672,7 +3689,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 dev: true @@ -3683,7 +3700,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 dev: false @@ -3736,7 +3753,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 dev: true @@ -3747,7 +3764,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 dev: false @@ -3790,7 +3807,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 dev: true @@ -3801,7 +3818,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 dev: false @@ -3844,7 +3861,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 dev: true @@ -3855,7 +3872,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 dev: false @@ -3951,7 +3968,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 dev: true @@ -3962,7 +3979,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 dev: false @@ -4085,7 +4102,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 dev: true @@ -4096,7 +4113,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 dev: false @@ -4276,7 +4293,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 transitivePeerDependencies: - supports-color @@ -4291,7 +4308,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 transitivePeerDependencies: - supports-color @@ -4345,7 +4362,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: true /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: @@ -4356,7 +4373,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: false /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: @@ -4476,7 +4493,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.16.12: @@ -4486,7 +4503,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.17.8: @@ -4496,7 +4513,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-decorators/7.16.0_@babel+core@7.17.8: resolution: {integrity: sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==} @@ -4929,7 +4946,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.12: @@ -4939,7 +4956,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: @@ -5047,7 +5064,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.16.12: @@ -5057,7 +5074,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: @@ -5096,7 +5113,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.16.12: @@ -5106,7 +5123,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: @@ -5157,7 +5174,7 @@ packages: '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.16.7 '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 globals: 11.12.0 @@ -5176,7 +5193,7 @@ packages: '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.16.7 '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 globals: 11.12.0 @@ -5239,7 +5256,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.16.12: @@ -5249,7 +5266,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: @@ -5288,7 +5305,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.16.12: @@ -5298,7 +5315,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: @@ -5413,7 +5430,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.16.12: @@ -5423,7 +5440,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: @@ -5463,7 +5480,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5474,7 +5491,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 dev: false @@ -5526,7 +5543,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.16.12: @@ -5536,7 +5553,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: @@ -5578,7 +5595,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 '@babel/helper-function-name': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: true /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.16.12: @@ -5590,7 +5607,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 '@babel/helper-function-name': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: false /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: @@ -5633,7 +5650,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-literals/7.16.7_@babel+core@7.16.12: @@ -5643,7 +5660,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: @@ -5682,7 +5699,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.16.12: @@ -5692,7 +5709,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: @@ -5806,7 +5823,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-simple-access': 7.17.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5821,7 +5838,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-simple-access': 7.17.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5881,7 +5898,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-hoist-variables': 7.16.7 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-identifier': 7.16.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5897,7 +5914,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-hoist-variables': 7.16.7 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-identifier': 7.16.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -6066,7 +6083,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.16.12: @@ -6076,7 +6093,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: @@ -6118,7 +6135,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.16.7 transitivePeerDependencies: - supports-color @@ -6131,7 +6148,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.16.7 transitivePeerDependencies: - supports-color @@ -6179,7 +6196,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.16.12: @@ -6189,7 +6206,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: @@ -6199,7 +6216,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.12.9: @@ -6248,7 +6265,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.16.12: @@ -6258,7 +6275,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: @@ -6350,9 +6367,9 @@ packages: '@babel/core': 7.16.12 '@babel/helper-annotate-as-pure': 7.16.0 '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.14.5 '@babel/plugin-syntax-jsx': 7.16.0_@babel+core@7.16.12 - '@babel/types': 7.19.3 + '@babel/types': 7.16.0 dev: false /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.8: @@ -6460,7 +6477,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.16.12: @@ -6470,7 +6487,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: @@ -6537,7 +6554,10 @@ packages: '@babel/helper-plugin-utils': 7.19.0 babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 + babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 + transitivePeerDependencies: + - supports-color dev: true /@babel/plugin-transform-runtime/7.19.1_@babel+core@7.17.8: @@ -6573,7 +6593,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.16.12: @@ -6583,7 +6603,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: @@ -6624,7 +6644,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 dev: true /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: @@ -6635,7 +6655,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 dev: false /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: @@ -6676,7 +6696,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.16.12: @@ -6686,7 +6706,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: @@ -6725,7 +6745,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.16.12: @@ -6735,7 +6755,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: @@ -6774,7 +6794,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.16.12: @@ -6784,7 +6804,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: @@ -6828,7 +6848,7 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.17.8 transitivePeerDependencies: - supports-color @@ -6863,7 +6883,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.16.12: @@ -6873,7 +6893,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: @@ -7578,7 +7598,6 @@ packages: dependencies: '@babel/helper-validator-identifier': 7.15.7 to-fast-properties: 2.0.0 - dev: true /@babel/types/7.17.0: resolution: {integrity: sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==} @@ -10688,26 +10707,26 @@ packages: optional: true dependencies: '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.8 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 '@babel/preset-env': 7.19.3_@babel+core@7.17.8 '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 + '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.4.19 @@ -10731,7 +10750,7 @@ packages: babel-plugin-macros: 2.8.0 babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 case-sensitive-paths-webpack-plugin: 2.4.0 - core-js: 3.21.1 + core-js: 3.25.5 css-loader: 3.6.0_webpack@4.46.0 file-loader: 6.2.0_webpack@4.46.0 find-up: 5.0.0 @@ -12989,7 +13008,7 @@ packages: copy-to-clipboard: 3.3.1 core-js: 3.25.5 core-js-pure: 3.19.1 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m fuse.js: 3.6.1 global: 4.4.0 @@ -13029,7 +13048,7 @@ packages: copy-to-clipboard: 3.3.1 core-js: 3.25.5 core-js-pure: 3.19.1 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m fuse.js: 3.6.1 global: 4.4.0 @@ -13058,7 +13077,7 @@ packages: dependencies: '@babel/core': 7.17.8 postcss: 7.0.39 - postcss-syntax: 0.36.2_postcss@8.4.12 + postcss-syntax: 0.36.2_postcss@7.0.39 transitivePeerDependencies: - supports-color dev: true @@ -13071,7 +13090,7 @@ packages: postcss-syntax: '>=0.36.2' dependencies: postcss: 7.0.39 - postcss-syntax: 0.36.2_postcss@8.4.12 + postcss-syntax: 0.36.2_postcss@7.0.39 remark: 13.0.0 unist-util-find-all-after: 3.0.2 transitivePeerDependencies: @@ -13875,7 +13894,7 @@ packages: '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 '@wordpress/element': 4.8.0 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_prpqlkd37azqwypxturxi7uyci transitivePeerDependencies: - react @@ -13890,7 +13909,7 @@ packages: '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 '@wordpress/element': 4.8.0 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react @@ -15770,7 +15789,7 @@ packages: classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m gradient-parser: 0.1.5 highlight-words-core: 1.2.2 @@ -15823,7 +15842,7 @@ packages: classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 - downshift: 6.1.7_react@17.0.2 + downshift: 6.1.12_react@17.0.2 framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m gradient-parser: 0.1.5 highlight-words-core: 1.2.2 @@ -15877,7 +15896,7 @@ packages: classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 - downshift: 6.1.7_react@17.0.2 + downshift: 6.1.12_react@17.0.2 framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m gradient-parser: 0.1.5 highlight-words-core: 1.2.2 @@ -15988,7 +16007,7 @@ packages: colord: 2.9.2 date-fns: 2.29.3 dom-scroll-into-view: 1.2.1 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m gradient-parser: 0.1.5 highlight-words-core: 1.2.2 @@ -16042,7 +16061,7 @@ packages: colord: 2.9.2 date-fns: 2.28.0 dom-scroll-into-view: 1.2.1 - downshift: 6.1.9_react@17.0.2 + downshift: 6.1.12_react@17.0.2 framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m gradient-parser: 0.1.5 highlight-words-core: 1.2.2 @@ -17860,7 +17879,7 @@ packages: '@wp-g2/styles': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise csstype: 3.0.10 - downshift: 6.1.9_react@16.14.0 + downshift: 6.1.12_react@16.14.0 framer-motion: 2.9.5_wdcame2n4eqmtj7c7r7wzweise highlight-words-core: 1.2.2 history: 4.10.1 @@ -18789,7 +18808,7 @@ packages: /axios/0.24.0: resolution: {integrity: sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==} dependencies: - follow-redirects: 1.14.7 + follow-redirects: 1.14.5 transitivePeerDependencies: - debug @@ -19157,7 +19176,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.12.9 semver: 6.3.0 @@ -19170,7 +19189,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.16.12 semver: 6.3.0 @@ -19246,7 +19265,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.12 core-js-compat: 3.25.5 transitivePeerDependencies: - supports-color @@ -20115,7 +20134,7 @@ packages: minipass-pipeline: 1.2.4 mkdirp: 1.0.4 p-map: 4.0.0 - promise-inflight: 1.0.1_bluebird@3.7.2 + promise-inflight: 1.0.1 rimraf: 3.0.2 ssri: 8.0.1 tar: 6.1.11 @@ -21105,7 +21124,7 @@ packages: resolution: {integrity: sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w==} /concat-map/0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} /concat-stream/1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} @@ -21571,7 +21590,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.0 - webpack: 5.70.0 + webpack: 5.70.0_webpack-cli@3.3.12 /css-loader/5.2.7_webpack@5.70.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} @@ -22544,6 +22563,31 @@ packages: engines: {node: '>=10'} dev: true + /downshift/6.1.12_react@16.14.0: + resolution: {integrity: sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==} + peerDependencies: + react: '>=16.12.0' + dependencies: + '@babel/runtime': 7.19.0 + compute-scroll-into-view: 1.0.17 + prop-types: 15.8.1 + react: 16.14.0 + react-is: 17.0.2 + tslib: 2.3.1 + dev: false + + /downshift/6.1.12_react@17.0.2: + resolution: {integrity: sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==} + peerDependencies: + react: '>=16.12.0' + dependencies: + '@babel/runtime': 7.19.0 + compute-scroll-into-view: 1.0.17 + prop-types: 15.8.1 + react: 17.0.2 + react-is: 17.0.2 + tslib: 2.3.1 + /downshift/6.1.7_react@17.0.2: resolution: {integrity: sha512-cVprZg/9Lvj/uhYRxELzlu1aezRcgPWBjTvspiGTVEU64gF5pRdSRKFVLcxqsZC637cLAGMbL40JavEfWnqgNg==} peerDependencies: @@ -22570,18 +22614,6 @@ packages: tslib: 2.3.1 dev: false - /downshift/6.1.9_react@17.0.2: - resolution: {integrity: sha512-mzvk61WOX4MEsYHMKCXEVwuz/zM84x/WrCbaCQw71hyNN0fmWXvV673uOQy2idgIA+yqDsjtkV5KPfAFWuQylg==} - peerDependencies: - react: '>=16.12.0' - dependencies: - '@babel/runtime': 7.19.0 - compute-scroll-into-view: 1.0.17 - prop-types: 15.8.1 - react: 17.0.2 - react-is: 17.0.2 - tslib: 2.3.1 - /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -25111,6 +25143,15 @@ packages: readable-stream: 2.3.7 dev: true + /follow-redirects/1.14.5: + resolution: {integrity: sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + /follow-redirects/1.14.7: resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==} engines: {node: '>=4.0'} @@ -25235,7 +25276,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 @@ -25246,7 +25287,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.5 + semver: 7.3.7 tapable: 1.1.3 typescript: 4.8.4 webpack: 5.70.0 @@ -25266,7 +25307,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 @@ -25278,7 +25319,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.5 + semver: 7.3.7 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0_webpack-cli@3.3.12 @@ -25330,7 +25371,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.16.7 + '@babel/code-frame': 7.18.6 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 @@ -25341,7 +25382,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.5 + semver: 7.3.7 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0 @@ -34048,7 +34089,7 @@ packages: dependencies: htmlparser2: 3.10.1 postcss: 7.0.39 - postcss-syntax: 0.36.2_postcss@8.4.12 + postcss-syntax: 0.36.2_postcss@7.0.39 dev: true /postcss-less/3.1.4: @@ -34635,30 +34676,6 @@ packages: postcss: 7.0.39 dev: true - /postcss-syntax/0.36.2_postcss@8.4.12: - resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==} - peerDependencies: - postcss: '>=5.0.0' - postcss-html: '*' - postcss-jsx: '*' - postcss-less: '*' - postcss-markdown: '*' - postcss-scss: '*' - peerDependenciesMeta: - postcss-html: - optional: true - postcss-jsx: - optional: true - postcss-less: - optional: true - postcss-markdown: - optional: true - postcss-scss: - optional: true - dependencies: - postcss: 8.4.12 - dev: true - /postcss-unique-selectors/4.0.1: resolution: {integrity: sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==} engines: {node: '>=6.9.0'} @@ -36204,6 +36221,24 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false + /react-with-direction/1.4.0_prpqlkd37azqwypxturxi7uyci: + resolution: {integrity: sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==} + peerDependencies: + react: ^0.14 || ^15 || ^16 + react-dom: ^0.14 || ^15 || ^16 + dependencies: + airbnb-prop-types: 2.16.0_react@17.0.2 + brcast: 2.0.2 + deepmerge: 1.5.2 + direction: 1.0.4 + hoist-non-react-statics: 3.3.2 + object.assign: 4.1.4 + object.values: 1.1.5 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 16.14.0_react@17.0.2 + dev: false + /react-with-direction/1.4.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==} peerDependencies: @@ -36247,7 +36282,7 @@ packages: dependencies: array.prototype.flat: 1.2.5 global-cache: 1.2.1 - react-with-styles: 3.2.3_f6ta4w4ch5ogxra4gx65xzrqki + react-with-styles: 3.2.3_wunono5fri6mu4ojuug6cyhj7m dev: false /react-with-styles-interface-css/6.0.0_sjrqpgd5uboanyy2xkv2xcu6vm: @@ -36284,7 +36319,7 @@ packages: object.assign: 4.1.4 prop-types: 15.8.1 react: 17.0.2 - react-with-direction: 1.4.0_sfoxds7t5ydpegc3knd667wn6m + react-with-direction: 1.4.0_prpqlkd37azqwypxturxi7uyci dev: false /react-with-styles/3.2.3_wunono5fri6mu4ojuug6cyhj7m: @@ -37444,7 +37479,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 semver: 7.3.5 - webpack: 5.70.0 + webpack: 5.70.0_webpack-cli@3.3.12 /sass-loader/12.6.0_sass@1.49.9+webpack@5.70.0: resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} @@ -38614,7 +38649,7 @@ packages: dependencies: stylelint: 13.13.1 stylelint-config-recommended: 5.0.0_stylelint@13.13.1 - stylelint-scss: 3.21.0_stylelint@14.6.0 + stylelint-scss: 3.21.0_stylelint@13.13.1 dev: true /stylelint-config-recommended-scss/4.3.0_osgfwlh245rsrcikctalltinom: @@ -38691,7 +38726,7 @@ packages: stylelint: 13.13.1 stylelint-config-recommended: 3.0.0_stylelint@13.13.1 stylelint-config-recommended-scss: 4.3.0_2vkgt733dnumio3be4grtjqkwy - stylelint-scss: 3.21.0_stylelint@14.6.0 + stylelint-scss: 3.21.0_stylelint@13.13.1 dev: true /stylelint-scss/3.21.0_stylelint@13.13.1: @@ -38722,20 +38757,6 @@ packages: stylelint: 13.8.0 dev: true - /stylelint-scss/3.21.0_stylelint@14.6.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.9 - postcss-value-parser: 4.2.0 - stylelint: 14.6.0 - dev: true - /stylelint-scss/4.2.0_stylelint@14.6.0: resolution: {integrity: sha512-HHHMVKJJ5RM9pPIbgJ/XA67h9H0407G68Rm69H4fzFbFkyDMcTV1Byep3qdze5+fJ3c0U7mJrbj6S0Fg072uZA==} peerDependencies: @@ -38789,7 +38810,7 @@ packages: postcss-sass: 0.4.4 postcss-scss: 2.1.1 postcss-selector-parser: 6.0.6 - postcss-syntax: 0.36.2_postcss@8.4.12 + postcss-syntax: 0.36.2_postcss@7.0.39 postcss-value-parser: 4.1.0 resolve-from: 5.0.0 slash: 3.0.0 @@ -41540,7 +41561,7 @@ packages: tapable: 1.1.3 terser-webpack-plugin: 1.4.5_webpack@4.46.0 watchpack: 1.7.5 - webpack-cli: 3.3.12_webpack@4.46.0 + webpack-cli: 3.3.12_webpack@5.70.0 webpack-sources: 1.4.3 transitivePeerDependencies: - supports-color @@ -41563,7 +41584,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.0 acorn-import-assertions: 1.8.0_acorn@8.8.0 - browserslist: 4.20.4 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41602,7 +41623,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.0 acorn-import-assertions: 1.8.0_acorn@8.8.0 - browserslist: 4.20.4 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41643,7 +41664,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.0 acorn-import-assertions: 1.8.0_acorn@8.8.0 - browserslist: 4.20.4 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41683,7 +41704,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.0 acorn-import-assertions: 1.8.0_acorn@8.8.0 - browserslist: 4.20.4 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 From a6ed0a0e366603c235616656b3ff8e3304cfe9c9 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 3 Nov 2022 09:47:50 -0700 Subject: [PATCH 0043/1680] Remove update store details note (#35322) * Remove update store details note * Remove deprecated tests * Remove changelog entry * Remove obsolete note --- .../remove-update-store-details-note | 4 + .../woocommerce/includes/class-wc-install.php | 1 + .../woocommerce/src/Internal/Admin/Events.php | 2 - .../Admin/Notes/UpdateStoreDetails.php | 60 ----------- .../woocommerce-admin/api/admin-notes.php | 99 ------------------- 5 files changed, 5 insertions(+), 161 deletions(-) create mode 100644 plugins/woocommerce/changelog/remove-update-store-details-note delete mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/UpdateStoreDetails.php diff --git a/plugins/woocommerce/changelog/remove-update-store-details-note b/plugins/woocommerce/changelog/remove-update-store-details-note new file mode 100644 index 00000000000..45edb557672 --- /dev/null +++ b/plugins/woocommerce/changelog/remove-update-store-details-note @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove update store details note diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index e9b8f015ed3..54da7d2fd0e 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -830,6 +830,7 @@ class WC_Install { 'wc-admin-historical-data', 'wc-admin-review-shipping-settings', 'wc-admin-home-screen-feedback', + 'wc-admin-update-store-details', 'wc-admin-effortless-payments-by-mollie', 'wc-admin-google-ads-and-marketing', 'wc-admin-marketing-intro', diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index 1ede546c1e7..f4815f4b4f9 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -42,7 +42,6 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\SellingOnlineCourses; use \Automattic\WooCommerce\Internal\Admin\Notes\TestCheckout; use \Automattic\WooCommerce\Internal\Admin\Notes\TrackingOptIn; use \Automattic\WooCommerce\Internal\Admin\Notes\UnsecuredReportFiles; -use \Automattic\WooCommerce\Internal\Admin\Notes\UpdateStoreDetails; use \Automattic\WooCommerce\Internal\Admin\Notes\WelcomeToWooCommerceForStoreUsers; use \Automattic\WooCommerce\Internal\Admin\Notes\WooCommercePayments; use \Automattic\WooCommerce\Internal\Admin\Notes\WooCommerceSubscriptions; @@ -99,7 +98,6 @@ class Events { RealTimeOrderAlerts::class, TestCheckout::class, TrackingOptIn::class, - UpdateStoreDetails::class, WooCommercePayments::class, WooCommerceSubscriptions::class, ); diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/UpdateStoreDetails.php b/plugins/woocommerce/src/Internal/Admin/Notes/UpdateStoreDetails.php deleted file mode 100644 index f200333753b..00000000000 --- a/plugins/woocommerce/src/Internal/Admin/Notes/UpdateStoreDetails.php +++ /dev/null @@ -1,60 +0,0 @@ -set_title( __( 'Edit your store details if you need to', 'woocommerce' ) ); - $note->set_content( __( 'Nice work completing your store profile! You can always go back and edit the details you just shared, as needed.', 'woocommerce' ) ); - $note->set_type( Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); - $note->set_name( self::NOTE_NAME ); - $note->set_content_data( (object) array() ); - $note->set_source( 'woocommerce-admin' ); - $note->add_action( - 'update-store-details', - __( 'Update store details', 'woocommerce' ), - wc_admin_url( '&path=/setup-wizard' ) - ); - - return $note; - } -} diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/admin-notes.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/admin-notes.php index d53cc86b611..d582747369f 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/admin-notes.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/admin-notes.php @@ -218,79 +218,6 @@ class WC_Admin_Tests_API_Admin_Notes extends WC_REST_Unit_Test_Case { $this->assertEquals( 4, count( $notes ) ); } - /** - * Test getting notes when the user is in tasklist experiment returns notes of size `per_page` without any filters. - * - * @since 3.5.0 - */ - public function test_getting_notes_when_user_is_in_tasklist_experiment_returns_unfiltered_notes() { - // Given. - wp_set_current_user( $this->user ); - WC_Helper_Admin_Notes::reset_notes_dbs(); - // Notes of the following two names are hidden when the user is not in the task list experiment. - WC_Helper_Admin_Notes::add_note_for_test( 'wc-admin-complete-store-details' ); - WC_Helper_Admin_Notes::add_note_for_test( 'wc-admin-update-store-details' ); - // Other notes. - WC_Helper_Admin_Notes::add_note_for_test( 'winter-sales' ); - WC_Helper_Admin_Notes::add_note_for_test( '2022-promo' ); - - $this->set_user_in_tasklist_experiment(); - - // When. - $request = new WP_REST_Request( 'GET', $this->endpoint ); - $request->set_query_params( - array( - 'page' => '1', - 'per_page' => '3', - ) - ); - $response = $this->server->dispatch( $request ); - $notes = $response->get_data(); - - // Then. - $this->assertEquals( 200, $response->get_status() ); - $this->assertEquals( 3, count( $notes ) ); - $this->assertEquals( $notes[0]['name'], 'wc-admin-complete-store-details' ); - $this->assertEquals( $notes[1]['name'], 'wc-admin-update-store-details' ); - $this->assertEquals( $notes[2]['name'], 'winter-sales' ); - } - - /** - * Test getting notes when the user is not in tasklist experiment excludes two notes. - * @since 3.5.0 - */ - public function test_getting_notes_when_user_is_not_in_tasklist_experiment_excludes_two_notes() { - $this->markTestSkipped( 'We are disabling the experiments for now.' ); - // Given. - wp_set_current_user( $this->user ); - WC_Helper_Admin_Notes::reset_notes_dbs(); - // Notes of the following two names are hidden when the user is not in the task list experiment. - WC_Helper_Admin_Notes::add_note_for_test( 'wc-admin-complete-store-details' ); - WC_Helper_Admin_Notes::add_note_for_test( 'wc-admin-update-store-details' ); - // Other notes. - WC_Helper_Admin_Notes::add_note_for_test( 'summer-sales' ); - WC_Helper_Admin_Notes::add_note_for_test( '2022-promo' ); - - $this->set_user_out_of_tasklist_experiment(); - - // When. - $request = new WP_REST_Request( 'GET', $this->endpoint ); - $request->set_query_params( - array( - 'page' => '1', - 'per_page' => '3', - ) - ); - $response = $this->server->dispatch( $request ); - $notes = $response->get_data(); - - // Then. - $this->assertEquals( 200, $response->get_status() ); - $this->assertEquals( 2, count( $notes ) ); - $this->assertEquals( $notes[0]['name'], 'summer-sales' ); - $this->assertEquals( $notes[1]['name'], '2022-promo' ); - } - /** * Test getting notes of a certain type. * @@ -621,30 +548,4 @@ class WC_Admin_Tests_API_Admin_Notes extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( 2, count( $notes ) ); } - - /** - * Simulates when the user is in tasklist experiment similar to `API/Notes` `is_tasklist_experiment_assigned_treatment` function. - */ - private function set_user_in_tasklist_experiment() { - // When the user is participating in either `wc-admin-complete-store-details` or `wc-admin-update-store-details` AB tests, - // the user is in tasklist experiment. - update_option( 'woocommerce_allow_tracking', 'yes' ); - $date = new \DateTime(); - $date->setTimeZone( new \DateTimeZone( 'UTC' ) ); - - $experiment_name = sprintf( - 'woocommerce_tasklist_progression_headercard_%s_%s', - $date->format( 'Y' ), - $date->format( 'm' ) - ); - set_transient( 'abtest_variation_' . $experiment_name, 'treatment' ); - } - - /** - * Simulates when the user is not in tasklist experiment similar to `API/Notes` `is_tasklist_experiment_assigned_treatment` function. - */ - private function set_user_out_of_tasklist_experiment() { - // Any experiment is off when `woocommerce_allow_tracking` option is false. - update_option( 'woocommerce_allow_tracking', false ); - } } From e8db853ceb10e1a21787a5f4171055ee214c6b47 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 3 Nov 2022 09:48:20 -0700 Subject: [PATCH 0044/1680] Remove insight on first sale note (#35341) * Remove insight on first sale note * Add changelog entry --- .../changelog/remove-insight-first-sale-note | 4 ++ .../woocommerce/includes/class-wc-install.php | 1 + .../src/Admin/Notes/DeprecatedNotes.php | 21 ------ .../woocommerce/src/Internal/Admin/Events.php | 2 - .../Internal/Admin/Notes/InsightFirstSale.php | 71 ------------------- 5 files changed, 5 insertions(+), 94 deletions(-) create mode 100644 plugins/woocommerce/changelog/remove-insight-first-sale-note delete mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstSale.php diff --git a/plugins/woocommerce/changelog/remove-insight-first-sale-note b/plugins/woocommerce/changelog/remove-insight-first-sale-note new file mode 100644 index 00000000000..91145d27806 --- /dev/null +++ b/plugins/woocommerce/changelog/remove-insight-first-sale-note @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove insight on first sale note diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index 54da7d2fd0e..8fe7066711f 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -833,6 +833,7 @@ class WC_Install { 'wc-admin-update-store-details', 'wc-admin-effortless-payments-by-mollie', 'wc-admin-google-ads-and-marketing', + 'wc-admin-insight-first-sale', 'wc-admin-marketing-intro', 'wc-admin-draw-attention', 'wc-admin-need-some-inspiration', diff --git a/plugins/woocommerce/src/Admin/Notes/DeprecatedNotes.php b/plugins/woocommerce/src/Admin/Notes/DeprecatedNotes.php index 2920f0880b0..baf2645ada9 100644 --- a/plugins/woocommerce/src/Admin/Notes/DeprecatedNotes.php +++ b/plugins/woocommerce/src/Admin/Notes/DeprecatedNotes.php @@ -223,27 +223,6 @@ class WC_Admin_Notes_Giving_Feedback_Notes extends DeprecatedClassFacade { protected static $deprecated_in_version = '4.8.0'; } -/** - * WC_Admin_Notes_Insight_First_Sale. - * - * @deprecated since 4.8.0, use InsightFirstSale - */ -class WC_Admin_Notes_Insight_First_Sale extends DeprecatedClassFacade { - /** - * The name of the non-deprecated class that this facade covers. - * - * @var string - */ - protected static $facade_over_classname = 'Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstSale'; - - /** - * The version that this class was deprecated in. - * - * @var string - */ - protected static $deprecated_in_version = '4.8.0'; -} - /** * WC_Admin_Notes_Install_JP_And_WCS_Plugins. * diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index f4815f4b4f9..1a1e57231ab 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -20,7 +20,6 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\EditProductsOnTheMove; use \Automattic\WooCommerce\Internal\Admin\Notes\EUVATNumber; use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownloadableProduct; use \Automattic\WooCommerce\Internal\Admin\Notes\FirstProduct; -use \Automattic\WooCommerce\Internal\Admin\Notes\InsightFirstSale; use \Automattic\WooCommerce\Internal\Admin\Notes\InstallJPAndWCSPlugins; use \Automattic\WooCommerce\Internal\Admin\Notes\LaunchChecklist; use \Automattic\WooCommerce\Internal\Admin\Notes\MagentoMigration; @@ -82,7 +81,6 @@ class Events { EUVATNumber::class, FirstDownloadableProduct::class, FirstProduct::class, - InsightFirstSale::class, LaunchChecklist::class, MagentoMigration::class, ManageOrdersOnTheGo::class, diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstSale.php b/plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstSale.php deleted file mode 100644 index 1cc28010536..00000000000 --- a/plugins/woocommerce/src/Internal/Admin/Notes/InsightFirstSale.php +++ /dev/null @@ -1,71 +0,0 @@ -set_title( __( 'Did you know?', 'woocommerce' ) ); - $note->set_content( __( 'A WooCommerce powered store needs on average 31 days to get the first sale. You\'re on the right track! Do you find this type of insight useful?', 'woocommerce' ) ); - $note->set_type( Note::E_WC_ADMIN_NOTE_SURVEY ); - $note->set_name( self::NOTE_NAME ); - $note->set_content_data( (object) array() ); - $note->set_source( 'woocommerce-admin' ); - - // Note that there is no corresponding function called in response to - // this. Apart from setting the note to actioned a tracks event is - // sent in NoteActions. - $note->add_action( - 'affirm-insight-first-sale', - __( 'Yes', 'woocommerce' ), - false, - Note::E_WC_ADMIN_NOTE_ACTIONED, - false, - __( 'Thanks for your feedback', 'woocommerce' ) - ); - $note->add_action( - 'deny-insight-first-sale', - __( 'No', 'woocommerce' ), - false, - Note::E_WC_ADMIN_NOTE_ACTIONED, - false, - __( 'Thanks for your feedback', 'woocommerce' ) - ); - - return $note; - } -} From f0ee7a48822ceba77a599cae8a2f251c2f7f1651 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Thu, 3 Nov 2022 12:54:17 -0400 Subject: [PATCH 0045/1680] DateTimePickerControl: Only call onChange when the date actually changes (#35397) * Additional onChange tests * Update handling when currentDate or dateTimeFormat changes to avoid errant onChange calls * Remove unused changeImmediate function * Refactor input change handling * Refactoring of updateState* functions to reduce duplication and increase readability * Refactor to remove a few unnecessary wrapper functions * Rename setInputStringWithMoment to formatDateTimeForDisplay * Refactor ISO formatting * Rename parse functions * Update controlled stories to properly use state * Refactored to get rid of useEffect handling of currentDate and inputString changes --- .../fix-date-time-picker-control-onchange | 4 + .../date-time-picker-control.tsx | 271 ++++++++---------- .../stories/index.tsx | 79 +++-- .../date-time-picker-control/test/index.tsx | 108 +++++++ 4 files changed, 287 insertions(+), 175 deletions(-) create mode 100644 packages/js/components/changelog/fix-date-time-picker-control-onchange diff --git a/packages/js/components/changelog/fix-date-time-picker-control-onchange b/packages/js/components/changelog/fix-date-time-picker-control-onchange new file mode 100644 index 00000000000..f7074ae252b --- /dev/null +++ b/packages/js/components/changelog/fix-date-time-picker-control-onchange @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +DateTimePickerControl's onChange now only fires when there is an actual change to the datetime. diff --git a/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx b/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx index b53a34d9ed7..b133d453ade 100644 --- a/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx +++ b/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx @@ -4,9 +4,10 @@ import { format as formatDate } from '@wordpress/date'; import { createElement, + useCallback, useState, useEffect, - useLayoutEffect, + useMemo, useRef, } from '@wordpress/element'; import { Icon, calendar } from '@wordpress/icons'; @@ -30,7 +31,7 @@ export const default12HourDateTimeFormat = 'm/d/Y h:i a'; export const default24HourDateTimeFormat = 'm/d/Y H:i'; export type DateTimePickerControlOnChangeHandler = ( - date: string, + dateTimeIsoString: string, isValid: boolean ) => void; @@ -68,20 +69,9 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { const id = `inspector-date-time-picker-control-${ instanceId }`; const inputControl = useRef< InputControl >(); - const isMounted = useRef( false ); - useEffect( () => { - isMounted.current = true; - return () => { - isMounted.current = false; - }; - } ); - const [ inputString, setInputString ] = useState( '' ); - const [ lastValidDate, setLastValidDate ] = useState< Moment | null >( - null - ); - const displayFormat = ( () => { + const displayFormat = useMemo( () => { if ( dateTimeFormat ) { return dateTimeFormat; } @@ -95,46 +85,42 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { } return default24HourDateTimeFormat; - } )(); + }, [ dateTimeFormat, isDateOnlyPicker, is12HourPicker ] ); - function parseMomentIso( + function parseAsISODateTime( dateString?: string | null, assumeLocalTime = false ): Moment { - if ( assumeLocalTime ) { - return moment( dateString, moment.ISO_8601, true ).utc(); - } - - return moment.utc( dateString, moment.ISO_8601, true ); + return assumeLocalTime + ? moment( dateString, moment.ISO_8601, true ).utc() + : moment.utc( dateString, moment.ISO_8601, true ); } - function parseMoment( dateString: string | null ): Moment { + function parseAsLocalDateTime( dateString: string | null ): Moment { // parse input date string as local time; // be lenient of user input and try to match any format Moment can return moment( dateString ); } - function formatMomentIso( momentDate: Moment ): string { - return momentDate.utc().toISOString(); - } + const maybeForceTime = useCallback( + ( momentDate: Moment ) => { + if ( ! isDateOnlyPicker || ! momentDate.isValid() ) + return momentDate; - function formatMoment( momentDate: Moment ): string { - return formatDate( displayFormat, momentDate.local() ); - } + // We want to set to the start/end of the local time, so + // we need to put our Moment instance into "local" mode + const updatedMomentDate = momentDate.clone().local(); - function maybeForceTime( momentDate: Moment ): Moment { - if ( ! isDateOnlyPicker ) return momentDate; + if ( timeForDateOnly === 'start-of-day' ) { + updatedMomentDate.startOf( 'day' ); + } else if ( timeForDateOnly === 'end-of-day' ) { + updatedMomentDate.endOf( 'day' ); + } - const updatedMomentDate = momentDate.clone(); - - if ( timeForDateOnly === 'start-of-day' ) { - updatedMomentDate.startOf( 'day' ); - } else if ( timeForDateOnly === 'end-of-day' ) { - updatedMomentDate.endOf( 'day' ); - } - - return updatedMomentDate; - } + return updatedMomentDate; + }, + [ isDateOnlyPicker, timeForDateOnly ] + ); function hasFocusLeftInputAndDropdownContent( event: React.FocusEvent< HTMLInputElement > @@ -144,101 +130,67 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { ); } - // We setup the debounced handling of the input string changes using - // useRef because useCallback does *not* guarantee that the resulting - // callback function will not be recreated, even if the dependencies - // haven't changed (this is because of it's use of useMemo under the - // hood, which also makes not guarantee). And, even if it did, the - // equality check for useCallback dependencies is by reference. So, if - // the "same" function is passed in, but it is a different instance, it - // will trigger the recreation of the callback. - // - // With useDebounce, if the callback function changes, the current - // debounce is canceled. This results in the callback function never being - // called. - // - // We *need* to ensure that our handler is called at least once, - // and also that we call the passed in onChange callback. - // - // We guarantee this by keeping references to both our handler and the - // passed in prop. - // - // The consumer of DateTimePickerControl should ensure that the - // function passed into onChange does not change (using references or - // useCallbackOne). But, even if they do not, and the function changes, - // things will likely function as expected unless the consumer is doing - // something really convoluted. - // - // See also: - // - [note regarding useMemo not being a semantic guarantee](https://reactjs.org/docs/hooks-reference.html#usememo) - // - [useDebounce hook loses function calls if the dependency changes](https://github.com/WordPress/gutenberg/issues/35505) - // - [useMemoOne and useCallbackOne](https://github.com/alexreardon/use-memo-one) - - const onChangePropFunctionRef = useRef< - DateTimePickerControlOnChangeHandler | undefined - >(); - useLayoutEffect( () => { - onChangePropFunctionRef.current = onChange; - }, [ onChange ] ); - - function inputStringChangeHandlerFunction( - newInputString: string, - fireOnChange: boolean - ) { - if ( ! isMounted.current ) return; - - let newDateTime = parseMoment( newInputString ); - const isValid = newDateTime.isValid(); - - if ( isValid ) { - newDateTime = maybeForceTime( newDateTime ); - setLastValidDate( newDateTime ); - } - - if ( - fireOnChange && - typeof onChangePropFunctionRef.current === 'function' - ) { - onChangePropFunctionRef.current( - isValid ? formatMomentIso( newDateTime ) : newInputString, - isValid - ); - } - } - - const inputStringChangeHandlerFunctionRef = useRef< - ( newInputString: string, fireOnChange: boolean ) => void - >( inputStringChangeHandlerFunction ); - // whenever forceTimeTo changes, we need to reset the ref to inputStringChangeHandlerFunction - // so that we are using the most current forceTimeTo value inside of it - useEffect( () => { - inputStringChangeHandlerFunctionRef.current = - inputStringChangeHandlerFunction; - }, [ timeForDateOnly ] ); - - const debouncedInputStringChangeHandler = useDebounce( - inputStringChangeHandlerFunctionRef.current, - onChangeDebounceWait + const formatDateTimeForDisplay = useCallback( + ( dateTime: Moment ) => { + return dateTime.isValid() + ? formatDate( displayFormat, dateTime.local() ) + : dateTime.creationData().input?.toString() || ''; + }, + [ displayFormat ] ); - function change( newInputString: string ) { - setInputString( newInputString ); - debouncedInputStringChangeHandler( newInputString, true ); + function formatDateTimeAsISO( dateTime: Moment ): string { + return dateTime.isValid() + ? dateTime.utc().toISOString() + : dateTime.creationData().input?.toString() || ''; } - function changeImmediate( newInputString: string, fireOnChange: boolean ) { - setInputString( newInputString ); - inputStringChangeHandlerFunctionRef.current( - newInputString, - fireOnChange - ); - } + const inputStringDateTime = useMemo( () => { + return maybeForceTime( parseAsLocalDateTime( inputString ) ); + }, [ inputString, maybeForceTime ] ); - function blur() { - if ( onBlur ) { - onBlur(); - } - } + // We keep a ref to the onChange prop so that we can be sure we are + // always using the more up-to-date value, even if it changes + // it while a debounced onChange handler is in progress + const onChangeRef = useRef< + DateTimePickerControlOnChangeHandler | undefined + >(); + useEffect( () => { + onChangeRef.current = onChange; + }, [ onChange ] ); + + const setInputStringAndMaybeCallOnChange = useCallback( + ( newInputString: string, isUserTypedInput: boolean ) => { + const newDateTime = maybeForceTime( + isUserTypedInput + ? parseAsLocalDateTime( newInputString ) + : parseAsISODateTime( newInputString, true ) + ); + const isDateTimeSame = newDateTime.isSame( inputStringDateTime ); + + if ( isUserTypedInput ) { + setInputString( newInputString ); + } else if ( ! isDateTimeSame ) { + setInputString( formatDateTimeForDisplay( newDateTime ) ); + } + + if ( + typeof onChangeRef.current === 'function' && + ! isDateTimeSame + ) { + onChangeRef.current( + formatDateTimeAsISO( newDateTime ), + newDateTime.isValid() + ); + } + }, + [ formatDateTimeForDisplay, inputStringDateTime, maybeForceTime ] + ); + + const debouncedSetInputStringAndMaybeCallOnChange = useDebounce( + setInputStringAndMaybeCallOnChange, + onChangeDebounceWait + ); function focusInputControl() { if ( inputControl.current ) { @@ -246,21 +198,23 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { } } - const isInitialUpdate = useRef( true ); - useEffect( () => { - const fireOnChange = ! isInitialUpdate.current; - if ( isInitialUpdate.current ) { - isInitialUpdate.current = false; + function getUserInputOrUpdatedCurrentDate() { + const newDateTime = maybeForceTime( + parseAsISODateTime( currentDate, false ) + ); + + if ( + ! newDateTime.isValid() || + newDateTime.isSame( + maybeForceTime( parseAsLocalDateTime( inputString ) ) + ) + ) { + // keep the input string as the user entered it + return inputString; } - const newDate = parseMomentIso( currentDate ); - - if ( newDate.isValid() ) { - changeImmediate( formatMoment( newDate ), fireOnChange ); - } else { - changeImmediate( currentDate || '', fireOnChange ); - } - }, [ currentDate, displayFormat, timeForDateOnly ] ); + return formatDateTimeForDisplay( newDateTime ); + } return ( = ( { focusOnMount={ false } // @ts-expect-error `onToggle` does exist. onToggle={ ( willOpen ) => { - if ( ! willOpen ) { - blur(); + if ( ! willOpen && typeof onBlur === 'function' ) { + onBlur(); } } } renderToggle={ ( { isOpen, onToggle } ) => ( @@ -282,8 +236,13 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { id={ id } ref={ inputControl } disabled={ disabled } - value={ inputString } - onChange={ change } + value={ getUserInputOrUpdatedCurrentDate() } + onChange={ ( newValue: string ) => + debouncedSetInputStringAndMaybeCallOnChange( + newValue, + true + ) + } onBlur={ ( event: React.FocusEvent< HTMLInputElement > ) => { @@ -323,21 +282,21 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { ) } renderContent={ () => { const Picker = isDateOnlyPicker ? DatePicker : WpDateTimePicker; + const inputDateTime = parseAsLocalDateTime( inputString ); return ( { - // the picker returns the date in local time - const formattedDate = formatMoment( - parseMomentIso( date, true ) - ); - changeImmediate( formattedDate, true ); - } } + onChange={ ( newDateTimeISOString: string ) => + setInputStringAndMaybeCallOnChange( + newDateTimeISOString, + false + ) + } is12Hour={ is12HourPicker } /> ); diff --git a/packages/js/components/src/date-time-picker-control/stories/index.tsx b/packages/js/components/src/date-time-picker-control/stories/index.tsx index 937f8e4dadd..adcf77f1336 100644 --- a/packages/js/components/src/date-time-picker-control/stories/index.tsx +++ b/packages/js/components/src/date-time-picker-control/stories/index.tsx @@ -38,8 +38,15 @@ CustomDateTimeFormat.args = { }; function ControlledContainer( { children, ...props } ) { + function nowWithZeroedSeconds() { + const now = new Date(); + now.setSeconds( 0 ); + now.setMilliseconds( 0 ); + return now; + } + const [ controlledDate, setControlledDate ] = useState( - new Date().toISOString() + nowWithZeroedSeconds().toISOString() ); return ( @@ -48,11 +55,19 @@ function ControlledContainer( { children, ...props } ) {
+
+
+ Controlled date: +
{ controlledDate } +
+
); @@ -70,28 +85,54 @@ CustomClassName.args = { className: 'custom-class-name', }; +function ControlledDecorator( Story, props ) { + function nowWithZeroedSeconds() { + const now = new Date(); + now.setSeconds( 0 ); + now.setMilliseconds( 0 ); + return now; + } + + const [ controlledDate, setControlledDate ] = useState( + nowWithZeroedSeconds().toISOString() + ); + + return ( +
+ +
+ +
+
+ Controlled date: +
{ controlledDate } +
+
+
+
+ ); +} + export const Controlled = Template.bind( {} ); Controlled.args = { ...Basic.args, help: "I'm controlled by a container that uses React state", }; -Controlled.decorators = [ - ( story, props ) => { - return ( - - { ( controlledDate, setControlledDate ) => - story( { - args: { - currentDate: controlledDate, - onChange: setControlledDate, - ...props.args, - }, - } ) - } - - ); - }, -]; +Controlled.decorators = [ ControlledDecorator ]; export const ControlledDateOnly = Template.bind( {} ); ControlledDateOnly.args = { diff --git a/packages/js/components/src/date-time-picker-control/test/index.tsx b/packages/js/components/src/date-time-picker-control/test/index.tsx index e0fcbfd5186..1088e875feb 100644 --- a/packages/js/components/src/date-time-picker-control/test/index.tsx +++ b/packages/js/components/src/date-time-picker-control/test/index.tsx @@ -659,4 +659,112 @@ describe( 'DateTimePickerControl', () => { await waitFor( () => expect( onChangeHandler ).not.toHaveBeenCalled() ); } ); + + it( 'should not call onChange if currentDate is set to an equivalent UTC date without Zulu offset specifier', async () => { + const originalDateTime = '2023-01-01T00:00:00Z'; + const equivalentDateTimeWithoutZulu = '2023-01-01T00:00:00'; + const onChangeHandler = jest.fn(); + + const { rerender } = render( + + ); + + // re-render the component; we do this to then test whether our onChange still gets called + rerender( + + ); + + await waitFor( () => expect( onChangeHandler ).not.toHaveBeenCalled() ); + } ); + + it( 'should not call onChange if currentDate is set to an equivalent UTC date without time', async () => { + const originalDateTime = '2023-01-01T00:00:00Z'; + const equivalentDateTimeWithoutTime = '2023-01-01'; + const onChangeHandler = jest.fn(); + + const { rerender } = render( + + ); + + // re-render the component; we do this to then test whether our onChange still gets called + rerender( + + ); + + await waitFor( () => expect( onChangeHandler ).not.toHaveBeenCalled() ); + } ); + + it( 'should not call onChange when the dateTimeFormat changes', async () => { + // we are specifically using a date with seconds in it, with a format + // without seconds in it; this helps us to determine if the currentDate + // is getting re-parsed from the input string (if it does this, it + // would result in a different date) + const originalDateTime = moment( '2022-11-15 02:30:40' ); + const originalDateTimeFormat = 'm-d-Y, H:i'; + const newDateTimeFormat = 'Y-m-d H:i'; + const onChangeHandler = jest.fn(); + + const { rerender } = render( + + ); + + // re-render the component; we do this to then test whether our onChange still gets called + rerender( + + ); + + await waitFor( () => expect( onChangeHandler ).not.toHaveBeenCalled() ); + } ); + + // We need to bump up the timeout for this test because: + // 1. userEvent.type() is slow (see https://github.com/testing-library/user-event/issues/577) + // 2. moment.js is slow + // Otherwise, the following error can occur on slow machines (such as our CI), because Jest times out and starts + // tearing down the component while test microtasks are still being executed + // (see https://github.com/facebook/jest/issues/12670) + // TypeError: Cannot read properties of null (reading 'createEvent') + it( 'should not call onChange when the input is changed to an equivalent date', async () => { + const originalDateTime = moment( '2022-09-15' ); + const newDateTimeInputString = 'September 9, 2022'; + const onChangeHandler = jest.fn(); + + const { container } = render( + + ); + + const input = container.querySelector( 'input' ); + userEvent.type( + input!, + '{selectall}{backspace}' + newDateTimeInputString + ); + + await waitFor( () => expect( onChangeHandler ).not.toHaveBeenCalled(), { + timeout: 10000, + } ); + }, 10000 ); } ); From a38a7df76c92886310c1a430ca420adb3a49aa5c Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 3 Nov 2022 12:25:42 -0700 Subject: [PATCH 0046/1680] Remove adding and managing products note (#35319) * Remove adding and managing products note * Add changelog entry * Remove obsolete note --- .../remove-adding-and-managing-products-note | 4 + .../woocommerce/includes/class-wc-install.php | 1 + .../woocommerce/src/Internal/Admin/Events.php | 2 - .../Notes/AddingAndManangingProducts.php | 80 ------------------- 4 files changed, 5 insertions(+), 82 deletions(-) create mode 100644 plugins/woocommerce/changelog/remove-adding-and-managing-products-note delete mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/AddingAndManangingProducts.php diff --git a/plugins/woocommerce/changelog/remove-adding-and-managing-products-note b/plugins/woocommerce/changelog/remove-adding-and-managing-products-note new file mode 100644 index 00000000000..b9cf435de9e --- /dev/null +++ b/plugins/woocommerce/changelog/remove-adding-and-managing-products-note @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove adding and managing products note diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index 8fe7066711f..33fd81dd1cf 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -826,6 +826,7 @@ class WC_Install { 'wc-admin-store-notice-setting-moved', 'wc-admin-store-notice-giving-feedback', 'wc-admin-learn-more-about-product-settings', + 'wc-admin-adding-and-managing-products', 'wc-admin-onboarding-profiler-reminder', 'wc-admin-historical-data', 'wc-admin-review-shipping-settings', diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index 1a1e57231ab..edd220b7d72 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -11,7 +11,6 @@ use \Automattic\WooCommerce\Admin\Features\Features; use \Automattic\WooCommerce\Admin\RemoteInboxNotifications\DataSourcePoller; use \Automattic\WooCommerce\Admin\RemoteInboxNotifications\RemoteInboxNotificationsEngine; use \Automattic\WooCommerce\Internal\Admin\Notes\AddFirstProduct; -use \Automattic\WooCommerce\Internal\Admin\Notes\AddingAndManangingProducts; use \Automattic\WooCommerce\Internal\Admin\Notes\ChoosingTheme; use \Automattic\WooCommerce\Internal\Admin\Notes\CouponPageMoved; use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizeStoreWithBlocks; @@ -73,7 +72,6 @@ class Events { */ private static $note_classes_to_added_or_updated = array( AddFirstProduct::class, - AddingAndManangingProducts::class, ChoosingTheme::class, CustomizeStoreWithBlocks::class, CustomizingProductCatalog::class, diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/AddingAndManangingProducts.php b/plugins/woocommerce/src/Internal/Admin/Notes/AddingAndManangingProducts.php deleted file mode 100644 index 6dba24c73d8..00000000000 --- a/plugins/woocommerce/src/Internal/Admin/Notes/AddingAndManangingProducts.php +++ /dev/null @@ -1,80 +0,0 @@ - 3 days and - * product count is 0 - * - * @package WooCommerce\Admin - */ - -namespace Automattic\WooCommerce\Internal\Admin\Notes; - -defined( 'ABSPATH' ) || exit; - -use \Automattic\WooCommerce\Admin\Notes\Note; -use \Automattic\WooCommerce\Admin\Notes\NoteTraits; - -/** - * Class AddingAndManangingProducts - * - * @package Automattic\WooCommerce\Admin\Notes - */ -class AddingAndManangingProducts { - /** - * Note traits. - */ - use NoteTraits; - - /** - * Name of the note for use in the database. - */ - const NOTE_NAME = 'wc-admin-adding-and-managing-products'; - - /** - * Get the note. - * - * @return Note|null - */ - public static function get_note() { - // Store must have been at least 3 days. - if ( ! self::is_wc_admin_active_in_date_range( 'week-1', DAY_IN_SECONDS * 3 ) ) { - return; - } - - // Total # of products must be 0. - $query = new \WC_Product_Query( - array( - 'limit' => 1, - 'paginate' => true, - 'return' => 'ids', - 'status' => array( 'publish' ), - ) - ); - - $products = $query->get_products(); - if ( 0 !== $products->total ) { - return; - } - - $note = new Note(); - $note->set_title( __( 'Adding and Managing Products', 'woocommerce' ) ); - $note->set_content( - __( - 'Learn more about how to set up products in WooCommerce through our useful documentation about adding and managing products.', - 'woocommerce' - ) - ); - $note->set_content_data( (object) array() ); - $note->set_type( Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); - $note->set_name( self::NOTE_NAME ); - $note->set_source( 'woocommerce-admin' ); - $note->add_action( - 'learn-more', - __( 'Learn more', 'woocommerce' ), - 'https://woocommerce.com/document/managing-products/?utm_source=inbox&utm_medium=product' - ); - - return $note; - } -} From ad1c49f9e4c49b2e90f9fb56f6f642295e32b4c3 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 3 Nov 2022 12:27:09 -0700 Subject: [PATCH 0047/1680] Remove manage store activity from home screen note (#35320) * Remove manage store activity note * Add changelog entry * Remove obsolete note --- ...anage-store-activity-from-home-screen-note | 4 ++ .../woocommerce/includes/class-wc-install.php | 1 + .../woocommerce/src/Internal/Admin/Events.php | 2 - .../src/Internal/Admin/FeaturePlugin.php | 2 - .../ManageStoreActivityFromHomeScreen.php | 68 ------------------- 5 files changed, 5 insertions(+), 72 deletions(-) create mode 100644 plugins/woocommerce/changelog/remove-manage-store-activity-from-home-screen-note delete mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/ManageStoreActivityFromHomeScreen.php diff --git a/plugins/woocommerce/changelog/remove-manage-store-activity-from-home-screen-note b/plugins/woocommerce/changelog/remove-manage-store-activity-from-home-screen-note new file mode 100644 index 00000000000..81c212c40a3 --- /dev/null +++ b/plugins/woocommerce/changelog/remove-manage-store-activity-from-home-screen-note @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove manage store activity note diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index 33fd81dd1cf..437222d4216 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -829,6 +829,7 @@ class WC_Install { 'wc-admin-adding-and-managing-products', 'wc-admin-onboarding-profiler-reminder', 'wc-admin-historical-data', + 'wc-admin-manage-store-activity-from-home-screen', 'wc-admin-review-shipping-settings', 'wc-admin-home-screen-feedback', 'wc-admin-update-store-details', diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index edd220b7d72..0d252d75936 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -23,7 +23,6 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\InstallJPAndWCSPlugins; use \Automattic\WooCommerce\Internal\Admin\Notes\LaunchChecklist; use \Automattic\WooCommerce\Internal\Admin\Notes\MagentoMigration; use \Automattic\WooCommerce\Internal\Admin\Notes\ManageOrdersOnTheGo; -use \Automattic\WooCommerce\Internal\Admin\Notes\ManageStoreActivityFromHomeScreen; use \Automattic\WooCommerce\Internal\Admin\Notes\MarketingJetpack; use \Automattic\WooCommerce\Internal\Admin\Notes\MerchantEmailNotifications; use \Automattic\WooCommerce\Internal\Admin\Notes\MigrateFromShopify; @@ -106,7 +105,6 @@ class Events { private static $other_note_classes = array( CouponPageMoved::class, InstallJPAndWCSPlugins::class, - ManageStoreActivityFromHomeScreen::class, OrderMilestones::class, SellingOnlineCourses::class, UnsecuredReportFiles::class, diff --git a/plugins/woocommerce/src/Internal/Admin/FeaturePlugin.php b/plugins/woocommerce/src/Internal/Admin/FeaturePlugin.php index f9e94523282..ad67eded950 100644 --- a/plugins/woocommerce/src/Internal/Admin/FeaturePlugin.php +++ b/plugins/woocommerce/src/Internal/Admin/FeaturePlugin.php @@ -18,7 +18,6 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\TestCheckout; use \Automattic\WooCommerce\Internal\Admin\Notes\SellingOnlineCourses; use \Automattic\WooCommerce\Internal\Admin\Notes\MerchantEmailNotifications; use \Automattic\WooCommerce\Internal\Admin\Notes\WelcomeToWooCommerceForStoreUsers; -use \Automattic\WooCommerce\Internal\Admin\Notes\ManageStoreActivityFromHomeScreen; use \Automattic\WooCommerce\Internal\Admin\Notes\MagentoMigration; use Automattic\WooCommerce\Admin\Features\Features; use Automattic\WooCommerce\Admin\PluginsHelper; @@ -182,7 +181,6 @@ class FeaturePlugin { new TestCheckout(); new SellingOnlineCourses(); new WelcomeToWooCommerceForStoreUsers(); - new ManageStoreActivityFromHomeScreen(); new MagentoMigration(); // Initialize MerchantEmailNotifications. diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/ManageStoreActivityFromHomeScreen.php b/plugins/woocommerce/src/Internal/Admin/Notes/ManageStoreActivityFromHomeScreen.php deleted file mode 100644 index 026f6bf5024..00000000000 --- a/plugins/woocommerce/src/Internal/Admin/Notes/ManageStoreActivityFromHomeScreen.php +++ /dev/null @@ -1,68 +0,0 @@ -set_title( __( 'New! Manage your store activity from the Home screen', 'woocommerce' ) ); - $note->set_content( __( 'Start your day knowing the next steps you need to take with your orders, products, and customer feedback.

Read more about how to use the activity panels on the Home screen.', 'woocommerce' ) ); - $note->set_type( Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); - $note->set_name( self::NOTE_NAME ); - $note->set_source( 'woocommerce-admin' ); - $note->add_action( - 'learn-more', - __( 'Learn more', 'woocommerce' ), - 'https://woocommerce.com/document/home-screen/?utm_source=inbox&utm_medium=product', - Note::E_WC_ADMIN_NOTE_ACTIONED - ); - - return $note; - } -} From c62f9843b92d4c2aeba9c9af3fb91af1ee13977a Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 3 Nov 2022 13:13:01 -0700 Subject: [PATCH 0048/1680] Remove the first downloadable product note (#35318) * Remove first downloadable product note * Add changelog entry * Remove obsolete note --- .../remove-first-downloadable-product-note | 4 ++ .../woocommerce/includes/class-wc-install.php | 1 + .../woocommerce/src/Internal/Admin/Events.php | 2 - .../Admin/Notes/FirstDownloadableProduct.php | 71 ------------------- 4 files changed, 5 insertions(+), 73 deletions(-) create mode 100644 plugins/woocommerce/changelog/remove-first-downloadable-product-note delete mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php diff --git a/plugins/woocommerce/changelog/remove-first-downloadable-product-note b/plugins/woocommerce/changelog/remove-first-downloadable-product-note new file mode 100644 index 00000000000..dd51ea60e1f --- /dev/null +++ b/plugins/woocommerce/changelog/remove-first-downloadable-product-note @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove first downloadable product note diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index 437222d4216..594fb2f7cac 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -825,6 +825,7 @@ class WC_Install { 'wc-admin-insight-first-product-and-payment', 'wc-admin-store-notice-setting-moved', 'wc-admin-store-notice-giving-feedback', + 'wc-admin-first-downloadable-product', 'wc-admin-learn-more-about-product-settings', 'wc-admin-adding-and-managing-products', 'wc-admin-onboarding-profiler-reminder', diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index 0d252d75936..94799e91ebd 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -17,7 +17,6 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizeStoreWithBlocks; use \Automattic\WooCommerce\Internal\Admin\Notes\CustomizingProductCatalog; use \Automattic\WooCommerce\Internal\Admin\Notes\EditProductsOnTheMove; use \Automattic\WooCommerce\Internal\Admin\Notes\EUVATNumber; -use \Automattic\WooCommerce\Internal\Admin\Notes\FirstDownloadableProduct; use \Automattic\WooCommerce\Internal\Admin\Notes\FirstProduct; use \Automattic\WooCommerce\Internal\Admin\Notes\InstallJPAndWCSPlugins; use \Automattic\WooCommerce\Internal\Admin\Notes\LaunchChecklist; @@ -76,7 +75,6 @@ class Events { CustomizingProductCatalog::class, EditProductsOnTheMove::class, EUVATNumber::class, - FirstDownloadableProduct::class, FirstProduct::class, LaunchChecklist::class, MagentoMigration::class, diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php b/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php deleted file mode 100644 index e38f22ce385..00000000000 --- a/plugins/woocommerce/src/Internal/Admin/Notes/FirstDownloadableProduct.php +++ /dev/null @@ -1,71 +0,0 @@ - 1, - 'paginate' => true, - 'return' => 'ids', - 'downloadable' => 1, - 'status' => array( 'publish' ), - ) - ); - $products = $query->get_products(); - - // There must be at least 1 downloadable product. - if ( 0 === $products->total ) { - return; - } - - $note = new Note(); - $note->set_title( __( 'Learn more about digital/downloadable products', 'woocommerce' ) ); - $note->set_content( - __( - 'Congrats on adding your first digital product! You can learn more about how to handle digital or downloadable products in our documentation.', - 'woocommerce' - ) - ); - $note->set_type( Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); - $note->set_name( self::NOTE_NAME ); - $note->set_content_data( (object) array() ); - $note->set_source( 'woocommerce-admin' ); - $note->add_action( - 'first-downloadable-product-handling', - __( 'Learn more', 'woocommerce' ), - 'https://woocommerce.com/document/digital-downloadable-product-handling/?utm_source=inbox&utm_medium=product' - ); - - return $note; - } -} From a6921dd4b6104226381b99ea16eff990d5eb7008 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Nov 2022 07:36:37 -0500 Subject: [PATCH 0049/1680] Update changelog.txt from release 7.0.1 (#35457) Co-authored-by: WooCommerce Bot --- changelog.txt | 90 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 55 insertions(+), 35 deletions(-) diff --git a/changelog.txt b/changelog.txt index e30f9f9135c..04e7e45ae80 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,21 @@ == Changelog == += 7.0.1 2022-11-01 = + +**WooCommerce** + +* Dev - Twenty Twenty-Three theme compatibility. [#35306](https://github.com/woocommerce/woocommerce/pull/35306) +* Dev - Simplify and reduce size of payload supplied by the woocommerce_get_customer_details ajax endpoint. + +**WooCommerce Blocks 8.5.2** + +* Enhancement - Fix Mini Cart Global Styles. [7515](https://github.com/woocommerce/woocommerce-blocks/pull/7515) +* Enhancement - Fix inconsistent button styling with TT3. ([7516](https://github.com/woocommerce/woocommerce-blocks/pull/7516)) +* Enhancement - Make the Filter by Price block range color dependent of the theme color. [7525](https://github.com/woocommerce/woocommerce-blocks/pull/7525) +* Enhancement - Filter by Price block: fix price slider visibility on dark themes. [7527](https://github.com/woocommerce/woocommerce-blocks/pull/7527) +* Enhancement - Update the Mini Cart block drawer to honor the theme's background. [7510](https://github.com/woocommerce/woocommerce-blocks/pull/7510) +* Enhancement - Add white background to Filter by Attribute block dropdown so text is legible in dark backgrounds. [7506](https://github.com/woocommerce/woocommerce-blocks/pull/7506) + = 7.0.0 2022-10-11 = **WooCommerce** @@ -51,7 +67,6 @@ * Add - Support order searches as an integral part of how (COT) order queries work. [#34405](https://github.com/woocommerce/woocommerce/pull/34405) * Add - UI Revamp on Marketing Page with feature toggle. [#34642](https://github.com/woocommerce/woocommerce/pull/34642) * Add - Woo Mobile Welcome Page with Magic Link feature [#34637](https://github.com/woocommerce/woocommerce/pull/34637) -* Update - Update WooCommerce Blocks to 8.5.1 [#34807](https://github.com/woocommerce/woocommerce/pull/34807) * Update - Updates tracking parameters for marketing messages of mobile apps in New order mail. [#34717](https://github.com/woocommerce/woocommerce/pull/34717) * Update - Add an empty list of states for Saint Martin (French part) [#34521](https://github.com/woocommerce/woocommerce/pull/34521) * Update - Add Wish and Walmart to the platform options [#34541](https://github.com/woocommerce/woocommerce/pull/34541) @@ -172,7 +187,7 @@ * Fix - Minor changes to address Typescript errors after updating TS definitions [#34154](https://github.com/woocommerce/woocommerce/pull/34154) * Fix - Refactored homescreen component to use useQuery hook [#34183](https://github.com/woocommerce/woocommerce/pull/34183) * Fix - Support Cart/Checkout/My accounts/Terms settings in WC REST API [#34234](https://github.com/woocommerce/woocommerce/pull/34234) -* Fix - Use the default payment suggestions when woocommerce_show_marketplace_suggestions is set to no [#34083](https://github.com/woocommerce/woocommerce/pull/34083) +* Fix - Use the default paymetn suggestions when woocommerce_show_marketplace_suggestions is set to no [#34083](https://github.com/woocommerce/woocommerce/pull/34083) * Fix - Wrap default payment gateway strings in __() function call [#33987](https://github.com/woocommerce/woocommerce/pull/33987) * Add - Add default styles for block themes to ensure WooCommerce looks better out of the box with block themes that are not optimized for WooCommerce specifically. [#33518](https://github.com/woocommerce/woocommerce/pull/33518) * Add - Added tour for store location [#34137](https://github.com/woocommerce/woocommerce/pull/34137) @@ -245,9 +260,8 @@ * Enhancement - Reduce the amount of terms shown in attributes page [#33962](https://github.com/woocommerce/woocommerce/pull/33962) * Enhancement - Use method_exists instead of throwing in AbstractServiceProvider::reflect_class_or_callable [#33960](https://github.com/woocommerce/woocommerce/pull/33960) -**WooCommerce Blocks 8.1.0 & 8.2.0 & 8.2.1 & 8.3.0 & 8.3.1 & 8.3.2** +**WooCommerce Blocks 8.1.0 & 8.2.0 & 8.2.1 & 8.3.0 & 8.3.1** -* Enhancement - Add feedback box to the Cart & Checkout Inner Blocks in the inspector. ([6881](https://github.com/woocommerce/woocommerce-blocks/pull/6881)) * Enhancement - Enable the Cart and Checkout blocks when WooCommerce Blocks is bundled in WooCommerce Core.([6805](https://github.com/woocommerce/woocommerce-blocks/pull/6805)) * Enhancement - Refactor style-attributes hooks to add as global custom imports and remove relative import paths.([6870](https://github.com/woocommerce/woocommerce-blocks/pull/6870)) * Enhancement - Add the ability to register patterns by adding them under the "patterns" folder and add the new "WooCommerce Filters" pattern.([6861](https://github.com/woocommerce/woocommerce-blocks/pull/6861)) @@ -256,8 +270,11 @@ * Enhancement - Add filter URL support to filter blocks when filtering for All Products block.([6642](https://github.com/woocommerce/woocommerce-blocks/pull/6642)) * Enhancement - Add: Allow choosing between single and multiple sections.([6620](https://github.com/woocommerce/woocommerce-blocks/pull/6620)) * Enhancement - Cart endpoint for Store API (/wc/store/cart) now features cross-sell items based on cart contents.([6635](https://github.com/woocommerce/woocommerce-blocks/pull/6635)) -* Fix - Fix Best Selling Products block ordering ([7025](https://github.com/woocommerce/woocommerce-blocks/pull/7025)) -* Fix - Prevent unnecessarily showing the item names in a shipping package if it's the only package. ([6899](https://github.com/woocommerce/woocommerce-blocks/pull/6899)) +* Enhancement - Add feedback box to the Cart & Checkout Inner Blocks in the inspector. ([6881](https://github.com/woocommerce/woocommerce-blocks/pull/6881)) +* Enhancement - Refactor style-attributes hooks to add as global custom imports and remove relative import paths. ([6870](https://github.com/woocommerce/woocommerce-blocks/pull/6870)) +* Enhancement - Add notice to Cart and Checkout blocks' inspector controls which links to the list of compatible plugins. ([6869](https://github.com/woocommerce/woocommerce-blocks/pull/6869)) +* Enhancement - Add the ability to register patterns by adding them under the "patterns" folder and add the new "WooCommerce Filters" pattern. ([6861](https://github.com/woocommerce/woocommerce-blocks/pull/6861)) +* Enhancement - Enable the Cart and Checkout blocks when WooCommerce Blocks is bundled in WooCommerce Core. ([6805](https://github.com/woocommerce/woocommerce-blocks/pull/6805)) * Fix - Refactor Product Categories block to use block.json.([6875](https://github.com/woocommerce/woocommerce-blocks/pull/6875)) * Fix - Add font-weight controls to the Mini Cart block text.([6760](https://github.com/woocommerce/woocommerce-blocks/pull/6760)) * Fix - Fix proceed to checkout button not working for custom links.([6804](https://github.com/woocommerce/woocommerce-blocks/pull/6804)) @@ -269,7 +286,10 @@ * Fix - Fixes an issue where search lists would not preserve the case of the original item.([6551](https://github.com/woocommerce/woocommerce-blocks/pull/6551)) * Fix - Prevent Featured Product block from breaking when product is out of stock + hidden from catalog.([6640](https://github.com/woocommerce/woocommerce-blocks/pull/6640)) * Fix - Contrast improvement for checkout error messages when displayed over a theme's dark mode.([6292](https://github.com/woocommerce/woocommerce-blocks/pull/6292)) - +* Fix - Refactor Product Categories block to use block.json. ([6875](https://github.com/woocommerce/woocommerce-blocks/pull/6875)) +* Fix - Fix: Update billing address when shipping address gets change in shipping calculator at Cart block. ([6823](https://github.com/woocommerce/woocommerce-blocks/pull/6823)) +* Fix - Fix: Add font-weight controls to the Mini Cart block text. ([6760](https://github.com/woocommerce/woocommerce-blocks/pull/6760)) +* Fix - Prevent unnecessarily showing the item names in a shipping package if it's the only package. ([6899](https://github.com/woocommerce/woocommerce-blocks/pull/6899)) = 6.8.0 2022-08-09 = **WooCommerce** @@ -321,9 +341,9 @@ * Update - Implement bulk actions in the new orders admin list table. [#33687](https://github.com/woocommerce/woocommerce/pull/33687) * Update - Making default state of product image meta boxes more prominent. [#33707](https://github.com/woocommerce/woocommerce/pull/33707) * Update - Randomize the order of sections in Recommended Marketing Extensions [#33851](https://github.com/woocommerce/woocommerce/pull/33851) -* Update - Removed two-col task list experiments code [#33643](https://github.com/woocommerce/woocommerce/pull/33643) +* Update - Removed two-col task list expierments code [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Update - Remove legacy image sizes [#33772](https://github.com/woocommerce/woocommerce/pull/33772) -* Update - Set default shipping methods when store country is the US and Jetpack is installed [#33788](https://github.com/woocommerce/woocommerce/pull/33788) +* Update - Set ddefault shipping methods when store country is the US and Jetpack is intalled [#33788](https://github.com/woocommerce/woocommerce/pull/33788) * Update - Set smart shipping feature flags to true [#33819](https://github.com/woocommerce/woocommerce/pull/33819) * Update - Update display shipping task logic and add ReviewShippingOptions task [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Update - Update review shipping options task complete logic [#33650](https://github.com/woocommerce/woocommerce/pull/33650) @@ -332,7 +352,7 @@ * Update - Update wcpay suggestion UI in payment task [#33717](https://github.com/woocommerce/woocommerce/pull/33717) * Update - Update wcpay to include a mention of in-person payments for Canada [#33669](https://github.com/woocommerce/woocommerce/pull/33669) * Update - Update WooCommerce Blocks to 8.0.0 [#33736](https://github.com/woocommerce/woocommerce/pull/33736) -* Update - Uses WC_Data_Store directly to count the shipping zones to avoid any unnecessary query to the D.B [#33643](https://github.com/woocommerce/woocommerce/pull/33643) +* Update - Uses WC_Data_Store directly to count the shipping zones to avoid any unncessary query to the D.B [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Dev - Add playwright e2e README.md [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Dev - Add `$transaction_id` as arg to various `payment_complete` hooks. [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Dev - Add `wc com extension install` CLI command [#33775](https://github.com/woocommerce/woocommerce/pull/33775) @@ -405,10 +425,10 @@ * Fix - Fix broken design of Single Product template in block themes when product had no reviews or additional info [#33329](https://github.com/woocommerce/woocommerce/pull/33329) * Fix - Clean up unused remote inbox notifications option [#33373](https://github.com/woocommerce/woocommerce/pull/33373) * Fix - Settings: fix Tracks event when enabling/disabling advanced features settings. [#33305](https://github.com/woocommerce/woocommerce/pull/33305) -* Fix - Fix accidentally deleted method during merge for 33034. [#33142](https://github.com/woocommerce/woocommerce/pull/33142) +* Fix - Fix accidently deleted method during merge for 33034. [#33142](https://github.com/woocommerce/woocommerce/pull/33142) * Fix - Fix the styling of the frame in the Leaderboard section of Analytics. [#33163](https://github.com/woocommerce/woocommerce/pull/33163) * Fix - Fix obw free extension rules for the marketing task with php 8 [#33329](https://github.com/woocommerce/woocommerce/pull/33329) -* Fix - Fix product tour spotlight location [#33329](https://github.com/woocommerce/woocommerce/pull/33329) +* Fix - Fix product tour splotlight location [#33329](https://github.com/woocommerce/woocommerce/pull/33329) * Fix - Fix product tour TypeError when reading innerHTML [#33448](https://github.com/woocommerce/woocommerce/pull/33448) * Fix - Fix: Content width issue and Classic Template blocks alignment issue for Twenty Twenty-Two. [#33329](https://github.com/woocommerce/woocommerce/pull/33329) * Fix - Fix typos in various cot migration messages. [#33329](https://github.com/woocommerce/woocommerce/pull/33329) @@ -528,7 +548,7 @@ * Dev - Remove the post_id column from the orders table, and adjust the SQL queries that count/get out of sync orders accordingly. [#32706](https://github.com/woocommerce/woocommerce/pull/32706) * Dev - Update woo admin ts config to have an isolated TS environment [#32616](https://github.com/woocommerce/woocommerce/pull/32616) * Dev - Updating scripts to use pnpm/Nx commands [#32943](https://github.com/woocommerce/woocommerce/pull/32943) -* Dev - Remove woo tracks type declaration from woo admin ./client. [#32937](https://github.com/woocommerce/woocommerce/pull/32937) +* Dev - Remove woo tracks type declaration from woo admin ./cleint. [#32937](https://github.com/woocommerce/woocommerce/pull/32937) * Dev - Fix react admin ./client type errors after updating @woocommerce/data types [#32735](https://github.com/woocommerce/woocommerce/pull/32735) * Dev - Removed temporary codepath added in #32603 since translation paths have been updated [#33226](https://github.com/woocommerce/woocommerce/pull/33226) * Enhancement - Add fallback image for payments task gateway icons [#32773](https://github.com/woocommerce/woocommerce/pull/32773) @@ -573,12 +593,12 @@ * Performance - Fix system status API requests that only query some fields [#32823](https://github.com/woocommerce/woocommerce/pull/32823) * Tweak - For Vietnam, the second street address line should be displayed but not required. [#32610](https://github.com/woocommerce/woocommerce/pull/32610) * Tweak - Comment: We're adding extra protections to a newly introduced feature; a further changelog entry is not needed. [#32771](https://github.com/woocommerce/woocommerce/pull/32771) -* Tweak - Fix spacing between the payment logo assets in the payment banner experiment. [#33065](https://github.com/woocommerce/woocommerce/pull/33065) +* Tweak - Fix spacing between the Paymetn logo assets in the payment banner experiment. [#33065](https://github.com/woocommerce/woocommerce/pull/33065) * Tweak - Comment: Omitting a changelog entry, because we're correcting an unreleased oversight. [#32744](https://github.com/woocommerce/woocommerce/pull/32744) * Tweak - Update TikTok onboarding icon [#32857](https://github.com/woocommerce/woocommerce/pull/32857) * Tweak - Fix typescript type errors in react admin ./client/shipping [#32688](https://github.com/woocommerce/woocommerce/pull/32688) * Tweak - Comment: Improves a newly added feature, so a further changelog entry is not required. [#32776](https://github.com/woocommerce/woocommerce/pull/32776) -* Tweak - Add wc-admin-deactivate-plugin to list of obsolete notes so it gets deleted on upgrade [#32982](https://github.com/woocommerce/woocommerce/pull/32982) +* Tweak - Add wc-admin-deactivate-plugin to list of obselete notes so it gets deleted on upgrade [#32982](https://github.com/woocommerce/woocommerce/pull/32982) * Tweak - Fix typescript type errors in react admin ./client/wp-admin-scripts [#32678](https://github.com/woocommerce/woocommerce/pull/32678) * Tweak - Move the file for the DatabaseUtil class to the proper directory according to its namespace. [#33109](https://github.com/woocommerce/woocommerce/pull/33109) * Tweak - Also allow getting category ID as option ID instead of term slug in wc-enhanced-select. [#32743](https://github.com/woocommerce/woocommerce/pull/32743) @@ -662,7 +682,7 @@ * Add - a new `woocommerce_generate_{$type}_html` action hook to generate custom field types in `WC_Settings_API` class objects. ([#31238](https://github.com/woocommerce/woocommerce/pull/31238)) * Add - Make the `$webhook` object available to consumers of the `woocommerce_webhook_options` action. ([#31292](https://github.com/woocommerce/woocommerce/pull/31292)) * Add - Pinterest extension to onboarding wizard and marketing task ([#32527](https://github.com/woocommerce/woocommerce/pull/32527)) -* Add - `order_item_display_meta` option to orders endpoint (REST API), to support filtering out variation meta. +* Add - `order_item_display_meta` option to orders endpoint (REST API), to osupport filtering out variation meta. * Add - new hooks to `order-tracking.php` form. ([#30320](https://github.com/woocommerce/woocommerce/pull/30320)) * Fix - Ensure that an existing order with auto-draft status won't be interpreted as pending when determining if the status has changed. ([#32571](https://github.com/woocommerce/woocommerce/pull/32571)) * Fix - bug in which tasks reminder bar was displayed on product screens. ([#32526](https://github.com/woocommerce/woocommerce/pull/32526)) @@ -679,7 +699,7 @@ * Fix - WCPay task add missing legal message within task. ([#32762](https://github.com/woocommerce/woocommerce/issues/32762)) * Tweak - Make it possible for downloadable files to be in an enabled or disabled state. * Tweak - UI changes for set up payments task -* Tweak - Update WCA deactivation hooks to work with WC deactivation. +* Tweak - Update WCA deactivation hooks to work with WC deactvation. * Tweak - Move feature flag config files to Woocommerce plugin to support unit test execution in the wp-env environment. * Tweak - Update progress header bar styles in task list ([#32498](https://github.com/woocommerce/woocommerce/pull/32498)) * Tweak - Update country strings, rename Swaziland to Eswatini (per CLDR R41 update). ([#31185](https://github.com/woocommerce/woocommerce/pull/31185)) @@ -692,7 +712,7 @@ * Dev - Merge WCA install routines to the core * Dev - Remove `load_plugin_textdomain` method from admin plugin. * Dev - Simplify the WooCommerce Admin init routine. ([#32489](https://github.com/woocommerce/woocommerce/pull/32489)) -* Dev - Generic migration support for migration from posts + postsmeta table to any custom table. Additionally, implement migrations to various COT tables using this generic support. +* Dev - Generic migration support for migration from posts + postsmeta table to any custom table. Additionaly, implement migrations to various COT tables using this generic support. * Dev - Remove Pinterest extension from OBW ([#32626](https://github.com/woocommerce/woocommerce/pull/32626)) * Dev - Revert back menu position to floats as string for WP compatibility. * Dev - Enable the "Save changes" button within the variations panel when a textfield receives input. ([#32589](https://github.com/woocommerce/woocommerce/pull/32589)) @@ -821,7 +841,7 @@ * Enhancement - Add support for the global style for the On-Sale Badge block. ([5565](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/*565)) * Enhancement - Add support for the global style for the Attribute Filter block. ([5557](https://github.com/woocommerce/woocommerce-gutenberg-products-block/*ull/5557)) * Enhancement - Category List block: Add support for global style. ([5516](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/5516)) -* Fix - Fixed typo in `woocommerce_store_api_validate_add_to_cart` and `woocommerce_store_api_validate_cart_item` hook names. ([5926](https://github.com/*oocommerce/woocommerce-gutenberg-products-block/pull/5926)) +* Fix - Fixed typo in `wooocommerce_store_api_validate_add_to_cart` and `wooocommerce_store_api_validate_cart_item` hook names. ([5926](https://github.com/*oocommerce/woocommerce-gutenberg-products-block/pull/5926)) * Fix - Fix loading WC core translations in locales where WC Blocks is not localized for some strings. ([5910](https://github.com/woocommerce/*oocommerce-gutenberg-products-block/pull/5910)) * Fix - Fixed an issue where clear customizations functionality was not working for WooCommerce templates. ([5746](https://github.com/woocommerce/*oocommerce-gutenberg-products-block/pull/5746)) * Fix - Fixed hover and focus states for button components. ([5712](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/5712)) @@ -1113,7 +1133,7 @@ * Dev - ActionScheduler_wcSystemStatus PHPCS fixes (props @ovidiul). ( [#761](https://github.com/woocommerce/action-scheduler/pull/761) ) * Dev - ActionScheduler_DBLogger.php PHPCS fixes (props @ovidiul). ( [#768](https://github.com/woocommerce/action-scheduler/pull/768) ) * Dev - Fixed phpcs for ActionScheduler_Schedule_Deprecated (props @ovidiul). ( [#762](https://github.com/woocommerce/action-scheduler/pull/762) ) -* Dev - Improve actions table indices (props @glagonikas). ( [#774](https://github.com/woocommerce/action-scheduler/pull/774) & [#777](https://github.com/woocommerce/action-scheduler/pull/777) ) +* Dev - Improve actions table indicies (props @glagonikas). ( [#774](https://github.com/woocommerce/action-scheduler/pull/774) & [#777](https://github.com/woocommerce/action-scheduler/pull/777) ) * Dev - PHPCS fixes for ActionScheduler_DBStore.php (props @ovidiul). ( [#769](https://github.com/woocommerce/action-scheduler/pull/769) & [#778](https://github.com/woocommerce/action-scheduler/pull/778) ) * Dev - PHPCS Fixes for ActionScheduler_Abstract_ListTable (props @ovidiul). ( [#763](https://github.com/woocommerce/action-scheduler/pull/763) & [#779](https://github.com/woocommerce/action-scheduler/pull/779) ) * Dev - Adds new filter action_scheduler_claim_actions_order_by to allow tuning of the claim query (props @glagonikas). ( [#773](https://github.com/woocommerce/action-scheduler/pull/773) ) @@ -1234,7 +1254,7 @@ * Fix - Ensure homescreen defaults to single column layout. ( [#7969](https://github.com/woocommerce/woocommerce-admin/issues/7969) ) * Fix: Fix shipping task not offering step 3. ( [#7985](https://github.com/woocommerce/woocommerce-admin/issues/7985) ) * Add - Add Avalara to tax task ( [#7874](https://github.com/woocommerce/woocommerce-admin/issues/7874) ) -* Add - Add 2col experiment. ( [#7872](https://github.com/woocommerce/woocommerce-admin/issues/7872) ) +* Add - Add 2col expirement. ( [#7872](https://github.com/woocommerce/woocommerce-admin/issues/7872) ) * Add - Added two column experimental task list ( [#7669](https://github.com/woocommerce/woocommerce-admin/issues/7669) ) * Add - Add header cards for all tasks in Tasklist UI experiment ( [#7838](https://github.com/woocommerce/woocommerce-admin/issues/7838) ) * Add - Add onboarding task docs ( [#7762](https://github.com/woocommerce/woocommerce-admin/issues/7762) ) @@ -1656,7 +1676,7 @@ = 5.5.2 2021-07-22 = * Fix - Add a new option allowing product downloads to be served using redirects as a last resort. #30288 -* Fix - Remove unnecessary search related 'where' clause added in the 'post_clauses' hook handling. #30335 +* Fix - Remove unnecessary seacrh related 'where' clause added in the 'post_clauses' hook handling. #30335 * Fix - Check before calling $screen method to make sure its not null. #30277 **WooCommerce Admin - 2.4.4 & 2.4.3 & 2.4.2 ** @@ -1761,7 +1781,7 @@ * Fix - RemoteFreeExtension hide bundle when all of its plugins are not visible #7182 * Fix - Issue where summary stats were not showing in Analytics > Stock. #7161 * Fix - Rule Processing Transformer to handle dotNotation default value #7009 -* Fix - Remove Navigation's unneeded SlotFill context #6832 +* Fix - Remove Navigation's uneeded SlotFill context #6832 * Fix - Report filters expecting specific ordering. #6847 * Fix - Render bug with report comparison mode selections. #6862 * Fix - Throw exception if the data store cannot be loaded when trying to use notes. #6771 @@ -1917,7 +1937,7 @@ * Fix - Make pagination buttons height and width consistent #6725 * Fix - Retain persisted queries when navigating to Homescreen #6614 * Fix - Update folded header style #6724 -* Fix - Unrelated variations showing up in the Products reports #6647 +* Fix - Unreleated variations showing up in the Products reports #6647 * Fix - Check active plugins before getting the PayPal onboarding status #6625 * Fix - Remove no-reply from inbox notification emails #6644 * Fix - Set up shipping costs task, redirect to shipping settings after completion. #6791 @@ -2340,7 +2360,7 @@ * Fix - Onboarding - Fixed "Business Details" error. #6271 * Fix - Show management links when only main task list is hidden. #6291 * Fix - Correct the Klarna slug. #6440 -* Add - new inbox message - Getting started in e-commerce - watch this webinar. #6086 +* Add - new inbox message - Getting started in Ecommerce - watch this webinar. #6086 * Add - Remote inbox notifications contains comparison and fix product rule. #6073 * Add - Task list payments - include Mollie as an option. #6257 * Update - store deprecation welcome modal support doc link #6094 @@ -2367,7 +2387,7 @@ * Enhancements - Fix: Added fallback styling for screen reader text. ([3557](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3557)) * Fix - Ensure empty categories are correctly hidden in the product categories block. ([3765](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3765)) * Fix - Added missing wrapper div within FeaturedCategory and FeatureProduct blocks. ([3746](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3746)) -* Fix - Set correct text color in BlockErrorBoundary notices. ([3738](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3738)) +* Fix - Set correct text color in BlockErrorBoundry notices. ([3738](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3738)) * Fix - Hidden cart item meta data will not be rendered in the Cart and Checkout blocks. ([3732](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3732)) * Fix - Improved accessibility of product image links in the products block by using correct aria tags and hiding empty image placeholders. ([3722](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3722)) * Fix - Add missing aria-label for stars image in the review-list-item component. ([3706](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3706)) @@ -2785,7 +2805,7 @@ * Dev - Introduce (again) a dependency injection framework for the code in the src directory. #27733 * Dev - Remove leftover code and data from the reverted improvement for variations filtering by attribute. #27748 * Dev - Escaped labels in `woocommerce_form_field()`. #27800 -* Dev - Add a `NumberUtil::round` method to workaround a breaking change in the built-in round function in PHP8. #27830 +* Dev - Add a `NumberUtil::round` method to workaround a breaking change in the buil-in round function in PHP8. #27830 * Dev - Remove default value from optional parameters that are followed by required parameters in functions/methods, since those are de-facto required and trigger a deprectation notice in PHP 8. #27840 * Dev - REST API - Add user-friendly attribute names and values to order line items metadata. * Dev - REST API - Adds `parent_name` to `line_items` of the GET /orders endpoint. @@ -2898,7 +2918,7 @@ - Dev: Store Profiler - Industry step: reduced padding and removed industry #5157 - Dev: Remove product settings video note #5213 - Enhancement: Add free local shipping zone on profile complete #4857 -- Enhancement: Add woocommerce/tracks package #5107 +- Enhancement: Add woocommerce/tracks pacakage #5107 - Enhancement: Add filter to allow modification of report columns #4984 - Enhancement: Add WooCommerce Mobile Banner #5037 - Enhancement: Add Product Attribute advanced filter #5038 @@ -2972,7 +2992,7 @@ * Localization - Added postcode validation for Bosnia and Herzegovina. #27048 * Localization - Added the postcode validation for Liechtenstein. #27059 * Localization - Add i18n locale information for Liechtenstein, Switzerland and Austria. #27193 -* Tweak - Increase priority of `admin_body_class` filter to avoid conflict with plugins that incorrectly remove all body classes from WP. #27426 +* Tweak - Increase priority of `admin_body_class` filter to avoid comflict with plugins that incorrectly remove all body classes from WP. #27426 * Tweak - Rename built-in PayPal payment method to PayPal Standard. #27468 * Fix - Remove whitespace within a link. #26897 * Fix - `get_review_count_for_product` return all comments count not only 'review' types #26928 @@ -3083,7 +3103,7 @@ * Fix - After clicking to update WooCommerce, the user will stay in the same page instead of being redirected to the "Settings" page. #27172 * Fix - "Product type" dropdown missing from Product's data meta box on WP 5.5. #27170 * Fix - Removed the JETPACK_AUTOLOAD_DEV define. #27185 -* Fix - Fixed "virtual" and "downloadable" pointers on product walkthrough. #27145 +* Fix - Fixed "virtual" and "downlodable" pointers on product walkthrough. #27145 * Fix - Updated tested up to for WordPress 5.5. #27334 * Dev - Update WooCommerce Admin version to v1.4.0. #27378 * Dev - Upgraded to v2.2 of Jetpack Autoloader. #27358 @@ -3160,7 +3180,7 @@ * Performance - Don't load shortcode Cart and Checkout scripts when using the blocks. #2842 * Performance - Scripts only relevant to the frontend side of blocks are no longer loaded in the editor. #2788 * Performance - Lazy Loading Atomic Components. #2777 -* Refactor - Remove dashicon classes. #2848 +* Pefactor - Remove dashicon classes. #2848 **WooCommerce Blocks 3.1.0** * Fix - Missing permissions_callback arg in StoreApi route definitions. #2926 @@ -3250,7 +3270,7 @@ * Enhancement - Add API tool to verify base DB tables. woocommerce/woocommerce-rest-api#188 **WooCommerce Admin 1.3.0** -* Enhancement - Add Jetpack stats to performance indicators / homepage #4291 +* Enhancement - Add Jetpack stats to performance indicatorts / homepage #4291 * Enhancement - New "Store Management" quick links card on WooCommerce home screen. #4350 * Enhancement - Inbox notifications layout updates #4218 * Enhancement - New Home Screen #4303 @@ -3518,7 +3538,7 @@ * Dev - Made the default test source folders support the system tmp folder. #25923 * Dev - Add cart & checkout block/shortcode info to tracker data. #25932 * Dev - Make WC_Product_Data_Store_CPT::update_product_stock operations atomic. #26039 -* Dev - Adds usage data for the of cart & checkout blocks (currently in development in WooCommerce Blocks plugin) to the WC Tracker snapshot. #26084 +* Dev - Adds usage data for the of cart & checkout blocks (currently in development in WooCommmerce Blocks plugin) to the WC Tracker snapshot. #26084 * Dev - Implement some additional tracks for coupons, orders, and products. #26085 = 4.0.4 2022-03-10 = @@ -3696,7 +3716,7 @@ * Tweak - Cache checkout fragments and update DOM on change only. #24227 * Tweak - Eliminate extra update order AJAX request on checkout page load. #24271 * Tweak - Prevent billing address from being updated on shipping update. #24374 -* Tweak - Added a tooltip in the "Coupon expiry date" field. #24749 +* Tweak - Added a tooltip in the "Coupon expity date" field. #24749 * Tweak - Make phone numbers clickable in emails. #24786 * Tweak - Prevent PHP warnings in tracker if order doesn't have a created date yet. #24846 * Tweak - Capitalize "T" in "Move to Trash" phrase on order page in wp-admin to be consistent with product and coupon pages. #24867 @@ -3802,7 +3822,7 @@ * Tweak - Prevent filter per category while exporting product variations. #24517 * Tweak - Better wording for subtotal of items in cart and review order. #24440 * Tweak - Prevent new lines in product quantity in checkout details. #24311 -* Tweak - Add a tooltip in the "Coupon expiry date" field. #24749 +* Tweak - Add a tooltip in the "Coupon expity date" field. #24749 * Tweak - CSS styling changes for WP 5.3. #24832 * Template - Moved HTML for displaying product price filter widget to a new template `product price filter widget`. #23384 * Accessibility - Make $subtext color darker. #24739 From 076f6f28390decadff5f329a4134cec44e45db1a Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 4 Nov 2022 15:29:25 +0100 Subject: [PATCH 0050/1680] Add missing Ukrainian Subdivisions to States.php (#35493) Co-authored-by: Corey Gehrke --- plugins/woocommerce/changelog/pr-34834 | 4 + plugins/woocommerce/i18n/states.php | 53 +-- .../tests/data/data-crud.test.js | 318 ++++++++++-------- 3 files changed, 209 insertions(+), 166 deletions(-) create mode 100644 plugins/woocommerce/changelog/pr-34834 diff --git a/plugins/woocommerce/changelog/pr-34834 b/plugins/woocommerce/changelog/pr-34834 new file mode 100644 index 00000000000..8e62b02db29 --- /dev/null +++ b/plugins/woocommerce/changelog/pr-34834 @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Added Ukrainian subdivisions. diff --git a/plugins/woocommerce/i18n/states.php b/plugins/woocommerce/i18n/states.php index dfe5a790fed..b43d34cd698 100644 --- a/plugins/woocommerce/i18n/states.php +++ b/plugins/woocommerce/i18n/states.php @@ -1808,31 +1808,34 @@ return array( 'RSVO' => _x( 'Vojvodina', 'district', 'woocommerce' ), ), 'SE' => array(), - 'UA' => array( // Ukrainian oblasts. - 'VN' => __( 'Vinnytsia Oblast', 'woocommerce' ), - 'VL' => __( 'Volyn Oblast', 'woocommerce' ), - 'DP' => __( 'Dnipropetrovsk Oblast', 'woocommerce' ), - 'DT' => __( 'Donetsk Oblast', 'woocommerce' ), - 'ZT' => __( 'Zhytomyr Oblast', 'woocommerce' ), - 'ZK' => __( 'Zakarpattia Oblast', 'woocommerce' ), - 'ZP' => __( 'Zaporizhzhia Oblast', 'woocommerce' ), - 'IF' => __( 'Ivano-Frankivsk Oblast', 'woocommerce' ), - 'KV' => __( 'Kyiv Oblast', 'woocommerce' ), - 'KH' => __( 'Kirovohrad Oblast', 'woocommerce' ), - 'LH' => __( 'Luhansk Oblast', 'woocommerce' ), - 'LV' => __( 'Lviv Oblast', 'woocommerce' ), - 'MY' => __( 'Mykolaiv Oblast', 'woocommerce' ), - 'OD' => __( 'Odessa Oblast', 'woocommerce' ), - 'PL' => __( 'Poltava Oblast', 'woocommerce' ), - 'RV' => __( 'Rivne Oblast', 'woocommerce' ), - 'SM' => __( 'Sumy Oblast', 'woocommerce' ), - 'TP' => __( 'Ternopil Oblast', 'woocommerce' ), - 'KK' => __( 'Kharkiv Oblast', 'woocommerce' ), - 'KS' => __( 'Kherson Oblast', 'woocommerce' ), - 'KM' => __( 'Khmelnytskyi Oblast', 'woocommerce' ), - 'CK' => __( 'Cherkasy Oblast', 'woocommerce' ), - 'CH' => __( 'Chernihiv Oblast', 'woocommerce' ), - 'CV' => __( 'Chernivtsi Oblast', 'woocommerce' ), + 'UA' => array( // Ukrainian oblasts. https://github.com/unicode-org/cldr/blob/release-42/common/subdivisions/en.xml#L5243. + 'UA05' => __( 'Vinnychchyna', 'woocommerce' ), + 'UA07' => __( 'Volyn', 'woocommerce' ), + 'UA09' => __( 'Luhanshchyna', 'woocommerce' ), + 'UA12' => __( 'Dnipropetrovshchyna', 'woocommerce' ), + 'UA14' => __( 'Donechchyna', 'woocommerce' ), + 'UA18' => __( 'Zhytomyrshchyna', 'woocommerce' ), + 'UA21' => __( 'Zakarpattia', 'woocommerce' ), + 'UA23' => __( 'Zaporizhzhya', 'woocommerce' ), + 'UA26' => __( 'Prykarpattia', 'woocommerce' ), + 'UA30' => __( 'Kyiv', 'woocommerce' ), + 'UA32' => __( 'Kyivshchyna', 'woocommerce' ), + 'UA35' => __( 'Kirovohradschyna', 'woocommerce' ), + 'UA40' => __( 'Sevastopol', 'woocommerce' ), + 'UA43' => __( 'Crimea', 'woocommerce' ), + 'UA46' => __( 'Lvivshchyna', 'woocommerce' ), + 'UA48' => __( 'Mykolayivschyna', 'woocommerce' ), + 'UA51' => __( 'Odeshchyna', 'woocommerce' ), + 'UA53' => __( 'Poltavshchyna', 'woocommerce' ), + 'UA56' => __( 'Rivnenshchyna', 'woocommerce' ), + 'UA59' => __( 'Sumshchyna', 'woocommerce' ), + 'UA61' => __( 'Ternopilshchyna', 'woocommerce' ), + 'UA63' => __( 'Kharkivshchyna', 'woocommerce' ), + 'UA65' => __( 'Khersonshchyna', 'woocommerce' ), + 'UA68' => __( 'Khmelnychchyna', 'woocommerce' ), + 'UA71' => __( 'Cherkashchyna', 'woocommerce' ), + 'UA74' => __( 'Chernihivshchyna', 'woocommerce' ), + 'UA77' => __( 'Chernivtsi Oblast', 'woocommerce' ), ), 'UG' => array( // Ugandan districts. 'UG314' => __( 'Abim', 'woocommerce' ), diff --git a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js index 824c248d6bb..fd75cca644b 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js @@ -7612,99 +7612,111 @@ test.describe('Data API tests', () => { "thousand_sep": " ", "weight_unit": "kg", "states": [{ - "code": "VN", - "name": "Vinnytsia Oblast" + "code": "UA05", + "name": "Vinnychchyna" }, { - "code": "VL", - "name": "Volyn Oblast" + "code": "UA07", + "name": "Volyn" }, { - "code": "DP", - "name": "Dnipropetrovsk Oblast" + "code": "UA09", + "name": "Luhanshchyna" }, { - "code": "DT", - "name": "Donetsk Oblast" + "code": "UA12", + "name": "Dnipropetrovshchyna" }, { - "code": "ZT", - "name": "Zhytomyr Oblast" + "code": "UA14", + "name": "Donechchyna" }, { - "code": "ZK", - "name": "Zakarpattia Oblast" + "code": "UA18", + "name": "Zhytomyrshchyna" }, { - "code": "ZP", - "name": "Zaporizhzhia Oblast" + "code": "UA21", + "name": "Zakarpattia" }, { - "code": "IF", - "name": "Ivano-Frankivsk Oblast" + "code": "UA23", + "name": "Zaporizhzhya" }, { - "code": "KV", - "name": "Kyiv Oblast" + "code": "UA26", + "name": "Prykarpattia" }, { - "code": "KH", - "name": "Kirovohrad Oblast" + "code": "UA30", + "name": "Kyiv" }, { - "code": "LH", - "name": "Luhansk Oblast" + "code": "UA32", + "name": "Kyivshchyna" }, { - "code": "LV", - "name": "Lviv Oblast" + "code": "UA35", + "name": "Kirovohradschyna" }, { - "code": "MY", - "name": "Mykolaiv Oblast" + "code": "UA40", + "name": "Sevastopol" }, { - "code": "OD", - "name": "Odessa Oblast" + "code": "UA43", + "name": "Crimea" }, { - "code": "PL", - "name": "Poltava Oblast" + "code": "UA46", + "name": "Lvivshchyna" }, { - "code": "RV", - "name": "Rivne Oblast" + "code": "UA48", + "name": "Mykolayivschyna" }, { - "code": "SM", - "name": "Sumy Oblast" + "code": "UA51", + "name": "Odeshchyna" }, { - "code": "TP", - "name": "Ternopil Oblast" + "code": "UA53", + "name": "Poltavshchyna" }, { - "code": "KK", - "name": "Kharkiv Oblast" + "code": "UA56", + "name": "Rivnenshchyna" }, { - "code": "KS", - "name": "Kherson Oblast" + "code": "UA59", + "name": "Sumshchyna" }, { - "code": "KM", - "name": "Khmelnytskyi Oblast" + "code": "UA61", + "name": "Ternopilshchyna" }, { - "code": "CK", - "name": "Cherkasy Oblast" + "code": "UA63", + "name": "Kharkivshchyna" }, { - "code": "CH", - "name": "Chernihiv Oblast" + "code": "UA65", + "name": "Khersonshchyna" }, { - "code": "CV", + "code": "UA68", + "name": "Khmelnychchyna" + }, + { + "code": "UA71", + "name": "Cherkashchyna" + }, + { + "code": "UA74", + "name": "Chernihivshchyna" + }, + { + "code": "UA77", "name": "Chernivtsi Oblast" } ] @@ -13307,99 +13319,111 @@ test.describe('Data API tests', () => { "thousand_sep": " ", "weight_unit": "kg", "states": [{ - "code": "VN", - "name": "Vinnytsia Oblast" + "code": "UA05", + "name": "Vinnychchyna" + }, + { + "code": "UA07", + "name": "Volyn" }, { - "code": "VL", - "name": "Volyn Oblast" + "code": "UA09", + "name": "Luhanshchyna" }, { - "code": "DP", - "name": "Dnipropetrovsk Oblast" + "code": "UA12", + "name": "Dnipropetrovshchyna" }, { - "code": "DT", - "name": "Donetsk Oblast" + "code": "UA14", + "name": "Donechchyna" }, { - "code": "ZT", - "name": "Zhytomyr Oblast" + "code": "UA18", + "name": "Zhytomyrshchyna" }, { - "code": "ZK", - "name": "Zakarpattia Oblast" + "code": "UA21", + "name": "Zakarpattia" }, { - "code": "ZP", - "name": "Zaporizhzhia Oblast" + "code": "UA23", + "name": "Zaporizhzhya" }, { - "code": "IF", - "name": "Ivano-Frankivsk Oblast" + "code": "UA26", + "name": "Prykarpattia" }, { - "code": "KV", - "name": "Kyiv Oblast" + "code": "UA30", + "name": "Kyiv" }, { - "code": "KH", - "name": "Kirovohrad Oblast" + "code": "UA32", + "name": "Kyivshchyna" }, { - "code": "LH", - "name": "Luhansk Oblast" + "code": "UA35", + "name": "Kirovohradschyna" }, { - "code": "LV", - "name": "Lviv Oblast" + "code": "UA40", + "name": "Sevastopol" }, { - "code": "MY", - "name": "Mykolaiv Oblast" + "code": "UA43", + "name": "Crimea" }, { - "code": "OD", - "name": "Odessa Oblast" + "code": "UA46", + "name": "Lvivshchyna" }, { - "code": "PL", - "name": "Poltava Oblast" + "code": "UA48", + "name": "Mykolayivschyna" }, { - "code": "RV", - "name": "Rivne Oblast" + "code": "UA51", + "name": "Odeshchyna" }, { - "code": "SM", - "name": "Sumy Oblast" + "code": "UA53", + "name": "Poltavshchyna" }, { - "code": "TP", - "name": "Ternopil Oblast" + "code": "UA56", + "name": "Rivnenshchyna" }, { - "code": "KK", - "name": "Kharkiv Oblast" + "code": "UA59", + "name": "Sumshchyna" }, { - "code": "KS", - "name": "Kherson Oblast" + "code": "UA61", + "name": "Ternopilshchyna" }, { - "code": "KM", - "name": "Khmelnytskyi Oblast" + "code": "UA63", + "name": "Kharkivshchyna" }, { - "code": "CK", - "name": "Cherkasy Oblast" + "code": "UA65", + "name": "Khersonshchyna" }, { - "code": "CH", - "name": "Chernihiv Oblast" + "code": "UA68", + "name": "Khmelnychchyna" }, { - "code": "CV", + "code": "UA71", + "name": "Cherkashchyna" + }, + { + "code": "UA74", + "name": "Chernihivshchyna" + }, + { + "code": "UA77", "name": "Chernivtsi Oblast" } ] @@ -23992,99 +24016,111 @@ test.describe('Data API tests', () => { "code": "UA", "name": "Ukraine", "states": [{ - "code": "VN", - "name": "Vinnytsia Oblast" + "code": "UA05", + "name": "Vinnychchyna" + }, + { + "code": "UA07", + "name": "Volyn" }, { - "code": "VL", - "name": "Volyn Oblast" + "code": "UA09", + "name": "Luhanshchyna" }, { - "code": "DP", - "name": "Dnipropetrovsk Oblast" + "code": "UA12", + "name": "Dnipropetrovshchyna" }, { - "code": "DT", - "name": "Donetsk Oblast" + "code": "UA14", + "name": "Donechchyna" }, { - "code": "ZT", - "name": "Zhytomyr Oblast" + "code": "UA18", + "name": "Zhytomyrshchyna" }, { - "code": "ZK", - "name": "Zakarpattia Oblast" + "code": "UA21", + "name": "Zakarpattia" }, { - "code": "ZP", - "name": "Zaporizhzhia Oblast" + "code": "UA23", + "name": "Zaporizhzhya" }, { - "code": "IF", - "name": "Ivano-Frankivsk Oblast" + "code": "UA26", + "name": "Prykarpattia" }, { - "code": "KV", - "name": "Kyiv Oblast" + "code": "UA30", + "name": "Kyiv" }, { - "code": "KH", - "name": "Kirovohrad Oblast" + "code": "UA32", + "name": "Kyivshchyna" }, { - "code": "LH", - "name": "Luhansk Oblast" + "code": "UA35", + "name": "Kirovohradschyna" }, { - "code": "LV", - "name": "Lviv Oblast" + "code": "UA40", + "name": "Sevastopol" }, { - "code": "MY", - "name": "Mykolaiv Oblast" + "code": "UA43", + "name": "Crimea" }, { - "code": "OD", - "name": "Odessa Oblast" + "code": "UA46", + "name": "Lvivshchyna" }, { - "code": "PL", - "name": "Poltava Oblast" + "code": "UA48", + "name": "Mykolayivschyna" }, { - "code": "RV", - "name": "Rivne Oblast" + "code": "UA51", + "name": "Odeshchyna" }, { - "code": "SM", - "name": "Sumy Oblast" + "code": "UA53", + "name": "Poltavshchyna" }, { - "code": "TP", - "name": "Ternopil Oblast" + "code": "UA56", + "name": "Rivnenshchyna" }, { - "code": "KK", - "name": "Kharkiv Oblast" + "code": "UA59", + "name": "Sumshchyna" }, { - "code": "KS", - "name": "Kherson Oblast" + "code": "UA61", + "name": "Ternopilshchyna" }, { - "code": "KM", - "name": "Khmelnytskyi Oblast" + "code": "UA63", + "name": "Kharkivshchyna" }, { - "code": "CK", - "name": "Cherkasy Oblast" + "code": "UA65", + "name": "Khersonshchyna" }, { - "code": "CH", - "name": "Chernihiv Oblast" + "code": "UA68", + "name": "Khmelnychchyna" }, { - "code": "CV", + "code": "UA71", + "name": "Cherkashchyna" + }, + { + "code": "UA74", + "name": "Chernihivshchyna" + }, + { + "code": "UA77", "name": "Chernivtsi Oblast" } ], From ce133089b90306900711055e9c81f17d3f61941f Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Fri, 4 Nov 2022 09:11:26 -0700 Subject: [PATCH 0051/1680] Fix random failing changelog entry (#35425) --- .github/workflows/cherry-pick.yml | 68 +++++++++++++++---------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/cherry-pick.yml b/.github/workflows/cherry-pick.yml index 81071f1e5ef..d9a22a4fb85 100644 --- a/.github/workflows/cherry-pick.yml +++ b/.github/workflows/cherry-pick.yml @@ -211,45 +211,45 @@ jobs: if ( changelogEntry.match( /comment:/i ) ) { changelogEntry = false; } - } ); - if ( changelogEntry === false ) { - continue; - } - - fs.readFile( './plugins/woocommerce/readme.txt', 'utf-8', function( err, data ) { - if ( err ) { - console.error( err ); + if ( ! changelogEntry ) { + return; } - changelogTxt = data.split( "\n" ); - let isInRange = false; - let newChangelogTxt = []; - - for ( const line of changelogTxt ) { - if ( isInRange === false && line === '== Changelog ==' ) { - isInRange = true; - } - - if ( isInRange === true && line.match( /\*\*WooCommerce Blocks/ ) ) { - isInRange = false; - } - - // Find the first match of the entry "Type". - if ( isInRange && line.match( `\\* ${changelogEntryType} -` ) ) { - newChangelogTxt.push( '* ' + changelogEntryType + ' - ' + changelogEntry + ` [#${{ needs.prep.outputs.pr }}](https://github.com/woocommerce/woocommerce/pull/${{ needs.prep.outputs.pr }})` ); - newChangelogTxt.push( line ); - isInRange = false; - continue; - } - - newChangelogTxt.push( line ); - } - - fs.writeFile( './plugins/woocommerce/readme.txt', newChangelogTxt.join( "\n" ), err => { + fs.readFile( './plugins/woocommerce/readme.txt', 'utf-8', function( err, data ) { if ( err ) { - console.error( `Unable to generate the changelog entry for PR ${{ needs.prep.outputs.pr }}` ); + console.error( err ); } + + changelogTxt = data.split( "\n" ); + let isInRange = false; + let newChangelogTxt = []; + + for ( const line of changelogTxt ) { + if ( isInRange === false && line === '== Changelog ==' ) { + isInRange = true; + } + + if ( isInRange === true && line.match( /\*\*WooCommerce Blocks/ ) ) { + isInRange = false; + } + + // Find the first match of the entry "Type". + if ( isInRange && line.match( `\\* ${changelogEntryType} -` ) ) { + newChangelogTxt.push( '* ' + changelogEntryType + ' - ' + changelogEntry + ` [#${{ needs.prep.outputs.pr }}](https://github.com/woocommerce/woocommerce/pull/${{ needs.prep.outputs.pr }})` ); + newChangelogTxt.push( line ); + isInRange = false; + continue; + } + + newChangelogTxt.push( line ); + } + + fs.writeFile( './plugins/woocommerce/readme.txt', newChangelogTxt.join( "\n" ), err => { + if ( err ) { + console.error( `Unable to generate the changelog entry for PR ${{ needs.prep.outputs.pr }}` ); + } + } ); } ); } ); } From 082f318da47b78497f7e2ba754757369ef706499 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Fri, 4 Nov 2022 13:35:19 -0500 Subject: [PATCH 0052/1680] [HPOS] Add order data store info to SSR (#35487) Add info on order datastore (and sync) to SSR * Add changelog * Make PHPCS happy * Update plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php Co-authored-by: Barry Hughes <3594411+barryhughes@users.noreply.github.com> * Remove unnecessary import Co-authored-by: Barry Hughes <3594411+barryhughes@users.noreply.github.com> --- .../changelog/add-34864-order-data-store-in-ssr | 4 ++++ .../admin/views/html-admin-page-status-report.php | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-34864-order-data-store-in-ssr diff --git a/plugins/woocommerce/changelog/add-34864-order-data-store-in-ssr b/plugins/woocommerce/changelog/add-34864-order-data-store-in-ssr new file mode 100644 index 00000000000..63ceec99d1b --- /dev/null +++ b/plugins/woocommerce/changelog/add-34864-order-data-store-in-ssr @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Include order datastore information in status report. diff --git a/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php b/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php index d0d652a6c07..1d9b77524dc 100644 --- a/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php +++ b/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php @@ -7,6 +7,7 @@ use Automattic\Jetpack\Constants; use Automattic\WooCommerce\Internal\ProductDownloads\ApprovedDirectories\Register as Download_Directories; +use Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer as Order_DataSynchronizer; defined( 'ABSPATH' ) || exit; @@ -762,6 +763,18 @@ if ( 0 < count( $dropins_mu_plugins['mu_plugins'] ) ) : get( Download_Directories::class )->get_mode() === Download_Directories::MODE_ENABLED ? '' : ''; ?> + + + + get_current_class_name() ); ?> + + get( Automattic\WooCommerce\Internal\Features\FeaturesController::class )->feature_is_enabled( 'custom_order_tables' ) ) : ?> + + + + get( Order_DataSynchronizer::class )->data_sync_is_enabled() ? '' : ''; ?> + + From 254fbd994f152d68aacd0b38ee0e18b522b92834 Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Fri, 4 Nov 2022 11:39:13 -0700 Subject: [PATCH 0053/1680] Remove post merge comment about adding testing instructions (#35498) --- .github/workflows/pull-request-post-merge-processing.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.github/workflows/pull-request-post-merge-processing.yml b/.github/workflows/pull-request-post-merge-processing.yml index 62705adf07f..9ce002c31b6 100644 --- a/.github/workflows/pull-request-post-merge-processing.yml +++ b/.github/workflows/pull-request-post-merge-processing.yml @@ -37,8 +37,3 @@ jobs: env: PULL_REQUEST_ID: ${{ github.event.pull_request.node_id }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - name: "Run the script to post a comment with next steps hint" - run: php add-post-merge-comment.php - env: - PULL_REQUEST_ID: ${{ github.event.pull_request.node_id }} - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 17fe37cafe40df624fc0200699744fdbf2bb4b59 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Sat, 5 Nov 2022 22:03:00 -0400 Subject: [PATCH 0054/1680] Update DateTimePickerControl's popover styling to work with slot-fill (#35343) * Tweak CSS styling of popover to accommodate usage with slot-fill * Story for DateTimePickerControl use with slot-fill * Changelog --- ...-date-time-picker-control-picker-classname | 4 +++ .../date-time-picker-control.scss | 6 ++-- .../date-time-picker-control.tsx | 3 ++ .../stories/index.tsx | 31 +++++++++++++++++-- 4 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 packages/js/components/changelog/update-date-time-picker-control-picker-classname diff --git a/packages/js/components/changelog/update-date-time-picker-control-picker-classname b/packages/js/components/changelog/update-date-time-picker-control-picker-classname new file mode 100644 index 00000000000..4f444ed8862 --- /dev/null +++ b/packages/js/components/changelog/update-date-time-picker-control-picker-classname @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix DateTimePickerControl's popover styling when slot-fill is used. diff --git a/packages/js/components/src/date-time-picker-control/date-time-picker-control.scss b/packages/js/components/src/date-time-picker-control/date-time-picker-control.scss index 4930b8c7cf8..a3df6290728 100644 --- a/packages/js/components/src/date-time-picker-control/date-time-picker-control.scss +++ b/packages/js/components/src/date-time-picker-control/date-time-picker-control.scss @@ -5,7 +5,9 @@ margin-right: 8px; } - .components-datetime__date { - border-top: 0; + &__popover { + .components-datetime__date { + border-top: 0; + } } } diff --git a/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx b/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx index b133d453ade..42832b6e800 100644 --- a/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx +++ b/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx @@ -280,6 +280,9 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { /> ) } + popoverProps={ { + className: 'woocommerce-date-time-picker-control__popover', + } } renderContent={ () => { const Picker = isDateOnlyPicker ? DatePicker : WpDateTimePicker; const inputDateTime = parseAsLocalDateTime( inputString ); diff --git a/packages/js/components/src/date-time-picker-control/stories/index.tsx b/packages/js/components/src/date-time-picker-control/stories/index.tsx index adcf77f1336..4ce10f12129 100644 --- a/packages/js/components/src/date-time-picker-control/stories/index.tsx +++ b/packages/js/components/src/date-time-picker-control/stories/index.tsx @@ -2,13 +2,13 @@ * External dependencies */ import React from 'react'; -import { Button } from '@wordpress/components'; +import { Button, Popover, SlotFillProvider } from '@wordpress/components'; import { createElement, useState } from '@wordpress/element'; /** * Internal dependencies */ -import { DateTimePickerControl } from '../'; +import { DateTimePickerControl, defaultDateFormat } from '../'; export default { title: 'WooCommerce Admin/components/DateTimePickerControl', @@ -147,3 +147,30 @@ ControlledDateOnlyEndOfDay.args = { timeForDateOnly: 'end-of-day', }; ControlledDateOnlyEndOfDay.decorators = Controlled.decorators; + +function PopoverSlotDecorator( Story, props ) { + return ( +
+ +
+ +
+ +
+
+ ); +} + +export const WithPopoverSlot = Template.bind( {} ); +WithPopoverSlot.args = { + ...Basic.args, + label: 'Start date', + placeholder: 'Enter the start date', + help: 'There is a SlotFillProvider and Popover.Slot on the page', + isDateOnlyPicker: true, +}; +WithPopoverSlot.decorators = [ PopoverSlotDecorator ]; From 4d7185ea11eb4e56b104fe76e11ecf9703b45eba Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 8 Nov 2022 11:37:01 -0800 Subject: [PATCH 0055/1680] Update changelog.txt from release 7.1.0 (#35524) * Update changelog.txt from release 7.1.0 * Add back 7.0.1 logs Co-authored-by: WooCommerce Bot Co-authored-by: roykho --- changelog.txt | 187 +++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 148 insertions(+), 39 deletions(-) diff --git a/changelog.txt b/changelog.txt index 04e7e45ae80..3c9793b7d46 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,118 @@ == Changelog == += 7.1.0 2022-11-08 = + +**WooCommerce** + +* Fix - Fix business details step when Gutenberg is active [#35448](https://github.com/woocommerce/woocommerce/pull/35448) +* Fix - Check order type is set before returning to prevent notice. [#35349](https://github.com/woocommerce/woocommerce/pull/35349) +* Fix - When HPOS is enabled, posts are authoritative, and sync is enabled, ensure the HPOS record correctly tracks the CPT order record. [#35402](https://github.com/woocommerce/woocommerce/pull/35402) +* Fix - Allow line breaks in order note again. [#35366](https://github.com/woocommerce/woocommerce/pull/35366) +* Fix - Sync orders for stats table. [#35118](https://github.com/woocommerce/woocommerce/pull/35118) +* Fix - Fix (un)trashing of orders when using HPOS [#35125](https://github.com/woocommerce/woocommerce/pull/35125) +* Fix - Check whether order has classname before returning. [#35207](https://github.com/woocommerce/woocommerce/pull/35207) +* Fix - Add billing and shipping address indexes on order update. [#35121](https://github.com/woocommerce/woocommerce/pull/35121) +* Fix - Use correct datastore when backfilling orders. [#35176](https://github.com/woocommerce/woocommerce/pull/35176) +* Fix - (HPOS) Ensure we use GMT when populating the `date_created_gmt` column for orders. [#34875](https://github.com/woocommerce/woocommerce/pull/34875) +* Fix - Admin list table for orders (in HPOS mode) should check in case the user pages beyond the available range. [#34793](https://github.com/woocommerce/woocommerce/pull/34793) +* Fix - Allow features to declare their initial enabled state. [#34867](https://github.com/woocommerce/woocommerce/pull/34867) +* Fix - Customers should be able to pay for orders so long as any required stock reductions have already taken place. [#33575](https://github.com/woocommerce/woocommerce/pull/33575) +* Fix - Do no override order defaults with NULL values (HPOS) [#34822](https://github.com/woocommerce/woocommerce/pull/34822) +* Fix - Fix "Industry" options fails to save in the Industry step after reloading the page for OBW [#34847](https://github.com/woocommerce/woocommerce/pull/34847) +* Fix - Fix a fatal error thrown by init_theorder_object due to the return type declaration [#34730](https://github.com/woocommerce/woocommerce/pull/34730) +* Fix - fixed mismatching jetpack user should not see mobile app task list item [#35052](https://github.com/woocommerce/woocommerce/pull/35052) +* Fix - Fix enable guided mode button not trigger when its text is translated [#34843](https://github.com/woocommerce/woocommerce/pull/34843) +* Fix - Fixes test environment setup setting datetime for customer user creation [#34888](https://github.com/woocommerce/woocommerce/pull/34888) +* Fix - Fix JSON schema for product's image properties. [#34852](https://github.com/woocommerce/woocommerce/pull/34852) +* Fix - Fix obw validation issue to truly disable the continue buttons [#34895](https://github.com/woocommerce/woocommerce/pull/34895) +* Fix - Fix onboarding wizard popover padding for WP6.1 [#34896](https://github.com/woocommerce/woocommerce/pull/34896) +* Fix - Fix order refund removal when the HPOS datastore is in use. [#34785](https://github.com/woocommerce/woocommerce/pull/34785) +* Fix - Handle loading and error states for magic link button [#35068](https://github.com/woocommerce/woocommerce/pull/35068) +* Fix - Implement missing method of calculating shipping and total tax. [#34805](https://github.com/woocommerce/woocommerce/pull/34805) +* Fix - Serialize meta value before rendering so that it's rendered properly. [#34952](https://github.com/woocommerce/woocommerce/pull/34952) +* Fix - Set correct timezone when backfilling data. [#35033](https://github.com/woocommerce/woocommerce/pull/35033) +* Add - Twenty Twenty-Three theme compatibility. [#35306](https://github.com/woocommerce/woocommerce/pull/35306) +* Add - Add handling for plugin-feature incompatibilities [#34879](https://github.com/woocommerce/woocommerce/pull/34879) +* Add - Add inventory stock management to new product management experience [#34984](https://github.com/woocommerce/woocommerce/pull/34984) +* Add - Add new attributes section and field for the new Product Management Experience. [#34751](https://github.com/woocommerce/woocommerce/pull/34751) +* Add - Add order preview functionality to HPOS list table. [#34770](https://github.com/woocommerce/woocommerce/pull/34770) +* Add - Add playwright api-core-tests for customers crud operations [#34945](https://github.com/woocommerce/woocommerce/pull/34945) +* Add - Add playwright api-core-tests for order notes crud operations [#34979](https://github.com/woocommerce/woocommerce/pull/34979) +* Add - Add playwright api-core-tests for product properties crud operations [#34998](https://github.com/woocommerce/woocommerce/pull/34998) +* Add - Add playwright api-core-tests for tax rates crud operations [#34960](https://github.com/woocommerce/woocommerce/pull/34960) +* Add - Add shipping class section and dropdown [#34684](https://github.com/woocommerce/woocommerce/pull/34684) +* Add - Add shipping dimensions section to product page #34329 [#34856](https://github.com/woocommerce/woocommerce/pull/34856) +* Add - Add SKU field to new product management experience [#34978](https://github.com/woocommerce/woocommerce/pull/34978) +* Add - Add the WooCommerce features engine [#34727](https://github.com/woocommerce/woocommerce/pull/34727) +* Add - Deprecate existing `wp wc cot migrate` command and replace with `wp wc cot sync`. [#34676](https://github.com/woocommerce/woocommerce/pull/34676) +* Add - Disable action buttons when product form is invalid [#34658](https://github.com/woocommerce/woocommerce/pull/34658) +* Add - Expand attributes list to display attributes list and allow removal and re-ordering. [#34841](https://github.com/woocommerce/woocommerce/pull/34841) +* Add - Images Product management [#34769](https://github.com/woocommerce/woocommerce/pull/34769) +* Add - Improve on feature incompatibility plugin screens. [#35063](https://github.com/woocommerce/woocommerce/pull/35063) +* Add - Render columns via action so that they can be hooked into. [#34900](https://github.com/woocommerce/woocommerce/pull/34900) +* Add - Support `wc_customer_bought_product` function in HPOS. [#34931](https://github.com/woocommerce/woocommerce/pull/34931) +* Add - The updates will mean that the github workflows use the playwright versions of the api-core-tests rather than the supertest versions of the tests. [#34935](https://github.com/woocommerce/woocommerce/pull/34935) +* Update - Don't show feature compatibility warnings for inactive plugins [#35333](https://github.com/woocommerce/woocommerce/pull/35333) +* Update - Update WooCommerce Blocks to 8.7.5 [#35428](https://github.com/woocommerce/woocommerce/pull/35428) +* Update - Improve the warnings about incompatibilities between plugins and features [#35198](https://github.com/woocommerce/woocommerce/pull/35198) +* Update - Additional payment methods on new WCPay promotion page (payment-welcome) [#34581](https://github.com/woocommerce/woocommerce/pull/34581) +* Update - Add Tiktok to free grow extensions list [#34953](https://github.com/woocommerce/woocommerce/pull/34953) +* Update - Allowing generic item type in new experimental SelectControl. [#34547](https://github.com/woocommerce/woocommerce/pull/34547) +* Update - Change order data store internal key to props for better representation. [#34627](https://github.com/woocommerce/woocommerce/pull/34627) +* Update - Changing inbox display to only 5 notes with the ability to load more. [#35003](https://github.com/woocommerce/woocommerce/pull/35003) +* Update - Deploy spotlight product tour treatment [#34859](https://github.com/woocommerce/woocommerce/pull/34859) +* Update - Track orders origin in WC_Tracker. [#35069](https://github.com/woocommerce/woocommerce/pull/35069) +* Update - Updates a few css selectors to be more robust [#34790](https://github.com/woocommerce/woocommerce/pull/34790) +* Update - Update WCPay promo requirements and ensure it's dismissed on every scenario [#35030](https://github.com/woocommerce/woocommerce/pull/35030) +* Dev - Add api-core-tests for playwright [#34835](https://github.com/woocommerce/woocommerce/pull/34835) +* Dev - Add fail-fast configuration to Playwright E2E tests. [#33977](https://github.com/woocommerce/woocommerce/pull/33977) +* Dev - Add new shippping class modal to a shipping class section in product page [#34937](https://github.com/woocommerce/woocommerce/pull/34937) +* Dev - Add shipping dimensions image to visualize the sizes of the product #34329 [#34857](https://github.com/woocommerce/woocommerce/pull/34857) +* Dev - Add tests for UI Revamp on Marketing Page. [#34840](https://github.com/woocommerce/woocommerce/pull/34840) +* Dev - Exclude "debug" module from babel compile to fix the tour kit stories loading error [#34831](https://github.com/woocommerce/woocommerce/pull/34831) +* Dev - Fix node and pnpm versions via engines [#34773](https://github.com/woocommerce/woocommerce/pull/34773) +* Dev - Improve the matching of plugins during the compatibility check. [#35070](https://github.com/woocommerce/woocommerce/pull/35070) +* Dev - Load size units to show it as a suffix of shipping dimensions fields #34329 [#34856](https://github.com/woocommerce/woocommerce/pull/34856) +* Dev - Match TypeScript version with syncpack [#34787](https://github.com/woocommerce/woocommerce/pull/34787) +* Dev - set the store country in the test step [#34972](https://github.com/woocommerce/woocommerce/pull/34972) +* Dev - Update Playwright to 1.26.0 and fix a few flaky tests [#34790](https://github.com/woocommerce/woocommerce/pull/34790) +* Dev - Update pnpm version constraint to 7.13.3 to avoid auto-install-peers issues [#35007](https://github.com/woocommerce/woocommerce/pull/35007) +* Tweak - Add hooks that fire before an HPOS order is deleted or trashed. [#34858](https://github.com/woocommerce/woocommerce/pull/34858) +* Tweak - Disable new-product-management-experience feature flag in development. [#34836](https://github.com/woocommerce/woocommerce/pull/34836) +* Tweak - Update copy in the payments welcome modal [#35031](https://github.com/woocommerce/woocommerce/pull/35031) +* Tweak - Update subdivision codes for New Zealand, to match current CLDR specification. [#35011](https://github.com/woocommerce/woocommerce/pull/35011) +* Tweak - When the primary order store is the posts table, and sync is enabled, propagate changes outside of dedicated migrations. [#34863](https://github.com/woocommerce/woocommerce/pull/34863) +* Performance - Support fetching order types in bulk to improve performance. [#34976](https://github.com/woocommerce/woocommerce/pull/34976) +* Enhancement - Add support for complex field queries for orders. [#34533](https://github.com/woocommerce/woocommerce/pull/34533) +* Enhancement - Also read from posts when reading from orders as a mittigation to direct write. [#34465](https://github.com/woocommerce/woocommerce/pull/34465) +* Enhancement - Enable async typeahead fields for the attribute and term fields within products. [#34744](https://github.com/woocommerce/woocommerce/pull/34744) +* Enhancement - Enchance tour experience for store location [#34697](https://github.com/woocommerce/woocommerce/pull/34697) + +**WooCommerce Blocks 8.7.0 & 8.7.1 & 8.7.2 & 8.7.3 & 8.7.4 & 8.7.5** + +* Enhancement - Improve visual consistency between block links. ([7340](https://github.com/woocommerce/woocommerce-blocks/pull/7340)) +* Enhancement - Update the titles of some inner blocks of the Cart block and remove the lock of the Cross-Sells parent block. ([7232](https://github.com/woocommerce/woocommerce-blocks/pull/7232)) +* Enhancement - Add filter for place order button label. ([7154](https://github.com/woocommerce/woocommerce-blocks/pull/7154)) +* Enhancement - Exposed data related to the checkout through wordpress/data stores. ([6612](https://github.com/woocommerce/woocommerce-blocks/pull/6612)) +* Enhancement - Add simple, large & two menus footer patterns. ([7306](https://github.com/woocommerce/woocommerce-blocks/pull/7306)) +* Enhancement - Add minimal, large, and essential header patterns. ([7292](https://github.com/woocommerce/woocommerce-blocks/pull/7292)) +* Enhancement - Add `showRemoveItemLink` as a new checkout filter to allow extensions to toggle the visibility of the `Remove item` button under each cart line item. ([7242](https://github.com/woocommerce/woocommerce-blocks/pull/7242)) +* Enhancement - Add support for a GT tracking ID for Google Analytics. ([7213](https://github.com/woocommerce/woocommerce-blocks/pull/7213)) +* Enhancement - Separate filter titles and filter controls by converting filter blocks to use Inner Blocks. ([6978](https://github.com/woocommerce/woocommerce-blocks/pull/6978)) +* Enhancement - StoreApi requests will return a `Cart-Token` header that can be used to retrieve the cart from the corresponding session via **GET** `/wc/store/v1/cart`. ([5953](https://github.com/woocommerce/woocommerce-blocks/pull/5953)) +* Fix - Fixed HTML rendering in description of active payment integrations. ([7313](https://github.com/woocommerce/woocommerce-blocks/pull/7313)) +* Fix - Hide the shipping address form from the Checkout when the "Force shipping to the customer billing address" is enabled. ([7268](https://github.com/woocommerce/woocommerce-blocks/pull/7268)) +* Fix - Fixed an error where adding new pages would cause an infinite loop and large amounts of memory use in redux. ([7256](https://github.com/woocommerce/woocommerce-blocks/pull/7256)) +* Fix - Ensure error messages containing HTML are shown correctly in the Cart and Checkout blocks. ([7231](https://github.com/woocommerce/woocommerce-blocks/pull/7231)) +* Fix - Prevent locked inner blocks from sometimes displaying twice. ([6676](https://github.com/woocommerce/woocommerce-blocks/pull/6676)) +* Fix - StoreApi `/checkout` endpoint now returns HTTP 402 instead of HTTP 400 when payment fails. ([7273](https://github.com/woocommerce/woocommerce-blocks/pull/7273)) +* Fix - Fix a problem that causes an infinite loop when inserting Cart block in wordpress.com. ([7367](https://github.com/woocommerce/woocommerce-blocks/pull/7367)) +* Fix - Fixed an issue where JavaScript errors would occur when more than one extension tried to filter specific payment methods in the Cart and Checkout blocks. ([7377](https://github.com/woocommerce/woocommerce-blocks/pull/7377)) +* Fix - Fixed a problem where Custom Order Tables compatibility declaration could fail due to the unpredictable plugin order load. ([7395](https://github.com/woocommerce/woocommerce-blocks/pull/7395)) +* Fix - Refactor useCheckoutAddress hook to enable "Use same address for billing" option in Editor ([7393](https://github.com/woocommerce/woocommerce-blocks/pull/7393)) +* Fix - Fixed an issue where the argument passed to `canMakePayment` contained the incorrect keys. Also fixed the current user's customer data appearing in the editor when editing the Checkout block. +* Fix - Compatibility fix for Cart and Checkout inner blocks for WordPress 6.1. + = 7.0.1 2022-11-01 = **WooCommerce** @@ -67,6 +180,7 @@ * Add - Support order searches as an integral part of how (COT) order queries work. [#34405](https://github.com/woocommerce/woocommerce/pull/34405) * Add - UI Revamp on Marketing Page with feature toggle. [#34642](https://github.com/woocommerce/woocommerce/pull/34642) * Add - Woo Mobile Welcome Page with Magic Link feature [#34637](https://github.com/woocommerce/woocommerce/pull/34637) +* Update - Update WooCommerce Blocks to 8.5.1 [#34807](https://github.com/woocommerce/woocommerce/pull/34807) * Update - Updates tracking parameters for marketing messages of mobile apps in New order mail. [#34717](https://github.com/woocommerce/woocommerce/pull/34717) * Update - Add an empty list of states for Saint Martin (French part) [#34521](https://github.com/woocommerce/woocommerce/pull/34521) * Update - Add Wish and Walmart to the platform options [#34541](https://github.com/woocommerce/woocommerce/pull/34541) @@ -187,7 +301,7 @@ * Fix - Minor changes to address Typescript errors after updating TS definitions [#34154](https://github.com/woocommerce/woocommerce/pull/34154) * Fix - Refactored homescreen component to use useQuery hook [#34183](https://github.com/woocommerce/woocommerce/pull/34183) * Fix - Support Cart/Checkout/My accounts/Terms settings in WC REST API [#34234](https://github.com/woocommerce/woocommerce/pull/34234) -* Fix - Use the default paymetn suggestions when woocommerce_show_marketplace_suggestions is set to no [#34083](https://github.com/woocommerce/woocommerce/pull/34083) +* Fix - Use the default payment suggestions when woocommerce_show_marketplace_suggestions is set to no [#34083](https://github.com/woocommerce/woocommerce/pull/34083) * Fix - Wrap default payment gateway strings in __() function call [#33987](https://github.com/woocommerce/woocommerce/pull/33987) * Add - Add default styles for block themes to ensure WooCommerce looks better out of the box with block themes that are not optimized for WooCommerce specifically. [#33518](https://github.com/woocommerce/woocommerce/pull/33518) * Add - Added tour for store location [#34137](https://github.com/woocommerce/woocommerce/pull/34137) @@ -260,8 +374,9 @@ * Enhancement - Reduce the amount of terms shown in attributes page [#33962](https://github.com/woocommerce/woocommerce/pull/33962) * Enhancement - Use method_exists instead of throwing in AbstractServiceProvider::reflect_class_or_callable [#33960](https://github.com/woocommerce/woocommerce/pull/33960) -**WooCommerce Blocks 8.1.0 & 8.2.0 & 8.2.1 & 8.3.0 & 8.3.1** +**WooCommerce Blocks 8.1.0 & 8.2.0 & 8.2.1 & 8.3.0 & 8.3.1 & 8.3.2** +* Enhancement - Add feedback box to the Cart & Checkout Inner Blocks in the inspector. ([6881](https://github.com/woocommerce/woocommerce-blocks/pull/6881)) * Enhancement - Enable the Cart and Checkout blocks when WooCommerce Blocks is bundled in WooCommerce Core.([6805](https://github.com/woocommerce/woocommerce-blocks/pull/6805)) * Enhancement - Refactor style-attributes hooks to add as global custom imports and remove relative import paths.([6870](https://github.com/woocommerce/woocommerce-blocks/pull/6870)) * Enhancement - Add the ability to register patterns by adding them under the "patterns" folder and add the new "WooCommerce Filters" pattern.([6861](https://github.com/woocommerce/woocommerce-blocks/pull/6861)) @@ -270,11 +385,8 @@ * Enhancement - Add filter URL support to filter blocks when filtering for All Products block.([6642](https://github.com/woocommerce/woocommerce-blocks/pull/6642)) * Enhancement - Add: Allow choosing between single and multiple sections.([6620](https://github.com/woocommerce/woocommerce-blocks/pull/6620)) * Enhancement - Cart endpoint for Store API (/wc/store/cart) now features cross-sell items based on cart contents.([6635](https://github.com/woocommerce/woocommerce-blocks/pull/6635)) -* Enhancement - Add feedback box to the Cart & Checkout Inner Blocks in the inspector. ([6881](https://github.com/woocommerce/woocommerce-blocks/pull/6881)) -* Enhancement - Refactor style-attributes hooks to add as global custom imports and remove relative import paths. ([6870](https://github.com/woocommerce/woocommerce-blocks/pull/6870)) -* Enhancement - Add notice to Cart and Checkout blocks' inspector controls which links to the list of compatible plugins. ([6869](https://github.com/woocommerce/woocommerce-blocks/pull/6869)) -* Enhancement - Add the ability to register patterns by adding them under the "patterns" folder and add the new "WooCommerce Filters" pattern. ([6861](https://github.com/woocommerce/woocommerce-blocks/pull/6861)) -* Enhancement - Enable the Cart and Checkout blocks when WooCommerce Blocks is bundled in WooCommerce Core. ([6805](https://github.com/woocommerce/woocommerce-blocks/pull/6805)) +* Fix - Fix Best Selling Products block ordering ([7025](https://github.com/woocommerce/woocommerce-blocks/pull/7025)) +* Fix - Prevent unnecessarily showing the item names in a shipping package if it's the only package. ([6899](https://github.com/woocommerce/woocommerce-blocks/pull/6899)) * Fix - Refactor Product Categories block to use block.json.([6875](https://github.com/woocommerce/woocommerce-blocks/pull/6875)) * Fix - Add font-weight controls to the Mini Cart block text.([6760](https://github.com/woocommerce/woocommerce-blocks/pull/6760)) * Fix - Fix proceed to checkout button not working for custom links.([6804](https://github.com/woocommerce/woocommerce-blocks/pull/6804)) @@ -286,10 +398,7 @@ * Fix - Fixes an issue where search lists would not preserve the case of the original item.([6551](https://github.com/woocommerce/woocommerce-blocks/pull/6551)) * Fix - Prevent Featured Product block from breaking when product is out of stock + hidden from catalog.([6640](https://github.com/woocommerce/woocommerce-blocks/pull/6640)) * Fix - Contrast improvement for checkout error messages when displayed over a theme's dark mode.([6292](https://github.com/woocommerce/woocommerce-blocks/pull/6292)) -* Fix - Refactor Product Categories block to use block.json. ([6875](https://github.com/woocommerce/woocommerce-blocks/pull/6875)) -* Fix - Fix: Update billing address when shipping address gets change in shipping calculator at Cart block. ([6823](https://github.com/woocommerce/woocommerce-blocks/pull/6823)) -* Fix - Fix: Add font-weight controls to the Mini Cart block text. ([6760](https://github.com/woocommerce/woocommerce-blocks/pull/6760)) -* Fix - Prevent unnecessarily showing the item names in a shipping package if it's the only package. ([6899](https://github.com/woocommerce/woocommerce-blocks/pull/6899)) + = 6.8.0 2022-08-09 = **WooCommerce** @@ -341,9 +450,9 @@ * Update - Implement bulk actions in the new orders admin list table. [#33687](https://github.com/woocommerce/woocommerce/pull/33687) * Update - Making default state of product image meta boxes more prominent. [#33707](https://github.com/woocommerce/woocommerce/pull/33707) * Update - Randomize the order of sections in Recommended Marketing Extensions [#33851](https://github.com/woocommerce/woocommerce/pull/33851) -* Update - Removed two-col task list expierments code [#33643](https://github.com/woocommerce/woocommerce/pull/33643) +* Update - Removed two-col task list experiments code [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Update - Remove legacy image sizes [#33772](https://github.com/woocommerce/woocommerce/pull/33772) -* Update - Set ddefault shipping methods when store country is the US and Jetpack is intalled [#33788](https://github.com/woocommerce/woocommerce/pull/33788) +* Update - Set default shipping methods when store country is the US and Jetpack is installed [#33788](https://github.com/woocommerce/woocommerce/pull/33788) * Update - Set smart shipping feature flags to true [#33819](https://github.com/woocommerce/woocommerce/pull/33819) * Update - Update display shipping task logic and add ReviewShippingOptions task [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Update - Update review shipping options task complete logic [#33650](https://github.com/woocommerce/woocommerce/pull/33650) @@ -352,7 +461,7 @@ * Update - Update wcpay suggestion UI in payment task [#33717](https://github.com/woocommerce/woocommerce/pull/33717) * Update - Update wcpay to include a mention of in-person payments for Canada [#33669](https://github.com/woocommerce/woocommerce/pull/33669) * Update - Update WooCommerce Blocks to 8.0.0 [#33736](https://github.com/woocommerce/woocommerce/pull/33736) -* Update - Uses WC_Data_Store directly to count the shipping zones to avoid any unncessary query to the D.B [#33643](https://github.com/woocommerce/woocommerce/pull/33643) +* Update - Uses WC_Data_Store directly to count the shipping zones to avoid any unnecessary query to the D.B [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Dev - Add playwright e2e README.md [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Dev - Add `$transaction_id` as arg to various `payment_complete` hooks. [#33643](https://github.com/woocommerce/woocommerce/pull/33643) * Dev - Add `wc com extension install` CLI command [#33775](https://github.com/woocommerce/woocommerce/pull/33775) @@ -425,10 +534,10 @@ * Fix - Fix broken design of Single Product template in block themes when product had no reviews or additional info [#33329](https://github.com/woocommerce/woocommerce/pull/33329) * Fix - Clean up unused remote inbox notifications option [#33373](https://github.com/woocommerce/woocommerce/pull/33373) * Fix - Settings: fix Tracks event when enabling/disabling advanced features settings. [#33305](https://github.com/woocommerce/woocommerce/pull/33305) -* Fix - Fix accidently deleted method during merge for 33034. [#33142](https://github.com/woocommerce/woocommerce/pull/33142) +* Fix - Fix accidentally deleted method during merge for 33034. [#33142](https://github.com/woocommerce/woocommerce/pull/33142) * Fix - Fix the styling of the frame in the Leaderboard section of Analytics. [#33163](https://github.com/woocommerce/woocommerce/pull/33163) * Fix - Fix obw free extension rules for the marketing task with php 8 [#33329](https://github.com/woocommerce/woocommerce/pull/33329) -* Fix - Fix product tour splotlight location [#33329](https://github.com/woocommerce/woocommerce/pull/33329) +* Fix - Fix product tour spotlight location [#33329](https://github.com/woocommerce/woocommerce/pull/33329) * Fix - Fix product tour TypeError when reading innerHTML [#33448](https://github.com/woocommerce/woocommerce/pull/33448) * Fix - Fix: Content width issue and Classic Template blocks alignment issue for Twenty Twenty-Two. [#33329](https://github.com/woocommerce/woocommerce/pull/33329) * Fix - Fix typos in various cot migration messages. [#33329](https://github.com/woocommerce/woocommerce/pull/33329) @@ -548,7 +657,7 @@ * Dev - Remove the post_id column from the orders table, and adjust the SQL queries that count/get out of sync orders accordingly. [#32706](https://github.com/woocommerce/woocommerce/pull/32706) * Dev - Update woo admin ts config to have an isolated TS environment [#32616](https://github.com/woocommerce/woocommerce/pull/32616) * Dev - Updating scripts to use pnpm/Nx commands [#32943](https://github.com/woocommerce/woocommerce/pull/32943) -* Dev - Remove woo tracks type declaration from woo admin ./cleint. [#32937](https://github.com/woocommerce/woocommerce/pull/32937) +* Dev - Remove woo tracks type declaration from woo admin ./client. [#32937](https://github.com/woocommerce/woocommerce/pull/32937) * Dev - Fix react admin ./client type errors after updating @woocommerce/data types [#32735](https://github.com/woocommerce/woocommerce/pull/32735) * Dev - Removed temporary codepath added in #32603 since translation paths have been updated [#33226](https://github.com/woocommerce/woocommerce/pull/33226) * Enhancement - Add fallback image for payments task gateway icons [#32773](https://github.com/woocommerce/woocommerce/pull/32773) @@ -593,12 +702,12 @@ * Performance - Fix system status API requests that only query some fields [#32823](https://github.com/woocommerce/woocommerce/pull/32823) * Tweak - For Vietnam, the second street address line should be displayed but not required. [#32610](https://github.com/woocommerce/woocommerce/pull/32610) * Tweak - Comment: We're adding extra protections to a newly introduced feature; a further changelog entry is not needed. [#32771](https://github.com/woocommerce/woocommerce/pull/32771) -* Tweak - Fix spacing between the Paymetn logo assets in the payment banner experiment. [#33065](https://github.com/woocommerce/woocommerce/pull/33065) +* Tweak - Fix spacing between the payment logo assets in the payment banner experiment. [#33065](https://github.com/woocommerce/woocommerce/pull/33065) * Tweak - Comment: Omitting a changelog entry, because we're correcting an unreleased oversight. [#32744](https://github.com/woocommerce/woocommerce/pull/32744) * Tweak - Update TikTok onboarding icon [#32857](https://github.com/woocommerce/woocommerce/pull/32857) * Tweak - Fix typescript type errors in react admin ./client/shipping [#32688](https://github.com/woocommerce/woocommerce/pull/32688) * Tweak - Comment: Improves a newly added feature, so a further changelog entry is not required. [#32776](https://github.com/woocommerce/woocommerce/pull/32776) -* Tweak - Add wc-admin-deactivate-plugin to list of obselete notes so it gets deleted on upgrade [#32982](https://github.com/woocommerce/woocommerce/pull/32982) +* Tweak - Add wc-admin-deactivate-plugin to list of obsolete notes so it gets deleted on upgrade [#32982](https://github.com/woocommerce/woocommerce/pull/32982) * Tweak - Fix typescript type errors in react admin ./client/wp-admin-scripts [#32678](https://github.com/woocommerce/woocommerce/pull/32678) * Tweak - Move the file for the DatabaseUtil class to the proper directory according to its namespace. [#33109](https://github.com/woocommerce/woocommerce/pull/33109) * Tweak - Also allow getting category ID as option ID instead of term slug in wc-enhanced-select. [#32743](https://github.com/woocommerce/woocommerce/pull/32743) @@ -682,7 +791,7 @@ * Add - a new `woocommerce_generate_{$type}_html` action hook to generate custom field types in `WC_Settings_API` class objects. ([#31238](https://github.com/woocommerce/woocommerce/pull/31238)) * Add - Make the `$webhook` object available to consumers of the `woocommerce_webhook_options` action. ([#31292](https://github.com/woocommerce/woocommerce/pull/31292)) * Add - Pinterest extension to onboarding wizard and marketing task ([#32527](https://github.com/woocommerce/woocommerce/pull/32527)) -* Add - `order_item_display_meta` option to orders endpoint (REST API), to osupport filtering out variation meta. +* Add - `order_item_display_meta` option to orders endpoint (REST API), to support filtering out variation meta. * Add - new hooks to `order-tracking.php` form. ([#30320](https://github.com/woocommerce/woocommerce/pull/30320)) * Fix - Ensure that an existing order with auto-draft status won't be interpreted as pending when determining if the status has changed. ([#32571](https://github.com/woocommerce/woocommerce/pull/32571)) * Fix - bug in which tasks reminder bar was displayed on product screens. ([#32526](https://github.com/woocommerce/woocommerce/pull/32526)) @@ -699,7 +808,7 @@ * Fix - WCPay task add missing legal message within task. ([#32762](https://github.com/woocommerce/woocommerce/issues/32762)) * Tweak - Make it possible for downloadable files to be in an enabled or disabled state. * Tweak - UI changes for set up payments task -* Tweak - Update WCA deactivation hooks to work with WC deactvation. +* Tweak - Update WCA deactivation hooks to work with WC deactivation. * Tweak - Move feature flag config files to Woocommerce plugin to support unit test execution in the wp-env environment. * Tweak - Update progress header bar styles in task list ([#32498](https://github.com/woocommerce/woocommerce/pull/32498)) * Tweak - Update country strings, rename Swaziland to Eswatini (per CLDR R41 update). ([#31185](https://github.com/woocommerce/woocommerce/pull/31185)) @@ -712,7 +821,7 @@ * Dev - Merge WCA install routines to the core * Dev - Remove `load_plugin_textdomain` method from admin plugin. * Dev - Simplify the WooCommerce Admin init routine. ([#32489](https://github.com/woocommerce/woocommerce/pull/32489)) -* Dev - Generic migration support for migration from posts + postsmeta table to any custom table. Additionaly, implement migrations to various COT tables using this generic support. +* Dev - Generic migration support for migration from posts + postsmeta table to any custom table. Additionally, implement migrations to various COT tables using this generic support. * Dev - Remove Pinterest extension from OBW ([#32626](https://github.com/woocommerce/woocommerce/pull/32626)) * Dev - Revert back menu position to floats as string for WP compatibility. * Dev - Enable the "Save changes" button within the variations panel when a textfield receives input. ([#32589](https://github.com/woocommerce/woocommerce/pull/32589)) @@ -841,7 +950,7 @@ * Enhancement - Add support for the global style for the On-Sale Badge block. ([5565](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/*565)) * Enhancement - Add support for the global style for the Attribute Filter block. ([5557](https://github.com/woocommerce/woocommerce-gutenberg-products-block/*ull/5557)) * Enhancement - Category List block: Add support for global style. ([5516](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/5516)) -* Fix - Fixed typo in `wooocommerce_store_api_validate_add_to_cart` and `wooocommerce_store_api_validate_cart_item` hook names. ([5926](https://github.com/*oocommerce/woocommerce-gutenberg-products-block/pull/5926)) +* Fix - Fixed typo in `woocommerce_store_api_validate_add_to_cart` and `woocommerce_store_api_validate_cart_item` hook names. ([5926](https://github.com/*oocommerce/woocommerce-gutenberg-products-block/pull/5926)) * Fix - Fix loading WC core translations in locales where WC Blocks is not localized for some strings. ([5910](https://github.com/woocommerce/*oocommerce-gutenberg-products-block/pull/5910)) * Fix - Fixed an issue where clear customizations functionality was not working for WooCommerce templates. ([5746](https://github.com/woocommerce/*oocommerce-gutenberg-products-block/pull/5746)) * Fix - Fixed hover and focus states for button components. ([5712](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/5712)) @@ -1133,7 +1242,7 @@ * Dev - ActionScheduler_wcSystemStatus PHPCS fixes (props @ovidiul). ( [#761](https://github.com/woocommerce/action-scheduler/pull/761) ) * Dev - ActionScheduler_DBLogger.php PHPCS fixes (props @ovidiul). ( [#768](https://github.com/woocommerce/action-scheduler/pull/768) ) * Dev - Fixed phpcs for ActionScheduler_Schedule_Deprecated (props @ovidiul). ( [#762](https://github.com/woocommerce/action-scheduler/pull/762) ) -* Dev - Improve actions table indicies (props @glagonikas). ( [#774](https://github.com/woocommerce/action-scheduler/pull/774) & [#777](https://github.com/woocommerce/action-scheduler/pull/777) ) +* Dev - Improve actions table indices (props @glagonikas). ( [#774](https://github.com/woocommerce/action-scheduler/pull/774) & [#777](https://github.com/woocommerce/action-scheduler/pull/777) ) * Dev - PHPCS fixes for ActionScheduler_DBStore.php (props @ovidiul). ( [#769](https://github.com/woocommerce/action-scheduler/pull/769) & [#778](https://github.com/woocommerce/action-scheduler/pull/778) ) * Dev - PHPCS Fixes for ActionScheduler_Abstract_ListTable (props @ovidiul). ( [#763](https://github.com/woocommerce/action-scheduler/pull/763) & [#779](https://github.com/woocommerce/action-scheduler/pull/779) ) * Dev - Adds new filter action_scheduler_claim_actions_order_by to allow tuning of the claim query (props @glagonikas). ( [#773](https://github.com/woocommerce/action-scheduler/pull/773) ) @@ -1254,7 +1363,7 @@ * Fix - Ensure homescreen defaults to single column layout. ( [#7969](https://github.com/woocommerce/woocommerce-admin/issues/7969) ) * Fix: Fix shipping task not offering step 3. ( [#7985](https://github.com/woocommerce/woocommerce-admin/issues/7985) ) * Add - Add Avalara to tax task ( [#7874](https://github.com/woocommerce/woocommerce-admin/issues/7874) ) -* Add - Add 2col expirement. ( [#7872](https://github.com/woocommerce/woocommerce-admin/issues/7872) ) +* Add - Add 2col experiment. ( [#7872](https://github.com/woocommerce/woocommerce-admin/issues/7872) ) * Add - Added two column experimental task list ( [#7669](https://github.com/woocommerce/woocommerce-admin/issues/7669) ) * Add - Add header cards for all tasks in Tasklist UI experiment ( [#7838](https://github.com/woocommerce/woocommerce-admin/issues/7838) ) * Add - Add onboarding task docs ( [#7762](https://github.com/woocommerce/woocommerce-admin/issues/7762) ) @@ -1676,7 +1785,7 @@ = 5.5.2 2021-07-22 = * Fix - Add a new option allowing product downloads to be served using redirects as a last resort. #30288 -* Fix - Remove unnecessary seacrh related 'where' clause added in the 'post_clauses' hook handling. #30335 +* Fix - Remove unnecessary search related 'where' clause added in the 'post_clauses' hook handling. #30335 * Fix - Check before calling $screen method to make sure its not null. #30277 **WooCommerce Admin - 2.4.4 & 2.4.3 & 2.4.2 ** @@ -1781,7 +1890,7 @@ * Fix - RemoteFreeExtension hide bundle when all of its plugins are not visible #7182 * Fix - Issue where summary stats were not showing in Analytics > Stock. #7161 * Fix - Rule Processing Transformer to handle dotNotation default value #7009 -* Fix - Remove Navigation's uneeded SlotFill context #6832 +* Fix - Remove Navigation's unneeded SlotFill context #6832 * Fix - Report filters expecting specific ordering. #6847 * Fix - Render bug with report comparison mode selections. #6862 * Fix - Throw exception if the data store cannot be loaded when trying to use notes. #6771 @@ -1937,7 +2046,7 @@ * Fix - Make pagination buttons height and width consistent #6725 * Fix - Retain persisted queries when navigating to Homescreen #6614 * Fix - Update folded header style #6724 -* Fix - Unreleated variations showing up in the Products reports #6647 +* Fix - Unrelated variations showing up in the Products reports #6647 * Fix - Check active plugins before getting the PayPal onboarding status #6625 * Fix - Remove no-reply from inbox notification emails #6644 * Fix - Set up shipping costs task, redirect to shipping settings after completion. #6791 @@ -2360,7 +2469,7 @@ * Fix - Onboarding - Fixed "Business Details" error. #6271 * Fix - Show management links when only main task list is hidden. #6291 * Fix - Correct the Klarna slug. #6440 -* Add - new inbox message - Getting started in Ecommerce - watch this webinar. #6086 +* Add - new inbox message - Getting started in e-commerce - watch this webinar. #6086 * Add - Remote inbox notifications contains comparison and fix product rule. #6073 * Add - Task list payments - include Mollie as an option. #6257 * Update - store deprecation welcome modal support doc link #6094 @@ -2387,7 +2496,7 @@ * Enhancements - Fix: Added fallback styling for screen reader text. ([3557](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3557)) * Fix - Ensure empty categories are correctly hidden in the product categories block. ([3765](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3765)) * Fix - Added missing wrapper div within FeaturedCategory and FeatureProduct blocks. ([3746](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3746)) -* Fix - Set correct text color in BlockErrorBoundry notices. ([3738](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3738)) +* Fix - Set correct text color in BlockErrorBoundary notices. ([3738](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3738)) * Fix - Hidden cart item meta data will not be rendered in the Cart and Checkout blocks. ([3732](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3732)) * Fix - Improved accessibility of product image links in the products block by using correct aria tags and hiding empty image placeholders. ([3722](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3722)) * Fix - Add missing aria-label for stars image in the review-list-item component. ([3706](https://github.com/woocommerce/woocommerce-gutenberg-products-block/pull/3706)) @@ -2805,7 +2914,7 @@ * Dev - Introduce (again) a dependency injection framework for the code in the src directory. #27733 * Dev - Remove leftover code and data from the reverted improvement for variations filtering by attribute. #27748 * Dev - Escaped labels in `woocommerce_form_field()`. #27800 -* Dev - Add a `NumberUtil::round` method to workaround a breaking change in the buil-in round function in PHP8. #27830 +* Dev - Add a `NumberUtil::round` method to workaround a breaking change in the built-in round function in PHP8. #27830 * Dev - Remove default value from optional parameters that are followed by required parameters in functions/methods, since those are de-facto required and trigger a deprectation notice in PHP 8. #27840 * Dev - REST API - Add user-friendly attribute names and values to order line items metadata. * Dev - REST API - Adds `parent_name` to `line_items` of the GET /orders endpoint. @@ -2918,7 +3027,7 @@ - Dev: Store Profiler - Industry step: reduced padding and removed industry #5157 - Dev: Remove product settings video note #5213 - Enhancement: Add free local shipping zone on profile complete #4857 -- Enhancement: Add woocommerce/tracks pacakage #5107 +- Enhancement: Add woocommerce/tracks package #5107 - Enhancement: Add filter to allow modification of report columns #4984 - Enhancement: Add WooCommerce Mobile Banner #5037 - Enhancement: Add Product Attribute advanced filter #5038 @@ -2992,7 +3101,7 @@ * Localization - Added postcode validation for Bosnia and Herzegovina. #27048 * Localization - Added the postcode validation for Liechtenstein. #27059 * Localization - Add i18n locale information for Liechtenstein, Switzerland and Austria. #27193 -* Tweak - Increase priority of `admin_body_class` filter to avoid comflict with plugins that incorrectly remove all body classes from WP. #27426 +* Tweak - Increase priority of `admin_body_class` filter to avoid conflict with plugins that incorrectly remove all body classes from WP. #27426 * Tweak - Rename built-in PayPal payment method to PayPal Standard. #27468 * Fix - Remove whitespace within a link. #26897 * Fix - `get_review_count_for_product` return all comments count not only 'review' types #26928 @@ -3103,7 +3212,7 @@ * Fix - After clicking to update WooCommerce, the user will stay in the same page instead of being redirected to the "Settings" page. #27172 * Fix - "Product type" dropdown missing from Product's data meta box on WP 5.5. #27170 * Fix - Removed the JETPACK_AUTOLOAD_DEV define. #27185 -* Fix - Fixed "virtual" and "downlodable" pointers on product walkthrough. #27145 +* Fix - Fixed "virtual" and "downloadable" pointers on product walkthrough. #27145 * Fix - Updated tested up to for WordPress 5.5. #27334 * Dev - Update WooCommerce Admin version to v1.4.0. #27378 * Dev - Upgraded to v2.2 of Jetpack Autoloader. #27358 @@ -3180,7 +3289,7 @@ * Performance - Don't load shortcode Cart and Checkout scripts when using the blocks. #2842 * Performance - Scripts only relevant to the frontend side of blocks are no longer loaded in the editor. #2788 * Performance - Lazy Loading Atomic Components. #2777 -* Pefactor - Remove dashicon classes. #2848 +* Refactor - Remove dashicon classes. #2848 **WooCommerce Blocks 3.1.0** * Fix - Missing permissions_callback arg in StoreApi route definitions. #2926 @@ -3270,7 +3379,7 @@ * Enhancement - Add API tool to verify base DB tables. woocommerce/woocommerce-rest-api#188 **WooCommerce Admin 1.3.0** -* Enhancement - Add Jetpack stats to performance indicatorts / homepage #4291 +* Enhancement - Add Jetpack stats to performance indicators / homepage #4291 * Enhancement - New "Store Management" quick links card on WooCommerce home screen. #4350 * Enhancement - Inbox notifications layout updates #4218 * Enhancement - New Home Screen #4303 @@ -3538,7 +3647,7 @@ * Dev - Made the default test source folders support the system tmp folder. #25923 * Dev - Add cart & checkout block/shortcode info to tracker data. #25932 * Dev - Make WC_Product_Data_Store_CPT::update_product_stock operations atomic. #26039 -* Dev - Adds usage data for the of cart & checkout blocks (currently in development in WooCommmerce Blocks plugin) to the WC Tracker snapshot. #26084 +* Dev - Adds usage data for the of cart & checkout blocks (currently in development in WooCommerce Blocks plugin) to the WC Tracker snapshot. #26084 * Dev - Implement some additional tracks for coupons, orders, and products. #26085 = 4.0.4 2022-03-10 = @@ -3716,7 +3825,7 @@ * Tweak - Cache checkout fragments and update DOM on change only. #24227 * Tweak - Eliminate extra update order AJAX request on checkout page load. #24271 * Tweak - Prevent billing address from being updated on shipping update. #24374 -* Tweak - Added a tooltip in the "Coupon expity date" field. #24749 +* Tweak - Added a tooltip in the "Coupon expiry date" field. #24749 * Tweak - Make phone numbers clickable in emails. #24786 * Tweak - Prevent PHP warnings in tracker if order doesn't have a created date yet. #24846 * Tweak - Capitalize "T" in "Move to Trash" phrase on order page in wp-admin to be consistent with product and coupon pages. #24867 @@ -3822,7 +3931,7 @@ * Tweak - Prevent filter per category while exporting product variations. #24517 * Tweak - Better wording for subtotal of items in cart and review order. #24440 * Tweak - Prevent new lines in product quantity in checkout details. #24311 -* Tweak - Add a tooltip in the "Coupon expity date" field. #24749 +* Tweak - Add a tooltip in the "Coupon expiry date" field. #24749 * Tweak - CSS styling changes for WP 5.3. #24832 * Template - Moved HTML for displaying product price filter widget to a new template `product price filter widget`. #23384 * Accessibility - Make $subtext color darker. #24739 From 91da0a15df43bb855abdde04d1b96cf1bdaa1e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alba=20Rinc=C3=B3n?= Date: Wed, 9 Nov 2022 09:59:08 +0100 Subject: [PATCH 0056/1680] Update WooCommerce blocks package to 8.9.0 (#35521) --- .../bin/composer/mozart/composer.lock | 50 +++++++++--------- .../bin/composer/phpcs/composer.lock | 24 +++++---- .../bin/composer/phpunit/composer.lock | 12 ++--- .../woocommerce/bin/composer/wp/composer.lock | 52 +++++++++---------- .../changelog/update-woocommerce-blocks-8.9.0 | 4 ++ plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/composer.lock | 14 ++--- 7 files changed, 83 insertions(+), 75 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.0 diff --git a/plugins/woocommerce/bin/composer/mozart/composer.lock b/plugins/woocommerce/bin/composer/mozart/composer.lock index eea80f8bd52..1b31825ab7b 100644 --- a/plugins/woocommerce/bin/composer/mozart/composer.lock +++ b/plugins/woocommerce/bin/composer/mozart/composer.lock @@ -13,12 +13,12 @@ "source": { "type": "git", "url": "https://github.com/coenjacobs/mozart.git", - "reference": "75ae1f91f04bbbd4b6edff282a483dfe611b2cea" + "reference": "4f9d00fbc3b3e39f4e334434fe058e516ad82291" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/coenjacobs/mozart/zipball/75ae1f91f04bbbd4b6edff282a483dfe611b2cea", - "reference": "75ae1f91f04bbbd4b6edff282a483dfe611b2cea", + "url": "https://api.github.com/repos/coenjacobs/mozart/zipball/4f9d00fbc3b3e39f4e334434fe058e516ad82291", + "reference": "4f9d00fbc3b3e39f4e334434fe058e516ad82291", "shasum": "" }, "require": { @@ -29,9 +29,11 @@ }, "require-dev": { "mheap/phpunit-github-actions-printer": "^1.4", + "phpstan/extension-installer": "^1.2", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-deprecation-rules": "^1.0", "phpunit/phpunit": "^8.5", - "squizlabs/php_codesniffer": "^3.5", - "vimeo/psalm": "^4.4" + "squizlabs/php_codesniffer": "^3.5" }, "default-branch": true, "bin": [ @@ -64,20 +66,20 @@ "type": "github" } ], - "time": "2021-08-03T18:56:55+00:00" + "time": "2022-10-22T08:08:20+00:00" }, { "name": "league/flysystem", - "version": "1.1.9", + "version": "1.1.10", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99" + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99", - "reference": "094defdb4a7001845300334e7c1ee2335925ef99", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/3239285c825c152bcc315fe0e87d6b55f5972ed1", + "reference": "3239285c825c152bcc315fe0e87d6b55f5972ed1", "shasum": "" }, "require": { @@ -150,7 +152,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.10" }, "funding": [ { @@ -158,7 +160,7 @@ "type": "other" } ], - "time": "2021-12-09T09:40:50+00:00" + "time": "2022-10-04T09:16:37+00:00" }, { "name": "league/mime-type-detection", @@ -266,16 +268,16 @@ }, { "name": "symfony/console", - "version": "v5.4.12", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1" + "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/c072aa8f724c3af64e2c7a96b796a4863d24dba1", - "reference": "c072aa8f724c3af64e2c7a96b796a4863d24dba1", + "url": "https://api.github.com/repos/symfony/console/zipball/ea59bb0edfaf9f28d18d8791410ee0355f317669", + "reference": "ea59bb0edfaf9f28d18d8791410ee0355f317669", "shasum": "" }, "require": { @@ -345,7 +347,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.12" + "source": "https://github.com/symfony/console/tree/v5.4.15" }, "funding": [ { @@ -361,7 +363,7 @@ "type": "tidelift" } ], - "time": "2022-08-17T13:18:05+00:00" + "time": "2022-10-26T21:41:52+00:00" }, { "name": "symfony/deprecation-contracts", @@ -1070,16 +1072,16 @@ }, { "name": "symfony/string", - "version": "v5.4.12", + "version": "v5.4.15", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058" + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/2fc515e512d721bf31ea76bd02fe23ada4640058", - "reference": "2fc515e512d721bf31ea76bd02fe23ada4640058", + "url": "https://api.github.com/repos/symfony/string/zipball/571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", + "reference": "571334ce9f687e3e6af72db4d3b2a9431e4fd9ed", "shasum": "" }, "require": { @@ -1136,7 +1138,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.12" + "source": "https://github.com/symfony/string/tree/v5.4.15" }, "funding": [ { @@ -1152,7 +1154,7 @@ "type": "tidelift" } ], - "time": "2022-08-12T17:03:11+00:00" + "time": "2022-10-05T15:16:54+00:00" } ], "aliases": [], diff --git a/plugins/woocommerce/bin/composer/phpcs/composer.lock b/plugins/woocommerce/bin/composer/phpcs/composer.lock index ef7a75941e4..0e1a6def19c 100644 --- a/plugins/woocommerce/bin/composer/phpcs/composer.lock +++ b/plugins/woocommerce/bin/composer/phpcs/composer.lock @@ -146,16 +146,16 @@ }, { "name": "phpcompatibility/phpcompatibility-paragonie", - "version": "1.3.1", + "version": "1.3.2", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git", - "reference": "ddabec839cc003651f2ce695c938686d1086cf43" + "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/ddabec839cc003651f2ce695c938686d1086cf43", - "reference": "ddabec839cc003651f2ce695c938686d1086cf43", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", + "reference": "bba5a9dfec7fcfbd679cfaf611d86b4d3759da26", "shasum": "" }, "require": { @@ -192,26 +192,27 @@ "paragonie", "phpcs", "polyfill", - "standards" + "standards", + "static analysis" ], "support": { "issues": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie/issues", "source": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie" }, - "time": "2021-02-15T10:24:51+00:00" + "time": "2022-10-25T01:46:02+00:00" }, { "name": "phpcompatibility/phpcompatibility-wp", - "version": "2.1.3", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git", - "reference": "d55de55f88697b9cdb94bccf04f14eb3b11cf308" + "reference": "b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/d55de55f88697b9cdb94bccf04f14eb3b11cf308", - "reference": "d55de55f88697b9cdb94bccf04f14eb3b11cf308", + "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5", + "reference": "b6c1e3ee1c35de6c41a511d5eb9bd03e447480a5", "shasum": "" }, "require": { @@ -246,13 +247,14 @@ "compatibility", "phpcs", "standards", + "static analysis", "wordpress" ], "support": { "issues": "https://github.com/PHPCompatibility/PHPCompatibilityWP/issues", "source": "https://github.com/PHPCompatibility/PHPCompatibilityWP" }, - "time": "2021-12-30T16:37:40+00:00" + "time": "2022-10-24T09:00:36+00:00" }, { "name": "sirbrillig/phpcs-changed", diff --git a/plugins/woocommerce/bin/composer/phpunit/composer.lock b/plugins/woocommerce/bin/composer/phpunit/composer.lock index 19d941bd66a..1983c0a3a0b 100644 --- a/plugins/woocommerce/bin/composer/phpunit/composer.lock +++ b/plugins/woocommerce/bin/composer/phpunit/composer.lock @@ -1112,16 +1112,16 @@ }, { "name": "sebastian/exporter", - "version": "3.1.4", + "version": "3.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db" + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", - "reference": "0c32ea2e40dbf59de29f3b49bf375176ce7dd8db", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", + "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", "shasum": "" }, "require": { @@ -1177,7 +1177,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.4" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" }, "funding": [ { @@ -1185,7 +1185,7 @@ "type": "github" } ], - "time": "2021-11-11T13:51:24+00:00" + "time": "2022-09-14T06:00:17+00:00" }, { "name": "sebastian/global-state", diff --git a/plugins/woocommerce/bin/composer/wp/composer.lock b/plugins/woocommerce/bin/composer/wp/composer.lock index 021717abf55..7ef28cb0bfd 100644 --- a/plugins/woocommerce/bin/composer/wp/composer.lock +++ b/plugins/woocommerce/bin/composer/wp/composer.lock @@ -148,16 +148,16 @@ }, { "name": "gettext/languages", - "version": "2.9.0", + "version": "2.10.0", "source": { "type": "git", "url": "https://github.com/php-gettext/Languages.git", - "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa" + "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-gettext/Languages/zipball/ed56dd2c7f4024cc953ed180d25f02f2640e3ffa", - "reference": "ed56dd2c7f4024cc953ed180d25f02f2640e3ffa", + "url": "https://api.github.com/repos/php-gettext/Languages/zipball/4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", + "reference": "4d61d67fe83a2ad85959fe6133d6d9ba7dddd1ab", "shasum": "" }, "require": { @@ -206,7 +206,7 @@ ], "support": { "issues": "https://github.com/php-gettext/Languages/issues", - "source": "https://github.com/php-gettext/Languages/tree/2.9.0" + "source": "https://github.com/php-gettext/Languages/tree/2.10.0" }, "funding": [ { @@ -218,20 +218,20 @@ "type": "github" } ], - "time": "2021-11-11T17:30:39+00:00" + "time": "2022-10-18T15:00:10+00:00" }, { "name": "mck89/peast", - "version": "v1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/mck89/peast.git", - "reference": "70a728d598017e237118652b2fa30fbaa9d4ef6d" + "reference": "733cd8f62dcb8239094688063a92766bbfcbf523" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mck89/peast/zipball/70a728d598017e237118652b2fa30fbaa9d4ef6d", - "reference": "70a728d598017e237118652b2fa30fbaa9d4ef6d", + "url": "https://api.github.com/repos/mck89/peast/zipball/733cd8f62dcb8239094688063a92766bbfcbf523", + "reference": "733cd8f62dcb8239094688063a92766bbfcbf523", "shasum": "" }, "require": { @@ -244,7 +244,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.14.0-dev" + "dev-master": "1.15.0-dev" } }, "autoload": { @@ -266,9 +266,9 @@ "description": "Peast is PHP library that generates AST for JavaScript code", "support": { "issues": "https://github.com/mck89/peast/issues", - "source": "https://github.com/mck89/peast/tree/v1.14.0" + "source": "https://github.com/mck89/peast/tree/v1.15.0" }, - "time": "2022-05-01T15:09:54+00:00" + "time": "2022-09-13T15:56:53+00:00" }, { "name": "mustache/mustache", @@ -553,16 +553,16 @@ }, { "name": "wp-cli/php-cli-tools", - "version": "v0.11.15", + "version": "v0.11.16", "source": { "type": "git", "url": "https://github.com/wp-cli/php-cli-tools.git", - "reference": "b6edd35988892ea1451392eb7a26d9dbe98c836d" + "reference": "c32e51a5c9993ad40591bc426b21f5422a5ed293" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/b6edd35988892ea1451392eb7a26d9dbe98c836d", - "reference": "b6edd35988892ea1451392eb7a26d9dbe98c836d", + "url": "https://api.github.com/repos/wp-cli/php-cli-tools/zipball/c32e51a5c9993ad40591bc426b21f5422a5ed293", + "reference": "c32e51a5c9993ad40591bc426b21f5422a5ed293", "shasum": "" }, "require": { @@ -601,22 +601,22 @@ ], "support": { "issues": "https://github.com/wp-cli/php-cli-tools/issues", - "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.15" + "source": "https://github.com/wp-cli/php-cli-tools/tree/v0.11.16" }, - "time": "2022-08-15T10:15:55+00:00" + "time": "2022-11-03T15:19:26+00:00" }, { "name": "wp-cli/wp-cli", - "version": "v2.6.0", + "version": "v2.7.1", "source": { "type": "git", "url": "https://github.com/wp-cli/wp-cli.git", - "reference": "dee13c2baf6bf972484a63f8b8dab48f7220f095" + "reference": "1ddc754f1c15e56fb2cdd1a4e82bd0ec6ca32a76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/dee13c2baf6bf972484a63f8b8dab48f7220f095", - "reference": "dee13c2baf6bf972484a63f8b8dab48f7220f095", + "url": "https://api.github.com/repos/wp-cli/wp-cli/zipball/1ddc754f1c15e56fb2cdd1a4e82bd0ec6ca32a76", + "reference": "1ddc754f1c15e56fb2cdd1a4e82bd0ec6ca32a76", "shasum": "" }, "require": { @@ -634,7 +634,7 @@ "wp-cli/entity-command": "^1.2 || ^2", "wp-cli/extension-command": "^1.1 || ^2", "wp-cli/package-command": "^1 || ^2", - "wp-cli/wp-cli-tests": "^3.1.3" + "wp-cli/wp-cli-tests": "^3.1.6" }, "suggest": { "ext-readline": "Include for a better --prompt implementation", @@ -647,7 +647,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "2.6.x-dev" + "dev-master": "2.8.x-dev" } }, "autoload": { @@ -674,7 +674,7 @@ "issues": "https://github.com/wp-cli/wp-cli/issues", "source": "https://github.com/wp-cli/wp-cli" }, - "time": "2022-01-25T16:31:27+00:00" + "time": "2022-10-17T23:10:42+00:00" } ], "aliases": [], diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.0 b/plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.0 new file mode 100644 index 00000000000..f49cff81ad5 --- /dev/null +++ b/plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.0 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Update WooCommerce Blocks to 8.9.0 diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index f2a9ca4ef70..48554489572 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -21,7 +21,7 @@ "maxmind-db/reader": "^1.11", "pelago/emogrifier": "^6.0", "woocommerce/action-scheduler": "3.4.2", - "woocommerce/woocommerce-blocks": "8.7.5" + "woocommerce/woocommerce-blocks": "8.9.0" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4", diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index 809b2e3c2e7..f9ee1390780 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": "08d58a387b373d546fb53025a230e768", + "content-hash": "4ba153cfcffe43c11a5c994e21a822bb", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -628,16 +628,16 @@ }, { "name": "woocommerce/woocommerce-blocks", - "version": "v8.7.5", + "version": "v8.9.0", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-blocks.git", - "reference": "0436c8afb8c3c34dd38aed2b7a0868e771036031" + "reference": "9ed8e59f2f78a2bd0198750ed314590802d8f3d5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/0436c8afb8c3c34dd38aed2b7a0868e771036031", - "reference": "0436c8afb8c3c34dd38aed2b7a0868e771036031", + "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/9ed8e59f2f78a2bd0198750ed314590802d8f3d5", + "reference": "9ed8e59f2f78a2bd0198750ed314590802d8f3d5", "shasum": "" }, "require": { @@ -683,9 +683,9 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-blocks/issues", - "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v8.7.5" + "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v8.9.0" }, - "time": "2022-10-31T14:54:55+00:00" + "time": "2022-11-08T11:37:31+00:00" } ], "packages-dev": [ From 6acd69e404349bee923b8640dc70960b9f67bcf6 Mon Sep 17 00:00:00 2001 From: Nima Karimi <73110514+nima-karimi@users.noreply.github.com> Date: Wed, 9 Nov 2022 10:41:18 +0000 Subject: [PATCH 0057/1680] Multichannel Marketing - Core Library (#35099) * Create channel interface and campaign value class * Create MarketingChannels class * Register MarketingChannels class in DI container * Use the new MarketingChannels class to get the installed marketing extensions' data * Use DI container to access InstalledExtensions class * Add InstalledExtensions to the $provides array * Hint that campaign cost should also indicate the currency * Initialize the channels array * Add unit tests for MarketingCampaign * Add unit tests for MarketingChannels * Add Price class to represent a price with currency * Use Price class for marketing campaign's cost * Define a constant to indicate the MCM classes exist This constant will be checked by third-party extensions before utilizing any of the classes/interfaces defined for this feature. * Create MarketingSpecs class to include WC.com API calls * Remove WC.com API calls from Marketing class And replace them with calls from MarketingSpecs class. * Use the const from MarketingSpecs * Fix MarketingChannels unit tests * Add missing settings URL to the channel data Co-authored-by: Nima --- .../includes/wc-update-functions.php | 4 +- .../woocommerce/src/Admin/API/Marketing.php | 20 +- .../src/Admin/API/MarketingOverview.php | 9 +- .../Admin/Marketing/InstalledExtensions.php | 618 +----------------- .../src/Admin/Marketing/MarketingCampaign.php | 110 ++++ .../Marketing/MarketingChannelInterface.php | 82 +++ .../src/Admin/Marketing/MarketingChannels.php | 131 ++++ .../woocommerce/src/Admin/Marketing/Price.php | 70 ++ plugins/woocommerce/src/Container.php | 2 + .../src/Internal/Admin/Marketing.php | 140 +--- .../Admin/Marketing/MarketingSpecs.php | 145 ++++ .../MarketingServiceProvider.php | 44 ++ .../Admin/Marketing/MarketingCampaignTest.php | 58 ++ .../Admin/Marketing/MarketingChannelsTest.php | 120 ++++ 14 files changed, 830 insertions(+), 723 deletions(-) create mode 100644 plugins/woocommerce/src/Admin/Marketing/MarketingCampaign.php create mode 100644 plugins/woocommerce/src/Admin/Marketing/MarketingChannelInterface.php create mode 100644 plugins/woocommerce/src/Admin/Marketing/MarketingChannels.php create mode 100644 plugins/woocommerce/src/Admin/Marketing/Price.php create mode 100644 plugins/woocommerce/src/Internal/Admin/Marketing/MarketingSpecs.php create mode 100644 plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/MarketingServiceProvider.php create mode 100644 plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingCampaignTest.php create mode 100644 plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingChannelsTest.php diff --git a/plugins/woocommerce/includes/wc-update-functions.php b/plugins/woocommerce/includes/wc-update-functions.php index 20d966b2e86..2d0c94a14fd 100644 --- a/plugins/woocommerce/includes/wc-update-functions.php +++ b/plugins/woocommerce/includes/wc-update-functions.php @@ -18,7 +18,7 @@ defined( 'ABSPATH' ) || exit; -use Automattic\WooCommerce\Internal\Admin\Marketing; +use Automattic\WooCommerce\Internal\Admin\Marketing\MarketingSpecs; use Automattic\WooCommerce\Internal\AssignDefaultCategory; use Automattic\WooCommerce\Internal\ProductAttributesLookup\DataRegenerator; use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore; @@ -2469,5 +2469,5 @@ function wc_update_700_remove_download_log_fk() { * Remove the transient data for recommended marketing extensions. */ function wc_update_700_remove_recommended_marketing_plugins_transient() { - delete_transient( Marketing::RECOMMENDED_PLUGINS_TRANSIENT ); + delete_transient( MarketingSpecs::RECOMMENDED_PLUGINS_TRANSIENT ); } diff --git a/plugins/woocommerce/src/Admin/API/Marketing.php b/plugins/woocommerce/src/Admin/API/Marketing.php index de06c4b7071..a417170f00a 100644 --- a/plugins/woocommerce/src/Admin/API/Marketing.php +++ b/plugins/woocommerce/src/Admin/API/Marketing.php @@ -7,8 +7,8 @@ namespace Automattic\WooCommerce\Admin\API; -use Automattic\WooCommerce\Internal\Admin\Marketing as MarketingFeature; use Automattic\WooCommerce\Admin\PluginsHelper; +use Automattic\WooCommerce\Internal\Admin\Marketing\MarketingSpecs; defined( 'ABSPATH' ) || exit; @@ -103,9 +103,16 @@ class Marketing extends \WC_REST_Data_Controller { * @return \WP_Error|\WP_REST_Response */ public function get_recommended_plugins( $request ) { + /** + * MarketingSpecs class. + * + * @var MarketingSpecs $marketing_specs + */ + $marketing_specs = wc_get_container()->get( MarketingSpecs::class ); + // Default to marketing category (if no category set). $category = ( ! empty( $request->get_param( 'category' ) ) ) ? $request->get_param( 'category' ) : 'marketing'; - $all_plugins = MarketingFeature::get_instance()->get_recommended_plugins(); + $all_plugins = $marketing_specs->get_recommended_plugins(); $valid_plugins = []; $per_page = $request->get_param( 'per_page' ); @@ -130,7 +137,14 @@ class Marketing extends \WC_REST_Data_Controller { * @return \WP_Error|\WP_REST_Response */ public function get_knowledge_base_posts( $request ) { + /** + * MarketingSpecs class. + * + * @var MarketingSpecs $marketing_specs + */ + $marketing_specs = wc_get_container()->get( MarketingSpecs::class ); + $category = $request->get_param( 'category' ); - return rest_ensure_response( MarketingFeature::get_instance()->get_knowledge_base_posts( $category ) ); + return rest_ensure_response( $marketing_specs->get_knowledge_base_posts( $category ) ); } } diff --git a/plugins/woocommerce/src/Admin/API/MarketingOverview.php b/plugins/woocommerce/src/Admin/API/MarketingOverview.php index 930dcb4c0fc..883ce04c1bb 100644 --- a/plugins/woocommerce/src/Admin/API/MarketingOverview.php +++ b/plugins/woocommerce/src/Admin/API/MarketingOverview.php @@ -125,7 +125,14 @@ class MarketingOverview extends \WC_REST_Data_Controller { * @return \WP_Error|\WP_REST_Response */ public function get_installed_plugins( $request ) { - return rest_ensure_response( InstalledExtensions::get_data() ); + /** + * InstalledExtensions + * + * @var InstalledExtensions $installed_extensions + */ + $installed_extensions = wc_get_container()->get( InstalledExtensions::class ); + + return rest_ensure_response( $installed_extensions->get_data() ); } } diff --git a/plugins/woocommerce/src/Admin/Marketing/InstalledExtensions.php b/plugins/woocommerce/src/Admin/Marketing/InstalledExtensions.php index 3f90c964d28..9669b9014c6 100644 --- a/plugins/woocommerce/src/Admin/Marketing/InstalledExtensions.php +++ b/plugins/woocommerce/src/Admin/Marketing/InstalledExtensions.php @@ -5,598 +5,46 @@ namespace Automattic\WooCommerce\Admin\Marketing; -use Automattic\WooCommerce\Admin\PluginsHelper; - /** * Installed Marketing Extensions class. */ class InstalledExtensions { + /** + * MarketingChannels repository + * + * @var MarketingChannels + */ + protected $marketing_channels; + + /** + * Class initialization, invoked by the DI container. + * + * @param MarketingChannels $marketing_channels The MarketingChannels repository. + * + * @internal + */ + final public function init( MarketingChannels $marketing_channels ) { + $this->marketing_channels = $marketing_channels; + } /** * Gets an array of plugin data for the "Installed marketing extensions" card. - * - * Valid extensions statuses are: installed, activated, configured */ - public static function get_data() { - $data = []; - - $automatewoo = self::get_automatewoo_extension_data(); - $aw_referral = self::get_aw_referral_extension_data(); - $aw_birthdays = self::get_aw_birthdays_extension_data(); - $mailchimp = self::get_mailchimp_extension_data(); - $facebook = self::get_facebook_extension_data(); - $pinterest = self::get_pinterest_extension_data(); - $google = self::get_google_extension_data(); - $amazon_ebay = self::get_amazon_ebay_extension_data(); - $mailpoet = self::get_mailpoet_extension_data(); - $creative_mail = self::get_creative_mail_extension_data(); - $tiktok = self::get_tiktok_extension_data(); - $jetpack_crm = self::get_jetpack_crm_extension_data(); - $zapier = self::get_zapier_extension_data(); - $salesforce = self::get_salesforce_extension_data(); - $vimeo = self::get_vimeo_extension_data(); - $trustpilot = self::get_trustpilot_extension_data(); - - if ( $automatewoo ) { - $data[] = $automatewoo; - } - - if ( $aw_referral ) { - $data[] = $aw_referral; - } - - if ( $aw_birthdays ) { - $data[] = $aw_birthdays; - } - - if ( $mailchimp ) { - $data[] = $mailchimp; - } - - if ( $facebook ) { - $data[] = $facebook; - } - - if ( $pinterest ) { - $data[] = $pinterest; - } - - if ( $google ) { - $data[] = $google; - } - - if ( $amazon_ebay ) { - $data[] = $amazon_ebay; - } - - if ( $mailpoet ) { - $data[] = $mailpoet; - } - - if ( $creative_mail ) { - $data[] = $creative_mail; - } - - if ( $tiktok ) { - $data[] = $tiktok; - } - - if ( $jetpack_crm ) { - $data[] = $jetpack_crm; - } - - if ( $zapier ) { - $data[] = $zapier; - } - - if ( $salesforce ) { - $data[] = $salesforce; - } - - if ( $vimeo ) { - $data[] = $vimeo; - } - - if ( $trustpilot ) { - $data[] = $trustpilot; - } - - return $data; + public function get_data(): array { + return array_map( + function ( MarketingChannelInterface $channel ) { + return [ + 'slug' => $channel->get_slug(), + 'status' => $channel->is_setup_completed() ? 'configured' : 'activated', + 'settingsUrl' => $channel->get_setup_url(), + 'name' => $channel->get_name(), + 'description' => $channel->get_description(), + 'product_listings_status' => $channel->get_product_listings_status(), + 'errors_no' => $channel->get_errors_no(), + 'icon' => $channel->get_icon_url(), + ]; + }, + $this->marketing_channels->get_registered_channels() + ); } - - /** - * Get allowed plugins. - * - * @return array - */ - public static function get_allowed_plugins() { - return [ - 'automatewoo', - 'mailchimp-for-woocommerce', - 'creative-mail-by-constant-contact', - 'facebook-for-woocommerce', - 'pinterest-for-woocommerce', - 'google-listings-and-ads', - 'hubspot-for-woocommerce', - 'woocommerce-amazon-ebay-integration', - 'mailpoet', - ]; - } - - /** - * Get AutomateWoo extension data. - * - * @return array|bool - */ - protected static function get_automatewoo_extension_data() { - $slug = 'automatewoo'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/automatewoo.svg'; - - if ( 'activated' === $data['status'] && function_exists( 'AW' ) ) { - $data['settingsUrl'] = admin_url( 'admin.php?page=automatewoo-settings' ); - $data['docsUrl'] = 'https://automatewoo.com/docs/'; - $data['status'] = 'configured'; // Currently no configuration step. - } - - return $data; - } - - /** - * Get AutomateWoo Refer a Friend extension data. - * - * @return array|bool - */ - protected static function get_aw_referral_extension_data() { - $slug = 'automatewoo-referrals'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/automatewoo.svg'; - - if ( 'activated' === $data['status'] ) { - $data['docsUrl'] = 'https://automatewoo.com/docs/refer-a-friend/'; - $data['status'] = 'configured'; - if ( function_exists( 'AW_Referrals' ) ) { - $data['settingsUrl'] = admin_url( 'admin.php?page=automatewoo-settings&tab=referrals' ); - } - } - - return $data; - } - - /** - * Get AutomateWoo Birthdays extension data. - * - * @return array|bool - */ - protected static function get_aw_birthdays_extension_data() { - $slug = 'automatewoo-birthdays'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/automatewoo.svg'; - - if ( 'activated' === $data['status'] ) { - $data['docsUrl'] = 'https://automatewoo.com/docs/getting-started-with-birthdays/'; - $data['status'] = 'configured'; - if ( function_exists( 'AW_Birthdays' ) ) { - $data['settingsUrl'] = admin_url( 'admin.php?page=automatewoo-settings&tab=birthdays' ); - } - } - - return $data; - } - - /** - * Get MailChimp extension data. - * - * @return array|bool - */ - protected static function get_mailchimp_extension_data() { - $slug = 'mailchimp-for-woocommerce'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/mailchimp.svg'; - - if ( 'activated' === $data['status'] && function_exists( 'mailchimp_is_configured' ) ) { - $data['docsUrl'] = 'https://mailchimp.com/help/connect-or-disconnect-mailchimp-for-woocommerce/'; - $data['settingsUrl'] = admin_url( 'admin.php?page=mailchimp-woocommerce' ); - - if ( mailchimp_is_configured() ) { - $data['status'] = 'configured'; - } - } - - return $data; - } - - /** - * Get Facebook extension data. - * - * @return array|bool - */ - protected static function get_facebook_extension_data() { - $slug = 'facebook-for-woocommerce'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/facebook-icon.svg'; - - if ( $data['status'] === 'activated' && function_exists( 'facebook_for_woocommerce' ) ) { - $integration = facebook_for_woocommerce()->get_integration(); - - if ( $integration->is_configured() ) { - $data['status'] = 'configured'; - } - - $data['settingsUrl'] = facebook_for_woocommerce()->get_settings_url(); - $data['docsUrl'] = facebook_for_woocommerce()->get_documentation_url(); - } - - return $data; - } - - /** - * Get Pinterest extension data. - * - * @return array|bool - */ - protected static function get_pinterest_extension_data() { - $slug = 'pinterest-for-woocommerce'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/pinterest.svg'; - - // TODO: Finalise docs url. - $data['docsUrl'] = 'https://woocommerce.com/document/pinterest-for-woocommerce/?utm_medium=product'; - - if ( 'activated' === $data['status'] && class_exists( 'Pinterest_For_Woocommerce' ) ) { - $pinterest_onboarding_completed = Pinterest_For_Woocommerce()::is_setup_complete(); - if ( $pinterest_onboarding_completed ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/pinterest/settings' ); - } else { - $data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/pinterest/landing' ); - } - } - - return $data; - } - - /** - * Get Google extension data. - * - * @return array|bool - */ - protected static function get_google_extension_data() { - $slug = 'google-listings-and-ads'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/google.svg'; - - if ( 'activated' === $data['status'] && function_exists( 'woogle_get_container' ) && class_exists( '\Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\MerchantCenterService' ) ) { - - $merchant_center = woogle_get_container()->get( \Automattic\WooCommerce\GoogleListingsAndAds\MerchantCenter\MerchantCenterService::class ); - - if ( $merchant_center->is_setup_complete() ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/google/settings' ); - } else { - $data['settingsUrl'] = admin_url( 'admin.php?page=wc-admin&path=/google/start' ); - } - - $data['docsUrl'] = 'https://woocommerce.com/document/google-listings-and-ads/?utm_medium=product'; - } - - return $data; - } - - /** - * Get Amazon / Ebay extension data. - * - * @return array|bool - */ - protected static function get_amazon_ebay_extension_data() { - $slug = 'woocommerce-amazon-ebay-integration'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/amazon-ebay.svg'; - - if ( 'activated' === $data['status'] && class_exists( '\CodistoConnect' ) ) { - - $codisto_merchantid = get_option( 'codisto_merchantid' ); - - // Use same check as codisto admin tabs. - if ( is_numeric( $codisto_merchantid ) ) { - $data['status'] = 'configured'; - } - - $data['settingsUrl'] = admin_url( 'admin.php?page=codisto-settings' ); - $data['docsUrl'] = 'https://woocommerce.com/document/multichannel-for-woocommerce-google-amazon-ebay-walmart-integration/?utm_medium=product'; - } - - return $data; - } - - /** - * Get MailPoet extension data. - * - * @return array|bool - */ - protected static function get_mailpoet_extension_data() { - $slug = 'mailpoet'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/mailpoet.svg'; - - if ( 'activated' === $data['status'] && class_exists( '\MailPoet\API\API' ) ) { - $mailpoet_api = \MailPoet\API\API::MP( 'v1' ); - - if ( ! method_exists( $mailpoet_api, 'isSetupComplete' ) || $mailpoet_api->isSetupComplete() ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=mailpoet-settings' ); - } else { - $data['settingsUrl'] = admin_url( 'admin.php?page=mailpoet-newsletters' ); - } - - $data['docsUrl'] = 'https://kb.mailpoet.com/'; - $data['supportUrl'] = 'https://www.mailpoet.com/support/'; - } - - return $data; - } - - /** - * Get Creative Mail for WooCommerce extension data. - * - * @return array|bool - */ - protected static function get_creative_mail_extension_data() { - $slug = 'creative-mail-by-constant-contact'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/creative-mail-by-constant-contact.png'; - - if ( 'activated' === $data['status'] && class_exists( '\CreativeMail\Helpers\OptionsHelper' ) ) { - if ( ! method_exists( '\CreativeMail\Helpers\OptionsHelper', 'get_instance_id' ) || \CreativeMail\Helpers\OptionsHelper::get_instance_id() !== null ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=creativemail_settings' ); - } else { - $data['settingsUrl'] = admin_url( 'admin.php?page=creativemail' ); - } - - $data['docsUrl'] = 'https://app.creativemail.com/kb/help/WooCommerce'; - $data['supportUrl'] = 'https://app.creativemail.com/kb/help/'; - } - - return $data; - } - - /** - * Get TikTok for WooCommerce extension data. - * - * @return array|bool - */ - protected static function get_tiktok_extension_data() { - $slug = 'tiktok-for-business'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/tiktok.jpg'; - - if ( 'activated' === $data['status'] ) { - if ( false !== get_option( 'tt4b_access_token' ) ) { - $data['status'] = 'configured'; - } - - $data['settingsUrl'] = admin_url( 'admin.php?page=tiktok' ); - $data['docsUrl'] = 'https://woocommerce.com/document/tiktok-for-woocommerce/'; - $data['supportUrl'] = 'https://ads.tiktok.com/athena/user-feedback/?identify_key=6a1e079024806640c5e1e695d13db80949525168a052299b4970f9c99cb5ac78'; - } - - return $data; - } - - /** - * Get Jetpack CRM for WooCommerce extension data. - * - * @return array|bool - */ - protected static function get_jetpack_crm_extension_data() { - $slug = 'zero-bs-crm'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/jetpack-crm.png'; - - if ( 'activated' === $data['status'] ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=zerobscrm-plugin-settings' ); - $data['docsUrl'] = 'https://kb.jetpackcrm.com/'; - $data['supportUrl'] = 'https://kb.jetpackcrm.com/crm-support/'; - } - - return $data; - } - - /** - * Get WooCommerce Zapier extension data. - * - * @return array|bool - */ - protected static function get_zapier_extension_data() { - $slug = 'woocommerce-zapier'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/zapier.png'; - - if ( 'activated' === $data['status'] ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=wc-settings&tab=wc_zapier' ); - $data['docsUrl'] = 'https://docs.om4.io/woocommerce-zapier/'; - } - - return $data; - } - - /** - * Get Salesforce extension data. - * - * @return array|bool - */ - protected static function get_salesforce_extension_data() { - $slug = 'integration-with-salesforce'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/salesforce.jpg'; - - if ( 'activated' === $data['status'] && class_exists( '\Integration_With_Salesforce_Admin' ) ) { - if ( ! method_exists( '\Integration_With_Salesforce_Admin', 'get_connection_status' ) || \Integration_With_Salesforce_Admin::get_connection_status() ) { - $data['status'] = 'configured'; - } - - $data['settingsUrl'] = admin_url( 'admin.php?page=integration-with-salesforce' ); - $data['docsUrl'] = 'https://woocommerce.com/document/salesforce-integration/'; - $data['supportUrl'] = 'https://wpswings.com/submit-query/'; - } - - return $data; - } - - /** - * Get Vimeo extension data. - * - * @return array|bool - */ - protected static function get_vimeo_extension_data() { - $slug = 'vimeo'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/vimeo.png'; - - if ( 'activated' === $data['status'] && class_exists( '\Tribe\Vimeo_WP\Vimeo\Vimeo_Auth' ) ) { - if ( method_exists( '\Tribe\Vimeo_WP\Vimeo\Vimeo_Auth', 'has_access_token' ) ) { - $vimeo_auth = new \Tribe\Vimeo_WP\Vimeo\Vimeo_Auth(); - if ( $vimeo_auth->has_access_token() ) { - $data['status'] = 'configured'; - } - } else { - $data['status'] = 'configured'; - } - - $data['settingsUrl'] = admin_url( 'options-general.php?page=vimeo_settings' ); - $data['docsUrl'] = 'https://woocommerce.com/document/vimeo/'; - $data['supportUrl'] = 'https://vimeo.com/help/contact'; - } - - return $data; - } - - /** - * Get Trustpilot extension data. - * - * @return array|bool - */ - protected static function get_trustpilot_extension_data() { - $slug = 'trustpilot-reviews'; - - if ( ! PluginsHelper::is_plugin_installed( $slug ) ) { - return false; - } - - $data = self::get_extension_base_data( $slug ); - $data['icon'] = WC_ADMIN_IMAGES_FOLDER_URL . '/marketing/trustpilot.png'; - - if ( 'activated' === $data['status'] ) { - $data['status'] = 'configured'; - $data['settingsUrl'] = admin_url( 'admin.php?page=woocommerce-trustpilot-settings-page' ); - $data['docsUrl'] = 'https://woocommerce.com/document/trustpilot-reviews/'; - $data['supportUrl'] = 'https://support.trustpilot.com/hc/en-us/requests/new'; - } - - return $data; - } - - - /** - * Get an array of basic data for a given extension. - * - * @param string $slug Plugin slug. - * - * @return array|false - */ - protected static function get_extension_base_data( $slug ) { - $status = PluginsHelper::is_plugin_active( $slug ) ? 'activated' : 'installed'; - $plugin_data = PluginsHelper::get_plugin_data( $slug ); - - if ( ! $plugin_data ) { - return false; - } - - return [ - 'slug' => $slug, - 'status' => $status, - 'name' => $plugin_data['Name'], - 'description' => html_entity_decode( wp_trim_words( $plugin_data['Description'], 20 ) ), - 'supportUrl' => 'https://woocommerce.com/my-account/create-a-ticket/?utm_medium=product', - ]; - } - } diff --git a/plugins/woocommerce/src/Admin/Marketing/MarketingCampaign.php b/plugins/woocommerce/src/Admin/Marketing/MarketingCampaign.php new file mode 100644 index 00000000000..7b3f99a4b3a --- /dev/null +++ b/plugins/woocommerce/src/Admin/Marketing/MarketingCampaign.php @@ -0,0 +1,110 @@ +id = $id; + $this->title = $title; + $this->manage_url = $manage_url; + $this->cost = $cost; + } + + /** + * Returns the marketing campaign's unique identifier. + * + * @return string + */ + public function get_id(): string { + return $this->id; + } + + /** + * Returns the title of the marketing campaign. + * + * @return string + */ + public function get_title(): string { + return $this->title; + } + + /** + * Returns the URL to manage the marketing campaign. + * + * @return string + */ + public function get_manage_url(): string { + return $this->manage_url; + } + + /** + * Returns the cost of the marketing campaign with the currency. + * + * @return Price|null + */ + public function get_cost(): ?Price { + return $this->cost; + } + + /** + * Serialize the marketing campaign data. + * + * @return array + */ + public function jsonSerialize() { + return [ + 'id' => $this->get_id(), + 'title' => $this->get_title(), + 'manage_url' => $this->get_manage_url(), + 'cost' => $this->get_cost(), + ]; + } +} diff --git a/plugins/woocommerce/src/Admin/Marketing/MarketingChannelInterface.php b/plugins/woocommerce/src/Admin/Marketing/MarketingChannelInterface.php new file mode 100644 index 00000000000..3a7233f073b --- /dev/null +++ b/plugins/woocommerce/src/Admin/Marketing/MarketingChannelInterface.php @@ -0,0 +1,82 @@ +marketing_specs = $marketing_specs; + $this->allowed_channels = $this->get_allowed_channels(); + } + + /** + * Registers a marketing channel. + * + * Note that only a predetermined list of third party extensions can be registered as a marketing channel. + * + * @param MarketingChannelInterface $channel The marketing channel to register. + * + * @return void + * + * @see MarketingChannels::is_channel_allowed() Checks if the marketing channel is allowed to be registered or not. + */ + public function register( MarketingChannelInterface $channel ): void { + if ( ! $this->is_channel_allowed( $channel ) ) { + // Silently log an error and bail. + wc_get_logger()->error( sprintf( 'Marketing channel %s (%s) cannot be registered!', $channel->get_name(), $channel->get_slug() ) ); + + return; + } + + $this->registered_channels[ $channel->get_slug() ] = $channel; + } + + /** + * Returns an array of all registered marketing channels. + * + * @return MarketingChannelInterface[] + */ + public function get_registered_channels(): array { + /** + * Filter the list of registered marketing channels. + * + * Note that only a predetermined list of third party extensions can be registered as a marketing channel. + * Any new plugins added to this array will be cross-checked with that list, which is obtained from WooCommerce.com API. + * + * @param MarketingChannelInterface[] $channels Array of registered marketing channels. + * + * @since x.x.x + */ + $channels = apply_filters( 'woocommerce_marketing_channels', $this->registered_channels ); + + // Only return allowed channels. + $allowed_channels = array_filter( + $channels, + function ( MarketingChannelInterface $channel ) { + if ( ! $this->is_channel_allowed( $channel ) ) { + // Silently log an error and bail. + wc_get_logger()->error( sprintf( 'Marketing channel %s (%s) cannot be registered!', $channel->get_name(), $channel->get_slug() ) ); + + return false; + } + + return true; + } + ); + + return array_values( $allowed_channels ); + } + + /** + * Returns an array of plugin slugs for the marketing channels that are allowed to be registered. + * + * @return array + */ + protected function get_allowed_channels(): array { + $recommended_channels = $this->marketing_specs->get_recommended_plugins(); + if ( empty( $recommended_channels ) ) { + return []; + } + + return array_column( $recommended_channels, 'product', 'product' ); + } + + /** + * Determines whether the given marketing channel is allowed to be registered. + * + * @param MarketingChannelInterface $channel The marketing channel object. + * + * @return bool + */ + protected function is_channel_allowed( MarketingChannelInterface $channel ): bool { + return isset( $this->allowed_channels[ $channel->get_slug() ] ); + } +} diff --git a/plugins/woocommerce/src/Admin/Marketing/Price.php b/plugins/woocommerce/src/Admin/Marketing/Price.php new file mode 100644 index 00000000000..9dbb00837ae --- /dev/null +++ b/plugins/woocommerce/src/Admin/Marketing/Price.php @@ -0,0 +1,70 @@ +value = $value; + $this->currency = $currency; + } + + /** + * Get value of the price. + * + * @return string + */ + public function get_value(): string { + return $this->value; + } + + /** + * Get the currency of the price. + * + * @return string + */ + public function get_currency(): string { + return $this->currency; + } + + /** + * Serialize the price data. + * + * @return array + */ + public function jsonSerialize() { + return [ + 'value' => $this->get_value(), + 'currency' => $this->get_currency(), + ]; + } +} diff --git a/plugins/woocommerce/src/Container.php b/plugins/woocommerce/src/Container.php index 3815db81840..0e64a37d322 100644 --- a/plugins/woocommerce/src/Container.php +++ b/plugins/woocommerce/src/Container.php @@ -10,6 +10,7 @@ use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\COTMig use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\DownloadPermissionsAdjusterServiceProvider; use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\AssignDefaultCategoryServiceProvider; use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\FeaturesServiceProvider; +use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\MarketingServiceProvider; use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\OrdersControllersServiceProvider; use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\OrderAdminServiceProvider; use Automattic\WooCommerce\Internal\DependencyManagement\ServiceProviders\OrderMetaBoxServiceProvider; @@ -65,6 +66,7 @@ final class Container { OrderMetaBoxServiceProvider::class, OrderAdminServiceProvider::class, FeaturesServiceProvider::class, + MarketingServiceProvider::class, ); /** diff --git a/plugins/woocommerce/src/Internal/Admin/Marketing.php b/plugins/woocommerce/src/Internal/Admin/Marketing.php index 65cf4a5b464..f11cd2d31d9 100644 --- a/plugins/woocommerce/src/Internal/Admin/Marketing.php +++ b/plugins/woocommerce/src/Internal/Admin/Marketing.php @@ -7,7 +7,6 @@ namespace Automattic\WooCommerce\Internal\Admin; use Automattic\WooCommerce\Admin\Features\Features; use Automattic\WooCommerce\Admin\Marketing\InstalledExtensions; -use Automattic\WooCommerce\Internal\Admin\Loader; use Automattic\WooCommerce\Admin\PageController; /** @@ -17,20 +16,6 @@ class Marketing { use CouponsMovedTrait; - /** - * Name of recommended plugins transient. - * - * @var string - */ - const RECOMMENDED_PLUGINS_TRANSIENT = 'wc_marketing_recommended_plugins'; - - /** - * Name of knowledge base post transient. - * - * @var string - */ - const KNOWLEDGE_BASE_TRANSIENT = 'wc_marketing_knowledge_base'; - /** * Class instance. * @@ -180,124 +165,15 @@ class Marketing { return $settings; } - $settings['marketing']['installedExtensions'] = InstalledExtensions::get_data(); + /** + * InstalledExtensions helper class. + * + * @var InstalledExtensions $installed_extensions + */ + $installed_extensions = wc_get_container()->get( InstalledExtensions::class ); + + $settings['marketing']['installedExtensions'] = $installed_extensions->get_data(); return $settings; } - - /** - * Load recommended plugins from WooCommerce.com - * - * @return array - */ - public function get_recommended_plugins() { - $plugins = get_transient( self::RECOMMENDED_PLUGINS_TRANSIENT ); - - if ( false === $plugins ) { - $request = wp_remote_get( - 'https://woocommerce.com/wp-json/wccom/marketing-tab/1.2/recommendations.json', - array( - 'user-agent' => 'WooCommerce/' . WC()->version . '; ' . get_bloginfo( 'url' ), - ) - ); - $plugins = []; - - if ( ! is_wp_error( $request ) && 200 === $request['response']['code'] ) { - $plugins = json_decode( $request['body'], true ); - } - - set_transient( - self::RECOMMENDED_PLUGINS_TRANSIENT, - $plugins, - // Expire transient in 15 minutes if remote get failed. - // Cache an empty result to avoid repeated failed requests. - empty( $plugins ) ? 900 : 3 * DAY_IN_SECONDS - ); - } - - return array_values( $plugins ); - } - - /** - * Load knowledge base posts from WooCommerce.com - * - * @param string $category Category of posts to retrieve. - * @return array - */ - public function get_knowledge_base_posts( $category ) { - - $kb_transient = self::KNOWLEDGE_BASE_TRANSIENT; - - $categories = array( - 'marketing' => 1744, - 'coupons' => 25202, - ); - - // Default to marketing category (if no category set on the kb component). - if ( ! empty( $category ) && array_key_exists( $category, $categories ) ) { - $category_id = $categories[ $category ]; - $kb_transient = $kb_transient . '_' . strtolower( $category ); - } else { - $category_id = $categories['marketing']; - } - - $posts = get_transient( $kb_transient ); - - if ( false === $posts ) { - $request_url = add_query_arg( - array( - 'categories' => $category_id, - 'page' => 1, - 'per_page' => 8, - '_embed' => 1, - ), - 'https://woocommerce.com/wp-json/wp/v2/posts?utm_medium=product' - ); - - $request = wp_remote_get( - $request_url, - array( - 'user-agent' => 'WooCommerce/' . WC()->version . '; ' . get_bloginfo( 'url' ), - ) - ); - $posts = []; - - if ( ! is_wp_error( $request ) && 200 === $request['response']['code'] ) { - $raw_posts = json_decode( $request['body'], true ); - - foreach ( $raw_posts as $raw_post ) { - $post = [ - 'title' => html_entity_decode( $raw_post['title']['rendered'] ), - 'date' => $raw_post['date_gmt'], - 'link' => $raw_post['link'], - 'author_name' => isset( $raw_post['author_name'] ) ? html_entity_decode( $raw_post['author_name'] ) : '', - 'author_avatar' => isset( $raw_post['author_avatar_url'] ) ? $raw_post['author_avatar_url'] : '', - ]; - - $featured_media = $raw_post['_embedded']['wp:featuredmedia'] ?? []; - if ( count( $featured_media ) > 0 ) { - $image = current( $featured_media ); - $post['image'] = add_query_arg( - array( - 'resize' => '650,340', - 'crop' => 1, - ), - $image['source_url'] - ); - } - - $posts[] = $post; - } - } - - set_transient( - $kb_transient, - $posts, - // Expire transient in 15 minutes if remote get failed. - empty( $posts ) ? 900 : DAY_IN_SECONDS - ); - } - - return $posts; - } } diff --git a/plugins/woocommerce/src/Internal/Admin/Marketing/MarketingSpecs.php b/plugins/woocommerce/src/Internal/Admin/Marketing/MarketingSpecs.php new file mode 100644 index 00000000000..ee36ba1375c --- /dev/null +++ b/plugins/woocommerce/src/Internal/Admin/Marketing/MarketingSpecs.php @@ -0,0 +1,145 @@ + 'WooCommerce/' . WC()->version . '; ' . get_bloginfo( 'url' ), + ) + ); + $plugins = []; + + if ( ! is_wp_error( $request ) && 200 === $request['response']['code'] ) { + $plugins = json_decode( $request['body'], true ); + } + + set_transient( + self::RECOMMENDED_PLUGINS_TRANSIENT, + $plugins, + // Expire transient in 15 minutes if remote get failed. + // Cache an empty result to avoid repeated failed requests. + empty( $plugins ) ? 900 : 3 * DAY_IN_SECONDS + ); + } + + return array_values( $plugins ); + } + + /** + * Load knowledge base posts from WooCommerce.com + * + * @param string|null $category Category of posts to retrieve. + * @return array + */ + public function get_knowledge_base_posts( ?string $category ): array { + $kb_transient = self::KNOWLEDGE_BASE_TRANSIENT; + + $categories = array( + 'marketing' => 1744, + 'coupons' => 25202, + ); + + // Default to marketing category (if no category set on the kb component). + if ( ! empty( $category ) && array_key_exists( $category, $categories ) ) { + $category_id = $categories[ $category ]; + $kb_transient = $kb_transient . '_' . strtolower( $category ); + } else { + $category_id = $categories['marketing']; + } + + $posts = get_transient( $kb_transient ); + + if ( false === $posts ) { + $request_url = add_query_arg( + array( + 'categories' => $category_id, + 'page' => 1, + 'per_page' => 8, + '_embed' => 1, + ), + 'https://woocommerce.com/wp-json/wp/v2/posts?utm_medium=product' + ); + + $request = wp_remote_get( + $request_url, + array( + 'user-agent' => 'WooCommerce/' . WC()->version . '; ' . get_bloginfo( 'url' ), + ) + ); + $posts = []; + + if ( ! is_wp_error( $request ) && 200 === $request['response']['code'] ) { + $raw_posts = json_decode( $request['body'], true ); + + foreach ( $raw_posts as $raw_post ) { + $post = [ + 'title' => html_entity_decode( $raw_post['title']['rendered'] ), + 'date' => $raw_post['date_gmt'], + 'link' => $raw_post['link'], + 'author_name' => isset( $raw_post['author_name'] ) ? html_entity_decode( $raw_post['author_name'] ) : '', + 'author_avatar' => isset( $raw_post['author_avatar_url'] ) ? $raw_post['author_avatar_url'] : '', + ]; + + $featured_media = $raw_post['_embedded']['wp:featuredmedia'] ?? []; + if ( count( $featured_media ) > 0 ) { + $image = current( $featured_media ); + $post['image'] = add_query_arg( + array( + 'resize' => '650,340', + 'crop' => 1, + ), + $image['source_url'] + ); + } + + $posts[] = $post; + } + } + + set_transient( + $kb_transient, + $posts, + // Expire transient in 15 minutes if remote get failed. + empty( $posts ) ? 900 : DAY_IN_SECONDS + ); + } + + return $posts; + } +} diff --git a/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/MarketingServiceProvider.php b/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/MarketingServiceProvider.php new file mode 100644 index 00000000000..8e27386ae86 --- /dev/null +++ b/plugins/woocommerce/src/Internal/DependencyManagement/ServiceProviders/MarketingServiceProvider.php @@ -0,0 +1,44 @@ +share( MarketingSpecs::class ); + $this->share( MarketingChannels::class )->addArgument( MarketingSpecs::class ); + $this->share( InstalledExtensions::class )->addArgument( MarketingChannels::class ); + } +} diff --git a/plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingCampaignTest.php b/plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingCampaignTest.php new file mode 100644 index 00000000000..401e1630294 --- /dev/null +++ b/plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingCampaignTest.php @@ -0,0 +1,58 @@ +assertEquals( '1234', $marketing_campaign->get_id() ); + $this->assertEquals( 'Ad #1234', $marketing_campaign->get_title() ); + $this->assertEquals( 'https://example.com/manage-campaigns', $marketing_campaign->get_manage_url() ); + $this->assertNotNull( $marketing_campaign->get_cost() ); + $this->assertEquals( 'USD', $marketing_campaign->get_cost()->get_currency() ); + $this->assertEquals( '1000', $marketing_campaign->get_cost()->get_value() ); + } + + /** + * @testdox `cost` property can be null. + */ + public function test_cost_can_be_null() { + $marketing_campaign = new MarketingCampaign( '1234', 'Ad #1234', 'https://example.com/manage-campaigns' ); + + $this->assertNull( $marketing_campaign->get_cost() ); + } + + /** + * @testdox It can be serialized to JSON including all its properties. + */ + public function test_can_be_serialized_to_json() { + $marketing_campaign = new MarketingCampaign( '1234', 'Ad #1234', 'https://example.com/manage-campaigns', new Price( '1000', 'USD' ) ); + + $json = wp_json_encode( $marketing_campaign ); + $this->assertNotEmpty( $json ); + $this->assertEqualSets( + [ + 'id' => $marketing_campaign->get_id(), + 'title' => $marketing_campaign->get_title(), + 'manage_url' => $marketing_campaign->get_manage_url(), + 'cost' => [ + 'value' => $marketing_campaign->get_cost()->get_value(), + 'currency' => $marketing_campaign->get_cost()->get_currency(), + ], + ], + json_decode( $json, true ) + ); + } +} diff --git a/plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingChannelsTest.php b/plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingChannelsTest.php new file mode 100644 index 00000000000..cf5885a0557 --- /dev/null +++ b/plugins/woocommerce/tests/php/src/Admin/Marketing/MarketingChannelsTest.php @@ -0,0 +1,120 @@ +createMock( MarketingChannelInterface::class ); + $test_channel->expects( $this->any() )->method( 'get_slug' )->willReturn( 'test-channel-1' ); + + $marketing_specs = $this->createMock( MarketingSpecs::class ); + $marketing_specs->expects( $this->once() ) + ->method( 'get_recommended_plugins' ) + ->willReturn( + [ + [ + 'product' => 'test-channel-1', + ], + ] + ); + + $marketing_channels = new MarketingChannels(); + $marketing_channels->init( $marketing_specs ); + $marketing_channels->register( $test_channel ); + + $this->assertNotEmpty( $marketing_channels->get_registered_channels() ); + $this->assertEquals( $test_channel, $marketing_channels->get_registered_channels()[0] ); + } + + /** + * @testdox A marketing channel can NOT be registered using the `register` method if it is NOT in the allowed list. + */ + public function test_does_not_register_disallowed_channels() { + $test_channel = $this->createMock( MarketingChannelInterface::class ); + $test_channel->expects( $this->any() )->method( 'get_slug' )->willReturn( 'test-channel-1' ); + + $marketing_specs = $this->createMock( MarketingSpecs::class ); + $marketing_specs->expects( $this->once() )->method( 'get_recommended_plugins' )->willReturn( [] ); + + $marketing_channels = new MarketingChannels(); + $marketing_channels->init( $marketing_specs ); + $marketing_channels->register( $test_channel ); + + $this->assertEmpty( $marketing_channels->get_registered_channels() ); + } + + /** + * @testdox A marketing channel can be registered using the `woocommerce_marketing_channels` WordPress filter if it is in the allowed list. + */ + public function test_registers_allowed_channels_using_wp_filter() { + $test_channel = $this->createMock( MarketingChannelInterface::class ); + $test_channel->expects( $this->any() )->method( 'get_slug' )->willReturn( 'test-channel-1' ); + + $marketing_specs = $this->createMock( MarketingSpecs::class ); + $marketing_specs->expects( $this->once() ) + ->method( 'get_recommended_plugins' ) + ->willReturn( + [ + [ + 'product' => 'test-channel-1', + ], + ] + ); + + $marketing_channels = new MarketingChannels(); + $marketing_channels->init( $marketing_specs ); + + add_filter( + 'woocommerce_marketing_channels', + function ( array $channels ) use ( $test_channel ) { + $channels[ $test_channel->get_slug() ] = $test_channel; + + return $channels; + } + ); + + $this->assertNotEmpty( $marketing_channels->get_registered_channels() ); + $this->assertEquals( $test_channel, $marketing_channels->get_registered_channels()[0] ); + } + + /** + * @testdox A marketing channel can NOT be registered using the `woocommerce_marketing_channels` WordPress filter if it NOT is in the allowed list. + */ + public function test_does_not_register_disallowed_channels_using_wp_filter() { + $test_channel = $this->createMock( MarketingChannelInterface::class ); + $test_channel->expects( $this->any() )->method( 'get_slug' )->willReturn( 'test-channel-1' ); + + set_transient( MarketingSpecs::RECOMMENDED_PLUGINS_TRANSIENT, [] ); + + add_filter( + 'woocommerce_marketing_channels', + function ( array $channels ) use ( $test_channel ) { + $channels[ $test_channel->get_slug() ] = $test_channel; + + return $channels; + } + ); + + $marketing_channels = new MarketingChannels(); + $this->assertEmpty( $marketing_channels->get_registered_channels() ); + } +} From 9d6fe84b47bff571765ee9cf8de69239add3522c Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Wed, 9 Nov 2022 08:39:22 -0800 Subject: [PATCH 0058/1680] Fail check when template updated without version (#35510) * Fail check when template updated without version * Update logic --- .github/workflows/pr-highlight-changes.yml | 106 +++++++-------------- 1 file changed, 32 insertions(+), 74 deletions(-) diff --git a/.github/workflows/pr-highlight-changes.yml b/.github/workflows/pr-highlight-changes.yml index c6a0186279e..2d6d86e6fce 100644 --- a/.github/workflows/pr-highlight-changes.yml +++ b/.github/workflows/pr-highlight-changes.yml @@ -1,4 +1,4 @@ -name: Highlight templates and hooks changes +name: Highlight templates changes on: pull_request jobs: analyze: @@ -21,77 +21,35 @@ jobs: HEAD_REF=$(git rev-parse HEAD) version=$(pnpm run analyzer major-minor "$HEAD_REF" "plugins/woocommerce/woocommerce.php" | tail -n 1) pnpm run analyzer "$HEAD_REF" $version -o "github" - - name: Print results - id: results - run: echo "::set-output name=results::${{ steps.run.outputs.templates }}${{ steps.run.outputs.wphooks }}${{ steps.run.outputs.schema }}${{ steps.run.outputs.database }}" - comment: - name: Add comment to highlight changes - needs: analyze - runs-on: ubuntu-20.04 - steps: - - name: Find Comment - uses: peter-evans/find-comment@v2 - id: find-comment + - name: Check results + uses: actions/github-script@v6 with: - issue-number: ${{ github.event.number }} - body-includes: New hook, template, or database changes in this PR - - name: Add comment - if: ${{ needs.analyze.outputs.results && (steps.find-comment.outputs.comment-id == '') }} - uses: actions/github-script@v5 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.issues.createComment({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - body: '## New hook, template, or database changes in this PR${{ needs.analyze.outputs.results }}' - }) - - name: Update comment - if: ${{ needs.analyze.outputs.results && steps.find-comment.outputs.comment-id }} - uses: actions/github-script@v5 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.issues.updateComment({ - comment_id: ${{ steps.find-comment.outputs.comment-id }}, - owner: context.repo.owner, - repo: context.repo.repo, - body: '## New hook, template, or database changes in this PR${{ needs.analyze.outputs.results }}' - }) - - name: Delete comment - if: ${{ !needs.analyze.outputs.results && steps.find-comment.outputs.comment-id }} - uses: actions/github-script@v5 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.issues.deleteComment({ - comment_id: ${{ steps.find-comment.outputs.comment-id }}, - owner: context.repo.owner, - repo: context.repo.repo - }) - - name: Add label - if: ${{ needs.analyze.outputs.results }} - uses: actions/github-script@v5 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['release: highlight'] - }) - - name: Remove label - if: ${{ !needs.analyze.outputs.results }} - continue-on-error: true - uses: actions/github-script@v5 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: ['release: highlight'] - }) + script: | + const template = '${{ steps.run.outputs.templates }}'; + + if ( template === '' ) { + return; + } + + const templateArr = template.split( '\n' ); + const modTemplateArr = []; + let needsVersionBump = false; + + templateArr.forEach( ( el ) => { + if ( el.match( /NOTICE/ ) ) { + modTemplateArr.pop(); + return; + } + + if ( el.match( /WARNING/ ) ) { + needsVersionBump = true; + } + + modTemplateArr.push( el ); + } ); + + const templateResult = modTemplateArr.join( '\n' ); + + if ( needsVersionBump ) { + core.setFailed( `Templates have changed but template versions were not bumped:\n${ templateResult }` ); + } From 0b52411ff768279dc59bb5376255c584e797970c Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Wed, 9 Nov 2022 10:53:08 -0600 Subject: [PATCH 0059/1680] Update php version to 7.4 (#35528) * Update php version in woocommerce.php * Update php version in readme.txt * Create update-php-7.4 --- plugins/woocommerce/changelog/update-php-7.4 | 4 ++++ plugins/woocommerce/readme.txt | 2 +- plugins/woocommerce/woocommerce.php | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-php-7.4 diff --git a/plugins/woocommerce/changelog/update-php-7.4 b/plugins/woocommerce/changelog/update-php-7.4 new file mode 100644 index 00000000000..762fcf3f757 --- /dev/null +++ b/plugins/woocommerce/changelog/update-php-7.4 @@ -0,0 +1,4 @@ +Significance: patch +Type: dev +Comment: Syncs the version change that was introduced in WooCommerce 7.1, no changelog entry needed + diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index cab80d5c72a..16f4f9989ef 100644 --- a/plugins/woocommerce/readme.txt +++ b/plugins/woocommerce/readme.txt @@ -3,7 +3,7 @@ Contributors: automattic, mikejolley, jameskoster, claudiosanches, rodrigosprimo Tags: online store, ecommerce, shop, shopping cart, storefront, checkout, downloadable, downloads, payments, paypal, storefront, stripe, woo commerce, e-commerce, store, sales, sell, woo, cart Requires at least: 5.8 Tested up to: 6.0 -Requires PHP: 7.2 +Requires PHP: 7.4 Stable tag: 7.0.0 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html diff --git a/plugins/woocommerce/woocommerce.php b/plugins/woocommerce/woocommerce.php index f9426f0c4d0..212a80ba992 100644 --- a/plugins/woocommerce/woocommerce.php +++ b/plugins/woocommerce/woocommerce.php @@ -9,7 +9,7 @@ * Text Domain: woocommerce * Domain Path: /i18n/languages/ * Requires at least: 5.8 - * Requires PHP: 7.2 + * Requires PHP: 7.4 * * @package WooCommerce */ From 7cd1a030430d7215b4548d6a7037f79abd0dcb72 Mon Sep 17 00:00:00 2001 From: "Panos (Panagiotis Synetos)" <2484390+PanosSynetos@users.noreply.github.com> Date: Thu, 10 Nov 2022 19:39:26 +0200 Subject: [PATCH 0060/1680] [HPOS] Move hook `woocommerce_before_delete_order` before `woocommerce_before_delete_order` (#35517) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🧑‍💻 Move hook woocommerce_before_delete_order before deleting order --- .../changelog/fix-35516-hpos-delete-order-hook | 4 ++++ .../DataStores/Orders/OrdersTableDataStore.php | 15 ++++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-35516-hpos-delete-order-hook diff --git a/plugins/woocommerce/changelog/fix-35516-hpos-delete-order-hook b/plugins/woocommerce/changelog/fix-35516-hpos-delete-order-hook new file mode 100644 index 00000000000..9e405fc6dc8 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35516-hpos-delete-order-hook @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Move HPOS hook woocommerce_before_delete_order before deleting order. diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 64885983ab5..7568fbb5b77 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -1732,13 +1732,6 @@ FROM $order_meta_table } if ( ! empty( $args['force_delete'] ) ) { - $this->delete_order_data_from_custom_order_tables( $order_id ); - $order->set_id( 0 ); - - // If this datastore method is called while the posts table is authoritative, refrain from deleting post data. - if ( ! is_a( $order->get_data_store(), self::class ) ) { - return; - } /** * Fires immediately before an order is deleted from the database. @@ -1750,6 +1743,14 @@ FROM $order_meta_table */ do_action( 'woocommerce_before_delete_order', $order_id, $order ); + $this->delete_order_data_from_custom_order_tables( $order_id ); + $order->set_id( 0 ); + + // If this datastore method is called while the posts table is authoritative, refrain from deleting post data. + if ( ! is_a( $order->get_data_store(), self::class ) ) { + return; + } + // Delete the associated post, which in turn deletes order items, etc. through {@see WC_Post_Data}. // Once we stop creating posts for orders, we should do the cleanup here instead. wp_delete_post( $order_id ); From 57a5dd4b4ee38fd4fd7bfc969bc985bb5e62b39c Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Thu, 10 Nov 2022 16:47:19 -0600 Subject: [PATCH 0061/1680] Revert "Update php version to 7.4" (#35546) Revert "Update php version to 7.4 (#35528)" This reverts commit 0b52411ff768279dc59bb5376255c584e797970c. --- plugins/woocommerce/changelog/update-php-7.4 | 4 ---- plugins/woocommerce/readme.txt | 2 +- plugins/woocommerce/woocommerce.php | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-php-7.4 diff --git a/plugins/woocommerce/changelog/update-php-7.4 b/plugins/woocommerce/changelog/update-php-7.4 deleted file mode 100644 index 762fcf3f757..00000000000 --- a/plugins/woocommerce/changelog/update-php-7.4 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: dev -Comment: Syncs the version change that was introduced in WooCommerce 7.1, no changelog entry needed - diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index 16f4f9989ef..cab80d5c72a 100644 --- a/plugins/woocommerce/readme.txt +++ b/plugins/woocommerce/readme.txt @@ -3,7 +3,7 @@ Contributors: automattic, mikejolley, jameskoster, claudiosanches, rodrigosprimo Tags: online store, ecommerce, shop, shopping cart, storefront, checkout, downloadable, downloads, payments, paypal, storefront, stripe, woo commerce, e-commerce, store, sales, sell, woo, cart Requires at least: 5.8 Tested up to: 6.0 -Requires PHP: 7.4 +Requires PHP: 7.2 Stable tag: 7.0.0 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html diff --git a/plugins/woocommerce/woocommerce.php b/plugins/woocommerce/woocommerce.php index 212a80ba992..f9426f0c4d0 100644 --- a/plugins/woocommerce/woocommerce.php +++ b/plugins/woocommerce/woocommerce.php @@ -9,7 +9,7 @@ * Text Domain: woocommerce * Domain Path: /i18n/languages/ * Requires at least: 5.8 - * Requires PHP: 7.4 + * Requires PHP: 7.2 * * @package WooCommerce */ From 63f639b2b1bacb85a06c398ad133bae8b9c9cc84 Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Thu, 10 Nov 2022 17:07:07 -0600 Subject: [PATCH 0062/1680] Post-7.1 / release prep for 7.2 (#35547) * Update class-woocommerce.php for 7.2 * Update stable tag in readme.txt * Update version in woocommerce.php * Update version in composer.json * Update version in package.json --- plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/includes/class-woocommerce.php | 2 +- plugins/woocommerce/package.json | 2 +- plugins/woocommerce/readme.txt | 4 ++-- plugins/woocommerce/woocommerce.php | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 48554489572..533de548587 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -2,7 +2,7 @@ "name": "woocommerce/woocommerce", "description": "An eCommerce toolkit that helps you sell anything. Beautifully.", "homepage": "https://woocommerce.com/", - "version": "7.1.0", + "version": "7.2.0", "type": "wordpress-plugin", "license": "GPL-3.0-or-later", "prefer-stable": true, diff --git a/plugins/woocommerce/includes/class-woocommerce.php b/plugins/woocommerce/includes/class-woocommerce.php index 34dbc0160c9..358e533ad4d 100644 --- a/plugins/woocommerce/includes/class-woocommerce.php +++ b/plugins/woocommerce/includes/class-woocommerce.php @@ -32,7 +32,7 @@ final class WooCommerce { * * @var string */ - public $version = '7.1.0'; + public $version = '7.2.0'; /** * WooCommerce Schema version. diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index 9149fffe73b..a45ca5110d9 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -1,7 +1,7 @@ { "name": "woocommerce", "title": "WooCommerce", - "version": "7.1.0", + "version": "7.2.0", "homepage": "https://woocommerce.com/", "repository": { "type": "git", diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index cab80d5c72a..5fe7f96ac04 100644 --- a/plugins/woocommerce/readme.txt +++ b/plugins/woocommerce/readme.txt @@ -4,7 +4,7 @@ Tags: online store, ecommerce, shop, shopping cart, storefront, checkout, downlo Requires at least: 5.8 Tested up to: 6.0 Requires PHP: 7.2 -Stable tag: 7.0.0 +Stable tag: 7.1.0 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html @@ -163,6 +163,6 @@ WooCommerce comes with some sample data you can use to see how products look; im == Changelog == -= 7.1.0 2022-XX-XX = += 7.2.0 2022-XX-XX = [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce/trunk/changelog.txt). diff --git a/plugins/woocommerce/woocommerce.php b/plugins/woocommerce/woocommerce.php index f9426f0c4d0..4165ac6d636 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: 7.1.0-dev + * Version: 7.2.0-dev * Author: Automattic * Author URI: https://woocommerce.com * Text Domain: woocommerce From 736593ef1526ac1aa5495851789690b26eb2d657 Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Thu, 10 Nov 2022 23:23:28 +0000 Subject: [PATCH 0063/1680] update/a2p update `api-core-tests` to run against both CI test env and JN (#35522) * updates to allow tests to run against both CI test env and JN * update customer data file * comment uddates * baseURL update * update settings data * Update plugins/woocommerce/tests/api-core-tests/playwright.config.js Co-authored-by: Greg <71906536+zhongruige@users.noreply.github.com> * Update plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js Co-authored-by: Greg <71906536+zhongruige@users.noreply.github.com> * Update plugins/woocommerce/tests/api-core-tests/playwright.config.js Co-authored-by: Greg <71906536+zhongruige@users.noreply.github.com> * updates from code review * remove erroneous space * remove comments * updates for Localhost, LocalWP and JN Co-authored-by: Greg <71906536+zhongruige@users.noreply.github.com> --- .../update-api-core-tests-to-operate-with-JN | 4 + .../tests/api-core-tests/data/settings.js | 45 +- .../tests/api-core-tests/playwright.config.js | 6 +- .../tests/customers/customers-crud.test.js | 90 ++- .../tests/data/data-crud.test.js | 581 +----------------- .../tests/orders/order-search.test.js | 2 +- .../tests/settings/settings-crud.test.js | 73 +-- .../system-status/system-status-crud.test.js | 115 ++-- 8 files changed, 162 insertions(+), 754 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-api-core-tests-to-operate-with-JN diff --git a/plugins/woocommerce/changelog/update-api-core-tests-to-operate-with-JN b/plugins/woocommerce/changelog/update-api-core-tests-to-operate-with-JN new file mode 100644 index 00000000000..c692ecd5e7b --- /dev/null +++ b/plugins/woocommerce/changelog/update-api-core-tests-to-operate-with-JN @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update playwright api-core-tests to execute for both base test environment and base JN environment with WooCommerce \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/settings.js b/plugins/woocommerce/tests/api-core-tests/data/settings.js index 6ab0c22f2f7..a9c44950dda 100644 --- a/plugins/woocommerce/tests/api-core-tests/data/settings.js +++ b/plugins/woocommerce/tests/api-core-tests/data/settings.js @@ -96,7 +96,6 @@ const currencies = { "LKR": "Sri Lankan rupee (රු)", "LRD": "Liberian dollar ($)", "LSL": "Lesotho loti (L)", - "LYD": "Libyan dinar (د.ل)", "MAD": "Moroccan dirham (د.م.)", "MDL": "Moldovan leu (MDL)", "MGA": "Malagasy ariary (Ar)", @@ -173,7 +172,7 @@ const currencies = { "ZMW": "Zambian kwacha (ZK)" }; -const stateOptions = { +const stateOptions = { "AF": "Afghanistan", "AX": "Åland Islands", "AL:AL-01": "Albania - Berat", @@ -1353,22 +1352,6 @@ const stateOptions = { "NP:SET": "Nepal - Seti", "NL": "Netherlands", "NC": "New Caledonia", - "NZ:NTL": "New Zealand - Northland", - "NZ:AUK": "New Zealand - Auckland", - "NZ:WKO": "New Zealand - Waikato", - "NZ:BOP": "New Zealand - Bay of Plenty", - "NZ:TKI": "New Zealand - Taranaki", - "NZ:GIS": "New Zealand - Gisborne", - "NZ:HKB": "New Zealand - Hawke’s Bay", - "NZ:MWT": "New Zealand - Manawatu-Wanganui", - "NZ:WGN": "New Zealand - Wellington", - "NZ:NSN": "New Zealand - Nelson", - "NZ:MBH": "New Zealand - Marlborough", - "NZ:TAS": "New Zealand - Tasman", - "NZ:WTC": "New Zealand - West Coast", - "NZ:CAN": "New Zealand - Canterbury", - "NZ:OTA": "New Zealand - Otago", - "NZ:STL": "New Zealand - Southland", "NI:NI-AN": "Nicaragua - Atlántico Norte", "NI:NI-AS": "Nicaragua - Atlántico Sur", "NI:NI-BO": "Nicaragua - Boaco", @@ -1642,7 +1625,6 @@ const stateOptions = { "WS": "Samoa", "SM": "San Marino", "SA": "Saudi Arabia", - "SN": "Senegal", "RS:RS00": "Serbia - Belgrade", "RS:RS14": "Serbia - Bor", "RS:RS11": "Serbia - Braničevo", @@ -2105,30 +2087,6 @@ const stateOptions = { "UG:UG113": "Uganda - Wakiso", "UG:UG313": "Uganda - Yumbe", "UG:UG330": "Uganda - Zombo", - "UA:VN": "Ukraine - Vinnytsia Oblast", - "UA:VL": "Ukraine - Volyn Oblast", - "UA:DP": "Ukraine - Dnipropetrovsk Oblast", - "UA:DT": "Ukraine - Donetsk Oblast", - "UA:ZT": "Ukraine - Zhytomyr Oblast", - "UA:ZK": "Ukraine - Zakarpattia Oblast", - "UA:ZP": "Ukraine - Zaporizhzhia Oblast", - "UA:IF": "Ukraine - Ivano-Frankivsk Oblast", - "UA:KV": "Ukraine - Kyiv Oblast", - "UA:KH": "Ukraine - Kirovohrad Oblast", - "UA:LH": "Ukraine - Luhansk Oblast", - "UA:LV": "Ukraine - Lviv Oblast", - "UA:MY": "Ukraine - Mykolaiv Oblast", - "UA:OD": "Ukraine - Odessa Oblast", - "UA:PL": "Ukraine - Poltava Oblast", - "UA:RV": "Ukraine - Rivne Oblast", - "UA:SM": "Ukraine - Sumy Oblast", - "UA:TP": "Ukraine - Ternopil Oblast", - "UA:KK": "Ukraine - Kharkiv Oblast", - "UA:KS": "Ukraine - Kherson Oblast", - "UA:KM": "Ukraine - Khmelnytskyi Oblast", - "UA:CK": "Ukraine - Cherkasy Oblast", - "UA:CH": "Ukraine - Chernihiv Oblast", - "UA:CV": "Ukraine - Chernivtsi Oblast", "AE": "United Arab Emirates", "GB": "United Kingdom (UK)", "US:AL": "United States (US) - Alabama", @@ -2456,7 +2414,6 @@ const countries = { "WS": "Samoa", "SM": "San Marino", "SA": "Saudi Arabia", - "SN": "Senegal", "RS": "Serbia", "SC": "Seychelles", "SL": "Sierra Leone", diff --git a/plugins/woocommerce/tests/api-core-tests/playwright.config.js b/plugins/woocommerce/tests/api-core-tests/playwright.config.js index ed1ecd645b6..c1a73685ebc 100644 --- a/plugins/woocommerce/tests/api-core-tests/playwright.config.js +++ b/plugins/woocommerce/tests/api-core-tests/playwright.config.js @@ -1,4 +1,6 @@ const { devices } = require( '@playwright/test' ); +require( 'dotenv' ).config({ path: __dirname + '/.env' }); + const { BASE_URL, CI, @@ -6,12 +8,10 @@ const { USER_KEY, USER_SECRET, } = process.env; -require( 'dotenv' ).config(); const baseURL = BASE_URL ?? 'http://localhost:8086'; const userKey = USER_KEY ?? 'admin'; const userSecret = USER_SECRET ?? 'password'; - const base64auth = btoa( `${ userKey }:${ userSecret }` ); const config = { @@ -53,7 +53,7 @@ const config = { video: 'on-first-retry', trace: 'retain-on-failure', viewport: { width: 1280, height: 720 }, - baseURL, + baseURL: baseURL, extraHTTPHeaders: { // Add authorization token to all requests. Authorization: `Basic ${ base64auth }`, diff --git a/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js index 6234bf7e155..8f597226a19 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/customers/customers-crud.test.js @@ -5,6 +5,10 @@ const { const { customer } = require('../../data'); +const { + USER_KEY, +} = process.env; +const userKey = USER_KEY ?? 'admin'; /** * Tests for the WooCommerce Customers API. @@ -15,12 +19,72 @@ const { */ test.describe('Customers API tests: CRUD', () => { let customerId; + let subscriberUserId; + let subscriberUserCreatedDuringTests = false; + + test.beforeAll(async ({ + request + }) => { + // Call the API to return all users and determine if a + // subscriber user has been created + const customersResponse = await request.get('/wp-json/wc/v3/customers', { + params: { + role: 'all' + } + }); + const customersResponseJSON = await customersResponse.json(); + + for (const element of customersResponseJSON) { + if (element.role === 'subscriber') { + subscriberUserId = element.id; + break; + } + } + + // If a subscriber user has not been created then create one + if (!subscriberUserId) { + const userResponse = await request.post('/wp-json/wp/v2/users', { + data: { + username: "customer", + email: "customer@woocommercecoretestsuite.com", + first_name: "Jane", + last_name: "Smith", + roles: ["subscriber"], + password: "password", + name: "Jane", + } + }); + const userResponseJSON = await userResponse.json(); + // set subscriber user id to newly created user + subscriberUserId = userResponseJSON.id; + subscriberUserCreatedDuringTests = true; + } + + // Verify the subscriber user has been created + const response = await request.get(`/wp-json/wc/v3/customers/${subscriberUserId}`); + const responseJSON = await response.json(); + expect(response.status()).toEqual(200); + expect(responseJSON.role).toEqual('subscriber'); + }); + + test.afterAll(async ({ + request + }) => { + // delete subscriber user if one was created during the execution of these tests + if (subscriberUserCreatedDuringTests) { + await request.delete(`/wp-json/wc/v3/customers/${subscriberUserId}`, { + data: { + force: true + } + }); + } + }); test.describe('Retrieve after env setup', () => { /** when the environment is created, * (https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/tests/e2e-pw#woocommerce-playwright-end-to-end-tests), - * we have an admin user and a subscriber user that can both be - * accessed through their ids + * we have an admin user and a subscriber user that can both be + * accessed through their ids * admin user will have id 1 and subscriber user will have id 2 * neither of these are returned as part of the get all customers call * unless the role 'all' is passed as a search param @@ -35,14 +99,16 @@ test.describe('Customers API tests: CRUD', () => { expect(response.status()).toEqual(200); expect(responseJSON.is_paying_customer).toEqual(false); expect(responseJSON.role).toEqual('administrator'); - expect(responseJSON.username).toEqual('admin'); + // this test was updated to allow for local test setup and other test sites. + expect(responseJSON.username).toEqual(userKey); }); test('can retrieve subscriber user', async ({ request }) => { - // call API to retrieve the previously saved customer - const response = await request.get('/wp-json/wc/v3/customers/2'); + // if environment was created with subscriber user + // call API to retrieve the customer with id 2 + const response = await request.get(`/wp-json/wc/v3/customers/${subscriberUserId}`); const responseJSON = await response.json(); expect(response.status()).toEqual(200); expect(responseJSON.is_paying_customer).toEqual(false); @@ -86,7 +152,7 @@ test.describe('Customers API tests: CRUD', () => { const responseJSON = await response.json(); expect(response.status()).toEqual(200); expect(Array.isArray(responseJSON)).toBe(true); - expect(responseJSON.length).toBeGreaterThanOrEqual(2); + expect(responseJSON.length).toBeGreaterThanOrEqual(1); }); }); @@ -143,10 +209,10 @@ test.describe('Customers API tests: CRUD', () => { request, }) => { /** - * update customer names (regular, billing and shipping) to admin - * (these were initialised blank when the environment is created, - * (https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/tests/e2e-pw#woocommerce-playwright-end-to-end-tests - */ + * update customer names (regular, billing and shipping) to admin + * (these were initialised blank when the environment is created, + * (https://github.com/woocommerce/woocommerce/tree/trunk/plugins/woocommerce/tests/e2e-pw#woocommerce-playwright-end-to-end-tests + */ const response = await request.put( `/wp-json/wc/v3/customers/1`, { data: { @@ -185,7 +251,7 @@ test.describe('Customers API tests: CRUD', () => { // update customer names (billing and shipping) to Jane // (these were initialised blank, only regular first_name was populated) const response = await request.put( - `/wp-json/wc/v3/customers/2`, { + `/wp-json/wc/v3/customers/${subscriberUserId}`, { data: { billing: { first_name: 'Jane' @@ -207,7 +273,7 @@ test.describe('Customers API tests: CRUD', () => { request }) => { // call API to retrieve the subscriber customer we updated above - const response = await request.get('/wp-json/wc/v3/customers/2'); + const response = await request.get(`/wp-json/wc/v3/customers/${subscriberUserId}`); const responseJSON = await response.json(); expect(response.status()).toEqual(200); expect(responseJSON.first_name).toEqual('Jane'); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js index fd75cca644b..3ec74751050 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js @@ -1582,63 +1582,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "SNDB", - "name": "Diourbel" - }, - { - "code": "SNDK", - "name": "Dakar" - }, - { - "code": "SNFK", - "name": "Fatick" - }, - { - "code": "SNKA", - "name": "Kaffrine" - }, - { - "code": "SNKD", - "name": "Kolda" - }, - { - "code": "SNKE", - "name": "Kédougou" - }, - { - "code": "SNKL", - "name": "Kaolack" - }, - { - "code": "SNLG", - "name": "Louga" - }, - { - "code": "SNMT", - "name": "Matam" - }, - { - "code": "SNSE", - "name": "Sédhiou" - }, - { - "code": "SNSL", - "name": "Saint-Louis" - }, - { - "code": "SNTC", - "name": "Tambacounda" - }, - { - "code": "SNTH", - "name": "Thiès" - }, - { - "code": "SNZG", - "name": "Ziguinchor" - } - ] + "states": expect.arrayContaining([]), }, { "code": "SO", @@ -7611,115 +7555,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "UA05", - "name": "Vinnychchyna" - }, - { - "code": "UA07", - "name": "Volyn" - }, - { - "code": "UA09", - "name": "Luhanshchyna" - }, - { - "code": "UA12", - "name": "Dnipropetrovshchyna" - }, - { - "code": "UA14", - "name": "Donechchyna" - }, - { - "code": "UA18", - "name": "Zhytomyrshchyna" - }, - { - "code": "UA21", - "name": "Zakarpattia" - }, - { - "code": "UA23", - "name": "Zaporizhzhya" - }, - { - "code": "UA26", - "name": "Prykarpattia" - }, - { - "code": "UA30", - "name": "Kyiv" - }, - { - "code": "UA32", - "name": "Kyivshchyna" - }, - { - "code": "UA35", - "name": "Kirovohradschyna" - }, - { - "code": "UA40", - "name": "Sevastopol" - }, - { - "code": "UA43", - "name": "Crimea" - }, - { - "code": "UA46", - "name": "Lvivshchyna" - }, - { - "code": "UA48", - "name": "Mykolayivschyna" - }, - { - "code": "UA51", - "name": "Odeshchyna" - }, - { - "code": "UA53", - "name": "Poltavshchyna" - }, - { - "code": "UA56", - "name": "Rivnenshchyna" - }, - { - "code": "UA59", - "name": "Sumshchyna" - }, - { - "code": "UA61", - "name": "Ternopilshchyna" - }, - { - "code": "UA63", - "name": "Kharkivshchyna" - }, - { - "code": "UA65", - "name": "Khersonshchyna" - }, - { - "code": "UA68", - "name": "Khmelnychchyna" - }, - { - "code": "UA71", - "name": "Cherkashchyna" - }, - { - "code": "UA74", - "name": "Chernihivshchyna" - }, - { - "code": "UA77", - "name": "Chernivtsi Oblast" - } - ] + "states": expect.arrayContaining([]) }, { "code": "VA", @@ -9423,71 +9259,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "NTL", - "name": "Northland" - }, - { - "code": "AUK", - "name": "Auckland" - }, - { - "code": "WKO", - "name": "Waikato" - }, - { - "code": "BOP", - "name": "Bay of Plenty" - }, - { - "code": "TKI", - "name": "Taranaki" - }, - { - "code": "GIS", - "name": "Gisborne" - }, - { - "code": "HKB", - "name": "Hawke’s Bay" - }, - { - "code": "MWT", - "name": "Manawatu-Wanganui" - }, - { - "code": "WGN", - "name": "Wellington" - }, - { - "code": "NSN", - "name": "Nelson" - }, - { - "code": "MBH", - "name": "Marlborough" - }, - { - "code": "TAS", - "name": "Tasman" - }, - { - "code": "WTC", - "name": "West Coast" - }, - { - "code": "CAN", - "name": "Canterbury" - }, - { - "code": "OTA", - "name": "Otago" - }, - { - "code": "STL", - "name": "Southland" - } - ] + "states": expect.arrayContaining([]), }, { "code": "PF", @@ -13318,115 +13090,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "UA05", - "name": "Vinnychchyna" - }, - { - "code": "UA07", - "name": "Volyn" - }, - { - "code": "UA09", - "name": "Luhanshchyna" - }, - { - "code": "UA12", - "name": "Dnipropetrovshchyna" - }, - { - "code": "UA14", - "name": "Donechchyna" - }, - { - "code": "UA18", - "name": "Zhytomyrshchyna" - }, - { - "code": "UA21", - "name": "Zakarpattia" - }, - { - "code": "UA23", - "name": "Zaporizhzhya" - }, - { - "code": "UA26", - "name": "Prykarpattia" - }, - { - "code": "UA30", - "name": "Kyiv" - }, - { - "code": "UA32", - "name": "Kyivshchyna" - }, - { - "code": "UA35", - "name": "Kirovohradschyna" - }, - { - "code": "UA40", - "name": "Sevastopol" - }, - { - "code": "UA43", - "name": "Crimea" - }, - { - "code": "UA46", - "name": "Lvivshchyna" - }, - { - "code": "UA48", - "name": "Mykolayivschyna" - }, - { - "code": "UA51", - "name": "Odeshchyna" - }, - { - "code": "UA53", - "name": "Poltavshchyna" - }, - { - "code": "UA56", - "name": "Rivnenshchyna" - }, - { - "code": "UA59", - "name": "Sumshchyna" - }, - { - "code": "UA61", - "name": "Ternopilshchyna" - }, - { - "code": "UA63", - "name": "Kharkivshchyna" - }, - { - "code": "UA65", - "name": "Khersonshchyna" - }, - { - "code": "UA68", - "name": "Khmelnychchyna" - }, - { - "code": "UA71", - "name": "Cherkashchyna" - }, - { - "code": "UA74", - "name": "Chernihivshchyna" - }, - { - "code": "UA77", - "name": "Chernivtsi Oblast" - } - ] + "states": expect.arrayContaining([]) }, { "code": "VA", @@ -20058,71 +19722,7 @@ test.describe('Data API tests', () => { expect.objectContaining({ "code": "NZ", "name": "New Zealand", - "states": [{ - "code": "NTL", - "name": "Northland" - }, - { - "code": "AUK", - "name": "Auckland" - }, - { - "code": "WKO", - "name": "Waikato" - }, - { - "code": "BOP", - "name": "Bay of Plenty" - }, - { - "code": "TKI", - "name": "Taranaki" - }, - { - "code": "GIS", - "name": "Gisborne" - }, - { - "code": "HKB", - "name": "Hawke’s Bay" - }, - { - "code": "MWT", - "name": "Manawatu-Wanganui" - }, - { - "code": "WGN", - "name": "Wellington" - }, - { - "code": "NSN", - "name": "Nelson" - }, - { - "code": "MBH", - "name": "Marlborough" - }, - { - "code": "TAS", - "name": "Tasman" - }, - { - "code": "WTC", - "name": "West Coast" - }, - { - "code": "CAN", - "name": "Canterbury" - }, - { - "code": "OTA", - "name": "Otago" - }, - { - "code": "STL", - "name": "Southland" - } - ], + "states": expect.arrayContaining([]), "_links": { "self": [{ "href": expect.any(String) @@ -21679,63 +21279,7 @@ test.describe('Data API tests', () => { expect.objectContaining({ "code": "SN", "name": "Senegal", - "states": [{ - "code": "SNDB", - "name": "Diourbel" - }, - { - "code": "SNDK", - "name": "Dakar" - }, - { - "code": "SNFK", - "name": "Fatick" - }, - { - "code": "SNKA", - "name": "Kaffrine" - }, - { - "code": "SNKD", - "name": "Kolda" - }, - { - "code": "SNKE", - "name": "Kédougou" - }, - { - "code": "SNKL", - "name": "Kaolack" - }, - { - "code": "SNLG", - "name": "Louga" - }, - { - "code": "SNMT", - "name": "Matam" - }, - { - "code": "SNSE", - "name": "Sédhiou" - }, - { - "code": "SNSL", - "name": "Saint-Louis" - }, - { - "code": "SNTC", - "name": "Tambacounda" - }, - { - "code": "SNTH", - "name": "Thiès" - }, - { - "code": "SNZG", - "name": "Ziguinchor" - } - ], + "states": expect.arrayContaining([]), "_links": { "self": [{ "href": expect.any(String) @@ -24015,115 +23559,7 @@ test.describe('Data API tests', () => { expect.objectContaining({ "code": "UA", "name": "Ukraine", - "states": [{ - "code": "UA05", - "name": "Vinnychchyna" - }, - { - "code": "UA07", - "name": "Volyn" - }, - { - "code": "UA09", - "name": "Luhanshchyna" - }, - { - "code": "UA12", - "name": "Dnipropetrovshchyna" - }, - { - "code": "UA14", - "name": "Donechchyna" - }, - { - "code": "UA18", - "name": "Zhytomyrshchyna" - }, - { - "code": "UA21", - "name": "Zakarpattia" - }, - { - "code": "UA23", - "name": "Zaporizhzhya" - }, - { - "code": "UA26", - "name": "Prykarpattia" - }, - { - "code": "UA30", - "name": "Kyiv" - }, - { - "code": "UA32", - "name": "Kyivshchyna" - }, - { - "code": "UA35", - "name": "Kirovohradschyna" - }, - { - "code": "UA40", - "name": "Sevastopol" - }, - { - "code": "UA43", - "name": "Crimea" - }, - { - "code": "UA46", - "name": "Lvivshchyna" - }, - { - "code": "UA48", - "name": "Mykolayivschyna" - }, - { - "code": "UA51", - "name": "Odeshchyna" - }, - { - "code": "UA53", - "name": "Poltavshchyna" - }, - { - "code": "UA56", - "name": "Rivnenshchyna" - }, - { - "code": "UA59", - "name": "Sumshchyna" - }, - { - "code": "UA61", - "name": "Ternopilshchyna" - }, - { - "code": "UA63", - "name": "Kharkivshchyna" - }, - { - "code": "UA65", - "name": "Khersonshchyna" - }, - { - "code": "UA68", - "name": "Khmelnychchyna" - }, - { - "code": "UA71", - "name": "Cherkashchyna" - }, - { - "code": "UA74", - "name": "Chernihivshchyna" - }, - { - "code": "UA77", - "name": "Chernivtsi Oblast" - } - ], + "states": expect.arrayContaining([]), "_links": { "self": [{ "href": expect.any(String) @@ -26242,7 +25678,8 @@ test.describe('Data API tests', () => { expect.objectContaining({ "code": "LYD", "name": "Libyan dinar", - "symbol": "د.ل", + //"symbol": "د.ل", + "symbol": expect.stringContaining("د"), "_links": { "self": [{ "href": expect.stringContaining("data/currencies/LYD") diff --git a/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js b/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js index cac8713e056..03ae15d9253 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js @@ -87,7 +87,7 @@ test.describe( 'Order Search API tests', () => { const responseJSON = await response.json(); expect( response.status() ).toEqual( 200 ); - expect( responseJSON ).toHaveLength( 1 ); + expect( responseJSON.length ).toBeGreaterThanOrEqual( 1 ); expect( responseJSON[ 0 ].id ).toEqual( order.id ); } ); } diff --git a/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js index 78853b7e380..9aea42c6e95 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js @@ -2,6 +2,10 @@ const { test, expect } = require('@playwright/test'); +const exp = require('constants'); +const { + keys +} = require('lodash'); const { countries, currencies, @@ -239,7 +243,7 @@ test.describe('Settings API tests: CRUD', () => { test.describe('List all settings options', () => { - test.fixme('can retrieve all general settings', async ({ + test('can retrieve all general settings', async ({ request }) => { // call API to retrieve all settings options @@ -640,14 +644,8 @@ test.describe('Settings API tests: CRUD', () => { "type": "select", "default": "", "tip": "This sets the base page of your shop - this is where your product archive will be.", - "value": "5", - "options": { - "2": "Sample Page", - "5": "Shop", - "6": "Cart", - "7": "Checkout", - "8": "My account" - }, + "value": expect.any(String), + "options": expect.objectContaining({}), }) ])); @@ -682,7 +680,7 @@ test.describe('Settings API tests: CRUD', () => { "type": "text", "default": "", "tip": "This is the attachment ID, or image URL, used for placeholder images in the product catalog. Products with no image will use this.", - "value": "4", + "value": expect.any(String), }) ])); expect(responseJSON).toEqual( @@ -828,9 +826,9 @@ test.describe('Settings API tests: CRUD', () => { "label": "Notification recipient(s)", "description": "Enter recipients (comma separated) that will receive this notification.", "type": "text", - "default": "wordpress@example.com", + "default": expect.any(String), "tip": "Enter recipients (comma separated) that will receive this notification.", - "value": "wordpress@example.com", + "value": expect.any(String), }) ])); expect(responseJSON).toEqual( @@ -1348,9 +1346,9 @@ test.describe('Settings API tests: CRUD', () => { "label": "\"From\" name", "description": "How the sender name appears in outgoing WooCommerce emails.", "type": "text", - "default": "WooCommerce Core E2E Test Suite", + "default": expect.any(String), "tip": "How the sender name appears in outgoing WooCommerce emails.", - "value": "woocommerce", + "value": expect.any(String), }) ])); expect(responseJSON).toEqual( @@ -1360,9 +1358,9 @@ test.describe('Settings API tests: CRUD', () => { "label": "\"From\" address", "description": "How the sender email appears in outgoing WooCommerce emails.", "type": "email", - "default": "wordpress@example.com", + "default": expect.any(String), "tip": "How the sender email appears in outgoing WooCommerce emails.", - "value": "wordpress@example.com", + "value": expect.any(String), }) ])); expect(responseJSON).toEqual( @@ -1472,14 +1470,8 @@ test.describe('Settings API tests: CRUD', () => { "type": "select", "default": "", "tip": "Page contents: [woocommerce_cart]", - "value": "6", - "options": { - "2": "Sample Page", - "5": "Shop", - "6": "Cart", - "7": "Checkout", - "8": "My account" - }, + "value": expect.any(String), + "options": expect.any(Object), }) ])); expect(responseJSON).toEqual( @@ -1489,16 +1481,10 @@ test.describe('Settings API tests: CRUD', () => { "label": "Checkout page", "description": "Page contents: [woocommerce_checkout]", "type": "select", - "default": 7, + "default": expect.any(Number), "tip": "Page contents: [woocommerce_checkout]", - "value": "7", - "options": { - "2": "Sample Page", - "5": "Shop", - "6": "Cart", - "7": "Checkout", - "8": "My account" - } + "value": expect.any(String), + "options": expect.any(Object) }) ])); expect(responseJSON).toEqual( @@ -1510,14 +1496,8 @@ test.describe('Settings API tests: CRUD', () => { "type": "select", "default": "", "tip": "Page contents: [woocommerce_my_account]", - "value": "8", - "options": { - "2": "Sample Page", - "5": "Shop", - "6": "Cart", - "7": "Checkout", - "8": "My account" - }, + "value": expect.any(String), + "options": expect.any(Object) }) ])); expect(responseJSON).toEqual( @@ -1730,8 +1710,7 @@ test.describe('Settings API tests: CRUD', () => { "label": "Navigation", "description": "Adds the new WooCommerce navigation experience to the dashboard", "type": "checkbox", - "default": "no", - "value": "no", + "value": expect.any(String), }) ])); @@ -1765,10 +1744,10 @@ test.describe('Settings API tests: CRUD', () => { expect.objectContaining({ "id": "recipient", "label": "Recipient(s)", - "description": "Enter recipients (comma separated) for this email. Defaults to wordpress@example.com.", + "description": expect.stringContaining("Enter recipients (comma separated) for this email. Defaults to"), "type": "text", "default": "", - "tip": "Enter recipients (comma separated) for this email. Defaults to wordpress@example.com.", + "tip": expect.stringContaining("Enter recipients (comma separated) for this email. Defaults to"), "value": "", }) ])); @@ -1855,10 +1834,10 @@ test.describe('Settings API tests: CRUD', () => { expect.objectContaining({ "id": "recipient", "label": "Recipient(s)", - "description": "Enter recipients (comma separated) for this email. Defaults to wordpress@example.com.", + "description": expect.stringContaining("Enter recipients (comma separated) for this email. Defaults to"), "type": "text", "default": "", - "tip": "Enter recipients (comma separated) for this email. Defaults to wordpress@example.com.", + "tip": expect.stringContaining("Enter recipients (comma separated) for this email. Defaults to"), "value": "", }) ])); diff --git a/plugins/woocommerce/tests/api-core-tests/tests/system-status/system-status-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/system-status/system-status-crud.test.js index 3d28851df59..4518718914c 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/system-status/system-status-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/system-status/system-status-crud.test.js @@ -2,12 +2,9 @@ const { test, expect } = require('@playwright/test'); -const { - refund -} = require('../../data'); /** - * Tests for the WooCommerce Refunds API. + * Tests for the WooCommerce API. * * @group api * @group system status @@ -18,7 +15,7 @@ test.describe('System Status API tests', () => { test('can view all system status items', async ({ request }) => { - // call API to create a refund + // call API to view all system status items const response = await request.get('/wp-json/wc/v3/system_status'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -67,80 +64,80 @@ test.describe('System Status API tests', () => { "wc_database_version": expect.any(String), "database_prefix": expect.any(String), "maxmind_geoip_database": expect.any(String), - "database_tables": { - "woocommerce": { - "wp_woocommerce_sessions": { + "database_tables": expect.objectContaining({ + "woocommerce": expect.objectContaining({ + "wp_woocommerce_sessions": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_api_keys": { + }), + "wp_woocommerce_api_keys": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_attribute_taxonomies": { + }), + "wp_woocommerce_attribute_taxonomies": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_downloadable_product_permissions": { + }), + "wp_woocommerce_downloadable_product_permissions": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_order_items": { + }), + "wp_woocommerce_order_items": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_order_itemmeta": { + }), + "wp_woocommerce_order_itemmeta": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_tax_rates": { + }), + "wp_woocommerce_tax_rates": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_tax_rate_locations": { + }), + "wp_woocommerce_tax_rate_locations": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_shipping_zones": { + }), + "wp_woocommerce_shipping_zones": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_shipping_zone_locations": { + }), + "wp_woocommerce_shipping_zone_locations": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_shipping_zone_methods": { + }), + "wp_woocommerce_shipping_zone_methods": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_payment_tokens": { + }), + "wp_woocommerce_payment_tokens": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_payment_tokenmeta": { + }), + "wp_woocommerce_payment_tokenmeta": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_woocommerce_log": { + }), + "wp_woocommerce_log": expect.objectContaining({ "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - } - }, - "other": { + }) + }), + "other": expect.objectContaining({ "wp_actionscheduler_actions": { "data": expect.any(String), "index": expect.any(String), @@ -300,14 +297,9 @@ test.describe('System Status API tests', () => { "data": expect.any(String), "index": expect.any(String), "engine": expect.any(String), - }, - "wp_wpml_mails": { - "data": expect.any(String), - "index": expect.any(String), - "engine": expect.any(String), } - } - }, + }) + }), "database_size": { "data": expect.any(Number), "index": expect.any(Number) @@ -360,31 +352,6 @@ test.describe('System Status API tests', () => { ]) }) ); - expect(responseJSON).toEqual( - expect.objectContaining({ - inactive_plugins: expect.arrayContaining([{ - "plugin": expect.any(String), - "name": expect.any(String), - "version": expect.any(String), - "version_latest": expect.any(String), - "url": expect.any(String), - "author_name": expect.any(String), - "author_url": expect.any(String), - "network_activated": expect.any(Boolean) - }, - { - "plugin": expect.any(String), - "name": expect.any(String), - "version": expect.any(String), - "version_latest": expect.any(String), - "url": expect.any(String), - "author_name": expect.any(String), - "author_url": expect.any(String), - "network_activated": expect.any(Boolean) - } - ]) - }) - ); expect(responseJSON).toEqual( expect.objectContaining({ dropins_mu_plugins: expect.objectContaining({ @@ -545,7 +512,7 @@ test.describe('System Status API tests', () => { test('can view all system status tools', async ({ request }) => { - // call API to create a refund + // call API to view system status tools const response = await request.get('/wp-json/wc/v3/system_status/tools'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -578,13 +545,12 @@ test.describe('System Status API tests', () => { }), ]) ); - }); test('can retrieve a system status tool', async ({ request }) => { - // call API to create a refund + // call API to retrieve a system staus tool const response = await request.get('/wp-json/wc/v3/system_status/tools/clear_transients'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -602,7 +568,7 @@ test.describe('System Status API tests', () => { test('can run a tool from system status', async ({ request }) => { - // call API to create a refund + // call API to run a system status tool const response = await request.put('/wp-json/wc/v3/system_status/tools/clear_transients'); const responseJSON = await response.json(); expect(response.status()).toEqual(200); @@ -619,5 +585,4 @@ test.describe('System Status API tests', () => { ); }); - -}); +}); \ No newline at end of file From bddb65699b17d997f512d687ec9e1ef2c7afb483 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 14 Nov 2022 08:34:59 +0000 Subject: [PATCH 0064/1680] [HPOS] Implement "Empty Trash" functionality in list table (#35489) --- .../changelog/fix-35367-empty-trash-button | 4 ++ .../woocommerce/client/legacy/css/admin.scss | 4 ++ .../src/Internal/Admin/Orders/ListTable.php | 43 ++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-35367-empty-trash-button diff --git a/plugins/woocommerce/changelog/fix-35367-empty-trash-button b/plugins/woocommerce/changelog/fix-35367-empty-trash-button new file mode 100644 index 00000000000..2321d1bea4a --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35367-empty-trash-button @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add "Empty Trash" functionality to HPOS list table. diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index f50bd3dbf54..d5679c0407a 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -2589,6 +2589,10 @@ ul.wc_coupon_list_block { height: 30px; } } + + #order-query-submit { + margin: 0 8px 0 0; + } } .wp-list-table { diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php index c16c42482f5..36af4eeca2d 100644 --- a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php +++ b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php @@ -33,6 +33,13 @@ class ListTable extends WP_List_Table { */ private $page_controller; + /** + * Tracks whether we're currently inside the trash. + * + * @var boolean + */ + private $is_trash = false; + /** * Sets up the admin list table for orders (specifically, for orders managed by the OrdersTableDataStore). * @@ -281,6 +288,9 @@ class ListTable extends WP_List_Table { 'total_pages' => $max_num_pages, ) ); + + // Are we inside the trash? + $this->is_trash = isset( $_REQUEST['status'] ) && 'trash' === $_REQUEST['status']; } /** @@ -458,7 +468,7 @@ class ListTable extends WP_List_Table { submit_button( __( 'Filter', 'woocommerce' ), '', 'filter_action', false, array( 'id' => 'order-query-submit' ) ); } - if ( $this->is_trash && $this->has_items() && current_user_can( 'edit_others_orders' ) ) { + if ( $this->is_trash && $this->has_items() && current_user_can( 'edit_others_shop_orders' ) ) { submit_button( __( 'Empty Trash', 'woocommerce' ), 'apply', 'delete_all', false ); } @@ -886,6 +896,19 @@ class ListTable extends WP_List_Table { } } + /** + * Gets the current action selected from the bulk actions dropdown. + * + * @return string|false The action name. False if no action was selected. + */ + public function current_action() { + if ( ! empty( $_REQUEST['delete_all'] ) ) { + return 'delete_all'; + } + + return parent::current_action(); + } + /** * Handle bulk actions. */ @@ -901,6 +924,22 @@ class ListTable extends WP_List_Table { $redirect_to = remove_query_arg( array( 'deleted', 'ids' ), wp_get_referer() ); $redirect_to = add_query_arg( 'paged', $this->get_pagenum(), $redirect_to ); + if ( 'delete_all' === $action ) { + // Get all trashed orders. + $ids = wc_get_orders( + array( + 'type' => 'shop_order', + 'status' => 'trash', + 'limit' => -1, + 'return' => 'ids', + ) + ); + + $action = 'delete'; + } else { + $ids = isset( $_REQUEST['order'] ) ? array_reverse( array_map( 'absint', $_REQUEST['order'] ) ) : array(); + } + /** * Allows 3rd parties to modify order IDs about to be affected by a bulk action. * @@ -908,7 +947,7 @@ class ListTable extends WP_List_Table { */ $ids = apply_filters( // phpcs:ignore WooCommerce.Commenting.CommentHooks.MissingSinceComment 'woocommerce_bulk_action_ids', - isset( $_REQUEST['order'] ) ? array_reverse( array_map( 'absint', $_REQUEST['order'] ) ) : array(), + $ids, $action, 'order' ); From efcbe197eaad2fd35fccc5527d814472386b53f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alba=20Rinc=C3=B3n?= Date: Mon, 14 Nov 2022 11:33:10 +0100 Subject: [PATCH 0065/1680] Update woocommerce-blocks to 8.9.1 (#35564) --- .../changelog/update-woocommerce-blocks-8.9.1 | 4 ++++ plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/composer.lock | 14 +++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.1 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.1 b/plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.1 new file mode 100644 index 00000000000..01284a062d3 --- /dev/null +++ b/plugins/woocommerce/changelog/update-woocommerce-blocks-8.9.1 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Comment: Update WooCommerce Blocks to 8.9.1 diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 533de548587..4ecf4a9e18e 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -21,7 +21,7 @@ "maxmind-db/reader": "^1.11", "pelago/emogrifier": "^6.0", "woocommerce/action-scheduler": "3.4.2", - "woocommerce/woocommerce-blocks": "8.9.0" + "woocommerce/woocommerce-blocks": "8.9.1" }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4", diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index f9ee1390780..0cd604ddc8f 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": "4ba153cfcffe43c11a5c994e21a822bb", + "content-hash": "1e2e56ecdb3eb102d32d989551d76fa8", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -628,16 +628,16 @@ }, { "name": "woocommerce/woocommerce-blocks", - "version": "v8.9.0", + "version": "v8.9.1", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-blocks.git", - "reference": "9ed8e59f2f78a2bd0198750ed314590802d8f3d5" + "reference": "47f482575c0c76751319c3900f51523b16ca21ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/9ed8e59f2f78a2bd0198750ed314590802d8f3d5", - "reference": "9ed8e59f2f78a2bd0198750ed314590802d8f3d5", + "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/47f482575c0c76751319c3900f51523b16ca21ff", + "reference": "47f482575c0c76751319c3900f51523b16ca21ff", "shasum": "" }, "require": { @@ -683,9 +683,9 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-blocks/issues", - "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v8.9.0" + "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v8.9.1" }, - "time": "2022-11-08T11:37:31+00:00" + "time": "2022-11-14T08:56:26+00:00" } ], "packages-dev": [ From dda14302faec12fd4d64798d65f18eed0c5f9ddf Mon Sep 17 00:00:00 2001 From: Herman Date: Mon, 14 Nov 2022 15:52:35 +0200 Subject: [PATCH 0066/1680] Add/source param to get subscriptions call (#35051) * Add source param for subscription endpoint calls - Adds an optional $source argument to the WC_Helper_API::url() method - Get URL of page making WC_Helper::get-subscripitonts() request and add a source arg to the WC_Helper_API::get() request made by that method - Pass that source arg to the WC_Helper_API::url() methd from WC_Helper_API::get() * Add changelog file * Use sripos instead of preg_match in WC_Helper::get_subscriptions() - Update "source" argument name across methods to "query_string" to be more generic - Use separate variables to make it clear the URI of the requesting page, and the value passed as the source query string are different * Add @param declaration to function comment * Address PHPCS issues Co-authored-by: Jorge A. Torres --- .../add-source-param-to-get-subscriptions-call | 4 ++++ .../includes/admin/helper/class-wc-helper-api.php | 11 ++++++++--- .../includes/admin/helper/class-wc-helper.php | 13 +++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-source-param-to-get-subscriptions-call diff --git a/plugins/woocommerce/changelog/add-source-param-to-get-subscriptions-call b/plugins/woocommerce/changelog/add-source-param-to-get-subscriptions-call new file mode 100644 index 00000000000..2e463a72b25 --- /dev/null +++ b/plugins/woocommerce/changelog/add-source-param-to-get-subscriptions-call @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Add source parameter for calls to the subscriptions endpoint on WooCommerce.com diff --git a/plugins/woocommerce/includes/admin/helper/class-wc-helper-api.php b/plugins/woocommerce/includes/admin/helper/class-wc-helper-api.php index 29f22471b8f..4c87b2df735 100644 --- a/plugins/woocommerce/includes/admin/helper/class-wc-helper-api.php +++ b/plugins/woocommerce/includes/admin/helper/class-wc-helper-api.php @@ -42,7 +42,10 @@ class WC_Helper_API { * @return array|WP_Error The response from wp_safe_remote_request() */ public static function request( $endpoint, $args = array() ) { - $url = self::url( $endpoint ); + if ( ! isset( $args['query_string'] ) ) { + $args['query_string'] = ''; + } + $url = self::url( $endpoint, $args['query_string'] ); if ( ! empty( $args['authenticated'] ) ) { if ( ! self::_authenticate( $url, $args ) ) { @@ -160,13 +163,15 @@ class WC_Helper_API { * Using the API base, form a request URL from a given endpoint. * * @param string $endpoint The endpoint to request. + * @param string $query_string Optional query string to append to the URL. * * @return string The absolute endpoint URL. */ - public static function url( $endpoint ) { + public static function url( $endpoint, $query_string = '' ) { $endpoint = ltrim( $endpoint, '/' ); - $endpoint = sprintf( '%s/%s', self::$api_base, $endpoint ); + $endpoint = sprintf( '%s/%s/%s', self::$api_base, $endpoint, $query_string ); $endpoint = esc_url_raw( $endpoint ); + $endpoint = rtrim( $endpoint, '/' ); return $endpoint; } } diff --git a/plugins/woocommerce/includes/admin/helper/class-wc-helper.php b/plugins/woocommerce/includes/admin/helper/class-wc-helper.php index d06c3a7b4ab..de712d82f6a 100644 --- a/plugins/woocommerce/includes/admin/helper/class-wc-helper.php +++ b/plugins/woocommerce/includes/admin/helper/class-wc-helper.php @@ -1270,11 +1270,24 @@ class WC_Helper { return $data; } + $request_uri = wp_unslash( $_SERVER['REQUEST_URI'] ?? '' ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + $source = ''; + if ( stripos( $request_uri, 'wc-addons' ) ) : + $source = 'my-subscriptions'; + elseif ( stripos( $request_uri, 'plugins.php' ) ) : + $source = 'plugins'; + elseif ( stripos( $request_uri, 'wc-admin' ) ) : + $source = 'inbox-notes'; + elseif ( stripos( $request_uri, 'admin-ajax.php' ) ) : + $source = 'heartbeat-api'; + endif; + // Obtain the connected user info. $request = WC_Helper_API::get( 'subscriptions', array( 'authenticated' => true, + 'query_string' => esc_url( '?source=' . $source ), ) ); From beb2871b8db68940f6095f0ff8d7ab7b7e173720 Mon Sep 17 00:00:00 2001 From: Timstreep <49943560+Timstreep@users.noreply.github.com> Date: Mon, 14 Nov 2022 22:04:19 +0200 Subject: [PATCH 0067/1680] Update readme.txt (#35573) Co-authored-by: Peter Fabian --- plugins/woocommerce/changelog/Timstreep-patch-1 | 4 ++++ plugins/woocommerce/readme.txt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/Timstreep-patch-1 diff --git a/plugins/woocommerce/changelog/Timstreep-patch-1 b/plugins/woocommerce/changelog/Timstreep-patch-1 new file mode 100644 index 00000000000..a55f63d573e --- /dev/null +++ b/plugins/woocommerce/changelog/Timstreep-patch-1 @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update the list of tags for WC plugin on .org diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index 5fe7f96ac04..8dc8361dc8b 100644 --- a/plugins/woocommerce/readme.txt +++ b/plugins/woocommerce/readme.txt @@ -1,6 +1,6 @@ === WooCommerce === Contributors: automattic, mikejolley, jameskoster, claudiosanches, rodrigosprimo, peterfabian1000, vedjain, jamosova, obliviousharmony, konamiman, sadowski, wpmuguru, royho, barryhughes-1 -Tags: online store, ecommerce, shop, shopping cart, storefront, checkout, downloadable, downloads, payments, paypal, storefront, stripe, woo commerce, e-commerce, store, sales, sell, woo, cart +Tags: online store, ecommerce, shop, shopping cart, sell online, storefront, checkout, payments, woo, woo commerce, e-commerce, store Requires at least: 5.8 Tested up to: 6.0 Requires PHP: 7.2 From 5b06618a6f4ba05f3906e1ab4120e9bcd4d63e72 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Mon, 14 Nov 2022 21:03:13 +0000 Subject: [PATCH 0068/1680] Add scheduled sale fields (#34538) * Add scheduled sale fields to product form * Close DateTimePickerControl's dropdown when blurring from input. * Log when onChange is called for Controlled stories * Handle when input changes occur but the end date is the same * Fix DateTimePickerControl usage when uncontrolled * Fix handling when blur happens before debounced onChange --- .../changelog/fix-date-time-picker-blur-close | 4 + .../date-time-picker-control.tsx | 101 ++++++++--- .../stories/index.tsx | 46 +---- .../layout/product-section-layout.scss | 15 +- .../client/products/product-page.scss | 7 +- .../client/products/product-validation.ts | 53 ++++++ .../products/sections/pricing-section.scss | 11 ++ .../products/sections/pricing-section.tsx | 171 +++++++++++++++++- .../changelog/add-product_schedule_sale | 4 + 9 files changed, 333 insertions(+), 79 deletions(-) create mode 100644 packages/js/components/changelog/fix-date-time-picker-blur-close create mode 100644 plugins/woocommerce/changelog/add-product_schedule_sale diff --git a/packages/js/components/changelog/fix-date-time-picker-blur-close b/packages/js/components/changelog/fix-date-time-picker-blur-close new file mode 100644 index 00000000000..28fa1e5dcd4 --- /dev/null +++ b/packages/js/components/changelog/fix-date-time-picker-blur-close @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Close DateTimePickerControl's dropdown when blurring from input. diff --git a/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx b/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx index 42832b6e800..0a84164ecc8 100644 --- a/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx +++ b/packages/js/components/src/date-time-picker-control/date-time-picker-control.tsx @@ -69,8 +69,6 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { const id = `inspector-date-time-picker-control-${ instanceId }`; const inputControl = useRef< InputControl >(); - const [ inputString, setInputString ] = useState( '' ); - const displayFormat = useMemo( () => { if ( dateTimeFormat ) { return dateTimeFormat; @@ -145,6 +143,14 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { : dateTime.creationData().input?.toString() || ''; } + const currentDateTime = parseAsISODateTime( currentDate ); + + const [ inputString, setInputString ] = useState( + currentDateTime.isValid() + ? formatDateTimeForDisplay( maybeForceTime( currentDateTime ) ) + : '' + ); + const inputStringDateTime = useMemo( () => { return maybeForceTime( parseAsLocalDateTime( inputString ) ); }, [ inputString, maybeForceTime ] ); @@ -161,15 +167,23 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { const setInputStringAndMaybeCallOnChange = useCallback( ( newInputString: string, isUserTypedInput: boolean ) => { + // InputControl doesn't fire an onChange if what the user has typed + // matches the current value of the input field. To get around this, + // we pull the value directly out of the input field. This fixes + // the issue where the user ends up typing the same value. Unless they + // are typing extra slow. Without this workaround, we miss the last + // character typed. + const lastTypedValue = inputControl.current.value; + const newDateTime = maybeForceTime( isUserTypedInput - ? parseAsLocalDateTime( newInputString ) + ? parseAsLocalDateTime( lastTypedValue ) : parseAsISODateTime( newInputString, true ) ); const isDateTimeSame = newDateTime.isSame( inputStringDateTime ); if ( isUserTypedInput ) { - setInputString( newInputString ); + setInputString( lastTypedValue ); } else if ( ! isDateTimeSame ) { setInputString( formatDateTimeForDisplay( newDateTime ) ); } @@ -179,7 +193,9 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { ! isDateTimeSame ) { onChangeRef.current( - formatDateTimeAsISO( newDateTime ), + newDateTime.isValid() + ? formatDateTimeAsISO( newDateTime ) + : lastTypedValue, newDateTime.isValid() ); } @@ -198,23 +214,52 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { } } - function getUserInputOrUpdatedCurrentDate() { - const newDateTime = maybeForceTime( - parseAsISODateTime( currentDate, false ) - ); + const getUserInputOrUpdatedCurrentDate = useCallback( () => { + if ( currentDate !== undefined ) { + const newDateTime = maybeForceTime( + parseAsISODateTime( currentDate, false ) + ); - if ( - ! newDateTime.isValid() || - newDateTime.isSame( - maybeForceTime( parseAsLocalDateTime( inputString ) ) - ) - ) { - // keep the input string as the user entered it + if ( ! newDateTime.isValid() ) { + // keep the invalid string, so the user can correct it + return currentDate; + } + + if ( ! newDateTime.isSame( inputStringDateTime ) ) { + return formatDateTimeForDisplay( newDateTime ); + } + + // the new currentDate is the same date as the inputString, + // so keep exactly what the user typed in return inputString; } - return formatDateTimeForDisplay( newDateTime ); - } + // the component is uncontrolled (not using currentDate), + // so just return the input string + return inputString; + }, [ currentDate, formatDateTimeForDisplay, inputString, maybeForceTime ] ); + + // We keep a ref to the onBlur prop so that we can be sure we are + // always using the more up-to-date value, otherwise, we get in + // any infinite loop when calling onBlur + const onBlurRef = useRef< () => void >(); + useEffect( () => { + onBlurRef.current = onBlur; + }, [ onBlur ] ); + + const callOnBlurIfDropdownIsNotOpening = useCallback( ( willOpen ) => { + if ( ! willOpen && typeof onBlurRef.current === 'function' ) { + // in case the component is blurred before a debounced + // change has been processed, immediately set the input string + // to the current value of the input field, so that + // it won't be set back to the pre-change value + setInputStringAndMaybeCallOnChange( + inputControl.current.value, + true + ); + onBlurRef.current(); + } + }, [] ); return ( = ( { position="bottom left" focusOnMount={ false } // @ts-expect-error `onToggle` does exist. - onToggle={ ( willOpen ) => { - if ( ! willOpen && typeof onBlur === 'function' ) { - onBlur(); - } - } } - renderToggle={ ( { isOpen, onToggle } ) => ( + onToggle={ callOnBlurIfDropdownIsNotOpening } + renderToggle={ ( { isOpen, onClose, onToggle } ) => ( = ( { if ( hasFocusLeftInputAndDropdownContent( event ) ) { - onToggle(); // hide the dropdown + // close the dropdown, which will also trigger + // the component's onBlur to be called + onClose(); } } } suffix={ @@ -285,14 +328,14 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( { } } renderContent={ () => { const Picker = isDateOnlyPicker ? DatePicker : WpDateTimePicker; - const inputDateTime = parseAsLocalDateTime( inputString ); return ( setInputStringAndMaybeCallOnChange( diff --git a/packages/js/components/src/date-time-picker-control/stories/index.tsx b/packages/js/components/src/date-time-picker-control/stories/index.tsx index 4ce10f12129..e41e2413859 100644 --- a/packages/js/components/src/date-time-picker-control/stories/index.tsx +++ b/packages/js/components/src/date-time-picker-control/stories/index.tsx @@ -3,7 +3,7 @@ */ import React from 'react'; import { Button, Popover, SlotFillProvider } from '@wordpress/components'; -import { createElement, useState } from '@wordpress/element'; +import { createElement, useCallback, useState } from '@wordpress/element'; /** * Internal dependencies @@ -37,42 +37,6 @@ CustomDateTimeFormat.args = { dateTimeFormat: customFormat, }; -function ControlledContainer( { children, ...props } ) { - function nowWithZeroedSeconds() { - const now = new Date(); - now.setSeconds( 0 ); - now.setMilliseconds( 0 ); - return now; - } - - const [ controlledDate, setControlledDate ] = useState( - nowWithZeroedSeconds().toISOString() - ); - - return ( -
-
{ children( controlledDate, setControlledDate ) }
-
- -
-
- Controlled date: -
{ controlledDate } -
-
-
-
- ); -} - export const ReallyLongHelp = Template.bind( {} ); ReallyLongHelp.args = { ...Basic.args, @@ -97,13 +61,19 @@ function ControlledDecorator( Story, props ) { nowWithZeroedSeconds().toISOString() ); + const onChange = useCallback( ( newDateTimeISOString ) => { + setControlledDate( newDateTimeISOString ); + // eslint-disable-next-line no-console + console.log( 'onChange', newDateTimeISOString ); + }, [] ); + return (
diff --git a/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss b/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss index 15b02e61f1f..ebc6c9d675e 100644 --- a/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss +++ b/plugins/woocommerce-admin/client/products/layout/product-section-layout.scss @@ -10,14 +10,15 @@ box-shadow: none; &__body { padding: $gap-large; - } - } - .components-base-control, - .woocommerce-rich-text-editor { - &:not(:first-child):not(.components-radio-control) { - margin-top: $gap-large - $gap-smaller; - margin-bottom: 0; + > .components-base-control, + > .components-dropdown, + > .woocommerce-rich-text-editor { + &:not(:first-child):not(.components-radio-control) { + margin-top: $gap-large - $gap-smaller; + margin-bottom: 0; + } + } } } diff --git a/plugins/woocommerce-admin/client/products/product-page.scss b/plugins/woocommerce-admin/client/products/product-page.scss index dae149dad32..c2157c95a65 100644 --- a/plugins/woocommerce-admin/client/products/product-page.scss +++ b/plugins/woocommerce-admin/client/products/product-page.scss @@ -31,6 +31,12 @@ display: flex; } } + .components-toggle-control + .components-base-control__field + .components-toggle-control__label { + display: flex; + align-items: center; + } .woocommerce-tooltip { margin-left: $gap-smaller; } @@ -104,4 +110,3 @@ height: 100%; } } - diff --git a/plugins/woocommerce-admin/client/products/product-validation.ts b/plugins/woocommerce-admin/client/products/product-validation.ts index c00a1ee9a1d..3f93c0e00e9 100644 --- a/plugins/woocommerce-admin/client/products/product-validation.ts +++ b/plugins/woocommerce-admin/client/products/product-validation.ts @@ -9,12 +9,60 @@ import { ProductDimensions, } from '@woocommerce/data'; import type { FormErrors } from '@woocommerce/components'; +import moment from 'moment'; /** * Internal dependencies */ import { validate as validateInventory } from './sections/product-inventory-section'; +function validateScheduledSaleFields( + values: Partial< Product< ProductStatus, ProductType > > +): FormErrors< typeof values > { + const errors: FormErrors< typeof values > = {}; + + const dateOnSaleFrom = moment( + values.date_on_sale_from_gmt, + moment.ISO_8601, + true + ); + const dateOnSaleTo = moment( + values.date_on_sale_to_gmt, + moment.ISO_8601, + true + ); + + if ( values.date_on_sale_from_gmt && ! dateOnSaleFrom.isValid() ) { + errors.date_on_sale_from_gmt = __( + 'Please enter a valid date.', + 'woocommerce' + ); + } + + if ( values.date_on_sale_to_gmt && ! dateOnSaleTo.isValid() ) { + errors.date_on_sale_to_gmt = __( + 'Please enter a valid date.', + 'woocommerce' + ); + } + + if ( dateOnSaleFrom.isAfter( dateOnSaleTo ) ) { + errors.date_on_sale_from_gmt = __( + 'The start date of the sale must be before the end date.', + 'woocommerce' + ); + } + + if ( dateOnSaleTo.isBefore( dateOnSaleFrom ) ) { + errors.date_on_sale_to_gmt = __( + 'The end date of the sale must be after the start date.', + 'woocommerce' + ); + } + + return errors; +} + export const validate = ( values: Partial< Product< ProductStatus, ProductType > > ) => { @@ -58,6 +106,11 @@ export const validate = ( ); } + errors = { + ...errors, + ...validateScheduledSaleFields( values ), + }; + if ( values.dimensions?.width && +values.dimensions.width <= 0 ) { errors.dimensions = { width: __( 'Width must be higher than zero.', 'woocommerce' ), diff --git a/plugins/woocommerce-admin/client/products/sections/pricing-section.scss b/plugins/woocommerce-admin/client/products/sections/pricing-section.scss index c081e91cff4..cbb1f97f9d2 100644 --- a/plugins/woocommerce-admin/client/products/sections/pricing-section.scss +++ b/plugins/woocommerce-admin/client/products/sections/pricing-section.scss @@ -4,3 +4,14 @@ margin-top: $gap-small; } } + +.product-pricing-section { + &__scheduled-sale { + &__spinner-wrapper { + display: flex; + align-items: center; + justify-content: center; + min-height: 150px; + } + } +} diff --git a/plugins/woocommerce-admin/client/products/sections/pricing-section.tsx b/plugins/woocommerce-admin/client/products/sections/pricing-section.tsx index d5f530eb2f8..9da449baf7a 100644 --- a/plugins/woocommerce-admin/client/products/sections/pricing-section.tsx +++ b/plugins/woocommerce-admin/client/products/sections/pricing-section.tsx @@ -2,11 +2,22 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; -import { Link, useFormContext } from '@woocommerce/components'; -import { Product, SETTINGS_STORE_NAME } from '@woocommerce/data'; +import { + DateTimePickerControl, + Link, + useFormContext, + __experimentalTooltip as Tooltip, +} from '@woocommerce/components'; +import { + Product, + OPTIONS_STORE_NAME, + SETTINGS_STORE_NAME, +} from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; -import { useContext } from '@wordpress/element'; +import { useContext, useEffect, useState } from '@wordpress/element'; import { useSelect } from '@wordpress/data'; +import { format as formatDate } from '@wordpress/date'; +import moment from 'moment'; import interpolateComponents from '@automattic/interpolate-components'; import { // @ts-expect-error `__experimentalInputControl` does exist. @@ -14,6 +25,7 @@ import { BaseControl, Card, CardBody, + ToggleControl, } from '@wordpress/components'; /** @@ -26,9 +38,16 @@ import { ADMIN_URL } from '../../utils/admin-settings'; import { CurrencyContext } from '../../lib/currency-context'; import { useProductHelper } from '../use-product-helper'; +const PRODUCT_SCHEDULED_SALE_SLUG = 'product-scheduled-sale'; + export const PricingSection: React.FC = () => { - const { getInputProps } = useFormContext< Product >(); const { sanitizePrice } = useProductHelper(); + const { getInputProps, setValues, values } = useFormContext< Product >(); + const [ showSaleSchedule, setShowSaleSchedule ] = useState( false ); + const [ userToggledSaleSchedule, setUserToggledSaleSchedule ] = + useState( false ); + const [ autoToggledSaleSchedule, setAutoToggledSaleSchedule ] = + useState( false ); const { isResolving: isTaxSettingsResolving, taxSettings } = useSelect( ( select ) => { const { getSettings, hasFinishedResolution } = @@ -56,6 +75,55 @@ export const PricingSection: React.FC = () => { 'woocommerce' ); + const { dateFormat, timeFormat } = useSelect( ( select ) => { + const { getOption } = select( OPTIONS_STORE_NAME ); + return { + dateFormat: ( getOption( 'date_format' ) as string ) || 'F j, Y', + timeFormat: ( getOption( 'time_format' ) as string ) || 'H:i', + }; + } ); + + const onSaleScheduleToggleChange = ( value: boolean ) => { + recordEvent( 'product_pricing_schedule_sale_toggle_click', { + enabled: value, + } ); + + setUserToggledSaleSchedule( true ); + setShowSaleSchedule( value ); + + if ( value ) { + setValues( { + date_on_sale_from_gmt: moment().startOf( 'day' ).toISOString(), + date_on_sale_to_gmt: null, + } as Product ); + } else { + setValues( { + date_on_sale_from_gmt: null, + date_on_sale_to_gmt: null, + } as Product ); + } + }; + + useEffect( () => { + if ( userToggledSaleSchedule || autoToggledSaleSchedule ) { + return; + } + + const hasDateOnSaleFrom = + typeof values.date_on_sale_from_gmt === 'string' && + values.date_on_sale_from_gmt.length > 0; + const hasDateOnSaleTo = + typeof values.date_on_sale_to_gmt === 'string' && + values.date_on_sale_to_gmt.length > 0; + + const hasSaleSchedule = hasDateOnSaleFrom || hasDateOnSaleTo; + + if ( hasSaleSchedule ) { + setAutoToggledSaleSchedule( true ); + setShowSaleSchedule( true ); + } + }, [ userToggledSaleSchedule, autoToggledSaleSchedule, values ] ); + const taxSettingsElement = interpolateComponents( { mixedString: pricesIncludeTax ? taxIncludedInPriceText @@ -91,6 +159,12 @@ export const PricingSection: React.FC = () => { ); const salePriceProps = getInputProps( 'sale_price', currencyInputProps ); + const dateTimePickerProps = { + className: 'woocommerce-product__date-time-picker', + isDateOnlyPicker: true, + dateTimeFormat: dateFormat, + }; + return ( { ) } /> + + + { __( 'Schedule sale', 'woocommerce' ) } + + { formatDate( + timeFormat, + moment().startOf( + 'day' + ) + ) } + + ), + endTime: ( + + { formatDate( + timeFormat, + moment().endOf( 'day' ) + ) } + + ), + moreLink: ( + + recordEvent( + 'add_product_learn_more', + { + category: + PRODUCT_SCHEDULED_SALE_SLUG, + } + ) + } + > + { __( + 'Learn more', + 'woocommerce' + ) } + + ), + }, + } ) } + /> + + } + checked={ showSaleSchedule } + onChange={ onSaleScheduleToggleChange } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore disabled prop exists + disabled={ ! ( values.sale_price?.length > 0 ) } + /> + + { showSaleSchedule && ( + <> + + + + + ) } diff --git a/plugins/woocommerce/changelog/add-product_schedule_sale b/plugins/woocommerce/changelog/add-product_schedule_sale new file mode 100644 index 00000000000..bc58ab91d62 --- /dev/null +++ b/plugins/woocommerce/changelog/add-product_schedule_sale @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add scheduled sale support to new product edit page. From 932b3386c3100f60607fb8b74c0cad2ccfb2f6cc Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Mon, 14 Nov 2022 21:08:27 +0000 Subject: [PATCH 0069/1680] Image Gallery: Update toolbar position and tooltips (#35534) * Move image gallery toolbar up a bit * Increase z-index of image gallery toolbar so that tooltips are not behind other images * Update image gallery toolbar button tooltips --- .../changelog/fix-product-images-toolbar-positioning | 4 ++++ .../components/src/image-gallery/image-gallery-toolbar.scss | 3 ++- .../components/src/image-gallery/image-gallery-toolbar.tsx | 6 +++--- 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 packages/js/components/changelog/fix-product-images-toolbar-positioning diff --git a/packages/js/components/changelog/fix-product-images-toolbar-positioning b/packages/js/components/changelog/fix-product-images-toolbar-positioning new file mode 100644 index 00000000000..fc6df228ba7 --- /dev/null +++ b/packages/js/components/changelog/fix-product-images-toolbar-positioning @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Updated image gallery toolbar position and tooltips. diff --git a/packages/js/components/src/image-gallery/image-gallery-toolbar.scss b/packages/js/components/src/image-gallery/image-gallery-toolbar.scss index 55e1c16103f..fa9507fb86f 100644 --- a/packages/js/components/src/image-gallery/image-gallery-toolbar.scss +++ b/packages/js/components/src/image-gallery/image-gallery-toolbar.scss @@ -1,7 +1,8 @@ .woocommerce-image-gallery__toolbar { position: absolute; - top: -50px; + top: -58px; left: 50%; transform: translateX(-50%); + z-index: 1000; background-color: white; } diff --git a/packages/js/components/src/image-gallery/image-gallery-toolbar.tsx b/packages/js/components/src/image-gallery/image-gallery-toolbar.tsx index 1c2cbcc0f98..8a325f157a5 100644 --- a/packages/js/components/src/image-gallery/image-gallery-toolbar.tsx +++ b/packages/js/components/src/image-gallery/image-gallery-toolbar.tsx @@ -64,7 +64,7 @@ export const ImageGalleryToolbar: React.FC< ImageGalleryToolbarProps > = ( { icon={ () => ( ) } - label={ __( 'Drag', 'woocommerce' ) } + label={ __( 'Drag to reorder', 'woocommerce' ) } /> = ( { setAsCoverImage( childIndex ) } icon={ CoverImageIcon } - label={ __( 'Set as cover image', 'woocommerce' ) } + label={ __( 'Set as cover', 'woocommerce' ) } /> ) } @@ -106,7 +106,7 @@ export const ImageGalleryToolbar: React.FC< ImageGalleryToolbarProps > = ( { removeItem( childIndex ) } icon={ trash } - label={ __( 'Delete', 'woocommerce' ) } + label={ __( 'Remove', 'woocommerce' ) } /> From 63242cfa62566100dfb8cecc376edb859d6f7edc Mon Sep 17 00:00:00 2001 From: Sam Seay Date: Tue, 15 Nov 2022 13:58:45 +1300 Subject: [PATCH 0070/1680] Remove duplicated API code folder in woocommerce-beta-tester (#35549) --- .../api/api/admin-notes/add-note.php | 67 ----------- .../api/api/admin-notes/delete-all-notes.php | 18 --- .../woocommerce-beta-tester/api/api/api.php | 41 ------- .../api/api/features/features.php | 59 ---------- .../api/api/options/rest-api.php | 79 ------------- .../api/api/rest-api-filters/hook.php | 52 --------- .../api/rest-api-filters/rest-api-filters.php | 109 ------------------ .../api/api/tools/delete-all-products.php | 16 --- .../api/api/tools/disable-wc-email.php | 46 -------- .../api/api/tools/run-wc-admin-daily.php | 11 -- .../api/api/tools/trigger-cron-job.php | 98 ---------------- .../api/tools/trigger-update-callbacks.php | 47 -------- .../api/api/tools/trigger-wca-install.php | 11 -- .../api/api/tracks/tracks-debug-log.php | 53 --------- .../changelog/dev-delete-duplicated-folder | 4 + 15 files changed, 4 insertions(+), 707 deletions(-) delete mode 100644 plugins/woocommerce-beta-tester/api/api/admin-notes/add-note.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/admin-notes/delete-all-notes.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/api.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/features/features.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/options/rest-api.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/rest-api-filters/hook.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/rest-api-filters/rest-api-filters.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tools/delete-all-products.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tools/disable-wc-email.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tools/run-wc-admin-daily.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tools/trigger-cron-job.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tools/trigger-update-callbacks.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tools/trigger-wca-install.php delete mode 100644 plugins/woocommerce-beta-tester/api/api/tracks/tracks-debug-log.php create mode 100644 plugins/woocommerce-beta-tester/changelog/dev-delete-duplicated-folder diff --git a/plugins/woocommerce-beta-tester/api/api/admin-notes/add-note.php b/plugins/woocommerce-beta-tester/api/api/admin-notes/add-note.php deleted file mode 100644 index ef693750289..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/admin-notes/add-note.php +++ /dev/null @@ -1,67 +0,0 @@ -get_param( 'type' ); - $layout = $request->get_param( 'layout' ); - - $note->set_name( $request->get_param( 'name' ) ); - $note->set_title( $request->get_param( 'title' ) ); - $note->set_content( $mock_note_data[ 'content' ] ); - $note->set_image( $mock_note_data[ $type ][ $layout ] ); - $note->set_layout( $layout ); - $note->set_type( $type ); - possibly_add_action( $note ); - - if ( 'email' === $type ) { - add_email_note_params( $note ); - } - - $note->save(); - - return true; -} - -function add_email_note_params( $note ) { - $additional_data = array( - 'role' => 'administrator', - ); - $note->set_content_data( (object) $additional_data ); -} - -function possibly_add_action( $note ) { - if ( $note->get_type() === 'info' ) { - return; - } - $action_name = sprintf( - 'test-action-%s', - $note->get_name() - ); - $note->add_action( $action_name, 'Test action', wc_admin_url() ); -} - -function get_mock_note_data() { - $plugin_url = site_url() . '/wp-content/plugins/woocommerce-admin-test-helper/'; - return array( - 'content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud.', - 'info' => array( - 'banner' => $plugin_url . 'images/admin-notes/banner.jpg', - 'thumbnail' => $plugin_url . 'images/admin-notes/thumbnail.jpg', - 'plain' => '' - ), - 'email' => array( - 'plain' => $plugin_url . 'images/admin-notes/woocommerce-logo-vector.png' - ), - 'update' => array( - 'plain' => '' - ) - ); -} diff --git a/plugins/woocommerce-beta-tester/api/api/admin-notes/delete-all-notes.php b/plugins/woocommerce-beta-tester/api/api/admin-notes/delete-all-notes.php deleted file mode 100644 index 38195c63c66..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/admin-notes/delete-all-notes.php +++ /dev/null @@ -1,18 +0,0 @@ -query( "DELETE FROM {$wpdb->prefix}wc_admin_notes" ); - $deleted_action_count = $wpdb->query( "DELETE FROM {$wpdb->prefix}wc_admin_note_actions" ); - - return array( - 'deleted_note_count' => $deleted_note_count, - 'deleted_action_count' => $deleted_action_count, - ); -} - diff --git a/plugins/woocommerce-beta-tester/api/api/api.php b/plugins/woocommerce-beta-tester/api/api/api.php deleted file mode 100644 index 36614cbe251..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/api.php +++ /dev/null @@ -1,41 +0,0 @@ - 'POST', - 'callback' => $callback, - 'permission_callback' => function( $request ) { - if ( ! wc_rest_check_manager_permissions( 'settings', 'edit' ) ) { - return new \WP_Error( - 'woocommerce_rest_cannot_edit', - __( 'Sorry, you cannot perform this action', 'woocommerce-admin-test-helper' ) - ); - } - return true; - }, - ); - - $default_options = array_merge( $default_options, $additional_options ); - - register_rest_route( - 'wc-admin-test-helper', - $route, - $default_options - ); - } ); -} - -require( 'admin-notes/delete-all-notes.php' ); -require( 'admin-notes/add-note.php' ); -require( 'tools/trigger-wca-install.php' ); -require( 'tools/trigger-cron-job.php' ); -require( 'tools/run-wc-admin-daily.php' ); -require( 'options/rest-api.php' ); -require( 'tools/delete-all-products.php'); -require( 'tools/disable-wc-email.php' ); -require( 'tools/trigger-update-callbacks.php' ); -require( 'tracks/tracks-debug-log.php' ); -require( 'features/features.php' ); -require( 'rest-api-filters/rest-api-filters.php' ); -require( 'rest-api-filters/hook.php' ); diff --git a/plugins/woocommerce-beta-tester/api/api/features/features.php b/plugins/woocommerce-beta-tester/api/api/features/features.php deleted file mode 100644 index f19db0cb94f..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/features/features.php +++ /dev/null @@ -1,59 +0,0 @@ -[a-z0-9_\-]+)/toggle', - 'toggle_feature', - array( - 'methods' => 'POST', - ) -); - -register_woocommerce_admin_test_helper_rest_route( - '/features', - 'get_features', - array( - 'methods' => 'GET', - ) -); - -register_woocommerce_admin_test_helper_rest_route( - '/features/reset', - 'reset_features', - array( - 'methods' => 'POST', - ) -); - -function toggle_feature( $request ) { - $features = get_features(); - $custom_feature_values = get_option( OPTION_NAME_PREFIX, array() ); - $feature_name = $request->get_param( 'feature_name' ); - - if ( ! isset( $features[$feature_name ]) ) { - return new WP_REST_Response( $features, 204 ); - } - - if ( isset( $custom_feature_values[$feature_name] ) ) { - unset( $custom_feature_values[$feature_name] ); - } else { - $custom_feature_values[$feature_name] = ! $features[ $feature_name ]; - } - - update_option(OPTION_NAME_PREFIX, $custom_feature_values ); - return new WP_REST_Response( get_features(), 200 ); -} - -function reset_features() { - delete_option( OPTION_NAME_PREFIX ); - return new WP_REST_Response( get_features(), 200 ); -} - -function get_features() { - if ( function_exists( 'wc_admin_get_feature_config' ) ) { - return apply_filters( 'woocommerce_admin_get_feature_config', wc_admin_get_feature_config() ); - } - return array(); -} diff --git a/plugins/woocommerce-beta-tester/api/api/options/rest-api.php b/plugins/woocommerce-beta-tester/api/api/options/rest-api.php deleted file mode 100644 index 4b0c013102f..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/options/rest-api.php +++ /dev/null @@ -1,79 +0,0 @@ - 'GET', - 'args' => array( - 'page' => array( - 'description' => 'Current page of the collection.', - 'type' => 'integer', - 'default' => 1, - 'sanitize_callback' => 'absint', - ), - 'per_page' => array( - 'description' => 'Maximum number of items to be returned in result set.', - 'type' => 'integer', - 'default' => 10, - 'sanitize_callback' => 'absint', - ), - 'search' => array( - 'description' => 'Limit results to those matching a string.', - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - ) -); - -register_woocommerce_admin_test_helper_rest_route( - '/options/(?P(.*)+)', - 'wca_test_helper_delete_option', - array( - 'methods' => 'DELETE', - 'args' => array( - 'option_names' => array( - 'type' => 'string', - ), - ), - ) -); - -function wca_test_helper_delete_option( $request ) { - global $wpdb; - $option_names = explode( ',', $request->get_param( 'option_names' ) ); - $option_names = array_map( function( $option_name ) { - return "'" . $option_name . "'"; - }, $option_names ); - - $option_names = implode( ',', $option_names ); - $query = "delete from {$wpdb->prefix}options where option_name in ({$option_names})"; - $wpdb->query( $query ); - - return new WP_REST_RESPONSE( null, 204 ); -} - -function wca_test_helper_get_options( $request ) { - global $wpdb; - - $per_page = $request->get_param( 'per_page' ); - $page = $request->get_param( 'page' ); - $search = $request->get_param( 'search' ); - - $query = " - select option_id, option_name, option_value, autoload - from {$wpdb->prefix}options - "; - - if ( $search ) { - $query .= "where option_name like '%{$search}%'"; - } - - $query .= ' order by option_id desc limit 30'; - - $options = $wpdb->get_results( $query ); - - return new WP_REST_Response( $options, 200 ); -} - diff --git a/plugins/woocommerce-beta-tester/api/api/rest-api-filters/hook.php b/plugins/woocommerce-beta-tester/api/api/rest-api-filters/hook.php deleted file mode 100644 index 65f331ee829..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/rest-api-filters/hook.php +++ /dev/null @@ -1,52 +0,0 @@ - 1 ) { - $key = array_shift($keys); - if (! isset($array[$key]) || ! is_array($array[$key]) ) { - $array[$key] = []; - } - $array = &$array[$key]; - } - - $array[ array_shift($keys) ] = $value; - return $array; -} - -add_filter( - 'rest_request_after_callbacks', - function ( $response, array $handler, \WP_REST_Request $request ) use ( $filters ) { - if (! $response instanceof \WP_REST_Response ) { - return $response; - } - $route = $request->get_route(); - $filters = array_filter( - $filters, function ( $filter ) use ( $request, $route ) { - if ($filter['enabled'] && $filter['endpoint'] == $route ) { - return true; - } - return false; - } - ); - - $data = $response->get_data(); - - foreach ( $filters as $filter ) { - array_dot_set($data, $filter['dot_notation'], $filter['replacement']); - } - - $response->set_data($data); - - return $response; - }, - 10, - 3 -); \ No newline at end of file diff --git a/plugins/woocommerce-beta-tester/api/api/rest-api-filters/rest-api-filters.php b/plugins/woocommerce-beta-tester/api/api/rest-api-filters/rest-api-filters.php deleted file mode 100644 index 19b06c9a722..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/rest-api-filters/rest-api-filters.php +++ /dev/null @@ -1,109 +0,0 @@ - 'POST', - 'args' => array( - 'endpoint' => array( - 'description' => 'Rest API endpoint.', - 'type' => 'string', - 'required' => true, - 'sanitize_callback' => 'sanitize_text_field', - ), - 'dot_notation' => array( - 'description' => 'Dot notation of the target field.', - 'type' => 'string', - 'required' => true, - 'sanitize_callback' => 'sanitize_text_field', - ), - 'replacement' => array( - 'description' => 'Replacement value for the target field.', - 'type' => 'string', - 'required' => true, - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - ) -); - -register_woocommerce_admin_test_helper_rest_route( - '/rest-api-filters', - [ WCA_Test_Helper_Rest_Api_Filters::class, 'delete' ], - array( - 'methods' => 'DELETE', - 'args' => array( - 'index' => array( - 'description' => 'Rest API endpoint.', - 'type' => 'integer', - 'required' => true, - ), - ), - ) -); - - -register_woocommerce_admin_test_helper_rest_route( - '/rest-api-filters/(?P\d+)/toggle', - [ WCA_Test_Helper_Rest_Api_Filters::class, 'toggle' ], - array( - 'methods' => 'POST', - ) -); - - -class WCA_Test_Helper_Rest_Api_Filters { - const WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION = 'wc-admin-test-helper-rest-api-filters'; - - public static function create( $request ) { - $endpoint = $request->get_param('endpoint'); - $dot_notation = $request->get_param('dot_notation'); - $replacement = $request->get_param('replacement'); - - self::update( - function ( $filters ) use ( - $endpoint, - $dot_notation, - $replacement - ) { - $filters[] = array( - 'endpoint' => $endpoint, - 'dot_notation' => $dot_notation, - 'replacement' => filter_var( $replacement, FILTER_VALIDATE_BOOLEAN ), - 'enabled' => true, - ); - return $filters; - } - ); - return new WP_REST_RESPONSE(null, 204); - } - - public static function update( callable $callback ) { - $filters = get_option(self::WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION, array()); - $filters = $callback( $filters ); - return update_option(self::WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION, $filters); - } - - public static function delete( $request ) { - self::update( - function ( $filters ) use ( $request ) { - array_splice($filters, $request->get_param('index'), 1); - return $filters; - } - ); - - return new WP_REST_RESPONSE(null, 204); - } - - public static function toggle( $request ) { - self::update( - function ( $filters ) use ( $request ) { - $index = $request->get_param('index'); - $filters[$index]['enabled'] = !$filters[$index]['enabled']; - return $filters; - } - ); - return new WP_REST_RESPONSE(null, 204); - } -} \ No newline at end of file diff --git a/plugins/woocommerce-beta-tester/api/api/tools/delete-all-products.php b/plugins/woocommerce-beta-tester/api/api/tools/delete-all-products.php deleted file mode 100644 index 953f7e11e3b..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/tools/delete-all-products.php +++ /dev/null @@ -1,16 +0,0 @@ -get_products(); - - foreach ( $products as $product ) { - $product->delete( true ); - } - - return true; -} diff --git a/plugins/woocommerce-beta-tester/api/api/tools/disable-wc-email.php b/plugins/woocommerce-beta-tester/api/api/tools/disable-wc-email.php deleted file mode 100644 index 7997195fbc7..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/tools/disable-wc-email.php +++ /dev/null @@ -1,46 +0,0 @@ - 'GET', - ) -); - -function toggle_emails() { - $emails_disabled = 'yes'; - if ( $emails_disabled === get_option( 'wc_admin_test_helper_email_disabled', 'no' ) ) { - $emails_disabled = 'no'; - remove_filter('woocommerce_email_get_option', 'disable_wc_emails' ); - } - update_option('wc_admin_test_helper_email_disabled', $emails_disabled ); - return new WP_REST_Response( $emails_disabled, 200 ); -} - -function get_email_status() { - $emails_disabled = get_option( 'wc_admin_test_helper_email_disabled', 'no' ); - return new WP_REST_Response( $emails_disabled, 200 ); -} - -if ( 'yes' === get_option( 'wc_admin_test_helper_email_disabled', 'no' ) ) { - add_filter('woocommerce_email_get_option', 'disable_wc_emails' ); - add_action( 'woocommerce_email', 'unhook_other_wc_emails' ); -} - -function disable_wc_emails( $key ) { - if ( $key === 'enabled' ) { - return false; - } -} - -function unhook_other_wc_emails( $email ) { - remove_action( 'woocommerce_low_stock_notification', array( $email, 'low_stock' ) ); - remove_action( 'woocommerce_no_stock_notification', array( $email, 'no_stock' ) ); - remove_action( 'woocommerce_product_on_backorder_notification', array( $email, 'backorder' ) ); - remove_action( 'woocommerce_new_customer_note_notification', array( $email->emails['WC_Email_Customer_Note'], 'trigger' ) ); -} diff --git a/plugins/woocommerce-beta-tester/api/api/tools/run-wc-admin-daily.php b/plugins/woocommerce-beta-tester/api/api/tools/run-wc-admin-daily.php deleted file mode 100644 index 70f7ac5a24a..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/tools/run-wc-admin-daily.php +++ /dev/null @@ -1,11 +0,0 @@ - 'GET', - ) -); -register_woocommerce_admin_test_helper_rest_route( - '/tools/trigger-selected-cron/v1', - 'trigger_selected_cron', - array( - 'methods' => 'POST', - 'args' => array( - 'hook' => array( - 'description' => 'Name of the cron that will be triggered.', - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - ), - 'signature' => array( - 'description' => 'Signature of the cron to trigger.', - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - ) -); - -function tools_get_cron_list() { - $crons = _get_cron_array(); - $events = array(); - - if ( empty( $crons ) ) { - return array(); - } - - foreach ( $crons as $cron ) { - foreach ( $cron as $hook => $data ) { - foreach ( $data as $signature => $element ) { - $events[ $hook ] = (object) array( - 'hook' => $hook, - 'signature' => $signature, - ); - } - } - } - return new WP_REST_Response( $events, 200 ); -} - -function trigger_selected_cron( $request ) { - $hook = $request->get_param( 'hook' ); - $signature = $request->get_param( 'signature' ); - - if ( ! isset( $hook ) || ! isset( $signature ) ) { - return; - } - - $crons = _get_cron_array(); - foreach ( $crons as $cron ) { - if ( isset( $cron[ $hook ][ $signature ] ) ) { - $args = $cron[ $hook ][ $signature ]['args']; - delete_transient( 'doing_cron' ); - $scheduled = schedule_event( $hook, $args ); - - if ( false === $scheduled ) { - return $scheduled; - } - - add_filter( 'cron_request', function( array $cron_request ) { - $cron_request['url'] = add_query_arg( 'run-cron', 1, $cron_request['url'] ); - return $cron_request; - } ); - - spawn_cron(); - sleep( 1 ); - return true; - } - } - return false; -} - -function schedule_event( $hook, $args = array() ) { - $event = (object) array( - 'hook' => $hook, - 'timestamp' => 1, - 'schedule' => false, - 'args' => $args, - ); - $crons = (array) _get_cron_array(); - $key = md5( serialize( $event->args ) ); - - $crons[ $event->timestamp ][ $event->hook ][ $key ] = array( - 'schedule' => $event->schedule, - 'args' => $event->args, - ); - uksort( $crons, 'strnatcasecmp' ); - return _set_cron_array( $crons ); -} diff --git a/plugins/woocommerce-beta-tester/api/api/tools/trigger-update-callbacks.php b/plugins/woocommerce-beta-tester/api/api/tools/trigger-update-callbacks.php deleted file mode 100644 index 3d1c0d103f3..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/tools/trigger-update-callbacks.php +++ /dev/null @@ -1,47 +0,0 @@ - 'GET', - ) -); -register_woocommerce_admin_test_helper_rest_route( - '/tools/trigger-selected-update-callbacks/v1', - 'trigger_selected_update_callbacks', - array( - 'methods' => 'POST', - 'args' => array( - 'version' => array( - 'description' => 'Name of the update version', - 'type' => 'string', - 'sanitize_callback' => 'sanitize_text_field', - ) - ), - ) -); - -function tools_get_wc_admin_versions() { - $db_updates = \WC_Install::get_db_update_callbacks(); - - return new WP_REST_Response( array_keys( $db_updates ), 200 ); -} - -function trigger_selected_update_callbacks( $request ) { - $version = $request->get_param( 'version' ); - if ( ! isset( $version ) ) { - return; - } - - $db_updates = \WC_Install::get_db_update_callbacks(); - $update_callbacks = $db_updates[ $version ]; - - foreach ( $update_callbacks as $update_callback ) { - call_user_func( $update_callback ); - } - - return false; -} diff --git a/plugins/woocommerce-beta-tester/api/api/tools/trigger-wca-install.php b/plugins/woocommerce-beta-tester/api/api/tools/trigger-wca-install.php deleted file mode 100644 index 43c1121f577..00000000000 --- a/plugins/woocommerce-beta-tester/api/api/tools/trigger-wca-install.php +++ /dev/null @@ -1,11 +0,0 @@ -logger = $logger; - $this->logger = $logger; - } - - /** - * Log the event. - * - * @param array $properties Event properties. - * @param string $event_name Event name. - */ - public function log_event( $properties, $event_name ) { - $this->logger->debug( - $event_name, - array( 'source' => $this->source ) - ); - foreach ( $properties as $key => $property ) { - $this->logger->debug( - " - {$key}: {$property}", - array( 'source' => $this->source ) - ); - } - - return $properties; - } -} - -new TracksDebugLog(); diff --git a/plugins/woocommerce-beta-tester/changelog/dev-delete-duplicated-folder b/plugins/woocommerce-beta-tester/changelog/dev-delete-duplicated-folder new file mode 100644 index 00000000000..3acdd3ec8ce --- /dev/null +++ b/plugins/woocommerce-beta-tester/changelog/dev-delete-duplicated-folder @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Remove api code folder that was duplicated From f9dacb78a634c067dd22f892b34c436d84a60707 Mon Sep 17 00:00:00 2001 From: Daniel Dudzic Date: Tue, 15 Nov 2022 09:58:40 +0100 Subject: [PATCH 0071/1680] FSE: Fix icon fonts not being loaded in the Site Editor (#35532) * Site Editor: Fix WooCommerce icons in the Site Editor * Site Editor: Fix WooCommerce icons not loading in the site editor. * Add additional FSE theme check --- plugins/woocommerce/changelog/fix-35495-site-editor-icons | 4 ++++ .../client/legacy/css/woocommerce-blocktheme.scss | 1 + plugins/woocommerce/includes/admin/class-wc-admin-assets.php | 5 +++++ 3 files changed, 10 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-35495-site-editor-icons diff --git a/plugins/woocommerce/changelog/fix-35495-site-editor-icons b/plugins/woocommerce/changelog/fix-35495-site-editor-icons new file mode 100644 index 00000000000..7caac27f708 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35495-site-editor-icons @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Fix WooCommerce icons not loading in the site editor. diff --git a/plugins/woocommerce/client/legacy/css/woocommerce-blocktheme.scss b/plugins/woocommerce/client/legacy/css/woocommerce-blocktheme.scss index 017ba81fb1f..1701887309a 100644 --- a/plugins/woocommerce/client/legacy/css/woocommerce-blocktheme.scss +++ b/plugins/woocommerce/client/legacy/css/woocommerce-blocktheme.scss @@ -2,6 +2,7 @@ * woocommerce-blocktheme.scss * Block theme default styles to ensure WooCommerce looks better out of the box with block themes that are not optimised for WooCommerce specifically. */ +@import "fonts"; @import "variables"; /** diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index 97e8bb32cc4..61e870d0da0 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -57,6 +57,11 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : if ( $screen && $screen->is_block_editor() ) { wp_register_style( 'woocommerce-general', WC()->plugin_url() . '/assets/css/woocommerce.css', array(), $version ); wp_style_add_data( 'woocommerce-general', 'rtl', 'replace' ); + if ( wc_current_theme_is_fse_theme() ) { + wp_register_style( 'woocommerce-blocktheme', WC()->plugin_url() . '/assets/css/woocommerce-blocktheme.css', array(), $version ); + wp_style_add_data( 'woocommerce-blocktheme', 'rtl', 'replace' ); + wp_enqueue_style( 'woocommerce-blocktheme' ); + } } // Sitewide menu CSS. From 8dc954d54b141681951efbbbb9c36d387da82f2e Mon Sep 17 00:00:00 2001 From: timur987 <115007291+timur987@users.noreply.github.com> Date: Tue, 15 Nov 2022 13:12:17 +0300 Subject: [PATCH 0072/1680] Feature: Add the In-App Marketplace Tour (#35278) Co-authored-by: Michal Iwanow <4765119+mcliwanow@users.noreply.github.com> --- .../changelog/add-in-app-tour-track-events | 4 + packages/js/data/src/onboarding/types.ts | 1 + .../guided-tours/add-product-tour/index.tsx | 2 +- .../use-track-publish-button.ts | 2 +- .../{add-product-tour => }/utils.ts | 20 +++ .../guided-tours/wc-addons-tour/get-config.ts | 125 ++++++++++++++ .../guided-tours/wc-addons-tour/get-steps.ts | 153 ++++++++++++++++++ .../guided-tours/wc-addons-tour/index.tsx | 122 ++++++++++++++ .../guided-tours/wc-addons-tour/utils.ts | 18 +++ .../client/tasks/task-list-item.tsx | 15 +- .../client/tasks/test/task-list-item.test.tsx | 33 ++++ .../client/tasks/test/task-list.test.tsx | 4 + .../client/tasks/test/task.test.tsx | 1 + .../two-column-tasks/test/task-list.test.tsx | 4 + .../wp-admin-scripts/wc-addons-tour/index.tsx | 13 ++ plugins/woocommerce-admin/webpack.config.js | 1 + .../add-in-app-tour-make-it-dismissible | 4 + .../changelog/add-in-app-tour-task | 4 + .../changelog/add-in-app-tour-track-events | 4 + .../changelog/add-wc-addons-tour-base | 4 + .../changelog/fix-tour-scroll-and-arrows | 4 + ...update-show-wc-addons-tour-on-desktop-only | 4 + .../woocommerce/client/legacy/css/admin.scss | 10 +- .../admin/class-wc-admin-pointers.php | 18 +++ .../admin/views/html-admin-page-addons.php | 2 +- .../Admin/Features/OnboardingTasks/Task.php | 52 +++--- .../Features/OnboardingTasks/TaskLists.php | 8 + .../Tasks/TourInAppMarketplace.php | 73 +++++++++ 28 files changed, 679 insertions(+), 26 deletions(-) create mode 100644 packages/js/data/changelog/add-in-app-tour-track-events rename plugins/woocommerce-admin/client/guided-tours/{add-product-tour => }/utils.ts (72%) create mode 100644 plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-config.ts create mode 100644 plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-steps.ts create mode 100644 plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/index.tsx create mode 100644 plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/utils.ts create mode 100644 plugins/woocommerce-admin/client/wp-admin-scripts/wc-addons-tour/index.tsx create mode 100644 plugins/woocommerce/changelog/add-in-app-tour-make-it-dismissible create mode 100644 plugins/woocommerce/changelog/add-in-app-tour-task create mode 100644 plugins/woocommerce/changelog/add-in-app-tour-track-events create mode 100644 plugins/woocommerce/changelog/add-wc-addons-tour-base create mode 100644 plugins/woocommerce/changelog/fix-tour-scroll-and-arrows create mode 100644 plugins/woocommerce/changelog/update-show-wc-addons-tour-on-desktop-only create mode 100644 plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/TourInAppMarketplace.php diff --git a/packages/js/data/changelog/add-in-app-tour-track-events b/packages/js/data/changelog/add-in-app-tour-track-events new file mode 100644 index 00000000000..f9d60be1200 --- /dev/null +++ b/packages/js/data/changelog/add-in-app-tour-track-events @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add an attribute to an onboarding task to indicate whether to track a task view. diff --git a/packages/js/data/src/onboarding/types.ts b/packages/js/data/src/onboarding/types.ts index 24060daa19d..7cbf182201c 100644 --- a/packages/js/data/src/onboarding/types.ts +++ b/packages/js/data/src/onboarding/types.ts @@ -25,6 +25,7 @@ export type TaskType = { isActioned: boolean; eventPrefix: string; level: number; + recordViewEvent: boolean; additionalData?: { woocommerceTaxCountries?: string[]; taxJarActivated?: boolean; diff --git a/plugins/woocommerce-admin/client/guided-tours/add-product-tour/index.tsx b/plugins/woocommerce-admin/client/guided-tours/add-product-tour/index.tsx index c2b45f8f4ed..d487cb93141 100644 --- a/plugins/woocommerce-admin/client/guided-tours/add-product-tour/index.tsx +++ b/plugins/woocommerce-admin/client/guided-tours/add-product-tour/index.tsx @@ -15,7 +15,7 @@ import { useActiveEditorType } from './use-active-editor-type'; import { bindEnableGuideModeClickEvent, waitUntilElementTopNotChange, -} from './utils'; +} from '../utils'; import { ProductTourStepName, useProductStepChange, diff --git a/plugins/woocommerce-admin/client/guided-tours/add-product-tour/use-track-publish-button.ts b/plugins/woocommerce-admin/client/guided-tours/add-product-tour/use-track-publish-button.ts index f05eaae5a65..0628f2983ea 100644 --- a/plugins/woocommerce-admin/client/guided-tours/add-product-tour/use-track-publish-button.ts +++ b/plugins/woocommerce-admin/client/guided-tours/add-product-tour/use-track-publish-button.ts @@ -7,7 +7,7 @@ import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies */ -import { bindPublishClickEvent } from './utils'; +import { bindPublishClickEvent } from '../utils'; export const useTrackPublishButton = ( showTour: boolean ) => { const unbindPublishClickEvent = useRef< () => void >( () => {} ); diff --git a/plugins/woocommerce-admin/client/guided-tours/add-product-tour/utils.ts b/plugins/woocommerce-admin/client/guided-tours/utils.ts similarity index 72% rename from plugins/woocommerce-admin/client/guided-tours/add-product-tour/utils.ts rename to plugins/woocommerce-admin/client/guided-tours/utils.ts index 079146b1a8d..315a1bc4d1e 100644 --- a/plugins/woocommerce-admin/client/guided-tours/add-product-tour/utils.ts +++ b/plugins/woocommerce-admin/client/guided-tours/utils.ts @@ -19,6 +19,26 @@ export const waitUntilElementTopNotChange = ( return intervalId; }; +// Observer position changes of an element +export const observePositionChange = ( + selector: string, + callback: () => void, + pollMs: number +) => { + const initialElement = document.querySelector( + selector + ) as HTMLElement | null; + let lastInitialElementTop = initialElement?.offsetTop; + + return setInterval( () => { + const top = initialElement?.offsetTop; + if ( lastInitialElementTop !== top ) { + callback(); + } + lastInitialElementTop = top; + }, pollMs ); +}; + // Overwrite the default behavior of click event for the "Enable guided mode" button export const bindEnableGuideModeClickEvent = ( onClick: EventListenerOrEventListenerObject diff --git a/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-config.ts b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-config.ts new file mode 100644 index 00000000000..3b167616353 --- /dev/null +++ b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-config.ts @@ -0,0 +1,125 @@ +/** + * External dependencies + */ +import { TourKitTypes } from '@woocommerce/components'; + +/** + * Internal dependencies + */ +import { scrollPopperToVisibleAreaIfNeeded } from './utils'; + +export const getTourConfig = ( { + closeHandler, + onNextStepHandler, + autoScrollBlock, + steps, +}: { + closeHandler: TourKitTypes.CloseHandler; + onNextStepHandler: ( currentStepIndex: number ) => void; + autoScrollBlock: ScrollLogicalPosition; + steps: TourKitTypes.WooStep[]; +} ): TourKitTypes.WooConfig => { + let previousPopperTopPosition: number | null = null; + let perviousPopperRef: unknown = null; + const defaultPlacement = 'top-start'; + + return { + placement: defaultPlacement, + options: { + effects: { + spotlight: { + interactivity: { + enabled: true, + rootElementSelector: '.woocommerce.wc-addons-wrap', + }, + }, + autoScroll: { + behavior: 'auto', + block: autoScrollBlock, + }, + }, + popperModifiers: [ + { + name: 'arrow', + options: { + padding: ( { + popper, + }: { + popper: { width: number }; + } ) => { + return { + // Align the arrow to the left of the popper. + right: popper.width - 34, + }; + }, + }, + }, + { + name: 'offset', + options: { + offset: [ 20, 20 ], + }, + }, + { + name: 'flip', + options: { + allowedAutoPlacements: [ 'right', 'bottom', 'top' ], + fallbackPlacements: [ 'bottom-start', 'right' ], + flipVariations: false, + boundry: 'clippingParents', + }, + }, + { + name: 'inAppTourPopperModifications', + enabled: true, + phase: 'read', + fn( { state, instance } ) { + // 1. First modification - force `right` placement for items in admin menu. + if ( perviousPopperRef !== state.elements.reference ) { + const isAdminMenuItem = ( + state.elements.reference as HTMLElement + ).closest( '#adminmenu' ); + const desiredPlacement = isAdminMenuItem + ? 'right' + : defaultPlacement; + if ( state.placement !== desiredPlacement ) { + instance.setOptions( { + placement: desiredPlacement, + } ); + } + } + + // 2. Second modification - Try to make sure that the popper is visible once when + // the next step is displayed. + const popperBoundingRect = + state.elements.popper.getBoundingClientRect(); + const arrowBoundingRect = + state.elements.arrow?.getBoundingClientRect(); + const arrowHeight = arrowBoundingRect?.height || 0; + + // Try to make sure that the popper is visible if poppers' reference (step) changed and + // if arrowHeight is not 0 (it means that popper's position hasn't been updated yet). + // Also, change if popper's top position changed - the modifier can be called + // multiple times for the same position. + if ( + perviousPopperRef !== state.elements.reference && + arrowHeight !== 0 && + previousPopperTopPosition !== popperBoundingRect.top + ) { + scrollPopperToVisibleAreaIfNeeded( + popperBoundingRect + ); + previousPopperTopPosition = popperBoundingRect.top; + perviousPopperRef = state.elements.reference; + } + }, + }, + ], + callbacks: { + onNextStep: onNextStepHandler, + }, + }, + steps, + closeHandler, + }; +}; diff --git a/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-steps.ts b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-steps.ts new file mode 100644 index 00000000000..28776f00b79 --- /dev/null +++ b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/get-steps.ts @@ -0,0 +1,153 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { createElement, createInterpolateElement } from '@wordpress/element'; +import { TourKitTypes } from '@woocommerce/components'; + +export const getSteps = (): TourKitTypes.WooStep[] => { + const lineBreak = createElement( 'br' ); + return [ + { + referenceElements: { + desktop: '#adminmenu a[href="admin.php?page=wc-addons"]', + }, + focusElement: { + desktop: '#adminmenu a[href="admin.php?page=wc-addons"]', + }, + meta: { + name: 'wc-addons-menu-item', + heading: __( + 'Welcome to the WooCommerce Marketplace', + 'woocommerce' + ), + descriptions: { + desktop: createInterpolateElement( + __( + 'This is the place to find extensions, themes, and services for your store - all reviewed and approved by the WooCommerce team.

Whether you’re looking to improve your store or grow your business, you can find a solution here. There are hundreds of options available, and new products are added regularly.

The WooCommerce Marketplace is also available at WooCommerce.com.', + 'woocommerce' + ), + { + br: lineBreak, + } + ), + }, + }, + }, + { + referenceElements: { + desktop: '.marketplace-header__search-form', + }, + focusElement: { + desktop: '.marketplace-header__search-form', + }, + meta: { + name: 'wc-addons-search', + heading: __( 'Find exactly what you need', 'woocommerce' ), + descriptions: { + desktop: __( + 'Use the search box to find specific products.', + 'woocommerce' + ), + }, + }, + }, + { + referenceElements: { + desktop: '#marketplace-current-section-dropdown', + }, + focusElement: { + desktop: '#marketplace-current-section-dropdown', + }, + meta: { + name: 'wc-addons-categories', + heading: __( 'Browse for new ideas', 'woocommerce' ), + descriptions: { + desktop: createInterpolateElement( + __( + 'Or browse all available products by category.', + 'woocommerce' + ), + { + br: lineBreak, + } + ), + }, + }, + }, + { + referenceElements: { + desktop: '.addon-product-group:first-child', + }, + focusElement: { + desktop: '.addon-product-group:first-child', + }, + meta: { + name: 'wc-addons-featured', + heading: __( 'Learn more about products', 'woocommerce' ), + descriptions: { + desktop: createInterpolateElement( + __( + 'Scroll down to see all available products for a search or selected category.

Click on any product to see more information about it, including features, requirements, and available documentation.', + 'woocommerce' + ), + { + br: lineBreak, + } + ), + }, + }, + }, + { + referenceElements: { + desktop: '.marketplace-header__tab-link_helper', + }, + focusElement: { + desktop: '.marketplace-header__tab-link_helper', + }, + meta: { + name: 'wc-addons-my-subscriptions', + heading: __( 'Manage your purchases', 'woocommerce' ), + descriptions: { + desktop: createInterpolateElement( + __( + "Products purchased from the WooCommerce Marketplace can be managed in My Subscriptions, either here or on WooCommerce.com.

Every purchase is backed by our 30-day money-back guarantee, and includes email and live chat support.

That's it! We hope the Marketplace helps you build the business of your dreams.", + 'woocommerce' + ), + { + a1: createElement( + 'a', + { + href: 'https://woocommerce.com/refund-policy/', + 'aria-label': __( + 'Refund policy', + 'woocommerce' + ), + }, + __( + '30-day money-back guarantee', + 'woocommerce' + ) + ), + a2: createElement( + 'a', + { + href: 'https://woocommerce.com/my-account/create-a-ticket/', + 'aria-label': __( + 'Contact support', + 'woocommerce' + ), + }, + __( + 'email and live chat support', + 'woocommerce' + ) + ), + br: lineBreak, + } + ), + }, + }, + }, + ]; +}; diff --git a/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/index.tsx b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/index.tsx new file mode 100644 index 00000000000..fec151af83f --- /dev/null +++ b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/index.tsx @@ -0,0 +1,122 @@ +/** + * External dependencies + */ +import { useEffect, useState } from '@wordpress/element'; +import { TourKit, TourKitTypes } from '@woocommerce/components'; +import { recordEvent } from '@woocommerce/tracks'; +import { useDispatch } from '@wordpress/data'; +import { OPTIONS_STORE_NAME } from '@woocommerce/data'; +import qs from 'qs'; + +/** + * Internal dependencies + */ +import { observePositionChange, waitUntilElementTopNotChange } from '../utils'; +import { getTourConfig } from './get-config'; +import { scrollPopperToVisibleAreaIfNeeded } from './utils'; +import { getSteps } from './get-steps'; + +const WCAddonsTour = () => { + const [ showTour, setShowTour ] = useState( false ); + + const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); + + const steps = getSteps(); + const defaultAutoScrollBlock: ScrollLogicalPosition = 'center'; + + useEffect( () => { + const query = qs.parse( window.location.search.slice( 1 ) ); + if ( query?.tutorial === 'true' ) { + const intervalId = waitUntilElementTopNotChange( + steps[ 0 ].referenceElements?.desktop || '', + () => { + const stepName = steps[ 0 ]?.meta?.name; + setShowTour( true ); + recordEvent( 'in_app_marketplace_tour_started', { + step: stepName, + } ); + }, + 500 + ); + return () => clearInterval( intervalId ); + } + // only run once + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [] ); + + useEffect( () => { + if ( showTour ) { + function showPopper() { + const tourKitElement = document.querySelector( + '.tour-kit-frame__container' + ); + if ( tourKitElement ) { + scrollPopperToVisibleAreaIfNeeded( + tourKitElement.getBoundingClientRect() + ); + } + } + + // In a rare case, admin notices might load before observe is added below (moving `.wc-addons-wrap`). + // In such a case, if Tour is shown before this effect is called, it might not be position correctly. + // Updating popper's position here, ensures it's always visible. + const timeoutId = setTimeout( showPopper, 500 ); + + const intervalId = observePositionChange( + '.wc-addons-wrap', + showPopper, + 150 + ); + return () => { + clearTimeout( timeoutId ); + clearInterval( intervalId ); + }; + } + }, [ showTour ] ); + + if ( ! showTour ) { + return null; + } + + const closeHandler: TourKitTypes.CloseHandler = ( + tourSteps, + currentStepIndex + ) => { + setShowTour( false ); + // mark tour as completed + updateOptions( { + woocommerce_admin_dismissed_in_app_marketplace_tour: 'yes', + } ); + // remove `tutorial` from search query, so it's not shown on page refresh + const url = new URL( window.location.href ); + url.searchParams.delete( 'tutorial' ); + window.history.replaceState( null, '', url ); + + if ( steps.length - 1 === currentStepIndex ) { + recordEvent( 'in_app_marketplace_tour_completed' ); + } else { + const stepName = tourSteps[ currentStepIndex ]?.meta?.name; + recordEvent( 'in_app_marketplace_tour_dismissed', { + step: stepName, + } ); + } + }; + + const onNextStepHandler = ( previousStepIndex: number ) => { + const stepName = steps[ previousStepIndex + 1 ]?.meta?.name || ''; + recordEvent( 'in_app_marketplace_tour_step_viewed', { + step: stepName, + } ); + }; + + const tourConfig = getTourConfig( { + closeHandler, + onNextStepHandler, + autoScrollBlock: defaultAutoScrollBlock, + steps, + } ); + + return ; +}; + +export default WCAddonsTour; diff --git a/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/utils.ts b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/utils.ts new file mode 100644 index 00000000000..5f05a103750 --- /dev/null +++ b/plugins/woocommerce-admin/client/guided-tours/wc-addons-tour/utils.ts @@ -0,0 +1,18 @@ +// Try to make popper element visible on the screen +export const scrollPopperToVisibleAreaIfNeeded = ( + popperBoundingRect: DOMRect +) => { + // 8px is added for some extra spacing from the top admin bar + const adminBarHeight = + ( document.getElementById( 'wpadminbar' )?.offsetHeight || 0 ) + 8; + + // check if element is cut from the top + if ( popperBoundingRect.top < adminBarHeight ) { + window.scrollBy( 0, popperBoundingRect.top - adminBarHeight ); + } else if ( + // check if element is cut from the bottom + popperBoundingRect.bottom > window.innerHeight + ) { + window.scrollBy( 0, popperBoundingRect.bottom - window.innerHeight ); + } +}; diff --git a/plugins/woocommerce-admin/client/tasks/task-list-item.tsx b/plugins/woocommerce-admin/client/tasks/task-list-item.tsx index debdb1dd5de..2e23cda13aa 100644 --- a/plugins/woocommerce-admin/client/tasks/task-list-item.tsx +++ b/plugins/woocommerce-admin/client/tasks/task-list-item.tsx @@ -10,7 +10,7 @@ import { } from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; import { TaskItem, useSlot } from '@woocommerce/experimental'; -import { useCallback, useContext } from '@wordpress/element'; +import { useCallback, useContext, useEffect } from '@wordpress/element'; import { useDispatch } from '@wordpress/data'; import { WooOnboardingTaskListItem } from '@woocommerce/onboarding'; @@ -59,8 +59,21 @@ export const TaskListItem: React.FC< TaskListItemProps > = ( { title, level, additionalInfo, + recordViewEvent, } = task; + useEffect( () => { + if ( recordViewEvent ) { + recordEvent( 'tasklist_item_view', { + task_name: id, + is_complete: isComplete, + context: layoutContext.toString(), + } ); + } + // run the effect only when component mounts + // eslint-disable-next-line + }, [] ); + const slot = useSlot( `woocommerce_onboarding_task_list_item_${ id }` ); const hasFills = Boolean( slot?.fills?.length ); diff --git a/plugins/woocommerce-admin/client/tasks/test/task-list-item.test.tsx b/plugins/woocommerce-admin/client/tasks/test/task-list-item.test.tsx index 2e3c06ef642..29a864e0918 100644 --- a/plugins/woocommerce-admin/client/tasks/test/task-list-item.test.tsx +++ b/plugins/woocommerce-admin/client/tasks/test/task-list-item.test.tsx @@ -7,6 +7,7 @@ import { SlotFillProvider } from '@wordpress/components'; import { useDispatch } from '@wordpress/data'; import { useSlot } from '@woocommerce/experimental'; import { TaskType } from '@woocommerce/data'; +import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies @@ -85,6 +86,7 @@ const task: TaskType = { isActioned: false, eventPrefix: '', level: 0, + recordViewEvent: false, }; describe( 'TaskListItem', () => { @@ -104,6 +106,37 @@ describe( 'TaskListItem', () => { expect( queryByText( task.title ) ).toBeInTheDocument(); } ); + it( 'should not record view event on render if recordViewEvent is false', () => { + render( + {} } + /> + ); + + expect( recordEvent ).toHaveBeenCalledTimes( 0 ); + } ); + + it( 'should record view event on render if recordViewEvent is true', () => { + render( + {} } + /> + ); + + expect( recordEvent ).toHaveBeenCalledTimes( 1 ); + expect( recordEvent ).toHaveBeenCalledWith( 'tasklist_item_view', { + context: 'root', + is_complete: task.isComplete, + task_name: task.id, + } ); + } ); + it( 'should call dismissTask and trigger a notice when dismissing a task', () => { const { getByRole } = render( , document.body.appendChild( root ) ); diff --git a/plugins/woocommerce-admin/webpack.config.js b/plugins/woocommerce-admin/webpack.config.js index 0fd64f68f1d..9a7bc1684db 100644 --- a/plugins/woocommerce-admin/webpack.config.js +++ b/plugins/woocommerce-admin/webpack.config.js @@ -56,6 +56,7 @@ const wpAdminScripts = [ 'category-tracking', 'tags-tracking', 'product-tour', + 'wc-addons-tour', ]; const getEntryPoints = () => { const entryPoints = { diff --git a/plugins/woocommerce/changelog/add-in-app-tour-make-it-dismissible b/plugins/woocommerce/changelog/add-in-app-tour-make-it-dismissible new file mode 100644 index 00000000000..f6aa00067c0 --- /dev/null +++ b/plugins/woocommerce/changelog/add-in-app-tour-make-it-dismissible @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Set In-App Marketplace Tour as completed on tour close diff --git a/plugins/woocommerce/changelog/add-in-app-tour-task b/plugins/woocommerce/changelog/add-in-app-tour-task new file mode 100644 index 00000000000..7aa81178f5c --- /dev/null +++ b/plugins/woocommerce/changelog/add-in-app-tour-task @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Added the "Tour the WooCommerce Marketplace" task to onboarding tasks list diff --git a/plugins/woocommerce/changelog/add-in-app-tour-track-events b/plugins/woocommerce/changelog/add-in-app-tour-track-events new file mode 100644 index 00000000000..a26acf4644d --- /dev/null +++ b/plugins/woocommerce/changelog/add-in-app-tour-track-events @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +add new track events for in-app marketplace tour diff --git a/plugins/woocommerce/changelog/add-wc-addons-tour-base b/plugins/woocommerce/changelog/add-wc-addons-tour-base new file mode 100644 index 00000000000..82d70878741 --- /dev/null +++ b/plugins/woocommerce/changelog/add-wc-addons-tour-base @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Added a guided tour for WooCommerce Extensions page diff --git a/plugins/woocommerce/changelog/fix-tour-scroll-and-arrows b/plugins/woocommerce/changelog/fix-tour-scroll-and-arrows new file mode 100644 index 00000000000..ee3c193fefd --- /dev/null +++ b/plugins/woocommerce/changelog/fix-tour-scroll-and-arrows @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +fix popper position for in-app marketplace tour diff --git a/plugins/woocommerce/changelog/update-show-wc-addons-tour-on-desktop-only b/plugins/woocommerce/changelog/update-show-wc-addons-tour-on-desktop-only new file mode 100644 index 00000000000..d5ec2250dcb --- /dev/null +++ b/plugins/woocommerce/changelog/update-show-wc-addons-tour-on-desktop-only @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Permit showing a guided tour for WooCommerce Extensions page on desktops only diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index d5679c0407a..91eaf5d465b 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -162,6 +162,10 @@ } } } + + &.wp-tour-kit-spotlit { + padding: 20px; + } } .current-section-name { @@ -444,6 +448,10 @@ .addon-product-group { margin-bottom: 24px; + + &.wp-tour-kit-spotlit { + padding: 20px; + } } .addon-product-group-title { @@ -7866,4 +7874,4 @@ table.bar_chart { margin: 0px 12px 12px; width: calc( 100% - 24px ); } -} \ No newline at end of file +} diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-pointers.php b/plugins/woocommerce/includes/admin/class-wc-admin-pointers.php index 019f9368221..d719d1f83d7 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-pointers.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-pointers.php @@ -39,6 +39,9 @@ class WC_Admin_Pointers { case 'product': $this->create_product_tutorial(); break; + case 'woocommerce_page_wc-addons': + $this->create_wc_addons_tutorial(); + break; } } @@ -60,6 +63,21 @@ class WC_Admin_Pointers { $labels->add_new = __( 'Enable guided mode', 'woocommerce' ); WCAdminAssets::register_script( 'wp-admin-scripts', 'product-tour', true ); } + + /** + * Pointers for accessing In-App Marketplace. + */ + public function create_wc_addons_tutorial() { + if ( ! isset( $_GET['tutorial'] ) || ! current_user_can( 'manage_options' ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended + return; + } + + if ( wp_is_mobile() ) { + return; // Permit In-App Marketplace Tour on desktops only. + } + + WCAdminAssets::register_script( 'wp-admin-scripts', 'wc-addons-tour', true ); + } } new WC_Admin_Pointers(); 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 05a291d427d..b0db5f56cae 100644 --- a/plugins/woocommerce/includes/admin/views/html-admin-page-addons.php +++ b/plugins/woocommerce/includes/admin/views/html-admin-page-addons.php @@ -52,7 +52,7 @@ $current_section_name = __( 'Browse Categories', 'woocommerce' );
  • get_id() ] ) && $tracked_tasks[ $this->get_id() ] > 0; } + /** + * Check if should record event when task is viewed + * + * @return bool + */ + public function get_record_view_event(): bool { + return false; + } + /** * Get the task as JSON. * @@ -474,27 +483,28 @@ abstract class Task { $this->possibly_track_completion(); return array( - 'id' => $this->get_id(), - 'parentId' => $this->get_parent_id(), - 'title' => $this->get_title(), - 'canView' => $this->can_view(), - 'content' => $this->get_content(), - 'additionalInfo' => $this->get_additional_info(), - 'actionLabel' => $this->get_action_label(), - 'actionUrl' => $this->get_action_url(), - 'isComplete' => $this->is_complete(), - 'time' => $this->get_time(), - 'level' => 3, - 'isActioned' => $this->is_actioned(), - 'isDismissed' => $this->is_dismissed(), - 'isDismissable' => $this->is_dismissable(), - 'isSnoozed' => false, - 'isSnoozeable' => false, - 'isVisited' => $this->is_visited(), - 'isDisabled' => false, - 'snoozedUntil' => null, - 'additionalData' => self::convert_object_to_camelcase( $this->get_additional_data() ), - 'eventPrefix' => $this->prefix_event( '' ), + 'id' => $this->get_id(), + 'parentId' => $this->get_parent_id(), + 'title' => $this->get_title(), + 'canView' => $this->can_view(), + 'content' => $this->get_content(), + 'additionalInfo' => $this->get_additional_info(), + 'actionLabel' => $this->get_action_label(), + 'actionUrl' => $this->get_action_url(), + 'isComplete' => $this->is_complete(), + 'time' => $this->get_time(), + 'level' => 3, + 'isActioned' => $this->is_actioned(), + 'isDismissed' => $this->is_dismissed(), + 'isDismissable' => $this->is_dismissable(), + 'isSnoozed' => false, + 'isSnoozeable' => false, + 'isVisited' => $this->is_visited(), + 'isDisabled' => false, + 'snoozedUntil' => null, + 'additionalData' => self::convert_object_to_camelcase( $this->get_additional_data() ), + 'eventPrefix' => $this->prefix_event( '' ), + 'recordViewEvent' => $this->get_record_view_event(), ); } diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php index 03d5e0bf72d..ab81e5c0983 100644 --- a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/TaskLists.php @@ -9,6 +9,7 @@ use Automattic\WooCommerce\Admin\Features\Features; use Automattic\WooCommerce\Admin\Features\OnboardingTasks\DeprecatedExtendedTask; use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Task; use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks\ReviewShippingOptions; +use Automattic\WooCommerce\Admin\Features\OnboardingTasks\Tasks\TourInAppMarketplace; /** * Task Lists class. */ @@ -52,6 +53,7 @@ class TaskLists { 'AdditionalPayments', 'ReviewShippingOptions', 'GetMobileApp', + 'TourInAppMarketplace', ); /** @@ -219,6 +221,12 @@ class TaskLists { ) ); } + + if ( ! wp_is_mobile() ) { // Permit In-App Marketplace Tour on desktops only. + $tour_task = new TourInAppMarketplace(); + self::add_task( 'extended', $tour_task ); + self::add_task( 'extended_two_column', $tour_task ); + } } /** diff --git a/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/TourInAppMarketplace.php b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/TourInAppMarketplace.php new file mode 100644 index 00000000000..ccc8f98fb0d --- /dev/null +++ b/plugins/woocommerce/src/Admin/Features/OnboardingTasks/Tasks/TourInAppMarketplace.php @@ -0,0 +1,73 @@ + Date: Tue, 15 Nov 2022 09:05:09 -0600 Subject: [PATCH 0073/1680] Increase timeout for changelogger (#35584) --- .github/workflows/pr-lint-monorepo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/pr-lint-monorepo.yml b/.github/workflows/pr-lint-monorepo.yml index 9615dabfe65..afc92bc4eed 100644 --- a/.github/workflows/pr-lint-monorepo.yml +++ b/.github/workflows/pr-lint-monorepo.yml @@ -10,7 +10,7 @@ jobs: changelogger_used: name: Changelogger use runs-on: ubuntu-20.04 - timeout-minutes: 5 + timeout-minutes: 15 steps: - uses: actions/checkout@v3 with: From 23ca8d62972ca50c6d0e1df678f1c49a231c7f9f Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Tue, 15 Nov 2022 11:19:58 -0800 Subject: [PATCH 0074/1680] Add product title to header when available (#35431) * Move shared product header components to separate file * Fill header title with product name * Create method to get product title * Add tests around title * Add changelog entry * Remove unnecessary plugin registration --- .../client/products/add-product-page.tsx | 4 +- .../client/products/edit-product-page.tsx | 4 +- .../products/layout/product-form-header.tsx | 14 +++++++ .../client/products/product-title.tsx | 39 +++++++++++++++++++ .../products/utils/get-product-title.ts | 33 ++++++++++++++++ .../utils/test/get-product-title.test.ts | 31 +++++++++++++++ plugins/woocommerce/changelog/update-35172 | 4 ++ 7 files changed, 125 insertions(+), 4 deletions(-) create mode 100644 plugins/woocommerce-admin/client/products/layout/product-form-header.tsx create mode 100644 plugins/woocommerce-admin/client/products/product-title.tsx create mode 100644 plugins/woocommerce-admin/client/products/utils/get-product-title.ts create mode 100644 plugins/woocommerce-admin/client/products/utils/test/get-product-title.test.ts create mode 100644 plugins/woocommerce/changelog/update-35172 diff --git a/plugins/woocommerce-admin/client/products/add-product-page.tsx b/plugins/woocommerce-admin/client/products/add-product-page.tsx index 5c2ed73dd1e..801095ccd12 100644 --- a/plugins/woocommerce-admin/client/products/add-product-page.tsx +++ b/plugins/woocommerce-admin/client/products/add-product-page.tsx @@ -9,8 +9,8 @@ import { Product } from '@woocommerce/data'; /** * Internal dependencies */ +import { ProductFormHeader } from './layout/product-form-header'; import { ProductFormLayout } from './layout/product-form-layout'; -import { ProductFormActions } from './product-form-actions'; import { ProductDetailsSection } from './sections/product-details-section'; import { ProductInventorySection } from './sections/product-inventory-section'; import { PricingSection } from './sections/pricing-section'; @@ -37,6 +37,7 @@ const AddProductPage: React.FC = () => { errors={ {} } validate={ validate } > + @@ -44,7 +45,6 @@ const AddProductPage: React.FC = () => { -
  • diff --git a/plugins/woocommerce-admin/client/products/edit-product-page.tsx b/plugins/woocommerce-admin/client/products/edit-product-page.tsx index fea301df90b..0277dfde907 100644 --- a/plugins/woocommerce-admin/client/products/edit-product-page.tsx +++ b/plugins/woocommerce-admin/client/products/edit-product-page.tsx @@ -17,8 +17,8 @@ import { useParams } from 'react-router-dom'; /** * Internal dependencies */ +import { ProductFormHeader } from './layout/product-form-header'; import { ProductFormLayout } from './layout/product-form-layout'; -import { ProductFormActions } from './product-form-actions'; import { ProductDetailsSection } from './sections/product-details-section'; import { ProductInventorySection } from './sections/product-inventory-section'; import { PricingSection } from './sections/pricing-section'; @@ -126,6 +126,7 @@ const EditProductPage: React.FC = () => { validate={ validate } errors={ {} } > + @@ -133,7 +134,6 @@ const EditProductPage: React.FC = () => { - ) } diff --git a/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx b/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx new file mode 100644 index 00000000000..fce001462a1 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx @@ -0,0 +1,14 @@ +/** + * Internal dependencies + */ +import { ProductFormActions } from '../product-form-actions'; +import { ProductTitle } from '../product-title'; + +export const ProductFormHeader: React.FC = () => { + return ( + <> + + + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/product-title.tsx b/plugins/woocommerce-admin/client/products/product-title.tsx new file mode 100644 index 00000000000..11d3b26c4c3 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-title.tsx @@ -0,0 +1,39 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { + Product, + PRODUCTS_STORE_NAME, + WCDataSelector, +} from '@woocommerce/data'; +import { useFormContext } from '@woocommerce/components'; +import { useParams } from 'react-router-dom'; +import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { getProductTitle } from './utils/get-product-title'; +import { WooHeaderPageTitle } from '~/header/utils'; + +export const ProductTitle: React.FC = () => { + const { values } = useFormContext< Product >(); + const { productId } = useParams(); + const { persistedName } = useSelect( ( select: WCDataSelector ) => { + const product = productId + ? select( PRODUCTS_STORE_NAME ).getProduct( + parseInt( productId, 10 ), + undefined + ) + : null; + + return { + persistedName: product?.name, + }; + } ); + + const title = getProductTitle( values.name, values.type, persistedName ); + + return { title }; +}; diff --git a/plugins/woocommerce-admin/client/products/utils/get-product-title.ts b/plugins/woocommerce-admin/client/products/utils/get-product-title.ts new file mode 100644 index 00000000000..e77175d8eb7 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/utils/get-product-title.ts @@ -0,0 +1,33 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Get the product title for use in the header. + * + * @param name Name value entered for the product. + * @param type Product type. + * @param persistedName Name already persisted to the database. + * @return string + */ +export const getProductTitle = ( + name: string | undefined, + type: string | undefined, + persistedName: string | undefined +) => { + if ( name?.length ) { + return name; + } + + if ( persistedName ) { + return persistedName; + } + + switch ( type ) { + case 'simple': + return __( 'New standard product', 'woocommerce' ); + default: + return __( 'New product', 'woocommerce' ); + } +}; diff --git a/plugins/woocommerce-admin/client/products/utils/test/get-product-title.test.ts b/plugins/woocommerce-admin/client/products/utils/test/get-product-title.test.ts new file mode 100644 index 00000000000..fc259aaa216 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/utils/test/get-product-title.test.ts @@ -0,0 +1,31 @@ +/** + * Internal dependencies + */ +import { getProductTitle } from '../get-product-title'; + +describe( 'getProductTitle', () => { + it( 'should return the product name when one has been entered', () => { + const title = getProductTitle( 'Fancy pants', 'simple', undefined ); + expect( title ).toBe( 'Fancy pants' ); + } ); + + it( 'should return the entered product name when a persisted name exists', () => { + const title = getProductTitle( 'Fancy pants', 'simple', 'Saved name' ); + expect( title ).toBe( 'Fancy pants' ); + } ); + + it( 'should return the persisted name when no name is given', () => { + const title = getProductTitle( '', 'simple', 'Saved name' ); + expect( title ).toBe( 'Saved name' ); + } ); + + it( 'should return the product type add new string when set', () => { + const title = getProductTitle( '', 'simple', undefined ); + expect( title ).toBe( 'New standard product' ); + } ); + + it( 'should return the generic add new string when no type matches', () => { + const title = getProductTitle( '', 'custom-type', undefined ); + expect( title ).toBe( 'New product' ); + } ); +} ); diff --git a/plugins/woocommerce/changelog/update-35172 b/plugins/woocommerce/changelog/update-35172 new file mode 100644 index 00000000000..bef376fb34a --- /dev/null +++ b/plugins/woocommerce/changelog/update-35172 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product title to header when available From 973961fbd57a3e2b3f219078111f2eace11c57d0 Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Tue, 15 Nov 2022 13:58:27 -0600 Subject: [PATCH 0075/1680] Add workflow for building live branches (#35344) * Add workflow for building live branches * Fix inadvertent newline * Only run on PR for default types --- .github/workflows/pr-build-live-branch.yml | 83 +++++++++++++++++++ .../workflows/scripts/get-plugin-version.js | 13 +++ 2 files changed, 96 insertions(+) create mode 100644 .github/workflows/pr-build-live-branch.yml create mode 100644 .github/workflows/scripts/get-plugin-version.js diff --git a/.github/workflows/pr-build-live-branch.yml b/.github/workflows/pr-build-live-branch.yml new file mode 100644 index 00000000000..fa003da04c3 --- /dev/null +++ b/.github/workflows/pr-build-live-branch.yml @@ -0,0 +1,83 @@ +name: Build Live Branch +on: + pull_request: + +concurrency: + # Cancel concurrent jobs on pull_request but not push, by including the run_id in the concurrency group for the latter. + group: build-${{ github.event_name == 'push' && github.run_id || 'pr' }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + build: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + + - name: Get current version + id: version + uses: actions/github-script@v6.3.3 + with: + script: + const { getVersion } = require( './.github/workflows/scripts/get-plugin-version' ); + const version = await getVersion( 'woocommerce' ); + core.setOutput( 'version', version ); + + - name: Setup WooCommerce Monorepo + uses: ./.github/actions/setup-woocommerce-monorepo + with: + build: false + + - name: Prepare plugin zips + id: prepare + env: + CURRENT_VERSION: ${{ steps.version.outputs.version }} + run: | + + # Current version must compare greather than any previously used current version for this PR. + # Assume GH run IDs are monotonic. + VERSUFFIX="${GITHUB_RUN_ID}-g$(git rev-parse --short HEAD)" + + CURRENT_VERSION="$CURRENT_VERSION-$VERSUFFIX" + + sed -i -e 's/Version: .*$/Version: '"$CURRENT_VERSION"'/' "$GITHUB_WORKSPACE/plugins/woocommerce/woocommerce.php" + echo "$CURRENT_VERSION" > "$GITHUB_WORKSPACE/plugins/woocommerce/version.txt" + + cd "$GITHUB_WORKSPACE/plugins/woocommerce" + bash bin/build-zip.sh + + mkdir "$GITHUB_WORKSPACE/zips" + cp "$GITHUB_WORKSPACE/plugins/woocommerce/woocommerce.zip" "$GITHUB_WORKSPACE/zips/woocommerce.zip" + cd "$GITHUB_WORKSPACE/zips" + unzip woocommerce.zip + rm woocommerce.zip + mv woocommerce woocommerce-dev + zip -q -r "woocommerce-dev.zip" "woocommerce-dev/" + rm -fR "$GITHUB_WORKSPACE/zips/woocommerce-dev" + + # Plugin data is passed as a JSON object. + PLUGIN_DATA="{}" + PLUGIN_DATA=$( jq -c --arg slug "woocommerce" --arg ver "$CURRENT_VERSION" '.[ $slug ] = { version: $ver }' <<<"$PLUGIN_DATA" ) + echo "plugin-data=$PLUGIN_DATA" >> $GITHUB_OUTPUT + + - name: Create plugins artifact + uses: actions/upload-artifact@v3 + if: steps.prepare.outputs.plugin-data != '{}' + with: + name: plugins + path: zips + # Only need to retain for a day since the beta builder slurps it up to distribute. + retention-days: 1 + + - name: Inform Beta Download webhook + if: steps.prepare.outputs.plugin-data != '{}' + env: + SECRET: ${{ secrets.WOOBETA_SECRET }} + PLUGIN_DATA: ${{ steps.prepare.outputs.plugin-data }} + PR: ${{ github.event.number }} + run: | + curl -v --fail -L \ + --url "https://betadownload.jetpack.me/gh-action.php?run_id=$GITHUB_RUN_ID&pr=$PR&commit=$GITHUB_SHA" \ + --form-string "repo=$GITHUB_REPOSITORY" \ + --form-string "branch=${GITHUB_REF#refs/heads/}" \ + --form-string "plugins=$PLUGIN_DATA" \ + --form-string "secret=$SECRET" diff --git a/.github/workflows/scripts/get-plugin-version.js b/.github/workflows/scripts/get-plugin-version.js new file mode 100644 index 00000000000..4b2f0b9c063 --- /dev/null +++ b/.github/workflows/scripts/get-plugin-version.js @@ -0,0 +1,13 @@ +const { readFile } = require( 'fs/promises' ); +const { join } = require( 'path' ); + +exports.getVersion = async plugin => { + const filePath = join( + process.env.GITHUB_WORKSPACE, + `plugins/${ plugin }/${ plugin }.php` + ); + const pluginFileContents = await readFile( filePath, 'utf8' ); + const versionMatch = pluginFileContents.match( /Version: (\d+\.\d+\.\d+.*)\n/m ); + return versionMatch && versionMatch[1]; +}; + From 0846ae58ed3d8417baaf981a3609e5715f16a693 Mon Sep 17 00:00:00 2001 From: Paul Sealock Date: Wed, 16 Nov 2022 11:54:47 +1300 Subject: [PATCH 0076/1680] Fix JS package readme (#35595) --- packages/js/README.md | 34 +++++++--------------------------- 1 file changed, 7 insertions(+), 27 deletions(-) diff --git a/packages/js/README.md b/packages/js/README.md index 5f82f22a152..e3ac5425675 100644 --- a/packages/js/README.md +++ b/packages/js/README.md @@ -1,6 +1,6 @@ # WooCommerce Packages -Currently we have a small set of public-facing packages that can be dowloaded from [npm](https://www.npmjs.com/org/woocommerce) and used in external applications. +Currently we have a set of public-facing packages that can be dowloaded from [npm](https://www.npmjs.com/org/woocommerce) and used in external applications. Here is a non-exhaustive list. - `@woocommerce/components`: A library of components that can be used to create pages in the WooCommerce dashboard and reports pages. - `@woocommerce/csv-export`: A set of functions to convert data into CSV values, and enable a browser download of the CSV data. @@ -12,12 +12,11 @@ Currently we have a small set of public-facing packages that can be dowloaded fr ## Working with existing packages - You can make changes to packages files as normal, and running `pnpm start` will compile and watch both app files and packages. -- :warning: Make sure any dependencies you add to a package are also added to that package's `package.json`, not just the woocommerce-admin package.json -- :warning: Make sure you're not importing from any woocommerce-admin files outside of the package (you can import from other packages, just use the `import from @woocommerce/package` syntax). -- Add your change to the CHANGELOG for that package under the next version number, creating one if necessary (we use semantic versioning for packages, [see these guidelines](https://github.com/WordPress/gutenberg/blob/master/CONTRIBUTING.md#maintaining-changelogs)). +- :warning: Add any dependencies to a package using `pnpm add` from the package root. +- :warning: Make sure you're not importing from any other files outside of the package (you can import from other packages, just use the `import from @woocommerce/package` syntax). - Don't change the version in `package.json`. - Label your PR with the `Packages` label. -- Once merged, you can wait for the next package release roundup, or you can publish a release now (see below, "Publishing packages"). +- See the [Package Release Tool](https://github.com/woocommerce/woocommerce/blob/f9e7a5a3fb11cdd4dc064c02e045cf429cb6a2b6/tools/package-release/README.md) for instructions on how to release packages. --- @@ -36,7 +35,7 @@ To create a new package, add a new folder to `/packages`, containing… "author": "Automattic", "license": "GPL-2.0-or-later", "keywords": [ "wordpress", "woocommerce" ], - "homepage": "https://github.com/woocommerce/woocommerce/tree/main/packages/[_YOUR_PACKAGE_]/README.md", + "homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/[_YOUR_PACKAGE_]/README.md", "repository": { "type": "git", "url": "https://github.com/woocommerce/woocommerce.git" @@ -61,25 +60,6 @@ To create a new package, add a new folder to `/packages`, containing… - Package description - Installation details - Usage example -4. A `src` directory for the source of your module, which will be built by default using the `pnpm run build:packages` command. Note that you'll want an `index.js` file that exports the package contents, see other packages for examples. +4. A `src` directory for the source of your module, which will be built by default using the `pnpm run turbo:build` command. Note that you'll want an `index.js` file that exports the package contents, see other packages for examples. -5. Add the new package name to `packages/dependency-extraction-webpack-plugin/assets/packages.js` so that users of that plugin will also be able to use the new package without enqueuing it. - ---- - -## Publishing packages - -- Run `pnpm run publish-packages:check` to run pnpm publish with the `--dry-run` option -- Create a PR with a CHANGELOG for each updated package (or try to add to the CHANGELOG with any PR editing `packages/`) -- Run `pnpm run publish-packages:prod` to publish the package -- _OR_ Run `pnpm run publish-packages:dev` to publish "next" releases (installed as `pnpm i @woocommerce/package@next`). Only use `:dev` if you have a reason to. -- Both commands will run `build:packages` before the publishing task, just to catch any last updates. - -### Publishing a single package - -Sometimes, its helpful to release a singular package. This can be done directly through pnpm. Be sure versions and builds are correct. - -- Bump the version in the package's package.json as well as its CHANGELOG file. -- `pnpm install && pnpm run build:packages` to build packages. -- `cd packages/` -- `pnpm publish` +5. Add the new package name to `packages/js/dependency-extraction-webpack-plugin/assets/packages.js` so that users of that plugin will also be able to use the new package without enqueuing it. From 42d2260ca691c4b0422088199d3f6fdfba56c529 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?N=C3=A9stor=20Soriano?= Date: Wed, 16 Nov 2022 10:03:45 +0100 Subject: [PATCH 0077/1680] Fix custom_orders_table_usage_is_enabled returning true when HPOS feature is disabled (#35597) * custom_orders_table_usage_is_enabled returns now false if feature is disabled * Add changelog file --- plugins/woocommerce/changelog/fix-35527 | 4 ++++ .../DataStores/Orders/CustomOrdersTableController.php | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-35527 diff --git a/plugins/woocommerce/changelog/fix-35527 b/plugins/woocommerce/changelog/fix-35527 new file mode 100644 index 00000000000..ad378ea9e01 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35527 @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +CustomOrdersTableController::custom_orders_table_usage_is_enabled returns now false if the HPOS feature is disabled diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/CustomOrdersTableController.php b/plugins/woocommerce/src/Internal/DataStores/Orders/CustomOrdersTableController.php index c023ef0ae9e..caac143ee92 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/CustomOrdersTableController.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/CustomOrdersTableController.php @@ -171,7 +171,7 @@ class CustomOrdersTableController { * @return bool True if the custom orders table usage is enabled */ public function custom_orders_table_usage_is_enabled(): bool { - return get_option( self::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION ) === 'yes'; + return $this->is_feature_visible() && get_option( self::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION ) === 'yes'; } /** @@ -205,7 +205,7 @@ class CustomOrdersTableController { * @return \WC_Object_Data_Store_Interface|string The actual data store to use. */ private function get_data_store_instance( $default_data_store, string $type ) { - if ( $this->is_feature_visible() && $this->custom_orders_table_usage_is_enabled() ) { + if ( $this->custom_orders_table_usage_is_enabled() ) { switch ( $type ) { case 'order_refund': return $this->refund_data_store; From ad80ff713463f2198c697fd7a26314f5f2fd5f47 Mon Sep 17 00:00:00 2001 From: Daniel Mallory Date: Wed, 16 Nov 2022 13:22:16 +0000 Subject: [PATCH 0078/1680] WCPay Experiment: Create an Inbox Note if user wants more info on WCPay (#35581) --- .../payments-welcome/exit-survey-modal.tsx | 26 ++++-- .../changelog/add-4536-inbox-note-post-survey | 4 + .../woocommerce/src/Internal/Admin/Events.php | 3 + .../Admin/Notes/PaymentsMoreInfoNeeded.php | 84 +++++++++++++++++++ 4 files changed, 108 insertions(+), 9 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-4536-inbox-note-post-survey create mode 100644 plugins/woocommerce/src/Internal/Admin/Notes/PaymentsMoreInfoNeeded.php diff --git a/plugins/woocommerce-admin/client/payments-welcome/exit-survey-modal.tsx b/plugins/woocommerce-admin/client/payments-welcome/exit-survey-modal.tsx index 954f298a4fd..ce6587196a3 100644 --- a/plugins/woocommerce-admin/client/payments-welcome/exit-survey-modal.tsx +++ b/plugins/woocommerce-admin/client/payments-welcome/exit-survey-modal.tsx @@ -8,6 +8,8 @@ import { CheckboxControl, TextareaControl, } from '@wordpress/components'; +import { useDispatch } from '@wordpress/data'; +import { OPTIONS_STORE_NAME } from '@woocommerce/data'; import apiFetch from '@wordpress/api-fetch'; import { recordEvent } from '@woocommerce/tracks'; @@ -34,20 +36,18 @@ function ExitSurveyModal( { const [ isSomethingElseChecked, setSomethingElseChecked ] = useState( false ); const [ comments, setComments ] = useState( '' ); + const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); const closeModal = () => { setOpen( false ); - // Dismiss WCPay menu - apiFetch( { - path: 'wc-admin/options', - method: 'POST', - data: { - wc_calypso_bridge_payments_dismissed: 'yes', - }, - } ).then( () => { - window.location.href = 'admin.php?page=wc-admin'; + // Record that the modal was dismissed. + updateOptions( { + wc_calypso_bridge_payments_dismissed: 'yes', } ); + + // Redirect back to the admin page. + window.location.href = 'admin.php?page=wc-admin'; }; const exitSurvey = () => { @@ -70,6 +70,14 @@ function ExitSurveyModal( { /* eslint-enable camelcase */ } ); + if ( isMoreInfoChecked ) { + // Record that the user would possibly consider installing WCPay with more information in the future. + updateOptions( { + wc_pay_exit_survey_more_info_needed_timestamp: Math.floor( + Date.now() / 1000 + ), + } ); + } closeModal(); }; diff --git a/plugins/woocommerce/changelog/add-4536-inbox-note-post-survey b/plugins/woocommerce/changelog/add-4536-inbox-note-post-survey new file mode 100644 index 00000000000..0f017382e80 --- /dev/null +++ b/plugins/woocommerce/changelog/add-4536-inbox-note-post-survey @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Adds new Inbox Note to provide more information about WooCommerce Payments to users who dismiss the WCPay promo but say that they want more information in the exit survey. diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index 94799e91ebd..15ff57f426d 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -30,6 +30,7 @@ use \Automattic\WooCommerce\Internal\Admin\Notes\NewSalesRecord; use \Automattic\WooCommerce\Internal\Admin\Notes\OnboardingPayments; use \Automattic\WooCommerce\Internal\Admin\Notes\OnlineClothingStore; use \Automattic\WooCommerce\Internal\Admin\Notes\OrderMilestones; +use \Automattic\WooCommerce\Internal\Admin\Notes\PaymentsMoreInfoNeeded; use \Automattic\WooCommerce\Internal\Admin\Notes\PaymentsRemindMeLater; use \Automattic\WooCommerce\Internal\Admin\Notes\PerformanceOnMobile; use \Automattic\WooCommerce\Internal\Admin\Notes\PersonalizeStore; @@ -85,6 +86,7 @@ class Events { NewSalesRecord::class, OnboardingPayments::class, OnlineClothingStore::class, + PaymentsMoreInfoNeeded::class, PaymentsRemindMeLater::class, PerformanceOnMobile::class, PersonalizeStore::class, @@ -202,6 +204,7 @@ class Events { */ protected function possibly_delete_notes() { PaymentsRemindMeLater::delete_if_not_applicable(); + PaymentsMoreInfoNeeded::delete_if_not_applicable(); } /** diff --git a/plugins/woocommerce/src/Internal/Admin/Notes/PaymentsMoreInfoNeeded.php b/plugins/woocommerce/src/Internal/Admin/Notes/PaymentsMoreInfoNeeded.php new file mode 100644 index 00000000000..31f221be964 --- /dev/null +++ b/plugins/woocommerce/src/Internal/Admin/Notes/PaymentsMoreInfoNeeded.php @@ -0,0 +1,84 @@ +set_title( __( 'Payments made simple with WooCommerce Payments', 'woocommerce' ) ); + $note->set_content( $content ); + $note->set_content_data( (object) array() ); + $note->set_type( Note::E_WC_ADMIN_NOTE_INFORMATIONAL ); + $note->set_name( self::NOTE_NAME ); + $note->set_source( 'woocommerce-admin' ); + $note->add_action( 'learn-more', __( 'Learn more here', 'woocommerce' ), 'https://woocommerce.com/payments/' ); + return $note; + } +} From 0482860c74bffa60a11c5489b649b21796b253df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Wed, 16 Nov 2022 10:39:56 -0300 Subject: [PATCH 0079/1680] Fix bg color that was not covering the full page (#35476) --- plugins/woocommerce/changelog/fix-35298-background-color | 4 ++++ .../src/Admin/Features/NewProductManagementExperience.php | 8 ++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-35298-background-color diff --git a/plugins/woocommerce/changelog/fix-35298-background-color b/plugins/woocommerce/changelog/fix-35298-background-color new file mode 100644 index 00000000000..56e2f6c9406 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35298-background-color @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix bg color that was not covering the full page diff --git a/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php b/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php index f0bcd4da1d3..cb27b95b337 100644 --- a/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php +++ b/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php @@ -5,6 +5,7 @@ namespace Automattic\WooCommerce\Admin\Features; +use \Automattic\WooCommerce\Admin\PageController; use \Automattic\WooCommerce\Internal\Admin\Loader; /** @@ -16,14 +17,17 @@ class NewProductManagementExperience { * Constructor */ public function __construct() { - add_action( 'admin_init', array( $this, 'enqueue_styles' ) ); + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) ); } /** * Enqueue styles needed for the rich text editor. */ public function enqueue_styles() { - wp_enqueue_style( 'wp-edit-post' ); + if ( ! PageController::is_admin_or_embed_page() ) { + return; + } + wp_enqueue_style( 'wp-edit-blocks' ); wp_enqueue_style( 'wp-format-library' ); wp_enqueue_editor(); /** From 2297787a4f1541a4471c38ccdd44acc936b96bb6 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Wed, 16 Nov 2022 07:02:45 -0800 Subject: [PATCH 0080/1680] Add contextual product more menu (#35447) * Add icons * Add product more menu * Add classic editor url * Update header and more menu styles * Update dropdown menu label * Add changelog entry * Remove welcome guide link and icon * Remove errant import * Remove unnecessary plugin registration --- .../products/images/classic-editor-icon.tsx | 18 ++++++ .../client/products/images/feedback-icon.tsx | 18 ++++++ .../products/layout/product-form-header.tsx | 2 + .../client/products/product-form-actions.scss | 2 +- .../client/products/product-more-menu.scss | 3 + .../client/products/product-more-menu.tsx | 64 +++++++++++++++++++ plugins/woocommerce/changelog/add-35177 | 4 ++ 7 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce-admin/client/products/images/classic-editor-icon.tsx create mode 100644 plugins/woocommerce-admin/client/products/images/feedback-icon.tsx create mode 100644 plugins/woocommerce-admin/client/products/product-more-menu.scss create mode 100644 plugins/woocommerce-admin/client/products/product-more-menu.tsx create mode 100644 plugins/woocommerce/changelog/add-35177 diff --git a/plugins/woocommerce-admin/client/products/images/classic-editor-icon.tsx b/plugins/woocommerce-admin/client/products/images/classic-editor-icon.tsx new file mode 100644 index 00000000000..55058f26252 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/images/classic-editor-icon.tsx @@ -0,0 +1,18 @@ +export const ClassicEditorIcon = () => { + return ( + + + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/images/feedback-icon.tsx b/plugins/woocommerce-admin/client/products/images/feedback-icon.tsx new file mode 100644 index 00000000000..d444327c551 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/images/feedback-icon.tsx @@ -0,0 +1,18 @@ +export const FeedbackIcon = () => { + return ( + + + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx b/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx index fce001462a1..b6be65edcc4 100644 --- a/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx +++ b/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx @@ -2,6 +2,7 @@ * Internal dependencies */ import { ProductFormActions } from '../product-form-actions'; +import { ProductMoreMenu } from '../product-more-menu'; import { ProductTitle } from '../product-title'; export const ProductFormHeader: React.FC = () => { @@ -9,6 +10,7 @@ export const ProductFormHeader: React.FC = () => { <> + ); }; diff --git a/plugins/woocommerce-admin/client/products/product-form-actions.scss b/plugins/woocommerce-admin/client/products/product-form-actions.scss index 47d6ee040e7..79d7bbeb13b 100644 --- a/plugins/woocommerce-admin/client/products/product-form-actions.scss +++ b/plugins/woocommerce-admin/client/products/product-form-actions.scss @@ -6,7 +6,7 @@ $gutenberg-blue-darker: var(--wp-admin-theme-color-darker-20); flex-direction: row; align-items: center; justify-content: flex-end; - padding-right: var(--large-gap); + padding-right: $gap-smaller; > .components-button { margin-right: $gap-smaller; diff --git a/plugins/woocommerce-admin/client/products/product-more-menu.scss b/plugins/woocommerce-admin/client/products/product-more-menu.scss new file mode 100644 index 00000000000..09f87884cf7 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-more-menu.scss @@ -0,0 +1,3 @@ +.woocommerce-product-form-more-menu { + margin-right: $gap-large; +} diff --git a/plugins/woocommerce-admin/client/products/product-more-menu.tsx b/plugins/woocommerce-admin/client/products/product-more-menu.tsx new file mode 100644 index 00000000000..0f95d8e4f97 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-more-menu.tsx @@ -0,0 +1,64 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { DropdownMenu, MenuItem } from '@wordpress/components'; +import { getAdminLink } from '@woocommerce/settings'; +import { moreVertical } from '@wordpress/icons'; +import { Product } from '@woocommerce/data'; +import { registerPlugin } from '@wordpress/plugins'; +import { useFormContext } from '@woocommerce/components'; + +/** + * Internal dependencies + */ +import { ClassicEditorIcon } from './images/classic-editor-icon'; +import { FeedbackIcon } from './images/feedback-icon'; +import { WooHeaderItem } from '~/header/utils'; +import './product-more-menu.scss'; + +export const ProductMoreMenu = () => { + const { values } = useFormContext< Product >(); + + const classEditorUrl = values.id + ? getAdminLink( `post.php?post=${ values.id }&action=edit` ) + : getAdminLink( 'post-new.php?post_type=product' ); + + return ( + + + { ( { onClose } ) => ( + <> + { + // @todo This should open the CES modal. + onClose(); + } } + icon={ } + iconPosition="right" + > + { __( 'Share feedback', 'woocommerce' ) } + + { + onClose(); + } } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore The href prop exists as buttonProps. + href={ classEditorUrl } + icon={ } + iconPosition="right" + > + { __( 'Use the classic editor', 'woocommerce' ) } + + + ) } + + + ); +}; diff --git a/plugins/woocommerce/changelog/add-35177 b/plugins/woocommerce/changelog/add-35177 new file mode 100644 index 00000000000..689cd0945dd --- /dev/null +++ b/plugins/woocommerce/changelog/add-35177 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add contextual product more menu From 7bff5cbb6b4298a4b88bb5a4b20b18f58a483b91 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Wed, 16 Nov 2022 08:03:39 -0800 Subject: [PATCH 0081/1680] Add product status badge to product form header (#35460) * Add product status badge * Update status method to return keys * Add tests around product status * Add styling to badge * Add changelog entry * Change product status keys to enum * Add enum return type to product status function * Fix up lint errors * Convert indentation to tabs --- .../client/products/product-status-badge.scss | 17 +++++++ .../client/products/product-status-badge.tsx | 43 ++++++++++++++++ .../client/products/product-title.tsx | 8 ++- .../products/utils/get-product-status.ts | 49 +++++++++++++++++++ .../products/utils/test/get-product-status.ts | 38 ++++++++++++++ plugins/woocommerce/changelog/add-35169 | 4 ++ 6 files changed, 158 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce-admin/client/products/product-status-badge.scss create mode 100644 plugins/woocommerce-admin/client/products/product-status-badge.tsx create mode 100644 plugins/woocommerce-admin/client/products/utils/get-product-status.ts create mode 100644 plugins/woocommerce-admin/client/products/utils/test/get-product-status.ts create mode 100644 plugins/woocommerce/changelog/add-35169 diff --git a/plugins/woocommerce-admin/client/products/product-status-badge.scss b/plugins/woocommerce-admin/client/products/product-status-badge.scss new file mode 100644 index 00000000000..da7c03b7b45 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-status-badge.scss @@ -0,0 +1,17 @@ +.woocommerce-product-status { + margin-left: $gap-smaller; + padding-top: 1px; + padding-bottom: 1px; + color: $gray-700; + border-color: $gray-700; + + &.is-instock { + color: #00a32a; + border-color: #00a32a; + } + + &.is-outofstock { + color: #cc1818; + border-color: #cc1818; + } +} diff --git a/plugins/woocommerce-admin/client/products/product-status-badge.tsx b/plugins/woocommerce-admin/client/products/product-status-badge.tsx new file mode 100644 index 00000000000..c031b2e93fe --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-status-badge.tsx @@ -0,0 +1,43 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import classnames from 'classnames'; +import { Pill } from '@woocommerce/components'; +import { PRODUCTS_STORE_NAME, WCDataSelector } from '@woocommerce/data'; +import { useParams } from 'react-router-dom'; +import { useSelect } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { + getProductStatus, + PRODUCT_STATUS_LABELS, +} from './utils/get-product-status'; +import './product-status-badge.scss'; + +export const ProductStatusBadge: React.FC = () => { + const { productId } = useParams(); + const product = useSelect( ( select: WCDataSelector ) => { + return productId + ? select( PRODUCTS_STORE_NAME ).getProduct( + parseInt( productId, 10 ), + undefined + ) + : undefined; + } ); + + const status = getProductStatus( product ); + + return ( + + { PRODUCT_STATUS_LABELS[ status ] } + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/product-title.tsx b/plugins/woocommerce-admin/client/products/product-title.tsx index 11d3b26c4c3..31f54719e6e 100644 --- a/plugins/woocommerce-admin/client/products/product-title.tsx +++ b/plugins/woocommerce-admin/client/products/product-title.tsx @@ -15,6 +15,7 @@ import { useSelect } from '@wordpress/data'; * Internal dependencies */ import { getProductTitle } from './utils/get-product-title'; +import { ProductStatusBadge } from './product-status-badge'; import { WooHeaderPageTitle } from '~/header/utils'; export const ProductTitle: React.FC = () => { @@ -35,5 +36,10 @@ export const ProductTitle: React.FC = () => { const title = getProductTitle( values.name, values.type, persistedName ); - return { title }; + return ( + + { title } + + + ); }; diff --git a/plugins/woocommerce-admin/client/products/utils/get-product-status.ts b/plugins/woocommerce-admin/client/products/utils/get-product-status.ts new file mode 100644 index 00000000000..519a57b552e --- /dev/null +++ b/plugins/woocommerce-admin/client/products/utils/get-product-status.ts @@ -0,0 +1,49 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { PartialProduct } from '@woocommerce/data'; + +/** + * Labels for product statuses. + */ +export enum PRODUCT_STATUS_KEYS { + unsaved = 'unsaved', + draft = 'draft', + instock = 'instock', + outofstock = 'outofstock', +} + +/** + * Labels for product statuses. + */ +export const PRODUCT_STATUS_LABELS = { + [ PRODUCT_STATUS_KEYS.unsaved ]: __( 'Unsaved', 'woocommerce' ), + [ PRODUCT_STATUS_KEYS.draft ]: __( 'Draft', 'woocommerce' ), + [ PRODUCT_STATUS_KEYS.instock ]: __( 'In stock', 'woocommerce' ), + [ PRODUCT_STATUS_KEYS.outofstock ]: __( 'Out of stock', 'woocommerce' ), +}; + +/** + * Get the product status for use in the header. + * + * @param product Product instance. + * @return {PRODUCT_STATUS_KEYS} Product staus key. + */ +export const getProductStatus = ( + product: PartialProduct | undefined +): PRODUCT_STATUS_KEYS => { + if ( ! product ) { + return PRODUCT_STATUS_KEYS.unsaved; + } + + if ( product.status === 'draft' ) { + return PRODUCT_STATUS_KEYS.draft; + } + + if ( product.stock_status === 'instock' ) { + return PRODUCT_STATUS_KEYS.instock; + } + + return PRODUCT_STATUS_KEYS.outofstock; +}; diff --git a/plugins/woocommerce-admin/client/products/utils/test/get-product-status.ts b/plugins/woocommerce-admin/client/products/utils/test/get-product-status.ts new file mode 100644 index 00000000000..4696e6af99f --- /dev/null +++ b/plugins/woocommerce-admin/client/products/utils/test/get-product-status.ts @@ -0,0 +1,38 @@ +/** + * Internal dependencies + */ +import { getProductStatus } from '../get-product-status'; + +describe( 'getProductStatus', () => { + it( 'should return unsaved when no product exists', () => { + const status = getProductStatus( undefined ); + expect( status ).toBe( 'unsaved' ); + } ); + + it( 'should return draft when the status is set to draft', () => { + const status = getProductStatus( { + id: 123, + status: 'draft', + stock_status: 'instock', + } ); + expect( status ).toBe( 'draft' ); + } ); + + it( 'should return draft when the status is set to draft', () => { + const status = getProductStatus( { + id: 123, + status: 'publish', + stock_status: 'instock', + } ); + expect( status ).toBe( 'instock' ); + } ); + + it( 'should return draft when the status is set to draft', () => { + const status = getProductStatus( { + id: 123, + status: 'publish', + stock_status: 'outofstock', + } ); + expect( status ).toBe( 'outofstock' ); + } ); +} ); diff --git a/plugins/woocommerce/changelog/add-35169 b/plugins/woocommerce/changelog/add-35169 new file mode 100644 index 00000000000..76675fc7400 --- /dev/null +++ b/plugins/woocommerce/changelog/add-35169 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product state badge to product form header From 1550806efc513643d7a4ae7fed0bd723e2c62929 Mon Sep 17 00:00:00 2001 From: louwie17 Date: Wed, 16 Nov 2022 12:30:42 -0400 Subject: [PATCH 0082/1680] Add/34 create new category field modal (#35132) * Add initial category field component with new typeahead Move search logic to useCategorySearch hook Add initial add new category logic Add parent category field to add new category modal Adding some debug changes Update category control to make use of internal selectItem function of select control Add changelogs Update pagesize back to 100 Add placeholder Empty placeholder Fix input and icon sizes Fix input underline Add max height and scroll to category dropdown Add sorting of category items Auto open parents when traversing up the tree using arrow keys Add several comments Add some initial unit tests for the category field component Add tests for useCategorySearch hook and fixed minor bug Update styling and autoselect parent if child is selected Fix styling issues for the select control dropdown inside a modal Fix issue with creating new category with parent Add function comment and fixed border styling * Fix up some issues after the rebase * Some small fixes for the Category creation * Fix up some styling issues around the add-new-item * Add changelogs * Remove unneeded export of toggle button props * Fix create category error and tests in attribute field * Fix some minor bugs and styling changes that came up during PR feedback * Fix tests * Make use of $gap variable for css --- .../add-34_create_new_category_field_modal | 4 + .../src/experimental-select-control/menu.tsx | 64 ++--- .../select-control.tsx | 2 +- .../attribute-field/attribute-field.tsx | 1 + .../test/attribute-field.spec.tsx | 5 +- .../category-field-add-new-item.tsx | 47 ++++ .../category-field/category-field-item.tsx | 5 +- .../fields/category-field/category-field.scss | 5 + .../fields/category-field/category-field.tsx | 233 ++++++++++++------ .../category-field/create-category-modal.scss | 33 +++ .../category-field/create-category-modal.tsx | 204 +++++++++++++++ .../category-field/use-category-search.ts | 6 +- .../add-34_create_new_category_field_modal | 4 + 13 files changed, 492 insertions(+), 121 deletions(-) create mode 100644 packages/js/components/changelog/add-34_create_new_category_field_modal create mode 100644 plugins/woocommerce-admin/client/products/fields/category-field/category-field-add-new-item.tsx create mode 100644 plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.scss create mode 100644 plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.tsx create mode 100644 plugins/woocommerce/changelog/add-34_create_new_category_field_modal diff --git a/packages/js/components/changelog/add-34_create_new_category_field_modal b/packages/js/components/changelog/add-34_create_new_category_field_modal new file mode 100644 index 00000000000..4bfc4ae8b9b --- /dev/null +++ b/packages/js/components/changelog/add-34_create_new_category_field_modal @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Move classname down in SelectControl Menu so it is on the actual Menu element. diff --git a/packages/js/components/src/experimental-select-control/menu.tsx b/packages/js/components/src/experimental-select-control/menu.tsx index 60a8cbb6e4e..13680d9349d 100644 --- a/packages/js/components/src/experimental-select-control/menu.tsx +++ b/packages/js/components/src/experimental-select-control/menu.tsx @@ -46,39 +46,41 @@ export const Menu = ( { return (
    - 0, - } - ) } - position="bottom center" - animate={ false } - > -
      - // Fix to prevent select control dropdown from closing when selecting within the Popover. - e.stopPropagation() - } +
      + 0, + } + ) } + position="bottom right" + animate={ false } > - { isOpen && children } -
    -
    +
      + // Fix to prevent select control dropdown from closing when selecting within the Popover. + e.stopPropagation() + } + > + { isOpen && children } +
    + +
    ); /* eslint-enable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */ diff --git a/packages/js/components/src/experimental-select-control/select-control.tsx b/packages/js/components/src/experimental-select-control/select-control.tsx index 8545e652112..83a25ca716b 100644 --- a/packages/js/components/src/experimental-select-control/select-control.tsx +++ b/packages/js/components/src/experimental-select-control/select-control.tsx @@ -37,7 +37,7 @@ import { type SelectControlProps< ItemType > = { children?: ChildrenType< ItemType >; items: ItemType[]; - label: string; + label: string | JSX.Element; getItemLabel?: getItemLabelType< ItemType >; getItemValue?: getItemValueType< ItemType >; getFilteredItems?: ( diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx index 9fea1840def..b502135d1cd 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx @@ -194,6 +194,7 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { ) } /> ) } + diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx index 542a1fe7e07..5eb5801b01b 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/test/attribute-field.spec.tsx @@ -1,10 +1,9 @@ /** * External dependencies */ -import { render, act, screen, waitFor } from '@testing-library/react'; +import { render, act, screen } from '@testing-library/react'; import { useState, useEffect } from '@wordpress/element'; import { ProductAttribute } from '@woocommerce/data'; -import { resolveSelect } from '@wordpress/data'; /** * Internal dependencies @@ -73,8 +72,8 @@ jest.mock( '@wordpress/data', () => ( { jest.mock( '@woocommerce/components', () => ( { __esModule: true, + __experimentalSelectControlMenuSlot: () =>
    , ListItem: ( { children }: { children: JSX.Element } ) => children, - __experimentalSelectControlMenuSlot: () => null, Sortable: ( { onOrderChange, children, diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/category-field-add-new-item.tsx b/plugins/woocommerce-admin/client/products/fields/category-field/category-field-add-new-item.tsx new file mode 100644 index 00000000000..e181f3d9a5d --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/category-field/category-field-add-new-item.tsx @@ -0,0 +1,47 @@ +/** + * External dependencies + */ +import { __, sprintf } from '@wordpress/i18n'; +import { Icon } from '@wordpress/components'; +import { plus } from '@wordpress/icons'; +import classNames from 'classnames'; +import { ProductCategory } from '@woocommerce/data'; +import { __experimentalSelectControlMenuItemProps as MenuItemProps } from '@woocommerce/components'; + +type CategoryFieldAddNewItemProps = { + item: Pick< ProductCategory, 'id' | 'name' >; + highlightedIndex: number; + items: Pick< ProductCategory, 'id' | 'name' >[]; +} & Pick< + MenuItemProps< Pick< ProductCategory, 'id' | 'name' > >, + 'getItemProps' +>; + +export const CategoryFieldAddNewItem: React.FC< + CategoryFieldAddNewItemProps +> = ( { item, highlightedIndex, getItemProps, items } ) => { + const index = items.findIndex( ( i ) => i.id === item.id ); + return ( +
  • +
    + + { sprintf( __( 'Create "%s"', 'woocommerce' ), item.name ) } +
    +
  • + ); +}; diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/category-field-item.tsx b/plugins/woocommerce-admin/client/products/fields/category-field/category-field-item.tsx index 1236d61591a..a2c54aaad21 100644 --- a/plugins/woocommerce-admin/client/products/fields/category-field/category-field-item.tsx +++ b/plugins/woocommerce-admin/client/products/fields/category-field/category-field-item.tsx @@ -18,7 +18,6 @@ export type CategoryTreeItem = { type CategoryFieldItemProps = { item: CategoryTreeItem; selectedIds: number[]; - onSelect: ( item: ProductCategory ) => void; items: Pick< ProductCategory, 'id' | 'name' >[]; highlightedIndex: number; openParent?: () => void; @@ -30,7 +29,6 @@ type CategoryFieldItemProps = { export const CategoryFieldItem: React.FC< CategoryFieldItemProps > = ( { item, selectedIds = [], - onSelect, items, highlightedIndex, openParent, @@ -89,7 +87,7 @@ export const CategoryFieldItem: React.FC< CategoryFieldItemProps > = ( { item.data /*&& onSelect( item.data )*/ } + onChange={ () => item.data } /> { children.length > 0 ? ( @@ -107,7 +105,6 @@ export const CategoryFieldItem: React.FC< CategoryFieldItemProps > = ( { key={ child.data.id } item={ child } selectedIds={ selectedIds } - onSelect={ onSelect } items={ items } highlightedIndex={ highlightedIndex } openParent={ () => ! isOpen && setIsOpen( true ) } diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/category-field.scss b/plugins/woocommerce-admin/client/products/fields/category-field/category-field.scss index a80d03fe3eb..f94d941255f 100644 --- a/plugins/woocommerce-admin/client/products/fields/category-field/category-field.scss +++ b/plugins/woocommerce-admin/client/products/fields/category-field/category-field.scss @@ -24,6 +24,11 @@ margin-top: 0; } } + &.is-new { + .category-field-dropdown__toggle { + margin-right: $gap-smaller; + } + } } &__item-content { height: 48px; diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/category-field.tsx b/plugins/woocommerce-admin/client/products/fields/category-field/category-field.tsx index 9bab0b74b9a..8b366a6a77f 100644 --- a/plugins/woocommerce-admin/client/products/fields/category-field/category-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/category-field/category-field.tsx @@ -1,11 +1,13 @@ /** * External dependencies */ -import { useMemo } from '@wordpress/element'; +import { useMemo, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; import { selectControlStateChangeTypes, Spinner, __experimentalSelectControl as SelectControl, + __experimentalSelectControlMenuSlot as MenuSlot, __experimentalSelectControlMenu as Menu, } from '@woocommerce/components'; import { ProductCategory } from '@woocommerce/data'; @@ -17,6 +19,8 @@ import { debounce } from 'lodash'; import './category-field.scss'; import { CategoryFieldItem, CategoryTreeItem } from './category-field-item'; import { useCategorySearch } from './use-category-search'; +import { CreateCategoryModal } from './create-category-modal'; +import { CategoryFieldAddNewItem } from './category-field-add-new-item'; type CategoryFieldProps = { label: string; @@ -36,9 +40,10 @@ function getSelectedWithParents( ): Pick< ProductCategory, 'id' | 'name' >[] { selected.push( { id: item.id, name: item.name } ); - const parentId = item.parent - ? item.parent - : treeKeyValues[ item.id ].parentID; + const parentId = + item.parent !== undefined + ? item.parent + : treeKeyValues[ item.id ].parentID; if ( parentId > 0 && treeKeyValues[ parentId ] && @@ -69,8 +74,11 @@ export const CategoryField: React.FC< CategoryFieldProps > = ( { searchCategories, getFilteredItems, } = useCategorySearch(); + const [ showCreateNewModal, setShowCreateNewModal ] = useState( false ); + const [ searchValue, setSearchValue ] = useState( '' ); const onInputChange = ( searchString?: string ) => { + setSearchValue( searchString || '' ); searchCategories( searchString || '' ); }; @@ -80,6 +88,10 @@ export const CategoryField: React.FC< CategoryFieldProps > = ( { ); const onSelect = ( itemId: number, selected: boolean ) => { + if ( itemId === -99 ) { + setShowCreateNewModal( true ); + return; + } if ( selected ) { const item = categoryTreeKeyValues[ itemId ].data; if ( item ) { @@ -96,65 +108,97 @@ export const CategoryField: React.FC< CategoryFieldProps > = ( { } }; + const categoryFieldGetFilteredItems = ( + allItems: Pick< ProductCategory, 'id' | 'name' >[], + inputValue: string, + selectedItems: Pick< ProductCategory, 'id' | 'name' >[] + ) => { + const filteredItems = getFilteredItems( + allItems, + inputValue, + selectedItems + ); + if ( + inputValue.length > 0 && + ! isSearching && + ! filteredItems.find( + ( item ) => item.name.toLowerCase() === inputValue.toLowerCase() + ) + ) { + return [ + ...filteredItems, + { + id: -99, + name: inputValue, + }, + ]; + } + return filteredItems; + }; + const selectedIds = value.map( ( item ) => item.id ); - const selectControlItems = categoriesSelectList; return ( - > - className="woocommerce-category-field-dropdown components-base-control" - multiple - items={ selectControlItems } - label={ label } - selected={ value } - getItemLabel={ ( item ) => item?.name || '' } - getItemValue={ ( item ) => item?.id || '' } - onSelect={ ( item ) => { - if ( item ) { - onSelect( item.id, ! selectedIds.includes( item.id ) ); - } - } } - onRemove={ ( item ) => item && onSelect( item.id, false ) } - onInputChange={ searchDelayed } - getFilteredItems={ getFilteredItems } - placeholder={ value.length === 0 ? placeholder : '' } - stateReducer={ ( state, actionAndChanges ) => { - const { changes, type } = actionAndChanges; - switch ( type ) { - case selectControlStateChangeTypes.ControlledPropUpdatedSelectedItem: - return { - ...changes, - inputValue: state.inputValue, - }; - case selectControlStateChangeTypes.ItemClick: - return { - ...changes, - isOpen: true, - inputValue: state.inputValue, - highlightedIndex: state.highlightedIndex, - }; - default: - return changes; - } - } } - > - { ( { - items, - isOpen, - getMenuProps, - getItemProps, - selectItem, - highlightedIndex, - } ) => { - const rootItems = - items.length > 0 - ? items.filter( - ( item ) => - categoryTreeKeyValues[ item.id ] - ?.parentID === 0 - ) - : []; - return ( - <> + <> + > + className="woocommerce-category-field-dropdown components-base-control" + multiple + items={ categoriesSelectList } + label={ label } + selected={ value } + getItemLabel={ ( item ) => item?.name || '' } + getItemValue={ ( item ) => item?.id || '' } + onSelect={ ( item ) => { + if ( item ) { + onSelect( item.id, ! selectedIds.includes( item.id ) ); + } + } } + onRemove={ ( item ) => item && onSelect( item.id, false ) } + onInputChange={ searchDelayed } + getFilteredItems={ categoryFieldGetFilteredItems } + placeholder={ value.length === 0 ? placeholder : '' } + stateReducer={ ( state, actionAndChanges ) => { + const { changes, type } = actionAndChanges; + switch ( type ) { + case selectControlStateChangeTypes.ControlledPropUpdatedSelectedItem: + return { + ...changes, + inputValue: state.inputValue, + }; + case selectControlStateChangeTypes.ItemClick: + if ( + changes.selectedItem && + changes.selectedItem.id === -99 + ) { + return changes; + } + return { + ...changes, + isOpen: true, + inputValue: state.inputValue, + highlightedIndex: state.highlightedIndex, + }; + default: + return changes; + } + } } + > + { ( { + items, + isOpen, + getMenuProps, + getItemProps, + highlightedIndex, + } ) => { + const rootItems = + items.length > 0 + ? items.filter( + ( item ) => + categoryTreeKeyValues[ item.id ] + ?.parentID === 0 || item.id === -99 + ) + : []; + return ( = ( { ) } { isOpen && - rootItems.map( ( item ) => ( - - ) ) } + rootItems.map( ( item ) => { + return item.id === -99 ? ( + + ) : ( + + ); + } ) } - - ); - } } - + ); + } } + + + { showCreateNewModal && ( + setShowCreateNewModal( false ) } + onCreate={ ( newCategory ) => { + onChange( + getSelectedWithParents( + [ ...value ], + newCategory, + categoryTreeKeyValues + ) + ); + setShowCreateNewModal( false ); + onInputChange( '' ); + } } + /> + ) } + ); }; diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.scss b/plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.scss new file mode 100644 index 00000000000..4c8ead0e0da --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.scss @@ -0,0 +1,33 @@ +.woocommerce-create-new-category-modal { + min-width: 650px; + + &__buttons { + margin-top: $gap-larger; + display: flex; + flex-direction: row; + gap: $gap-smaller; + justify-content: flex-end; + } + + .category-field-dropdown { + &__menu { + padding: 0; + border: none; + } + } +} + +.woocommerce-select-control__popover-menu { + margin-top: -$gap-small; +} +.woocommerce-select-control__popover-menu-container { + max-height: 300px; + overflow-y: scroll; + padding: 0 $gap-smaller 0 $gap-small; + + > .category-field-dropdown__item:not(:first-child) { + .category-field-dropdown__item-content { + border-top: 1px solid $gray-200; + } + } +} diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.tsx b/plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.tsx new file mode 100644 index 00000000000..d9540cd3265 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fields/category-field/create-category-modal.tsx @@ -0,0 +1,204 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import interpolateComponents from '@automattic/interpolate-components'; +import { Button, Modal, Spinner, TextControl } from '@wordpress/components'; +import { useDebounce } from '@wordpress/compose'; +import { useState } from '@wordpress/element'; +import { useDispatch } from '@wordpress/data'; +import { + __experimentalSelectControl as SelectControl, + __experimentalSelectControlMenu as Menu, +} from '@woocommerce/components'; +import { recordEvent } from '@woocommerce/tracks'; +import { + EXPERIMENTAL_PRODUCT_CATEGORIES_STORE_NAME, + ProductCategory, +} from '@woocommerce/data'; + +/** + * Internal dependencies + */ +import './create-category-modal.scss'; +import { useCategorySearch } from './use-category-search'; +import { CategoryFieldItem } from './category-field-item'; + +type CreateCategoryModalProps = { + initialCategoryName?: string; + onCancel: () => void; + onCreate: ( newCategory: ProductCategory ) => void; +}; + +export const CreateCategoryModal: React.FC< CreateCategoryModalProps > = ( { + initialCategoryName, + onCancel, + onCreate, +} ) => { + const { + categoriesSelectList, + isSearching, + categoryTreeKeyValues, + searchCategories, + getFilteredItems, + } = useCategorySearch(); + const { createNotice } = useDispatch( 'core/notices' ); + const [ isCreating, setIsCreating ] = useState( false ); + const { createProductCategory, invalidateResolutionForStoreSelector } = + useDispatch( EXPERIMENTAL_PRODUCT_CATEGORIES_STORE_NAME ); + const [ categoryName, setCategoryName ] = useState( + initialCategoryName || '' + ); + const [ categoryParent, setCategoryParent ] = useState< Pick< + ProductCategory, + 'id' | 'name' + > | null >( null ); + + const onSave = async () => { + recordEvent( 'product_category_add', { + new_product_page: true, + } ); + setIsCreating( true ); + try { + const newCategory: ProductCategory = await createProductCategory( { + name: categoryName, + parent: categoryParent ? categoryParent.id : undefined, + } ); + invalidateResolutionForStoreSelector( 'getProductCategories' ); + setIsCreating( false ); + onCreate( newCategory ); + } catch ( e ) { + createNotice( + 'error', + __( 'Failed to create category.', 'woocommerce' ) + ); + setIsCreating( false ); + onCancel(); + } + }; + + const debouncedSearch = useDebounce( searchCategories, 250 ); + + return ( + onCancel() } + className="woocommerce-create-new-category-modal" + > +
    + + > + items={ categoriesSelectList } + label={ interpolateComponents( { + mixedString: __( + 'Parent category {{optional/}}', + 'woocommerce' + ), + components: { + optional: ( + + { __( '(optional)', 'woocommerce' ) } + + ), + }, + } ) } + selected={ categoryParent } + onSelect={ ( item ) => item && setCategoryParent( item ) } + onRemove={ () => setCategoryParent( null ) } + onInputChange={ debouncedSearch } + getFilteredItems={ getFilteredItems } + getItemLabel={ ( item ) => item?.name || '' } + getItemValue={ ( item ) => item?.id || '' } + > + { ( { + items, + isOpen, + getMenuProps, + highlightedIndex, + getItemProps, + } ) => { + return ( + + { [ + isSearching ? ( +
    +
    + +
    +
    + ) : null, + ...items + .filter( + ( item ) => + categoryTreeKeyValues[ item.id ] + ?.parentID === 0 + ) + .map( ( item ) => { + return ( + + ); + } ), + ].filter( + ( item ): item is JSX.Element => + item !== null + ) } +
    + ); + } } + +
    + + +
    +
    +
    + ); +}; diff --git a/plugins/woocommerce-admin/client/products/fields/category-field/use-category-search.ts b/plugins/woocommerce-admin/client/products/fields/category-field/use-category-search.ts index 5c42cdf6008..99e9396c063 100644 --- a/plugins/woocommerce-admin/client/products/fields/category-field/use-category-search.ts +++ b/plugins/woocommerce-admin/client/products/fields/category-field/use-category-search.ts @@ -207,12 +207,12 @@ export const useCategorySearch = () => { }, [ initialCategories ] ); const searchCategories = useCallback( - async ( search: string ): Promise< CategoryTreeItem[] > => { - lastSearchValue.current = search; + async ( search?: string ): Promise< CategoryTreeItem[] > => { + lastSearchValue.current = search || ''; if ( ! isAsync && initialCategories.length > 0 ) { return getCategoriesTreeWithMissingParents( [ ...initialCategories ], - search + search || '' ).then( ( categoryData ) => { setCategoriesAndNewItem( categoryData ); return categoryData[ 1 ]; diff --git a/plugins/woocommerce/changelog/add-34_create_new_category_field_modal b/plugins/woocommerce/changelog/add-34_create_new_category_field_modal new file mode 100644 index 00000000000..8051976db5a --- /dev/null +++ b/plugins/woocommerce/changelog/add-34_create_new_category_field_modal @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add add new option for the category dropdown within the product MVP From abcd2a799ac3ba9c9a797ae1ff223a026d130849 Mon Sep 17 00:00:00 2001 From: SamirMahmudzade Date: Thu, 17 Nov 2022 11:07:15 +0400 Subject: [PATCH 0083/1680] Update the Azerbaijani manat symbol AZN (#30605) Update the Azerbaijani manat symbol AZN * Rebase, update currecy symbol (from mathematical pitchfork to manat). * Add changelog. * Use Azerbaijani manat symbol instead of similar mathematical character. * Update data crud test for the AZN currency symbol. * Update currency settings for API tests. Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> --- plugins/woocommerce/changelog/update-manat-currency-symbol | 4 ++++ plugins/woocommerce/includes/wc-core-functions.php | 2 +- plugins/woocommerce/tests/api-core-tests/data/settings.js | 2 +- .../tests/api-core-tests/tests/data/data-crud.test.js | 2 +- 4 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-manat-currency-symbol diff --git a/plugins/woocommerce/changelog/update-manat-currency-symbol b/plugins/woocommerce/changelog/update-manat-currency-symbol new file mode 100644 index 00000000000..10b5f024f95 --- /dev/null +++ b/plugins/woocommerce/changelog/update-manat-currency-symbol @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Updates the currency symbol used for the Azerbaijani manat. diff --git a/plugins/woocommerce/includes/wc-core-functions.php b/plugins/woocommerce/includes/wc-core-functions.php index 13fc2bee29f..18319fc1230 100644 --- a/plugins/woocommerce/includes/wc-core-functions.php +++ b/plugins/woocommerce/includes/wc-core-functions.php @@ -673,7 +673,7 @@ function get_woocommerce_currency_symbols() { 'ARS' => '$', 'AUD' => '$', 'AWG' => 'Afl.', - 'AZN' => 'AZN', + 'AZN' => '₼', 'BAM' => 'KM', 'BBD' => '$', 'BDT' => '৳ ', diff --git a/plugins/woocommerce/tests/api-core-tests/data/settings.js b/plugins/woocommerce/tests/api-core-tests/data/settings.js index a9c44950dda..6322159f3db 100644 --- a/plugins/woocommerce/tests/api-core-tests/data/settings.js +++ b/plugins/woocommerce/tests/api-core-tests/data/settings.js @@ -17,7 +17,7 @@ const currencies = { "ARS": "Argentine peso ($)", "AUD": "Australian dollar ($)", "AWG": "Aruban florin (Afl.)", - "AZN": "Azerbaijani manat (AZN)", + "AZN": "Azerbaijani manat (₼)", "BAM": "Bosnia and Herzegovina convertible mark (KM)", "BBD": "Barbadian dollar ($)", "BDT": "Bangladeshi taka (৳ )", diff --git a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js index 3ec74751050..70355e749be 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js @@ -24493,7 +24493,7 @@ test.describe('Data API tests', () => { expect.objectContaining({ "code": "AZN", "name": "Azerbaijani manat", - "symbol": "AZN", + "symbol": "₼", "_links": { "self": [{ "href": expect.stringContaining("data/currencies/AZN") From 9337b3b5a6d21bbb703f80e30f9751a69b01f878 Mon Sep 17 00:00:00 2001 From: Yehuda Hassine Date: Thu, 17 Nov 2022 13:55:12 +0200 Subject: [PATCH 0084/1680] fix get customer tokens limit (#29850) Make it easier to support many payment methods (within My Account > Payment Methods page). * Update includes/class-wc-payment-tokens.php Better backward-compatible by @jonathansadowski Co-authored-by: jonathansadowski * Add docblock for new filter `woocommerce_get_customer_payment_tokens_limit`. * Add changelog. Co-authored-by: Yehuda Hassine Co-authored-by: jonathansadowski Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> --- plugins/woocommerce/changelog/fix-29827 | 4 ++++ plugins/woocommerce/includes/class-wc-payment-tokens.php | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-29827 diff --git a/plugins/woocommerce/changelog/fix-29827 b/plugins/woocommerce/changelog/fix-29827 new file mode 100644 index 00000000000..c6ecfcc5a90 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-29827 @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Adds new filter `woocommerce_get_customer_payment_tokens_limit` to set limit on number of payment methods fetched within the My Account page. diff --git a/plugins/woocommerce/includes/class-wc-payment-tokens.php b/plugins/woocommerce/includes/class-wc-payment-tokens.php index 2185895f0df..618b5dd7cc9 100644 --- a/plugins/woocommerce/includes/class-wc-payment-tokens.php +++ b/plugins/woocommerce/includes/class-wc-payment-tokens.php @@ -74,6 +74,14 @@ class WC_Payment_Tokens { array( 'user_id' => $customer_id, 'gateway_id' => $gateway_id, + /** + * Controls the maximum number of Payment Methods that will be listed via the My Account page. + * + * @since 7.2.0 + * + * @param int $limit Defaults to the value of the `posts_per_page` option. + */ + 'limit' => apply_filters( 'woocommerce_get_customer_payment_tokens_limit', get_option( 'posts_per_page' ) ), ) ); From baa1c120bce6df9e06b80ecb876ffda8121ffd0d Mon Sep 17 00:00:00 2001 From: Alex Pantechovskis Date: Thu, 17 Nov 2022 14:39:31 +0200 Subject: [PATCH 0085/1680] Do not use $_POST directly in validate_checkout (#35329) Avoid direct use of $_POST from within the validate_checkout() method. * Changelog. * Address some of the undocumented hook errors flagged by our linting check. This does not address all of the undocumented hooks (there are many in this file), just the ones flagged by the GitHub Actions code sniff check. This is an effort to unblock the PR, which we otherwise cannot merge at present. * Add missing `@since` tags (satisfy linter). Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> --- plugins/woocommerce/changelog/35328-post-data | 4 + .../includes/class-wc-checkout.php | 81 ++++++++++++++++++- 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 plugins/woocommerce/changelog/35328-post-data diff --git a/plugins/woocommerce/changelog/35328-post-data b/plugins/woocommerce/changelog/35328-post-data new file mode 100644 index 00000000000..7f1f2e3ac51 --- /dev/null +++ b/plugins/woocommerce/changelog/35328-post-data @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Remove the direct dependency on `$_POST` when validating checkout data. diff --git a/plugins/woocommerce/includes/class-wc-checkout.php b/plugins/woocommerce/includes/class-wc-checkout.php index 9dfa2474b42..cd39ca9ef6d 100644 --- a/plugins/woocommerce/includes/class-wc-checkout.php +++ b/plugins/woocommerce/includes/class-wc-checkout.php @@ -58,7 +58,11 @@ class WC_Checkout { add_action( 'woocommerce_checkout_billing', array( self::$instance, 'checkout_form_billing' ) ); add_action( 'woocommerce_checkout_shipping', array( self::$instance, 'checkout_form_shipping' ) ); - // woocommerce_checkout_init action is ran once when the class is first constructed. + /** + * Runs once when the WC_Checkout class is first instantiated. + * + * @since 3.0.0 or earlier + */ do_action( 'woocommerce_checkout_init', self::$instance ); } return self::$instance; @@ -154,6 +158,13 @@ class WC_Checkout { case 'payment_method': return $this->legacy_posted_data['payment_method']; case 'customer_id': + /** + * Provides an opportunity to modify the customer ID associated with the current checkout process. + * + * @since 3.0.0 or earlier + * + * @param int The current user's ID (this may be 0 if no user is logged in). + */ return apply_filters( 'woocommerce_checkout_customer_id', get_current_user_id() ); case 'shipping_methods': return (array) WC()->session->get( 'chosen_shipping_methods' ); @@ -181,6 +192,13 @@ class WC_Checkout { * @return boolean */ public function is_registration_required() { + /** + * Controls if registration is required in order for checkout to be completed. + * + * @since 3.0.0 + * + * @param bool $checkout_registration_required If customers must be registered to checkout. + */ return apply_filters( 'woocommerce_checkout_registration_required', 'yes' !== get_option( 'woocommerce_enable_guest_checkout' ) ); } @@ -191,6 +209,13 @@ class WC_Checkout { * @return boolean */ public function is_registration_enabled() { + /** + * Determines if customer registration is enabled during checkout. + * + * @since 3.0.0 + * + * @param bool $checkout_registration_enabled If checkout registration is enabled. + */ return apply_filters( 'woocommerce_checkout_registration_enabled', 'yes' === get_option( 'woocommerce_enable_signup_and_login_from_checkout' ) ); } @@ -264,6 +289,14 @@ class WC_Checkout { 'autocomplete' => 'new-password', ); } + + /** + * Sets the fields used during checkout. + * + * @since 3.0.0 or earlier + * + * @param array[] $checkout_fields + */ $this->fields = apply_filters( 'woocommerce_checkout_fields', $this->fields ); foreach ( $this->fields as $field_type => $fields ) { @@ -286,6 +319,12 @@ class WC_Checkout { * When we process the checkout, lets ensure cart items are rechecked to prevent checkout. */ public function check_cart_items() { + /** + * Provides an opportunity to check cart items before checkout. This generally occurs during checkout validation. + * + * @see WC_Checkout::validate_checkout() + * @since 3.0.0 or earlier + */ do_action( 'woocommerce_check_cart_items' ); } @@ -319,7 +358,14 @@ class WC_Checkout { * @return int|WP_ERROR */ public function create_order( $data ) { - // Give plugins the opportunity to create an order themselves. + /** + * Gives plugins an opportunity to create a new order themselves. + * + * @since 3.0.0 or earlier + * + * @param int|null $order_id Can be set to an order ID to short-circuit the default order creation process. + * @param WC_Checkout $checkout Reference to the current WC_Checkout instance. + */ $order_id = apply_filters( 'woocommerce_create_order', null, $this ); if ( $order_id ) { return $order_id; @@ -338,7 +384,14 @@ class WC_Checkout { * detect changes which is based on cart items + order total. */ if ( $order && $order->has_cart_hash( $cart_hash ) && $order->has_status( array( 'pending', 'failed' ) ) ) { - // Action for 3rd parties. + /** + * Indicates that we are resuming checkout for an existing order (which is pending payment, and which + * has not changed since it was added to the current shopping session). + * + * @since 3.0.0 or earlier + * + * @param int $order_id The ID of the order being resumed. + */ do_action( 'woocommerce_resume_order', $order_id ); // Remove all items - we will re-add them later. @@ -371,6 +424,11 @@ class WC_Checkout { $order->hold_applied_coupons( $data['billing_email'] ); $order->set_created_via( 'checkout' ); $order->set_cart_hash( $cart_hash ); + /** + * This action is documented in woocommerce/includes/class-wc-checkout.php + * + * @since 3.0.0 or earlier + */ $order->set_customer_id( apply_filters( 'woocommerce_checkout_customer_id', get_current_user_id() ) ); $order->set_currency( get_woocommerce_currency() ); $order->set_prices_include_tax( 'yes' === get_option( 'woocommerce_prices_include_tax' ) ); @@ -581,6 +639,15 @@ class WC_Checkout { */ public function create_order_tax_lines( &$order, $cart ) { foreach ( array_keys( $cart->get_cart_contents_taxes() + $cart->get_shipping_taxes() + $cart->get_fee_taxes() ) as $tax_rate_id ) { + /** + * Controls the zero rate tax ID. + * + * An order item tax will not be created for this ID (which by default is 'zero-rated'). + * + * @since 3.0.0 or earlier + * + * @param string $tax_rate_id The ID of the zero rate tax. + */ if ( $tax_rate_id && apply_filters( 'woocommerce_cart_remove_taxes_zero_rate_id', 'zero-rated' ) !== $tax_rate_id ) { $item = new WC_Order_Item_Tax(); $item->set_props( @@ -672,6 +739,7 @@ class WC_Checkout { // phpcs:disable WordPress.Security.NonceVerification.Missing $data = array( 'terms' => (int) isset( $_POST['terms'] ), + 'terms-field' => (int) isset( $_POST['terms-field'] ), 'createaccount' => (int) ( $this->is_registration_enabled() ? ! empty( $_POST['createaccount'] ) : false ), 'payment_method' => isset( $_POST['payment_method'] ) ? wc_clean( wp_unslash( $_POST['payment_method'] ) ) : '', 'shipping_method' => isset( $_POST['shipping_method'] ) ? wc_clean( wp_unslash( $_POST['shipping_method'] ) ) : '', @@ -851,7 +919,7 @@ class WC_Checkout { $this->check_cart_items(); // phpcs:ignore WordPress.Security.NonceVerification.Missing - if ( empty( $data['woocommerce_checkout_update_totals'] ) && empty( $data['terms'] ) && ! empty( $_POST['terms-field'] ) ) { + if ( empty( $data['woocommerce_checkout_update_totals'] ) && empty( $data['terms'] ) && ! empty( $data['terms-field'] ) ) { $errors->add( 'terms', __( 'Please read and accept the terms and conditions to proceed with your order.', 'woocommerce' ) ); } @@ -1030,6 +1098,11 @@ class WC_Checkout { * @param array $data Posted data. */ protected function process_customer( $data ) { + /** + * This action is documented in woocommerce/includes/class-wc-checkout.php + * + * @since 3.0.0 or earlier + */ $customer_id = apply_filters( 'woocommerce_checkout_customer_id', get_current_user_id() ); if ( ! is_user_logged_in() && ( $this->is_registration_required() || ! empty( $data['createaccount'] ) ) ) { From ba0994fda5a44f21d3ecde2231cbff6342dd3bbe Mon Sep 17 00:00:00 2001 From: Adrian Duffell <9312929+adrianduffell@users.noreply.github.com> Date: Thu, 17 Nov 2022 22:48:14 +0800 Subject: [PATCH 0086/1680] Deploy the stacked layout in the Products Task experiment (#35611) * Deploy stacked layout in product task experiment * Add changelog * Remove unused import --- .../use-product-layout-experiment.ts | 17 ++--------------- .../changelog/fix-deploy-stacked-products-task | 4 ++++ 2 files changed, 6 insertions(+), 15 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-deploy-stacked-products-task diff --git a/plugins/woocommerce-admin/client/tasks/fills/experimental-products/use-product-layout-experiment.ts b/plugins/woocommerce-admin/client/tasks/fills/experimental-products/use-product-layout-experiment.ts index 2d3c2c0baf6..7501ec6ef88 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/experimental-products/use-product-layout-experiment.ts +++ b/plugins/woocommerce-admin/client/tasks/fills/experimental-products/use-product-layout-experiment.ts @@ -2,25 +2,12 @@ * External dependencies */ import { useState, useEffect } from '@wordpress/element'; -import { loadExperimentAssignment } from '@woocommerce/explat'; type Layout = 'control' | 'card' | 'stacked'; export const getProductLayoutExperiment = async (): Promise< Layout > => { - const [ cardAssignment, stackedAssignment ] = await Promise.all( [ - loadExperimentAssignment( `woocommerce_products_task_layout_card_v3` ), - loadExperimentAssignment( - `woocommerce_products_task_layout_stacked_v3` - ), - ] ); - // This logic may look flawed as in both looks like they can be assigned treatment at the same time, - // but in backend we segment the experiments by store country, so it will never be. - if ( cardAssignment?.variationName === 'treatment' ) { - return 'card'; - } else if ( stackedAssignment?.variationName === 'treatment' ) { - return 'stacked'; - } - return 'control'; + // Deploy the stacked layout. Todo: cleanup the experiment code. + return 'stacked'; }; export const isProductTaskExperimentTreatment = diff --git a/plugins/woocommerce/changelog/fix-deploy-stacked-products-task b/plugins/woocommerce/changelog/fix-deploy-stacked-products-task new file mode 100644 index 00000000000..8a6483d89a9 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-deploy-stacked-products-task @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Update products task list UI From 19058ed17c63f5cae9b49d0694ebff8db0dccc42 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Thu, 17 Nov 2022 10:32:27 -0500 Subject: [PATCH 0087/1680] Fix the `wcadmin_product_update` Tracks event `menu_order` custom property value (#35605) --- .../changelog/fix-tracks_product_update_menu_order | 5 +++++ .../includes/tracks/events/class-wc-products-tracking.php | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-tracks_product_update_menu_order diff --git a/plugins/woocommerce/changelog/fix-tracks_product_update_menu_order b/plugins/woocommerce/changelog/fix-tracks_product_update_menu_order new file mode 100644 index 00000000000..f9b964d7ca5 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-tracks_product_update_menu_order @@ -0,0 +1,5 @@ +Significance: patch +Type: fix +Comment: Corrected the `wcadmin_product_update` Tracks event `menu_order` property value. + + diff --git a/plugins/woocommerce/includes/tracks/events/class-wc-products-tracking.php b/plugins/woocommerce/includes/tracks/events/class-wc-products-tracking.php index 21f214a18e4..7fe18aacf2d 100644 --- a/plugins/woocommerce/includes/tracks/events/class-wc-products-tracking.php +++ b/plugins/woocommerce/includes/tracks/events/class-wc-products-tracking.php @@ -153,7 +153,7 @@ class WC_Products_Tracking { if ( ! isBlockEditor ) { tagsText = $( '[name=\"tax_input[product_tag]\"]' ).val(); if ( $( '#content' ).is( ':visible' ) ) { - description_value = $( '#content' ).val(); + description_value = $( '#content' ).val(); } else if ( typeof tinymce === 'object' && tinymce.get( 'content' ) ) { description_value = tinymce.get( 'content' ).getContent(); } @@ -171,7 +171,7 @@ class WC_Products_Tracking { is_block_editor: isBlockEditor, is_downloadable: $( '#_downloadable' ).is( ':checked' ) ? 'Yes' : 'No', manage_stock: $( '#_manage_stock' ).is( ':checked' ) ? 'Yes' : 'No', - menu_order: $( '#menu_order' ).val() ? 'Yes' : 'No', + menu_order: parseInt( $( '#menu_order' ).val(), 10 ) !== 0 ? 'Yes' : 'No', product_gallery: $( '#product_images_container .product_images > li' ).length, product_image: $( '#_thumbnail_id' ).val() > 0 ? 'Yes' : 'No', product_type: $( '#product-type' ).val(), From 233e23704f806897a1b672b86c287e4b98b6bd93 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 17 Nov 2022 09:59:51 -0800 Subject: [PATCH 0088/1680] Add product settings menu to new product management experience (#35592) * Add icons * Add classic editor url * Remove welcome guide link and icon * Add initial settings menu * Fix up button styling * Move product settings to its own folder * Remove unnecessary registerPlugin call * Use number type control for menu order field * Add tests around product settings component * Allow reviews by default on all new products * Alphabetize product properties * Add changelog entry * Add data changelog entry * Convert indentation to tabs * Fix up scss linting errors * Remove whitespace --- packages/js/data/changelog/add-35175 | 4 + packages/js/data/src/products/types.ts | 89 ++++++++++--------- .../client/products/add-product-page.tsx | 1 + .../products/layout/product-form-header.tsx | 2 + .../client/products/product-more-menu.tsx | 1 - .../products/product-settings/index.tsx | 1 + .../product-settings/product-settings.scss | 29 ++++++ .../product-settings/product-settings.tsx | 70 +++++++++++++++ .../test/product-settings.spec.tsx | 73 +++++++++++++++ plugins/woocommerce/changelog/add-35175 | 4 + 10 files changed, 229 insertions(+), 45 deletions(-) create mode 100644 packages/js/data/changelog/add-35175 create mode 100644 plugins/woocommerce-admin/client/products/product-settings/index.tsx create mode 100644 plugins/woocommerce-admin/client/products/product-settings/product-settings.scss create mode 100644 plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx create mode 100644 plugins/woocommerce-admin/client/products/product-settings/test/product-settings.spec.tsx create mode 100644 plugins/woocommerce/changelog/add-35175 diff --git a/packages/js/data/changelog/add-35175 b/packages/js/data/changelog/add-35175 new file mode 100644 index 00000000000..e5dbd235dee --- /dev/null +++ b/packages/js/data/changelog/add-35175 @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Add missing reviews property to product data diff --git a/packages/js/data/src/products/types.ts b/packages/js/data/src/products/types.ts index 961261a771f..7b3f6154634 100644 --- a/packages/js/data/src/products/types.ts +++ b/packages/js/data/src/products/types.ts @@ -45,79 +45,80 @@ export type Product< Status = ProductStatus, Type = ProductType > = Omit< Schema.Post, 'status' | 'categories' > & { - id: number; - name: string; - slug: string; - permalink: string; + attributes: ProductAttribute[]; + average_rating: string; + backordered: boolean; + backorders: 'no' | 'notify' | 'yes'; + backorders_allowed: boolean; + button_text: string; + categories: Pick< ProductCategory, 'id' | 'name' | 'slug' >[]; date_created: string; date_created_gmt: string; date_modified: string; date_modified_gmt: string; - type: Type; - status: Status; - featured: boolean; - description: string; - short_description: string; - sku: string; date_on_sale_from_gmt: string | null; date_on_sale_to_gmt: string | null; - virtual: boolean; + description: string; + dimensions: ProductDimensions; + download_expiry: number; + download_limit: number; downloadable: boolean; downloads: ProductDownload[]; - download_limit: number; - download_expiry: number; external_url: string; - button_text: string; - tax_status: 'taxable' | 'shipping' | 'none'; - tax_class: 'standard' | 'reduced-rate' | 'zero-rate' | undefined; - manage_stock: boolean; - stock_quantity: number; + featured: boolean; + id: number; low_stock_amount: number; - stock_status: 'instock' | 'outofstock' | 'onbackorder'; - backorders: 'no' | 'notify' | 'yes'; + manage_stock: boolean; + name: string; + on_sale: boolean; + permalink: string; price: string; price_html: string; - regular_price: string; - sale_price: string; - on_sale: boolean; purchasable: boolean; - total_sales: number; - backorders_allowed: boolean; - backordered: boolean; - shipping_required: boolean; - shipping_taxable: boolean; - shipping_class: string; - shipping_class_id: number; - average_rating: string; + regular_price: string; rating_count: number; related_ids: number[]; + reviews_allowed: boolean; + sale_price: string; + shipping_class: string; + shipping_class_id: number; + shipping_required: boolean; + shipping_taxable: boolean; + short_description: string; + slug: string; + sku: string; + status: Status; + stock_quantity: number; + stock_status: 'instock' | 'outofstock' | 'onbackorder'; + tax_class: 'standard' | 'reduced-rate' | 'zero-rate' | undefined; + tax_status: 'taxable' | 'shipping' | 'none'; + total_sales: number; + type: Type; variations: number[]; - attributes: ProductAttribute[]; - dimensions: ProductDimensions; + virtual: boolean; weight: string; - categories: Pick< ProductCategory, 'id' | 'name' | 'slug' >[]; }; export const productReadOnlyProperties = [ - 'id', - 'permalink', + 'average_rating', + 'backordered', + 'backorders_allowed', 'date_created', 'date_created_gmt', 'date_modified', 'date_modified_gmt', + 'id', + 'on_sale', + 'permalink', 'price', 'price_html', - 'on_sale', 'purchasable', - 'total_sales', - 'backorders_allowed', - 'backordered', - 'shipping_required', - 'shipping_taxable', - 'shipping_class_id', - 'average_rating', 'rating_count', 'related_ids', + 'shipping_class_id', + 'shipping_required', + 'shipping_taxable', + 'total_sales', 'variations', ] as const; diff --git a/plugins/woocommerce-admin/client/products/add-product-page.tsx b/plugins/woocommerce-admin/client/products/add-product-page.tsx index 801095ccd12..5da9f4f22c2 100644 --- a/plugins/woocommerce-admin/client/products/add-product-page.tsx +++ b/plugins/woocommerce-admin/client/products/add-product-page.tsx @@ -29,6 +29,7 @@ const AddProductPage: React.FC = () => {
    > initialValues={ { + reviews_allowed: true, name: '', sku: '', stock_quantity: 0, diff --git a/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx b/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx index b6be65edcc4..fef37b3693b 100644 --- a/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx +++ b/plugins/woocommerce-admin/client/products/layout/product-form-header.tsx @@ -3,6 +3,7 @@ */ import { ProductFormActions } from '../product-form-actions'; import { ProductMoreMenu } from '../product-more-menu'; +import { ProductSettings } from '../product-settings'; import { ProductTitle } from '../product-title'; export const ProductFormHeader: React.FC = () => { @@ -10,6 +11,7 @@ export const ProductFormHeader: React.FC = () => { <> + ); diff --git a/plugins/woocommerce-admin/client/products/product-more-menu.tsx b/plugins/woocommerce-admin/client/products/product-more-menu.tsx index 0f95d8e4f97..42d3d9575f5 100644 --- a/plugins/woocommerce-admin/client/products/product-more-menu.tsx +++ b/plugins/woocommerce-admin/client/products/product-more-menu.tsx @@ -6,7 +6,6 @@ import { DropdownMenu, MenuItem } from '@wordpress/components'; import { getAdminLink } from '@woocommerce/settings'; import { moreVertical } from '@wordpress/icons'; import { Product } from '@woocommerce/data'; -import { registerPlugin } from '@wordpress/plugins'; import { useFormContext } from '@woocommerce/components'; /** diff --git a/plugins/woocommerce-admin/client/products/product-settings/index.tsx b/plugins/woocommerce-admin/client/products/product-settings/index.tsx new file mode 100644 index 00000000000..fde4f2459c9 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-settings/index.tsx @@ -0,0 +1 @@ +export * from './product-settings'; diff --git a/plugins/woocommerce-admin/client/products/product-settings/product-settings.scss b/plugins/woocommerce-admin/client/products/product-settings/product-settings.scss new file mode 100644 index 00000000000..fbfa0651fd7 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-settings/product-settings.scss @@ -0,0 +1,29 @@ +.product-settings__panel { + position: absolute; + top: 100%; + right: 0; + height: calc(100vh - $header-height - $admin-bar-height); + width: 280px; + + + .components-panel__body { + >.components-base-control { + margin-top: 22px; + } + + .components-panel__body-title + .components-base-control { + margin-top: 0; + } + } + + .components-panel__body.is-opened > .components-panel__body-title { + margin-bottom: 10px; + } + + .components-panel__header .components-button.has-icon { + margin: 0 0 0 auto; + padding: 0; + min-width: 24px; + height: 24px; + } +} diff --git a/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx b/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx new file mode 100644 index 00000000000..0c8b250d102 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx @@ -0,0 +1,70 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { + Button, + CheckboxControl, + Panel, + PanelBody, + PanelHeader, + TextControl, +} from '@wordpress/components'; +import { closeSmall, cog } from '@wordpress/icons'; +import { Product } from '@woocommerce/data'; +import { useFormContext } from '@woocommerce/components'; +import { useState } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { getCheckboxTracks } from '../sections/utils'; +import { WooHeaderItem } from '~/header/utils'; +import './product-settings.scss'; + +export const ProductSettings = () => { + const { getCheckboxControlProps, getInputProps } = + useFormContext< Product >(); + const [ isOpen, setIsOpen ] = useState( false ); + + return ( + + <> +
    { values.attributes.map( - ( formAttr, index ) => ( + ( attribute, index ) => ( = ( { 'Search or create attribute', 'woocommerce' ) } - value={ - formAttr.id && - formAttr.name - ? formAttr - : null - } + value={ attribute } onChange={ ( val ) => { @@ -186,12 +189,10 @@ export const AddAttributeModal: React.FC< AddAttributeModalProps > = ( { 'attributes[' + index + ']', - { - ...val, - terms: [], - options: - undefined, - } + val && + getProductAttributeObject( + val + ) ); if ( val ) { focusValueField( @@ -219,31 +220,64 @@ export const AddAttributeModal: React.FC< AddAttributeModalProps > = ( { /> @@ -488,7 +487,7 @@ if ( ! class_exists( 'WC_Admin_Settings', false ) ) : $visibility_class[] = 'show_options_if_checked'; } - $must_disable = ArrayUtil::get_value_or_default( $value, 'disabled', false ); + $must_disable = $value['disabled'] ?? false; if ( ! isset( $value['checkboxgroup'] ) || 'start' === $value['checkboxgroup'] ) { $has_tooltip = isset( $value['tooltip'] ) && '' !== $value['tooltip']; diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-status.php b/plugins/woocommerce/includes/admin/class-wc-admin-status.php index 07be992b129..6e92ff6e4ff 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-status.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-status.php @@ -7,7 +7,6 @@ */ use Automattic\Jetpack\Constants; -use Automattic\WooCommerce\Utilities\ArrayUtil; defined( 'ABSPATH' ) || exit; @@ -49,13 +48,13 @@ class WC_Admin_Status { $response = $tools_controller->execute_tool( $action ); $tool = $tools[ $action ]; - $tool_requires_refresh = ArrayUtil::get_value_or_default( $tool, 'requires_refresh', false ); + $tool_requires_refresh = $tool['requires_refresh'] ?? false; $tool = array( 'id' => $action, 'name' => $tool['name'], 'action' => $tool['button'], 'description' => $tool['desc'], - 'disabled' => ArrayUtil::get_value_or_default( $tool, 'disabled', false ), + 'disabled' => $tool['disabled'] ?? false, ); $tool = array_merge( $tool, $response ); diff --git a/plugins/woocommerce/src/Internal/Features/FeaturesController.php b/plugins/woocommerce/src/Internal/Features/FeaturesController.php index 8011280ec2b..e0a792920a4 100644 --- a/plugins/woocommerce/src/Internal/Features/FeaturesController.php +++ b/plugins/woocommerce/src/Internal/Features/FeaturesController.php @@ -765,19 +765,19 @@ class FeaturesController { return $list; } - // phpcs:disable WordPress.Security.NonceVerification + // phpcs:disable WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput if ( ! function_exists( 'get_current_screen' ) || get_current_screen() && 'plugins' !== get_current_screen()->id || 'incompatible_with_feature' !== ArrayUtil::get_value_or_default( $_GET, 'plugin_status' ) ) { return $list; } - $feature_id = ArrayUtil::get_value_or_default( $_GET, 'feature_id', 'all' ); + $feature_id = $_GET['feature_id'] ?? 'all'; if ( 'all' !== $feature_id && ! $this->feature_exists( $feature_id ) ) { return $list; } $incompatibles = array(); - // phpcs:enable WordPress.Security.NonceVerification + // phpcs:enable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput foreach ( array_keys( $list ) as $plugin_name ) { if ( ! $this->plugin_util->is_woocommerce_aware_plugin( $plugin_name ) || ! $this->proxy->call_function( 'is_plugin_active', $plugin_name ) ) { continue; @@ -1054,16 +1054,16 @@ class FeaturesController { * @return string[] The actual views array to use. */ private function handle_plugins_page_views_list( $views ): array { - // phpcs:disable WordPress.Security.NonceVerification + // phpcs:disable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput if ( 'incompatible_with_feature' !== ArrayUtil::get_value_or_default( $_GET, 'plugin_status' ) ) { return $views; } - $feature_id = ArrayUtil::get_value_or_default( $_GET, 'feature_id', 'all' ); + $feature_id = $_GET['feature_id'] ?? 'all'; if ( 'all' !== $feature_id && ! $this->feature_exists( $feature_id ) ) { return $views; } - // phpcs:enable WordPress.Security.NonceVerification + // phpcs:enable WordPress.Security.NonceVerification, WordPress.Security.ValidatedSanitizedInput $all_items = get_plugins(); diff --git a/plugins/woocommerce/src/Utilities/ArrayUtil.php b/plugins/woocommerce/src/Utilities/ArrayUtil.php index adddeb15e0a..7c711628237 100644 --- a/plugins/woocommerce/src/Utilities/ArrayUtil.php +++ b/plugins/woocommerce/src/Utilities/ArrayUtil.php @@ -80,13 +80,20 @@ class ArrayUtil { /** * Gets the value for a given key from an array, or a default value if the key doesn't exist in the array. * + * This is equivalent to "$array[$key] ?? $default" except in one case: + * when they key exists, has a null value, and a non-null default is supplied: + * + * $array = ['key' => null] + * $array['key'] ?? 'default' => 'default' + * ArrayUtil::get_value_or_default($array, 'key', 'default') => null + * * @param array $array The array to get the value from. * @param string $key The key to use to retrieve the value. * @param null $default The default value to return if the key doesn't exist in the array. * @return mixed|null The value for the key, or the default value passed. */ public static function get_value_or_default( array $array, string $key, $default = null ) { - return isset( $array[ $key ] ) ? $array[ $key ] : $default; + return array_key_exists( $key, $array ) ? $array[ $key ] : $default; } /** diff --git a/plugins/woocommerce/src/Utilities/PluginUtil.php b/plugins/woocommerce/src/Utilities/PluginUtil.php index 6126de80d7c..e39abb15c5f 100644 --- a/plugins/woocommerce/src/Utilities/PluginUtil.php +++ b/plugins/woocommerce/src/Utilities/PluginUtil.php @@ -97,7 +97,7 @@ class PluginUtil { */ public function get_plugin_name( string $plugin_id ): string { $plugin_data = $this->proxy->call_function( 'get_plugin_data', WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin_id ); - return ArrayUtil::get_value_or_default( $plugin_data, 'Name', $plugin_id ); + return $plugin_data['Name'] ?? $plugin_id; } /** @@ -111,7 +111,7 @@ class PluginUtil { if ( is_string( $plugin_file_or_data ) ) { return in_array( $plugin_file_or_data, $this->get_woocommerce_aware_plugins(), true ); } elseif ( is_array( $plugin_file_or_data ) ) { - return '' !== ArrayUtil::get_value_or_default( $plugin_file_or_data, 'WC tested up to', '' ); + return '' !== ( $plugin_file_or_data['WC tested up to'] ?? '' ); } else { throw new \Exception( 'is_woocommerce_aware_plugin requires a plugin name or an array of plugin data as input' ); } diff --git a/plugins/woocommerce/tests/php/src/Internal/ProductAttributesLookup/LookupDataStoreTest.php b/plugins/woocommerce/tests/php/src/Internal/ProductAttributesLookup/LookupDataStoreTest.php index 81d15c11eef..129fc8cc14d 100644 --- a/plugins/woocommerce/tests/php/src/Internal/ProductAttributesLookup/LookupDataStoreTest.php +++ b/plugins/woocommerce/tests/php/src/Internal/ProductAttributesLookup/LookupDataStoreTest.php @@ -8,7 +8,6 @@ namespace Automattic\WooCommerce\Tests\Internal\ProductAttributesLookup; use Automattic\WooCommerce\Internal\ProductAttributesLookup\DataRegenerator; use Automattic\WooCommerce\Internal\ProductAttributesLookup\LookupDataStore; use Automattic\WooCommerce\Testing\Tools\FakeQueue; -use Automattic\WooCommerce\Utilities\ArrayUtil; /** * Tests for the LookupDataStore class. @@ -1111,7 +1110,7 @@ class LookupDataStoreTest extends \WC_Unit_Test_Case { $attribute->set_id( $attribute_data['id'] ); $attribute->set_name( $taxonomy ); $attribute->set_options( $attribute_data['options'] ); - $attribute->set_variation( ArrayUtil::get_value_or_default( $attribute_data, 'variation', false ) ); + $attribute->set_variation( $attribute_data['variation'] ?? false ); $attributes[] = $attribute; } diff --git a/plugins/woocommerce/tests/php/src/Utilities/ArrayUtilTest.php b/plugins/woocommerce/tests/php/src/Utilities/ArrayUtilTest.php index a7f7e02a661..db98d77708d 100644 --- a/plugins/woocommerce/tests/php/src/Utilities/ArrayUtilTest.php +++ b/plugins/woocommerce/tests/php/src/Utilities/ArrayUtilTest.php @@ -135,6 +135,15 @@ class ArrayUtilTest extends \WC_Unit_Test_Case { $this->assertEquals( 'buzz', ArrayUtil::get_value_or_default( $array, 'fizz', 'buzz' ) ); } + /** + * @testdox `get_value_or_default` returns null if the key exists and has a null value. + */ + public function test_get_value_or_default_returns_null_if_key_exists_and_value_is_null() { + $array = array( 'foo' => null ); + + $this->assertNull( ArrayUtil::get_value_or_default( $array, 'foo', 'buzz' ) ); + } + /** * Data provider for test_to_ranges_string * From 8b6aad4138661e5a98386a67514adbba8e2bbeb7 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Thu, 9 Mar 2023 22:51:12 +0800 Subject: [PATCH 0984/1680] Refetch campaign types after installing a channel in CreateNewCampaignModal. --- .../marketing/hooks/useCampaignTypes.ts | 33 +++++++++++++------ .../CreateNewCampaignModal.tsx | 10 ++++-- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts b/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts index 24f94e72330..8cf9b70f8ee 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts @@ -1,7 +1,8 @@ /** * External dependencies */ -import { useSelect } from '@wordpress/data'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { useCallback } from '@wordpress/element'; /** * Internal dependencies @@ -18,6 +19,7 @@ type UseCampaignTypes = { loading: boolean; data?: Array< CampaignType >; error?: ApiFetchError; + refetch: () => void; }; const convert = ( campaignType: APICampaignType ): CampaignType => { @@ -33,14 +35,25 @@ const convert = ( campaignType: APICampaignType ): CampaignType => { }; export const useCampaignTypes = (): UseCampaignTypes => { - return useSelect( ( select ) => { - const { hasFinishedResolution, getCampaignTypes } = select( STORE_KEY ); - const campaignTypesState = getCampaignTypes< CampaignTypesState >(); + const { invalidateResolution } = useDispatch( STORE_KEY ); - return { - loading: ! hasFinishedResolution( 'getCampaignTypes' ), - data: campaignTypesState.data?.map( convert ), - error: campaignTypesState.error, - }; - }, [] ); + const refetch = useCallback( () => { + invalidateResolution( 'getCampaignTypes' ); + }, [ invalidateResolution ] ); + + return useSelect< UseCampaignTypes >( + ( select ) => { + const { hasFinishedResolution, getCampaignTypes } = + select( STORE_KEY ); + const campaignTypesState = getCampaignTypes< CampaignTypesState >(); + + return { + loading: ! hasFinishedResolution( 'getCampaignTypes' ), + data: campaignTypesState.data?.map( convert ), + error: campaignTypesState.error, + refetch, + }; + }, + [ refetch ] + ); }; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx index 130a4737196..3d3a0ce7c6a 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx @@ -39,9 +39,15 @@ type CreateCampaignModalProps = Omit< Modal.Props, 'title' | 'children' >; export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { const { className, ...restProps } = props; const [ collapsed, setCollapsed ] = useState( true ); - const { data: campaignTypes } = useCampaignTypes(); + const { data: campaignTypes, refetch: refetchCampaignTypes } = + useCampaignTypes(); + const { refetch: refetchRegisteredChannels } = useRegisteredChannels(); const { data: recommendedChannels } = useRecommendedChannels(); - const { refetch } = useRegisteredChannels(); + + const refetch = () => { + refetchCampaignTypes(); + refetchRegisteredChannels(); + }; return ( Date: Thu, 9 Mar 2023 09:51:45 -0500 Subject: [PATCH 0985/1680] Escape backquotes in syncpack pre-push message (#37143) --- bin/pre-push.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/pre-push.sh b/bin/pre-push.sh index 9651af08fda..bccdc2587e7 100755 --- a/bin/pre-push.sh +++ b/bin/pre-push.sh @@ -27,7 +27,7 @@ pnpm exec syncpack -- list-mismatches if [ $? -ne 0 ]; then echo "You must sync the dependencies listed above before you can push this branch." - echo "This can usually be accomplished automatically by updating the pinned version in `.syncpackrc` and then running \`pnpm run sync-dependencies\`." + echo "This can usually be accomplished automatically by updating the pinned version in \`.syncpackrc\` and then running \`pnpm run sync-dependencies\`." exit 1 fi From 644605378493bd649de8292292d9504ca9b6032a Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Thu, 9 Mar 2023 23:46:54 +0800 Subject: [PATCH 0986/1680] Load campaign types in overview and refetch after installeing a channel. --- .../Campaigns/Campaigns.tsx | 14 ++---------- .../MarketingOverviewMultichannel.tsx | 22 ++++++++++++++----- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx index 4432e5108f7..367500c12a9 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx @@ -25,7 +25,6 @@ import { * Internal dependencies */ import { CardHeaderTitle } from '~/marketing/components'; -import { useCampaignTypes } from '~/marketing/hooks'; import { useCampaigns } from './useCampaigns'; import { CreateNewCampaignModal } from './CreateNewCampaignModal'; import './Campaigns.scss'; @@ -53,24 +52,15 @@ const perPage = 5; * If there are no campaigns, there will be no table but an info message instead. * * If there is an error, there will be no table but an error message instead. - * - * The new campaign types data will also be loaded, - * so that when users click on the "Create new campaign" button in the card header, - * there will be no loading necessary in the modal. */ export const Campaigns = () => { const [ page, setPage ] = useState( 1 ); const [ isModalOpen, setModalOpen ] = useState( false ); - const { - loading: loadingCampaigns, - data, - meta, - } = useCampaigns( page, perPage ); - const { loading: loadingNewCampaignTypes } = useCampaignTypes(); + const { loading, data, meta } = useCampaigns( page, perPage ); const total = meta?.total; const getContent = () => { - if ( loadingNewCampaignTypes || loadingCampaigns ) { + if ( loading ) { return ( { + const { + loading: loadingCampaignTypes, + data: dataCampaignTypes, + refetch: refetchCampaignTypes, + } = useCampaignTypes(); const { loading: loadingRegistered, data: dataRegistered, - refetch, + refetch: refetchRegisteredChannels, } = useRegisteredChannels(); const { loading: loadingRecommended, data: dataRecommended } = useRecommendedChannels(); const { currentUserCan } = useUser(); - const shouldShowExtensions = - getAdminSetting( 'allowMarketplaceSuggestions', false ) && - currentUserCan( 'install_plugins' ); - if ( + ( loadingCampaignTypes && ! dataCampaignTypes ) || ( loadingRegistered && ! dataRegistered ) || ( loadingRecommended && ! dataRecommended ) ) { return ; } + const shouldShowExtensions = + getAdminSetting( 'allowMarketplaceSuggestions', false ) && + currentUserCan( 'install_plugins' ); + + const refetch = () => { + refetchCampaignTypes(); + refetchRegisteredChannels(); + }; + return (
    { dataRegistered?.length && } From 46b813723d05e276f351a7d304b755587d585d56 Mon Sep 17 00:00:00 2001 From: Seghir Nadir Date: Thu, 9 Mar 2023 19:06:02 +0300 Subject: [PATCH 0987/1680] Turn WC_Order::get_tax_location public (#36953) * Make WC_Order::get_tax_location public * Reverted access modifier change for get_tax_location() and implemented public wrapper get_taxable_location()for it. --------- Co-authored-by: Paulo Arromba <17236129+wavvves@users.noreply.github.com> --- .../changelog/add-turn-get-tax-location-public | 4 ++++ .../includes/abstracts/abstract-wc-order.php | 11 +++++++++++ 2 files changed, 15 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-turn-get-tax-location-public diff --git a/plugins/woocommerce/changelog/add-turn-get-tax-location-public b/plugins/woocommerce/changelog/add-turn-get-tax-location-public new file mode 100644 index 00000000000..c15b487c25d --- /dev/null +++ b/plugins/woocommerce/changelog/add-turn-get-tax-location-public @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Make WC_Order::get_tax_location accessible publicly through a wrapper function. diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php index 954262e27a5..ae3bbb8a5f1 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php @@ -1670,6 +1670,17 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order { return apply_filters( 'woocommerce_order_get_tax_location', $args, $this ); } + /** + * Public wrapper for exposing get_tax_location() method, enabling 3rd parties to get the tax location for an order. + * + * @since 7.6.0 + * @param array $args array Override the location. + * @return array + */ + public function get_taxable_location( $args = array() ) { + return $this->get_tax_location( $args ); + } + /** * Get tax rates for an order. Use order's shipping or billing address, defaults to base location. * From e4da8cba0976ea83eafd86c7033b5bf2c2d406cd Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Fri, 10 Mar 2023 02:13:05 +0800 Subject: [PATCH 0988/1680] Display info message when there are no campaign types. --- .../CreateNewCampaignModal/CreateNewCampaignModal.tsx | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx index 3d3a0ce7c6a..2af7f9e6abb 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx @@ -60,10 +60,12 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { >
    - { __( - 'Where would you like to promote your products?', - 'woocommerce' - ) } + { !! campaignTypes?.length + ? __( + 'Where would you like to promote your products?', + 'woocommerce' + ) + : __( 'No campaign types found.', 'woocommerce' ) }
    { campaignTypes?.map( ( el ) => ( From 0a58ec19f8461476a7308de64952c5716bb34d57 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Fri, 10 Mar 2023 02:14:35 +0800 Subject: [PATCH 0989/1680] Remove unneeded div in CreateNewCampaignModal. --- .../CreateNewCampaignModal.tsx | 98 +++++++++---------- 1 file changed, 48 insertions(+), 50 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx index 2af7f9e6abb..3d67dd541cb 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx @@ -67,59 +67,57 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { ) : __( 'No campaign types found.', 'woocommerce' ) }
    -
    - { campaignTypes?.map( ( el ) => ( - - - { - - - - - { el.name } + { campaignTypes?.map( ( el ) => ( + + + { + + + + + { el.name } + + + { el.description } + + + + + - - - ) ) } -
    + ) } + + + + + ) ) }
    { !! recommendedChannels?.length && (
    From 2896a8cd13a3aa2c7d2be2b31064607ee2d5ae8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Thu, 9 Mar 2023 15:33:39 -0300 Subject: [PATCH 0990/1680] Add the new feature to enable the new product editor blocks experience (#37137) * Add the new feature to enable the new product editor blocks experience * Add the type definition of the feature flag * Add the feature to the beta_featues in Features.php file * Keep the page routes when the feature is anabled * Add the feature php class to manage page assets * Add changelog file --- .../client/layout/controller.js | 40 +++++----- .../client/typings/global.d.ts | 1 + plugins/woocommerce/changelog/add-37128 | 4 + .../woocommerce/client/admin/config/core.json | 1 + .../client/admin/config/development.json | 1 + .../includes/admin/class-wc-admin-assets.php | 2 +- .../includes/admin/class-wc-admin-menus.php | 2 +- .../Features/BlockEditorFeatureEnabled.php | 73 +++++++++++++++++++ .../src/Admin/Features/Features.php | 1 + 9 files changed, 104 insertions(+), 21 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-37128 create mode 100644 plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php diff --git a/plugins/woocommerce-admin/client/layout/controller.js b/plugins/woocommerce-admin/client/layout/controller.js index 00bf1b564d5..023b9af24c5 100644 --- a/plugins/woocommerce-admin/client/layout/controller.js +++ b/plugins/woocommerce-admin/client/layout/controller.js @@ -174,7 +174,7 @@ export const getPages = () => { } ); } - if ( window.wcAdminFeatures[ 'new-product-management-experience' ] ) { + if ( window.wcAdminFeatures[ 'block-editor-feature-enabled' ] ) { pages.push( { container: ProductPage, path: '/add-product', @@ -189,20 +189,6 @@ export const getPages = () => { capability: 'manage_woocommerce', } ); - pages.push( { - container: AddProductPage, - path: '/add-product-old', - breadcrumbs: [ - [ '/add-product-old', __( 'Product', 'woocommerce' ) ], - __( 'Add New Product', 'woocommerce' ), - ], - navArgs: { - id: 'woocommerce-add-product-old', - }, - wpOpenMenu: 'menu-posts-product', - capability: 'manage_woocommerce', - } ); - pages.push( { container: ProductPage, path: '/product/:productId', @@ -216,16 +202,32 @@ export const getPages = () => { wpOpenMenu: 'menu-posts-product', capability: 'manage_woocommerce', } ); + } else if ( + window.wcAdminFeatures[ 'new-product-management-experience' ] + ) { + pages.push( { + container: AddProductPage, + path: '/add-product', + breadcrumbs: [ + [ '/add-product', __( 'Product', 'woocommerce' ) ], + __( 'Add New Product', 'woocommerce' ), + ], + navArgs: { + id: 'woocommerce-add-product', + }, + wpOpenMenu: 'menu-posts-product', + capability: 'manage_woocommerce', + } ); pages.push( { container: EditProductPage, - path: '/product-old/:productId', + path: '/product/:productId', breadcrumbs: [ - [ '/edit-product-old', __( 'Product', 'woocommerce' ) ], - __( 'Edit Product (Old)', 'woocommerce' ), + [ '/edit-product', __( 'Product', 'woocommerce' ) ], + __( 'Edit Product', 'woocommerce' ), ], navArgs: { - id: 'woocommerce-edit-product-old', + id: 'woocommerce-edit-product', }, wpOpenMenu: 'menu-posts-product', capability: 'manage_woocommerce', diff --git a/plugins/woocommerce-admin/client/typings/global.d.ts b/plugins/woocommerce-admin/client/typings/global.d.ts index 64b53b08048..18d3d3c6d02 100644 --- a/plugins/woocommerce-admin/client/typings/global.d.ts +++ b/plugins/woocommerce-admin/client/typings/global.d.ts @@ -9,6 +9,7 @@ declare global { wcAdminFeatures: { 'activity-panels': boolean; analytics: boolean; + 'block-editor-feature-enabled': boolean; coupons: boolean; 'customer-effort-score-tracks': boolean; homescreen: boolean; diff --git a/plugins/woocommerce/changelog/add-37128 b/plugins/woocommerce/changelog/add-37128 new file mode 100644 index 00000000000..ad668d22778 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37128 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add new feature flag for the product edit blocks experience diff --git a/plugins/woocommerce/client/admin/config/core.json b/plugins/woocommerce/client/admin/config/core.json index f798a3ab4a9..48e6fe51ff5 100644 --- a/plugins/woocommerce/client/admin/config/core.json +++ b/plugins/woocommerce/client/admin/config/core.json @@ -2,6 +2,7 @@ "features": { "activity-panels": true, "analytics": true, + "block-editor-feature-enabled": false, "coupons": true, "customer-effort-score-tracks": true, "import-products-task": true, diff --git a/plugins/woocommerce/client/admin/config/development.json b/plugins/woocommerce/client/admin/config/development.json index 71a4f00d30c..39286384fb8 100644 --- a/plugins/woocommerce/client/admin/config/development.json +++ b/plugins/woocommerce/client/admin/config/development.json @@ -2,6 +2,7 @@ "features": { "activity-panels": true, "analytics": true, + "block-editor-feature-enabled": true, "coupons": true, "customer-effort-score-tracks": true, "import-products-task": true, diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index d1385cd38e0..02755717b0b 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -215,7 +215,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : 'gateway_toggle' => wp_create_nonce( 'woocommerce-toggle-payment-gateway-enabled' ), ), 'urls' => array( - 'add_product' => Features::is_enabled( 'new-product-management-experience' ) ? esc_url_raw( admin_url( 'admin.php?page=wc-admin&path=/add-product' ) ) : null, + 'add_product' => Features::is_enabled( 'new-product-management-experience' ) || Features::is_enabled( 'block-editor-feature-enabled' ) ? esc_url_raw( admin_url( 'admin.php?page=wc-admin&path=/add-product' ) ) : null, 'import_products' => current_user_can( 'import' ) ? esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_importer' ) ) : null, 'export_products' => current_user_can( 'export' ) ? esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_exporter' ) ) : null, ), diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php index bb14310e195..ce36ee7a291 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php @@ -424,7 +424,7 @@ class WC_Admin_Menus { * Maybe add new management product experience. */ public function maybe_add_new_product_management_experience() { - if ( Features::is_enabled( 'new-product-management-experience' ) ) { + if ( Features::is_enabled( 'new-product-management-experience' ) || Features::is_enabled( 'block-editor-feature-enabled' ) ) { global $submenu; if ( isset( $submenu['edit.php?post_type=product'][10] ) ) { // Disable phpcs since we need to override submenu classes. diff --git a/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php b/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php new file mode 100644 index 00000000000..2ac8069661a --- /dev/null +++ b/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php @@ -0,0 +1,73 @@ +get_type() === 'simple' ) { + return admin_url( 'admin.php?page=wc-admin&path=/product/' . $product->get_id() ); + } + + return $link; + } + +} diff --git a/plugins/woocommerce/src/Admin/Features/Features.php b/plugins/woocommerce/src/Admin/Features/Features.php index 3a9584eeac5..cca803dbca9 100644 --- a/plugins/woocommerce/src/Admin/Features/Features.php +++ b/plugins/woocommerce/src/Admin/Features/Features.php @@ -42,6 +42,7 @@ class Features { 'multichannel-marketing', 'navigation', 'new-product-management-experience', + 'block-editor-feature-enabled', 'settings', ); From 9776cad2b7dea11d11bd0478926e8f29b1450624 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Thu, 9 Mar 2023 16:49:43 -0300 Subject: [PATCH 0991/1680] Render 'safe_text' settings as 'text' inputs. --- plugins/woocommerce/changelog/fix-34391 | 4 ++++ .../abstracts/abstract-wc-settings-api.php | 14 ++++++++++++++ 2 files changed, 18 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-34391 diff --git a/plugins/woocommerce/changelog/fix-34391 b/plugins/woocommerce/changelog/fix-34391 new file mode 100644 index 00000000000..afbb07ece83 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-34391 @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Make sure 'safe_text' settings are rendered as 'text' inputs for compatibility. diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-settings-api.php b/plugins/woocommerce/includes/abstracts/abstract-wc-settings-api.php index 6d330cfe172..6325594333c 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-settings-api.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-settings-api.php @@ -458,6 +458,20 @@ abstract class WC_Settings_API { return ob_get_clean(); } + /** + * Generates HTML for the 'safe_text' input type (mostly used for gateway-related settings). + * + * @param string $key Field key. + * @param array $data Field data. + * @return string + * + * @since 7.6.0 + */ + public function generate_safe_text_html( $key, $data ) { + $data['type'] = 'text'; + return $this->generate_text_html( $key, $data ); + } + /** * Generate Price Input HTML. * From 970c1ef35237128b1807207bf327605902192c29 Mon Sep 17 00:00:00 2001 From: Joel Thiessen <444632+joelclimbsthings@users.noreply.github.com> Date: Thu, 9 Mar 2023 13:11:25 -0800 Subject: [PATCH 0992/1680] Hydrating product entity when creating or editing product with block editor (#37064) --- .../client/products/product-page.tsx | 66 +++++++++++++++++-- .../changelog/add-initial-product-draft-37003 | 4 ++ .../includes/class-wc-post-types.php | 9 +++ 3 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-initial-product-draft-37003 diff --git a/plugins/woocommerce-admin/client/products/product-page.tsx b/plugins/woocommerce-admin/client/products/product-page.tsx index 5192320d8aa..ce20414283e 100644 --- a/plugins/woocommerce-admin/client/products/product-page.tsx +++ b/plugins/woocommerce-admin/client/products/product-page.tsx @@ -1,19 +1,73 @@ /** * External dependencies */ -import { __experimentalEditor as Editor } from '@woocommerce/product-editor'; +import { + __experimentalEditor as Editor, + AUTO_DRAFT_NAME, +} from '@woocommerce/product-editor'; import { Product } from '@woocommerce/data'; +import { useDispatch, useSelect, select as WPSelect } from '@wordpress/data'; +import { useEffect, useState } from '@wordpress/element'; +import { Spinner } from '@wordpress/components'; +import { useParams } from 'react-router-dom'; /** * Internal dependencies */ import './product-page.scss'; -const dummyProduct = { - name: 'Example product', - short_description: 'Short product description content', -} as Product; +const ProductEditor: React.FC< { product: Product | undefined } > = ( { + product, +} ) => { + if ( ! product ) { + return ; + } + + return ; +}; + +const EditProductEditor: React.FC< { productId: string } > = ( { + productId, +} ) => { + const { product } = useSelect( ( select: typeof WPSelect ) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore Missing types. + const { getEditedEntityRecord } = select( 'core' ); + + return { + product: getEditedEntityRecord( 'postType', 'product', productId ), + }; + } ); + + return ; +}; + +const AddProductEditor = () => { + const { saveEntityRecord } = useDispatch( 'core' ); + const [ product, setProduct ] = useState< Product | undefined >( + undefined + ); + + useEffect( () => { + saveEntityRecord( 'postType', 'product', { + title: AUTO_DRAFT_NAME, + status: 'auto-draft', + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore Incorrect types. + } ).then( ( autoDraftProduct: Product ) => { + setProduct( autoDraftProduct ); + } ); + }, [] ); + + return ; +}; export default function ProductPage() { - return ; + const { productId } = useParams(); + + if ( productId ) { + return ; + } + + return ; } diff --git a/plugins/woocommerce/changelog/add-initial-product-draft-37003 b/plugins/woocommerce/changelog/add-initial-product-draft-37003 new file mode 100644 index 00000000000..5ac217f5914 --- /dev/null +++ b/plugins/woocommerce/changelog/add-initial-product-draft-37003 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Creating product entity in auto-draft status, and adding support for retrieving preexisting products. diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 478f2752636..7f536200a64 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -625,6 +625,15 @@ class WC_Post_Types { /* translators: %s: number of orders */ 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)', 'woocommerce' ), ), + 'auto-draft' => array( + 'label' => _x( 'Auto Draft', 'Order status', 'woocommerce' ), + 'public' => false, + 'exclude_from_search' => false, + 'show_in_admin_all_list' => true, + 'show_in_admin_status_list' => true, + /* translators: %s: number of orders */ + 'label_count' => _n_noop( 'Auto draft (%s)', 'Auto draft (%s)', 'woocommerce' ), + ), ) ); From 4ebd35b41d4dc981b1790a0d660a397a92d808ce Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Thu, 9 Mar 2023 17:10:33 -0600 Subject: [PATCH 0993/1680] Update automation bypass to work correctly, consider actions bot. (#37045) --- .../workflows/pr-build-and-e2e-tests-skip.yml | 12 ---- .github/workflows/pr-build-and-e2e-tests.yml | 1 + .../workflows/pr-build-live-branch-skip.yml | 12 ---- .github/workflows/pr-build-live-branch.yml | 2 +- .github/workflows/pr-code-coverage-skip.yml | 12 ---- .github/workflows/pr-code-coverage.yml | 1 + .github/workflows/pr-code-sniff-skip.yml | 12 ---- .github/workflows/pr-code-sniff.yml | 1 + .../workflows/pr-highlight-changes-skip.yml | 12 ---- .github/workflows/pr-highlight-changes.yml | 1 + .github/workflows/pr-lint-monorepo.yml | 1 + .github/workflows/pr-lint-test-js.yml | 1 + .github/workflows/pr-lint-test-skip.yml | 12 ---- .github/workflows/pr-smoke-test-skip.yml | 12 ---- .github/workflows/pr-unit-tests-skip.yml | 12 ---- .github/workflows/pr-unit-tests.yml | 1 + .../status-check-bypass-automation.yml | 61 +++++++++++++++++++ .../status-check-bypass-changelog-only.yml | 56 +++++++++++++++++ 18 files changed, 125 insertions(+), 97 deletions(-) delete mode 100644 .github/workflows/pr-build-and-e2e-tests-skip.yml delete mode 100644 .github/workflows/pr-build-live-branch-skip.yml delete mode 100644 .github/workflows/pr-code-coverage-skip.yml delete mode 100644 .github/workflows/pr-code-sniff-skip.yml delete mode 100644 .github/workflows/pr-highlight-changes-skip.yml delete mode 100644 .github/workflows/pr-lint-test-skip.yml delete mode 100644 .github/workflows/pr-smoke-test-skip.yml delete mode 100644 .github/workflows/pr-unit-tests-skip.yml create mode 100644 .github/workflows/status-check-bypass-automation.yml create mode 100644 .github/workflows/status-check-bypass-changelog-only.yml diff --git a/.github/workflows/pr-build-and-e2e-tests-skip.yml b/.github/workflows/pr-build-and-e2e-tests-skip.yml deleted file mode 100644 index 2bddb65e0dd..00000000000 --- a/.github/workflows/pr-build-and-e2e-tests-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Run tests against PR -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-build-and-e2e-tests.yml b/.github/workflows/pr-build-and-e2e-tests.yml index 085ff943031..ed1eec649de 100644 --- a/.github/workflows/pr-build-and-e2e-tests.yml +++ b/.github/workflows/pr-build-and-e2e-tests.yml @@ -13,6 +13,7 @@ permissions: {} jobs: e2e-tests-run: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: Runs E2E tests. runs-on: ubuntu-20.04 permissions: diff --git a/.github/workflows/pr-build-live-branch-skip.yml b/.github/workflows/pr-build-live-branch-skip.yml deleted file mode 100644 index 5d7358217e5..00000000000 --- a/.github/workflows/pr-build-live-branch-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Build Live Branch -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-build-live-branch.yml b/.github/workflows/pr-build-live-branch.yml index 838796d5351..220c7ce3b75 100644 --- a/.github/workflows/pr-build-live-branch.yml +++ b/.github/workflows/pr-build-live-branch.yml @@ -13,7 +13,7 @@ permissions: {} jobs: build: - if: github.repository_owner == 'woocommerce' + if: github.repository_owner == 'woocommerce' && github.event.pull_request.user.login != 'github-actions[bot]' runs-on: ubuntu-20.04 permissions: contents: read diff --git a/.github/workflows/pr-code-coverage-skip.yml b/.github/workflows/pr-code-coverage-skip.yml deleted file mode 100644 index b181d912077..00000000000 --- a/.github/workflows/pr-code-coverage-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Run code coverage on PR -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-code-coverage.yml b/.github/workflows/pr-code-coverage.yml index 826b070898d..3df9ef1d464 100644 --- a/.github/workflows/pr-code-coverage.yml +++ b/.github/workflows/pr-code-coverage.yml @@ -15,6 +15,7 @@ permissions: {} jobs: test: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: Code coverage (PHP 7.4, WP Latest) timeout-minutes: 30 runs-on: ubuntu-20.04 diff --git a/.github/workflows/pr-code-sniff-skip.yml b/.github/workflows/pr-code-sniff-skip.yml deleted file mode 100644 index b181d912077..00000000000 --- a/.github/workflows/pr-code-sniff-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Run code coverage on PR -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-code-sniff.yml b/.github/workflows/pr-code-sniff.yml index 7578e652db6..6026b2cd18e 100644 --- a/.github/workflows/pr-code-sniff.yml +++ b/.github/workflows/pr-code-sniff.yml @@ -16,6 +16,7 @@ permissions: {} jobs: test: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: Code sniff (PHP 7.4, WP Latest) timeout-minutes: 15 runs-on: ubuntu-20.04 diff --git a/.github/workflows/pr-highlight-changes-skip.yml b/.github/workflows/pr-highlight-changes-skip.yml deleted file mode 100644 index b30e97fb9d2..00000000000 --- a/.github/workflows/pr-highlight-changes-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Highlight templates changes -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-highlight-changes.yml b/.github/workflows/pr-highlight-changes.yml index b856e966768..069f1bbbe8c 100644 --- a/.github/workflows/pr-highlight-changes.yml +++ b/.github/workflows/pr-highlight-changes.yml @@ -8,6 +8,7 @@ permissions: {} jobs: analyze: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: Check pull request changes to highlight runs-on: ubuntu-20.04 permissions: diff --git a/.github/workflows/pr-lint-monorepo.yml b/.github/workflows/pr-lint-monorepo.yml index 684e8ca1ebd..b456ecb82ea 100644 --- a/.github/workflows/pr-lint-monorepo.yml +++ b/.github/workflows/pr-lint-monorepo.yml @@ -11,6 +11,7 @@ permissions: {} jobs: changelogger_used: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: Changelogger use runs-on: ubuntu-20.04 permissions: diff --git a/.github/workflows/pr-lint-test-js.yml b/.github/workflows/pr-lint-test-js.yml index 972367f0abd..9cbfcbd3659 100644 --- a/.github/workflows/pr-lint-test-js.yml +++ b/.github/workflows/pr-lint-test-js.yml @@ -12,6 +12,7 @@ permissions: {} jobs: lint-test-js: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: Lint and Test JS runs-on: ubuntu-20.04 permissions: diff --git a/.github/workflows/pr-lint-test-skip.yml b/.github/workflows/pr-lint-test-skip.yml deleted file mode 100644 index 14929964ae1..00000000000 --- a/.github/workflows/pr-lint-test-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Run smoke tests against pull request. -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-smoke-test-skip.yml b/.github/workflows/pr-smoke-test-skip.yml deleted file mode 100644 index 586208c4b77..00000000000 --- a/.github/workflows/pr-smoke-test-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Lint and tests for JS packages and woocommerce-admin/client -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-unit-tests-skip.yml b/.github/workflows/pr-unit-tests-skip.yml deleted file mode 100644 index d91241ce164..00000000000 --- a/.github/workflows/pr-unit-tests-skip.yml +++ /dev/null @@ -1,12 +0,0 @@ -# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks -name: Run unit tests on PR -on: - pull_request: - paths: - - '!**' - - '**/changelog/**' -jobs: - build: - runs-on: ubuntu-latest - steps: - - run: 'echo "No build required"' diff --git a/.github/workflows/pr-unit-tests.yml b/.github/workflows/pr-unit-tests.yml index 18da726ee35..e328e50edcf 100644 --- a/.github/workflows/pr-unit-tests.yml +++ b/.github/workflows/pr-unit-tests.yml @@ -14,6 +14,7 @@ permissions: {} jobs: test: + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.user.login != 'github-actions[bot]' }} name: PHP ${{ matrix.php }} WP ${{ matrix.wp }} timeout-minutes: 30 runs-on: ubuntu-20.04 diff --git a/.github/workflows/status-check-bypass-automation.yml b/.github/workflows/status-check-bypass-automation.yml new file mode 100644 index 00000000000..8eca25116a9 --- /dev/null +++ b/.github/workflows/status-check-bypass-automation.yml @@ -0,0 +1,61 @@ +# Duplicate workflow that returns success for this check when the author is "github-actions". See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks +name: Status Check Bypass for Automation +on: + pull_request: + +jobs: + bypass-lint: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Lint and Test JS" + steps: + - run: 'echo "No build required"' + bypass-7-4-latest: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "PHP 7.4 WP latest" + steps: + - run: 'echo "No build required"' + bypass-8-0-latest: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "PHP 8.0 WP latest" + steps: + - run: 'echo "No build required"' + bypass-api-tests: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Runs API tests." + steps: + - run: 'echo "No build required"' + bypass-k6: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Runs k6 Performance tests" + steps: + - run: 'echo "No build required"' + bypass-sniff: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Code sniff (PHP 7.4, WP Latest)" + steps: + - run: 'echo "No build required"' + bypass-changelogger-use: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Changelogger use" + steps: + - run: 'echo "No build required"' + bypass-e2e: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Runs E2E tests." + steps: + - run: 'echo "No build required"' + bypass-pr-highlight: + if: ${{ github.event.pull_request.user.login == 'github-actions[bot]' }} + runs-on: ubuntu-latest + name: "Check pull request changes to highlight" + steps: + - run: 'echo "No build required"' + diff --git a/.github/workflows/status-check-bypass-changelog-only.yml b/.github/workflows/status-check-bypass-changelog-only.yml new file mode 100644 index 00000000000..a717ab5e1af --- /dev/null +++ b/.github/workflows/status-check-bypass-changelog-only.yml @@ -0,0 +1,56 @@ +# Duplicate workflow that returns success for this check when there is no relevant file change. See https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#handling-skipped-but-required-checks + +name: Status Check Bypass for Changelog Only Changes +on: + pull_request: + paths: + - '!**' + - '**/changelog/**' + +jobs: + bypass-lint: + runs-on: ubuntu-latest + name: "Lint and Test JS" + steps: + - run: 'echo "No build required"' + bypass-7-4-latest: + runs-on: ubuntu-latest + name: "PHP 7.4 WP latest" + steps: + - run: 'echo "No build required"' + bypass-8-0-latest: + runs-on: ubuntu-latest + name: "PHP 8.0 WP latest" + steps: + - run: 'echo "No build required"' + bypass-api-tests: + runs-on: ubuntu-latest + name: "Runs API tests." + steps: + - run: 'echo "No build required"' + bypass-k6: + runs-on: ubuntu-latest + name: "Runs k6 Performance tests" + steps: + - run: 'echo "No build required"' + bypass-sniff: + runs-on: ubuntu-latest + name: "Code sniff (PHP 7.4, WP Latest)" + steps: + - run: 'echo "No build required"' + bypass-changelogger-use: + runs-on: ubuntu-latest + name: "Changelogger use" + steps: + - run: 'echo "No build required"' + bypass-e2e: + runs-on: ubuntu-latest + name: "Runs E2E tests." + steps: + - run: 'echo "No build required"' + bypass-pr-highlight: + runs-on: ubuntu-latest + name: "Check pull request changes to highlight" + steps: + - run: 'echo "No build required"' + From 4f5a3d7e77595890c95e94ca12df48e2c4d0e6a4 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Thu, 9 Mar 2023 22:45:54 -0500 Subject: [PATCH 0994/1680] Show link to store settings when stock management is disabled (#37140) * Update stock management enabled checkbox label * Add link to store settings when stock management is disabled * Refactor to create woocommerce_wp_note function --- .../changelog/update-manage-stock-disabled | 4 ++++ .../views/html-product-data-inventory.php | 18 ++++++++++++++++- .../includes/admin/wc-meta-box-functions.php | 20 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/update-manage-stock-disabled diff --git a/plugins/woocommerce/changelog/update-manage-stock-disabled b/plugins/woocommerce/changelog/update-manage-stock-disabled new file mode 100644 index 00000000000..54bbac5922e --- /dev/null +++ b/plugins/woocommerce/changelog/update-manage-stock-disabled @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Show link to store settings when stock management is disabled. diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php index 72f6d5804fa..7dc64ad29f1 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -35,7 +35,7 @@ if ( ! defined( 'ABSPATH' ) ) { 'value' => $product_object->get_manage_stock( 'edit' ) ? 'yes' : 'no', 'wrapper_class' => 'show_if_simple show_if_variable', 'label' => __( 'Stock management', 'woocommerce' ), - 'description' => __( 'Manage stock level (quantity)', 'woocommerce' ), + 'description' => __( 'Track stock quantity for this product', 'woocommerce' ), ) ); @@ -93,6 +93,22 @@ if ( ! defined( 'ABSPATH' ) ) { do_action( 'woocommerce_product_options_stock_fields' ); echo '
    '; + } else { + + woocommerce_wp_note( + array( + 'id' => '_manage_stock_disabled', + 'label' => __( 'Stock management', 'woocommerce' ), + 'label-aria-label' => __( 'Stock management disabled in store settings', 'woocommerce' ), + 'message' => sprintf( + /* translators: %s: url for store settings */ + __( 'Disabled in
    store settings.', 'woocommerce' ), + esc_url( 'admin.php?page=wc-settings&tab=products§ion=inventory' ) + ), + 'wrapper_class' => 'show_if_simple show_if_variable', + ) + ); + } woocommerce_wp_select( diff --git a/plugins/woocommerce/includes/admin/wc-meta-box-functions.php b/plugins/woocommerce/includes/admin/wc-meta-box-functions.php index 2551079f2f4..2fc3d07b363 100644 --- a/plugins/woocommerce/includes/admin/wc-meta-box-functions.php +++ b/plugins/woocommerce/includes/admin/wc-meta-box-functions.php @@ -285,3 +285,23 @@ function woocommerce_wp_radio( $field, WC_Data $data = null ) { echo ''; } + +/** + * Output a note. + * + * @param array $field Field data. + */ +function woocommerce_wp_note( $field ) { + $field['wrapper_class'] = isset( $field['wrapper_class'] ) ? $field['wrapper_class'] : ''; + + echo '

    '; + echo ''; + echo '' . wp_kses_post( $field['message'] ) . ''; + echo '

    '; +} From 65e1d170ba421748ab5d7dd60fb760e62122d510 Mon Sep 17 00:00:00 2001 From: Atanas Penchev Date: Fri, 10 Mar 2023 13:16:18 +0200 Subject: [PATCH 0995/1680] Handle multiple slider containers --- .../legacy/js/flexslider/jquery.flexslider.js | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js b/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js index e907b50aa35..a175fdfa61b 100755 --- a/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js +++ b/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js @@ -704,16 +704,19 @@ }, slider.vars.animationSpeed + 100); } else { - var keyframes = {}; - keyframes[slider.prop] = [ - slider.container.css(slider.prop), - slider.args[slider.prop] - ]; + slider.container.each(function() { + var container = this; + var keyframes = {}; + keyframes[slider.prop] = [ + window.getComputedStyle(container)[slider.prop], + slider.args[slider.prop] + ]; - slider.container[0].animate(keyframes, { duration: slider.vars.animationSpeed, easing: easing }).onfinish = function() { - slider.container.css(slider.args); - slider.wrapup(dimension); - }; + container.animate(keyframes, { duration: slider.vars.animationSpeed, easing: easing }).onfinish = function() { + container.style[slider.prop] = slider.args[slider.prop]; + slider.wrapup(dimension); + }; + }); } } else { // FADE: if (!touch) { From af24637439a868022514a1548a1d3eaa5d2b8bb5 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Fri, 10 Mar 2023 09:58:02 -0500 Subject: [PATCH 0996/1680] Create @woocommerce/admin-layout package (#37094) * Initial admin-layout package skeleton * Changelog files * Use createOrderedChildren and sortFillsByOrder from @woocommerce/components for WooFooterItem * Move WooFooterItem to @woocommerce/admin-layout * Use WooFooterItem from @woocommerce/admin-layout * Suppress errant TS lint errors * Exports for @woocommerce/admin-layout * Fill updates and eslint suppression * Changelogs * Remove suppression of tslint errors * Fix react and @types/react versions * Load @woocommerce/admin-layout script and styles * Move WooHeaderItem, WooHeaderNavigationItem, and WooHeaderPageTitle to @woocommerce/admin-layout * Regenerate lock file post-rebase * Remove duplicate import post-rebase * Add wc-admin-layout to app style dependency * Fix jest mock of @woocommerce/admin-layout * Fix spacing. * Export slot names * Fix typo in .npmrc * Update lock file * Try updating lock file * Update lock file * Update lock file * Update to latest lock file from trunk * Update lock file * Sync dependencies of @woocommerce/admin-layout * Manually sync @wordpress dependencies --- packages/js/admin-layout/.npmrc | 1 + packages/js/admin-layout/README.md | 11 + packages/js/admin-layout/changelog.md | 3 + .../changelog/add-admin-layout-package | 4 + packages/js/admin-layout/composer.json | 32 + packages/js/admin-layout/composer.lock | 483 ++++ packages/js/admin-layout/package.json | 72 + packages/js/admin-layout/src/index.ts | 1 + packages/js/admin-layout/src/plugins/index.ts | 10 + .../src/plugins/woo-footer-item/index.tsx | 17 +- .../src/plugins/woo-header-item/index.tsx | 51 + .../woo-header-navigation-item/index.tsx | 53 + .../plugins/woo-header-page-title/index.tsx | 41 + packages/js/admin-layout/src/style.scss | 0 packages/js/admin-layout/tsconfig-cjs.json | 6 + packages/js/admin-layout/tsconfig.json | 10 + packages/js/admin-layout/webpack.config.js | 18 + .../assets/packages.js | 1 + .../changelog/add-admin-layout-package | 4 + .../changelog/add-admin-layout-package | 4 + .../client/activity-panel/index.js | 2 +- .../product-mvp-ces-footer.tsx | 2 +- .../woocommerce-admin/client/header/index.js | 42 +- .../woocommerce-admin/client/header/utils.tsx | 113 - .../homescreen/header-banner-slot/utils.tsx | 9 +- .../client/layout/footer/footer.tsx | 2 +- .../client/layout/footer/index.ts | 1 - .../client/layout/navigation.js | 2 +- .../marketing/overview/section-slot/utils.tsx | 9 +- .../client/mobile-banner/index.js | 2 +- .../client/products/product-form-actions.tsx | 2 +- .../client/products/product-more-menu.tsx | 2 +- .../product-settings/product-settings.tsx | 2 +- .../test/product-settings.spec.tsx | 2 +- .../client/products/product-title.tsx | 2 +- .../product-variation-form-actions.tsx | 2 +- .../test/product-form-actions.spec.tsx | 2 +- .../task-lists/progress-header/utils.tsx | 10 +- .../task-lists/progress-title/utils.tsx | 10 +- .../woocommerce-admin/client/tasks/task.tsx | 5 +- .../two-column-tasks/footer-slot/utils.tsx | 11 +- .../task-list-completion-slot/utils.tsx | 9 +- plugins/woocommerce-admin/package.json | 3 +- plugins/woocommerce-admin/webpack.config.js | 1 + .../changelog/add-admin-layout-package | 4 + .../src/Internal/Admin/WCAdminAssets.php | 12 +- pnpm-lock.yaml | 2312 +++++++---------- 47 files changed, 1858 insertions(+), 1539 deletions(-) create mode 100644 packages/js/admin-layout/.npmrc create mode 100644 packages/js/admin-layout/README.md create mode 100644 packages/js/admin-layout/changelog.md create mode 100644 packages/js/admin-layout/changelog/add-admin-layout-package create mode 100644 packages/js/admin-layout/composer.json create mode 100644 packages/js/admin-layout/composer.lock create mode 100644 packages/js/admin-layout/package.json create mode 100644 packages/js/admin-layout/src/index.ts create mode 100644 packages/js/admin-layout/src/plugins/index.ts rename plugins/woocommerce-admin/client/layout/footer/utils.tsx => packages/js/admin-layout/src/plugins/woo-footer-item/index.tsx (79%) create mode 100644 packages/js/admin-layout/src/plugins/woo-header-item/index.tsx create mode 100644 packages/js/admin-layout/src/plugins/woo-header-navigation-item/index.tsx create mode 100644 packages/js/admin-layout/src/plugins/woo-header-page-title/index.tsx create mode 100644 packages/js/admin-layout/src/style.scss create mode 100644 packages/js/admin-layout/tsconfig-cjs.json create mode 100644 packages/js/admin-layout/tsconfig.json create mode 100644 packages/js/admin-layout/webpack.config.js create mode 100644 packages/js/dependency-extraction-webpack-plugin/changelog/add-admin-layout-package create mode 100644 packages/js/product-editor/changelog/add-admin-layout-package delete mode 100644 plugins/woocommerce-admin/client/header/utils.tsx create mode 100644 plugins/woocommerce/changelog/add-admin-layout-package diff --git a/packages/js/admin-layout/.npmrc b/packages/js/admin-layout/.npmrc new file mode 100644 index 00000000000..43c97e719a5 --- /dev/null +++ b/packages/js/admin-layout/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/packages/js/admin-layout/README.md b/packages/js/admin-layout/README.md new file mode 100644 index 00000000000..c5811c8dad5 --- /dev/null +++ b/packages/js/admin-layout/README.md @@ -0,0 +1,11 @@ +# Admin Layout + +A collection of WooCommerce Admin layout components and utilities. + +## Installation + +Install the module + +```bash +pnpm install @woocommerce/product-editor --save +``` diff --git a/packages/js/admin-layout/changelog.md b/packages/js/admin-layout/changelog.md new file mode 100644 index 00000000000..3783eb0da3d --- /dev/null +++ b/packages/js/admin-layout/changelog.md @@ -0,0 +1,3 @@ +# Changelog + +This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). diff --git a/packages/js/admin-layout/changelog/add-admin-layout-package b/packages/js/admin-layout/changelog/add-admin-layout-package new file mode 100644 index 00000000000..ab59deae0e8 --- /dev/null +++ b/packages/js/admin-layout/changelog/add-admin-layout-package @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Create @woocommerce/admin-layout package to house header, footer, and similar components and utilities. diff --git a/packages/js/admin-layout/composer.json b/packages/js/admin-layout/composer.json new file mode 100644 index 00000000000..d843453802e --- /dev/null +++ b/packages/js/admin-layout/composer.json @@ -0,0 +1,32 @@ +{ + "name": "woocommerce/admin-layout", + "description": "WooCommerce Admin layout component library", + "type": "library", + "license": "GPL-3.0-or-later", + "minimum-stability": "dev", + "require-dev": { + "automattic/jetpack-changelogger": "3.3.0" + }, + "config": { + "platform": { + "php": "7.2" + } + }, + "extra": { + "changelogger": { + "formatter": { + "filename": "../../../tools/changelogger/class-package-formatter.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": "CHANGELOG.md" + } + } +} diff --git a/packages/js/admin-layout/composer.lock b/packages/js/admin-layout/composer.lock new file mode 100644 index 00000000000..d9d96797c08 --- /dev/null +++ b/packages/js/admin-layout/composer.lock @@ -0,0 +1,483 @@ +{ + "_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": "5ce7bfd856ef579554b96ae2f7451072", + "packages": [], + "packages-dev": [ + { + "name": "automattic/jetpack-changelogger", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/Automattic/jetpack-changelogger.git", + "reference": "8f63c829b8d1b0d7b1d5de93510d78523ed18959" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Automattic/jetpack-changelogger/zipball/8f63c829b8d1b0d7b1d5de93510d78523ed18959", + "reference": "8f63c829b8d1b0d7b1d5de93510d78523ed18959", + "shasum": "" + }, + "require": { + "php": ">=5.6", + "symfony/console": "^3.4 || ^5.2 || ^6.0", + "symfony/process": "^3.4 || ^5.2 || ^6.0", + "wikimedia/at-ease": "^1.2 || ^2.0" + }, + "require-dev": { + "wikimedia/testing-access-wrapper": "^1.0 || ^2.0", + "yoast/phpunit-polyfills": "1.0.4" + }, + "bin": [ + "bin/changelogger" + ], + "type": "project", + "extra": { + "autotagger": true, + "branch-alias": { + "dev-trunk": "3.3.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\\Changelog\\": "lib", + "Automattic\\Jetpack\\Changelogger\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "description": "Jetpack Changelogger tool. Allows for managing changelogs by dropping change files into a changelog directory with each PR.", + "support": { + "source": "https://github.com/Automattic/jetpack-changelogger/tree/v3.3.0" + }, + "time": "2022-12-26T13:49:01+00:00" + }, + { + "name": "psr/log", + "version": "1.1.4", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/d49695b909c3b7628b6289db5479a1c204601f11", + "reference": "d49695b909c3b7628b6289db5479a1c204601f11", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "Psr/Log/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/1.1.4" + }, + "time": "2021-05-03T11:20:27+00:00" + }, + { + "name": "symfony/console", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "reference": "a10b1da6fc93080c180bba7219b5ff5b7518fe81", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8", + "symfony/debug": "~2.8|~3.0|~4.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/dependency-injection": "<3.4", + "symfony/process": "<3.3" + }, + "provide": { + "psr/log-implementation": "1.0" + }, + "require-dev": { + "psr/log": "~1.0", + "symfony/config": "~3.3|~4.0", + "symfony/dependency-injection": "~3.4|~4.0", + "symfony/event-dispatcher": "~2.8|~3.0|~4.0", + "symfony/lock": "~3.4|~4.0", + "symfony/process": "~3.3|~4.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Console Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/console/tree/3.4" + }, + "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": "4.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/debug.git", + "reference": "1a692492190773c5310bc7877cb590c04c2f05be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/debug/zipball/1a692492190773c5310bc7877cb590c04c2f05be", + "reference": "1a692492190773c5310bc7877cb590c04c2f05be", + "shasum": "" + }, + "require": { + "php": ">=7.1.3", + "psr/log": "^1|^2|^3" + }, + "conflict": { + "symfony/http-kernel": "<3.4" + }, + "require-dev": { + "symfony/http-kernel": "^3.4|^4.0|^5.0" + }, + "default-branch": true, + "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": "Provides tools to ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/debug/tree/v4.4.44" + }, + "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" + } + ], + "abandoned": "symfony/error-handler", + "time": "2022-07-28T16:29:46+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "f9c7affe77a00ae32ca127ca6833d034e6d33f25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/f9c7affe77a00ae32ca127ca6833d034e6d33f25", + "reference": "f9c7affe77a00ae32ca127ca6833d034e6d33f25", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "default-branch": true, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.28-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/main" + }, + "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": "2023-01-30T17:25:47+00:00" + }, + { + "name": "symfony/process", + "version": "3.4.x-dev", + "source": { + "type": "git", + "url": "https://github.com/symfony/process.git", + "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/process/zipball/b8648cf1d5af12a44a51d07ef9bf980921f15fca", + "reference": "b8648cf1d5af12a44a51d07ef9bf980921f15fca", + "shasum": "" + }, + "require": { + "php": "^5.5.9|>=7.0.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Process\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony Process Component", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/process/tree/3.4" + }, + "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": "wikimedia/at-ease", + "version": "v2.0.0", + "source": { + "type": "git", + "url": "https://github.com/wikimedia/at-ease.git", + "reference": "013ac61929797839c80a111a3f1a4710d8248e7a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/wikimedia/at-ease/zipball/013ac61929797839c80a111a3f1a4710d8248e7a", + "reference": "013ac61929797839c80a111a3f1a4710d8248e7a", + "shasum": "" + }, + "require": { + "php": ">=5.6.99" + }, + "require-dev": { + "jakub-onderka/php-console-highlighter": "0.3.2", + "jakub-onderka/php-parallel-lint": "1.0.0", + "mediawiki/mediawiki-codesniffer": "22.0.0", + "mediawiki/minus-x": "0.3.1", + "ockcyp/covers-validator": "0.5.1 || 0.6.1", + "phpunit/phpunit": "4.8.36 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/Wikimedia/Functions.php" + ], + "psr-4": { + "Wikimedia\\AtEase\\": "src/Wikimedia/AtEase/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "GPL-2.0-or-later" + ], + "authors": [ + { + "name": "Tim Starling", + "email": "tstarling@wikimedia.org" + }, + { + "name": "MediaWiki developers", + "email": "wikitech-l@lists.wikimedia.org" + } + ], + "description": "Safe replacement to @ for suppressing warnings.", + "homepage": "https://www.mediawiki.org/wiki/at-ease", + "support": { + "source": "https://github.com/wikimedia/at-ease/tree/master" + }, + "time": "2018-10-10T15:39:06+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "platform-overrides": { + "php": "7.2" + }, + "plugin-api-version": "2.3.0" +} diff --git a/packages/js/admin-layout/package.json b/packages/js/admin-layout/package.json new file mode 100644 index 00000000000..bd594825b36 --- /dev/null +++ b/packages/js/admin-layout/package.json @@ -0,0 +1,72 @@ +{ + "name": "@woocommerce/admin-layout", + "version": "1.0.0-beta.0", + "description": "WooCommerce admin layout copmonents and utilities.", + "author": "Automattic", + "license": "GPL-2.0-or-later", + "keywords": [ + "wordpress", + "woocommerce" + ], + "homepage": "https://github.com/woocommerce/woocommerce/tree/trunk/packages/js/admin-layout/README.md", + "repository": { + "type": "git", + "url": "https://github.com/woocommerce/woocommerce.git" + }, + "bugs": { + "url": "https://github.com/woocommerce/woocommerce/issues" + }, + "main": "build/index.js", + "module": "build-module/index.js", + "types": "build-types", + "react-native": "src/index", + "sideEffects": [ + "build-style/**", + "src/**/*.scss" + ], + "publishConfig": { + "access": "public" + }, + "scripts": { + "turbo:build": "pnpm run build:js && pnpm run build:css", + "prepare": "composer install", + "changelog": "composer exec -- changelogger", + "clean": "pnpm exec rimraf tsconfig.tsbuildinfo build build-*", + "build": "pnpm -w exec turbo run turbo:build --filter=$npm_package_name", + "lint": "eslint src", + "build:js": "tsc --build ./tsconfig.json ./tsconfig-cjs.json", + "build:css": "webpack", + "start": "concurrently \"tsc --build --watch\" \"webpack --watch\"", + "prepack": "pnpm run clean && pnpm run build", + "lint:fix": "eslint src --fix" + }, + "devDependencies": { + "@types/react": "^17.0.2", + "@types/wordpress__components": "^19.10.3", + "@woocommerce/eslint-plugin": "workspace:*", + "@woocommerce/internal-style-build": "workspace:*", + "@wordpress/browserslist-config": "wp-6.0", + "css-loader": "^3.6.0", + "eslint": "^8.32.0", + "jest": "^27.5.1", + "jest-cli": "^27.5.1", + "postcss-loader": "^4.3.0", + "react": "^17.0.2", + "react-dom": "^17.0.2", + "sass-loader": "^10.2.1", + "ts-jest": "^27.1.3", + "typescript": "^4.8.3", + "webpack": "^5.70.0", + "webpack-cli": "^3.3.12" + }, + "peerDependencies": { + "@types/react": "^17.0.2", + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "dependencies": { + "@woocommerce/components": "workspace:*", + "@wordpress/components": "wp-6.0", + "@wordpress/element": "wp-6.0" + } +} diff --git a/packages/js/admin-layout/src/index.ts b/packages/js/admin-layout/src/index.ts new file mode 100644 index 00000000000..460ab6b516e --- /dev/null +++ b/packages/js/admin-layout/src/index.ts @@ -0,0 +1 @@ +export * from './plugins'; diff --git a/packages/js/admin-layout/src/plugins/index.ts b/packages/js/admin-layout/src/plugins/index.ts new file mode 100644 index 00000000000..c6cd4096eae --- /dev/null +++ b/packages/js/admin-layout/src/plugins/index.ts @@ -0,0 +1,10 @@ +export { WC_FOOTER_SLOT_NAME, WooFooterItem } from './woo-footer-item'; +export { WC_HEADER_SLOT_NAME, WooHeaderItem } from './woo-header-item'; +export { + WC_HEADER_NAVIGATION_SLOT_NAME, + WooHeaderNavigationItem, +} from './woo-header-navigation-item'; +export { + WC_HEADER_PAGE_TITLE_SLOT_NAME, + WooHeaderPageTitle, +} from './woo-header-page-title'; diff --git a/plugins/woocommerce-admin/client/layout/footer/utils.tsx b/packages/js/admin-layout/src/plugins/woo-footer-item/index.tsx similarity index 79% rename from plugins/woocommerce-admin/client/layout/footer/utils.tsx rename to packages/js/admin-layout/src/plugins/woo-footer-item/index.tsx index 9c927785f94..9fe847ea5bf 100644 --- a/plugins/woocommerce-admin/client/layout/footer/utils.tsx +++ b/packages/js/admin-layout/src/plugins/woo-footer-item/index.tsx @@ -1,14 +1,16 @@ /** * External dependencies */ +import React from 'react'; import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '~/utils'; +import { createElement } from '@wordpress/element'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; export const WC_FOOTER_SLOT_NAME = 'woocommerce_footer_item'; + /** * Create a Fill for extensions to add items to the WooCommerce Admin footer. * @@ -27,7 +29,10 @@ export const WC_FOOTER_SLOT_NAME = 'woocommerce_footer_item'; * @param {Array} param0.children - Node children. * @param {Array} param0.order - Node order. */ -export const WooFooterItem: React.FC< { order?: number } > & { +export const WooFooterItem: React.FC< { + children?: React.ReactNode; + order?: number; +} > & { Slot: React.FC< Slot.Props >; } = ( { children, order = 1 } ) => { return ( diff --git a/packages/js/admin-layout/src/plugins/woo-header-item/index.tsx b/packages/js/admin-layout/src/plugins/woo-header-item/index.tsx new file mode 100644 index 00000000000..770c5d63c78 --- /dev/null +++ b/packages/js/admin-layout/src/plugins/woo-header-item/index.tsx @@ -0,0 +1,51 @@ +/** + * External dependencies + */ +import React from 'react'; +import { Slot, Fill } from '@wordpress/components'; +import { createElement } from '@wordpress/element'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; + +export const WC_HEADER_SLOT_NAME = 'woocommerce_header_item'; + +/** + * Create a Fill for extensions to add items to the WooCommerce Admin header. + * + * @slotFill WooHeaderItem + * @scope woocommerce-admin + * @example + * const MyHeaderItem = () => ( + * My header item + * ); + * + * registerPlugin( 'my-extension', { + * render: MyHeaderItem, + * scope: 'woocommerce-admin', + * } ); + * @param {Object} param0 + * @param {Array} param0.children - Node children. + * @param {Array} param0.order - Node order. + */ +export const WooHeaderItem: React.FC< { + children?: React.ReactNode; + order?: number; +} > & { + Slot: React.FC< Slot.Props >; +} = ( { children, order = 1 } ) => { + return ( + + { ( fillProps: Fill.Props ) => { + return createOrderedChildren( children, order, fillProps ); + } } + + ); +}; + +WooHeaderItem.Slot = ( { fillProps } ) => ( + + { sortFillsByOrder } + +); diff --git a/packages/js/admin-layout/src/plugins/woo-header-navigation-item/index.tsx b/packages/js/admin-layout/src/plugins/woo-header-navigation-item/index.tsx new file mode 100644 index 00000000000..08b4e0b15e4 --- /dev/null +++ b/packages/js/admin-layout/src/plugins/woo-header-navigation-item/index.tsx @@ -0,0 +1,53 @@ +/** + * External dependencies + */ +import React from 'react'; +import { Slot, Fill } from '@wordpress/components'; +import { createElement } from '@wordpress/element'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; + +export const WC_HEADER_NAVIGATION_SLOT_NAME = + 'woocommerce_header_navigation_item'; + +/** + * Create a Fill for extensions to add items to the WooCommerce Admin + * navigation area left of the page title. + * + * @slotFill WooHeaderNavigationItem + * @scope woocommerce-admin + * @example + * const MyNavigationItem = () => ( + * My nav item + * ); + * + * registerPlugin( 'my-extension', { + * render: MyNavigationItem, + * scope: 'woocommerce-admin', + * } ); + * @param {Object} param0 + * @param {Array} param0.children - Node children. + * @param {Array} param0.order - Node order. + */ +export const WooHeaderNavigationItem: React.FC< { + children?: React.ReactNode; + order?: number; +} > & { + Slot: React.FC< Slot.Props >; +} = ( { children, order = 1 } ) => { + return ( + + { ( fillProps: Fill.Props ) => { + return createOrderedChildren( children, order, fillProps ); + } } + + ); +}; + +WooHeaderNavigationItem.Slot = ( { fillProps }: Slot.Props ) => ( + + { sortFillsByOrder } + +); diff --git a/packages/js/admin-layout/src/plugins/woo-header-page-title/index.tsx b/packages/js/admin-layout/src/plugins/woo-header-page-title/index.tsx new file mode 100644 index 00000000000..8e0b8b307e5 --- /dev/null +++ b/packages/js/admin-layout/src/plugins/woo-header-page-title/index.tsx @@ -0,0 +1,41 @@ +/** + * External dependencies + */ +import React from 'react'; +import { Slot, Fill } from '@wordpress/components'; +import { createElement, Fragment } from '@wordpress/element'; + +export const WC_HEADER_PAGE_TITLE_SLOT_NAME = 'woocommerce_header_page_title'; + +/** + * Create a Fill for extensions to add custom page titles. + * + * @slotFill WooHeaderPageTitle + * @scope woocommerce-admin + * @example + * const MyPageTitle = () => ( + * My page title + * ); + * + * registerPlugin( 'my-page-title', { + * render: MyPageTitle, + * scope: 'woocommerce-admin', + * } ); + * @param {Object} param0 + * @param {Array} param0.children - Node children. + */ +export const WooHeaderPageTitle: React.FC< { + children?: React.ReactNode; +} > & { + Slot: React.FC< Slot.Props >; +} = ( { children } ) => { + return { children }; +}; + +WooHeaderPageTitle.Slot = ( { fillProps } ) => ( + + { ( fills ) => { + return <>{ [ ...fills ].pop() }; + } } + +); diff --git a/packages/js/admin-layout/src/style.scss b/packages/js/admin-layout/src/style.scss new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/js/admin-layout/tsconfig-cjs.json b/packages/js/admin-layout/tsconfig-cjs.json new file mode 100644 index 00000000000..035d2318baf --- /dev/null +++ b/packages/js/admin-layout/tsconfig-cjs.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig-cjs", + "compilerOptions": { + "outDir": "build" + } +} diff --git a/packages/js/admin-layout/tsconfig.json b/packages/js/admin-layout/tsconfig.json new file mode 100644 index 00000000000..ea9f201d401 --- /dev/null +++ b/packages/js/admin-layout/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig", + "compilerOptions": { + "rootDir": "src", + "outDir": "build-module", + "declaration": true, + "declarationMap": true, + "declarationDir": "./build-types" + } +} diff --git a/packages/js/admin-layout/webpack.config.js b/packages/js/admin-layout/webpack.config.js new file mode 100644 index 00000000000..46a04612713 --- /dev/null +++ b/packages/js/admin-layout/webpack.config.js @@ -0,0 +1,18 @@ +/** + * Internal dependencies + */ +const { webpackConfig } = require( '@woocommerce/internal-style-build' ); + +module.exports = { + mode: process.env.NODE_ENV || 'development', + entry: { + 'build-style': __dirname + '/src/style.scss', + }, + output: { + path: __dirname, + }, + module: { + rules: webpackConfig.rules, + }, + plugins: webpackConfig.plugins, +}; diff --git a/packages/js/dependency-extraction-webpack-plugin/assets/packages.js b/packages/js/dependency-extraction-webpack-plugin/assets/packages.js index 42df69e8535..d415dc66ba6 100644 --- a/packages/js/dependency-extraction-webpack-plugin/assets/packages.js +++ b/packages/js/dependency-extraction-webpack-plugin/assets/packages.js @@ -1,5 +1,6 @@ module.exports = [ // wc-admin packages + '@woocommerce/admin-layout', '@woocommerce/components', '@woocommerce/csv-export', '@woocommerce/currency', diff --git a/packages/js/dependency-extraction-webpack-plugin/changelog/add-admin-layout-package b/packages/js/dependency-extraction-webpack-plugin/changelog/add-admin-layout-package new file mode 100644 index 00000000000..816f57bb18d --- /dev/null +++ b/packages/js/dependency-extraction-webpack-plugin/changelog/add-admin-layout-package @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add @woocommerce/admin-layout package. diff --git a/packages/js/product-editor/changelog/add-admin-layout-package b/packages/js/product-editor/changelog/add-admin-layout-package new file mode 100644 index 00000000000..9752a9a665a --- /dev/null +++ b/packages/js/product-editor/changelog/add-admin-layout-package @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Suppress errant TS lint errors. diff --git a/plugins/woocommerce-admin/client/activity-panel/index.js b/plugins/woocommerce-admin/client/activity-panel/index.js index 6b5c9fec3df..74895f60ac6 100644 --- a/plugins/woocommerce-admin/client/activity-panel/index.js +++ b/plugins/woocommerce-admin/client/activity-panel/index.js @@ -2,12 +2,12 @@ * External dependencies */ import { registerPlugin } from '@wordpress/plugins'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; /** * Internal dependencies */ import ActivityPanel from './activity-panel'; -import { WooHeaderItem } from '~/header/utils'; const ActivityPanelHeaderItem = () => ( diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-ces-footer.tsx b/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-ces-footer.tsx index 8fea8c6b6f1..01046ab5522 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-ces-footer.tsx +++ b/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-ces-footer.tsx @@ -5,6 +5,7 @@ import { __ } from '@wordpress/i18n'; import { Button } from '@wordpress/components'; import { useDispatch, useSelect } from '@wordpress/data'; import { closeSmall } from '@wordpress/icons'; +import { WooFooterItem } from '@woocommerce/admin-layout'; import { Pill } from '@woocommerce/components'; import { OPTIONS_STORE_NAME } from '@woocommerce/data'; @@ -16,7 +17,6 @@ import { ALLOW_TRACKING_OPTION_NAME, SHOWN_FOR_ACTIONS_OPTION_NAME, } from './constants'; -import { WooFooterItem } from '~/layout/footer'; import { STORE_KEY } from './data/constants'; export const PRODUCT_MVP_CES_ACTION_OPTION_NAME = diff --git a/plugins/woocommerce-admin/client/header/index.js b/plugins/woocommerce-admin/client/header/index.js index 2692f0be6e8..5bd466f6492 100644 --- a/plugins/woocommerce-admin/client/header/index.js +++ b/plugins/woocommerce-admin/client/header/index.js @@ -5,6 +5,13 @@ import { __, sprintf } from '@wordpress/i18n'; import { useEffect, useLayoutEffect, useRef } from '@wordpress/element'; import classnames from 'classnames'; import { decodeEntities } from '@wordpress/html-entities'; +import { + WC_HEADER_SLOT_NAME, + WC_HEADER_PAGE_TITLE_SLOT_NAME, + WooHeaderNavigationItem, + WooHeaderItem, + WooHeaderPageTitle, +} from '@woocommerce/admin-layout'; import { getSetting } from '@woocommerce/settings'; import { Text, useSlot } from '@woocommerce/experimental'; @@ -13,11 +20,6 @@ import { Text, useSlot } from '@woocommerce/experimental'; */ import './style.scss'; import useIsScrolled from '../hooks/useIsScrolled'; -import { - WooHeaderNavigationItem, - WooHeaderItem, - WooHeaderPageTitle, -} from './utils'; import { TasksReminderBar, useActiveSetupTasklist } from '../tasks'; export const PAGE_TITLE_FILTER = 'woocommerce_admin_header_page_title'; @@ -34,11 +36,24 @@ export const Header = ( { sections, isEmbedded = false, query } ) => { 'is-scrolled': isScrolled, } ); - const pageTitleSlot = useSlot( 'woocommerce_header_page_title' ); + const pageTitleSlot = useSlot( WC_HEADER_PAGE_TITLE_SLOT_NAME ); const hasPageTitleFills = Boolean( pageTitleSlot?.fills?.length ); - const headerItemSlot = useSlot( 'woocommerce_header_item' ); + const headerItemSlot = useSlot( WC_HEADER_SLOT_NAME ); const headerItemSlotFills = headerItemSlot?.fills; + const updateBodyMargin = () => { + clearTimeout( debounceTimer ); + debounceTimer = setTimeout( function () { + const wpBody = document.querySelector( '#wpbody' ); + + if ( ! wpBody || ! headerElement.current ) { + return; + } + + wpBody.style.marginTop = `${ headerElement.current.offsetHeight }px`; + }, 200 ); + }; + useLayoutEffect( () => { updateBodyMargin(); window.addEventListener( 'resize', updateBodyMargin ); @@ -54,19 +69,6 @@ export const Header = ( { sections, isEmbedded = false, query } ) => { }; }, [ headerItemSlotFills ] ); - const updateBodyMargin = () => { - clearTimeout( debounceTimer ); - debounceTimer = setTimeout( function () { - const wpBody = document.querySelector( '#wpbody' ); - - if ( ! wpBody || ! headerElement.current ) { - return; - } - - wpBody.style.marginTop = `${ headerElement.current.offsetHeight }px`; - }, 200 ); - }; - useEffect( () => { if ( ! isEmbedded ) { const documentTitle = sections diff --git a/plugins/woocommerce-admin/client/header/utils.tsx b/plugins/woocommerce-admin/client/header/utils.tsx deleted file mode 100644 index 8ecd7681bb3..00000000000 --- a/plugins/woocommerce-admin/client/header/utils.tsx +++ /dev/null @@ -1,113 +0,0 @@ -/** - * External dependencies - */ -import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '~/utils'; - -/** - * Create a Fill for extensions to add items to the WooCommerce Admin header. - * - * @slotFill WooHeaderItem - * @scope woocommerce-admin - * @example - * const MyHeaderItem = () => ( - * My header item - * ); - * - * registerPlugin( 'my-extension', { - * render: MyHeaderItem, - * scope: 'woocommerce-admin', - * } ); - * @param {Object} param0 - * @param {Array} param0.children - Node children. - * @param {Array} param0.order - Node order. - */ -export const WooHeaderItem: React.FC< { order?: number } > & { - Slot: React.FC< Slot.Props >; -} = ( { children, order = 1 } ) => { - return ( - - { ( fillProps: Fill.Props ) => { - return createOrderedChildren( children, order, fillProps ); - } } - - ); -}; - -WooHeaderItem.Slot = ( { fillProps } ) => ( - - { sortFillsByOrder } - -); - -/** - * Create a Fill for extensions to add items to the WooCommerce Admin - * navigation area left of the page title. - * - * @slotFill WooHeaderNavigationItem - * @scope woocommerce-admin - * @example - * const MyNavigationItem = () => ( - * My nav item - * ); - * - * registerPlugin( 'my-extension', { - * render: MyNavigationItem, - * scope: 'woocommerce-admin', - * } ); - * @param {Object} param0 - * @param {Array} param0.children - Node children. - * @param {Array} param0.order - Node order. - */ -export const WooHeaderNavigationItem: React.FC< { order?: number } > & { - Slot: React.FC< Slot.Props >; -} = ( { children, order = 1 } ) => { - return ( - - { ( fillProps: Fill.Props ) => { - return createOrderedChildren( children, order, fillProps ); - } } - - ); -}; - -WooHeaderNavigationItem.Slot = ( { fillProps }: Slot.Props ) => ( - - { sortFillsByOrder } - -); - -/** - * Create a Fill for extensions to add custom page titles. - * - * @slotFill WooHeaderPageTitle - * @scope woocommerce-admin - * @example - * const MyPageTitle = () => ( - * My page title - * ); - * - * registerPlugin( 'my-page-title', { - * render: MyPageTitle, - * scope: 'woocommerce-admin', - * } ); - * @param {Object} param0 - * @param {Array} param0.children - Node children. - */ -export const WooHeaderPageTitle: React.FC & { - Slot: React.FC< Slot.Props >; -} = ( { children } ) => { - return { children }; -}; - -WooHeaderPageTitle.Slot = ( { fillProps } ) => ( - - { ( fills ) => { - return <>{ [ ...fills ].pop() }; - } } - -); diff --git a/plugins/woocommerce-admin/client/homescreen/header-banner-slot/utils.tsx b/plugins/woocommerce-admin/client/homescreen/header-banner-slot/utils.tsx index 1bae78f7456..2ffc1dfab43 100644 --- a/plugins/woocommerce-admin/client/homescreen/header-banner-slot/utils.tsx +++ b/plugins/woocommerce-admin/client/homescreen/header-banner-slot/utils.tsx @@ -2,11 +2,10 @@ * External dependencies */ import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '../../utils'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; export const EXPERIMENTAL_WC_HOMESCREEN_HEADER_BANNER_SLOT_NAME = 'woocommerce_homescreen_experimental_header_banner_item'; diff --git a/plugins/woocommerce-admin/client/layout/footer/footer.tsx b/plugins/woocommerce-admin/client/layout/footer/footer.tsx index 5269b16fcd9..ac8897a1dab 100644 --- a/plugins/woocommerce-admin/client/layout/footer/footer.tsx +++ b/plugins/woocommerce-admin/client/layout/footer/footer.tsx @@ -1,13 +1,13 @@ /** * External dependencies */ +import { WC_FOOTER_SLOT_NAME, WooFooterItem } from '@woocommerce/admin-layout'; import { useSlot } from '@woocommerce/experimental'; /** * Internal dependencies */ import './footer.scss'; -import { WC_FOOTER_SLOT_NAME, WooFooterItem } from './utils'; export const Footer: React.FC = () => { const slot = useSlot( WC_FOOTER_SLOT_NAME ); diff --git a/plugins/woocommerce-admin/client/layout/footer/index.ts b/plugins/woocommerce-admin/client/layout/footer/index.ts index e74a2f1f615..a058eae01c5 100644 --- a/plugins/woocommerce-admin/client/layout/footer/index.ts +++ b/plugins/woocommerce-admin/client/layout/footer/index.ts @@ -1,2 +1 @@ export * from './footer'; -export * from './utils'; diff --git a/plugins/woocommerce-admin/client/layout/navigation.js b/plugins/woocommerce-admin/client/layout/navigation.js index abf2eb4b54c..f95c801ee18 100644 --- a/plugins/woocommerce-admin/client/layout/navigation.js +++ b/plugins/woocommerce-admin/client/layout/navigation.js @@ -2,6 +2,7 @@ * External dependencies */ import { registerPlugin } from '@wordpress/plugins'; +import { WooHeaderNavigationItem } from '@woocommerce/admin-layout'; import { WooNavigationItem, getNewPath, @@ -19,7 +20,6 @@ import { NAVIGATION_STORE_NAME } from '@woocommerce/data'; import getReports from '../analytics/report/get-reports'; import { getPages } from './controller'; import Navigation from '~/navigation'; -import { WooHeaderNavigationItem } from '~/header/utils'; const NavigationPlugin = () => { const { persistedQuery } = useSelect( ( select ) => { diff --git a/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx b/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx index a6a6007676f..5c9a9de9ea0 100644 --- a/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx @@ -2,11 +2,10 @@ * External dependencies */ import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '../../../utils'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; export const EXPERIMENTAL_WC_MARKETING_OVERVIEW_SECTION_SLOT_NAME = 'experimental_woocommerce_marketing_overview_section'; diff --git a/plugins/woocommerce-admin/client/mobile-banner/index.js b/plugins/woocommerce-admin/client/mobile-banner/index.js index 610b70c005e..c29a8141b5b 100644 --- a/plugins/woocommerce-admin/client/mobile-banner/index.js +++ b/plugins/woocommerce-admin/client/mobile-banner/index.js @@ -2,13 +2,13 @@ * External dependencies */ import { registerPlugin } from '@wordpress/plugins'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; import { useUserPreferences } from '@woocommerce/data'; /** * Internal dependencies */ import { Banner } from './banner'; -import { WooHeaderItem } from '~/header/utils'; export const MobileAppBanner = () => { const { updateUserPreferences, ...userData } = useUserPreferences(); diff --git a/plugins/woocommerce-admin/client/products/product-form-actions.tsx b/plugins/woocommerce-admin/client/products/product-form-actions.tsx index a9fbe53c797..c6f613421e2 100644 --- a/plugins/woocommerce-admin/client/products/product-form-actions.tsx +++ b/plugins/woocommerce-admin/client/products/product-form-actions.tsx @@ -11,6 +11,7 @@ import { } from '@wordpress/components'; import { chevronDown, check, Icon } from '@wordpress/icons'; import { registerPlugin } from '@wordpress/plugins'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; import { useFormContext } from '@woocommerce/components'; import { preventLeavingProductForm, @@ -29,7 +30,6 @@ import { store } from '@wordpress/viewport'; * Internal dependencies */ import usePreventLeavingPage from '~/hooks/usePreventLeavingPage'; -import { WooHeaderItem } from '~/header/utils'; import './product-form-actions.scss'; import { useProductMVPCESFooter } from '~/customer-effort-score-tracks/use-product-mvp-ces-footer'; import { useCustomerEffortScoreExitPageTracker } from '~/customer-effort-score-tracks/use-customer-effort-score-exit-page-tracker'; diff --git a/plugins/woocommerce-admin/client/products/product-more-menu.tsx b/plugins/woocommerce-admin/client/products/product-more-menu.tsx index d78bfde021d..ac83cc3d9d1 100644 --- a/plugins/woocommerce-admin/client/products/product-more-menu.tsx +++ b/plugins/woocommerce-admin/client/products/product-more-menu.tsx @@ -4,6 +4,7 @@ import { __ } from '@wordpress/i18n'; import { DropdownMenu, MenuItem } from '@wordpress/components'; import { useDispatch, useSelect } from '@wordpress/data'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; import { getAdminLink } from '@woocommerce/settings'; import { moreVertical } from '@wordpress/icons'; import { OPTIONS_STORE_NAME, Product } from '@woocommerce/data'; @@ -14,7 +15,6 @@ import { useFormContext } from '@woocommerce/components'; */ import { ClassicEditorIcon } from './images/classic-editor-icon'; import { FeedbackIcon } from './images/feedback-icon'; -import { WooHeaderItem } from '~/header/utils'; import { STORE_KEY as CES_STORE_KEY } from '~/customer-effort-score-tracks/data/constants'; import { NEW_PRODUCT_MANAGEMENT } from '~/customer-effort-score-tracks/product-mvp-ces-footer'; import { ALLOW_TRACKING_OPTION_NAME } from '~/customer-effort-score-tracks/constants'; diff --git a/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx b/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx index 26f05437310..14fa2a930b8 100644 --- a/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx +++ b/plugins/woocommerce-admin/client/products/product-settings/product-settings.tsx @@ -11,6 +11,7 @@ import { TextControl, } from '@wordpress/components'; import { closeSmall, cog } from '@wordpress/icons'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; import { getCheckboxTracks } from '@woocommerce/product-editor'; import { Product } from '@woocommerce/data'; import { useFormContext } from '@woocommerce/components'; @@ -19,7 +20,6 @@ import { useState } from '@wordpress/element'; /** * Internal dependencies */ -import { WooHeaderItem } from '~/header/utils'; import './product-settings.scss'; export const ProductSettings = () => { diff --git a/plugins/woocommerce-admin/client/products/product-settings/test/product-settings.spec.tsx b/plugins/woocommerce-admin/client/products/product-settings/test/product-settings.spec.tsx index 3a215df5b6e..8b96fc4be5b 100644 --- a/plugins/woocommerce-admin/client/products/product-settings/test/product-settings.spec.tsx +++ b/plugins/woocommerce-admin/client/products/product-settings/test/product-settings.spec.tsx @@ -11,7 +11,7 @@ import { render } from '@testing-library/react'; */ import { ProductSettings } from '../'; -jest.mock( '~/header/utils', () => ( { +jest.mock( '@woocommerce/admin-layout', () => ( { WooHeaderItem: ( props: { children: () => React.ReactElement } ) => ( { props.children } ), diff --git a/plugins/woocommerce-admin/client/products/product-title.tsx b/plugins/woocommerce-admin/client/products/product-title.tsx index b05c6a7e515..214603174f1 100644 --- a/plugins/woocommerce-admin/client/products/product-title.tsx +++ b/plugins/woocommerce-admin/client/products/product-title.tsx @@ -2,6 +2,7 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; +import { WooHeaderPageTitle } from '@woocommerce/admin-layout'; import { EXPERIMENTAL_PRODUCT_VARIATIONS_STORE_NAME, Product, @@ -24,7 +25,6 @@ import { useSelect } from '@wordpress/data'; */ import { ProductBreadcrumbs } from './product-breadcrumbs'; import { ProductStatusBadge } from './product-status-badge'; -import { WooHeaderPageTitle } from '~/header/utils'; import './product-title.scss'; export const ProductTitle: React.FC = () => { diff --git a/plugins/woocommerce-admin/client/products/product-variation-form-actions.tsx b/plugins/woocommerce-admin/client/products/product-variation-form-actions.tsx index d4c02983746..280aeaaa369 100644 --- a/plugins/woocommerce-admin/client/products/product-variation-form-actions.tsx +++ b/plugins/woocommerce-admin/client/products/product-variation-form-actions.tsx @@ -3,6 +3,7 @@ */ import { __ } from '@wordpress/i18n'; import { Button, ButtonGroup } from '@wordpress/components'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; import { EXPERIMENTAL_PRODUCT_VARIATIONS_STORE_NAME, ProductVariation, @@ -18,7 +19,6 @@ import { useState } from '@wordpress/element'; * Internal dependencies */ import usePreventLeavingPage from '~/hooks/usePreventLeavingPage'; -import { WooHeaderItem } from '~/header/utils'; import './product-form-actions.scss'; export const ProductVariationFormActions: React.FC = () => { diff --git a/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx b/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx index bad811af579..6c10650170d 100644 --- a/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx +++ b/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx @@ -38,7 +38,7 @@ jest.mock( } ), } ) ); -jest.mock( '~/header/utils', () => ( { +jest.mock( '@woocommerce/admin-layout', () => ( { WooHeaderItem: ( props: { children: () => React.ReactElement } ) => ( { props.children() } ), diff --git a/plugins/woocommerce-admin/client/task-lists/progress-header/utils.tsx b/plugins/woocommerce-admin/client/task-lists/progress-header/utils.tsx index d0f0fc42002..1342eebd696 100644 --- a/plugins/woocommerce-admin/client/task-lists/progress-header/utils.tsx +++ b/plugins/woocommerce-admin/client/task-lists/progress-header/utils.tsx @@ -3,16 +3,16 @@ * External dependencies */ import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '../../utils'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; export const WC_TASKLIST_EXPERIMENTAL_PROGRESS_HEADER_SLOT_NAME = 'woocommerce_tasklist_experimental_progress_header_item'; export const WooTaskListProgressHeaderItem: React.FC< { + children?: React.ReactNode; order?: number; } > & { Slot: React.FC< Slot.Props >; diff --git a/plugins/woocommerce-admin/client/task-lists/progress-title/utils.tsx b/plugins/woocommerce-admin/client/task-lists/progress-title/utils.tsx index e06002eafa6..2674032af73 100644 --- a/plugins/woocommerce-admin/client/task-lists/progress-title/utils.tsx +++ b/plugins/woocommerce-admin/client/task-lists/progress-title/utils.tsx @@ -3,16 +3,16 @@ * External dependencies */ import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '../../utils'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; export const WC_TASKLIST_EXPERIMENTAL_PROGRESS_TITLE_SLOT_NAME = 'woocommerce_tasklist_experimental_progress_title_item'; export const WooTaskListProgressTitleItem: React.FC< { + children?: React.ReactNode; order?: number; } > & { Slot: React.FC< Slot.Props >; diff --git a/plugins/woocommerce-admin/client/tasks/task.tsx b/plugins/woocommerce-admin/client/tasks/task.tsx index 79ce9e91df2..d65697e8541 100644 --- a/plugins/woocommerce-admin/client/tasks/task.tsx +++ b/plugins/woocommerce-admin/client/tasks/task.tsx @@ -1,6 +1,10 @@ /** * External dependencies */ +import { + WooHeaderNavigationItem, + WooHeaderPageTitle, +} from '@woocommerce/admin-layout'; import { WooOnboardingTask } from '@woocommerce/onboarding'; import { getHistory, getNewPath } from '@woocommerce/navigation'; import { ONBOARDING_STORE_NAME, TaskType } from '@woocommerce/data'; @@ -9,7 +13,6 @@ import { useDispatch } from '@wordpress/data'; /** * Internal dependencies */ -import { WooHeaderNavigationItem, WooHeaderPageTitle } from '~/header/utils'; import { BackButton } from './back-button'; export type TaskProps = { diff --git a/plugins/woocommerce-admin/client/two-column-tasks/footer-slot/utils.tsx b/plugins/woocommerce-admin/client/two-column-tasks/footer-slot/utils.tsx index 68ae1353e51..df5550aa52f 100644 --- a/plugins/woocommerce-admin/client/two-column-tasks/footer-slot/utils.tsx +++ b/plugins/woocommerce-admin/client/two-column-tasks/footer-slot/utils.tsx @@ -2,11 +2,10 @@ * External dependencies */ import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '../../utils'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; export const EXPERIMENTAL_WC_TASKLIST_FOOTER_SLOT_NAME = 'experimental_woocommerce_tasklist_footer_item'; @@ -24,7 +23,7 @@ export const EXPERIMENTAL_WC_TASKLIST_FOOTER_SLOT_NAME = *
    * * - ); + ); * * registerPlugin( 'my-extension', { * render: MyFooterItem, diff --git a/plugins/woocommerce-admin/client/two-column-tasks/task-list-completion-slot/utils.tsx b/plugins/woocommerce-admin/client/two-column-tasks/task-list-completion-slot/utils.tsx index b1e0c76c9c2..48d59eaaac9 100644 --- a/plugins/woocommerce-admin/client/two-column-tasks/task-list-completion-slot/utils.tsx +++ b/plugins/woocommerce-admin/client/two-column-tasks/task-list-completion-slot/utils.tsx @@ -2,11 +2,10 @@ * External dependencies */ import { Slot, Fill } from '@wordpress/components'; - -/** - * Internal dependencies - */ -import { createOrderedChildren, sortFillsByOrder } from '../../utils'; +import { + createOrderedChildren, + sortFillsByOrder, +} from '@woocommerce/components'; type WooTaskListCompletionProps = { children: React.ReactNode; diff --git a/plugins/woocommerce-admin/package.json b/plugins/woocommerce-admin/package.json index 49e7fd86394..01aa5cbe395 100644 --- a/plugins/woocommerce-admin/package.json +++ b/plugins/woocommerce-admin/package.json @@ -136,6 +136,7 @@ "@typescript-eslint/eslint-plugin": "^5.54.0", "@typescript-eslint/parser": "^5.54.0", "@woocommerce/admin-e2e-tests": "workspace:*", + "@woocommerce/admin-layout": "workspace:*", "@woocommerce/components": "workspace:*", "@woocommerce/csv-export": "workspace:*", "@woocommerce/currency": "workspace:*", @@ -151,8 +152,8 @@ "@woocommerce/navigation": "workspace:*", "@woocommerce/notices": "workspace:*", "@woocommerce/number": "workspace:*", - "@woocommerce/product-editor": "workspace:*", "@woocommerce/onboarding": "workspace:*", + "@woocommerce/product-editor": "workspace:*", "@woocommerce/tracks": "workspace:*", "@wordpress/babel-preset-default": "^6.5.1", "@wordpress/block-editor": "^9.8.0", diff --git a/plugins/woocommerce-admin/webpack.config.js b/plugins/woocommerce-admin/webpack.config.js index 258d7eaeae3..47642993727 100644 --- a/plugins/woocommerce-admin/webpack.config.js +++ b/plugins/woocommerce-admin/webpack.config.js @@ -23,6 +23,7 @@ const NODE_ENV = process.env.NODE_ENV || 'development'; const WC_ADMIN_PHASE = process.env.WC_ADMIN_PHASE || 'development'; const wcAdminPackages = [ + 'admin-layout', 'components', 'csv-export', 'currency', diff --git a/plugins/woocommerce/changelog/add-admin-layout-package b/plugins/woocommerce/changelog/add-admin-layout-package new file mode 100644 index 00000000000..ec1bd147634 --- /dev/null +++ b/plugins/woocommerce/changelog/add-admin-layout-package @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Add @woocommerce/admin-layout package. diff --git a/plugins/woocommerce/src/Internal/Admin/WCAdminAssets.php b/plugins/woocommerce/src/Internal/Admin/WCAdminAssets.php index a2e2712de5b..59f5cd9db59 100644 --- a/plugins/woocommerce/src/Internal/Admin/WCAdminAssets.php +++ b/plugins/woocommerce/src/Internal/Admin/WCAdminAssets.php @@ -249,6 +249,7 @@ class WCAdminAssets { $css_file_version = self::get_file_version( 'css' ); $scripts = array( + 'wc-admin-layout', 'wc-explat', 'wc-experimental', 'wc-customer-effort-score', @@ -304,6 +305,14 @@ class WCAdminAssets { } } + wp_register_style( + 'wc-admin-layout', + self::get_url( 'admin-layout/style', 'css' ), + array(), + $css_file_version + ); + wp_style_add_data( 'wc-admin-layout', 'rtl', 'replace' ); + wp_register_style( 'wc-components', self::get_url( 'components/style', 'css' ), @@ -348,7 +357,7 @@ class WCAdminAssets { wp_register_style( WC_ADMIN_APP, self::get_url( 'app/style', 'css' ), - array( 'wc-components', 'wc-customer-effort-score', 'wc-product-editor', 'wp-components', 'wc-experimental' ), + array( 'wc-components', 'wc-admin-layout', 'wc-customer-effort-score', 'wc-product-editor', 'wp-components', 'wc-experimental' ), $css_file_version ); wp_style_add_data( WC_ADMIN_APP, 'rtl', 'replace' ); @@ -368,6 +377,7 @@ class WCAdminAssets { public function inject_wc_settings_dependencies() { if ( wp_script_is( 'wc-settings', 'registered' ) ) { $handles_for_injection = [ + 'wc-admin-layout', 'wc-csv', 'wc-currency', 'wc-customer-effort-score', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ca737fe4d4..b104811a241 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -126,6 +126,51 @@ importers: ts-jest: 27.1.3_wfmhell6c5i72vvtgtvpmkkb6i typescript: 4.8.4 + packages/js/admin-layout: + specifiers: + '@types/react': ^17.0.2 + '@types/wordpress__components': ^19.10.3 + '@woocommerce/components': workspace:* + '@woocommerce/eslint-plugin': workspace:* + '@woocommerce/internal-style-build': workspace:* + '@wordpress/browserslist-config': wp-6.0 + '@wordpress/components': wp-6.0 + '@wordpress/element': wp-6.0 + css-loader: ^3.6.0 + eslint: ^8.32.0 + jest: ^27.5.1 + jest-cli: ^27.5.1 + postcss-loader: ^4.3.0 + react: ^17.0.2 + react-dom: ^17.0.2 + sass-loader: ^10.2.1 + ts-jest: ^27.1.3 + typescript: ^4.8.3 + webpack: ^5.70.0 + webpack-cli: ^3.3.12 + dependencies: + '@woocommerce/components': link:../components + '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/element': 4.4.1 + devDependencies: + '@types/react': 17.0.50 + '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m + '@woocommerce/eslint-plugin': link:../eslint-plugin + '@woocommerce/internal-style-build': link:../internal-style-build + '@wordpress/browserslist-config': 4.1.3 + css-loader: 3.6.0_webpack@5.70.0 + eslint: 8.32.0 + jest: 27.5.1 + jest-cli: 27.5.1 + postcss-loader: 4.3.0_wn4p5kzkgq2ohl66pfawxjf2x4 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + sass-loader: 10.2.1_webpack@5.70.0 + ts-jest: 27.1.3_77oryishcckaigojnzbhxsiona + typescript: 4.8.4 + webpack: 5.70.0_webpack-cli@3.3.12 + webpack-cli: 3.3.12_webpack@5.70.0 + packages/js/api: specifiers: '@types/create-hmac': 1.1.0 @@ -1576,6 +1621,7 @@ importers: '@typescript-eslint/eslint-plugin': ^5.54.0 '@typescript-eslint/parser': ^5.54.0 '@woocommerce/admin-e2e-tests': workspace:* + '@woocommerce/admin-layout': workspace:* '@woocommerce/api': ^0.2.0 '@woocommerce/components': workspace:* '@woocommerce/csv-export': workspace:* @@ -1795,6 +1841,7 @@ importers: '@typescript-eslint/eslint-plugin': 5.54.0_odmkqudqazj6zql7bilcklpxhm '@typescript-eslint/parser': 5.54.0_yygwinqv3a2io74xmwofqb7uka '@woocommerce/admin-e2e-tests': link:../../packages/js/admin-e2e-tests + '@woocommerce/admin-layout': link:../../packages/js/admin-layout '@woocommerce/components': link:../../packages/js/components '@woocommerce/csv-export': link:../../packages/js/csv-export '@woocommerce/currency': link:../../packages/js/currency @@ -2601,6 +2648,7 @@ packages: /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/compat-data/7.19.3: resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} @@ -2743,6 +2791,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 + dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -2769,32 +2818,6 @@ packages: browserslist: 4.21.4 semver: 6.3.0 - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.12.9 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - semver: 6.3.0 - dev: true - - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - semver: 6.3.0 - dev: false - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -2804,7 +2827,7 @@ packages: '@babel/compat-data': 7.19.3 '@babel/core': 7.17.8 '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 + browserslist: 4.19.3 semver: 6.3.0 dev: true @@ -2845,42 +2868,6 @@ packages: browserslist: 4.21.4 semver: 6.3.0 - /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: - resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.16.12: - resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -3085,6 +3072,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 + dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -3163,6 +3151,7 @@ packages: '@babel/types': 7.19.3 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} @@ -3300,26 +3289,6 @@ packages: dependencies: '@babel/types': 7.19.3 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} @@ -3330,6 +3299,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3339,30 +3328,6 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} @@ -3375,6 +3340,30 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + dev: false + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -3399,34 +3388,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.12.9: - resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.16.12: - resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} engines: {node: '>=6.9.0'} @@ -3455,6 +3416,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.16.12: + resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} engines: {node: '>=6.9.0'} @@ -3481,32 +3457,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} engines: {node: '>=6.9.0'} @@ -3531,6 +3481,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -3543,34 +3506,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: - resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.16.12: - resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} @@ -3585,6 +3520,34 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -3622,28 +3585,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} @@ -3655,6 +3596,28 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -3695,28 +3658,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} @@ -3728,6 +3669,28 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -3748,28 +3711,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} @@ -3781,6 +3722,28 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -3801,28 +3764,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} @@ -3834,6 +3775,28 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -3854,28 +3817,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} engines: {node: '>=6.9.0'} @@ -3896,6 +3837,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -3916,28 +3868,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} @@ -3949,6 +3879,28 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -3983,34 +3935,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.12.9 - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.12.9: - resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.16.12: - resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} engines: {node: '>=6.9.0'} @@ -4038,6 +3962,20 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} @@ -4061,28 +3999,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -4104,6 +4020,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -4125,30 +4052,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} engines: {node: '>=6.9.0'} @@ -4206,32 +4109,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.12.9: - resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.16.12: - resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.8: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} engines: {node: '>=6.9.0'} @@ -4245,6 +4122,32 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4257,36 +4160,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} engines: {node: '>=6.9.0'} @@ -4302,6 +4175,36 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4326,28 +4229,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -4943,26 +4824,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} engines: {node: '>=6.9.0'} @@ -4982,6 +4843,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -5004,34 +4875,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.12.9: - resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-remap-async-to-generator': 7.16.8 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.16.12: - resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-remap-async-to-generator': 7.16.8 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} engines: {node: '>=6.9.0'} @@ -5059,6 +4902,20 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -5081,26 +4938,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -5120,6 +4957,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -5138,26 +4985,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} engines: {node: '>=6.9.0'} @@ -5177,6 +5004,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -5203,44 +5040,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} engines: {node: '>=6.9.0'} @@ -5279,6 +5078,26 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-classes/7.19.0_@babel+core@7.16.12: + resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-classes/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} engines: {node: '>=6.9.0'} @@ -5307,26 +5126,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} engines: {node: '>=6.9.0'} @@ -5346,6 +5145,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -5364,26 +5173,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} @@ -5403,6 +5192,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.16.12: + resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.17.8: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -5422,28 +5221,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -5495,26 +5272,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} @@ -5525,6 +5282,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -5544,28 +5321,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -5587,6 +5342,17 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -5626,26 +5392,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} engines: {node: '>=6.9.0'} @@ -5665,6 +5411,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.16.12: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.17.8: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -5684,30 +5440,6 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -5731,6 +5463,18 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -5751,26 +5495,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} engines: {node: '>=6.9.0'} @@ -5790,6 +5514,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -5808,26 +5542,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -5847,6 +5561,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -5869,34 +5593,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} @@ -5911,6 +5607,34 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -5938,36 +5662,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} @@ -5996,6 +5690,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -6025,38 +5734,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.12.9: - resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.16.12: - resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} @@ -6073,6 +5750,38 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.12.9: + resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.16.12: + resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} engines: {node: '>=6.9.0'} @@ -6100,32 +5809,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} @@ -6139,6 +5822,32 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} @@ -6160,26 +5869,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.12.9: - resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.16.12: - resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} engines: {node: '>=6.9.0'} @@ -6200,6 +5889,17 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.16.12: + resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} @@ -6219,26 +5919,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} @@ -6249,6 +5929,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -6270,32 +5970,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -6321,6 +5995,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -6342,26 +6029,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} engines: {node: '>=6.9.0'} @@ -6409,26 +6076,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -6448,6 +6095,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -6619,26 +6276,6 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - regenerator-transform: 0.14.5 - dev: true - - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - regenerator-transform: 0.14.5 - dev: false - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} engines: {node: '>=6.9.0'} @@ -6649,6 +6286,28 @@ packages: regenerator-transform: 0.14.5 dev: true + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + regenerator-transform: 0.15.0 + dev: true + + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + regenerator-transform: 0.15.0 + dev: false + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -6668,26 +6327,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} @@ -6698,6 +6337,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -6731,9 +6390,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@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.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -6748,9 +6407,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 @@ -6799,26 +6458,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} engines: {node: '>=6.9.0'} @@ -6838,6 +6477,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -6857,28 +6506,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: true - - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: false - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} engines: {node: '>=6.9.0'} @@ -6900,6 +6527,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.16.12: + resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -6919,26 +6557,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -6958,6 +6576,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -6976,26 +6604,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} engines: {node: '>=6.9.0'} @@ -7015,6 +6623,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -7033,26 +6651,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} @@ -7063,6 +6661,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -7134,26 +6752,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} @@ -7164,6 +6762,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.12.9: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.16.12: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.17.8: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -7183,28 +6801,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -7226,6 +6822,17 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -7325,28 +6932,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.19.3 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.12.9 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.12.9 - '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.12.9 - '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.12.9 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 @@ -7361,44 +6968,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.9 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.12.9 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.12.9 - '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.12.9 - '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.12.9 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.17.0 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 + '@babel/types': 7.19.3 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 - core-js-compat: 3.21.1 + core-js-compat: 3.25.5 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7410,28 +7017,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.19.3 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.16.12 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.16.12 - '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.16.12 - '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.16.12 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.16.12 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.12 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 @@ -7446,44 +7053,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.12 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.16.12 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.16.12 - '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.16.12 - '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.16.12 - '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.16.12 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.16.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.16.12 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.16.12 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.16.12 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.16.12 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.17.0 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 + '@babel/types': 7.19.3 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 - core-js-compat: 3.21.1 + core-js-compat: 3.25.5 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -15107,7 +14714,7 @@ packages: '@wordpress/browserslist-config': 4.1.3 '@wordpress/element': 4.20.0 '@wordpress/warning': 2.28.0 - browserslist: 4.21.4 + browserslist: 4.19.3 core-js: 3.25.5 transitivePeerDependencies: - supports-color @@ -15167,7 +14774,7 @@ packages: '@wordpress/browserslist-config': 5.11.0 '@wordpress/element': 5.5.0 '@wordpress/warning': 2.28.0 - browserslist: 4.21.4 + browserslist: 4.19.3 core-js: 3.25.5 transitivePeerDependencies: - supports-color @@ -18276,7 +17883,7 @@ packages: hasBin: true dependencies: browserslist: 3.2.8 - caniuse-lite: 1.0.30001418 + caniuse-lite: 1.0.30001146 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -18741,19 +18348,6 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.16.12: - resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: @@ -18779,6 +18373,19 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.16.12: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: @@ -19570,7 +19177,7 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001418 + caniuse-lite: 1.0.30001146 electron-to-chromium: 1.4.276 dev: true @@ -19910,14 +19517,13 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.21.4 - caniuse-lite: 1.0.30001418 + browserslist: 4.19.3 + caniuse-lite: 1.0.30001146 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 /caniuse-lite/1.0.30001146: resolution: {integrity: sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==} - dev: true /caniuse-lite/1.0.30001352: resolution: {integrity: sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==} @@ -20934,8 +20540,9 @@ packages: /core-js-compat/3.21.1: resolution: {integrity: sha512-gbgX5AUvMb8gwxC7FLVWYT7Kkgu/y7+h/h1X43yJkNqhlK2fuYyQimqvKGNZFAY6CKii/GFKJ2cp/1/42TN36g==} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 semver: 7.0.0 + dev: true /core-js-compat/3.25.5: resolution: {integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==} @@ -22902,7 +22509,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.0.4 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -22933,7 +22540,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.0.4 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -24672,7 +24279,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.2.2 + deepmerge: 4.3.0 fs-extra: 9.1.0 glob: 7.2.0 memfs: 3.3.0 @@ -24735,7 +24342,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.2.2 + deepmerge: 4.3.0 eslint: 8.32.0 fs-extra: 9.1.0 glob: 7.2.0 @@ -24767,7 +24374,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.2.2 + deepmerge: 4.3.0 fs-extra: 9.1.0 glob: 7.2.0 memfs: 3.3.0 @@ -31399,7 +31006,6 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 - dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -33178,7 +32784,7 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 color: 3.2.1 has: 1.0.3 postcss: 7.0.39 @@ -33190,7 +32796,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 caniuse-api: 3.0.0 colord: 2.9.2 postcss: 8.4.12 @@ -33398,7 +33004,7 @@ packages: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -33411,7 +33017,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 caniuse-api: 3.0.0 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 @@ -33465,7 +33071,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.21.4 + browserslist: 4.19.3 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -33477,7 +33083,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 postcss-value-parser: 4.2.0 @@ -33682,7 +33288,7 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -33692,7 +33298,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 postcss: 8.4.12 postcss-value-parser: 4.2.0 dev: true @@ -33757,7 +33363,7 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 @@ -33768,7 +33374,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 caniuse-api: 3.0.0 postcss: 8.4.12 dev: true @@ -37556,7 +37162,7 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 postcss: 7.0.39 postcss-selector-parser: 3.1.2 @@ -37566,7 +37172,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 postcss: 8.4.12 postcss-selector-parser: 6.0.9 dev: true @@ -40363,7 +39969,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 + browserslist: 4.19.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -40402,7 +40008,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 + browserslist: 4.19.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -40483,7 +40089,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 + browserslist: 4.19.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 From 1fea0185fe0002524bd7cf2a28dc915e8f9d0aa2 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 11 Mar 2023 00:31:23 +0800 Subject: [PATCH 0997/1680] Don't throw error in getCampaignTypes. In WP 5.9, if we throw error, there would be an uncaught promise, and it causes UI to break. --- .../client/marketing/data-multichannel/resolvers.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/data-multichannel/resolvers.ts b/plugins/woocommerce-admin/client/marketing/data-multichannel/resolvers.ts index bef1d3e8791..984d0dd0000 100644 --- a/plugins/woocommerce-admin/client/marketing/data-multichannel/resolvers.ts +++ b/plugins/woocommerce-admin/client/marketing/data-multichannel/resolvers.ts @@ -128,7 +128,5 @@ export function* getCampaignTypes() { if ( isApiFetchError( error ) ) { yield receiveCampaignTypes( error ); } - - throw error; } } From c6e6f8774d6ec36f0d7ebe2c3e17e50d5c847e7c Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 11 Mar 2023 00:42:09 +0800 Subject: [PATCH 0998/1680] Specify empty array dependency in useCampaignTypes. This is to make it work with WP 5.9. See https://github.com/woocommerce/woocommerce/pull/37044#discussion_r1132062493. --- .../client/marketing/hooks/useCampaignTypes.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts b/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts index 8cf9b70f8ee..4c1f82f24b3 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useCampaignTypes.ts @@ -38,7 +38,7 @@ export const useCampaignTypes = (): UseCampaignTypes => { const { invalidateResolution } = useDispatch( STORE_KEY ); const refetch = useCallback( () => { - invalidateResolution( 'getCampaignTypes' ); + invalidateResolution( 'getCampaignTypes', [] ); }, [ invalidateResolution ] ); return useSelect< UseCampaignTypes >( @@ -48,7 +48,7 @@ export const useCampaignTypes = (): UseCampaignTypes => { const campaignTypesState = getCampaignTypes< CampaignTypesState >(); return { - loading: ! hasFinishedResolution( 'getCampaignTypes' ), + loading: ! hasFinishedResolution( 'getCampaignTypes', [] ), data: campaignTypesState.data?.map( convert ), error: campaignTypesState.error, refetch, From 5019a344a1bb762c5bccd54d989f17b25dfb8613 Mon Sep 17 00:00:00 2001 From: Tam Mullen Date: Fri, 10 Mar 2023 17:47:33 +0000 Subject: [PATCH 0999/1680] Add k6 release regression test (#37146) * Added test scenario for release regression testing --- .../changelog/add-k6-regression-test | 5 + .../tests/wc-regression-test-load.js | 330 ++++++++++++++++++ 2 files changed, 335 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-k6-regression-test create mode 100644 plugins/woocommerce/tests/performance/tests/wc-regression-test-load.js diff --git a/plugins/woocommerce/changelog/add-k6-regression-test b/plugins/woocommerce/changelog/add-k6-regression-test new file mode 100644 index 00000000000..bec84721135 --- /dev/null +++ b/plugins/woocommerce/changelog/add-k6-regression-test @@ -0,0 +1,5 @@ +Significance: patch +Type: add +Comment: Perf test not included in release + + diff --git a/plugins/woocommerce/tests/performance/tests/wc-regression-test-load.js b/plugins/woocommerce/tests/performance/tests/wc-regression-test-load.js new file mode 100644 index 00000000000..57a4698feff --- /dev/null +++ b/plugins/woocommerce/tests/performance/tests/wc-regression-test-load.js @@ -0,0 +1,330 @@ +/* eslint-disable eqeqeq */ +/* eslint-disable no-undef */ +/** + * Internal dependencies + */ +import { homePage } from '../requests/shopper/home.js'; +import { shopPage } from '../requests/shopper/shop-page.js'; +import { searchProduct } from '../requests/shopper/search-product.js'; +import { singleProduct } from '../requests/shopper/single-product.js'; +import { cart } from '../requests/shopper/cart.js'; +import { cartRemoveItem } from '../requests/shopper/cart-remove-item.js'; +import { cartApplyCoupon } from '../requests/shopper/cart-apply-coupon.js'; +import { checkoutGuest } from '../requests/shopper/checkout-guest.js'; +import { checkoutCustomerLogin } from '../requests/shopper/checkout-customer-login.js'; +import { myAccountOrders } from '../requests/shopper/my-account-orders.js'; +import { categoryPage } from '../requests/shopper/category-page.js'; +import { products } from '../requests/merchant/products.js'; +import { addProduct } from '../requests/merchant/add-product.js'; +import { coupons } from '../requests/merchant/coupons.js'; +import { orders } from '../requests/merchant/orders.js'; +import { ordersSearch } from '../requests/merchant/orders-search.js'; +import { ordersFilter } from '../requests/merchant/orders-filter.js'; +import { addOrder } from '../requests/merchant/add-order.js'; +import { homeWCAdmin } from '../requests/merchant/home-wc-admin.js'; +import { myAccountMerchantLogin } from '../requests/merchant/my-account-merchant.js'; +import { wpLogin } from '../requests/merchant/wp-login.js'; +import { ordersAPI } from '../requests/api/orders.js'; +import { admin_acc_login } from '../config.js'; + +const shopper_request_threshold = 'p(95)<100000'; +const merchant_request_threshold = 'p(95)<100000'; +const api_request_threshold = 'p(95)<100000'; + +export const options = { + scenarios: { + merchantOrders: { + executor: 'ramping-arrival-rate', + startRate: 2, // starting iterations per timeUnit + timeUnit: '20s', + preAllocatedVUs: 5, + maxVUs: 9, + stages: [ + // target value is iterations per timeUnit + { target: 1, duration: '60s' }, + { target: 2, duration: '500s' }, + { target: 1, duration: '60' }, + ], + exec: 'merchantOrderFlows', + }, + merchantOther: { + executor: 'ramping-arrival-rate', + startRate: 2, // starting iterations per timeUnit + timeUnit: '20s', + preAllocatedVUs: 5, + maxVUs: 9, + stages: [ + // target value is iterations per timeUnit + { target: 1, duration: '60s' }, + { target: 2, duration: '500s' }, + { target: 1, duration: '60' }, + ], + exec: 'merchantOtherFlows', + }, + shopperBrowsing: { + executor: 'ramping-arrival-rate', + startRate: 2, // starting iterations per timeUnit + timeUnit: '10s', + preAllocatedVUs: 5, + maxVUs: 9, + stages: [ + // target value is iterations per timeUnit + { target: 2, duration: '60s' }, + { target: 10, duration: '500s' }, + { target: 1, duration: '60' }, + ], + exec: 'shopperBrowsingFlows', + }, + shopperGuestCheckouts: { + executor: 'ramping-arrival-rate', + startRate: 2, // starting iterations per timeUnit + timeUnit: '20s', + preAllocatedVUs: 5, + maxVUs: 9, + stages: [ + // target value is iterations per timeUnit + { target: 1, duration: '60s' }, + { target: 2, duration: '500s' }, + { target: 1, duration: '60' }, + ], + exec: 'checkoutGuestFlow', + }, + shopperCustomerCheckouts: { + executor: 'ramping-arrival-rate', + startRate: 2, // starting iterations per timeUnit + timeUnit: '20s', + preAllocatedVUs: 5, + maxVUs: 9, + stages: [ + // target value is iterations per timeUnit + { target: 1, duration: '60s' }, + { target: 2, duration: '500s' }, + { target: 1, duration: '60' }, + ], + exec: 'checkoutCustomerLoginFlow', + }, + apiBackground: { + executor: 'ramping-arrival-rate', + startRate: 1, // starting iterations per timeUnit + timeUnit: '30s', + preAllocatedVUs: 5, + maxVUs: 5, + stages: [ + // target value is iterations per timeUnit + { target: 1, duration: '60s' }, + { target: 2, duration: '500s' }, + { target: 1, duration: '60' }, + ], + exec: 'allAPIFlow', + }, + }, + thresholds: { + // Listing individual metrics due to https://github.com/grafana/k6/issues/1321 + 'http_req_duration{name:Shopper - Site Root}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Shop Page}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Search Products}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Category Page}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Product Page}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - wc-ajax=add_to_cart}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - View Cart}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Remove Item From Cart}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - wc-ajax=apply_coupon}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Update Cart}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - View Checkout}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - wc-ajax=update_order_review}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - wc-ajax=checkout}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Order Received}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - wc-ajax=get_refreshed_fragments}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Login to Checkout}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - My Account Login Page}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - Login to My Account}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - My Account}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - My Account Orders}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Shopper - My Account Open Order}': [ + `${ shopper_request_threshold }`, + ], + 'http_req_duration{name:Merchant - WP Login Page}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Login to WP Admin}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - WC-Admin}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - wc-analytics/orders?}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - wc-analytics/products/reviews?}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - wc-analytics/products/low-in-stock?}': + [ `${ merchant_request_threshold }` ], + 'http_req_duration{name:Merchant - All Orders}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Completed Orders}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - New Order Page}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Create New Order}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Open Order}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Update Existing Order Status}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Search Orders By Product}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Search Orders By Customer Email}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Search Orders By Customer Address}': + [ `${ merchant_request_threshold }` ], + 'http_req_duration{name:Merchant - Filter Orders By Month}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Filter Orders By Customer}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - All Products}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Add New Product}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - action=sample-permalink}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - action=heartbeat autosave}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Update New Product}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - Coupons}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - wc-admin/onboarding/tasks?}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - wc-analytics/admin/notes?}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:Merchant - wc-admin/options?options=woocommerce_ces_tracks_queue}': + [ `${ merchant_request_threshold }` ], + 'http_req_duration{name:Merchant - action=heartbeat}': [ + `${ merchant_request_threshold }`, + ], + 'http_req_duration{name:API - Create Order}': [ + `${ api_request_threshold }`, + ], + 'http_req_duration{name:API - Retrieve Order}': [ + `${ api_request_threshold }`, + ], + 'http_req_duration{name:API - Update Order (Status)}': [ + `${ api_request_threshold }`, + ], + 'http_req_duration{name:API - Delete Order}': [ + `${ api_request_threshold }`, + ], + 'http_req_duration{name:API - Batch Create Orders}': [ + `${ api_request_threshold }`, + ], + 'http_req_duration{name:API - Batch Update (Status) Orders}': [ + `${ api_request_threshold }`, + ], + }, +}; + +// Use myAccountMerchantLogin() instead of wpLogin() if having issues with login. +export function merchantOrderFlows() { + if ( admin_acc_login === true ) { + myAccountMerchantLogin(); + } else { + wpLogin(); + } + addOrder(); + orders(); + ordersSearch(); + ordersFilter(); +} + +// Use myAccountMerchantLogin() instead of wpLogin() if having issues with login. +export function merchantOtherFlows() { + if ( admin_acc_login === true ) { + myAccountMerchantLogin(); + } else { + wpLogin(); + } + homeWCAdmin(); + addProduct(); + products(); + coupons(); +} +export function shopperBrowsingFlows() { + homePage(); + shopPage(); + searchProduct(); + singleProduct(); + cartRemoveItem(); + cartApplyCoupon(); + categoryPage(); +} +export function checkoutGuestFlow() { + cart(); + checkoutGuest(); +} +export function checkoutCustomerLoginFlow() { + cart(); + checkoutCustomerLogin(); + myAccountOrders(); +} +export function allAPIFlow() { + ordersAPI(); +} From 329b0cbd07729d32102c92201dc3249c9b90d111 Mon Sep 17 00:00:00 2001 From: louwie17 Date: Fri, 10 Mar 2023 16:21:22 -0400 Subject: [PATCH 1000/1680] Hydrate product editor settings (#37123) --- .../add-37120_hydrate_product_editor_settings | 4 +++ .../src/components/editor/editor.tsx | 6 ++-- .../js/product-editor/src/components/index.ts | 5 ++- .../client/products/product-page.tsx | 10 +++++- .../add-37120_hydrate_product_editor_settings | 4 +++ .../includes/class-wc-post-types.php | 8 +++++ .../Features/BlockEditorFeatureEnabled.php | 32 +++++++++++++++++++ .../NewProductManagementExperience.php | 1 + 8 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37120_hydrate_product_editor_settings create mode 100644 plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings diff --git a/packages/js/product-editor/changelog/add-37120_hydrate_product_editor_settings b/packages/js/product-editor/changelog/add-37120_hydrate_product_editor_settings new file mode 100644 index 00000000000..0557eed0916 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37120_hydrate_product_editor_settings @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Export the ProductEditorSettings type. diff --git a/packages/js/product-editor/src/components/editor/editor.tsx b/packages/js/product-editor/src/components/editor/editor.tsx index f4f7bdd1191..07fd93af707 100644 --- a/packages/js/product-editor/src/components/editor/editor.tsx +++ b/packages/js/product-editor/src/components/editor/editor.tsx @@ -26,10 +26,12 @@ import { BlockEditor } from '../block-editor'; import { initBlocks } from './init-blocks'; initBlocks(); - +export type ProductEditorSettings = Partial< + EditorSettings & EditorBlockListSettings +>; type EditorProps = { product: Product; - settings: Partial< EditorSettings & EditorBlockListSettings > | undefined; + settings: ProductEditorSettings | undefined; }; export function Editor( { product, settings }: EditorProps ) { diff --git a/packages/js/product-editor/src/components/index.ts b/packages/js/product-editor/src/components/index.ts index f1881d80b27..9c70b568fe7 100644 --- a/packages/js/product-editor/src/components/index.ts +++ b/packages/js/product-editor/src/components/index.ts @@ -10,4 +10,7 @@ export { DetailsFeatureField as __experimentalDetailsFeatureField } from './deta export { DetailsCategoriesField as __experimentalDetailsCategoriesField } from './details-categories-field'; export { DetailsSummaryField as __experimentalDetailsSummaryField } from './details-summary-field'; export { DetailsDescriptionField as __experimentalDetailsDescriptionField } from './details-description-field'; -export { Editor as __experimentalEditor } from './editor'; +export { + Editor as __experimentalEditor, + ProductEditorSettings, +} from './editor'; diff --git a/plugins/woocommerce-admin/client/products/product-page.tsx b/plugins/woocommerce-admin/client/products/product-page.tsx index ce20414283e..27447e26e40 100644 --- a/plugins/woocommerce-admin/client/products/product-page.tsx +++ b/plugins/woocommerce-admin/client/products/product-page.tsx @@ -4,6 +4,7 @@ import { __experimentalEditor as Editor, AUTO_DRAFT_NAME, + ProductEditorSettings, } from '@woocommerce/product-editor'; import { Product } from '@woocommerce/data'; import { useDispatch, useSelect, select as WPSelect } from '@wordpress/data'; @@ -16,6 +17,8 @@ import { useParams } from 'react-router-dom'; */ import './product-page.scss'; +declare const productBlockEditorSettings: ProductEditorSettings; + const ProductEditor: React.FC< { product: Product | undefined } > = ( { product, } ) => { @@ -23,7 +26,12 @@ const ProductEditor: React.FC< { product: Product | undefined } > = ( { return ; } - return ; + return ( + + ); }; const EditProductEditor: React.FC< { productId: string } > = ( { diff --git a/plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings b/plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings new file mode 100644 index 00000000000..8bf592e2794 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add productBlockEditorSettings script to be used for the Product Block Editor. diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 7f536200a64..74f3050a754 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -366,6 +366,14 @@ class WC_Post_Types { 'show_in_nav_menus' => true, 'show_in_rest' => true, 'rest_namespace' => 'wp/v3', + 'template' => array( + array( + 'core/paragraph', + array( + 'placeholder' => 'Product description', + ), + ), + ), ) ) ); diff --git a/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php b/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php index 2ac8069661a..75e5cf3416a 100644 --- a/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php +++ b/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php @@ -8,6 +8,7 @@ namespace Automattic\WooCommerce\Admin\Features; use Automattic\WooCommerce\Admin\Features\TransientNotices; use Automattic\WooCommerce\Admin\PageController; use Automattic\WooCommerce\Internal\Admin\Loader; +use WP_Block_Editor_Context; /** * Loads assets related to the new product management experience page. @@ -29,6 +30,37 @@ class BlockEditorFeatureEnabled { add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_styles' ) ); add_action( 'get_edit_post_link', array( $this, 'update_edit_product_link' ), 10, 2 ); } + if ( Features::is_enabled( self::FEATURE_ID ) ) { + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); + } + } + + /** + * Enqueue scripts needed for the product form block editor. + */ + public function enqueue_scripts() { + if ( ! PageController::is_admin_or_embed_page() ) { + return; + } + $post_type_object = get_post_type_object( 'product' ); + $block_editor_context = new WP_Block_Editor_Context( array( 'name' => 'core/edit-post' ) ); + + $editor_settings = array(); + if ( ! empty( $post_type_object->template ) ) { + $editor_settings['template'] = $post_type_object->template; + $editor_settings['templateLock'] = ! empty( $post_type_object->template_lock ) ? $post_type_object->template_lock : false; + } + + $editor_settings = get_block_editor_settings( $editor_settings, $block_editor_context ); + + $script_handle = 'wc-admin-edit-product'; + wp_register_script( $script_handle, '', array(), '0.1.0', true ); + wp_enqueue_script( $script_handle ); + wp_add_inline_script( + $script_handle, + 'var productBlockEditorSettings = productBlockEditorSettings || ' . wp_json_encode( $editor_settings ) . ';', + 'before' + ); } /** diff --git a/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php b/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php index 36e8fca5e3c..6ae5a0b2a1a 100644 --- a/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php +++ b/plugins/woocommerce/src/Admin/Features/NewProductManagementExperience.php @@ -8,6 +8,7 @@ namespace Automattic\WooCommerce\Admin\Features; use Automattic\WooCommerce\Admin\Features\TransientNotices; use Automattic\WooCommerce\Admin\PageController; use Automattic\WooCommerce\Internal\Admin\Loader; +use WP_Block_Editor_Context; /** * Loads assets related to the new product management experience page. From 6db4d6b68a16ec80544e1c542e3ebf363d8aca48 Mon Sep 17 00:00:00 2001 From: Atanas Penchev Date: Sat, 11 Mar 2023 03:36:23 +0200 Subject: [PATCH 1001/1680] Extract variable --- .../client/legacy/js/flexslider/jquery.flexslider.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js b/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js index a175fdfa61b..c1a941bf7ab 100755 --- a/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js +++ b/plugins/woocommerce/client/legacy/js/flexslider/jquery.flexslider.js @@ -704,16 +704,17 @@ }, slider.vars.animationSpeed + 100); } else { + var prop = slider.prop; slider.container.each(function() { var container = this; var keyframes = {}; - keyframes[slider.prop] = [ - window.getComputedStyle(container)[slider.prop], - slider.args[slider.prop] + keyframes[prop] = [ + window.getComputedStyle(container)[prop], + slider.args[prop] ]; container.animate(keyframes, { duration: slider.vars.animationSpeed, easing: easing }).onfinish = function() { - container.style[slider.prop] = slider.args[slider.prop]; + container.style[prop] = slider.args[prop]; slider.wrapup(dimension); }; }); From 6e517c9fd33b70b9962c1f14ebae603a88a8a56b Mon Sep 17 00:00:00 2001 From: rodelgc Date: Mon, 13 Mar 2023 07:55:33 +0800 Subject: [PATCH 1002/1680] Update run-api-tests action description Co-authored-by: Leif Singer --- .github/actions/tests/run-api-tests/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/tests/run-api-tests/action.yml b/.github/actions/tests/run-api-tests/action.yml index 6d48d0b2df6..c1dd9383a72 100644 --- a/.github/actions/tests/run-api-tests/action.yml +++ b/.github/actions/tests/run-api-tests/action.yml @@ -1,5 +1,5 @@ name: Run API tests -description: Runs the WooCommerce Core API tests and generate Allure report. +description: Runs the WooCommerce Core API tests and generates Allure report. permissions: {} inputs: From b1ed8511dc250d2fd44e00f01e75dc95ef16bf4b Mon Sep 17 00:00:00 2001 From: rodelgc Date: Mon, 13 Mar 2023 08:37:30 +0800 Subject: [PATCH 1003/1680] Update k6 job name Co-authored-by: Leif Singer --- .github/workflows/smoke-test-pr-merge.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test-pr-merge.yml b/.github/workflows/smoke-test-pr-merge.yml index 83da99f6bde..3b3562f3004 100644 --- a/.github/workflows/smoke-test-pr-merge.yml +++ b/.github/workflows/smoke-test-pr-merge.yml @@ -137,7 +137,7 @@ jobs: test-type: E2E k6: - name: Runs k6 Performance tests + name: Run k6 Performance tests needs: [api] runs-on: ubuntu-20.04 permissions: From 8ddb2bb6bc1e8e167e67ad18402ca19c98d057ca Mon Sep 17 00:00:00 2001 From: rodelgc Date: Mon, 13 Mar 2023 08:38:44 +0800 Subject: [PATCH 1004/1680] Update run-e2e-tests action description Co-authored-by: Leif Singer --- .github/actions/tests/run-e2e-tests/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/tests/run-e2e-tests/action.yml b/.github/actions/tests/run-e2e-tests/action.yml index 22e0945c6dd..7c7a974ed53 100644 --- a/.github/actions/tests/run-e2e-tests/action.yml +++ b/.github/actions/tests/run-e2e-tests/action.yml @@ -1,5 +1,5 @@ name: Run E2E tests -description: Runs the WooCommerce Core E2E tests and generate Allure report. +description: Runs the WooCommerce Core E2E tests and generates Allure report. permissions: {} inputs: From 5e636046dd6319d1ccafcc48e9b488e4fb479636 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 13 Mar 2023 16:35:05 +0530 Subject: [PATCH 1005/1680] Also delete when order type is placehoder, since it was created by HPOS. --- .../DataStores/Orders/OrdersTableDataStore.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index eb42a9eefb0..4226af8c8b8 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -1790,9 +1790,18 @@ FROM $order_meta_table $order->set_id( 0 ); - // Only delete post data if the posts table is authoritative and synchronization is enabled. + /** We can delete the post data if: + * 1. If the HPOS table is authoritative and synchronization is enabled. + * 2. If the post record is of type `shop_order_placehold`, since this is created by the HPOS in the first place. + * + * In other words, we do not delete the post record when HPOS table is authoritative and synchronization is disabled but post record is a full record and not just a placeholder, because it implies that the order was created before HPOS was enabled. + */ $data_synchronizer = wc_get_container()->get( DataSynchronizer::class ); - if ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) { + if ( + ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) || + ( get_post_type( $order_id ) === 'shop_order_placehold' ) + ) { + // Delete the associated post, which in turn deletes order items, etc. through {@see WC_Post_Data}. // Once we stop creating posts for orders, we should do the cleanup here instead. wp_delete_post( $order_id ); From 0746305ec1a326ee3f95a227d2c41a1249234f6a Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 13 Mar 2023 19:33:59 +0530 Subject: [PATCH 1006/1680] Restore the sort order when orders are cached. --- .../includes/class-wc-order-factory.php | 32 +++++++++++-------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/plugins/woocommerce/includes/class-wc-order-factory.php b/plugins/woocommerce/includes/class-wc-order-factory.php index 3851a048f49..6c67102a55b 100644 --- a/plugins/woocommerce/includes/class-wc-order-factory.php +++ b/plugins/woocommerce/includes/class-wc-order-factory.php @@ -67,20 +67,25 @@ class WC_Order_Factory { * @throws \Exception When an invalid order is found. */ public static function get_orders( $order_ids = array(), $skip_invalid = false ) { - $result = array(); - $order_ids = array_filter( array_map( array( __CLASS__, 'get_order_id' ), $order_ids ) ); + if ( empty( $order_ids ) ) { + return array(); + } + + $result = array(); + $order_ids = array_filter( array_map( array( __CLASS__, 'get_order_id' ), $order_ids ) ); + $original_order_sort = $order_ids; + $order_cache = wc_get_container()->get( OrderCache::class ); $already_cached_orders = array(); $use_orders_cache = OrderUtil::orders_cache_usage_is_enabled(); if ( $use_orders_cache ) { $uncached_order_ids = array(); - $order_cache = wc_get_container()->get( OrderCache::class ); foreach ( $order_ids as $order_id ) { $cached_order = $order_cache->get( absint( $order_id ) ); - if ( is_null( $cached_order ) ) { - $uncached_order_ids[] = $order_id; + if ( $cached_order instanceof \WC_Abstract_Legacy_Order ) { + $already_cached_orders[ $order_id ] = $cached_order; } else { - $already_cached_orders[] = $cached_order; + $uncached_order_ids[] = $order_id; } } $order_ids = $uncached_order_ids; @@ -128,17 +133,16 @@ class WC_Order_Factory { } } - // restore the sort order. - $result = array_values( array_replace( array_flip( $order_ids ), $result ) ); - if ( $use_orders_cache ) { - foreach ( $result as $order ) { - $order_cache->set( $order ); + foreach ( $result as $order_id => $order ) { + $order_cache->set( $order, $order->get_id( $order_id ) ); } - return array_merge( $already_cached_orders, $result ); - } else { - return $result; + $result = array_replace( $result, $already_cached_orders ); } + + // restore the sort order. + $result = array_values( array_replace( array_flip( $original_order_sort ), $result ) ); + return $result; } /** From 43fedcfc5aa5e9bebd6bc1c66b1c54c9ff04f208 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 13 Mar 2023 20:08:58 +0530 Subject: [PATCH 1007/1680] Add unit test to ensure caching does not affect sort order. --- .../includes/class-wc-order-factory-test.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/plugins/woocommerce/tests/php/includes/class-wc-order-factory-test.php b/plugins/woocommerce/tests/php/includes/class-wc-order-factory-test.php index 22f4839dfa0..9675e0e8fc4 100644 --- a/plugins/woocommerce/tests/php/includes/class-wc-order-factory-test.php +++ b/plugins/woocommerce/tests/php/includes/class-wc-order-factory-test.php @@ -1,5 +1,6 @@ assertInstanceOf( WC_Order_Refund::class, $orders_with_diff_types[3] ); } + /** + * @testDox Test that cache does not interfere with order sorting. + */ + public function test_cache_dont_interfere_with_orders() { + OrderHelper::toggle_cot( $this->cot_state ); + $order1 = OrderHelper::create_order(); + $order2 = OrderHelper::create_order(); + + wp_cache_flush(); + $cache = wc_get_container()->get( OrderCache::class ); + $cache->set( $order2, $order2->get_id() ); + + $orders = WC_Order_Factory::get_orders( array( $order1->get_id(), $order2->get_id() ) ); + $this->assertEquals( 2, count( $orders ) ); + $this->assertEquals( $order1->get_id(), $orders[0]->get_id() ); + $this->assertEquals( $order2->get_id(), $orders[1]->get_id() ); + OrderHelper::toggle_cot( false ); + } + } From 4dff6db40f426989dfd8dfaba59f2296233bc123 Mon Sep 17 00:00:00 2001 From: Joel Thiessen <444632+joelclimbsthings@users.noreply.github.com> Date: Mon, 13 Mar 2023 07:45:25 -0700 Subject: [PATCH 1008/1680] Adding test name block with support for entity data store (#37132) * Adding test name block with support for entity data store * Adding changelog * Changing block.ts to block.json and amending TS config to support * Experiment in loading blocks from settings template * Enable the use of templates with the block editor * Fix dependency * Add changelog * Fix lint error and remove unused utils * Fix tests by fixing mocks --------- Co-authored-by: Lourens Schep --- .../changelog/add-name-block-37007 | 4 + packages/js/product-editor/package.json | 13 +- .../components/block-editor/block-editor.tsx | 68 +- .../components/details-name-block/block.json | 23 + .../components/details-name-block/edit.tsx | 38 + .../components/details-name-block/index.ts | 17 + .../src/components/editor/editor.tsx | 37 +- .../src/components/editor/init-blocks.ts | 5 +- packages/js/product-editor/src/utils/index.ts | 1 + .../product-editor/src/utils/init-blocks.ts | 26 + packages/js/product-editor/tsconfig-cjs.json | 7 +- packages/js/product-editor/tsconfig.json | 7 +- .../test/product-form-actions.spec.tsx | 4 +- .../two-column-tasks/test/task-list.test.tsx | 6 + .../changelog/add-name-block-37007 | 4 + .../includes/class-wc-post-types.php | 4 +- pnpm-lock.yaml | 2707 ++++++++++------- 17 files changed, 1879 insertions(+), 1092 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-name-block-37007 create mode 100644 packages/js/product-editor/src/components/details-name-block/block.json create mode 100644 packages/js/product-editor/src/components/details-name-block/edit.tsx create mode 100644 packages/js/product-editor/src/components/details-name-block/index.ts create mode 100644 packages/js/product-editor/src/utils/init-blocks.ts create mode 100644 plugins/woocommerce/changelog/add-name-block-37007 diff --git a/packages/js/product-editor/changelog/add-name-block-37007 b/packages/js/product-editor/changelog/add-name-block-37007 new file mode 100644 index 00000000000..03ffb6e838e --- /dev/null +++ b/packages/js/product-editor/changelog/add-name-block-37007 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Adding name field block to product editor. diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index df9b6d02a97..5ea325f9090 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -38,16 +38,18 @@ "@woocommerce/tracks": "workspace:^1.3.0", "@wordpress/block-editor": "^9.8.0", "@wordpress/blocks": "^12.3.0", - "@wordpress/data": "wp-6.0", - "@wordpress/interface": "wp-6.0", - "@wordpress/keyboard-shortcuts": "wp-6.0", - "@wordpress/media-utils": "wp-6.0", "@wordpress/components": "wp-6.0", "@wordpress/compose": "wp-6.0", + "@wordpress/core-data": "wp-6.0", + "@wordpress/data": "wp-6.0", + "@wordpress/editor": "wp-6.0", "@wordpress/element": "wp-6.0", "@wordpress/html-entities": "wp-6.0", "@wordpress/i18n": "wp-6.0", "@wordpress/icons": "wp-6.0", + "@wordpress/interface": "wp-6.0", + "@wordpress/keyboard-shortcuts": "wp-6.0", + "@wordpress/media-utils": "wp-6.0", "@wordpress/url": "wp-6.0", "classnames": "^2.3.1", "lodash": "^4.17.21", @@ -57,9 +59,12 @@ "@testing-library/react": "^12.1.3", "@types/react": "^17.0.2", "@types/wordpress__block-editor": "^7.0.0", + "@types/wordpress__block-library": "^2.6.1", "@types/wordpress__blocks": "^11.0.7", "@types/wordpress__components": "^19.10.3", + "@types/wordpress__core-data": "^2.4.5", "@types/wordpress__data": "^6.0.2", + "@types/wordpress__editor": "^13.0.0", "@types/wordpress__media-utils": "^3.0.0", "@woocommerce/eslint-plugin": "workspace:*", "@woocommerce/internal-style-build": "workspace:*", diff --git a/packages/js/product-editor/src/components/block-editor/block-editor.tsx b/packages/js/product-editor/src/components/block-editor/block-editor.tsx index db9ef074800..db5b062a707 100644 --- a/packages/js/product-editor/src/components/block-editor/block-editor.tsx +++ b/packages/js/product-editor/src/components/block-editor/block-editor.tsx @@ -1,10 +1,10 @@ /** * External dependencies */ -import { BlockInstance } from '@wordpress/blocks'; -import { createElement, useState, useMemo } from '@wordpress/element'; +import { Template } from '@wordpress/blocks'; +import { createElement, useMemo, useLayoutEffect } from '@wordpress/element'; import { Product } from '@woocommerce/data'; -import { useSelect, select as WPSelect } from '@wordpress/data'; +import { useSelect, select as WPSelect, useDispatch } from '@wordpress/data'; import { uploadMedia } from '@wordpress/media-utils'; import { // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -22,6 +22,13 @@ import { WritingFlow, ObserveTyping, } from '@wordpress/block-editor'; +// It doesn't seem to notice the External dependency block whn @ts-ignore is added. +// eslint-disable-next-line @woocommerce/dependency-group +import { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore store should be included. + useEntityBlockEditor, +} from '@wordpress/core-data'; /** * Internal dependencies @@ -30,18 +37,25 @@ import { Sidebar } from '../sidebar'; type BlockEditorProps = { product: Partial< Product >; - settings: Partial< EditorSettings & EditorBlockListSettings > | undefined; + settings: + | ( Partial< EditorSettings & EditorBlockListSettings > & { + template?: Template[]; + } ) + | undefined; }; -export function BlockEditor( { settings: _settings }: BlockEditorProps ) { - const [ blocks, updateBlocks ] = useState< BlockInstance[] >(); +export function BlockEditor( { + settings: _settings, + product, +}: BlockEditorProps ) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore __experimentalTearDownEditor is not yet included in types package. + const { setupEditor, __experimentalTearDownEditor } = + useDispatch( 'core/editor' ); const canUserCreateMedia = useSelect( ( select: typeof WPSelect ) => { - const { canUser } = select( 'core' ) as Record< - string, - ( ...args: string[] ) => boolean - >; - return canUser( 'create', 'media' ) !== false; + const { canUser } = select( 'core' ); + return canUser( 'create', 'media', '' ) !== false; }, [] ); const settings = useMemo( () => { @@ -68,28 +82,30 @@ export function BlockEditor( { settings: _settings }: BlockEditorProps ) { }; }, [ canUserCreateMedia, _settings ] ); - /** - * Wrapper for updating blocks. Required as `onInput` callback passed to - * `BlockEditorProvider` is now called with more than 1 argument. Therefore - * attempting to setState directly via `updateBlocks` will trigger an error - * in React. - * - * @param _blocks - */ - function handleUpdateBlocks( _blocks: BlockInstance[] ) { - updateBlocks( _blocks ); - } + useLayoutEffect( () => { + setupEditor( product, {}, _settings?.template ); - function handlePersistBlocks( newBlocks: BlockInstance[] ) { - updateBlocks( newBlocks ); + return () => { + __experimentalTearDownEditor(); + }; + }, [] ); + + const [ blocks, onInput, onChange ] = useEntityBlockEditor( + 'postType', + 'product', + { id: product.id } + ); + + if ( ! blocks ) { + return null; } return (
    diff --git a/packages/js/product-editor/src/components/details-name-block/block.json b/packages/js/product-editor/src/components/details-name-block/block.json new file mode 100644 index 00000000000..920e5956645 --- /dev/null +++ b/packages/js/product-editor/src/components/details-name-block/block.json @@ -0,0 +1,23 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-name", + "title": "Product name", + "category": "widgets", + "description": "The product name.", + "keywords": [ "products", "name", "title" ], + "textdomain": "default", + "attributes": { + "name": { + "type": "string" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": false, + "reusable": false, + "inserter": false, + "lock": false + } +} diff --git a/packages/js/product-editor/src/components/details-name-block/edit.tsx b/packages/js/product-editor/src/components/details-name-block/edit.tsx new file mode 100644 index 00000000000..3c18544da4b --- /dev/null +++ b/packages/js/product-editor/src/components/details-name-block/edit.tsx @@ -0,0 +1,38 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { createElement } from '@wordpress/element'; +import interpolateComponents from '@automattic/interpolate-components'; +import { TextControl } from '@woocommerce/components'; +import { useBlockProps } from '@wordpress/block-editor'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore No types for this exist yet. +// eslint-disable-next-line @woocommerce/dependency-group +import { useEntityProp } from '@wordpress/core-data'; + +export function Edit() { + const blockProps = useBlockProps(); + const [ name, setName ] = useEntityProp( 'postType', 'product', 'name' ); + + return ( +
    + + { __( '(required)', 'woocommerce' ) } + + ), + }, + } ) } + name={ 'woocommerce-product-name' } + placeholder={ __( 'e.g. 12 oz Coffee Mug', 'woocommerce' ) } + onChange={ setName } + value={ name || '' } + /> +
    + ); +} diff --git a/packages/js/product-editor/src/components/details-name-block/index.ts b/packages/js/product-editor/src/components/details-name-block/index.ts new file mode 100644 index 00000000000..f0c73e48b2b --- /dev/null +++ b/packages/js/product-editor/src/components/details-name-block/index.ts @@ -0,0 +1,17 @@ +/** + * Internal dependencies + */ +import { initBlock } from '../../utils'; +import metadata from './block.json'; +import { Edit } from './edit'; + +const { name } = metadata; + +export { metadata, name }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export const init = () => initBlock( { name, metadata, settings } ); diff --git a/packages/js/product-editor/src/components/editor/editor.tsx b/packages/js/product-editor/src/components/editor/editor.tsx index 07fd93af707..4e8d6c331ee 100644 --- a/packages/js/product-editor/src/components/editor/editor.tsx +++ b/packages/js/product-editor/src/components/editor/editor.tsx @@ -8,6 +8,11 @@ import { } from '@wordpress/block-editor'; import { SlotFillProvider } from '@wordpress/components'; import { Product } from '@woocommerce/data'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore No types for this exist yet. +// eslint-disable-next-line @woocommerce/dependency-group +import { EntityProvider } from '@wordpress/core-data'; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore No types for this exist yet. // eslint-disable-next-line @woocommerce/dependency-group @@ -37,21 +42,23 @@ type EditorProps = { export function Editor( { product, settings }: EditorProps ) { return ( - - - - } - sidebar={ } - content={ - - } - /> - - + + + + + } + sidebar={ } + content={ + + } + /> + + + ); } diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index 5578c23abc7..b7e3584fbe1 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -1,5 +1,8 @@ /** * Internal dependencies */ +import { init as initName } from '../details-name-block'; -export const initBlocks = () => {}; +export const initBlocks = () => { + initName(); +}; diff --git a/packages/js/product-editor/src/utils/index.ts b/packages/js/product-editor/src/utils/index.ts index 1e15f6859f9..b2ddb029f36 100644 --- a/packages/js/product-editor/src/utils/index.ts +++ b/packages/js/product-editor/src/utils/index.ts @@ -19,6 +19,7 @@ import { preventLeavingProductForm } from './prevent-leaving-product-form'; export * from './create-ordered-children'; export * from './sort-fills-by-order'; +export * from './init-blocks'; export { AUTO_DRAFT_NAME, diff --git a/packages/js/product-editor/src/utils/init-blocks.ts b/packages/js/product-editor/src/utils/init-blocks.ts new file mode 100644 index 00000000000..b8dc4118138 --- /dev/null +++ b/packages/js/product-editor/src/utils/init-blocks.ts @@ -0,0 +1,26 @@ +/** + * External dependencies + */ +import { BlockConfiguration, registerBlockType } from '@wordpress/blocks'; + +interface BlockRepresentation { + name: string; + metadata: BlockConfiguration; + settings: Partial< BlockConfiguration >; +} + +/** + * Function to register an individual block. + * + * @param {Object} block The block to be registered. + * + * @return {?WPBlockType} The block, if it has been successfully registered; + * otherwise `undefined`. + */ +export const initBlock = ( block: BlockRepresentation ) => { + if ( ! block ) { + return; + } + const { metadata, settings, name } = block; + return registerBlockType( { name, ...metadata }, settings ); +}; diff --git a/packages/js/product-editor/tsconfig-cjs.json b/packages/js/product-editor/tsconfig-cjs.json index 035d2318baf..6af863da44e 100644 --- a/packages/js/product-editor/tsconfig-cjs.json +++ b/packages/js/product-editor/tsconfig-cjs.json @@ -1,6 +1,11 @@ { "extends": "../tsconfig-cjs", + "include": [ + "**/*", + "src/**/*.json" + ], "compilerOptions": { - "outDir": "build" + "outDir": "build", + "resolveJsonModule": true, } } diff --git a/packages/js/product-editor/tsconfig.json b/packages/js/product-editor/tsconfig.json index ea9f201d401..76051e1535c 100644 --- a/packages/js/product-editor/tsconfig.json +++ b/packages/js/product-editor/tsconfig.json @@ -1,10 +1,15 @@ { "extends": "../tsconfig", + "include": [ + "**/*", + "src/**/*.json" + ], "compilerOptions": { "rootDir": "src", "outDir": "build-module", "declaration": true, "declarationMap": true, - "declarationDir": "./build-types" + "declarationDir": "./build-types", + "resolveJsonModule": true, } } diff --git a/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx b/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx index 6c10650170d..d79bb80b282 100644 --- a/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx +++ b/plugins/woocommerce-admin/client/products/test/product-form-actions.spec.tsx @@ -23,8 +23,8 @@ const onDraftCES = jest.fn().mockResolvedValue( {} ); jest.mock( '@wordpress/plugins', () => ( { registerPlugin: jest.fn() } ) ); -jest.mock( '@woocommerce/data', () => ( { - ...jest.requireActual( '@woocommerce/data' ), +jest.mock( '@wordpress/data', () => ( { + ...jest.requireActual( '@wordpress/data' ), useDispatch: jest.fn().mockReturnValue( { updateOptions: jest.fn() } ), useSelect: jest.fn().mockReturnValue( { productCESAction: 'hide' } ), } ) ); diff --git a/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx b/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx index edc274633fb..86df930ced4 100644 --- a/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx +++ b/plugins/woocommerce-admin/client/two-column-tasks/test/task-list.test.tsx @@ -32,6 +32,12 @@ jest.mock( '../task-headers', () => ( { required: () =>
    required_header
    , completed: () =>
    completed_header
    , } ) ); +jest.mock( '@woocommerce/data', () => ( { + ...jest.requireActual( '@woocommerce/data' ), + useUserPreferences: jest.fn().mockReturnValue( { + updateUserPreferences: jest.fn(), + } ), +} ) ); const tasks: { [ key: string ]: TaskType[] } = { setup: [ diff --git a/plugins/woocommerce/changelog/add-name-block-37007 b/plugins/woocommerce/changelog/add-name-block-37007 new file mode 100644 index 00000000000..8785c8ec87c --- /dev/null +++ b/plugins/woocommerce/changelog/add-name-block-37007 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Update template of product type to include product name block. diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 74f3050a754..2d39ae28231 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -368,9 +368,9 @@ class WC_Post_Types { 'rest_namespace' => 'wp/v3', 'template' => array( array( - 'core/paragraph', + 'woocommerce/product-name', array( - 'placeholder' => 'Product description', + 'name' => 'Product name', ), ), ), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b104811a241..46af508412b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1113,7 +1113,7 @@ importers: typescript: ^4.8.3 dependencies: '@testing-library/jest-dom': 5.16.2 - '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m + '@testing-library/react': 12.1.4_6l5554ty5ajsajah6yazvrjhoe '@wordpress/data': 6.6.1_react@17.0.2 '@wordpress/i18n': 4.6.1 '@wordpress/jest-console': 5.0.2_jest@27.5.1 @@ -1359,9 +1359,12 @@ importers: '@types/lodash': ^4.14.179 '@types/react': ^17.0.2 '@types/wordpress__block-editor': ^7.0.0 + '@types/wordpress__block-library': ^2.6.1 '@types/wordpress__blocks': ^11.0.7 '@types/wordpress__components': ^19.10.3 + '@types/wordpress__core-data': ^2.4.5 '@types/wordpress__data': ^6.0.2 + '@types/wordpress__editor': ^13.0.0 '@types/wordpress__media-utils': ^3.0.0 '@woocommerce/components': workspace:* '@woocommerce/currency': workspace:* @@ -1375,7 +1378,9 @@ importers: '@wordpress/browserslist-config': wp-6.0 '@wordpress/components': wp-6.0 '@wordpress/compose': wp-6.0 + '@wordpress/core-data': wp-6.0 '@wordpress/data': wp-6.0 + '@wordpress/editor': wp-6.0 '@wordpress/element': wp-6.0 '@wordpress/html-entities': wp-6.0 '@wordpress/i18n': wp-6.0 @@ -1416,7 +1421,9 @@ importers: '@wordpress/blocks': 12.5.0_react@17.0.2 '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu '@wordpress/compose': 5.4.1_react@17.0.2 + '@wordpress/core-data': 4.4.5_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/editor': 12.5.10_tufdcic6wklrwyy3rhbsbktylu '@wordpress/element': 4.4.1 '@wordpress/html-entities': 3.6.1 '@wordpress/i18n': 4.6.1 @@ -1432,8 +1439,11 @@ importers: '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m '@types/react': 17.0.50 '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m + '@types/wordpress__block-library': 2.6.1 '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m + '@types/wordpress__core-data': 2.4.5 '@types/wordpress__data': 6.0.2 + '@types/wordpress__editor': 13.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__media-utils': 3.0.0_sfoxds7t5ydpegc3knd667wn6m '@woocommerce/eslint-plugin': link:../eslint-plugin '@woocommerce/internal-style-build': link:../internal-style-build @@ -2648,7 +2658,6 @@ packages: /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/compat-data/7.19.3: resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} @@ -2791,7 +2800,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 - dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -2818,6 +2826,32 @@ packages: browserslist: 4.21.4 semver: 6.3.0 + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: false + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -2868,6 +2902,42 @@ packages: browserslist: 4.21.4 semver: 6.3.0 + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.16.12: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -3072,7 +3142,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 - dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -3151,7 +3220,6 @@ packages: '@babel/types': 7.19.3 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} @@ -3289,6 +3357,26 @@ packages: dependencies: '@babel/types': 7.19.3 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} @@ -3299,26 +3387,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3328,6 +3396,30 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + dev: false + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} @@ -3340,30 +3432,6 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -3388,6 +3456,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} engines: {node: '>=6.9.0'} @@ -3416,21 +3512,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.16.12: - resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} engines: {node: '>=6.9.0'} @@ -3457,6 +3538,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} engines: {node: '>=6.9.0'} @@ -3481,19 +3588,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -3506,6 +3600,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.16.12: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} @@ -3520,34 +3642,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -3585,6 +3679,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} @@ -3596,28 +3712,6 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -3658,6 +3752,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} @@ -3669,28 +3785,6 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -3711,6 +3805,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} @@ -3722,28 +3838,6 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -3764,6 +3858,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} @@ -3775,28 +3891,6 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -3817,6 +3911,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} engines: {node: '>=6.9.0'} @@ -3837,17 +3953,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -3868,6 +3973,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} @@ -3879,28 +4006,6 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -3935,6 +4040,34 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.12.9 + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.12.9: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.16.12: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} engines: {node: '>=6.9.0'} @@ -3962,20 +4095,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} @@ -3999,6 +4118,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -4020,17 +4161,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -4052,6 +4182,30 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} engines: {node: '>=6.9.0'} @@ -4109,6 +4263,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.12.9: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.16.12: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.8: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} engines: {node: '>=6.9.0'} @@ -4122,32 +4302,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4160,6 +4314,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} engines: {node: '>=6.9.0'} @@ -4175,36 +4359,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4229,6 +4383,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -4824,6 +5000,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} engines: {node: '>=6.9.0'} @@ -4843,16 +5039,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -4875,6 +5061,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} engines: {node: '>=6.9.0'} @@ -4902,20 +5116,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -4938,6 +5138,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -4957,16 +5177,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -4985,6 +5195,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} engines: {node: '>=6.9.0'} @@ -5004,16 +5234,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -5040,6 +5260,44 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} engines: {node: '>=6.9.0'} @@ -5078,26 +5336,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} engines: {node: '>=6.9.0'} @@ -5126,6 +5364,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} engines: {node: '>=6.9.0'} @@ -5145,16 +5403,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -5173,6 +5421,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} @@ -5192,16 +5460,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.16.12: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.17.8: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -5221,6 +5479,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -5272,6 +5552,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} @@ -5282,26 +5582,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -5321,6 +5601,28 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -5342,17 +5644,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -5392,6 +5683,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} engines: {node: '>=6.9.0'} @@ -5411,16 +5722,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.16.12: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.17.8: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -5440,6 +5741,30 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -5463,18 +5788,6 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -5495,6 +5808,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} engines: {node: '>=6.9.0'} @@ -5514,16 +5847,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -5542,6 +5865,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -5561,16 +5904,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -5593,6 +5926,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} @@ -5607,34 +5968,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -5662,6 +5995,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} @@ -5690,21 +6053,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -5734,6 +6082,38 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.12.9: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.16.12: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} @@ -5750,38 +6130,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.12.9: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} engines: {node: '>=6.9.0'} @@ -5809,6 +6157,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} @@ -5822,32 +6196,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} @@ -5869,6 +6217,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + dev: false + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} engines: {node: '>=6.9.0'} @@ -5889,17 +6257,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.16.12: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} @@ -5919,6 +6276,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} @@ -5929,26 +6306,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -5970,6 +6327,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -5995,19 +6378,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -6029,6 +6399,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} engines: {node: '>=6.9.0'} @@ -6076,6 +6466,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -6095,16 +6505,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -6276,6 +6676,26 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + regenerator-transform: 0.14.5 + dev: false + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} engines: {node: '>=6.9.0'} @@ -6286,28 +6706,6 @@ packages: regenerator-transform: 0.14.5 dev: true - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: true - - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: false - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -6327,6 +6725,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} @@ -6337,26 +6755,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -6390,9 +6788,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 + '@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.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -6407,9 +6805,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 @@ -6458,6 +6856,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} engines: {node: '>=6.9.0'} @@ -6477,16 +6895,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -6506,6 +6914,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: true + + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} engines: {node: '>=6.9.0'} @@ -6527,17 +6957,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: false - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -6557,6 +6976,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -6576,16 +7015,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -6604,6 +7033,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} engines: {node: '>=6.9.0'} @@ -6623,16 +7072,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -6651,6 +7090,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} @@ -6661,26 +7120,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -6752,6 +7191,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} @@ -6762,26 +7221,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.12.9: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.16.12: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.17.8: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -6801,6 +7240,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -6822,17 +7283,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -6932,28 +7382,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.12.9 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.12.9 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.12.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 @@ -6968,44 +7418,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.9 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.12.9 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.12.9 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.19.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.12.9 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7017,28 +7467,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.16.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.16.12 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.16.12 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.16.12 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.12 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 @@ -7053,44 +7503,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.12 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.16.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.16.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.16.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.16.12 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.16.12 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.19.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -13081,6 +13531,20 @@ packages: react-error-boundary: 3.1.4_react@17.0.2 dev: true + /@testing-library/react/12.1.4_6l5554ty5ajsajah6yazvrjhoe: + resolution: {integrity: sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==} + engines: {node: '>=12'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.19.0 + '@testing-library/dom': 8.11.3 + '@types/react-dom': 17.0.17 + react: 17.0.2 + react-dom: 18.2.0_react@17.0.2 + dev: false + /@testing-library/react/12.1.4_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==} engines: {node: '>=12'} @@ -13093,6 +13557,7 @@ packages: '@types/react-dom': 17.0.17 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: true /@testing-library/user-event/13.5.0_gzufz4q333be4gqfrvipwvqt6a: resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} @@ -13694,7 +14159,7 @@ packages: '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__data': 6.0.2 '@types/wordpress__keycodes': 2.3.1 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react @@ -13702,14 +14167,13 @@ packages: /@types/wordpress__block-library/2.6.1: resolution: {integrity: sha512-x+V2iqNZiCbNHwMLxszv0qHZ0ooYXZYisKxUIGTOhlrQDrYIiSIZG2+6UgS65UFnwGQve3EGP/RlMYIpQT6TyQ==} - dev: false /@types/wordpress__blocks/11.0.7_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-8BcT3CUxHt73CepaLtQHAhA7uBhDOK9x5HJOAxzV+Bl37W04u4jSNulXxwX/6tI7t7Knux5lnN9bvKf/1sg+Rw==} dependencies: '@types/react': 17.0.50 '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -13721,7 +14185,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_prpqlkd37azqwypxturxi7uyci transitivePeerDependencies: @@ -13736,7 +14200,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: @@ -13775,6 +14239,22 @@ packages: '@types/react': 17.0.50 redux: 4.2.0 + /@types/wordpress__editor/13.0.0_sfoxds7t5ydpegc3knd667wn6m: + resolution: {integrity: sha512-hqnO/L82pY90l5XX88nhJjGxHyKAC5Q2k68bQaUPIHduRi28jCoKrWw/s6Wa6DesFBealF/at6Df8ooQY0TZcQ==} + dependencies: + '@types/react': 17.0.50 + '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m + '@types/wordpress__blocks': 11.0.7_sfoxds7t5ydpegc3knd667wn6m + '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m + '@types/wordpress__core-data': 2.4.5 + '@types/wordpress__data': 6.0.2 + '@types/wordpress__media-utils': 3.0.0_sfoxds7t5ydpegc3knd667wn6m + '@wordpress/element': 5.5.0 + transitivePeerDependencies: + - react + - react-dom + dev: true + /@types/wordpress__keycodes/2.3.1: resolution: {integrity: sha512-CUZv3WdPvWqnEwojbc4yEttwZlvsMGI8YurgB9CHVJXx6nQ4U2RU6PB0Mv7nxATufduFDMKq8TNpCHBenZqEjQ==} @@ -13783,7 +14263,7 @@ packages: dependencies: '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__core-data': 2.4.5 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -14537,8 +15017,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/dom-ready': 3.6.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/dom-ready': 3.28.0 + '@wordpress/i18n': 4.28.0 dev: false /@wordpress/api-fetch/3.23.1_react-native@0.70.0: @@ -14566,8 +15046,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 dev: true /@wordpress/api-fetch/6.25.0: @@ -14583,8 +15063,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 dev: false /@wordpress/autop/3.19.0: @@ -14732,7 +15212,7 @@ packages: '@babel/runtime': 7.17.7 '@wordpress/babel-plugin-import-jsx-pragma': 3.1.0_@babel+core@7.16.12 '@wordpress/browserslist-config': 4.1.3 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 '@wordpress/warning': 2.2.2 browserslist: 4.19.3 core-js: 3.21.1 @@ -14752,8 +15232,8 @@ packages: '@babel/runtime': 7.17.7 '@wordpress/babel-plugin-import-jsx-pragma': 3.1.2_@babel+core@7.17.8 '@wordpress/browserslist-config': 4.1.3 - '@wordpress/element': 4.4.1 - '@wordpress/warning': 2.6.1 + '@wordpress/element': 4.20.0 + '@wordpress/warning': 2.28.0 browserslist: 4.20.2 core-js: 3.21.1 transitivePeerDependencies: @@ -14830,14 +15310,14 @@ packages: '@wordpress/is-shallow-equal': 4.28.0 '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 '@wordpress/keycodes': 3.28.0 - '@wordpress/notices': 3.19.0_react@17.0.2 + '@wordpress/notices': 3.28.0_react@17.0.2 '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/shortcode': 3.28.0 '@wordpress/style-engine': 1.2.0 '@wordpress/token-list': 2.19.0 '@wordpress/url': 3.29.0 '@wordpress/warning': 2.28.0 - '@wordpress/wordcount': 3.19.0 + '@wordpress/wordcount': 3.28.0 classnames: 2.3.1 colord: 2.9.2 diff: 4.0.2 @@ -14861,6 +15341,59 @@ packages: - vite dev: false + /@wordpress/block-editor/8.6.0_tufdcic6wklrwyy3rhbsbktylu: + resolution: {integrity: sha512-Low88BcV7pUSULNytPbO8KWrrMnQA7FnbYW1UOj+GJt+zsYqIleYZccjI5DoFTsXAAKn8RYPytX0i6F6jDM6XQ==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@react-spring/web': 9.5.5_sfoxds7t5ydpegc3knd667wn6m + '@wordpress/a11y': 3.28.0 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/blob': 3.28.0 + '@wordpress/blocks': 11.18.0_react@17.0.2 + '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 + '@wordpress/is-shallow-equal': 4.28.0 + '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 + '@wordpress/keycodes': 3.28.0 + '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/shortcode': 3.28.0 + '@wordpress/style-engine': 0.6.0 + '@wordpress/token-list': 2.28.0 + '@wordpress/url': 3.29.0 + '@wordpress/warning': 2.28.0 + '@wordpress/wordcount': 3.28.0 + classnames: 2.3.1 + colord: 2.9.2 + diff: 4.0.2 + dom-scroll-into-view: 1.2.1 + inherits: 2.0.4 + lodash: 4.17.21 + react: 17.0.2 + react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + react-easy-crop: 3.5.3_sfoxds7t5ydpegc3knd667wn6m + rememo: 3.0.0 + traverse: 0.6.6 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - react-with-direction + dev: false + /@wordpress/block-editor/9.8.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-zIPqEysaLFJMnVKU/yCoCEBT3Co9xsa4Ow91T/LI94ll3LeWG/pyiX4PSSQNTx74AqbcNO2p79LVON4FLdu+mQ==} engines: {node: '>=12'} @@ -15126,20 +15659,20 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.4.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/keycodes': 3.28.0 '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/warning': 2.6.1 classnames: 2.3.1 colord: 2.9.2 @@ -15180,21 +15713,21 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -15234,21 +15767,21 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -15288,21 +15821,21 @@ packages: '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -15490,11 +16023,11 @@ packages: '@babel/runtime': 7.19.0 '@types/lodash': 4.14.184 '@types/mousetrap': 1.6.9 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 + '@wordpress/keycodes': 3.28.0 '@wordpress/priority-queue': 2.28.0 clipboard: 2.0.10 lodash: 4.17.21 @@ -15502,6 +16035,7 @@ packages: react: 17.0.2 react-resize-aware: 3.1.1_react@17.0.2 use-memo-one: 1.1.2_react@17.0.2 + dev: false /@wordpress/compose/6.5.0_react@17.0.2: resolution: {integrity: sha512-gtZwEeFFHGltsr0vqwyrxPbAcA6lVfE36s59mZBh9KHeC/s590q2FPQz+9jSE5Y+uQmnXZCtahCrjvnpnaBIUg==} @@ -15531,15 +16065,15 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/api-fetch': 6.25.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/html-entities': 3.6.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/url': 3.7.1 + '@wordpress/url': 3.29.0 equivalent-key-map: 0.2.2 lodash: 4.17.21 memize: 1.1.0 @@ -15616,9 +16150,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 react: 17.0.2 dev: false @@ -15673,9 +16207,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.28.0 '@wordpress/priority-queue': 2.28.0 '@wordpress/redux-routine': 4.28.0_redux@4.2.0 @@ -15789,7 +16323,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 + dev: false /@wordpress/dom-ready/3.28.0: resolution: {integrity: sha512-PFFAnuPUouV0uSDZN6G/B8yksybtxzS/6H53OZJEA3h3EsNCicKRMGSowkumvLwXA23HV0K2Kht6JuS+bDECzA==} @@ -15823,6 +16358,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 lodash: 4.17.21 + dev: false /@wordpress/e2e-test-utils/3.0.0_ddjhsfu4aotkh3cuzmpsln6ywq: resolution: {integrity: sha512-XMdR8DeKyDQRF5jKeUlOzP4pTRtoJuOLsNZRLUFUvnrs9y/7/hH17VmPbWp3TJGvV/eGKzO4+D+wJTsP9nJmIw==} @@ -15869,9 +16405,9 @@ packages: puppeteer-core: '>=11' dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/keycodes': 3.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/url': 3.29.0 form-data: 4.0.0 jest: 27.5.1 lodash: 4.17.21 @@ -15881,6 +16417,57 @@ packages: - encoding dev: false + /@wordpress/editor/12.5.10_tufdcic6wklrwyy3rhbsbktylu: + resolution: {integrity: sha512-FEgNLDRAtOjGrXXNUXWucf3zMfM1rWCgc/eQrJFwj0atWGJmqQERvmF4H4jeUO6gqetOHmnko38fLVAnE7QWYw==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@wordpress/a11y': 3.28.0 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/block-editor': 8.6.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/blocks': 11.18.0_react@17.0.2 + '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/core-data': 4.4.5_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 + '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 + '@wordpress/keycodes': 3.28.0 + '@wordpress/media-utils': 3.4.1 + '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/preferences': 1.3.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/reusable-blocks': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/server-side-render': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi + '@wordpress/url': 3.29.0 + '@wordpress/wordcount': 3.28.0 + classnames: 2.3.1 + lodash: 4.17.21 + memize: 1.1.0 + react: 17.0.2 + react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + rememo: 3.0.0 + transitivePeerDependencies: + - '@babel/core' + - '@babel/helper-module-imports' + - '@babel/types' + - '@types/react' + - aslemammad-vite-plugin-macro + - babel-plugin-macros + - react-with-direction + - vite + dev: false + /@wordpress/element/2.20.3: resolution: {integrity: sha512-f4ZPTDf9CxiiOXiMxc4v1K7jcBMT4dsiehVOpkKzCDKboNXp4qVf8oe5PE23VGZNEjcOj5Mkg9hB57R0nqvMTw==} dependencies: @@ -15929,6 +16516,7 @@ packages: lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: false /@wordpress/element/4.8.0: resolution: {integrity: sha512-f2Mb70xvGxZWNWh5pFhOoRgrd+tKs9Xk9hpDgRB7iPel/zbAIxNebr0Jqm5Nt+MDiDl/dogTPc9GyrkYCm9u0g==} @@ -16160,6 +16748,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 + dev: false /@wordpress/html-entities/3.28.0: resolution: {integrity: sha512-UAaU6au8UTrSkowkV33pE/EvdPov2mA9W51vh6t88KsJPzt4171EzIchGnQuzt04HuZLdLyWy2A+7JCOSbfhBA==} @@ -16204,7 +16793,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.17.7 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 @@ -16218,19 +16807,20 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 sprintf-js: 1.1.2 tannin: 1.2.0 + dev: false /@wordpress/icons/8.1.0: resolution: {integrity: sha512-fNq0Mnzzf03uxIwKqQeU/G48wElyypwkhcBZWYQRpmwLZrOR231dxUeK9mzPOSGlYbgM+YKK+k3lzysGmrJU0A==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.4.1 dev: false @@ -16239,8 +16829,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.4.1 - '@wordpress/primitives': 3.4.1 + '@wordpress/element': 4.20.0 + '@wordpress/primitives': 3.26.0 dev: false /@wordpress/icons/8.4.0: @@ -16268,17 +16858,17 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/a11y': 3.28.0 + '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/plugins': 4.4.3_react@17.0.2 '@wordpress/preferences': 1.3.0_tufdcic6wklrwyy3rhbsbktylu - '@wordpress/viewport': 4.4.1_react@17.0.2 + '@wordpress/viewport': 4.17.0_react@17.0.2 classnames: 2.3.1 lodash: 4.17.21 react: 17.0.2 @@ -16460,9 +17050,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/element': 4.4.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/keycodes': 3.28.0 lodash: 4.17.21 react: 17.0.2 rememo: 3.0.0 @@ -16488,7 +17078,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/i18n': 4.6.1 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 dev: false @@ -16497,18 +17087,19 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.6.1 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 + dev: false /@wordpress/media-utils/3.4.1: resolution: {integrity: sha512-WNAaMqqw6Eqy61KTWBy1NlgXSZH82Cm2SPVbz0v6yhJ4ktJmSRFm7Fd4mTMFS/L7NKTxwo+DFqEHlTGKj3lyzQ==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/api-fetch': 6.25.0 '@wordpress/blob': 3.28.0 - '@wordpress/element': 4.4.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 dev: false @@ -16523,6 +17114,17 @@ packages: '@wordpress/data': 7.3.0_react@17.0.2 react: 17.0.2 + /@wordpress/notices/3.28.0_react@17.0.2: + resolution: {integrity: sha512-XftApWHyLlf2vq6FLYiqACoG4CxDsRqc6zQSjOA5UHQooVPbSsbYXl4eadloPtMnJohlzjzvb0SEIafjMyxjCA==} + engines: {node: '>=12'} + dependencies: + '@babel/runtime': 7.19.0 + '@wordpress/a11y': 3.28.0 + '@wordpress/data': 8.5.0_react@17.0.2 + transitivePeerDependencies: + - react + dev: false + /@wordpress/notices/3.6.1_react@17.0.2: resolution: {integrity: sha512-S+hOO+4NJJzaqcqm+XPa6uuvt/pkYjRz20HK3xt8Srb+HjO87D3X5feYGQMxEx5ueJl72+5/uOZwmXKJR4pzog==} engines: {node: '>=12'} @@ -16530,8 +17132,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -16561,10 +17163,10 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/icons': 8.4.0 lodash: 4.17.21 memize: 1.1.0 react: 17.0.2 @@ -16597,7 +17199,7 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - '@wordpress/base-styles': 4.3.1 + '@wordpress/base-styles': 4.8.0 autoprefixer: 10.4.4_postcss@8.4.12 postcss: 8.4.12 dev: false @@ -16697,7 +17299,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 classnames: 2.3.1 dev: false @@ -16775,7 +17377,7 @@ packages: '@wordpress/element': 4.20.0 '@wordpress/i18n': 4.28.0 '@wordpress/icons': 9.19.0 - '@wordpress/notices': 3.19.0_react@17.0.2 + '@wordpress/notices': 3.28.0_react@17.0.2 '@wordpress/url': 3.29.0 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 @@ -16815,13 +17417,13 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/keycodes': 3.28.0 lodash: 4.17.21 memize: 1.1.0 react: 17.0.2 @@ -17029,6 +17631,14 @@ packages: '@babel/runtime': 7.19.0 lodash: 4.17.21 + /@wordpress/style-engine/0.6.0: + resolution: {integrity: sha512-HIHIhlR1ZulA9j7Z5519/bRAo5v9HSJJFx8CBz+b02XhTUWSgYkUerkHL+UhCTWJpnyBNcPeNDrc0xR1xj7HMA==} + engines: {node: '>=12'} + dependencies: + '@babel/runtime': 7.19.0 + lodash: 4.17.21 + dev: false + /@wordpress/style-engine/1.2.0: resolution: {integrity: sha512-RoyTFpxDS7uOJuNG31J/153JLKCNftU1/wMMkf0qXDpP+1k4h9em1+iIPPAGPRW5pSq/ky95fAaQAnl+FgI6Wg==} engines: {node: '>=12'} @@ -17080,6 +17690,13 @@ packages: dependencies: '@babel/runtime': 7.19.0 + /@wordpress/token-list/2.28.0: + resolution: {integrity: sha512-MLe7/Ma5BcFzz62ObRwvNFQakdBHCqNkOHLS/PBmWpDSi4Y9+qvICdEn8Od3d0RkPdjupBdtF1ZBeYoaL04K2Q==} + engines: {node: '>=12'} + dependencies: + '@babel/runtime': 7.19.0 + dev: false + /@wordpress/url/2.22.2_react-native@0.70.0: resolution: {integrity: sha512-aqpYKQXzyzkCOm+GzZRYlLb+wh58g0cwR1PaKAl0UXaBS4mdS+X6biMriylb4P8CVC/RR7CSw5XI20JC24KDwQ==} dependencies: @@ -17102,6 +17719,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 lodash: 4.17.21 + dev: false /@wordpress/viewport/4.17.0_react@17.0.2: resolution: {integrity: sha512-5FZCqXjsZjONoyCfjalRgdme//j4XJYHRXYh7ynoJW/qULq3YqZhyLtjFsEM4V+uuuURFSYnGnOD7V+K9wooPA==} @@ -17123,8 +17741,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.17.7 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -17136,8 +17754,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -17162,6 +17780,7 @@ packages: /@wordpress/warning/2.6.1: resolution: {integrity: sha512-Xs37x0IkvNewPNKs1A8cnw5xLb+AqwUqqCsH4+5Sjat5GDqP86mHgLfRIlE4d6fBYg+q6tO7DVPG49TT3/wzgA==} engines: {node: '>=12'} + dev: false /@wordpress/wordcount/3.19.0: resolution: {integrity: sha512-x5M997RMrglq/XiGi55sO4fIPrGu20bob6h5goc9NKbbq68NTTDPrznfRbhQ+gTLLEV79AtUO/RPK3y9V9Pvkw==} @@ -17169,6 +17788,13 @@ packages: dependencies: '@babel/runtime': 7.19.0 + /@wordpress/wordcount/3.28.0: + resolution: {integrity: sha512-SMgmLGeazocSxNpagXav8/6sRMuldH/EgCPmdXK6SKr4tJb8JbKINW74U208c7IBpRG0GjR+1JNyq6jikT/K4g==} + engines: {node: '>=12'} + dependencies: + '@babel/runtime': 7.19.0 + dev: false + /@xtuc/ieee754/1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -18348,6 +18974,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.16.12: + resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: @@ -18373,19 +19012,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.16.12: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: @@ -19177,7 +19803,7 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001146 + caniuse-lite: 1.0.30001418 electron-to-chromium: 1.4.276 dev: true @@ -19517,13 +20143,14 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.19.3 - caniuse-lite: 1.0.30001146 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001418 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 /caniuse-lite/1.0.30001146: resolution: {integrity: sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==} + dev: true /caniuse-lite/1.0.30001352: resolution: {integrity: sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==} @@ -20542,7 +21169,6 @@ packages: dependencies: browserslist: 4.19.3 semver: 7.0.0 - dev: true /core-js-compat/3.25.5: resolution: {integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==} @@ -22509,9 +23135,9 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -22540,9 +23166,9 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -24279,7 +24905,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 fs-extra: 9.1.0 glob: 7.2.0 memfs: 3.3.0 @@ -24342,7 +24968,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 eslint: 8.32.0 fs-extra: 9.1.0 glob: 7.2.0 @@ -24374,7 +25000,7 @@ packages: chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 fs-extra: 9.1.0 glob: 7.2.0 memfs: 3.3.0 @@ -26022,7 +26648,7 @@ packages: '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym '@babel/runtime': 7.19.0 '@tannin/sprintf': 1.2.0 - '@wordpress/compose': 5.4.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 debug: 4.3.4 events: 3.3.0 hash.js: 1.1.7 @@ -31006,6 +31632,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -32784,7 +33411,7 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 color: 3.2.1 has: 1.0.3 postcss: 7.0.39 @@ -32796,7 +33423,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 colord: 2.9.2 postcss: 8.4.12 @@ -33004,7 +33631,7 @@ packages: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -33017,7 +33644,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 @@ -33071,7 +33698,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.19.3 + browserslist: 4.21.4 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -33083,7 +33710,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 postcss-value-parser: 4.2.0 @@ -33288,7 +33915,7 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -33298,7 +33925,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 8.4.12 postcss-value-parser: 4.2.0 dev: true @@ -33363,7 +33990,7 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 @@ -33374,7 +34001,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 postcss: 8.4.12 dev: true @@ -37162,7 +37789,7 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 7.0.39 postcss-selector-parser: 3.1.2 @@ -37172,7 +37799,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 8.4.12 postcss-selector-parser: 6.0.9 dev: true @@ -39969,7 +40596,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.19.3 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -40008,7 +40635,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.19.3 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -40089,7 +40716,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.19.3 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 From 09581201f2f1035a9d33ca255cfc0060c191b651 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 13 Mar 2023 21:57:42 +0530 Subject: [PATCH 1009/1680] Add changelog. --- plugins/woocommerce/changelog/fix-order-caching | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-order-caching diff --git a/plugins/woocommerce/changelog/fix-order-caching b/plugins/woocommerce/changelog/fix-order-caching new file mode 100644 index 00000000000..4750dc0d5cb --- /dev/null +++ b/plugins/woocommerce/changelog/fix-order-caching @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Restore the sort order when orders are cached. From 2b4ed6fe03d366ead9d8c471c3f0a7e7666847af Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Mon, 13 Mar 2023 11:38:16 -0700 Subject: [PATCH 1010/1680] Add section block for use in product editor (#37153) * Allow json imports in product editor package * Add section block * Init all blocks in product editor * Add section styles and base product editor font styles * Add changelog entry * Handle PR feedback --- .../js/product-editor/changelog/add-37082 | 4 +++ .../src/components/block-editor/style.scss | 11 ++++++++ .../src/components/editor/init-blocks.ts | 2 ++ .../src/components/section/block.json | 26 +++++++++++++++++++ .../src/components/section/edit.tsx | 23 ++++++++++++++++ .../src/components/section/index.ts | 17 ++++++++++++ .../src/components/section/style.scss | 18 +++++++++++++ packages/js/product-editor/src/style.scss | 1 + .../js/product-editor/src/utils/init-block.ts | 26 +++++++++++++++++++ packages/js/product-editor/tsconfig-cjs.json | 2 +- packages/js/product-editor/tsconfig.json | 13 +++++----- 11 files changed, 136 insertions(+), 7 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37082 create mode 100644 packages/js/product-editor/src/components/section/block.json create mode 100644 packages/js/product-editor/src/components/section/edit.tsx create mode 100644 packages/js/product-editor/src/components/section/index.ts create mode 100644 packages/js/product-editor/src/components/section/style.scss create mode 100644 packages/js/product-editor/src/utils/init-block.ts diff --git a/packages/js/product-editor/changelog/add-37082 b/packages/js/product-editor/changelog/add-37082 new file mode 100644 index 00000000000..dee06510579 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37082 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add section block for use in product editor diff --git a/packages/js/product-editor/src/components/block-editor/style.scss b/packages/js/product-editor/src/components/block-editor/style.scss index cdfe74be165..370cc746b31 100644 --- a/packages/js/product-editor/src/components/block-editor/style.scss +++ b/packages/js/product-editor/src/components/block-editor/style.scss @@ -1,4 +1,15 @@ .woocommerce-product-block-editor { + h1, + h2, + h3, + h4, + h5, + h6, + p, + input { + font-family: var(--wp--preset--font-family--system-font); + } + .editor-styles-wrapper { max-width: 650px; margin-left: auto; diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index b7e3584fbe1..c3bdb46bd9f 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -2,7 +2,9 @@ * Internal dependencies */ import { init as initName } from '../details-name-block'; +import { init as initSection } from '../section'; export const initBlocks = () => { initName(); + initSection(); }; diff --git a/packages/js/product-editor/src/components/section/block.json b/packages/js/product-editor/src/components/section/block.json new file mode 100644 index 00000000000..b11a9f91fd3 --- /dev/null +++ b/packages/js/product-editor/src/components/section/block.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-section", + "title": "Product section", + "category": "woocommerce", + "description": "The product section.", + "keywords": [ "products", "section", "group" ], + "textdomain": "default", + "attributes": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": false, + "reusable": false, + "inserter": false, + "lock": false + } +} diff --git a/packages/js/product-editor/src/components/section/edit.tsx b/packages/js/product-editor/src/components/section/edit.tsx new file mode 100644 index 00000000000..7a46d9ae566 --- /dev/null +++ b/packages/js/product-editor/src/components/section/edit.tsx @@ -0,0 +1,23 @@ +/** + * External dependencies + */ +import { createElement } from '@wordpress/element'; +import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; +import type { BlockAttributes } from '@wordpress/blocks'; + +export function Edit( { attributes }: { attributes: BlockAttributes } ) { + const blockProps = useBlockProps(); + const { description, title } = attributes; + + return ( +
    +

    + { title } +

    +

    + { description } +

    + +
    + ); +} diff --git a/packages/js/product-editor/src/components/section/index.ts b/packages/js/product-editor/src/components/section/index.ts new file mode 100644 index 00000000000..15144b2b28d --- /dev/null +++ b/packages/js/product-editor/src/components/section/index.ts @@ -0,0 +1,17 @@ +/** + * Internal dependencies + */ +import initBlock from '../../utils/init-block'; +import metadata from './block.json'; +import { Edit } from './edit'; + +const { name } = metadata; + +export { metadata, name }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export const init = () => initBlock( { name, metadata, settings } ); diff --git a/packages/js/product-editor/src/components/section/style.scss b/packages/js/product-editor/src/components/section/style.scss new file mode 100644 index 00000000000..d3341c04f49 --- /dev/null +++ b/packages/js/product-editor/src/components/section/style.scss @@ -0,0 +1,18 @@ +.wp-block-woocommerce-product-section { + margin-top: 48px; + + &__title { + margin-top: 0; + margin-bottom: $gap-small; + font-size: 24px; + font-weight: 500; + color: $gray-900; + } + + &__description { + margin-top: $gap-small; + margin-bottom: 32px; + font-size: 13px; + color: $gray-700; + } +} \ No newline at end of file diff --git a/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index 9d74dd658c9..6ec6591af40 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -5,3 +5,4 @@ @import 'components/details-categories-field/create-category-modal.scss'; @import 'components/header/style.scss'; @import 'components/block-editor/style.scss'; +@import 'components/section/style.scss'; diff --git a/packages/js/product-editor/src/utils/init-block.ts b/packages/js/product-editor/src/utils/init-block.ts new file mode 100644 index 00000000000..55a8276f7b5 --- /dev/null +++ b/packages/js/product-editor/src/utils/init-block.ts @@ -0,0 +1,26 @@ +/** + * External dependencies + */ +import { BlockConfiguration, registerBlockType } from '@wordpress/blocks'; + +type BlockRepresentation = { + name: string; + metadata: BlockConfiguration; + settings: Partial< BlockConfiguration >; +}; + +/** + * Function to register an individual block. + * + * @param {Object} block The block to be registered. + * + * @return {?WPBlockType} The block, if it has been successfully registered; + * otherwise `undefined`. + */ +export default function initBlock( block: BlockRepresentation ) { + if ( ! block ) { + return; + } + const { metadata, settings, name } = block; + return registerBlockType( { name, ...metadata }, settings ); +} diff --git a/packages/js/product-editor/tsconfig-cjs.json b/packages/js/product-editor/tsconfig-cjs.json index 6af863da44e..5257768d6b4 100644 --- a/packages/js/product-editor/tsconfig-cjs.json +++ b/packages/js/product-editor/tsconfig-cjs.json @@ -6,6 +6,6 @@ ], "compilerOptions": { "outDir": "build", - "resolveJsonModule": true, + "resolveJsonModule": true } } diff --git a/packages/js/product-editor/tsconfig.json b/packages/js/product-editor/tsconfig.json index 76051e1535c..14d0526e858 100644 --- a/packages/js/product-editor/tsconfig.json +++ b/packages/js/product-editor/tsconfig.json @@ -1,15 +1,16 @@ { "extends": "../tsconfig", - "include": [ - "**/*", - "src/**/*.json" - ], "compilerOptions": { "rootDir": "src", "outDir": "build-module", "declaration": true, "declarationMap": true, "declarationDir": "./build-types", - "resolveJsonModule": true, - } + "resolveJsonModule": true + }, + "include": [ + "**/*.d.ts", + "src/**/*", + "src/**/*.json" + ] } From 5a58784a620a80a373d1b5caf42d77d6a02340b1 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Tue, 14 Mar 2023 03:32:54 +0800 Subject: [PATCH 1011/1680] Specify empty array as invalidateResolution and hasFinishedResolution args. This is to make things work with WP 5.9. --- .../client/marketing/hooks/useRegisteredChannels.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useRegisteredChannels.ts b/plugins/woocommerce-admin/client/marketing/hooks/useRegisteredChannels.ts index bafbd5b6f2e..199bdd584b1 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useRegisteredChannels.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useRegisteredChannels.ts @@ -63,7 +63,7 @@ export const useRegisteredChannels = (): UseRegisteredChannels => { const { invalidateResolution } = useDispatch( STORE_KEY ); const refetch = useCallback( () => { - invalidateResolution( 'getRegisteredChannels' ); + invalidateResolution( 'getRegisteredChannels', [] ); }, [ invalidateResolution ] ); return useSelect( ( select ) => { @@ -72,7 +72,7 @@ export const useRegisteredChannels = (): UseRegisteredChannels => { const state = getRegisteredChannels< RegisteredChannelsState >(); return { - loading: ! hasFinishedResolution( 'getRegisteredChannels' ), + loading: ! hasFinishedResolution( 'getRegisteredChannels', [] ), data: state.data?.map( convert ), error: state.error, refetch, From 0316fbb265f007d85683481e9c7b4de5b39c03e7 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Tue, 14 Mar 2023 03:35:20 +0800 Subject: [PATCH 1012/1680] Specify empty array as hasFinishedResolution args. This is to make things consistent with invalidateResolution to make things work with WP 5.9. --- .../client/marketing/hooks/useRecommendedChannels.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useRecommendedChannels.ts b/plugins/woocommerce-admin/client/marketing/hooks/useRecommendedChannels.ts index 0e69e63e2eb..babc45e6cbe 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useRecommendedChannels.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useRecommendedChannels.ts @@ -40,7 +40,7 @@ export const useRecommendedChannels = (): UseRecommendedChannels => { } ); return { - loading: ! hasFinishedResolution( 'getRecommendedChannels' ), + loading: ! hasFinishedResolution( 'getRecommendedChannels', [] ), data: nonActiveRecommendedChannels, error, }; From 580e3a8c36c9445ed25a498f1a6d00b59e1f0518 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Tue, 14 Mar 2023 03:39:34 +0800 Subject: [PATCH 1013/1680] Add changelog. --- .../changelog/feature-37176-specify-wp-data-resolution-args | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args diff --git a/plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args b/plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args new file mode 100644 index 00000000000..2224143fc8e --- /dev/null +++ b/plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix WP data resolution (`invalidateResolution`) not working with WP 5.9 in marketing page. From b1a0d3177c35d2f25f85befd3aacc3c71fe6f6b3 Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Mon, 13 Mar 2023 18:26:51 -0300 Subject: [PATCH 1014/1680] Show message in Inventory tab for variable products (#37185) * Add message to inventory tab * Add styles * Add changelog * Fix link styles * Fix message style without buttons * Avoid line break * Remove space --------- Co-authored-by: Fernando Marichal --- .../changelog/dev-37119_show_message_for_variable_products | 4 ++++ plugins/woocommerce/client/legacy/css/admin.scss | 7 +++++++ .../admin/meta-boxes/views/html-product-data-inventory.php | 6 +++++- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products diff --git a/plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products b/plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products new file mode 100644 index 00000000000..859ac60349f --- /dev/null +++ b/plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Show a message for variable products diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index 8e07798ded9..d6f3bc4a92c 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -959,11 +959,18 @@ } #variable_product_options #message, +#inventory_product_data .notice, #variable_product_options .notice { display: flex; margin: 10px; background-color: #ffffff; > p { + a { + text-decoration: none; + white-space: nowrap; + } + } + > p:not( :last-child ) { width: 85%; } .woocommerce-add-variation-price-container { diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php index 7dc64ad29f1..952e063cd07 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -10,7 +10,11 @@ if ( ! defined( 'ABSPATH' ) ) { } ?>
    - - setValue( - 'attributes[' + - index + - '].terms', + { attribute === null || + attribute.id !== 0 ? ( + + ) => + setValue( + 'attributes[' + + index + + '].terms', + val + ) + } + /> + ) : ( + + setValue( + 'attributes[' + + index + + '].options', + val + ) + } + /> + ) } + ), __experimentalSelectControl: ( { children, items, @@ -45,7 +56,9 @@ jest.mock( '@woocommerce/components', () => { isOpen: boolean; items: QueryProductAttribute[]; getMenuProps: () => Record< string, string >; - getItemProps: () => Record< string, string >; + getItemProps: ( options: { item: QueryProductAttribute } ) => { + onClick: () => void; + }; } ) => JSX.Element; items: QueryProductAttribute[]; onSelect: ( item: QueryProductAttribute ) => void; @@ -63,9 +76,6 @@ jest.mock( '@woocommerce/components', () => { - @@ -74,7 +84,13 @@ jest.mock( '@woocommerce/components', () => { isOpen: true, items: getFilteredItems( items, input, [] ), getMenuProps: () => ( {} ), - getItemProps: () => ( {} ), + getItemProps: ( { + item, + }: { + item: QueryProductAttribute; + } ) => ( { + onClick: () => onSelect( item ), + } ), } ) } @@ -203,7 +219,7 @@ describe( 'AttributeInputField', () => { const { queryByText } = render( ); - queryByText( 'select attribute' )?.click(); + queryByText( attributeList[ 0 ].name )?.click(); expect( onChangeMock ).toHaveBeenCalledWith( { id: attributeList[ 0 ].id, name: attributeList[ 0 ].name, @@ -223,4 +239,30 @@ describe( 'AttributeInputField', () => { queryByText( 'remove attribute' )?.click(); expect( onChangeMock ).toHaveBeenCalledWith(); } ); + + it( 'should show the create option when the search value does not match any attributes', () => { + ( useSelect as jest.Mock ).mockReturnValue( { + isLoading: false, + attributes: [ attributeList[ 0 ] ], + } ); + const { queryByText } = render( + + ); + queryByText( 'Update Input' )?.click(); + expect( queryByText( 'Create "Co"' ) ).toBeInTheDocument(); + } ); + + it( 'trigger the onChange callback when the create new value is clicked with only a string', async () => { + const onChangeMock = jest.fn(); + ( useSelect as jest.Mock ).mockReturnValue( { + isLoading: false, + attributes: [ attributeList[ 0 ] ], + } ); + const { queryByText } = render( + + ); + queryByText( 'Update Input' )?.click(); + queryByText( 'Create "Co"' )?.click(); + expect( onChangeMock ).toHaveBeenCalledWith( 'Co' ); + } ); } ); diff --git a/plugins/woocommerce/changelog/add-34331_create_attribute b/plugins/woocommerce/changelog/add-34331_create_attribute new file mode 100644 index 00000000000..c433275887b --- /dev/null +++ b/plugins/woocommerce/changelog/add-34331_create_attribute @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add new option to create new attribute within add attribute modal. From ee64675fa54c519d1485781ce95a0855047b838e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 21 Nov 2022 09:50:20 -0800 Subject: [PATCH 0102/1680] Prepare Packages for Release (#35655) Automated change: Prep @woocommerce/extend-cart-checkout-block for release. Co-authored-by: opr --- packages/js/extend-cart-checkout-block/CHANGELOG.md | 12 ++++++++++-- .../changelog/add-inner-block-example | 4 ---- .../changelog/dev-bump-pnpm-version-restraint | 4 ---- .../changelog/dev-fix-pnpm-version-engines | 4 ---- .../changelog/dev-simplify-turbo | 5 ----- .../changelog/fix-changelogger-phpcs | 5 ----- packages/js/extend-cart-checkout-block/package.json | 2 +- 7 files changed, 11 insertions(+), 25 deletions(-) delete mode 100644 packages/js/extend-cart-checkout-block/changelog/add-inner-block-example delete mode 100644 packages/js/extend-cart-checkout-block/changelog/dev-bump-pnpm-version-restraint delete mode 100644 packages/js/extend-cart-checkout-block/changelog/dev-fix-pnpm-version-engines delete mode 100644 packages/js/extend-cart-checkout-block/changelog/dev-simplify-turbo delete mode 100644 packages/js/extend-cart-checkout-block/changelog/fix-changelogger-phpcs diff --git a/packages/js/extend-cart-checkout-block/CHANGELOG.md b/packages/js/extend-cart-checkout-block/CHANGELOG.md index 1f5690e3cb9..ade90a4603f 100644 --- a/packages/js/extend-cart-checkout-block/CHANGELOG.md +++ b/packages/js/extend-cart-checkout-block/CHANGELOG.md @@ -1,7 +1,15 @@ -# Changelog +# Changelog This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [1.0.0](https://www.npmjs.com/package/@woocommerce/extend-cart-checkout-block/v/1.0.0) - 2022-06-01 +## [1.1.0](https://www.npmjs.com/package/@woocommerce/extend-cart-checkout-block/v/1.1.0) - 2022-11-21 + +- Patch - Include an example of adding an inner block to the WooCommerce Blocks Checkout Block [#35609] +- Minor - Fix node and pnpm versions via engines [#35609] +- Minor - Update pnpm version constraint to 7.13.3 to avoid auto-install-peers issues [#35609] + +## [1.0.0](https://www.npmjs.com/package/@woocommerce/extend-cart-checkout-block/v/1.0.0) - 2022-06-01 - Patch - Initial release + +[See legacy changelogs for previous versions](https://github.com/woocommerce/woocommerce/blob/68581955106947918d2b17607a01bdfdf22288a9/packages/js/extend-cart-checkout-block/CHANGELOG.md). diff --git a/packages/js/extend-cart-checkout-block/changelog/add-inner-block-example b/packages/js/extend-cart-checkout-block/changelog/add-inner-block-example deleted file mode 100644 index 1a22ae4197f..00000000000 --- a/packages/js/extend-cart-checkout-block/changelog/add-inner-block-example +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Include an example of adding an inner block to the WooCommerce Blocks Checkout Block diff --git a/packages/js/extend-cart-checkout-block/changelog/dev-bump-pnpm-version-restraint b/packages/js/extend-cart-checkout-block/changelog/dev-bump-pnpm-version-restraint deleted file mode 100644 index f7511cb6974..00000000000 --- a/packages/js/extend-cart-checkout-block/changelog/dev-bump-pnpm-version-restraint +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Update pnpm version constraint to 7.13.3 to avoid auto-install-peers issues diff --git a/packages/js/extend-cart-checkout-block/changelog/dev-fix-pnpm-version-engines b/packages/js/extend-cart-checkout-block/changelog/dev-fix-pnpm-version-engines deleted file mode 100644 index a1804a282f0..00000000000 --- a/packages/js/extend-cart-checkout-block/changelog/dev-fix-pnpm-version-engines +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Fix node and pnpm versions via engines diff --git a/packages/js/extend-cart-checkout-block/changelog/dev-simplify-turbo b/packages/js/extend-cart-checkout-block/changelog/dev-simplify-turbo deleted file mode 100644 index 0d230384010..00000000000 --- a/packages/js/extend-cart-checkout-block/changelog/dev-simplify-turbo +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: dev -Comment: Package scripts were modified to support simplified running of turbo commands in the monorepo. - - diff --git a/packages/js/extend-cart-checkout-block/changelog/fix-changelogger-phpcs b/packages/js/extend-cart-checkout-block/changelog/fix-changelogger-phpcs deleted file mode 100644 index 10fdefc7d22..00000000000 --- a/packages/js/extend-cart-checkout-block/changelog/fix-changelogger-phpcs +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: dev -Comment: PHPCS violation fixes - - diff --git a/packages/js/extend-cart-checkout-block/package.json b/packages/js/extend-cart-checkout-block/package.json index c60e8220d88..0d7ff7db5ef 100644 --- a/packages/js/extend-cart-checkout-block/package.json +++ b/packages/js/extend-cart-checkout-block/package.json @@ -1,6 +1,6 @@ { "name": "@woocommerce/extend-cart-checkout-block", - "version": "1.0.0", + "version": "1.1.0", "description": "", "main": "index.js", "engines": { From 4770123fa3a71cf4c561fa6149685c67d0778ee4 Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Mon, 21 Nov 2022 12:05:26 -0800 Subject: [PATCH 0103/1680] Add pre build script to delete assets (#35627) * Add pre build script to delete assets * Chain the script instead * Add the cleanup dependency to turbo config * Add assets cleanup for build zip command --- plugins/woocommerce/changelog/add-pre-build | 3 +++ plugins/woocommerce/package.json | 1 + turbo.json | 14 ++++++++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-pre-build diff --git a/plugins/woocommerce/changelog/add-pre-build b/plugins/woocommerce/changelog/add-pre-build new file mode 100644 index 00000000000..c005b3ed18b --- /dev/null +++ b/plugins/woocommerce/changelog/add-pre-build @@ -0,0 +1,3 @@ +Significance: patch +Type: dev +Comment: Adds pre build script to first delete asset items. diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index 6d37a7356fb..65b78a811f4 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -19,6 +19,7 @@ "postinstall": "composer install", "changelog": "composer exec -- changelogger", "build": "pnpm -w exec turbo run turbo:build --filter=$npm_package_name", + "build:assets-cleanup": "find ./assets/css/. ! -name '.gitkeep' -type f -exec rm -f {} + && find ./assets/client/. ! -name '.gitkeep' -type f -exec rm -f {} + && find ./assets/js/. ! -name '.gitkeep' -type f -exec rm -f {} +", "test": "pnpm -w exec turbo run turbo:test --filter=$npm_package_name", "lint": "pnpm lint:php", "build:feature-config": "php bin/generate-feature-config.php", diff --git a/turbo.json b/turbo.json index a43c31b740a..b4d6a027677 100644 --- a/turbo.json +++ b/turbo.json @@ -4,8 +4,11 @@ "build:feature-config": { "cache": false }, + "build:assets-cleanup": { + "cache": false + }, "turbo:build": { - "dependsOn": [ "build:feature-config", "^turbo:build", "$WC_ADMIN_PHASE" ], + "dependsOn": [ "build:feature-config", "build:assets-cleanup", "^turbo:build", "$WC_ADMIN_PHASE" ], "inputs": [ "src/**/*.js", "src/**/*.jsx", @@ -27,6 +30,7 @@ "woocommerce#turbo:build": { "dependsOn": [ "build:feature-config", + "build:assets-cleanup", "^turbo:build", "woocommerce/client/admin#turbo:build", "woocommerce/client/legacy#turbo:build" @@ -39,8 +43,14 @@ "outputMode": "new-only" }, + "woocommerce#build:zip": { + "dependsOn": [ + "^build:assets-cleanup" + ] + }, + "woocommerce/client/legacy#turbo:build": { - "dependsOn": [ "^turbo:build" ], + "dependsOn": [ "build:assets-cleanup", "^turbo:build" ], "outputs": [ "../../assets/js/**", "../../assets/css/**" From 03dbab0edd03bd3dcbedc8a9a82049e33040edc9 Mon Sep 17 00:00:00 2001 From: Sam Seay Date: Tue, 22 Nov 2022 12:06:47 +1300 Subject: [PATCH 0104/1680] Fix some bugs in syncpack configuration (#35651) * Fix syncpack config * Loosen the matched version for typescript eslint * Add changelog entries * Update lockfile --- .syncpackrc | 19 +- package.json | 2 +- .../admin-e2e-tests/changelog/dev-adjust-sync | 5 + packages/js/admin-e2e-tests/package.json | 2 +- packages/js/api/changelog/dev-adjust-sync | 5 + packages/js/api/package.json | 4 +- .../js/components/changelog/dev-adjust-sync | 5 + packages/js/components/package.json | 2 +- packages/js/data/changelog/dev-adjust-sync | 4 + packages/js/data/package.json | 2 +- packages/js/e2e-utils/package.json | 4 +- packages/js/explat/changelog/dev-adjust-sync | 4 + packages/js/explat/package.json | 2 +- plugins/woocommerce-admin/package.json | 6 +- plugins/woocommerce/changelog/dev-adjust-sync | 5 + plugins/woocommerce/package.json | 6 +- pnpm-lock.yaml | 1793 ++++++++--------- 17 files changed, 873 insertions(+), 997 deletions(-) create mode 100644 packages/js/admin-e2e-tests/changelog/dev-adjust-sync create mode 100644 packages/js/api/changelog/dev-adjust-sync create mode 100644 packages/js/components/changelog/dev-adjust-sync create mode 100644 packages/js/data/changelog/dev-adjust-sync create mode 100644 packages/js/explat/changelog/dev-adjust-sync create mode 100644 plugins/woocommerce/changelog/dev-adjust-sync diff --git a/.syncpackrc b/.syncpackrc index c5aa34c3f4b..4ec2e4ff05e 100644 --- a/.syncpackrc +++ b/.syncpackrc @@ -1,6 +1,6 @@ { "dev": true, - "filter": "^(?:react|react-dom|typescript)$", + "filter": "^(?:react|react-dom|typescript|@typescript-eslint|@types/react).*$", "indent": "\t", "overrides": true, "peer": true, @@ -13,7 +13,22 @@ "dependencies": [ "@typescript-eslint/**" ], - "pinVersion": "latest", + "dependencyTypes": [ + "devDependencies" + ], + "pinVersion": "^5.43.0", + "packages": [ + "**" + ] + }, + { + "dependencies": [ + "@types/react" + ], + "dependencyTypes": [ + "devDependencies" + ], + "pinVersion": "^17.0.2", "packages": [ "**" ] diff --git a/package.json b/package.json index 221c042fa0a..56b3481ca33 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "request": "^2.88.2", "sass": "^1.49.9", "sass-loader": "^10.2.1", - "syncpack": "^8.2.4", + "syncpack": "^8.3.9", "turbo": "^1.4.5", "typescript": "^4.8.3", "url-loader": "^1.1.2", diff --git a/packages/js/admin-e2e-tests/changelog/dev-adjust-sync b/packages/js/admin-e2e-tests/changelog/dev-adjust-sync new file mode 100644 index 00000000000..f11d1e352f4 --- /dev/null +++ b/packages/js/admin-e2e-tests/changelog/dev-adjust-sync @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Dev dependency bump + + diff --git a/packages/js/admin-e2e-tests/package.json b/packages/js/admin-e2e-tests/package.json index 1db0d4e9689..93926703248 100644 --- a/packages/js/admin-e2e-tests/package.json +++ b/packages/js/admin-e2e-tests/package.json @@ -41,7 +41,7 @@ "@types/config": "0.0.41", "@types/expect-puppeteer": "^4.4.7", "@types/puppeteer": "^5.4.5", - "@typescript-eslint/eslint-plugin": "^5.14.0", + "@typescript-eslint/eslint-plugin": "^5.43.0", "@woocommerce/api": "^0.2.0", "@woocommerce/eslint-plugin": "workspace:*", "eslint": "^8.12.0", diff --git a/packages/js/api/changelog/dev-adjust-sync b/packages/js/api/changelog/dev-adjust-sync new file mode 100644 index 00000000000..f11d1e352f4 --- /dev/null +++ b/packages/js/api/changelog/dev-adjust-sync @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Dev dependency bump + + diff --git a/packages/js/api/package.json b/packages/js/api/package.json index 588449eeb8d..b88f65e0018 100644 --- a/packages/js/api/package.json +++ b/packages/js/api/package.json @@ -51,8 +51,8 @@ "@types/create-hmac": "1.1.0", "@types/jest": "^27.4.1", "@types/node": "13.13.5", - "@typescript-eslint/eslint-plugin": "^5.3.1", - "@typescript-eslint/parser": "^5.3.1", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", "@woocommerce/eslint-plugin": "workspace:*", "axios-mock-adapter": "^1.20.0", "eslint": "^8.2.0", diff --git a/packages/js/components/changelog/dev-adjust-sync b/packages/js/components/changelog/dev-adjust-sync new file mode 100644 index 00000000000..f11d1e352f4 --- /dev/null +++ b/packages/js/components/changelog/dev-adjust-sync @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Dev dependency bump + + diff --git a/packages/js/components/package.json b/packages/js/components/package.json index 2a07a218727..6067f5a04d3 100644 --- a/packages/js/components/package.json +++ b/packages/js/components/package.json @@ -114,7 +114,7 @@ "@testing-library/user-event": "^13.5.0", "@types/jest": "^27.4.1", "@types/lodash": "^4.14.184", - "@types/react": "^17.0.0", + "@types/react": "^17.0.2", "@types/testing-library__jest-dom": "^5.14.3", "@types/wordpress__components": "^19.10.1", "@types/wordpress__data": "^6.0.0", diff --git a/packages/js/data/changelog/dev-adjust-sync b/packages/js/data/changelog/dev-adjust-sync new file mode 100644 index 00000000000..395bc6d8d2d --- /dev/null +++ b/packages/js/data/changelog/dev-adjust-sync @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Dev dependency bump diff --git a/packages/js/data/package.json b/packages/js/data/package.json index 5dfa2234cd3..cd803090447 100644 --- a/packages/js/data/package.json +++ b/packages/js/data/package.json @@ -57,7 +57,7 @@ "@types/lodash": "^4.14.182", "@types/md5": "^2.3.2", "@types/qs": "^6.9.7", - "@types/react": "^17.0.0", + "@types/react": "^17.0.2", "@types/wordpress__compose": "^4.0.1", "@types/wordpress__core-data": "^2.4.5", "@types/wordpress__data": "^6.0.0", diff --git a/packages/js/e2e-utils/package.json b/packages/js/e2e-utils/package.json index e95728acd7c..d643cdc4553 100644 --- a/packages/js/e2e-utils/package.json +++ b/packages/js/e2e-utils/package.json @@ -30,8 +30,8 @@ "@babel/plugin-transform-runtime": "^7.16.4", "@babel/polyfill": "7.12.1", "@babel/preset-env": "7.12.7", - "@typescript-eslint/eslint-plugin": "^5.3.0", - "@typescript-eslint/parser": "^5.3.0", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", "@woocommerce/eslint-plugin": "workspace:*", "@woocommerce/internal-e2e-builds": "workspace:*", "@wordpress/babel-plugin-import-jsx-pragma": "1.1.3", diff --git a/packages/js/explat/changelog/dev-adjust-sync b/packages/js/explat/changelog/dev-adjust-sync new file mode 100644 index 00000000000..395bc6d8d2d --- /dev/null +++ b/packages/js/explat/changelog/dev-adjust-sync @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Dev dependency bump diff --git a/packages/js/explat/package.json b/packages/js/explat/package.json index 918ebf45f47..1546a3faded 100644 --- a/packages/js/explat/package.json +++ b/packages/js/explat/package.json @@ -43,7 +43,7 @@ "@types/jest": "^27.4.1", "@types/node": "^17.0.21", "@types/qs": "^6.9.7", - "@types/react": "^17.0.0", + "@types/react": "^17.0.2", "@woocommerce/eslint-plugin": "workspace:*", "eslint": "^8.12.0", "jest": "^27.5.1", diff --git a/plugins/woocommerce-admin/package.json b/plugins/woocommerce-admin/package.json index 3a602997d23..797c9592aae 100644 --- a/plugins/woocommerce-admin/package.json +++ b/plugins/woocommerce-admin/package.json @@ -121,7 +121,7 @@ "@types/lodash": "^4.14.179", "@types/puppeteer": "^4.0.2", "@types/qs": "^6.9.7", - "@types/react": "^17.0.0", + "@types/react": "^17.0.2", "@types/react-router-dom": "^5.3.3", "@types/react-transition-group": "^4.4.4", "@types/testing-library__jest-dom": "^5.14.3", @@ -132,8 +132,8 @@ "@types/wordpress__media-utils": "^3.0.0", "@types/wordpress__notices": "^3.3.0", "@types/wordpress__plugins": "^3.0.0", - "@typescript-eslint/eslint-plugin": "^5.14.0", - "@typescript-eslint/parser": "^5.14.0", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", "@woocommerce/admin-e2e-tests": "workspace:*", "@woocommerce/components": "workspace:*", "@woocommerce/csv-export": "workspace:*", diff --git a/plugins/woocommerce/changelog/dev-adjust-sync b/plugins/woocommerce/changelog/dev-adjust-sync new file mode 100644 index 00000000000..f11d1e352f4 --- /dev/null +++ b/plugins/woocommerce/changelog/dev-adjust-sync @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Dev dependency bump + + diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index 65b78a811f4..863748b8d9f 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -52,9 +52,9 @@ "@babel/preset-env": "7.12.7", "@babel/register": "7.12.1", "@playwright/test": "^1.27.1", - "@typescript-eslint/eslint-plugin": "3.10.1", - "@typescript-eslint/experimental-utils": "3.10.1", - "@typescript-eslint/parser": "3.10.1", + "@typescript-eslint/eslint-plugin": "^5.43.0", + "@typescript-eslint/experimental-utils": "^5.43.0", + "@typescript-eslint/parser": "^5.43.0", "@woocommerce/admin-e2e-tests": "workspace:*", "@woocommerce/api": "workspace:*", "@woocommerce/api-core-tests": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 178406855ec..b16673f96a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,7 +33,7 @@ importers: request: ^2.88.2 sass: ^1.49.9 sass-loader: ^10.2.1 - syncpack: ^8.2.4 + syncpack: ^8.3.9 turbo: ^1.4.5 typescript: ^4.8.3 url-loader: ^1.1.2 @@ -71,7 +71,7 @@ importers: request: 2.88.2 sass: 1.49.9 sass-loader: 10.2.1_sass@1.49.9+webpack@5.70.0 - syncpack: 8.2.4 + syncpack: 8.3.9 turbo: 1.4.5 typescript: 4.8.4 url-loader: 1.1.2_webpack@5.70.0 @@ -85,7 +85,7 @@ importers: '@types/expect-puppeteer': ^4.4.7 '@types/jest': ^27.4.1 '@types/puppeteer': ^5.4.5 - '@typescript-eslint/eslint-plugin': ^5.14.0 + '@typescript-eslint/eslint-plugin': ^5.43.0 '@woocommerce/api': ^0.2.0 '@woocommerce/e2e-environment': ^0.2.3 || ^0.3.0 '@woocommerce/e2e-utils': workspace:* @@ -111,7 +111,7 @@ importers: '@types/config': 0.0.41 '@types/expect-puppeteer': 4.4.7 '@types/puppeteer': 5.4.5 - '@typescript-eslint/eslint-plugin': 5.15.0_xhv7vhm4msfiao5lib4vwcn6oe + '@typescript-eslint/eslint-plugin': 5.43.0_77yfnzmbnonej4k3inkgdy4i5u '@woocommerce/api': link:../api '@woocommerce/eslint-plugin': link:../eslint-plugin eslint: 8.12.0 @@ -127,8 +127,8 @@ importers: '@types/create-hmac': 1.1.0 '@types/jest': ^27.4.1 '@types/node': 13.13.5 - '@typescript-eslint/eslint-plugin': ^5.3.1 - '@typescript-eslint/parser': ^5.3.1 + '@typescript-eslint/eslint-plugin': ^5.43.0 + '@typescript-eslint/parser': ^5.43.0 '@woocommerce/eslint-plugin': workspace:* axios: ^0.24.0 axios-mock-adapter: ^1.20.0 @@ -146,8 +146,8 @@ importers: '@types/create-hmac': 1.1.0 '@types/jest': 27.4.1 '@types/node': 13.13.5 - '@typescript-eslint/eslint-plugin': 5.4.0_kjzl6vykamck3qhbtczztvmj4q - '@typescript-eslint/parser': 5.4.0_yd7pksmmyt33nzyuulu63alu3m + '@typescript-eslint/eslint-plugin': 5.43.0_72qpevtmaezorvyo7j2xoo37sy + '@typescript-eslint/parser': 5.43.0_yd7pksmmyt33nzyuulu63alu3m '@woocommerce/eslint-plugin': link:../eslint-plugin axios-mock-adapter: 1.20.0_axios@0.24.0 eslint: 8.2.0 @@ -203,7 +203,7 @@ importers: '@testing-library/user-event': ^13.5.0 '@types/jest': ^27.4.1 '@types/lodash': ^4.14.184 - '@types/react': ^17.0.0 + '@types/react': ^17.0.2 '@types/testing-library__jest-dom': ^5.14.3 '@types/wordpress__block-editor': ^7.0.0 '@types/wordpress__block-library': ^2.6.1 @@ -281,8 +281,8 @@ importers: webpack-cli: ^3.3.12 dependencies: '@automattic/calypso-color-schemes': 2.1.1 - '@automattic/interpolate-components': 1.2.1_adlholpkqbiq5amp2fy4vkqcli - '@automattic/tour-kit': 1.1.1_ewcciyhsqon3yluv5ntlvxyvvm + '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym + '@automattic/tour-kit': 1.1.1_febotzggui25pdagwq3ufufntu '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__block-library': 2.6.1 '@types/wordpress__blocks': 11.0.7_sfoxds7t5ydpegc3knd667wn6m @@ -294,10 +294,10 @@ importers: '@woocommerce/navigation': link:../navigation '@wordpress/a11y': 3.5.0 '@wordpress/api-fetch': 6.1.1 - '@wordpress/block-editor': 9.8.0_67fiyx7k2wr2ple2yfldahug5u - '@wordpress/block-library': 7.16.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/block-editor': 9.8.0_vcke6catv4iqpjdw24uwvlzyyi + '@wordpress/block-library': 7.16.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 19.6.1_lxraipvdfcmyzw3sdzk3k7kygu + '@wordpress/components': 19.6.1_tufdcic6wklrwyy3rhbsbktylu '@wordpress/compose': 5.2.1_react@17.0.2 '@wordpress/core-data': 4.2.1_react@17.0.2 '@wordpress/data': 6.15.0_react@17.0.2 @@ -339,17 +339,17 @@ importers: devDependencies: '@babel/core': 7.17.8 '@babel/runtime': 7.17.7 - '@storybook/addon-actions': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/addon-actions': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@storybook/addon-console': 1.2.3_kthckm6zfmobggl2ahqbjihlce - '@storybook/addon-controls': 6.4.19_gfhwku24kap2smxuljffrvlkli - '@storybook/addon-docs': 6.4.19_wid2s3qa6h7hly5p3fziamwama + '@storybook/addon-controls': 6.4.19_3mpzmuykh5ctyyi3r2d2agoucu + '@storybook/addon-docs': 6.4.19_fzsnscfffpgd4jw4kgkdqz7wca '@storybook/addon-knobs': 6.4.0_nu75ilgc3qugomjhuwv2hk42im '@storybook/addon-links': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@storybook/core-events': 6.4.19 - '@storybook/react': 6.4.19_djfxmhhjm73jktbwxvrsayga4a + '@storybook/react': 6.4.19_hyxuuzpmppcxva5upf6kk6zg4m '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@testing-library/dom': 8.11.3 '@testing-library/jest-dom': 5.16.2 @@ -357,7 +357,7 @@ importers: '@testing-library/user-event': 13.5.0_gzufz4q333be4gqfrvipwvqt6a '@types/jest': 27.4.1 '@types/lodash': 4.14.184 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/testing-library__jest-dom': 5.14.3 '@types/wordpress__components': 19.10.1_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__data': 6.0.0 @@ -526,7 +526,7 @@ importers: '@types/lodash': ^4.14.182 '@types/md5': ^2.3.2 '@types/qs': ^6.9.7 - '@types/react': ^17.0.0 + '@types/react': ^17.0.2 '@types/wordpress__compose': ^4.0.1 '@types/wordpress__core-data': ^2.4.5 '@types/wordpress__data': ^6.0.0 @@ -589,7 +589,7 @@ importers: '@types/lodash': 4.14.182 '@types/md5': 2.3.2 '@types/qs': 6.9.7 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/wordpress__compose': 4.0.1 '@types/wordpress__core-data': 2.4.5 '@types/wordpress__data': 6.0.0 @@ -800,8 +800,8 @@ importers: '@babel/plugin-transform-runtime': ^7.16.4 '@babel/polyfill': 7.12.1 '@babel/preset-env': 7.12.7 - '@typescript-eslint/eslint-plugin': ^5.3.0 - '@typescript-eslint/parser': ^5.3.0 + '@typescript-eslint/eslint-plugin': ^5.43.0 + '@typescript-eslint/parser': ^5.43.0 '@woocommerce/api': ^0.2.0 '@woocommerce/eslint-plugin': workspace:* '@woocommerce/internal-e2e-builds': workspace:* @@ -830,8 +830,8 @@ importers: '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.12.9 '@babel/polyfill': 7.12.1 '@babel/preset-env': 7.12.7_@babel+core@7.12.9 - '@typescript-eslint/eslint-plugin': 5.3.0_zbfhqnad2n62njomftkjwtandu - '@typescript-eslint/parser': 5.3.0_iqokrdhiz7bccawj5qurem2l4e + '@typescript-eslint/eslint-plugin': 5.43.0_77yfnzmbnonej4k3inkgdy4i5u + '@typescript-eslint/parser': 5.43.0_iqokrdhiz7bccawj5qurem2l4e '@woocommerce/eslint-plugin': link:../eslint-plugin '@woocommerce/internal-e2e-builds': link:../internal-e2e-builds '@wordpress/babel-plugin-import-jsx-pragma': 1.1.3_@babel+core@7.12.9 @@ -967,7 +967,7 @@ importers: '@types/jest': ^27.4.1 '@types/node': ^17.0.21 '@types/qs': ^6.9.7 - '@types/react': ^17.0.0 + '@types/react': ^17.0.2 '@woocommerce/eslint-plugin': workspace:* '@wordpress/api-fetch': ^6.0.1 '@wordpress/hooks': ^3.5.0 @@ -992,7 +992,7 @@ importers: '@types/jest': 27.4.1 '@types/node': 17.0.21 '@types/qs': 6.9.7 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@woocommerce/eslint-plugin': link:../eslint-plugin eslint: 8.12.0 jest: 27.5.1 @@ -1308,9 +1308,9 @@ importers: '@babel/preset-env': 7.12.7 '@babel/register': 7.12.1 '@playwright/test': ^1.27.1 - '@typescript-eslint/eslint-plugin': 3.10.1 - '@typescript-eslint/experimental-utils': 3.10.1 - '@typescript-eslint/parser': 3.10.1 + '@typescript-eslint/eslint-plugin': ^5.43.0 + '@typescript-eslint/experimental-utils': ^5.43.0 + '@typescript-eslint/parser': ^5.43.0 '@woocommerce/admin-e2e-tests': workspace:* '@woocommerce/api': workspace:* '@woocommerce/api-core-tests': workspace:* @@ -1353,9 +1353,9 @@ importers: '@babel/preset-env': 7.12.7_@babel+core@7.12.9 '@babel/register': 7.12.1_@babel+core@7.12.9 '@playwright/test': 1.27.1 - '@typescript-eslint/eslint-plugin': 3.10.1_s5hr7yeqqy6e4q6twdgyz7l2pu - '@typescript-eslint/experimental-utils': 3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/parser': 3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq + '@typescript-eslint/experimental-utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q '@woocommerce/admin-e2e-tests': link:../../packages/js/admin-e2e-tests '@woocommerce/api': link:../../packages/js/api '@woocommerce/api-core-tests': link:../../packages/js/api-core-tests @@ -1423,7 +1423,7 @@ importers: '@types/lodash': ^4.14.179 '@types/puppeteer': ^4.0.2 '@types/qs': ^6.9.7 - '@types/react': ^17.0.0 + '@types/react': ^17.0.2 '@types/react-router-dom': ^5.3.3 '@types/react-transition-group': ^4.4.4 '@types/testing-library__jest-dom': ^5.14.3 @@ -1435,8 +1435,8 @@ importers: '@types/wordpress__media-utils': ^3.0.0 '@types/wordpress__notices': ^3.3.0 '@types/wordpress__plugins': ^3.0.0 - '@typescript-eslint/eslint-plugin': ^5.14.0 - '@typescript-eslint/parser': ^5.14.0 + '@typescript-eslint/eslint-plugin': ^5.43.0 + '@typescript-eslint/parser': ^5.43.0 '@woocommerce/admin-e2e-tests': workspace:* '@woocommerce/api': ^0.2.0 '@woocommerce/components': workspace:* @@ -1568,7 +1568,7 @@ importers: dependencies: '@automattic/explat-client': 0.0.3 '@automattic/explat-client-react-helpers': 0.0.4 - '@automattic/interpolate-components': 1.2.1_adlholpkqbiq5amp2fy4vkqcli + '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym '@react-spring/web': 9.4.4_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__blocks': 11.0.7_sfoxds7t5ydpegc3knd667wn6m '@woocommerce/api': link:../../packages/js/api @@ -1578,7 +1578,7 @@ importers: '@wordpress/api-fetch': 6.1.1 '@wordpress/base-styles': 4.3.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 19.6.1_lxraipvdfcmyzw3sdzk3k7kygu + '@wordpress/components': 19.6.1_tufdcic6wklrwyy3rhbsbktylu '@wordpress/compose': 5.2.1_react@17.0.2 '@wordpress/core-data': 4.2.1_react@17.0.2 '@wordpress/data': 6.15.0_react@17.0.2 @@ -1641,7 +1641,7 @@ importers: '@types/lodash': 4.14.180 '@types/puppeteer': 4.0.2 '@types/qs': 6.9.7 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/react-router-dom': 5.3.3 '@types/react-transition-group': 4.4.4 '@types/testing-library__jest-dom': 5.14.3 @@ -1652,8 +1652,8 @@ importers: '@types/wordpress__media-utils': 3.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__notices': 3.3.0 '@types/wordpress__plugins': 3.0.0_sfoxds7t5ydpegc3knd667wn6m - '@typescript-eslint/eslint-plugin': 5.15.0_kjpgj5mwuhqsafyl367g3mx6ni - '@typescript-eslint/parser': 5.15.0_himlt4eddny2rsb5zkuydvuf7u + '@typescript-eslint/eslint-plugin': 5.43.0_xi2bidqtjw6phi5qq54cbyxqtu + '@typescript-eslint/parser': 5.43.0_himlt4eddny2rsb5zkuydvuf7u '@woocommerce/admin-e2e-tests': link:../../packages/js/admin-e2e-tests '@woocommerce/components': link:../../packages/js/components '@woocommerce/csv-export': link:../../packages/js/csv-export @@ -1673,7 +1673,7 @@ importers: '@woocommerce/onboarding': link:../../packages/js/onboarding '@woocommerce/tracks': link:../../packages/js/tracks '@wordpress/babel-preset-default': 6.6.1 - '@wordpress/block-editor': 9.8.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/block-editor': 9.8.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/browserslist-config': 4.1.2 '@wordpress/custom-templated-path-webpack-plugin': 2.1.2_webpack@5.70.0 '@wordpress/jest-preset-default': 8.1.1_lensd4roph2efz67jc3dgzevhq @@ -1698,7 +1698,7 @@ importers: eslint: 8.11.0 eslint-import-resolver-typescript: 2.5.0_7yrnqyx753fo5bwjhiag2wpedy eslint-import-resolver-webpack: 0.13.2_xlbwhpbmf5dkmuyaaidudnwply - eslint-plugin-import: 2.25.4_o53s3emd3qikejdbqbxdd6vyim + eslint-plugin-import: 2.25.4_mwel7v7qi7wwnb6yoytqwvyg4e eslint-plugin-react: 7.29.4_eslint@8.11.0 expose-loader: 3.1.0_webpack@5.70.0 fork-ts-checker-webpack-plugin: 6.5.0_k7hdfuiil3x6lfvxi3pndxxjmi @@ -2099,7 +2099,7 @@ packages: /@automattic/color-studio/2.5.0: resolution: {integrity: sha512-gZWaJbx3p1oennAIoJtMGluTmoM95Efk4rc44TSBxWSZZ8gH3Am2eh1o3i1NhrZmg2Zt3AiVFeZZ4AJccIpBKQ==} - /@automattic/components/2.0.1_tvee6z3edpcht3mbvrcpowxsq4: + /@automattic/components/2.0.1_55fkur5ksohfsfsn73yxe3omei: resolution: {integrity: sha512-xvIfbLcX869Cx4ccDUC5hb9MqTvZDNC5ho2yI0g1aveUfVGn7FqPxNiHwCEfW2fi5f85T63CZ727Q+ECawDoKQ==} peerDependencies: '@wordpress/data': ^6.1.5 @@ -2107,13 +2107,13 @@ packages: react-dom: ^17.0.2 dependencies: '@automattic/calypso-url': 1.0.0 - '@automattic/data-stores': 3.0.1_tvee6z3edpcht3mbvrcpowxsq4 + '@automattic/data-stores': 3.0.1_55fkur5ksohfsfsn73yxe3omei '@automattic/typography': 1.0.0 '@wordpress/base-styles': 4.5.0 '@wordpress/data': 6.15.0_react@17.0.2 classnames: 2.3.1 gridicons: 3.4.0_react@17.0.2 - i18n-calypso: 6.0.1_adlholpkqbiq5amp2fy4vkqcli + i18n-calypso: 6.0.1_pxzommwrsowkd4kgag6q3sluym lodash: 4.17.21 prop-types: 15.8.1 react: 17.0.2 @@ -2154,7 +2154,7 @@ packages: - supports-color dev: true - /@automattic/data-stores/3.0.1_tvee6z3edpcht3mbvrcpowxsq4: + /@automattic/data-stores/3.0.1_55fkur5ksohfsfsn73yxe3omei: resolution: {integrity: sha512-+ZcN8x+gNf4I7nGAjbZy6ubpMPiPleOQIVPbMwkHb32v/zoJ+fL4CGa9YcgiCCjJjaEEKcPZfl5Qbuo7ddGdpA==} peerDependencies: '@wordpress/data': ^6 @@ -2162,14 +2162,14 @@ packages: dependencies: '@automattic/domain-utils': 1.0.0-alpha.0 '@automattic/format-currency': 1.0.1 - '@automattic/happychat-connection': 1.0.0_6rln7q2jvtuewdvbdwpg4txtvm + '@automattic/happychat-connection': 1.0.0_hiunvzosbwliizyirxfy6hjyim '@wordpress/api-fetch': 6.16.0 '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/data-controls': 2.10.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 '@wordpress/url': 3.20.0 fast-json-stable-stringify: 2.1.0 - i18n-calypso: 6.0.1_adlholpkqbiq5amp2fy4vkqcli + i18n-calypso: 6.0.1_pxzommwrsowkd4kgag6q3sluym qs: 6.10.3 react: 17.0.2 redux: 4.2.0 @@ -2218,7 +2218,7 @@ packages: tslib: 2.3.1 dev: false - /@automattic/happychat-connection/1.0.0_6rln7q2jvtuewdvbdwpg4txtvm: + /@automattic/happychat-connection/1.0.0_hiunvzosbwliizyirxfy6hjyim: resolution: {integrity: sha512-l97adFiyKptK+ZmJNgg174njpxepbDTZBaSggZdMbJIVLQv04dt6cxNzcq4Or70NAUx7XfOYtbPS0GfskSMbMg==} peerDependencies: react: ^17.0.2 @@ -2226,7 +2226,7 @@ packages: '@automattic/calypso-config': 1.2.0 '@automattic/i18n-utils': 1.0.1 debug: 4.3.3 - i18n-calypso: 6.0.1_adlholpkqbiq5amp2fy4vkqcli + i18n-calypso: 6.0.1_pxzommwrsowkd4kgag6q3sluym react: 17.0.2 react-query: 3.39.1_sfoxds7t5ydpegc3knd667wn6m socket.io-client: 2.3.0 @@ -2252,7 +2252,7 @@ packages: - supports-color dev: false - /@automattic/interpolate-components/1.2.1_adlholpkqbiq5amp2fy4vkqcli: + /@automattic/interpolate-components/1.2.1_pxzommwrsowkd4kgag6q3sluym: resolution: {integrity: sha512-YNQtJsrs9KQ3lkBdtLyDheVRijoBA3y/PuHdgJ0eB4AX9JyjkDX7jd79Inh79+01CGNLbMQGrEJby2zvbJr17A==} peerDependencies: '@types/react': '>=16.14.23' @@ -2261,7 +2261,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 react: 17.0.2 dev: false @@ -2283,7 +2283,7 @@ packages: tslib: 2.3.1 dev: false - /@automattic/tour-kit/1.1.1_ewcciyhsqon3yluv5ntlvxyvvm: + /@automattic/tour-kit/1.1.1_febotzggui25pdagwq3ufufntu: resolution: {integrity: sha512-qC15YGZZW5VUhvl47y9C+aN0q0QIejP9g9pFZ9M3PRRgaZcXx00+ZrL1Ngg0+V9eS5io5OZcji3D8OU6i48t/w==} peerDependencies: '@wordpress/data': ^6.1.5 @@ -2292,12 +2292,12 @@ packages: reakit-utils: ^0.15.1 redux: ^4.1.2 dependencies: - '@automattic/components': 2.0.1_tvee6z3edpcht3mbvrcpowxsq4 + '@automattic/components': 2.0.1_55fkur5ksohfsfsn73yxe3omei '@automattic/viewport': 1.1.0 '@automattic/viewport-react': 1.0.0_react@17.0.2 '@popperjs/core': 2.11.4 '@wordpress/base-styles': 4.5.0 - '@wordpress/components': 19.12.0_lxraipvdfcmyzw3sdzk3k7kygu + '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/dom': 3.10.0 '@wordpress/element': 4.8.0 @@ -2571,7 +2571,6 @@ packages: dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 '@babel/types': 7.19.3 - dev: true /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} @@ -2593,6 +2592,32 @@ packages: semver: 6.3.0 dev: true + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.20.4 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.20.4 + semver: 6.3.0 + dev: false + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -2879,42 +2904,6 @@ packages: - supports-color dev: true - /@babel/helper-define-polyfill-provider/0.3.0_@babel+core@7.16.12: - resolution: {integrity: sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/traverse': 7.19.3 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/helper-define-polyfill-provider/0.3.0_@babel+core@7.17.8: - resolution: {integrity: sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==} - peerDependencies: - '@babel/core': ^7.4.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/traverse': 7.19.3 - debug: 4.3.4 - lodash.debounce: 4.0.8 - resolve: 1.22.1 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/helper-define-polyfill-provider/0.3.1_@babel+core@7.12.9: resolution: {integrity: sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==} peerDependencies: @@ -3429,9 +3418,9 @@ packages: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 dev: true /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.16.12: @@ -3441,9 +3430,9 @@ packages: '@babel/core': ^7.13.0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.16.12 dev: false /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: @@ -4185,30 +4174,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} @@ -4293,7 +4258,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 transitivePeerDependencies: - supports-color @@ -4308,7 +4273,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 transitivePeerDependencies: - supports-color @@ -4362,7 +4327,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: @@ -4373,7 +4338,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 dev: false /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: @@ -5480,7 +5445,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5491,7 +5456,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 '@babel/helper-plugin-utils': 7.19.0 dev: false @@ -6533,9 +6498,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 + '@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.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -6550,9 +6515,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 @@ -7061,7 +7026,7 @@ packages: dependencies: '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.16.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 @@ -7128,7 +7093,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.19.3 + '@babel/types': 7.17.0 babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 @@ -7146,7 +7111,7 @@ packages: dependencies: '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.16.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 @@ -7213,7 +7178,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.19.3 + '@babel/types': 7.17.0 babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 @@ -7464,8 +7429,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.16.12 transitivePeerDependencies: - supports-color @@ -7652,6 +7617,7 @@ packages: /@discoveryjs/json-ext/0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + dev: true /@emotion/babel-plugin/11.7.2_@babel+core@7.17.8: resolution: {integrity: sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==} @@ -7782,6 +7748,29 @@ packages: react: 16.14.0 dev: false + /@emotion/react/11.8.2_lvgioobbs7lf3pr6y4xfpughau: + resolution: {integrity: sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/core': 7.17.8 + '@babel/runtime': 7.19.0 + '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 + '@emotion/cache': 11.7.1 + '@emotion/serialize': 1.0.2 + '@emotion/utils': 1.1.0 + '@emotion/weak-memoize': 0.2.5 + '@types/react': 17.0.50 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + /@emotion/react/11.8.2_mcptgafjogap2nfvnfqvfwh6uu: resolution: {integrity: sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==} peerDependencies: @@ -7805,29 +7794,6 @@ packages: react: 17.0.2 dev: false - /@emotion/react/11.8.2_ob76esr53kubcxaa2cuzm2qzvy: - resolution: {integrity: sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==} - peerDependencies: - '@babel/core': ^7.0.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/core': 7.17.8 - '@babel/runtime': 7.19.0 - '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 - '@emotion/cache': 11.7.1 - '@emotion/serialize': 1.0.2 - '@emotion/utils': 1.1.0 - '@emotion/weak-memoize': 0.2.5 - '@types/react': 17.0.40 - hoist-non-react-statics: 3.3.2 - react: 17.0.2 - /@emotion/serialize/0.11.16: resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} dependencies: @@ -7844,7 +7810,7 @@ packages: '@emotion/memoize': 0.7.5 '@emotion/unitless': 0.7.5 '@emotion/utils': 1.1.0 - csstype: 3.0.10 + csstype: 3.1.1 /@emotion/sheet/0.9.4: resolution: {integrity: sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA==} @@ -7904,7 +7870,7 @@ packages: react: 16.14.0 dev: false - /@emotion/styled/11.8.1_7vcmqpdcqsve2266oufnu5rnva: + /@emotion/styled/11.8.1_336qi3gvxoqj6dyikirbxktxtq: resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} peerDependencies: '@babel/core': ^7.0.0 @@ -7921,10 +7887,10 @@ packages: '@babel/runtime': 7.19.0 '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 '@emotion/is-prop-valid': 1.1.2 - '@emotion/react': 11.8.2_ob76esr53kubcxaa2cuzm2qzvy + '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau '@emotion/serialize': 1.0.2 '@emotion/utils': 1.1.0 - '@types/react': 17.0.40 + '@types/react': 17.0.50 react: 17.0.2 /@emotion/styled/11.8.1_lddnk6nv2rrayprsm6yu5n7lz4: @@ -8079,7 +8045,7 @@ packages: dependencies: '@floating-ui/core': 1.0.1 - /@floating-ui/react-dom/0.6.3_6rln7q2jvtuewdvbdwpg4txtvm: + /@floating-ui/react-dom/0.6.3_hiunvzosbwliizyirxfy6hjyim: resolution: {integrity: sha512-hC+pS5D6AgS2wWjbmSQ6UR6Kpy+drvWGJIri6e1EDGADTPsCaa4KzCgmCczHrQeInx9tqs81EyDmbKJYY2swKg==} peerDependencies: react: '>=16.8.0' @@ -8088,7 +8054,7 @@ packages: '@floating-ui/dom': 0.4.5 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - use-isomorphic-layout-effect: 1.1.1_adlholpkqbiq5amp2fy4vkqcli + use-isomorphic-layout-effect: 1.1.1_pxzommwrsowkd4kgag6q3sluym transitivePeerDependencies: - '@types/react' dev: false @@ -9232,7 +9198,7 @@ packages: read-package-json-fast: 2.0.3 readdir-scoped-modules: 1.1.0 rimraf: 3.0.2 - semver: 7.3.7 + semver: 7.3.8 ssri: 8.0.1 treeverse: 1.0.4 walk-up-path: 1.0.0 @@ -9245,7 +9211,7 @@ packages: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} dependencies: '@gar/promisify': 1.1.3 - semver: 7.3.7 + semver: 7.3.8 dev: true /@npmcli/fs/2.1.2: @@ -9253,7 +9219,7 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} dependencies: '@gar/promisify': 1.1.3 - semver: 7.3.7 + semver: 7.3.8 dev: true /@npmcli/git/2.1.0: @@ -9265,7 +9231,7 @@ packages: npm-pick-manifest: 6.1.1 promise-inflight: 1.0.1 promise-retry: 2.0.1 - semver: 7.3.7 + semver: 7.3.8 which: 2.0.2 transitivePeerDependencies: - bluebird @@ -9297,7 +9263,7 @@ packages: cacache: 15.3.0 json-parse-even-better-errors: 2.3.1 pacote: 12.0.3 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - bluebird - supports-color @@ -9442,7 +9408,7 @@ packages: fs-extra: 9.1.0 http-call: 5.3.0 lodash: 4.17.21 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color dev: true @@ -9888,7 +9854,7 @@ packages: '@react-native-community/cli-tools': 9.1.0 '@react-native-community/cli-types': 9.1.0 chalk: 4.1.2 - commander: 9.4.0 + commander: 9.4.1 execa: 1.0.0 find-up: 4.1.0 fs-extra: 8.1.0 @@ -10150,7 +10116,7 @@ packages: - '@types/react' dev: true - /@storybook/addon-actions/6.4.19_6rln7q2jvtuewdvbdwpg4txtvm: + /@storybook/addon-actions/6.4.19_hiunvzosbwliizyirxfy6hjyim: resolution: {integrity: sha512-GpSvP8xV8GfNkmtGJjfCgaOx6mbjtyTK0aT9FqX9pU0s+KVMmoCTrBh43b7dWrwxxas01yleBK9VpYggzhi/Fw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -10163,7 +10129,7 @@ packages: dependencies: '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@storybook/core-events': 6.4.19 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -10229,7 +10195,7 @@ packages: global: 4.4.0 dev: true - /@storybook/addon-controls/6.4.19_56jbash75ng5psbctf36wqywr4: + /@storybook/addon-controls/6.4.19_3mpzmuykh5ctyyi3r2d2agoucu: resolution: {integrity: sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -10243,8 +10209,8 @@ packages: '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/client-logger': 6.4.19 - '@storybook/components': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-common': 6.4.19_56jbash75ng5psbctf36wqywr4 + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim + '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.19 '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -10264,7 +10230,7 @@ packages: - webpack-command dev: true - /@storybook/addon-controls/6.4.19_gfhwku24kap2smxuljffrvlkli: + /@storybook/addon-controls/6.4.19_56jbash75ng5psbctf36wqywr4: resolution: {integrity: sha512-JHi5z9i6NsgQLfG5WOeQE1AyOrM+QJLrjT+uOYx40bq+OC1yWHH7qHiphPP8kjJJhCZlaQk1qqXYkkQXgaeHSw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -10278,8 +10244,8 @@ packages: '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/client-logger': 6.4.19 - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm - '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by + '@storybook/components': 6.4.19_sfoxds7t5ydpegc3knd667wn6m + '@storybook/core-common': 6.4.19_56jbash75ng5psbctf36wqywr4 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.19 '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -10412,7 +10378,7 @@ packages: - webpack-command dev: true - /@storybook/addon-docs/6.4.19_wid2s3qa6h7hly5p3fziamwama: + /@storybook/addon-docs/6.4.19_fzsnscfffpgd4jw4kgkdqz7wca: resolution: {integrity: sha512-OEPyx/5ZXmZOPqIAWoPjlIP8Q/YfNjAmBosA8tmA8t5KCSiq/vpLcAvQhxqK6n0wk/B8Xp67Z8RpLfXjU8R3tw==} peerDependencies: '@storybook/angular': 6.4.19 @@ -10470,17 +10436,17 @@ packages: '@mdx-js/react': 1.6.22_react@17.0.2 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/builder-webpack4': 6.4.19_twcgsjapmrtecykmlljybg2qam + '@storybook/builder-webpack4': 6.4.19_vrzxlgakqf7u5t766r72d2xf3u '@storybook/client-logger': 6.4.19 - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm - '@storybook/core': 6.4.19_3henvp7ekv7y3gwk2ylq5cgcgm + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim + '@storybook/core': 6.4.19_uog2ckjumoqoyqssiweskrah3a '@storybook/core-events': 6.4.19 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.19 '@storybook/node-logger': 6.4.19 '@storybook/postinstall': 6.4.19 '@storybook/preview-web': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/react': 6.4.19_djfxmhhjm73jktbwxvrsayga4a + '@storybook/react': 6.4.19_hyxuuzpmppcxva5upf6kk6zg4m '@storybook/source-loader': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -10975,7 +10941,7 @@ packages: - webpack-command dev: true - /@storybook/builder-webpack4/6.4.19_gzrzyafphqx4cm7pwoveji4hv4: + /@storybook/builder-webpack4/6.4.19_udsk7p7oupcmsdx7ikf7zdk4sm: resolution: {integrity: sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -11012,7 +10978,7 @@ packages: '@storybook/channels': 6.4.19 '@storybook/client-api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/client-logger': 6.4.19 - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/core-events': 6.4.19 '@storybook/node-logger': 6.4.19 @@ -11021,7 +10987,7 @@ packages: '@storybook/semver': 7.3.2 '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 @@ -11068,7 +11034,7 @@ packages: - webpack-command dev: true - /@storybook/builder-webpack4/6.4.19_twcgsjapmrtecykmlljybg2qam: + /@storybook/builder-webpack4/6.4.19_vrzxlgakqf7u5t766r72d2xf3u: resolution: {integrity: sha512-wxA6SMH11duc9D53aeVVBwrVRemFIoxHp/dOugkkg6ZZFAb4ZmWzf/ENc3vQIZdZpfNRi7IZIZEOfoHc994cmw==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -11105,7 +11071,7 @@ packages: '@storybook/channels': 6.4.19 '@storybook/client-api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/client-logger': 6.4.19 - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/core-events': 6.4.19 '@storybook/node-logger': 6.4.19 @@ -11114,7 +11080,7 @@ packages: '@storybook/semver': 7.3.2 '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 @@ -11311,7 +11277,7 @@ packages: global: 4.4.0 dev: true - /@storybook/components/6.4.19_6rln7q2jvtuewdvbdwpg4txtvm: + /@storybook/components/6.4.19_hiunvzosbwliizyirxfy6hjyim: resolution: {integrity: sha512-q/0V37YAJA7CNc+wSiiefeM9+3XVk8ixBNylY36QCGJgIeGQ5/79vPyUe6K4lLmsQwpmZsIq1s1Ad5+VbboeOA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -11339,7 +11305,7 @@ packages: react-dom: 17.0.2_react@17.0.2 react-popper-tooltip: 3.1.1_sfoxds7t5ydpegc3knd667wn6m react-syntax-highlighter: 13.5.3_react@17.0.2 - react-textarea-autosize: 8.3.3_adlholpkqbiq5amp2fy4vkqcli + react-textarea-autosize: 8.3.3_pxzommwrsowkd4kgag6q3sluym regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 util-deprecate: 1.0.2 @@ -11383,7 +11349,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.19_eob6ejgeaslyodpcvuvidpa46y: + /@storybook/core-client/6.4.19_4khy3msxr4lnrhwh6cbg2lwt64: resolution: {integrity: sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -11403,7 +11369,7 @@ packages: '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/preview-web': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.25.5 @@ -11500,7 +11466,7 @@ packages: - '@types/react' dev: true - /@storybook/core-client/6.4.19_mflkhfxpn2nhax5g23i37ri46y: + /@storybook/core-client/6.4.19_nj5p77xh6arla3uyzyeb3fmasm: resolution: {integrity: sha512-rQHRZjhArPleE7/S8ZUolgzwY+hC0smSKX/3PQxO2GcebDjnJj6+iSV3h+aSMHMmTdoCQvjYw9aBpT8scuRe+A==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -11520,7 +11486,7 @@ packages: '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/preview-web': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 core-js: 3.25.5 @@ -11837,7 +11803,7 @@ packages: - webpack-command dev: true - /@storybook/core-server/6.4.19_gzrzyafphqx4cm7pwoveji4hv4: + /@storybook/core-server/6.4.19_udsk7p7oupcmsdx7ikf7zdk4sm: resolution: {integrity: sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA==} peerDependencies: '@storybook/builder-webpack5': 6.4.19 @@ -11854,13 +11820,13 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.19_gzrzyafphqx4cm7pwoveji4hv4 - '@storybook/core-client': 6.4.19_eob6ejgeaslyodpcvuvidpa46y + '@storybook/builder-webpack4': 6.4.19_udsk7p7oupcmsdx7ikf7zdk4sm + '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/core-events': 6.4.19 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.19 - '@storybook/manager-webpack4': 6.4.19_gzrzyafphqx4cm7pwoveji4hv4 + '@storybook/manager-webpack4': 6.4.19_udsk7p7oupcmsdx7ikf7zdk4sm '@storybook/node-logger': 6.4.19 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -11912,7 +11878,7 @@ packages: - webpack-command dev: true - /@storybook/core-server/6.4.19_twcgsjapmrtecykmlljybg2qam: + /@storybook/core-server/6.4.19_vrzxlgakqf7u5t766r72d2xf3u: resolution: {integrity: sha512-bKsUB9f7hl5ya2JXxpIrErmbDQjoH39FVbzYZWjMo4t/b7+Xyi6vYadwyWcqlpUQmis09ZaSMv8L/Tw0TuwLAA==} peerDependencies: '@storybook/builder-webpack5': 6.4.19 @@ -11929,13 +11895,13 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@storybook/builder-webpack4': 6.4.19_twcgsjapmrtecykmlljybg2qam - '@storybook/core-client': 6.4.19_eob6ejgeaslyodpcvuvidpa46y + '@storybook/builder-webpack4': 6.4.19_vrzxlgakqf7u5t766r72d2xf3u + '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/core-events': 6.4.19 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.19 - '@storybook/manager-webpack4': 6.4.19_twcgsjapmrtecykmlljybg2qam + '@storybook/manager-webpack4': 6.4.19_vrzxlgakqf7u5t766r72d2xf3u '@storybook/node-logger': 6.4.19 '@storybook/semver': 7.3.2 '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -12064,76 +12030,6 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.19_3henvp7ekv7y3gwk2ylq5cgcgm: - resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} - peerDependencies: - '@storybook/builder-webpack5': 6.4.19 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - typescript: '*' - webpack: '*' - peerDependenciesMeta: - '@storybook/builder-webpack5': - optional: true - typescript: - optional: true - dependencies: - '@storybook/core-client': 6.4.19_mflkhfxpn2nhax5g23i37ri46y - '@storybook/core-server': 6.4.19_twcgsjapmrtecykmlljybg2qam - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - typescript: 4.8.4 - webpack: 5.70.0_webpack-cli@3.3.12 - transitivePeerDependencies: - - '@storybook/manager-webpack5' - - '@types/react' - - acorn - - bluebird - - bufferutil - - encoding - - eslint - - supports-color - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-command - dev: true - - /@storybook/core/6.4.19_ak72zq2pb6wqohiccht57vnt5q: - resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} - peerDependencies: - '@storybook/builder-webpack5': 6.4.19 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - typescript: '*' - webpack: '*' - peerDependenciesMeta: - '@storybook/builder-webpack5': - optional: true - typescript: - optional: true - dependencies: - '@storybook/core-client': 6.4.19_eob6ejgeaslyodpcvuvidpa46y - '@storybook/core-server': 6.4.19_gzrzyafphqx4cm7pwoveji4hv4 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - typescript: 4.8.4 - webpack: 4.46.0_webpack-cli@3.3.12 - transitivePeerDependencies: - - '@storybook/manager-webpack5' - - '@types/react' - - acorn - - bluebird - - bufferutil - - encoding - - eslint - - supports-color - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-command - dev: true - /@storybook/core/6.4.19_cwkpkezp45pc2xqqskbtjzmzb4: resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} peerDependencies: @@ -12170,6 +12066,76 @@ packages: - webpack-command dev: true + /@storybook/core/6.4.19_khiz5aumqhidkhlg2zv2fpwlya: + resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.19 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 + '@storybook/core-server': 6.4.19_udsk7p7oupcmsdx7ikf7zdk4sm + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + typescript: 4.8.4 + webpack: 4.46.0_webpack-cli@3.3.12 + transitivePeerDependencies: + - '@storybook/manager-webpack5' + - '@types/react' + - acorn + - bluebird + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + + /@storybook/core/6.4.19_uog2ckjumoqoyqssiweskrah3a: + resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} + peerDependencies: + '@storybook/builder-webpack5': 6.4.19 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + '@storybook/builder-webpack5': + optional: true + typescript: + optional: true + dependencies: + '@storybook/core-client': 6.4.19_nj5p77xh6arla3uyzyeb3fmasm + '@storybook/core-server': 6.4.19_vrzxlgakqf7u5t766r72d2xf3u + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + typescript: 4.8.4 + webpack: 5.70.0_webpack-cli@3.3.12 + transitivePeerDependencies: + - '@storybook/manager-webpack5' + - '@types/react' + - acorn + - bluebird + - bufferutil + - encoding + - eslint + - supports-color + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + dev: true + /@storybook/core/6.4.19_xzab24xk2ppqlw525pofyj44uy: resolution: {integrity: sha512-55LOQ/h/kf1jMhjN85t/pIEdIwWEG9yV7bdwv3niVvmoypCxyyjn9/QNK0RKYAeDSUtdm6FVoJ6k5CpxWz2d8w==} peerDependencies: @@ -12454,7 +12420,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.19_gzrzyafphqx4cm7pwoveji4hv4: + /@storybook/manager-webpack4/6.4.19_udsk7p7oupcmsdx7ikf7zdk4sm: resolution: {integrity: sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -12468,11 +12434,11 @@ packages: '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 '@babel/preset-react': 7.16.7_@babel+core@7.17.8 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-client': 6.4.19_eob6ejgeaslyodpcvuvidpa46y + '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/node-logger': 6.4.19 '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@types/node': 14.14.33 '@types/webpack': 4.41.32 babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy @@ -12515,7 +12481,7 @@ packages: - webpack-command dev: true - /@storybook/manager-webpack4/6.4.19_twcgsjapmrtecykmlljybg2qam: + /@storybook/manager-webpack4/6.4.19_vrzxlgakqf7u5t766r72d2xf3u: resolution: {integrity: sha512-R8ugZjTYqXvlc6gDOcw909L65sIleOmIJLZR+N6/H85MivGXHu39jOwONqB7tVACufRty4FNecn8tEiQL2SAKA==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -12529,11 +12495,11 @@ packages: '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 '@babel/preset-react': 7.16.7_@babel+core@7.17.8 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core-client': 6.4.19_eob6ejgeaslyodpcvuvidpa46y + '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/node-logger': 6.4.19 '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/ui': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@types/node': 14.14.33 '@types/webpack': 4.41.32 babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy @@ -12762,7 +12728,7 @@ packages: - webpack-plugin-serve dev: true - /@storybook/react/6.4.19_djfxmhhjm73jktbwxvrsayga4a: + /@storybook/react/6.4.19_hyxuuzpmppcxva5upf6kk6zg4m: resolution: {integrity: sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA==} engines: {node: '>=10.13.0'} hasBin: true @@ -12782,7 +12748,7 @@ packages: '@babel/preset-react': 7.16.7_@babel+core@7.17.8 '@pmmmwh/react-refresh-webpack-plugin': 0.5.1_a3gyllrqvxpec3fpybsrposvju '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core': 6.4.19_ak72zq2pb6wqohiccht57vnt5q + '@storybook/core': 6.4.19_khiz5aumqhidkhlg2zv2fpwlya '@storybook/core-common': 6.4.19_bhvadzvbuq4c4gucumdoppg3by '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/node-logger': 6.4.19 @@ -12989,7 +12955,7 @@ packages: ts-dedent: 2.2.0 dev: true - /@storybook/ui/6.4.19_6rln7q2jvtuewdvbdwpg4txtvm: + /@storybook/ui/6.4.19_hiunvzosbwliizyirxfy6hjyim: resolution: {integrity: sha512-gFwdn5LA2U6oQ4bfUFLyHZnNasGQ01YVdwjbi+l6yjmnckBNtZfJoVTZ1rzGUbxSE9rK48InJRU+latTsr7xAg==} peerDependencies: react: ^16.8.0 || ^17.0.0 @@ -13000,7 +12966,7 @@ packages: '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channels': 6.4.19 '@storybook/client-logger': 6.4.19 - '@storybook/components': 6.4.19_6rln7q2jvtuewdvbdwpg4txtvm + '@storybook/components': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@storybook/core-events': 6.4.19 '@storybook/router': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/semver': 7.3.2 @@ -13273,7 +13239,7 @@ packages: optional: true dependencies: '@babel/runtime': 7.17.7 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/react-dom': 17.0.13 '@types/react-test-renderer': 17.0.1 react: 17.0.2 @@ -13434,10 +13400,6 @@ packages: '@types/eslint': 7.29.0 '@types/estree': 0.0.51 - /@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: @@ -13711,7 +13673,7 @@ packages: resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} dependencies: '@types/history': 4.7.11 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/react-router': 5.1.18 dev: true @@ -13737,22 +13699,15 @@ packages: /@types/react-transition-group/4.4.4: resolution: {integrity: sha512-7gAPz7anVK5xzbeQW9wFBDg7G++aPLAFY0QaSMOou9rJZpbuI58WAuJrgu+qR92l61grlnCUe7AFX8KGahAgug==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 dev: true /@types/react/16.14.31: resolution: {integrity: sha512-CD3LuBW4xIeGy6BxuNZdXBOsuP00OHFuNOq/4e2xKDq6z02XvdH9wIkuPNmz7BRQpo5ncy1zT9fz4tTDqXbjzQ==} dependencies: - '@types/prop-types': 15.7.4 + '@types/prop-types': 15.7.5 '@types/scheduler': 0.16.2 - csstype: 3.0.10 - - /@types/react/17.0.40: - resolution: {integrity: sha512-UrXhD/JyLH+W70nNSufXqMZNuUD2cXHu6UjCllC6pmOQgBX4SGXOH8fjRka0O0Ee0HrFxapDD8Bwn81Kmiz6jQ==} - dependencies: - '@types/prop-types': 15.7.4 - '@types/scheduler': 0.16.2 - csstype: 3.0.10 + csstype: 3.1.1 /@types/react/17.0.50: resolution: {integrity: sha512-ZCBHzpDb5skMnc1zFXAXnL3l1FAdi+xZvwxK+PkglMmBrwjpp9nKaWuEvrGnSifCJmBFGxZOOFuwC6KH/s0NuA==} @@ -13775,7 +13730,6 @@ packages: /@types/semver/7.3.12: resolution: {integrity: sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A==} - dev: false /@types/serve-static/1.15.0: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} @@ -13889,7 +13843,7 @@ packages: /@types/wordpress__components/19.10.1_prpqlkd37azqwypxturxi7uyci: resolution: {integrity: sha512-zD+lrwMkh8ttnUQb6EUYZ55q6QGIwqqg0SfD8xX0kdinx/1KMKMUgInMkiVQ8ky56BIzADiYH3+A0Pdh76GAxw==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 @@ -13904,7 +13858,7 @@ packages: /@types/wordpress__components/19.10.1_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-zD+lrwMkh8ttnUQb6EUYZ55q6QGIwqqg0SfD8xX0kdinx/1KMKMUgInMkiVQ8ky56BIzADiYH3+A0Pdh76GAxw==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 @@ -13919,7 +13873,7 @@ packages: resolution: {integrity: sha512-2Czdu9Nyhxn0R7lSl+LwVyzHF+xgP6nuikRDt26VJPLAZhmgE9c/lmB8v8xiby8UGVWj6oKGQDmKda8kvoBWBQ==} dependencies: '@types/lodash': 4.14.182 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@wordpress/element': 3.2.0 dev: true @@ -13937,7 +13891,7 @@ packages: /@types/wordpress__data/6.0.0: resolution: {integrity: sha512-+J6uLQjhT6zqDgOx4EtqJLMajYFP/thwW+WtZWX/SYZu8e3MqPnc1HaRdz6JGeKpjlpPr4UOpTB2nf/bWKrsGA==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 redux: 4.2.0 /@types/wordpress__keycodes/2.3.1: @@ -13957,18 +13911,18 @@ packages: /@types/wordpress__notices/3.3.0: resolution: {integrity: sha512-XR9WE4qes2wJCLuStD5Vm9yh/DMsELpcgYmmQW4Rs+zP+bIc6NMnKeDhr9OAhdkWNPVZ/YVshBz1GGjOdNSqDA==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 dev: true /@types/wordpress__notices/3.5.0: resolution: {integrity: sha512-te9fZ4ErxmoiMYNCjmsVNQ4sKUrNw14OxvL5pUeXTgkXdTfIKyYjAJ61Mb9mO2iurRy6ITJGPVaWu3SjNgBBsw==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 /@types/wordpress__plugins/3.0.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-P/Jkp0e1oLXLN34i5/U6JgBiZGjln6oDkHOLiNGF2yB9l+BkScV4aXQyLmOiib91kUvfGdK3+Pb+skecs474cA==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/wordpress__components': 19.10.1_sfoxds7t5ydpegc3knd667wn6m '@wordpress/element': 3.2.0 transitivePeerDependencies: @@ -13985,7 +13939,7 @@ packages: /@types/wordpress__viewport/2.5.4: resolution: {integrity: sha512-jS2wMNegsK1yN4Htay59ZYWyINqAcizKdIe0MSAga2ZWimTRe/0k2nsl0m6f9+rhFYlT/bLoA/CYHAOs5JHmRg==} dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/wordpress__data': 6.0.0 dev: true @@ -14016,30 +13970,6 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/3.10.1_s5hr7yeqqy6e4q6twdgyz7l2pu: - resolution: {integrity: sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - '@typescript-eslint/parser': ^3.0.0 - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/experimental-utils': 3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/parser': 3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q - debug: 4.3.4 - eslint: 8.25.0 - functional-red-black-tree: 1.0.1 - regexpp: 3.2.0 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/eslint-plugin/4.33.0_k4l66av2tbo6kxzw52jzgbfzii: resolution: {integrity: sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14059,15 +13989,15 @@ packages: functional-red-black-tree: 1.0.1 ignore: 5.2.0 regexpp: 3.2.0 - semver: 7.3.7 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/eslint-plugin/5.15.0_clfp6sw7udaeohpinqea5s7hji: - resolution: {integrity: sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==} + /@typescript-eslint/eslint-plugin/5.43.0_72qpevtmaezorvyo7j2xoo37sy: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: '@typescript-eslint/parser': ^5.0.0 @@ -14077,121 +14007,96 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/parser': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/scope-manager': 5.15.0 - '@typescript-eslint/type-utils': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/utils': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q - debug: 4.3.3 - eslint: 8.25.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.0 - regexpp: 3.2.0 - semver: 7.3.5 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - - /@typescript-eslint/eslint-plugin/5.15.0_kjpgj5mwuhqsafyl367g3mx6ni: - resolution: {integrity: sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==} - 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/parser': 5.15.0_himlt4eddny2rsb5zkuydvuf7u - '@typescript-eslint/scope-manager': 5.15.0 - '@typescript-eslint/type-utils': 5.15.0_himlt4eddny2rsb5zkuydvuf7u - '@typescript-eslint/utils': 5.15.0_himlt4eddny2rsb5zkuydvuf7u - debug: 4.3.3 - eslint: 8.11.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.0 - regexpp: 3.2.0 - semver: 7.3.5 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin/5.15.0_xhv7vhm4msfiao5lib4vwcn6oe: - resolution: {integrity: sha512-u6Db5JfF0Esn3tiAKELvoU5TpXVSkOpZ78cEGn/wXtT2RVqs2vkt4ge6N8cRCyw7YVKhmmLDbwI2pg92mlv7cA==} - 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/parser': 5.15.0_iqokrdhiz7bccawj5qurem2l4e - '@typescript-eslint/scope-manager': 5.15.0 - '@typescript-eslint/type-utils': 5.15.0_iqokrdhiz7bccawj5qurem2l4e - '@typescript-eslint/utils': 5.15.0_iqokrdhiz7bccawj5qurem2l4e - debug: 4.3.3 - eslint: 8.12.0 - functional-red-black-tree: 1.0.1 - ignore: 5.2.0 - regexpp: 3.2.0 - semver: 7.3.5 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin/5.3.0_zbfhqnad2n62njomftkjwtandu: - 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_iqokrdhiz7bccawj5qurem2l4e - '@typescript-eslint/parser': 5.3.0_iqokrdhiz7bccawj5qurem2l4e - '@typescript-eslint/scope-manager': 5.3.0 - debug: 4.3.2 - eslint: 8.12.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.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/eslint-plugin/5.4.0_kjzl6vykamck3qhbtczztvmj4q: - 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_yd7pksmmyt33nzyuulu63alu3m - '@typescript-eslint/parser': 5.4.0_yd7pksmmyt33nzyuulu63alu3m - '@typescript-eslint/scope-manager': 5.4.0 - debug: 4.3.2 + '@typescript-eslint/parser': 5.43.0_yd7pksmmyt33nzyuulu63alu3m + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_yd7pksmmyt33nzyuulu63alu3m + '@typescript-eslint/utils': 5.43.0_yd7pksmmyt33nzyuulu63alu3m + debug: 4.3.4 eslint: 8.2.0 - functional-red-black-tree: 1.0.1 - ignore: 5.1.9 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 regexpp: 3.2.0 - semver: 7.3.5 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin/5.43.0_77yfnzmbnonej4k3inkgdy4i5u: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} + 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/parser': 5.43.0_iqokrdhiz7bccawj5qurem2l4e + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_iqokrdhiz7bccawj5qurem2l4e + '@typescript-eslint/utils': 5.43.0_iqokrdhiz7bccawj5qurem2l4e + debug: 4.3.4 + eslint: 8.12.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/eslint-plugin/5.43.0_hhpcbb6wqnhvo6wpcctutdxelq: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} + 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/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + debug: 4.3.4 + eslint: 8.25.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + + /@typescript-eslint/eslint-plugin/5.43.0_xi2bidqtjw6phi5qq54cbyxqtu: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} + 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/parser': 5.43.0_himlt4eddny2rsb5zkuydvuf7u + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_himlt4eddny2rsb5zkuydvuf7u + '@typescript-eslint/utils': 5.43.0_himlt4eddny2rsb5zkuydvuf7u + debug: 4.3.4 + eslint: 8.11.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -14246,23 +14151,6 @@ packages: - typescript dev: true - /@typescript-eslint/experimental-utils/3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q: - resolution: {integrity: sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: '*' - dependencies: - '@types/json-schema': 7.0.9 - '@typescript-eslint/types': 3.10.1 - '@typescript-eslint/typescript-estree': 3.10.1_typescript@4.8.4 - eslint: 8.25.0 - eslint-scope: 5.1.1 - eslint-utils: 2.1.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - /@typescript-eslint/experimental-utils/4.33.0_3rubbgt5ekhqrcgx4uwls3neim: resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14281,80 +14169,18 @@ packages: - typescript dev: true - /@typescript-eslint/experimental-utils/5.3.0_iqokrdhiz7bccawj5qurem2l4e: - resolution: {integrity: sha512-NFVxYTjKj69qB0FM+piah1x3G/63WB8vCBMnlnEHUsiLzXSTWb9FmFn36FD9Zb4APKBLY3xRArOGSMQkuzTF1w==} + /@typescript-eslint/experimental-utils/5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q: + resolution: {integrity: sha512-WkT637CumTJbm/hRbFfnHBMgfUYTKr08LitVsD7gQId7bi6rnkx3pu3jac67lmp5ObW4MpJ9SNFZAIOUB/Qbsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: - eslint: '*' + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 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.8.4 - eslint: 8.12.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.12.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/experimental-utils/5.4.0_yd7pksmmyt33nzyuulu63alu3m: - 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.8.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/experimental-utils/5.4.0_z4bbprzjrhnsfa24uvmcbu7f5q: - 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.8.4 + '@typescript-eslint/utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q eslint: 8.25.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.25.0 transitivePeerDependencies: - supports-color - typescript - /@typescript-eslint/parser/3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q: - resolution: {integrity: sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@types/eslint-visitor-keys': 1.0.0 - '@typescript-eslint/experimental-utils': 3.10.1_z4bbprzjrhnsfa24uvmcbu7f5q - '@typescript-eslint/types': 3.10.1 - '@typescript-eslint/typescript-estree': 3.10.1_typescript@4.8.4 - eslint: 8.25.0 - eslint-visitor-keys: 1.3.0 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser/4.33.0_phzabm2hax2olcsrhm4n4aik5y: resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14375,46 +14201,6 @@ packages: - supports-color dev: true - /@typescript-eslint/parser/5.15.0_himlt4eddny2rsb5zkuydvuf7u: - resolution: {integrity: sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==} - 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.15.0 - '@typescript-eslint/types': 5.15.0 - '@typescript-eslint/typescript-estree': 5.15.0_typescript@4.8.4 - debug: 4.3.4 - eslint: 8.11.0 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser/5.15.0_iqokrdhiz7bccawj5qurem2l4e: - resolution: {integrity: sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==} - 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.15.0 - '@typescript-eslint/types': 5.15.0 - '@typescript-eslint/typescript-estree': 5.15.0_typescript@4.8.4 - debug: 4.3.4 - eslint: 8.12.0 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - /@typescript-eslint/parser/5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q: resolution: {integrity: sha512-NGAYP/+RDM2sVfmKiKOCgJYPstAO40vPAgACoWPO/+yoYKSgAXIFaBKsV8P0Cc7fwKgvj27SjRNX4L7f4/jCKQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -14433,9 +14219,10 @@ packages: typescript: 4.8.4 transitivePeerDependencies: - supports-color + dev: false - /@typescript-eslint/parser/5.3.0_iqokrdhiz7bccawj5qurem2l4e: - resolution: {integrity: sha512-rKu/yAReip7ovx8UwOAszJVO5MgBquo8WjIQcp1gx4pYQCwYzag+I5nVNHO4MqyMkAo0gWt2gWUi+36gWAVKcw==} + /@typescript-eslint/parser/5.43.0_himlt4eddny2rsb5zkuydvuf7u: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -14444,18 +14231,38 @@ packages: 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.8.4 - debug: 4.3.2 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + debug: 4.3.4 + eslint: 8.11.0 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser/5.43.0_iqokrdhiz7bccawj5qurem2l4e: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} + 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.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + debug: 4.3.4 eslint: 8.12.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser/5.4.0_yd7pksmmyt33nzyuulu63alu3m: - resolution: {integrity: sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==} + /@typescript-eslint/parser/5.43.0_yd7pksmmyt33nzyuulu63alu3m: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 @@ -14464,16 +14271,35 @@ packages: 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.8.4 - debug: 4.3.2 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + debug: 4.3.4 eslint: 8.2.0 typescript: 4.8.4 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/parser/5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} + 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.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + debug: 4.3.4 + eslint: 8.25.0 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + /@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} @@ -14488,24 +14314,17 @@ packages: dependencies: '@typescript-eslint/types': 5.15.0 '@typescript-eslint/visitor-keys': 5.15.0 + dev: false - /@typescript-eslint/scope-manager/5.3.0: - resolution: {integrity: sha512-22Uic9oRlTsPppy5Tcwfj+QET5RWEnZ5414Prby465XxQrQFZ6nnm5KnXgnsAJefG4hEgMnaxTB3kNEyjdjj6A==} + /@typescript-eslint/scope-manager/5.43.0: + resolution: {integrity: sha512-XNWnGaqAtTJsUiZaoiGIrdJYHsUOd3BZ3Qj5zKp9w6km6HsrjPk/TGZv0qMTWyWj0+1QOqpHQ2gZOLXaGA9Ekw==} 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/types': 5.43.0 + '@typescript-eslint/visitor-keys': 5.43.0 - /@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 - - /@typescript-eslint/type-utils/5.15.0_himlt4eddny2rsb5zkuydvuf7u: - resolution: {integrity: sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==} + /@typescript-eslint/type-utils/5.43.0_himlt4eddny2rsb5zkuydvuf7u: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -14514,7 +14333,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.15.0_himlt4eddny2rsb5zkuydvuf7u + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.43.0_himlt4eddny2rsb5zkuydvuf7u debug: 4.3.4 eslint: 8.11.0 tsutils: 3.21.0_typescript@4.8.4 @@ -14523,8 +14343,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils/5.15.0_iqokrdhiz7bccawj5qurem2l4e: - resolution: {integrity: sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==} + /@typescript-eslint/type-utils/5.43.0_iqokrdhiz7bccawj5qurem2l4e: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -14533,7 +14353,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.15.0_iqokrdhiz7bccawj5qurem2l4e + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.43.0_iqokrdhiz7bccawj5qurem2l4e debug: 4.3.4 eslint: 8.12.0 tsutils: 3.21.0_typescript@4.8.4 @@ -14542,8 +14363,8 @@ packages: - supports-color dev: true - /@typescript-eslint/type-utils/5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q: - resolution: {integrity: sha512-KGeDoEQ7gHieLydujGEFLyLofipe9PIzfvA/41urz4hv+xVxPEbmMQonKSynZ0Ks2xDhJQ4VYjB3DnRiywvKDA==} + /@typescript-eslint/type-utils/5.43.0_yd7pksmmyt33nzyuulu63alu3m: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: '*' @@ -14552,7 +14373,28 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/utils': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.43.0_yd7pksmmyt33nzyuulu63alu3m + debug: 4.3.4 + eslint: 8.2.0 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/type-utils/5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q debug: 4.3.4 eslint: 8.25.0 tsutils: 3.21.0_typescript@4.8.4 @@ -14560,11 +14402,6 @@ packages: transitivePeerDependencies: - supports-color - /@typescript-eslint/types/3.10.1: - resolution: {integrity: sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - dev: true - /@typescript-eslint/types/4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -14573,14 +14410,10 @@ packages: /@typescript-eslint/types/5.15.0: resolution: {integrity: sha512-yEiTN4MDy23vvsIksrShjNwQl2vl6kJeG9YkVJXjXZnkJElzVK8nfPsWKYxcsGWG8GhurYXP4/KGj3aZAxbeOA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: false - /@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==} + /@typescript-eslint/types/5.43.0: + resolution: {integrity: sha512-jpsbcD0x6AUvV7tyOlyvon0aUsQpF8W+7TpJntfCUWU1qaIKu2K34pMwQKSzQH8ORgUrGYY6pVIh1Pi8TNeteg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} /@typescript-eslint/typescript-estree/2.34.0_typescript@4.8.4: @@ -14597,29 +14430,7 @@ packages: glob: 7.2.0 is-glob: 4.0.3 lodash: 4.17.21 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree/3.10.1_typescript@4.8.4: - resolution: {integrity: sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==} - engines: {node: ^10.12.0 || >=12.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 3.10.1 - '@typescript-eslint/visitor-keys': 3.10.1 - debug: 4.3.4 - glob: 7.2.0 - is-glob: 4.0.3 - lodash: 4.17.21 - semver: 7.3.7 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -14640,7 +14451,7 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: @@ -14661,14 +14472,15 @@ packages: debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: - supports-color + dev: false - /@typescript-eslint/typescript-estree/5.3.0_typescript@4.8.4: - resolution: {integrity: sha512-FJ0nqcaUOpn/6Z4Jwbtf+o0valjBLkqc3MWkMvrhA2TvzFXtcclIM8F4MBEmYa2kgcI8EZeSAzwoSrIC8JYkug==} + /@typescript-eslint/typescript-estree/5.43.0_typescript@4.8.4: + resolution: {integrity: sha512-BZ1WVe+QQ+igWal2tDbNg1j2HWUkAa+CVqdU79L4HP9izQY6CNhXfkNwd1SS4+sSZAP/EthI1uiCSY/+H0pROg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: typescript: '*' @@ -14676,73 +14488,16 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 5.3.0 - '@typescript-eslint/visitor-keys': 5.3.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/visitor-keys': 5.43.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.3.7 + semver: 7.3.8 tsutils: 3.21.0_typescript@4.8.4 typescript: 4.8.4 transitivePeerDependencies: - supports-color - dev: true - - /@typescript-eslint/typescript-estree/5.4.0_typescript@4.8.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.4 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.3.7 - tsutils: 3.21.0_typescript@4.8.4 - typescript: 4.8.4 - transitivePeerDependencies: - - supports-color - - /@typescript-eslint/utils/5.15.0_himlt4eddny2rsb5zkuydvuf7u: - resolution: {integrity: sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.15.0 - '@typescript-eslint/types': 5.15.0 - '@typescript-eslint/typescript-estree': 5.15.0_typescript@4.8.4 - eslint: 8.11.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.11.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/utils/5.15.0_iqokrdhiz7bccawj5qurem2l4e: - resolution: {integrity: sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@types/json-schema': 7.0.9 - '@typescript-eslint/scope-manager': 5.15.0 - '@typescript-eslint/types': 5.15.0 - '@typescript-eslint/typescript-estree': 5.15.0_typescript@4.8.4 - eslint: 8.12.0 - eslint-scope: 5.1.1 - eslint-utils: 3.0.0_eslint@8.12.0 - transitivePeerDependencies: - - supports-color - - typescript - dev: true /@typescript-eslint/utils/5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q: resolution: {integrity: sha512-081rWu2IPKOgTOhHUk/QfxuFog8m4wxW43sXNOMSCdh578tGJ1PAaWPsj42LOa7pguh173tNlMigsbrHvh/mtA==} @@ -14760,14 +14515,87 @@ packages: transitivePeerDependencies: - supports-color - typescript + dev: false - /@typescript-eslint/visitor-keys/3.10.1: - resolution: {integrity: sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} + /@typescript-eslint/utils/5.43.0_himlt4eddny2rsb5zkuydvuf7u: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint-visitor-keys: 1.3.0 + '@types/json-schema': 7.0.9 + '@types/semver': 7.3.12 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + eslint: 8.11.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.11.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript dev: true + /@typescript-eslint/utils/5.43.0_iqokrdhiz7bccawj5qurem2l4e: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@types/semver': 7.3.12 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + eslint: 8.12.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.12.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.43.0_yd7pksmmyt33nzyuulu63alu3m: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@types/semver': 7.3.12 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + eslint: 8.2.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.2.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/utils/5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@types/semver': 7.3.12 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + eslint: 8.25.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.25.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + /@typescript-eslint/visitor-keys/4.33.0: resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -14782,20 +14610,13 @@ packages: dependencies: '@typescript-eslint/types': 5.15.0 eslint-visitor-keys: 3.3.0 + dev: false - /@typescript-eslint/visitor-keys/5.3.0: - resolution: {integrity: sha512-oVIAfIQuq0x2TFDNLVavUn548WL+7hdhxYn+9j3YdJJXB7mH9dAmZNJsPDa7Jc+B9WGqoiex7GUDbyMxV0a/aw==} + /@typescript-eslint/visitor-keys/5.43.0: + resolution: {integrity: sha512-icl1jNH/d18OVHLfcwdL3bWUKsBeIiKYTGxMJCoGe7xFht+E4QgzOqoWYrU8XSLJWhVw8nTacbm03v23J/hFTg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: - '@typescript-eslint/types': 5.3.0 - eslint-visitor-keys: 3.3.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 + '@typescript-eslint/types': 5.43.0 eslint-visitor-keys: 3.3.0 /@use-gesture/core/10.2.10: @@ -15035,6 +14856,7 @@ packages: dependencies: webpack: 5.70.0_webpack-cli@4.9.2 webpack-cli: 4.9.2_wbg6qaiqcwsayvtung7xs6mhka + dev: true /@webpack-cli/info/1.4.1_webpack-cli@4.9.2: resolution: {integrity: sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==} @@ -15043,6 +14865,7 @@ packages: dependencies: envinfo: 7.8.1 webpack-cli: 4.9.2_wbg6qaiqcwsayvtung7xs6mhka + dev: true /@webpack-cli/serve/1.6.1_webpack-cli@4.9.2: resolution: {integrity: sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==} @@ -15054,6 +14877,7 @@ packages: optional: true dependencies: webpack-cli: 4.9.2_wbg6qaiqcwsayvtung7xs6mhka + dev: true /@wojtekmaj/enzyme-adapter-react-17/0.6.6_7ltvq4e2railvf5uya4ffxpe2a: resolution: {integrity: sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==} @@ -15444,7 +15268,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 - /@wordpress/block-editor/10.2.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/block-editor/10.2.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-9Bxq9hY3WEqodn/K/WSE+PoIwv6jKkKBP0pxXFJTWV1yc8/Np9QHV/7wG7qjztxxgu00FrYF7u8OZyvjPrSNYw==} engines: {node: '>=12'} peerDependencies: @@ -15457,7 +15281,7 @@ packages: '@wordpress/api-fetch': 6.16.0 '@wordpress/blob': 3.19.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 21.2.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/components': 21.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/date': 4.19.0 @@ -15502,7 +15326,7 @@ packages: - vite dev: false - /@wordpress/block-editor/9.8.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/block-editor/9.8.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-zIPqEysaLFJMnVKU/yCoCEBT3Co9xsa4Ow91T/LI94ll3LeWG/pyiX4PSSQNTx74AqbcNO2p79LVON4FLdu+mQ==} engines: {node: '>=12'} peerDependencies: @@ -15515,7 +15339,7 @@ packages: '@wordpress/api-fetch': 6.16.0 '@wordpress/blob': 3.19.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 20.0.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/components': 20.0.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/date': 4.19.0 @@ -15555,7 +15379,7 @@ packages: - '@babel/core' - '@types/react' - /@wordpress/block-library/7.16.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/block-library/7.16.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-iuFqo2Ms08z0s1t1MM4mI7Gt+oBmj7KW6hRPEdQst+8jaG6hpQX6TgOzBt2Nw+0P0w8QRdyJjoQsB1cipGcNgQ==} engines: {node: '>=12'} peerDependencies: @@ -15567,9 +15391,9 @@ packages: '@wordpress/api-fetch': 6.16.0 '@wordpress/autop': 3.19.0 '@wordpress/blob': 3.19.0 - '@wordpress/block-editor': 10.2.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/block-editor': 10.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 21.2.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/components': 21.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/core-data': 5.2.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 @@ -15584,9 +15408,9 @@ packages: '@wordpress/keycodes': 3.19.0 '@wordpress/notices': 3.19.0_react@17.0.2 '@wordpress/primitives': 3.17.0 - '@wordpress/reusable-blocks': 3.17.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/reusable-blocks': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/rich-text': 5.17.0_react@17.0.2 - '@wordpress/server-side-render': 3.17.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/server-side-render': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/url': 3.20.0 '@wordpress/viewport': 4.17.0_react@17.0.2 change-case: 4.1.2 @@ -15755,7 +15579,7 @@ packages: - react-with-direction dev: false - /@wordpress/components/19.12.0_lxraipvdfcmyzw3sdzk3k7kygu: + /@wordpress/components/19.12.0_tufdcic6wklrwyy3rhbsbktylu: resolution: {integrity: sha512-Ac1+aIMM7NDgN3G7i5kcaETSvZfeqB4U6PubApPmM6FdBF5VfkYUZeqNcC7cuJdveyokRrqHg11/l+DcJGA7/g==} engines: {node: '>=12'} peerDependencies: @@ -15765,11 +15589,11 @@ packages: '@babel/runtime': 7.19.0 '@emotion/cache': 11.7.1 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_ob76esr53kubcxaa2cuzm2qzvy + '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_7vcmqpdcqsve2266oufnu5rnva + '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq '@emotion/utils': 1.0.0 - '@floating-ui/react-dom': 0.6.3_6rln7q2jvtuewdvbdwpg4txtvm + '@floating-ui/react-dom': 0.6.3_hiunvzosbwliizyirxfy6hjyim '@use-gesture/react': 10.2.10_react@17.0.2 '@wordpress/a11y': 3.19.0 '@wordpress/compose': 5.17.0_react@17.0.2 @@ -15842,61 +15666,7 @@ packages: classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 - downshift: 6.1.12_react@17.0.2 - framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m - gradient-parser: 0.1.5 - highlight-words-core: 1.2.2 - lodash: 4.17.21 - memize: 1.1.0 - moment: 2.29.1 - re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m - react: 17.0.2 - react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m - react-dates: 17.2.0_doem77jvh4k7pyuvpbnkip467u - react-dom: 17.0.2_react@17.0.2 - react-resize-aware: 3.1.1_react@17.0.2 - reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m - uuid: 8.3.2 - transitivePeerDependencies: - - '@babel/core' - - '@types/react' - - react-with-direction - dev: false - - /@wordpress/components/19.6.1_lxraipvdfcmyzw3sdzk3k7kygu: - resolution: {integrity: sha512-O6hnJm9tfxkPnKknnJInpMy6qUS29CfRYtX5p5HdQMR2QFaOYvmwy7of3s5zBh7mubx3NeSzMy+ytZEWJ9ETJw==} - engines: {node: '>=12'} - peerDependencies: - react: ^17.0.0 - react-dom: ^17.0.0 - dependencies: - '@babel/runtime': 7.17.7 - '@emotion/cache': 11.7.1 - '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_ob76esr53kubcxaa2cuzm2qzvy - '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_7vcmqpdcqsve2266oufnu5rnva - '@emotion/utils': 1.0.0 - '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.4.1 - '@wordpress/compose': 5.2.1_react@17.0.2 - '@wordpress/date': 4.4.1 - '@wordpress/deprecated': 3.4.1 - '@wordpress/dom': 3.4.1 - '@wordpress/element': 4.8.0 - '@wordpress/escape-html': 2.4.1 - '@wordpress/hooks': 3.5.0 - '@wordpress/i18n': 4.4.1 - '@wordpress/icons': 8.0.1 - '@wordpress/is-shallow-equal': 4.4.1 - '@wordpress/keycodes': 3.4.1 - '@wordpress/primitives': 3.2.1 - '@wordpress/rich-text': 5.2.1_react@17.0.2 - '@wordpress/warning': 2.4.1 - classnames: 2.3.1 - colord: 2.9.2 - dom-scroll-into-view: 1.2.1 - downshift: 6.1.12_react@17.0.2 + downshift: 6.1.7_react@17.0.2 framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m gradient-parser: 0.1.5 highlight-words-core: 1.2.2 @@ -15971,7 +15741,61 @@ packages: - react-with-direction dev: false - /@wordpress/components/20.0.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/components/19.6.1_tufdcic6wklrwyy3rhbsbktylu: + resolution: {integrity: sha512-O6hnJm9tfxkPnKknnJInpMy6qUS29CfRYtX5p5HdQMR2QFaOYvmwy7of3s5zBh7mubx3NeSzMy+ytZEWJ9ETJw==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.17.7 + '@emotion/cache': 11.7.1 + '@emotion/css': 11.7.1_@babel+core@7.17.8 + '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau + '@emotion/serialize': 1.0.2 + '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq + '@emotion/utils': 1.0.0 + '@use-gesture/react': 10.2.10_react@17.0.2 + '@wordpress/a11y': 3.4.1 + '@wordpress/compose': 5.2.1_react@17.0.2 + '@wordpress/date': 4.4.1 + '@wordpress/deprecated': 3.4.1 + '@wordpress/dom': 3.4.1 + '@wordpress/element': 4.8.0 + '@wordpress/escape-html': 2.4.1 + '@wordpress/hooks': 3.5.0 + '@wordpress/i18n': 4.4.1 + '@wordpress/icons': 8.0.1 + '@wordpress/is-shallow-equal': 4.4.1 + '@wordpress/keycodes': 3.4.1 + '@wordpress/primitives': 3.2.1 + '@wordpress/rich-text': 5.2.1_react@17.0.2 + '@wordpress/warning': 2.4.1 + classnames: 2.3.1 + colord: 2.9.2 + dom-scroll-into-view: 1.2.1 + downshift: 6.1.7_react@17.0.2 + framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m + gradient-parser: 0.1.5 + highlight-words-core: 1.2.2 + lodash: 4.17.21 + memize: 1.1.0 + moment: 2.29.1 + re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m + react: 17.0.2 + react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m + react-dates: 17.2.0_doem77jvh4k7pyuvpbnkip467u + react-dom: 17.0.2_react@17.0.2 + react-resize-aware: 3.1.1_react@17.0.2 + reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m + uuid: 8.3.2 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - react-with-direction + dev: false + + /@wordpress/components/20.0.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-RBPjtGLSoiV5YKhrBYh+/X8LbzbA99BJaB4Q+P0e1rVOwGzeBF3M7YEjmg1PrrzWaItqJZTvDoyZo+ql7c0KfA==} engines: {node: '>=12'} peerDependencies: @@ -15981,9 +15805,9 @@ packages: '@babel/runtime': 7.19.0 '@emotion/cache': 11.7.1 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_ob76esr53kubcxaa2cuzm2qzvy + '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_7vcmqpdcqsve2266oufnu5rnva + '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq '@emotion/utils': 1.1.0 '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m '@use-gesture/react': 10.2.10_react@17.0.2 @@ -16025,7 +15849,7 @@ packages: - '@babel/core' - '@types/react' - /@wordpress/components/21.2.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/components/21.2.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-pYz+EY+Tv/O2JuDBXpaFH/zv9Evty/e6NOGjOzddSeaShZ/mCq2DpUSWPuTFBEAjtv6h9HnpkakbNnEeio5yNA==} engines: {node: '>=12'} peerDependencies: @@ -16035,9 +15859,9 @@ packages: '@babel/runtime': 7.19.0 '@emotion/cache': 11.7.1 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_ob76esr53kubcxaa2cuzm2qzvy + '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_7vcmqpdcqsve2266oufnu5rnva + '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq '@emotion/utils': 1.1.0 '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m '@use-gesture/react': 10.2.10_react@17.0.2 @@ -16089,7 +15913,7 @@ packages: /@wordpress/compose/3.25.3_react@16.14.0: resolution: {integrity: sha512-tCO2EnJCkCH548OqA0uU8V1k/1skz2QwBlHs8ZQSpimqUS4OWWsAlndCEFe4U4vDTqFt2ow7tzAir+05Cw8MAg==} dependencies: - '@babel/runtime': 7.17.7 + '@babel/runtime': 7.19.0 '@wordpress/deprecated': 2.12.3 '@wordpress/dom': 2.18.0 '@wordpress/element': 2.20.3 @@ -16108,7 +15932,7 @@ packages: /@wordpress/compose/3.25.3_react@17.0.2: resolution: {integrity: sha512-tCO2EnJCkCH548OqA0uU8V1k/1skz2QwBlHs8ZQSpimqUS4OWWsAlndCEFe4U4vDTqFt2ow7tzAir+05Cw8MAg==} dependencies: - '@babel/runtime': 7.17.7 + '@babel/runtime': 7.19.0 '@wordpress/deprecated': 2.12.3 '@wordpress/dom': 2.18.0 '@wordpress/element': 2.20.3 @@ -16655,7 +16479,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@types/react': 17.0.40 + '@types/react': 17.0.50 '@types/react-dom': 17.0.13 '@wordpress/escape-html': 2.15.0 lodash: 4.17.21 @@ -16722,15 +16546,15 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/eslint-parser': 7.17.0_mmjp4mnkdla6iowedn6uhpeiai - '@typescript-eslint/eslint-plugin': 5.15.0_clfp6sw7udaeohpinqea5s7hji - '@typescript-eslint/parser': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq + '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q '@wordpress/babel-preset-default': 6.17.0 '@wordpress/prettier-config': 1.1.3 cosmiconfig: 7.0.1 eslint: 8.25.0 eslint-config-prettier: 8.5.0_eslint@8.25.0 - eslint-plugin-import: 2.25.4_sj4mg6rremrtpotemefly2lvdy - eslint-plugin-jest: 25.7.0_bsk2rusjidc2eojt7zllxvh26q + eslint-plugin-import: 2.25.4_5giipivvrkjwpspmcck55fgaja + eslint-plugin-jest: 25.7.0_avhcq6piyz75wjz4x3cxqm6t3m eslint-plugin-jsdoc: 37.9.7_eslint@8.25.0 eslint-plugin-jsx-a11y: 6.5.1_eslint@8.25.0 eslint-plugin-playwright: 0.8.0_ujw2vewnku7bdwdfgagcxtzxae @@ -16764,15 +16588,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/eslint-parser': 7.17.0_2sahtlaqcjxbvw6x6d2jsqyrai - '@typescript-eslint/eslint-plugin': 5.15.0_clfp6sw7udaeohpinqea5s7hji - '@typescript-eslint/parser': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq + '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q '@wordpress/babel-preset-default': 7.3.0 '@wordpress/prettier-config': 2.2.0_prettier@2.3.0 cosmiconfig: 7.0.1 eslint: 8.25.0 eslint-config-prettier: 8.5.0_eslint@8.25.0 - eslint-plugin-import: 2.25.4_sj4mg6rremrtpotemefly2lvdy - eslint-plugin-jest: 25.7.0_gctrf7lch3we4xddiocw76clue + eslint-plugin-import: 2.25.4_5giipivvrkjwpspmcck55fgaja + eslint-plugin-jest: 25.7.0_3y2nwuawvch4guq6v72bjm4ajq eslint-plugin-jsdoc: 37.9.7_eslint@8.25.0 eslint-plugin-jsx-a11y: 6.5.1_eslint@8.25.0 eslint-plugin-prettier: 3.4.1_xewdwxdxvhaotirttsgfltr2ce @@ -17460,16 +17284,16 @@ packages: rungen: 0.3.2 dev: false - /@wordpress/reusable-blocks/3.17.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/reusable-blocks/3.17.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-7ZfhtpWGvtT7xWqY/mCwC93zFHTVPQf8SZRjy2jAhcl7RNY6KZpW82rMRKNROEKJ4cYbTOMMf7WL2ulYi6cNFw==} engines: {node: '>=12'} peerDependencies: react: ^17.0.0 react-dom: ^17.0.0 dependencies: - '@wordpress/block-editor': 10.2.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/block-editor': 10.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 21.2.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/components': 21.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/core-data': 5.2.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/element': 4.17.0 @@ -17697,7 +17521,7 @@ packages: - webpack-dev-server dev: true - /@wordpress/server-side-render/3.17.0_67fiyx7k2wr2ple2yfldahug5u: + /@wordpress/server-side-render/3.17.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-yJBM1hLl6n9w9X17deSsUc2Fbt/eBKDw2pzwbiPalKUGjP5RSKflzVb1uOwSr+KDUPo4vHj1hwkqO+RHssHHRg==} engines: {node: '>=12'} peerDependencies: @@ -17707,7 +17531,7 @@ packages: '@babel/runtime': 7.19.0 '@wordpress/api-fetch': 6.16.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 21.2.0_67fiyx7k2wr2ple2yfldahug5u + '@wordpress/components': 21.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 @@ -17878,7 +17702,7 @@ packages: '@wp-g2/context': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi '@wp-g2/styles': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise - csstype: 3.0.10 + csstype: 3.1.1 downshift: 6.1.12_react@16.14.0 framer-motion: 2.9.5_wdcame2n4eqmtj7c7r7wzweise highlight-words-core: 1.2.2 @@ -19210,19 +19034,6 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.16.12: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: @@ -19265,7 +19076,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 core-js-compat: 3.25.5 transitivePeerDependencies: - supports-color @@ -19277,7 +19088,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-define-polyfill-provider': 0.3.0_@babel+core@7.17.8 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 core-js-compat: 3.25.5 transitivePeerDependencies: - supports-color @@ -19684,6 +19495,7 @@ packages: check-types: 8.0.3 hoopy: 0.1.4 tryer: 1.0.1 + dev: true /big-integer/1.6.51: resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} @@ -20512,6 +20324,7 @@ packages: /check-types/8.0.3: resolution: {integrity: sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==} + dev: true /cheerio-select/1.5.0: resolution: {integrity: sha512-qocaHPv5ypefh6YNxvnbABM07KMxExbtbfuJoIie3iZXX1ERwYmJcIiRrr9H05ucQP1k28dav8rpdDgjQd8drg==} @@ -20960,6 +20773,7 @@ packages: /colorette/2.0.16: resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} + dev: true /colors/0.6.2: resolution: {integrity: sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==} @@ -21042,20 +20856,21 @@ packages: /commander/7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + dev: true /commander/8.3.0: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} dev: true - /commander/9.3.0: - resolution: {integrity: sha512-hv95iU5uXPbK83mjrJKuZyFM/LBAoCV/XhVGkS5Je6tl7sxr6A0ITMw5WoRV46/UaJ46Nllm3Xt7IaJhXTIkzw==} - engines: {node: ^12.20.0 || >=14} - dev: true - /commander/9.4.0: resolution: {integrity: sha512-sRPT+umqkz90UA8M1yqYfnHlZA7fF6nSphDtxeywPZ49ysjxDQybzk13CL+mXekDRG92skbcqCLVovuCusNmFw==} engines: {node: ^12.20.0 || >=14} + dev: false + + /commander/9.4.1: + resolution: {integrity: sha512-5EEkTNyHNGFPD2H+c/dXXfQZYa/scCKasxWcXJaWnNJ99pnQN9Vnmqow+p+PlFPE63Q6mThaZws1T+HxfpgtPw==} + engines: {node: ^12.20.0 || >=14} /comment-parser/0.7.6: resolution: {integrity: sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==} @@ -21590,7 +21405,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.0 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /css-loader/5.2.7_webpack@5.70.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} @@ -21607,7 +21422,7 @@ packages: postcss-modules-values: 4.0.0_postcss@8.4.12 postcss-value-parser: 4.2.0 schema-utils: 3.1.1 - semver: 7.3.7 + semver: 7.3.8 webpack: 5.70.0 dev: true @@ -21841,9 +21656,6 @@ packages: /csstype/2.6.20: resolution: {integrity: sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA==} - /csstype/3.0.10: - resolution: {integrity: sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA==} - /csstype/3.1.1: resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} @@ -22616,6 +22428,7 @@ packages: /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true /duplexer3/0.1.4: resolution: {integrity: sha512-CEj8FwwNA4cVH2uFCoHUrmojhYh1vmCdOaneKJXwkeY1i9jnlslVo9dx+hQ5Hl9GnH/Bwy/IjxAyOePyPKYnzA==} @@ -22647,6 +22460,7 @@ packages: resolution: {integrity: sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==} engines: {node: '>=0.10.0'} requiresBuild: true + dev: true /ejs/3.1.8: resolution: {integrity: sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==} @@ -23146,7 +22960,7 @@ packages: dependencies: debug: 4.3.3 eslint: 8.11.0 - eslint-plugin-import: 2.25.4_o53s3emd3qikejdbqbxdd6vyim + eslint-plugin-import: 2.25.4_mwel7v7qi7wwnb6yoytqwvyg4e glob: 7.2.0 is-glob: 4.0.3 resolve: 1.20.0 @@ -23165,7 +22979,7 @@ packages: array-find: 1.0.0 debug: 3.2.7 enhanced-resolve: 0.9.1 - eslint-plugin-import: 2.25.4_o53s3emd3qikejdbqbxdd6vyim + eslint-plugin-import: 2.25.4_mwel7v7qi7wwnb6yoytqwvyg4e find-root: 1.1.0 has: 1.0.3 interpret: 1.4.0 @@ -23179,7 +22993,7 @@ packages: - supports-color dev: true - /eslint-module-utils/2.7.3_54d5qjwnmqnp5634aqlesxatge: + /eslint-module-utils/2.7.3_fmuy6wfytpxcy4lufnxcokvnry: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} peerDependencies: @@ -23197,41 +23011,13 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q debug: 3.2.7 eslint-import-resolver-node: 0.3.6 find-up: 2.1.0 transitivePeerDependencies: - supports-color - /eslint-module-utils/2.7.3_gi2uhd4z3ge23sdh3g6bz7is2q: - resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - dependencies: - '@typescript-eslint/parser': 5.15.0_himlt4eddny2rsb5zkuydvuf7u - debug: 3.2.7 - eslint-import-resolver-node: 0.3.6 - eslint-import-resolver-typescript: 2.5.0_7yrnqyx753fo5bwjhiag2wpedy - eslint-import-resolver-webpack: 0.13.2_xlbwhpbmf5dkmuyaaidudnwply - find-up: 2.1.0 - transitivePeerDependencies: - - supports-color - dev: true - /eslint-module-utils/2.7.3_lkzaig2qiyp6elizstfbgvzhie: resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} engines: {node: '>=4'} @@ -23258,6 +23044,64 @@ packages: - supports-color dev: true + /eslint-module-utils/2.7.3_p4g3punufuo4uj6odspnpzo2u4: + resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.43.0_himlt4eddny2rsb5zkuydvuf7u + debug: 3.2.7 + eslint-import-resolver-node: 0.3.6 + eslint-import-resolver-typescript: 2.5.0_7yrnqyx753fo5bwjhiag2wpedy + eslint-import-resolver-webpack: 0.13.2_xlbwhpbmf5dkmuyaaidudnwply + find-up: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import/2.25.4_5giipivvrkjwpspmcck55fgaja: + resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + array-includes: 3.1.4 + array.prototype.flat: 1.2.5 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.25.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3_fmuy6wfytpxcy4lufnxcokvnry + has: 1.0.3 + is-core-module: 2.10.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.1 + tsconfig-paths: 3.14.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + /eslint-plugin-import/2.25.4_ffi3uiz42rv3jyhs6cr7p7qqry: resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} engines: {node: '>=4'} @@ -23277,11 +23121,11 @@ packages: eslint-import-resolver-node: 0.3.6 eslint-module-utils: 2.7.3_lkzaig2qiyp6elizstfbgvzhie has: 1.0.3 - is-core-module: 2.8.0 + is-core-module: 2.10.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -23289,7 +23133,7 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.25.4_o53s3emd3qikejdbqbxdd6vyim: + /eslint-plugin-import/2.25.4_mwel7v7qi7wwnb6yoytqwvyg4e: resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} engines: {node: '>=4'} peerDependencies: @@ -23299,14 +23143,14 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 5.15.0_himlt4eddny2rsb5zkuydvuf7u + '@typescript-eslint/parser': 5.43.0_himlt4eddny2rsb5zkuydvuf7u array-includes: 3.1.4 array.prototype.flat: 1.2.5 debug: 2.6.9 doctrine: 2.1.0 eslint: 8.11.0 eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_gi2uhd4z3ge23sdh3g6bz7is2q + eslint-module-utils: 2.7.3_p4g3punufuo4uj6odspnpzo2u4 has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 @@ -23320,36 +23164,6 @@ packages: - supports-color dev: true - /eslint-plugin-import/2.25.4_sj4mg6rremrtpotemefly2lvdy: - resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - dependencies: - '@typescript-eslint/parser': 5.15.0_z4bbprzjrhnsfa24uvmcbu7f5q - array-includes: 3.1.4 - array.prototype.flat: 1.2.5 - debug: 2.6.9 - doctrine: 2.1.0 - eslint: 8.25.0 - eslint-import-resolver-node: 0.3.6 - eslint-module-utils: 2.7.3_54d5qjwnmqnp5634aqlesxatge - has: 1.0.3 - is-core-module: 2.8.0 - is-glob: 4.0.3 - minimatch: 3.0.4 - object.values: 1.1.5 - resolve: 1.20.0 - tsconfig-paths: 3.14.0 - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - /eslint-plugin-jest/23.20.0_3rubbgt5ekhqrcgx4uwls3neim: resolution: {integrity: sha512-+6BGQt85OREevBDWCvhqj1yYA4+BFK4XnRZSGJionuEYmcglMZYLNNBBemwzbqUAckURaHdJSBcjHPyrtypZOw==} engines: {node: '>=8'} @@ -23407,7 +23221,7 @@ packages: - typescript dev: true - /eslint-plugin-jest/25.7.0_bsk2rusjidc2eojt7zllxvh26q: + /eslint-plugin-jest/25.7.0_3y2nwuawvch4guq6v72bjm4ajq: resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -23420,30 +23234,8 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.15.0_clfp6sw7udaeohpinqea5s7hji - '@typescript-eslint/experimental-utils': 5.4.0_z4bbprzjrhnsfa24uvmcbu7f5q - eslint: 8.25.0 - jest: 27.3.1 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /eslint-plugin-jest/25.7.0_gctrf7lch3we4xddiocw76clue: - resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - jest: '*' - peerDependenciesMeta: - '@typescript-eslint/eslint-plugin': - optional: true - jest: - optional: true - dependencies: - '@typescript-eslint/eslint-plugin': 5.15.0_clfp6sw7udaeohpinqea5s7hji - '@typescript-eslint/experimental-utils': 5.4.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq + '@typescript-eslint/experimental-utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q eslint: 8.25.0 jest: 27.5.1 transitivePeerDependencies: @@ -23451,6 +23243,28 @@ packages: - typescript dev: false + /eslint-plugin-jest/25.7.0_avhcq6piyz75wjz4x3cxqm6t3m: + resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^4.0.0 || ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + dependencies: + '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq + '@typescript-eslint/experimental-utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + eslint: 8.25.0 + jest: 27.3.1 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /eslint-plugin-jsdoc/18.11.0_eslint@8.25.0: resolution: {integrity: sha512-24J2+eK2ZHZ1KvpKcoOEir2k4xJKfPzZ1JC9PToi8y8Tn59T8TVVSNRTTRzsDdiaQeIbehApB3KxqIfJG8o7hg==} engines: {node: '>=6'} @@ -23482,7 +23296,7 @@ packages: jsdoctypeparser: 9.0.0 lodash: 4.17.21 regextras: 0.7.1 - semver: 7.3.7 + semver: 7.3.8 spdx-expression-parse: 3.0.1 transitivePeerDependencies: - supports-color @@ -23502,7 +23316,7 @@ packages: jsdoc-type-pratt-parser: 1.2.0 lodash: 4.17.21 regextras: 0.8.0 - semver: 7.3.7 + semver: 7.3.8 spdx-expression-parse: 3.0.1 transitivePeerDependencies: - supports-color @@ -23521,7 +23335,7 @@ packages: eslint: 8.25.0 esquery: 1.4.0 regextras: 0.8.0 - semver: 7.3.7 + semver: 7.3.8 spdx-expression-parse: 3.0.1 transitivePeerDependencies: - supports-color @@ -23598,7 +23412,7 @@ packages: optional: true dependencies: eslint: 8.25.0 - eslint-plugin-jest: 25.7.0_bsk2rusjidc2eojt7zllxvh26q + eslint-plugin-jest: 25.7.0_avhcq6piyz75wjz4x3cxqm6t3m dev: true /eslint-plugin-prettier/3.4.1_4xmrr3ukt4my57j2lnjkrj33s4: @@ -24024,7 +23838,7 @@ packages: optionator: 0.9.1 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.3.7 + semver: 7.3.8 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.8.0 @@ -24756,6 +24570,7 @@ packages: /fastest-levenshtein/1.0.12: resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==} + dev: true /fastq/1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} @@ -24899,6 +24714,7 @@ packages: /filesize/3.6.1: resolution: {integrity: sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==} engines: {node: '>= 0.4.0'} + dev: true /fill-range/4.0.0: resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==} @@ -25287,7 +25103,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.7 + semver: 7.3.8 tapable: 1.1.3 typescript: 4.8.4 webpack: 5.70.0 @@ -25319,7 +25135,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.7 + semver: 7.3.8 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0_webpack-cli@3.3.12 @@ -25382,7 +25198,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.7 + semver: 7.3.8 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0 @@ -25440,8 +25256,8 @@ packages: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} engines: {node: '>= 0.6'} - /fp-ts/2.12.1: - resolution: {integrity: sha512-oxvgqUYR6O9VkKXrxkJ0NOyU0FrE705MeqgBUMEPWyTu6Pwn768cJbHChw2XOBlgFLKfIHxjr2OOBFpv2mUGZw==} + /fp-ts/2.13.1: + resolution: {integrity: sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==} dev: true /fraction.js/4.2.0: @@ -26431,6 +26247,7 @@ packages: dependencies: duplexer: 0.1.2 pify: 4.0.1 + dev: true /gzip-size/6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} @@ -26731,6 +26548,7 @@ packages: /hoopy/0.1.4: resolution: {integrity: sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==} engines: {node: '>= 6.0.0'} + dev: true /hosted-git-info/2.8.9: resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} @@ -27034,12 +26852,12 @@ packages: - supports-color dev: true - /i18n-calypso/6.0.1_adlholpkqbiq5amp2fy4vkqcli: + /i18n-calypso/6.0.1_pxzommwrsowkd4kgag6q3sluym: resolution: {integrity: sha512-+/mWjFd0IR7VWqTV4iVOiu2wyKLtkoiioABPISVVTy3ybe1EnW8JmTnWnpQh3t6Fq3rHhstO6lMzpi/b6Idk4A==} peerDependencies: react: ^17.0.2 dependencies: - '@automattic/interpolate-components': 1.2.1_adlholpkqbiq5amp2fy4vkqcli + '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym '@babel/runtime': 7.19.0 '@tannin/sprintf': 1.2.0 '@wordpress/compose': 5.17.0_react@17.0.2 @@ -27109,11 +26927,6 @@ packages: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} engines: {node: '>= 4'} - /ignore/5.1.8: - resolution: {integrity: sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==} - engines: {node: '>= 4'} - dev: true - /ignore/5.1.9: resolution: {integrity: sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==} engines: {node: '>= 4'} @@ -27313,6 +27126,7 @@ packages: /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} + dev: true /invariant/2.2.4: resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} @@ -29869,7 +29683,7 @@ packages: jest-resolve: 26.6.2 natural-compare: 1.4.0 pretty-format: 26.6.2 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color dev: true @@ -29901,7 +29715,7 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color dev: true @@ -29931,7 +29745,7 @@ packages: jest-util: 27.5.1 natural-compare: 1.4.0 pretty-format: 27.5.1 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color @@ -32183,7 +31997,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.0.0 - webpack: 5.70.0_webpack-cli@4.9.2 + webpack: 5.70.0 /minimalistic-assert/1.0.1: resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} @@ -32196,6 +32010,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -32514,6 +32329,9 @@ packages: transitivePeerDependencies: - supports-color + /natural-compare-lite/1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -32627,7 +32445,7 @@ packages: nopt: 5.0.0 npmlog: 6.0.2 rimraf: 3.0.2 - semver: 7.3.7 + semver: 7.3.8 tar: 6.1.11 which: 2.0.2 transitivePeerDependencies: @@ -32694,7 +32512,7 @@ packages: dependencies: growly: 1.3.0 is-wsl: 2.2.0 - semver: 7.3.7 + semver: 7.3.8 shellwords: 0.1.1 uuid: 8.3.2 which: 2.0.2 @@ -32769,7 +32587,7 @@ packages: dependencies: hosted-git-info: 4.0.2 is-core-module: 2.8.0 - semver: 7.3.7 + semver: 7.3.8 validate-npm-package-license: 3.0.4 dev: true @@ -32822,7 +32640,7 @@ packages: resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} engines: {node: '>=10'} dependencies: - semver: 7.3.7 + semver: 7.3.8 dev: true /npm-normalize-package-bin/1.0.1: @@ -32839,7 +32657,7 @@ packages: engines: {node: '>=10'} dependencies: hosted-git-info: 4.0.2 - semver: 7.3.7 + semver: 7.3.8 validate-npm-package-name: 3.0.0 dev: true @@ -32860,7 +32678,7 @@ packages: log-symbols: 4.1.0 meow: 6.1.1 plur: 4.0.0 - semver: 7.3.7 + semver: 7.3.8 slash: 3.0.0 strip-json-comments: 3.1.1 transitivePeerDependencies: @@ -32884,7 +32702,7 @@ packages: npm-install-checks: 4.0.0 npm-normalize-package-bin: 1.0.1 npm-package-arg: 8.1.5 - semver: 7.3.7 + semver: 7.3.8 dev: true /npm-registry-fetch/12.0.2: @@ -33221,6 +33039,7 @@ packages: /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==} @@ -34127,7 +33946,7 @@ packages: loader-utils: 2.0.2 postcss: 7.0.39 schema-utils: 3.1.1 - semver: 7.3.7 + semver: 7.3.8 webpack: 4.46.0 dev: true @@ -34141,7 +33960,7 @@ packages: cosmiconfig: 7.0.1 klona: 2.0.5 postcss: 8.4.12 - semver: 7.3.7 + semver: 7.3.8 webpack: 5.70.0_bgqcrdgdviybk52kjcpjat65sa dev: true @@ -36146,7 +35965,7 @@ packages: react-shallow-renderer: 16.14.1_react@17.0.2 scheduler: 0.20.2 - /react-textarea-autosize/8.3.3_adlholpkqbiq5amp2fy4vkqcli: + /react-textarea-autosize/8.3.3_pxzommwrsowkd4kgag6q3sluym: resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} engines: {node: '>=10'} peerDependencies: @@ -36155,7 +35974,7 @@ packages: '@babel/runtime': 7.19.0 react: 17.0.2 use-composed-ref: 1.2.1_react@17.0.2 - use-latest: 1.2.0_adlholpkqbiq5amp2fy4vkqcli + use-latest: 1.2.0_pxzommwrsowkd4kgag6q3sluym transitivePeerDependencies: - '@types/react' dev: true @@ -36760,6 +36579,7 @@ packages: engines: {node: '>= 0.10'} dependencies: resolve: 1.22.1 + dev: true /redent/3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} @@ -37479,7 +37299,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 semver: 7.3.5 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /sass-loader/12.6.0_sass@1.49.9+webpack@5.70.0: resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} @@ -37671,6 +37491,13 @@ packages: dependencies: lru-cache: 6.0.0 + /semver/7.3.8: + resolution: {integrity: sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + /send/0.18.0: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} @@ -38964,7 +38791,7 @@ packages: mime: 2.6.0 qs: 6.10.3 readable-stream: 3.6.0 - semver: 7.3.7 + semver: 7.3.8 transitivePeerDependencies: - supports-color dev: false @@ -39102,21 +38929,21 @@ packages: resolution: {integrity: sha512-k8uzYIkIVwmT+TcglpdN50pS2y1BDcUnBPK9iJeGu0Pl1lOI8pD6wtzgw91Pjpe+RxtTncw32tLxs/R0yNL2Mg==} dev: true - /syncpack/8.2.4: - resolution: {integrity: sha512-Tq1RzTqQwGCe8htWqJPHcA55LqGLO4wG1F2DCGMFflfX3ujbRoiXq2MYd7XFvm3mzxv1BPVQQp8DU2ZkY14e2A==} + /syncpack/8.3.9: + resolution: {integrity: sha512-oDaEvgZAoU40WXX4okQ7DiCfVEcO2antl+jV+Av+FbS4Hyh8VoJ8F6HGo2G8eT9H+AyBBM1iDUdbtR1MQRimoQ==} engines: {node: '>=10'} hasBin: true dependencies: chalk: 4.1.2 - commander: 9.3.0 + commander: 9.4.1 cosmiconfig: 7.0.1 expect-more: 1.2.0 - fp-ts: 2.12.1 + fp-ts: 2.13.1 fs-extra: 10.1.0 glob: 8.0.3 minimatch: 5.1.0 read-yaml-file: 2.1.0 - semver: 7.3.7 + semver: 7.3.8 dev: true /table/5.4.6: @@ -39748,6 +39575,7 @@ packages: /tryer/1.0.1: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + dev: true /ts-dedent/2.2.0: resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} @@ -40689,7 +40517,7 @@ packages: tiny-warning: 1.0.3 dev: false - /use-isomorphic-layout-effect/1.1.1_adlholpkqbiq5amp2fy4vkqcli: + /use-isomorphic-layout-effect/1.1.1_pxzommwrsowkd4kgag6q3sluym: resolution: {integrity: sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==} peerDependencies: '@types/react': '*' @@ -40698,7 +40526,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 react: 17.0.2 /use-isomorphic-layout-effect/1.1.1_react@16.14.0: @@ -40725,7 +40553,7 @@ packages: react: 17.0.2 dev: true - /use-latest/1.2.0_adlholpkqbiq5amp2fy4vkqcli: + /use-latest/1.2.0_pxzommwrsowkd4kgag6q3sluym: resolution: {integrity: sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==} peerDependencies: '@types/react': '*' @@ -40734,9 +40562,9 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 17.0.40 + '@types/react': 17.0.50 react: 17.0.2 - use-isomorphic-layout-effect: 1.1.1_adlholpkqbiq5amp2fy4vkqcli + use-isomorphic-layout-effect: 1.1.1_pxzommwrsowkd4kgag6q3sluym dev: true /use-latest/1.2.0_react@16.14.0: @@ -41216,6 +41044,7 @@ packages: - bufferutil - supports-color - utf-8-validate + dev: true /webpack-bundle-analyzer/4.6.1: resolution: {integrity: sha512-oKz9Oz9j3rUciLNfpGFjOb49/jEpXNmWdVH8Ls//zNcnLlQdTGXQQMsBbb/gR7Zl8WNLxVCq+0Hqbx3zv6twBw==} @@ -41311,6 +41140,7 @@ packages: webpack: 5.70.0_webpack-cli@4.9.2 webpack-bundle-analyzer: 3.9.0 webpack-merge: 5.8.0 + dev: true /webpack-cli/4.9.2_webpack@5.70.0: resolution: {integrity: sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==} @@ -41437,6 +41267,7 @@ packages: dependencies: clone-deep: 4.0.1 wildcard: 2.0.0 + dev: true /webpack-remove-empty-scripts/0.7.3_webpack@5.70.0: resolution: {integrity: sha512-yipqb25A0qtH7X9vKt6yihwyYkTtSlRiDdBb2QsyrkqGM3hpfAcfOO1lYDef9HQUNm3s8ojmorbNg32XXX6FYg==} @@ -41726,6 +41557,7 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: true /websocket-driver/0.7.4: resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} @@ -41865,6 +41697,7 @@ packages: /wildcard/2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} + dev: true /window-size/0.2.0: resolution: {integrity: sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=} @@ -42155,7 +41988,7 @@ packages: engines: {node: '>=10'} /yallist/2.1.2: - resolution: {integrity: sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=} + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} dev: true /yallist/3.1.1: @@ -42357,7 +42190,7 @@ packages: pacote: 12.0.3 preferred-pm: 3.0.3 pretty-bytes: 5.6.0 - semver: 7.3.7 + semver: 7.3.8 slash: 3.0.0 strip-ansi: 6.0.1 text-table: 0.2.0 @@ -42386,7 +42219,7 @@ packages: minimist: 1.2.5 read-pkg-up: 7.0.1 run-async: 2.4.1 - semver: 7.3.7 + semver: 7.3.8 shelljs: 0.8.5 sort-keys: 4.2.0 text-table: 0.2.0 From 6ac092e49881698c403e1113df05aba66960aa4f Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Tue, 22 Nov 2022 11:30:44 -0300 Subject: [PATCH 0105/1680] Add tracks events to a few sections (#35262) * Add tracks events * Add changelog * Add more tracks events # Conflicts: # plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx # plugins/woocommerce-admin/client/products/sections/product-shipping-section.tsx * Fix name * Fix duplicated event * Add select as cover event * Add cancel shipping class creation * Rename tracks events # Conflicts: # plugins/woocommerce-admin/client/products/sections/product-shipping-section.tsx * Add const for tracks event name * Rename event * Rename events * Remove `product_modal_new_shipping_class_cancel_button` trancks event * Rename `product_add_first_attribute_button_click` event * Fix method * Fix confirmation modal events * Rename `product_add_attributes_modal_add_button_click` event Co-authored-by: Fernando Marichal --- .../attribute-field/add-attribute-modal.tsx | 14 +++++--- .../attribute-field/attribute-field.tsx | 36 ++++++++++++++----- .../products/sections/images-section.tsx | 18 ++++++++++ .../sections/product-shipping-section.tsx | 9 +++++ .../update-39_image_section_tracks_events | 4 +++ 5 files changed, 69 insertions(+), 12 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-39_image_section_tracks_events diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx index 3252fc23c60..9ec22d666de 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/add-attribute-modal.tsx @@ -8,7 +8,7 @@ import { Form, __experimentalSelectControlMenuSlot as SelectControlMenuSlot, } from '@woocommerce/components'; - +import { recordEvent } from '@woocommerce/tracks'; import { Button, Modal, @@ -85,6 +85,9 @@ export const AddAttributeModal: React.FC< AddAttributeModalProps > = ( { value: AttributeForm[ keyof AttributeForm ] ) => void ) => { + recordEvent( + 'product_add_attributes_modal_remove_attribute_button_click' + ); if ( values.attributes.length > 1 ) { setValue( 'attributes', @@ -318,9 +321,12 @@ export const AddAttributeModal: React.FC< AddAttributeModalProps > = ( { 'Add another attribute', 'woocommerce' ) } - onClick={ () => - addAnother( values, setValue ) - } + onClick={ () => { + recordEvent( + 'product_add_attributes_modal_add_another_attribute_button_click' + ); + addAnother( values, setValue ); + } } > +  { __( 'Add another', 'woocommerce' ) } diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx index 69c91c4b581..2b70153c1bb 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-field/attribute-field.tsx @@ -17,6 +17,7 @@ import { __experimentalSelectControlMenuSlot as SelectControlMenuSlot, } from '@woocommerce/components'; import { closeSmall } from '@wordpress/icons'; +import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies @@ -56,6 +57,9 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { null | string >( null ); + const CANCEL_BUTTON_EVENT_NAME = + 'product_add_attributes_modal_cancel_button_click'; + const fetchTerms = useCallback( ( attributeId: number ) => { return resolveSelect( @@ -125,6 +129,9 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { const onRemove = ( attribute: ProductAttribute ) => { // eslint-disable-next-line no-alert if ( window.confirm( __( 'Remove this attribute?', 'woocommerce' ) ) ) { + recordEvent( + 'product_remove_attribute_confirmation_confirm_click' + ); updateAttributes( hydratedAttributes.filter( ( attr ) => @@ -132,6 +139,8 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { fetchAttributeId( attribute ) ) ); + } else { + recordEvent( 'product_remove_attribute_confirmation_cancel_click' ); } }; @@ -152,6 +161,7 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { return newAttr; } ), ] ); + recordEvent( 'product_add_attributes_modal_add_button_click' ); setShowAddAttributeModal( false ); }; @@ -178,18 +188,22 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { { showAddAttributeModal && ( - setShowAddAttributeModal( false ) - } + onCancel={ () => { + recordEvent( CANCEL_BUTTON_EVENT_NAME ); + setShowAddAttributeModal( false ); + } } onAdd={ onAddNewAttributes } selectedAttributeIds={ ( value || [] ).map( ( attr ) => attr.id @@ -277,14 +291,20 @@ export const AttributeField: React.FC< AttributeFieldProps > = ( { { showAddAttributeModal && ( setShowAddAttributeModal( false ) } + onCancel={ () => { + recordEvent( CANCEL_BUTTON_EVENT_NAME ); + setShowAddAttributeModal( false ); + } } onAdd={ onAddNewAttributes } selectedAttributeIds={ value.map( ( attr ) => attr.id ) } /> diff --git a/plugins/woocommerce-admin/client/products/sections/images-section.tsx b/plugins/woocommerce-admin/client/products/sections/images-section.tsx index ea5e466391f..0fa55103b06 100644 --- a/plugins/woocommerce-admin/client/products/sections/images-section.tsx +++ b/plugins/woocommerce-admin/client/products/sections/images-section.tsx @@ -48,6 +48,7 @@ export const ImagesSection: React.FC = () => { ( file ) => file.id === parseInt( image?.props?.id, 10 ) ); } ); + recordEvent( 'product_images_change_image_order_via_image_gallery' ); setValue( 'images', orderedImages ); }; @@ -100,6 +101,9 @@ export const ImagesSection: React.FC = () => { } } onDragEnd={ () => { if ( isRemoving && draggedImageId ) { + recordEvent( + 'product_images_remove_image_button_click' + ); setValue( 'images', images.filter( @@ -119,9 +123,17 @@ export const ImagesSection: React.FC = () => { ) === undefined ) { images[ replaceIndex ] = media as Image; + recordEvent( + 'product_images_replace_image_button_click' + ); setValue( 'images', images ); } } } + onSelectAsCover={ () => + recordEvent( + 'product_images_select_image_as_cover_button_click' + ) + } > { images.map( ( image ) => ( { ( img ) => file.id === img.id ) === undefined ) { + recordEvent( + 'product_images_add_via_media_library' + ); setValue( 'images', [ ...images, file, @@ -177,6 +192,9 @@ export const ImagesSection: React.FC = () => { } } onUpload={ ( files ) => { if ( files[ 0 ].id ) { + recordEvent( + 'product_images_add_via_drag_and_drop_upload' + ); setValue( 'images', [ ...images, ...files, diff --git a/plugins/woocommerce-admin/client/products/sections/product-shipping-section.tsx b/plugins/woocommerce-admin/client/products/sections/product-shipping-section.tsx index eac0e3e2a37..0e542694e8c 100644 --- a/plugins/woocommerce-admin/client/products/sections/product-shipping-section.tsx +++ b/plugins/woocommerce-admin/client/products/sections/product-shipping-section.tsx @@ -12,6 +12,7 @@ import { ProductShippingClass, } from '@woocommerce/data'; import interpolateComponents from '@automattic/interpolate-components'; +import { recordEvent } from '@woocommerce/tracks'; import { BaseControl, Card, @@ -244,6 +245,11 @@ export function ProductShippingSection( { href={ `${ ADMIN_URL }admin.php?page=wc-settings&tab=shipping§ion=classes` } target="_blank" type="external" + onClick={ () => { + recordEvent( + 'product_shipping_global_settings_link_click' + ); + } } > <> @@ -384,6 +390,9 @@ export function ProductShippingSection( { Promise< ProductShippingClass > >( shippingClassValues ) .then( ( value ) => { + recordEvent( + 'product_new_shipping_class_modal_add_button_click' + ); invalidateResolution( 'getProductShippingClasses' ); diff --git a/plugins/woocommerce/changelog/update-39_image_section_tracks_events b/plugins/woocommerce/changelog/update-39_image_section_tracks_events new file mode 100644 index 00000000000..1222cf3b16b --- /dev/null +++ b/plugins/woocommerce/changelog/update-39_image_section_tracks_events @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Add missing tracks events From 995b587777f9fb65bca1b9ec172127e5e3786636 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Tue, 22 Nov 2022 09:53:26 -0500 Subject: [PATCH 0106/1680] Analytics: Fix advanced filtering date selection in WordPress 6.1. (#35644) * Fixed date filter date selection in WordPress 6.1. * Move fix deeper into DatePicker itself. --- packages/js/components/changelog/fix-datepicker-moment | 4 ++++ packages/js/components/src/calendar/date-picker.js | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 packages/js/components/changelog/fix-datepicker-moment diff --git a/packages/js/components/changelog/fix-datepicker-moment b/packages/js/components/changelog/fix-datepicker-moment new file mode 100644 index 00000000000..8d2aafbd252 --- /dev/null +++ b/packages/js/components/changelog/fix-datepicker-moment @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fixed DatePicker to work in WordPress 6.1 when currentDate is set to a moment instance. diff --git a/packages/js/components/src/calendar/date-picker.js b/packages/js/components/src/calendar/date-picker.js index 7fe681e7fa1..8fa3fee63f8 100644 --- a/packages/js/components/src/calendar/date-picker.js +++ b/packages/js/components/src/calendar/date-picker.js @@ -116,7 +116,11 @@ class DatePicker extends Component {
    Date: Tue, 22 Nov 2022 11:56:27 -0300 Subject: [PATCH 0107/1680] Fix/unsaved prompt (#35657) * Set initial values prop from reset form function as optional * Fix unsaved modal propmt to not be shown during form submission * Reset form on save draft and before navigation starts * Add comments ssuggestions --- .../components/changelog/fix-unsaved-prompt | 4 ++ .../js/components/src/form/form-context.ts | 2 +- packages/js/components/src/form/form.tsx | 12 ++--- .../client/products/product-form-actions.tsx | 27 +++++++++-- .../client/products/use-product-helper.ts | 46 +++++++++---------- .../woocommerce/changelog/fix-unsaved-prompt | 4 ++ 6 files changed, 58 insertions(+), 37 deletions(-) create mode 100644 packages/js/components/changelog/fix-unsaved-prompt create mode 100644 plugins/woocommerce/changelog/fix-unsaved-prompt diff --git a/packages/js/components/changelog/fix-unsaved-prompt b/packages/js/components/changelog/fix-unsaved-prompt new file mode 100644 index 00000000000..80d311cee86 --- /dev/null +++ b/packages/js/components/changelog/fix-unsaved-prompt @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Set initial values prop from reset form function as optional diff --git a/packages/js/components/src/form/form-context.ts b/packages/js/components/src/form/form-context.ts index d7ca500810d..21c46f36e79 100644 --- a/packages/js/components/src/form/form-context.ts +++ b/packages/js/components/src/form/form-context.ts @@ -44,7 +44,7 @@ export type FormContext< Values extends Record< string, any > > = { ): InputProps< Values, Value >; isValidForm: boolean; resetForm: ( - initialValues: Values, + initialValues?: Values, touchedFields?: { [ P in keyof Values ]?: boolean | undefined }, errors?: FormErrors< Values > ) => void; diff --git a/packages/js/components/src/form/form.tsx b/packages/js/components/src/form/form.tsx index 878c6ce6ef0..76cfde5d16d 100644 --- a/packages/js/components/src/form/form.tsx +++ b/packages/js/components/src/form/form.tsx @@ -166,11 +166,11 @@ function FormComponent< Values extends Record< string, any > >( validate( values ); }, [] ); - const resetForm = ( - newInitialValues = {} as Values, - newTouchedFields = {}, - newErrors = {} - ) => { + const resetForm: ( + newInitialValues?: Values, + newTouchedFields?: { [ P in keyof Values ]?: boolean | undefined }, + newErrors?: FormErrors< Values > + ) => void = ( newInitialValues, newTouchedFields = {}, newErrors = {} ) => { const newValues = newInitialValues ?? initialValues.current ?? {}; initialValues.current = newValues; setValuesInternal( newValues ); @@ -183,7 +183,7 @@ function FormComponent< Values extends Record< string, any > >( } ) ); const isValidForm = async () => { - await validate( values ); + validate( values ); return ! Object.keys( errors ).length; }; diff --git a/plugins/woocommerce-admin/client/products/product-form-actions.tsx b/plugins/woocommerce-admin/client/products/product-form-actions.tsx index db9c5756097..271f3de898a 100644 --- a/plugins/woocommerce-admin/client/products/product-form-actions.tsx +++ b/plugins/woocommerce-admin/client/products/product-form-actions.tsx @@ -14,6 +14,7 @@ import { registerPlugin } from '@wordpress/plugins'; import { useFormContext } from '@woocommerce/components'; import { Product } from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; +import { navigateTo } from '@woocommerce/navigation'; /** * Internal dependencies @@ -54,7 +55,13 @@ export const ProductFormActions: React.FC = () => { ...getProductDataForTracks(), } ); if ( ! values.id ) { - createProductWithStatus( values, 'draft' ); + const product = await createProductWithStatus( values, 'draft' ); + if ( product?.id ) { + resetForm(); + navigateTo( { + url: 'admin.php?page=wc-admin&path=/product/' + product.id, + } ); + } } else { const product = await updateProductWithStatus( values.id, @@ -73,7 +80,13 @@ export const ProductFormActions: React.FC = () => { ...getProductDataForTracks(), } ); if ( ! values.id ) { - createProductWithStatus( values, 'publish' ); + const product = await createProductWithStatus( values, 'publish' ); + if ( product?.id ) { + resetForm(); + navigateTo( { + url: 'admin.php?page=wc-admin&path=/product/' + product.id, + } ); + } } else { const product = await updateProductWithStatus( values.id, @@ -94,7 +107,7 @@ export const ProductFormActions: React.FC = () => { if ( values.id ) { await updateProductWithStatus( values.id, values, 'publish' ); } else { - await createProductWithStatus( values, 'publish', false, true ); + await createProductWithStatus( values, 'publish', false ); } await copyProductWithStatus( values ); }; @@ -114,13 +127,17 @@ export const ProductFormActions: React.FC = () => { await copyProductWithStatus( values ); }; - const onTrash = () => { + const onTrash = async () => { recordEvent( 'product_delete', { new_product_page: true, ...getProductDataForTracks(), } ); if ( values.id ) { - deleteProductAndRedirect( values.id ); + const product = await deleteProductAndRedirect( values.id ); + if ( product?.id ) { + resetForm( product ); + navigateTo( { url: 'edit.php?post_type=product' } ); + } } }; diff --git a/plugins/woocommerce-admin/client/products/use-product-helper.ts b/plugins/woocommerce-admin/client/products/use-product-helper.ts index 437f1d5daac..bd0db865e8e 100644 --- a/plugins/woocommerce-admin/client/products/use-product-helper.ts +++ b/plugins/woocommerce-admin/client/products/use-product-helper.ts @@ -14,7 +14,6 @@ import { productReadOnlyProperties, } from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; -import { navigateTo } from '@woocommerce/navigation'; /** * Internal dependencies @@ -66,21 +65,19 @@ export function useProductHelper() { * @param {Product} product the product to be created. * @param {string} status the product status. * @param {boolean} skipNotice if the notice should be skipped (default: false). - * @param {boolean} skipRedirect if the user should skip the redirection to the new product page (default: false). * @return {Promise} Returns a promise with the created product. */ const createProductWithStatus = useCallback( async ( product: Omit< Product, ReadOnlyProperties >, status: ProductStatus, - skipNotice = false, - skipRedirect = false + skipNotice = false ) => { setUpdating( { ...updating, [ status ]: true, } ); - createProduct( { + return createProduct( { ...product, status, } ).then( @@ -109,15 +106,9 @@ export function useProductHelper() { ...updating, [ status ]: false, } ); - if ( ! skipRedirect ) { - navigateTo( { - url: - 'admin.php?page=wc-admin&path=/product/' + - newProduct.id, - } ); - } + return newProduct; }, - () => { + ( error ) => { if ( ! skipNotice ) { createNotice( 'error', @@ -136,6 +127,7 @@ export function useProductHelper() { ...updating, [ status ]: false, } ); + return error; } ); }, @@ -236,13 +228,12 @@ export function useProductHelper() { * Deletes a product by given id and redirects to the product list page. * * @param {number} id the product id to be deleted. - * @param {string} redirectUrl the redirection url, defaults to product list ('edit.php?post_type=product'). * @return {Promise} promise with the deleted product. */ - const deleteProductAndRedirect = useCallback( - ( id: number, redirectUrl = 'edit.php?post_type=product' ) => { - setIsDeleting( true ); - return deleteProduct( id ).then( () => { + const deleteProductAndRedirect = useCallback( async ( id: number ) => { + setIsDeleting( true ); + return deleteProduct( id ).then( + ( product ) => { createNotice( 'success', __( @@ -250,14 +241,19 @@ export function useProductHelper() { 'woocommerce' ) ); - navigateTo( { - url: redirectUrl, - } ); setIsDeleting( false ); - } ); - }, - [] - ); + return product; + }, + ( error ) => { + createNotice( + 'error', + __( 'Failed to move product to Trash.', 'woocommerce' ) + ); + setIsDeleting( false ); + return error; + } + ); + }, [] ); /** * Sanitizes a price. diff --git a/plugins/woocommerce/changelog/fix-unsaved-prompt b/plugins/woocommerce/changelog/fix-unsaved-prompt new file mode 100644 index 00000000000..186f98fa20b --- /dev/null +++ b/plugins/woocommerce/changelog/fix-unsaved-prompt @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix unsaved modal propmt to not be shown during form submission From fd7fc355fa8e7b8c29423e11c551942668ffc3aa Mon Sep 17 00:00:00 2001 From: Jonathan Lane Date: Tue, 22 Nov 2022 15:16:42 -0800 Subject: [PATCH 0108/1680] Fix/e2e environment test failures (#35679) --- .github/workflows/pr-build-and-e2e-tests.yml | 3 +- .../fix-e2e-environment-test-failures | 4 + plugins/woocommerce/package.json | 2 +- pnpm-lock.yaml | 430 +++++++++++++++--- 4 files changed, 384 insertions(+), 55 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-e2e-environment-test-failures diff --git a/.github/workflows/pr-build-and-e2e-tests.yml b/.github/workflows/pr-build-and-e2e-tests.yml index a5f7a7afe31..4c95804dbc5 100644 --- a/.github/workflows/pr-build-and-e2e-tests.yml +++ b/.github/workflows/pr-build-and-e2e-tests.yml @@ -26,7 +26,8 @@ jobs: working-directory: plugins/woocommerce env: ENABLE_HPOS: 0 - run: pnpm env:test --filter=woocommerce + WP_ENV_PHP_VERSION: 7.4 + run: pnpm run env:test - name: Download and install Chromium browser. working-directory: plugins/woocommerce diff --git a/plugins/woocommerce/changelog/fix-e2e-environment-test-failures b/plugins/woocommerce/changelog/fix-e2e-environment-test-failures new file mode 100644 index 00000000000..e4c42058aab --- /dev/null +++ b/plugins/woocommerce/changelog/fix-e2e-environment-test-failures @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Update Playwright to 1.28.0 and explicitly set PHP version in GH action diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index 863748b8d9f..64288817216 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -51,7 +51,7 @@ "@babel/core": "7.12.9", "@babel/preset-env": "7.12.7", "@babel/register": "7.12.1", - "@playwright/test": "^1.27.1", + "@playwright/test": "^1.28.0", "@typescript-eslint/eslint-plugin": "^5.43.0", "@typescript-eslint/experimental-utils": "^5.43.0", "@typescript-eslint/parser": "^5.43.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b16673f96a5..c740964146d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,7 +51,7 @@ importers: '@types/node': 14.14.33 '@woocommerce/eslint-plugin': link:packages/js/eslint-plugin '@wordpress/data': 6.15.0_react@17.0.2 - '@wordpress/eslint-plugin': 11.1.0_mi6olxr5xmqt2zjip2h6cux3xe + '@wordpress/eslint-plugin': 11.1.0_mcybzr52q3u5poieijntti3gbe '@wordpress/prettier-config': 1.1.1 babel-loader: 8.2.3_2p3p4wasefxeg63hu27rmsqfnq chalk: 4.1.2 @@ -1307,7 +1307,7 @@ importers: '@babel/core': 7.12.9 '@babel/preset-env': 7.12.7 '@babel/register': 7.12.1 - '@playwright/test': ^1.27.1 + '@playwright/test': ^1.28.0 '@typescript-eslint/eslint-plugin': ^5.43.0 '@typescript-eslint/experimental-utils': ^5.43.0 '@typescript-eslint/parser': ^5.43.0 @@ -1352,7 +1352,7 @@ importers: '@babel/core': 7.12.9 '@babel/preset-env': 7.12.7_@babel+core@7.12.9 '@babel/register': 7.12.1_@babel+core@7.12.9 - '@playwright/test': 1.27.1 + '@playwright/test': 1.28.0 '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq '@typescript-eslint/experimental-utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q @@ -2495,7 +2495,7 @@ packages: semver: 6.3.0 dev: false - /@babel/eslint-parser/7.17.0_mmjp4mnkdla6iowedn6uhpeiai: + /@babel/eslint-parser/7.17.0_egbv6vphnwurm3ap2o4feqemum: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: @@ -2503,7 +2503,7 @@ packages: eslint: ^7.5.0 || ^8.0.0 dependencies: '@babel/core': 7.12.9 - eslint: 8.25.0 + eslint: 8.28.0 eslint-scope: 5.1.1 eslint-visitor-keys: 2.1.0 semver: 6.3.0 @@ -8009,8 +8009,8 @@ packages: dependencies: ajv: 6.12.6 debug: 4.3.4 - espree: 9.4.0 - globals: 13.17.0 + espree: 9.4.1 + globals: 13.18.0 ignore: 5.2.0 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -8123,6 +8123,16 @@ packages: transitivePeerDependencies: - supports-color + /@humanwhocodes/config-array/0.11.7: + resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -9641,13 +9651,13 @@ packages: dependencies: '@octokit/openapi-types': 13.10.0 - /@playwright/test/1.27.1: - resolution: {integrity: sha512-mrL2q0an/7tVqniQQF6RBL2saskjljXzqNcCOVMUjRIgE6Y38nCNaP+Dc2FBW06bcpD3tqIws/HT9qiMHbNU0A==} + /@playwright/test/1.28.0: + resolution: {integrity: sha512-vrHs5DFTPwYox5SGKq/7TDn/S4q6RA1zArd7uhO6EyP9hj3XgZBBM12ktMbnDQNxh/fL1IUKsTNLxihmsU38lQ==} engines: {node: '>=14'} hasBin: true dependencies: '@types/node': 17.0.21 - playwright-core: 1.27.1 + playwright-core: 1.28.0 dev: true /@pmmmwh/react-refresh-webpack-plugin/0.5.1_a3gyllrqvxpec3fpybsrposvju: @@ -14076,6 +14086,33 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/eslint-plugin/5.43.0_ol5heeoi7wmwb4tenztnb7jlze: + resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} + 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/parser': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/type-utils': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + '@typescript-eslint/utils': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + debug: 4.3.4 + eslint: 8.28.0 + ignore: 5.2.0 + natural-compare-lite: 1.4.0 + regexpp: 3.2.0 + semver: 7.3.8 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/eslint-plugin/5.43.0_xi2bidqtjw6phi5qq54cbyxqtu: resolution: {integrity: sha512-wNPzG+eDR6+hhW4yobEmpR36jrqqQv1vxBq5LJO3fBAktjkvekfr4BRl+3Fn1CM/A+s8/EiGUbOMDoYqWdbtXA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -14181,6 +14218,19 @@ packages: - supports-color - typescript + /@typescript-eslint/experimental-utils/5.43.0_zksrc6ykdxhogxjbhb5axiabwi: + resolution: {integrity: sha512-WkT637CumTJbm/hRbFfnHBMgfUYTKr08LitVsD7gQId7bi6rnkx3pu3jac67lmp5ObW4MpJ9SNFZAIOUB/Qbsw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@typescript-eslint/utils': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + eslint: 8.28.0 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/parser/4.33.0_phzabm2hax2olcsrhm4n4aik5y: resolution: {integrity: sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==} engines: {node: ^10.12.0 || >=12.0.0} @@ -14300,6 +14350,25 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/parser/5.43.0_zksrc6ykdxhogxjbhb5axiabwi: + resolution: {integrity: sha512-2iHUK2Lh7PwNUlhFxxLI2haSDNyXvebBO9izhjhMoDC+S3XI9qt2DGFUsiJ89m2k7gGYch2aEpYqV5F/+nwZug==} + 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.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + debug: 4.3.4 + eslint: 8.28.0 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + /@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} @@ -14402,6 +14471,26 @@ packages: transitivePeerDependencies: - supports-color + /@typescript-eslint/type-utils/5.43.0_zksrc6ykdxhogxjbhb5axiabwi: + resolution: {integrity: sha512-K21f+KY2/VvYggLf5Pk4tgBOPs2otTaIHy2zjclo7UZGLyFH86VfUOm5iq+OtDtxq/Zwu2I3ujDBykVW4Xtmtg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + '@typescript-eslint/utils': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + debug: 4.3.4 + eslint: 8.28.0 + tsutils: 3.21.0_typescript@4.8.4 + typescript: 4.8.4 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/types/4.33.0: resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -14596,6 +14685,26 @@ packages: - supports-color - typescript + /@typescript-eslint/utils/5.43.0_zksrc6ykdxhogxjbhb5axiabwi: + resolution: {integrity: sha512-8nVpA6yX0sCjf7v/NDfeaOlyaIIqL7OaIGOWSPFqUKK59Gnumd3Wa+2l8oAaYO2lk0sO+SbWFWRSvhu8gLGv4A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@types/json-schema': 7.0.9 + '@types/semver': 7.3.12 + '@typescript-eslint/scope-manager': 5.43.0 + '@typescript-eslint/types': 5.43.0 + '@typescript-eslint/typescript-estree': 5.43.0_typescript@4.8.4 + eslint: 8.28.0 + eslint-scope: 5.1.1 + eslint-utils: 3.0.0_eslint@8.28.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + /@typescript-eslint/visitor-keys/4.33.0: resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} @@ -16530,7 +16639,7 @@ packages: '@babel/runtime': 7.19.0 dev: false - /@wordpress/eslint-plugin/11.1.0_mi6olxr5xmqt2zjip2h6cux3xe: + /@wordpress/eslint-plugin/11.1.0_mcybzr52q3u5poieijntti3gbe: resolution: {integrity: sha512-NNIgJQqibdj5BsctkhCqjYt5NAs8eGBnuMSTnbhYCuUrs/PF3iF+jwY4OEOBOSlr00KyM9BfDxr9/5EWG8PmOw==} engines: {node: '>=12', npm: '>=6.9'} peerDependencies: @@ -16545,22 +16654,22 @@ packages: optional: true dependencies: '@babel/core': 7.12.9 - '@babel/eslint-parser': 7.17.0_mmjp4mnkdla6iowedn6uhpeiai - '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq - '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@babel/eslint-parser': 7.17.0_egbv6vphnwurm3ap2o4feqemum + '@typescript-eslint/eslint-plugin': 5.43.0_ol5heeoi7wmwb4tenztnb7jlze + '@typescript-eslint/parser': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi '@wordpress/babel-preset-default': 6.17.0 '@wordpress/prettier-config': 1.1.3 cosmiconfig: 7.0.1 - eslint: 8.25.0 - eslint-config-prettier: 8.5.0_eslint@8.25.0 - eslint-plugin-import: 2.25.4_5giipivvrkjwpspmcck55fgaja - eslint-plugin-jest: 25.7.0_avhcq6piyz75wjz4x3cxqm6t3m - eslint-plugin-jsdoc: 37.9.7_eslint@8.25.0 - eslint-plugin-jsx-a11y: 6.5.1_eslint@8.25.0 - eslint-plugin-playwright: 0.8.0_ujw2vewnku7bdwdfgagcxtzxae - eslint-plugin-prettier: 3.4.1_4xmrr3ukt4my57j2lnjkrj33s4 - eslint-plugin-react: 7.29.4_eslint@8.25.0 - eslint-plugin-react-hooks: 4.3.0_eslint@8.25.0 + eslint: 8.28.0 + eslint-config-prettier: 8.5.0_eslint@8.28.0 + eslint-plugin-import: 2.25.4_ivdjtymx6ubvknadox4oh4qsue + eslint-plugin-jest: 25.7.0_hf2laxo64q65ca427enwz6fepa + eslint-plugin-jsdoc: 37.9.7_eslint@8.28.0 + eslint-plugin-jsx-a11y: 6.5.1_eslint@8.28.0 + eslint-plugin-playwright: 0.8.0_bgyrkcoecpw7hmmqwzduoudyum + eslint-plugin-prettier: 3.4.1_qsebzixysgccx3deogol23q32e + eslint-plugin-react: 7.29.4_eslint@8.28.0 + eslint-plugin-react-hooks: 4.3.0_eslint@8.28.0 globals: 13.12.0 prettier: /wp-prettier/2.6.2 requireindex: 1.2.0 @@ -17888,6 +17997,13 @@ packages: dependencies: acorn: 8.8.0 + /acorn-jsx/5.3.2_acorn@8.8.1: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.8.1 + /acorn-walk/6.2.0: resolution: {integrity: sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==} engines: {node: '>=0.4.0'} @@ -17926,6 +18042,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn/8.8.1: + resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==} + engines: {node: '>=0.4.0'} + hasBin: true + /address/1.1.2: resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==} engines: {node: '>= 0.12.0'} @@ -22929,6 +23050,16 @@ packages: eslint: '>=7.0.0' dependencies: eslint: 8.25.0 + dev: false + + /eslint-config-prettier/8.5.0_eslint@8.28.0: + resolution: {integrity: sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.28.0 + dev: true /eslint-config-wpcalypso/5.0.0_44ie4thsizlsiqkjwba6wctao4: resolution: {integrity: sha512-bENkOkC7Hk2LREkj9aVqv5ELqYaUZqN2IBtmCdsQXrkJBsW8FV9mOzcBHnLm3Cvw4YYfq0rZzIFuCs3pkPbe1Q==} @@ -23011,7 +23142,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q + '@typescript-eslint/parser': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi debug: 3.2.7 eslint-import-resolver-node: 0.3.6 find-up: 2.1.0 @@ -23101,6 +23232,7 @@ packages: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + dev: false /eslint-plugin-import/2.25.4_ffi3uiz42rv3jyhs6cr7p7qqry: resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} @@ -23133,6 +23265,37 @@ packages: - supports-color dev: true + /eslint-plugin-import/2.25.4_ivdjtymx6ubvknadox4oh4qsue: + resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + array-includes: 3.1.4 + array.prototype.flat: 1.2.5 + debug: 2.6.9 + doctrine: 2.1.0 + eslint: 8.28.0 + eslint-import-resolver-node: 0.3.6 + eslint-module-utils: 2.7.3_fmuy6wfytpxcy4lufnxcokvnry + has: 1.0.3 + is-core-module: 2.10.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.values: 1.1.5 + resolve: 1.22.1 + tsconfig-paths: 3.14.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-import/2.25.4_mwel7v7qi7wwnb6yoytqwvyg4e: resolution: {integrity: sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==} engines: {node: '>=4'} @@ -23243,7 +23406,7 @@ packages: - typescript dev: false - /eslint-plugin-jest/25.7.0_avhcq6piyz75wjz4x3cxqm6t3m: + /eslint-plugin-jest/25.7.0_hf2laxo64q65ca427enwz6fepa: resolution: {integrity: sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} peerDependencies: @@ -23256,9 +23419,9 @@ packages: jest: optional: true dependencies: - '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq - '@typescript-eslint/experimental-utils': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q - eslint: 8.25.0 + '@typescript-eslint/eslint-plugin': 5.43.0_ol5heeoi7wmwb4tenztnb7jlze + '@typescript-eslint/experimental-utils': 5.43.0_zksrc6ykdxhogxjbhb5axiabwi + eslint: 8.28.0 jest: 27.3.1 transitivePeerDependencies: - supports-color @@ -23339,6 +23502,26 @@ packages: spdx-expression-parse: 3.0.1 transitivePeerDependencies: - supports-color + dev: false + + /eslint-plugin-jsdoc/37.9.7_eslint@8.28.0: + resolution: {integrity: sha512-8alON8yYcStY94o0HycU2zkLKQdcS+qhhOUNQpfONHHwvI99afbmfpYuPqf6PbLz5pLZldG3Te5I0RbAiTN42g==} + engines: {node: ^12 || ^14 || ^16 || ^17} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@es-joy/jsdoccomment': 0.20.1 + comment-parser: 1.3.0 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint: 8.28.0 + esquery: 1.4.0 + regextras: 0.8.0 + semver: 7.3.8 + spdx-expression-parse: 3.0.1 + transitivePeerDependencies: + - supports-color + dev: true /eslint-plugin-jsx-a11y/6.5.1_eslint@7.32.0: resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} @@ -23380,6 +23563,28 @@ packages: jsx-ast-utils: 3.2.1 language-tags: 1.0.5 minimatch: 3.1.2 + dev: false + + /eslint-plugin-jsx-a11y/6.5.1_eslint@8.28.0: + resolution: {integrity: sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.19.0 + 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: 8.28.0 + has: 1.0.3 + jsx-ast-utils: 3.2.1 + language-tags: 1.0.5 + minimatch: 3.1.2 + dev: true /eslint-plugin-markdown/1.0.2: resolution: {integrity: sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw==} @@ -23402,7 +23607,7 @@ packages: - supports-color dev: true - /eslint-plugin-playwright/0.8.0_ujw2vewnku7bdwdfgagcxtzxae: + /eslint-plugin-playwright/0.8.0_bgyrkcoecpw7hmmqwzduoudyum: resolution: {integrity: sha512-9uJH25m6H3jwU5O7bHD5M8cLx46L72EnIUe3dZqTox6M+WzOFzeUWaDJHHCdLGXZ8XlAU4mbCZnP7uhjKepfRA==} peerDependencies: eslint: '>=7' @@ -23411,25 +23616,8 @@ packages: eslint-plugin-jest: optional: true dependencies: - eslint: 8.25.0 - eslint-plugin-jest: 25.7.0_avhcq6piyz75wjz4x3cxqm6t3m - dev: true - - /eslint-plugin-prettier/3.4.1_4xmrr3ukt4my57j2lnjkrj33s4: - 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.25.0 - eslint-config-prettier: 8.5.0_eslint@8.25.0 - prettier: /wp-prettier/2.6.2 - prettier-linter-helpers: 1.0.0 + eslint: 8.28.0 + eslint-plugin-jest: 25.7.0_hf2laxo64q65ca427enwz6fepa dev: true /eslint-plugin-prettier/3.4.1_gs3qp45fhmeuf44rtqp7mvwogy: @@ -23449,6 +23637,23 @@ packages: prettier-linter-helpers: 1.0.0 dev: true + /eslint-plugin-prettier/3.4.1_qsebzixysgccx3deogol23q32e: + 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.28.0 + eslint-config-prettier: 8.5.0_eslint@8.28.0 + prettier: /wp-prettier/2.6.2 + prettier-linter-helpers: 1.0.0 + dev: true + /eslint-plugin-prettier/3.4.1_xewdwxdxvhaotirttsgfltr2ce: resolution: {integrity: sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==} engines: {node: '>=6.0.0'} @@ -23508,6 +23713,16 @@ packages: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 dependencies: eslint: 8.25.0 + dev: false + + /eslint-plugin-react-hooks/4.3.0_eslint@8.28.0: + resolution: {integrity: sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 8.28.0 + dev: true /eslint-plugin-react/7.29.4_eslint@7.32.0: resolution: {integrity: sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==} @@ -23576,6 +23791,30 @@ packages: resolve: 2.0.0-next.3 semver: 6.3.0 string.prototype.matchall: 4.0.6 + dev: false + + /eslint-plugin-react/7.29.4_eslint@8.28.0: + resolution: {integrity: sha512-CVCXajliVh509PcZYRFyu/BoUEz452+jtQJq2b3Bae4v3xBUWPLCmtmBM+ZinG4MzwmxJgJ2M5rMqhqLVn7MtQ==} + 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: 8.28.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.2.1 + minimatch: 3.1.2 + object.entries: 1.1.5 + object.fromentries: 2.0.5 + object.hasown: 1.1.0 + object.values: 1.1.5 + prop-types: 15.8.1 + resolve: 2.0.0-next.3 + semver: 6.3.0 + string.prototype.matchall: 4.0.6 + dev: true /eslint-plugin-testing-library/5.1.0_z4bbprzjrhnsfa24uvmcbu7f5q: resolution: {integrity: sha512-YSNzasJUbyhOTe14ZPygeOBvcPvcaNkwHwrj4vdf+uirr2D32JTDaKi6CP5Os2aWtOcvt4uBSPXp9h5xGoqvWQ==} @@ -23691,6 +23930,15 @@ packages: eslint: 8.25.0 eslint-visitor-keys: 2.1.0 + /eslint-utils/3.0.0_eslint@8.28.0: + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.28.0 + eslint-visitor-keys: 2.1.0 + /eslint-visitor-keys/1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -24029,6 +24277,53 @@ packages: transitivePeerDependencies: - supports-color + /eslint/8.28.0: + resolution: {integrity: sha512-S27Di+EVyMxcHiwDrFzk8dJYAaD+/5SoWKxL1ri/71CRHsnJnRDPNt2Kzj24+MT9FDupf4aqqyqPrvI8MvQ4VQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint/eslintrc': 1.3.3 + '@humanwhocodes/config-array': 0.11.7 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.1.1 + eslint-utils: 3.0.0_eslint@8.28.0 + eslint-visitor-keys: 3.3.0 + espree: 9.4.1 + esquery: 1.4.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.18.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.2.0 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + regexpp: 3.2.0 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + /espree/5.0.1: resolution: {integrity: sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==} engines: {node: '>=6.0.0'} @@ -24082,6 +24377,14 @@ packages: acorn-jsx: 5.3.2_acorn@8.8.0 eslint-visitor-keys: 3.3.0 + /espree/9.4.1: + resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.1 + acorn-jsx: 5.3.2_acorn@8.8.1 + eslint-visitor-keys: 3.3.0 + /esprima/2.7.3: resolution: {integrity: sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==} engines: {node: '>=0.10.0'} @@ -25815,6 +26118,12 @@ packages: dependencies: type-fest: 0.20.2 + /globals/13.18.0: + resolution: {integrity: sha512-/mR4KI8Ps2spmoc0Ulu9L7agOF0du1CZNQ3dke8yItYlyKNmGrkONemBbd6V8UTc1Wgcqn21t3WYB7dbRmh6/A==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + /globals/9.18.0: resolution: {integrity: sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==} engines: {node: '>=0.10.0'} @@ -26266,7 +26575,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.17.0 + uglify-js: 3.17.4 dev: true /har-schema/2.0.0: @@ -27508,6 +27817,10 @@ packages: path-is-inside: 1.0.2 dev: true + /is-path-inside/3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + /is-plain-obj/1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -30050,6 +30363,9 @@ packages: /js-sdsl/4.1.5: resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==} + /js-sdsl/4.2.0: + resolution: {integrity: sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==} + /js-sha3/0.8.0: resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} dev: false @@ -33694,8 +34010,8 @@ packages: find-up: 5.0.0 dev: true - /playwright-core/1.27.1: - resolution: {integrity: sha512-9EmeXDncC2Pmp/z+teoVYlvmPWUC6ejSSYZUln7YaP89Z6lpAaiaAnqroUt/BoLo8tn7WYShcfaCh+xofZa44Q==} + /playwright-core/1.28.0: + resolution: {integrity: sha512-nJLknd28kPBiCNTbqpu6Wmkrh63OEqJSFw9xOfL9qxfNwody7h6/L3O2dZoWQ6Oxcm0VOHjWmGiCUGkc0X3VZA==} engines: {node: '>=14'} hasBin: true dev: true @@ -39211,7 +39527,7 @@ packages: serialize-javascript: 6.0.0 source-map: 0.6.1 terser: 5.10.0_acorn@8.8.0 - webpack: 5.70.0 + webpack: 5.70.0_webpack-cli@3.3.12 transitivePeerDependencies: - acorn @@ -40051,6 +40367,14 @@ packages: requiresBuild: true dev: true + /uglify-js/3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /unbox-primitive/1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: From 102fabbee0f1629d8cb17a40885cff06c077c14d Mon Sep 17 00:00:00 2001 From: Kaushik Somaiya <92479346+kaushikasomaiya@users.noreply.github.com> Date: Wed, 23 Nov 2022 16:36:27 +0530 Subject: [PATCH 0109/1680] Fix missing tooltip in admin orders table. Fixes #33228 (#35638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kaushik Somaiya Co-authored-by: Néstor Soriano --- .../woocommerce/changelog/fix-tooltip-in-admin-order-table | 4 ++++ plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-tooltip-in-admin-order-table diff --git a/plugins/woocommerce/changelog/fix-tooltip-in-admin-order-table b/plugins/woocommerce/changelog/fix-tooltip-in-admin-order-table new file mode 100644 index 00000000000..b6b9f583595 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-tooltip-in-admin-order-table @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix tooltips not appearing in the orders list admin page. diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php index 36af4eeca2d..11f474e72dc 100644 --- a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php +++ b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php @@ -714,8 +714,10 @@ class ListTable extends WP_List_Table { * @return void */ public function render_order_status_column( WC_Order $order ): void { - $tooltip = ''; - $comment_count = get_comment_count( $order->get_id() ); + $tooltip = ''; + remove_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 ); + $comment_count = get_comment_count( $order->get_id() ); + add_filter( 'comments_clauses', array( 'WC_Comments', 'exclude_order_comments' ), 10, 1 ); $approved_comments_count = absint( $comment_count['approved'] ); if ( $approved_comments_count ) { From fd7c728689be324a1cd4a9f46eb6d22cdbfe14f0 Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Wed, 23 Nov 2022 06:38:28 -0800 Subject: [PATCH 0110/1680] Revert "Add pre build script to delete assets" (#35693) Revert "Add pre build script to delete assets (#35627)" This reverts commit 4770123fa3a71cf4c561fa6149685c67d0778ee4. --- plugins/woocommerce/changelog/add-pre-build | 3 --- plugins/woocommerce/package.json | 1 - turbo.json | 14 ++------------ 3 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 plugins/woocommerce/changelog/add-pre-build diff --git a/plugins/woocommerce/changelog/add-pre-build b/plugins/woocommerce/changelog/add-pre-build deleted file mode 100644 index c005b3ed18b..00000000000 --- a/plugins/woocommerce/changelog/add-pre-build +++ /dev/null @@ -1,3 +0,0 @@ -Significance: patch -Type: dev -Comment: Adds pre build script to first delete asset items. diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index 64288817216..a042808f6fc 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -19,7 +19,6 @@ "postinstall": "composer install", "changelog": "composer exec -- changelogger", "build": "pnpm -w exec turbo run turbo:build --filter=$npm_package_name", - "build:assets-cleanup": "find ./assets/css/. ! -name '.gitkeep' -type f -exec rm -f {} + && find ./assets/client/. ! -name '.gitkeep' -type f -exec rm -f {} + && find ./assets/js/. ! -name '.gitkeep' -type f -exec rm -f {} +", "test": "pnpm -w exec turbo run turbo:test --filter=$npm_package_name", "lint": "pnpm lint:php", "build:feature-config": "php bin/generate-feature-config.php", diff --git a/turbo.json b/turbo.json index b4d6a027677..a43c31b740a 100644 --- a/turbo.json +++ b/turbo.json @@ -4,11 +4,8 @@ "build:feature-config": { "cache": false }, - "build:assets-cleanup": { - "cache": false - }, "turbo:build": { - "dependsOn": [ "build:feature-config", "build:assets-cleanup", "^turbo:build", "$WC_ADMIN_PHASE" ], + "dependsOn": [ "build:feature-config", "^turbo:build", "$WC_ADMIN_PHASE" ], "inputs": [ "src/**/*.js", "src/**/*.jsx", @@ -30,7 +27,6 @@ "woocommerce#turbo:build": { "dependsOn": [ "build:feature-config", - "build:assets-cleanup", "^turbo:build", "woocommerce/client/admin#turbo:build", "woocommerce/client/legacy#turbo:build" @@ -43,14 +39,8 @@ "outputMode": "new-only" }, - "woocommerce#build:zip": { - "dependsOn": [ - "^build:assets-cleanup" - ] - }, - "woocommerce/client/legacy#turbo:build": { - "dependsOn": [ "build:assets-cleanup", "^turbo:build" ], + "dependsOn": [ "^turbo:build" ], "outputs": [ "../../assets/js/**", "../../assets/css/**" From c35d62461e632520098802e969235d59d7ce3eac Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Wed, 23 Nov 2022 15:04:37 +0000 Subject: [PATCH 0111/1680] Update/a2p Consolidate country data in api-core-tests (#35557) * Consolidate country data * update test data * remove upper case files * remove upper case files * remove upper case files * update country data tests * countries states updates for local * revert settings-crud.test --- .../update-country-data-api-core-tests | 4 + .../api-core-tests/data/countries/ad.json | 17 + .../api-core-tests/data/countries/ae.json | 17 + .../api-core-tests/data/countries/af.json | 17 + .../api-core-tests/data/countries/ag.json | 17 + .../api-core-tests/data/countries/ai.json | 17 + .../api-core-tests/data/countries/al.json | 66 + .../api-core-tests/data/countries/am.json | 17 + .../api-core-tests/data/countries/ao.json | 90 + .../api-core-tests/data/countries/aq.json | 17 + .../api-core-tests/data/countries/ar.json | 114 + .../api-core-tests/data/countries/as.json | 17 + .../api-core-tests/data/countries/at.json | 17 + .../api-core-tests/data/countries/au.json | 50 + .../api-core-tests/data/countries/aw.json | 17 + .../api-core-tests/data/countries/ax.json | 17 + .../api-core-tests/data/countries/az.json | 17 + .../api-core-tests/data/countries/ba.json | 17 + .../api-core-tests/data/countries/bb.json | 17 + .../api-core-tests/data/countries/bd.json | 274 + .../api-core-tests/data/countries/be.json | 17 + .../api-core-tests/data/countries/bf.json | 17 + .../api-core-tests/data/countries/bg.json | 130 + .../api-core-tests/data/countries/bh.json | 17 + .../api-core-tests/data/countries/bi.json | 17 + .../api-core-tests/data/countries/bj.json | 66 + .../api-core-tests/data/countries/bl.json | 17 + .../api-core-tests/data/countries/bm.json | 17 + .../api-core-tests/data/countries/bn.json | 17 + .../api-core-tests/data/countries/bo.json | 54 + .../api-core-tests/data/countries/bq.json | 17 + .../api-core-tests/data/countries/br.json | 126 + .../api-core-tests/data/countries/bs.json | 17 + .../api-core-tests/data/countries/bt.json | 17 + .../api-core-tests/data/countries/bv.json | 17 + .../api-core-tests/data/countries/bw.json | 17 + .../api-core-tests/data/countries/by.json | 17 + .../api-core-tests/data/countries/bz.json | 17 + .../api-core-tests/data/countries/ca.json | 70 + .../api-core-tests/data/countries/cc.json | 17 + .../api-core-tests/data/countries/cd.json | 17 + .../api-core-tests/data/countries/cf.json | 17 + .../api-core-tests/data/countries/cg.json | 17 + .../api-core-tests/data/countries/ch.json | 122 + .../api-core-tests/data/countries/ci.json | 17 + .../api-core-tests/data/countries/ck.json | 17 + .../api-core-tests/data/countries/cl.json | 82 + .../api-core-tests/data/countries/cm.json | 17 + .../api-core-tests/data/countries/cn.json | 146 + .../api-core-tests/data/countries/co.json | 150 + .../api-core-tests/data/countries/cr.json | 46 + .../api-core-tests/data/countries/cu.json | 17 + .../api-core-tests/data/countries/cv.json | 17 + .../api-core-tests/data/countries/cw.json | 17 + .../api-core-tests/data/countries/cx.json | 17 + .../api-core-tests/data/countries/cy.json | 17 + .../api-core-tests/data/countries/cz.json | 17 + .../api-core-tests/data/countries/de.json | 82 + .../api-core-tests/data/countries/dj.json | 17 + .../api-core-tests/data/countries/dk.json | 17 + .../api-core-tests/data/countries/dm.json | 17 + .../api-core-tests/data/countries/do.json | 186 + .../api-core-tests/data/countries/dz.json | 210 + .../api-core-tests/data/countries/ec.json | 114 + .../api-core-tests/data/countries/ee.json | 17 + .../api-core-tests/data/countries/eg.json | 126 + .../api-core-tests/data/countries/eh.json | 17 + .../api-core-tests/data/countries/er.json | 17 + .../api-core-tests/data/countries/es.json | 226 + .../api-core-tests/data/countries/et.json | 17 + .../api-core-tests/data/countries/fi.json | 17 + .../api-core-tests/data/countries/fj.json | 17 + .../api-core-tests/data/countries/fk.json | 17 + .../api-core-tests/data/countries/fm.json | 17 + .../api-core-tests/data/countries/fo.json | 17 + .../api-core-tests/data/countries/fr.json | 17 + .../api-core-tests/data/countries/ga.json | 17 + .../api-core-tests/data/countries/gb.json | 17 + .../api-core-tests/data/countries/gd.json | 17 + .../api-core-tests/data/countries/ge.json | 17 + .../api-core-tests/data/countries/gf.json | 17 + .../api-core-tests/data/countries/gg.json | 17 + .../api-core-tests/data/countries/gh.json | 86 + .../api-core-tests/data/countries/gi.json | 17 + .../api-core-tests/data/countries/gl.json | 17 + .../api-core-tests/data/countries/gm.json | 17 + .../api-core-tests/data/countries/gn.json | 17 + .../api-core-tests/data/countries/gp.json | 17 + .../api-core-tests/data/countries/gq.json | 17 + .../api-core-tests/data/countries/gr.json | 70 + .../api-core-tests/data/countries/gs.json | 17 + .../api-core-tests/data/countries/gt.json | 106 + .../api-core-tests/data/countries/gu.json | 17 + .../api-core-tests/data/countries/gw.json | 17 + .../api-core-tests/data/countries/gy.json | 17 + .../api-core-tests/data/countries/hk.json | 30 + .../api-core-tests/data/countries/hm.json | 17 + .../api-core-tests/data/countries/hn.json | 90 + .../api-core-tests/data/countries/hr.json | 17 + .../api-core-tests/data/countries/ht.json | 17 + .../api-core-tests/data/countries/hu.json | 98 + .../api-core-tests/data/countries/id.json | 154 + .../api-core-tests/data/countries/ie.json | 122 + .../api-core-tests/data/countries/il.json | 17 + .../api-core-tests/data/countries/im.json | 17 + .../api-core-tests/data/countries/in.json | 166 + .../api-core-tests/data/countries/io.json | 17 + .../api-core-tests/data/countries/iq.json | 17 + .../api-core-tests/data/countries/ir.json | 142 + .../api-core-tests/data/countries/is.json | 17 + .../api-core-tests/data/countries/it.json | 446 + .../api-core-tests/data/countries/je.json | 17 + .../api-core-tests/data/countries/jm.json | 74 + .../api-core-tests/data/countries/jo.json | 17 + .../api-core-tests/data/countries/jp.json | 206 + .../api-core-tests/data/countries/ke.json | 206 + .../api-core-tests/data/countries/kg.json | 17 + .../api-core-tests/data/countries/kh.json | 17 + .../api-core-tests/data/countries/ki.json | 17 + .../api-core-tests/data/countries/km.json | 17 + .../api-core-tests/data/countries/kn.json | 17 + .../api-core-tests/data/countries/kp.json | 17 + .../api-core-tests/data/countries/kr.json | 17 + .../api-core-tests/data/countries/kw.json | 17 + .../api-core-tests/data/countries/ky.json | 17 + .../api-core-tests/data/countries/kz.json | 17 + .../api-core-tests/data/countries/la.json | 90 + .../api-core-tests/data/countries/lb.json | 17 + .../api-core-tests/data/countries/lc.json | 17 + .../api-core-tests/data/countries/li.json | 17 + .../api-core-tests/data/countries/lk.json | 17 + .../api-core-tests/data/countries/lr.json | 78 + .../api-core-tests/data/countries/ls.json | 17 + .../api-core-tests/data/countries/lt.json | 17 + .../api-core-tests/data/countries/lu.json | 17 + .../api-core-tests/data/countries/lv.json | 17 + .../api-core-tests/data/countries/ly.json | 17 + .../api-core-tests/data/countries/ma.json | 17 + .../api-core-tests/data/countries/mc.json | 17 + .../api-core-tests/data/countries/md.json | 158 + .../api-core-tests/data/countries/me.json | 17 + .../api-core-tests/data/countries/mf.json | 17 + .../api-core-tests/data/countries/mg.json | 17 + .../api-core-tests/data/countries/mh.json | 17 + .../api-core-tests/data/countries/mk.json | 17 + .../api-core-tests/data/countries/ml.json | 17 + .../api-core-tests/data/countries/mm.json | 17 + .../api-core-tests/data/countries/mn.json | 17 + .../api-core-tests/data/countries/mo.json | 17 + .../api-core-tests/data/countries/mp.json | 17 + .../api-core-tests/data/countries/mq.json | 17 + .../api-core-tests/data/countries/mr.json | 17 + .../api-core-tests/data/countries/ms.json | 17 + .../api-core-tests/data/countries/mt.json | 17 + .../api-core-tests/data/countries/mu.json | 17 + .../api-core-tests/data/countries/mv.json | 17 + .../api-core-tests/data/countries/mw.json | 17 + .../api-core-tests/data/countries/mx.json | 146 + .../api-core-tests/data/countries/my.json | 82 + .../api-core-tests/data/countries/mz.json | 62 + .../api-core-tests/data/countries/na.json | 74 + .../api-core-tests/data/countries/nc.json | 17 + .../api-core-tests/data/countries/ne.json | 17 + .../api-core-tests/data/countries/nf.json | 17 + .../api-core-tests/data/countries/ng.json | 166 + .../api-core-tests/data/countries/ni.json | 86 + .../api-core-tests/data/countries/nl.json | 17 + .../api-core-tests/data/countries/no.json | 17 + .../api-core-tests/data/countries/np.json | 74 + .../api-core-tests/data/countries/nr.json | 17 + .../api-core-tests/data/countries/nu.json | 17 + .../api-core-tests/data/countries/nz.json | 82 + .../api-core-tests/data/countries/om.json | 17 + .../api-core-tests/data/countries/pa.json | 70 + .../api-core-tests/data/countries/pe.json | 122 + .../api-core-tests/data/countries/pf.json | 17 + .../api-core-tests/data/countries/pg.json | 17 + .../api-core-tests/data/countries/ph.json | 346 + .../api-core-tests/data/countries/pk.json | 50 + .../api-core-tests/data/countries/pl.json | 17 + .../api-core-tests/data/countries/pm.json | 17 + .../api-core-tests/data/countries/pn.json | 17 + .../api-core-tests/data/countries/pr.json | 17 + .../api-core-tests/data/countries/ps.json | 17 + .../api-core-tests/data/countries/pt.json | 17 + .../api-core-tests/data/countries/pw.json | 17 + .../api-core-tests/data/countries/py.json | 90 + .../api-core-tests/data/countries/qa.json | 17 + .../api-core-tests/data/countries/re.json | 17 + .../api-core-tests/data/countries/ro.json | 186 + .../api-core-tests/data/countries/rs.json | 146 + .../api-core-tests/data/countries/ru.json | 17 + .../api-core-tests/data/countries/rw.json | 17 + .../api-core-tests/data/countries/sa.json | 17 + .../api-core-tests/data/countries/sb.json | 17 + .../api-core-tests/data/countries/sc.json | 17 + .../api-core-tests/data/countries/sd.json | 17 + .../api-core-tests/data/countries/se.json | 17 + .../api-core-tests/data/countries/sg.json | 17 + .../api-core-tests/data/countries/sh.json | 17 + .../api-core-tests/data/countries/si.json | 17 + .../api-core-tests/data/countries/sj.json | 17 + .../api-core-tests/data/countries/sk.json | 17 + .../api-core-tests/data/countries/sl.json | 17 + .../api-core-tests/data/countries/sm.json | 17 + .../api-core-tests/data/countries/sn.json | 74 + .../api-core-tests/data/countries/so.json | 17 + .../api-core-tests/data/countries/sr.json | 17 + .../api-core-tests/data/countries/ss.json | 17 + .../api-core-tests/data/countries/st.json | 17 + .../api-core-tests/data/countries/sv.json | 74 + .../api-core-tests/data/countries/sx.json | 17 + .../api-core-tests/data/countries/sy.json | 17 + .../api-core-tests/data/countries/sz.json | 17 + .../api-core-tests/data/countries/tc.json | 17 + .../api-core-tests/data/countries/td.json | 17 + .../api-core-tests/data/countries/tf.json | 17 + .../api-core-tests/data/countries/tg.json | 17 + .../api-core-tests/data/countries/th.json | 326 + .../api-core-tests/data/countries/tj.json | 17 + .../api-core-tests/data/countries/tk.json | 17 + .../api-core-tests/data/countries/tl.json | 17 + .../api-core-tests/data/countries/tm.json | 17 + .../api-core-tests/data/countries/tn.json | 17 + .../api-core-tests/data/countries/to.json | 17 + .../api-core-tests/data/countries/tr.json | 342 + .../api-core-tests/data/countries/tt.json | 17 + .../api-core-tests/data/countries/tv.json | 17 + .../api-core-tests/data/countries/tw.json | 17 + .../api-core-tests/data/countries/tz.json | 138 + .../api-core-tests/data/countries/ua.json | 126 + .../api-core-tests/data/countries/ug.json | 530 + .../api-core-tests/data/countries/um.json | 54 + .../api-core-tests/data/countries/us.json | 234 + .../api-core-tests/data/countries/uy.json | 94 + .../api-core-tests/data/countries/uz.json | 17 + .../api-core-tests/data/countries/va.json | 17 + .../api-core-tests/data/countries/vc.json | 17 + .../api-core-tests/data/countries/ve.json | 118 + .../api-core-tests/data/countries/vg.json | 17 + .../api-core-tests/data/countries/vi.json | 17 + .../api-core-tests/data/countries/vn.json | 17 + .../api-core-tests/data/countries/vu.json | 17 + .../api-core-tests/data/countries/wf.json | 17 + .../api-core-tests/data/countries/ws.json | 17 + .../api-core-tests/data/countries/ye.json | 17 + .../api-core-tests/data/countries/yt.json | 17 + .../api-core-tests/data/countries/za.json | 54 + .../api-core-tests/data/countries/zm.json | 58 + .../api-core-tests/data/countries/zw.json | 17 + .../tests/data/data-crud.test.js | 20803 +--------------- .../tests/settings/settings-crud.test.js | 2 +- 252 files changed, 12070 insertions(+), 20706 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-country-data-api-core-tests create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ad.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ae.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/af.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ag.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ai.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/al.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/am.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ao.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/aq.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ar.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/as.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/at.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/au.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/aw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ax.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/az.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ba.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bb.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bd.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/be.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bh.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bi.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bj.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bo.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bq.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/br.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bs.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bv.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/by.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/bz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ca.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cd.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ch.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ci.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ck.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/co.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cv.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cx.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cy.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/cz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/de.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/dj.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/dk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/dm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/do.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/dz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ec.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ee.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/eg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/eh.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/er.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/es.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/et.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/fi.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/fj.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/fk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/fm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/fo.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/fr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ga.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gb.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gd.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ge.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gh.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gi.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gp.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gq.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gs.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/gy.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/hk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/hm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/hn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/hr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ht.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/hu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/id.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ie.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/il.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/im.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/in.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/io.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/iq.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ir.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/is.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/it.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/je.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/jm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/jo.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/jp.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ke.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kh.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ki.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/km.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kp.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ky.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/kz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/la.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lb.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/li.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ls.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/lv.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ly.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ma.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/md.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/me.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mh.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ml.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mo.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mp.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mq.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ms.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mv.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mx.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/my.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/mz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/na.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/nc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ne.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/nf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ng.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ni.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/nl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/no.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/np.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/nr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/nu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/nz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/om.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pa.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pe.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ph.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ps.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/pw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/py.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/qa.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/re.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ro.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/rs.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ru.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/rw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sa.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sb.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sd.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/se.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sh.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/si.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sj.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/so.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ss.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/st.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sv.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sx.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sy.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/sz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/td.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/th.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tj.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tk.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tl.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/to.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tr.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tv.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tw.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/tz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ua.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ug.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/um.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/us.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/uy.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/uz.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/va.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/vc.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ve.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/vg.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/vi.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/vn.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/vu.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/wf.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ws.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/ye.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/yt.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/za.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/zm.json create mode 100644 plugins/woocommerce/tests/api-core-tests/data/countries/zw.json diff --git a/plugins/woocommerce/changelog/update-country-data-api-core-tests b/plugins/woocommerce/changelog/update-country-data-api-core-tests new file mode 100644 index 00000000000..0c7a2f63f68 --- /dev/null +++ b/plugins/woocommerce/changelog/update-country-data-api-core-tests @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update country data in api-core-tests to prevent numerous test data updates \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ad.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ad.json new file mode 100644 index 00000000000..d321b4d7a95 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ad.json @@ -0,0 +1,17 @@ +{ + "code": "AD", + "name": "Andorra", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ad" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ae.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ae.json new file mode 100644 index 00000000000..d9aa713fda6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ae.json @@ -0,0 +1,17 @@ +{ + "code": "AE", + "name": "United Arab Emirates", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ae" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/af.json b/plugins/woocommerce/tests/api-core-tests/data/countries/af.json new file mode 100644 index 00000000000..22de533ef38 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/af.json @@ -0,0 +1,17 @@ +{ + "code": "AF", + "name": "Afghanistan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/af" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ag.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ag.json new file mode 100644 index 00000000000..94b5b9e0cf3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ag.json @@ -0,0 +1,17 @@ +{ + "code": "AG", + "name": "Antigua and Barbuda", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ag" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ai.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ai.json new file mode 100644 index 00000000000..33e447447be --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ai.json @@ -0,0 +1,17 @@ +{ + "code": "AI", + "name": "Anguilla", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ai" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/al.json b/plugins/woocommerce/tests/api-core-tests/data/countries/al.json new file mode 100644 index 00000000000..fd35a18613d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/al.json @@ -0,0 +1,66 @@ +{ + "code": "AL", + "name": "Albania", + "states": [ + { + "code": "AL-01", + "name": "Berat" + }, + { + "code": "AL-09", + "name": "Dibër" + }, + { + "code": "AL-02", + "name": "Durrës" + }, + { + "code": "AL-03", + "name": "Elbasan" + }, + { + "code": "AL-04", + "name": "Fier" + }, + { + "code": "AL-05", + "name": "Gjirokastër" + }, + { + "code": "AL-06", + "name": "Korçë" + }, + { + "code": "AL-07", + "name": "Kukës" + }, + { + "code": "AL-08", + "name": "Lezhë" + }, + { + "code": "AL-10", + "name": "Shkodër" + }, + { + "code": "AL-11", + "name": "Tirana" + }, + { + "code": "AL-12", + "name": "Vlorë" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/al" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/am.json b/plugins/woocommerce/tests/api-core-tests/data/countries/am.json new file mode 100644 index 00000000000..f416efcb9fb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/am.json @@ -0,0 +1,17 @@ +{ + "code": "AM", + "name": "Armenia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/am" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ao.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ao.json new file mode 100644 index 00000000000..19d71d323f4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ao.json @@ -0,0 +1,90 @@ +{ + "code": "AO", + "name": "Angola", + "states": [ + { + "code": "BGO", + "name": "Bengo" + }, + { + "code": "BLU", + "name": "Benguela" + }, + { + "code": "BIE", + "name": "Bié" + }, + { + "code": "CAB", + "name": "Cabinda" + }, + { + "code": "CNN", + "name": "Cunene" + }, + { + "code": "HUA", + "name": "Huambo" + }, + { + "code": "HUI", + "name": "Huíla" + }, + { + "code": "CCU", + "name": "Kuando Kubango" + }, + { + "code": "CNO", + "name": "Kwanza-Norte" + }, + { + "code": "CUS", + "name": "Kwanza-Sul" + }, + { + "code": "LUA", + "name": "Luanda" + }, + { + "code": "LNO", + "name": "Lunda-Norte" + }, + { + "code": "LSU", + "name": "Lunda-Sul" + }, + { + "code": "MAL", + "name": "Malanje" + }, + { + "code": "MOX", + "name": "Moxico" + }, + { + "code": "NAM", + "name": "Namibe" + }, + { + "code": "UIG", + "name": "Uíge" + }, + { + "code": "ZAI", + "name": "Zaire" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ao" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/aq.json b/plugins/woocommerce/tests/api-core-tests/data/countries/aq.json new file mode 100644 index 00000000000..5db2ccd91bf --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/aq.json @@ -0,0 +1,17 @@ +{ + "code": "AQ", + "name": "Antarctica", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/aq" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ar.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ar.json new file mode 100644 index 00000000000..1effab8f672 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ar.json @@ -0,0 +1,114 @@ +{ + "code": "AR", + "name": "Argentina", + "states": [ + { + "code": "C", + "name": "Ciudad Autónoma de Buenos Aires" + }, + { + "code": "B", + "name": "Buenos Aires" + }, + { + "code": "K", + "name": "Catamarca" + }, + { + "code": "H", + "name": "Chaco" + }, + { + "code": "U", + "name": "Chubut" + }, + { + "code": "X", + "name": "Córdoba" + }, + { + "code": "W", + "name": "Corrientes" + }, + { + "code": "E", + "name": "Entre Ríos" + }, + { + "code": "P", + "name": "Formosa" + }, + { + "code": "Y", + "name": "Jujuy" + }, + { + "code": "L", + "name": "La Pampa" + }, + { + "code": "F", + "name": "La Rioja" + }, + { + "code": "M", + "name": "Mendoza" + }, + { + "code": "N", + "name": "Misiones" + }, + { + "code": "Q", + "name": "Neuquén" + }, + { + "code": "R", + "name": "Río Negro" + }, + { + "code": "A", + "name": "Salta" + }, + { + "code": "J", + "name": "San Juan" + }, + { + "code": "D", + "name": "San Luis" + }, + { + "code": "Z", + "name": "Santa Cruz" + }, + { + "code": "S", + "name": "Santa Fe" + }, + { + "code": "G", + "name": "Santiago del Estero" + }, + { + "code": "V", + "name": "Tierra del Fuego" + }, + { + "code": "T", + "name": "Tucumán" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ar" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/as.json b/plugins/woocommerce/tests/api-core-tests/data/countries/as.json new file mode 100644 index 00000000000..dba14d7d542 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/as.json @@ -0,0 +1,17 @@ +{ + "code": "AS", + "name": "American Samoa", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/as" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/at.json b/plugins/woocommerce/tests/api-core-tests/data/countries/at.json new file mode 100644 index 00000000000..755c4c72159 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/at.json @@ -0,0 +1,17 @@ +{ + "code": "AT", + "name": "Austria", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/at" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/au.json b/plugins/woocommerce/tests/api-core-tests/data/countries/au.json new file mode 100644 index 00000000000..5a61784f4c6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/au.json @@ -0,0 +1,50 @@ +{ + "code": "AU", + "name": "Australia", + "states": [ + { + "code": "ACT", + "name": "Australian Capital Territory" + }, + { + "code": "NSW", + "name": "New South Wales" + }, + { + "code": "NT", + "name": "Northern Territory" + }, + { + "code": "QLD", + "name": "Queensland" + }, + { + "code": "SA", + "name": "South Australia" + }, + { + "code": "TAS", + "name": "Tasmania" + }, + { + "code": "VIC", + "name": "Victoria" + }, + { + "code": "WA", + "name": "Western Australia" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/au" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/aw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/aw.json new file mode 100644 index 00000000000..f1aa425c2a2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/aw.json @@ -0,0 +1,17 @@ +{ + "code": "AW", + "name": "Aruba", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/aw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ax.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ax.json new file mode 100644 index 00000000000..60b75694241 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ax.json @@ -0,0 +1,17 @@ +{ + "code": "AX", + "name": "Åland Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ax" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/az.json b/plugins/woocommerce/tests/api-core-tests/data/countries/az.json new file mode 100644 index 00000000000..8581bf7d5b8 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/az.json @@ -0,0 +1,17 @@ +{ + "code": "AZ", + "name": "Azerbaijan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/az" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ba.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ba.json new file mode 100644 index 00000000000..594817cd0d2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ba.json @@ -0,0 +1,17 @@ +{ + "code": "BA", + "name": "Bosnia and Herzegovina", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ba" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bb.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bb.json new file mode 100644 index 00000000000..2905bf46843 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bb.json @@ -0,0 +1,17 @@ +{ + "code": "BB", + "name": "Barbados", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bb" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bd.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bd.json new file mode 100644 index 00000000000..cb2d150aa5f --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bd.json @@ -0,0 +1,274 @@ +{ + "code": "BD", + "name": "Bangladesh", + "states": [ + { + "code": "BD-05", + "name": "Bagerhat" + }, + { + "code": "BD-01", + "name": "Bandarban" + }, + { + "code": "BD-02", + "name": "Barguna" + }, + { + "code": "BD-06", + "name": "Barishal" + }, + { + "code": "BD-07", + "name": "Bhola" + }, + { + "code": "BD-03", + "name": "Bogura" + }, + { + "code": "BD-04", + "name": "Brahmanbaria" + }, + { + "code": "BD-09", + "name": "Chandpur" + }, + { + "code": "BD-10", + "name": "Chattogram" + }, + { + "code": "BD-12", + "name": "Chuadanga" + }, + { + "code": "BD-11", + "name": "Cox's Bazar" + }, + { + "code": "BD-08", + "name": "Cumilla" + }, + { + "code": "BD-13", + "name": "Dhaka" + }, + { + "code": "BD-14", + "name": "Dinajpur" + }, + { + "code": "BD-15", + "name": "Faridpur " + }, + { + "code": "BD-16", + "name": "Feni" + }, + { + "code": "BD-19", + "name": "Gaibandha" + }, + { + "code": "BD-18", + "name": "Gazipur" + }, + { + "code": "BD-17", + "name": "Gopalganj" + }, + { + "code": "BD-20", + "name": "Habiganj" + }, + { + "code": "BD-21", + "name": "Jamalpur" + }, + { + "code": "BD-22", + "name": "Jashore" + }, + { + "code": "BD-25", + "name": "Jhalokati" + }, + { + "code": "BD-23", + "name": "Jhenaidah" + }, + { + "code": "BD-24", + "name": "Joypurhat" + }, + { + "code": "BD-29", + "name": "Khagrachhari" + }, + { + "code": "BD-27", + "name": "Khulna" + }, + { + "code": "BD-26", + "name": "Kishoreganj" + }, + { + "code": "BD-28", + "name": "Kurigram" + }, + { + "code": "BD-30", + "name": "Kushtia" + }, + { + "code": "BD-31", + "name": "Lakshmipur" + }, + { + "code": "BD-32", + "name": "Lalmonirhat" + }, + { + "code": "BD-36", + "name": "Madaripur" + }, + { + "code": "BD-37", + "name": "Magura" + }, + { + "code": "BD-33", + "name": "Manikganj " + }, + { + "code": "BD-39", + "name": "Meherpur" + }, + { + "code": "BD-38", + "name": "Moulvibazar" + }, + { + "code": "BD-35", + "name": "Munshiganj" + }, + { + "code": "BD-34", + "name": "Mymensingh" + }, + { + "code": "BD-48", + "name": "Naogaon" + }, + { + "code": "BD-43", + "name": "Narail" + }, + { + "code": "BD-40", + "name": "Narayanganj" + }, + { + "code": "BD-42", + "name": "Narsingdi" + }, + { + "code": "BD-44", + "name": "Natore" + }, + { + "code": "BD-45", + "name": "Nawabganj" + }, + { + "code": "BD-41", + "name": "Netrakona" + }, + { + "code": "BD-46", + "name": "Nilphamari" + }, + { + "code": "BD-47", + "name": "Noakhali" + }, + { + "code": "BD-49", + "name": "Pabna" + }, + { + "code": "BD-52", + "name": "Panchagarh" + }, + { + "code": "BD-51", + "name": "Patuakhali" + }, + { + "code": "BD-50", + "name": "Pirojpur" + }, + { + "code": "BD-53", + "name": "Rajbari" + }, + { + "code": "BD-54", + "name": "Rajshahi" + }, + { + "code": "BD-56", + "name": "Rangamati" + }, + { + "code": "BD-55", + "name": "Rangpur" + }, + { + "code": "BD-58", + "name": "Satkhira" + }, + { + "code": "BD-62", + "name": "Shariatpur" + }, + { + "code": "BD-57", + "name": "Sherpur" + }, + { + "code": "BD-59", + "name": "Sirajganj" + }, + { + "code": "BD-61", + "name": "Sunamganj" + }, + { + "code": "BD-60", + "name": "Sylhet" + }, + { + "code": "BD-63", + "name": "Tangail" + }, + { + "code": "BD-64", + "name": "Thakurgaon" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bd" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/be.json b/plugins/woocommerce/tests/api-core-tests/data/countries/be.json new file mode 100644 index 00000000000..7bc60fecf16 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/be.json @@ -0,0 +1,17 @@ +{ + "code": "BE", + "name": "Belgium", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/be" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bf.json new file mode 100644 index 00000000000..fdc9bb711f1 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bf.json @@ -0,0 +1,17 @@ +{ + "code": "BF", + "name": "Burkina Faso", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bg.json new file mode 100644 index 00000000000..8e9b242c253 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bg.json @@ -0,0 +1,130 @@ +{ + "code": "BG", + "name": "Bulgaria", + "states": [ + { + "code": "BG-01", + "name": "Blagoevgrad" + }, + { + "code": "BG-02", + "name": "Burgas" + }, + { + "code": "BG-08", + "name": "Dobrich" + }, + { + "code": "BG-07", + "name": "Gabrovo" + }, + { + "code": "BG-26", + "name": "Haskovo" + }, + { + "code": "BG-09", + "name": "Kardzhali" + }, + { + "code": "BG-10", + "name": "Kyustendil" + }, + { + "code": "BG-11", + "name": "Lovech" + }, + { + "code": "BG-12", + "name": "Montana" + }, + { + "code": "BG-13", + "name": "Pazardzhik" + }, + { + "code": "BG-14", + "name": "Pernik" + }, + { + "code": "BG-15", + "name": "Pleven" + }, + { + "code": "BG-16", + "name": "Plovdiv" + }, + { + "code": "BG-17", + "name": "Razgrad" + }, + { + "code": "BG-18", + "name": "Ruse" + }, + { + "code": "BG-27", + "name": "Shumen" + }, + { + "code": "BG-19", + "name": "Silistra" + }, + { + "code": "BG-20", + "name": "Sliven" + }, + { + "code": "BG-21", + "name": "Smolyan" + }, + { + "code": "BG-23", + "name": "Sofia District" + }, + { + "code": "BG-22", + "name": "Sofia" + }, + { + "code": "BG-24", + "name": "Stara Zagora" + }, + { + "code": "BG-25", + "name": "Targovishte" + }, + { + "code": "BG-03", + "name": "Varna" + }, + { + "code": "BG-04", + "name": "Veliko Tarnovo" + }, + { + "code": "BG-05", + "name": "Vidin" + }, + { + "code": "BG-06", + "name": "Vratsa" + }, + { + "code": "BG-28", + "name": "Yambol" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bh.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bh.json new file mode 100644 index 00000000000..99f4eda2210 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bh.json @@ -0,0 +1,17 @@ +{ + "code": "BH", + "name": "Bahrain", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bh" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bi.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bi.json new file mode 100644 index 00000000000..826abed01d4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bi.json @@ -0,0 +1,17 @@ +{ + "code": "BI", + "name": "Burundi", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bi" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bj.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bj.json new file mode 100644 index 00000000000..ae34605cebe --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bj.json @@ -0,0 +1,66 @@ +{ + "code": "BJ", + "name": "Benin", + "states": [ + { + "code": "AL", + "name": "Alibori" + }, + { + "code": "AK", + "name": "Atakora" + }, + { + "code": "AQ", + "name": "Atlantique" + }, + { + "code": "BO", + "name": "Borgou" + }, + { + "code": "CO", + "name": "Collines" + }, + { + "code": "KO", + "name": "Kouffo" + }, + { + "code": "DO", + "name": "Donga" + }, + { + "code": "LI", + "name": "Littoral" + }, + { + "code": "MO", + "name": "Mono" + }, + { + "code": "OU", + "name": "Ouémé" + }, + { + "code": "PL", + "name": "Plateau" + }, + { + "code": "ZO", + "name": "Zou" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bj" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bl.json new file mode 100644 index 00000000000..bd9389e7770 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bl.json @@ -0,0 +1,17 @@ +{ + "code": "BL", + "name": "Saint Barthélemy", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bm.json new file mode 100644 index 00000000000..3209b4ce05a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bm.json @@ -0,0 +1,17 @@ +{ + "code": "BM", + "name": "Bermuda", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bn.json new file mode 100644 index 00000000000..2de3c6fde9d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bn.json @@ -0,0 +1,17 @@ +{ + "code": "BN", + "name": "Brunei", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bo.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bo.json new file mode 100644 index 00000000000..50cf3ad1ab0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bo.json @@ -0,0 +1,54 @@ +{ + "code": "BO", + "name": "Bolivia", + "states": [ + { + "code": "BO-B", + "name": "Beni" + }, + { + "code": "BO-H", + "name": "Chuquisaca" + }, + { + "code": "BO-C", + "name": "Cochabamba" + }, + { + "code": "BO-L", + "name": "La Paz" + }, + { + "code": "BO-O", + "name": "Oruro" + }, + { + "code": "BO-N", + "name": "Pando" + }, + { + "code": "BO-P", + "name": "Potosí" + }, + { + "code": "BO-S", + "name": "Santa Cruz" + }, + { + "code": "BO-T", + "name": "Tarija" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bo" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bq.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bq.json new file mode 100644 index 00000000000..0884f15de44 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bq.json @@ -0,0 +1,17 @@ +{ + "code": "BQ", + "name": "Bonaire, Saint Eustatius and Saba", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bq" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/br.json b/plugins/woocommerce/tests/api-core-tests/data/countries/br.json new file mode 100644 index 00000000000..657986bca3c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/br.json @@ -0,0 +1,126 @@ +{ + "code": "BR", + "name": "Brazil", + "states": [ + { + "code": "AC", + "name": "Acre" + }, + { + "code": "AL", + "name": "Alagoas" + }, + { + "code": "AP", + "name": "Amapá" + }, + { + "code": "AM", + "name": "Amazonas" + }, + { + "code": "BA", + "name": "Bahia" + }, + { + "code": "CE", + "name": "Ceará" + }, + { + "code": "DF", + "name": "Distrito Federal" + }, + { + "code": "ES", + "name": "Espírito Santo" + }, + { + "code": "GO", + "name": "Goiás" + }, + { + "code": "MA", + "name": "Maranhão" + }, + { + "code": "MT", + "name": "Mato Grosso" + }, + { + "code": "MS", + "name": "Mato Grosso do Sul" + }, + { + "code": "MG", + "name": "Minas Gerais" + }, + { + "code": "PA", + "name": "Pará" + }, + { + "code": "PB", + "name": "Paraíba" + }, + { + "code": "PR", + "name": "Paraná" + }, + { + "code": "PE", + "name": "Pernambuco" + }, + { + "code": "PI", + "name": "Piauí" + }, + { + "code": "RJ", + "name": "Rio de Janeiro" + }, + { + "code": "RN", + "name": "Rio Grande do Norte" + }, + { + "code": "RS", + "name": "Rio Grande do Sul" + }, + { + "code": "RO", + "name": "Rondônia" + }, + { + "code": "RR", + "name": "Roraima" + }, + { + "code": "SC", + "name": "Santa Catarina" + }, + { + "code": "SP", + "name": "São Paulo" + }, + { + "code": "SE", + "name": "Sergipe" + }, + { + "code": "TO", + "name": "Tocantins" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/br" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bs.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bs.json new file mode 100644 index 00000000000..58447b47999 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bs.json @@ -0,0 +1,17 @@ +{ + "code": "BS", + "name": "Bahamas", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bs" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bt.json new file mode 100644 index 00000000000..790694bb20e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bt.json @@ -0,0 +1,17 @@ +{ + "code": "BT", + "name": "Bhutan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bv.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bv.json new file mode 100644 index 00000000000..ae54bc63891 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bv.json @@ -0,0 +1,17 @@ +{ + "code": "BV", + "name": "Bouvet Island", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bv" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bw.json new file mode 100644 index 00000000000..da732ea2b3a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bw.json @@ -0,0 +1,17 @@ +{ + "code": "BW", + "name": "Botswana", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/by.json b/plugins/woocommerce/tests/api-core-tests/data/countries/by.json new file mode 100644 index 00000000000..fb912a41afe --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/by.json @@ -0,0 +1,17 @@ +{ + "code": "BY", + "name": "Belarus", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/by" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/bz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/bz.json new file mode 100644 index 00000000000..79f182adb18 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/bz.json @@ -0,0 +1,17 @@ +{ + "code": "BZ", + "name": "Belize", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/bz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ca.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ca.json new file mode 100644 index 00000000000..79c2e7b4fd6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ca.json @@ -0,0 +1,70 @@ +{ + "code": "CA", + "name": "Canada", + "states": [ + { + "code": "AB", + "name": "Alberta" + }, + { + "code": "BC", + "name": "British Columbia" + }, + { + "code": "MB", + "name": "Manitoba" + }, + { + "code": "NB", + "name": "New Brunswick" + }, + { + "code": "NL", + "name": "Newfoundland and Labrador" + }, + { + "code": "NT", + "name": "Northwest Territories" + }, + { + "code": "NS", + "name": "Nova Scotia" + }, + { + "code": "NU", + "name": "Nunavut" + }, + { + "code": "ON", + "name": "Ontario" + }, + { + "code": "PE", + "name": "Prince Edward Island" + }, + { + "code": "QC", + "name": "Quebec" + }, + { + "code": "SK", + "name": "Saskatchewan" + }, + { + "code": "YT", + "name": "Yukon Territory" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ca" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cc.json new file mode 100644 index 00000000000..dd94b00ab2e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cc.json @@ -0,0 +1,17 @@ +{ + "code": "CC", + "name": "Cocos (Keeling) Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cd.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cd.json new file mode 100644 index 00000000000..48ae2ef2e29 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cd.json @@ -0,0 +1,17 @@ +{ + "code": "CD", + "name": "Congo (Kinshasa)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cd" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cf.json new file mode 100644 index 00000000000..5a1d5bc2dd0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cf.json @@ -0,0 +1,17 @@ +{ + "code": "CF", + "name": "Central African Republic", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cg.json new file mode 100644 index 00000000000..0d8e5ae6542 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cg.json @@ -0,0 +1,17 @@ +{ + "code": "CG", + "name": "Congo (Brazzaville)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ch.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ch.json new file mode 100644 index 00000000000..20b63fa6e13 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ch.json @@ -0,0 +1,122 @@ +{ + "code": "CH", + "name": "Switzerland", + "states": [ + { + "code": "AG", + "name": "Aargau" + }, + { + "code": "AR", + "name": "Appenzell Ausserrhoden" + }, + { + "code": "AI", + "name": "Appenzell Innerrhoden" + }, + { + "code": "BL", + "name": "Basel-Landschaft" + }, + { + "code": "BS", + "name": "Basel-Stadt" + }, + { + "code": "BE", + "name": "Bern" + }, + { + "code": "FR", + "name": "Fribourg" + }, + { + "code": "GE", + "name": "Geneva" + }, + { + "code": "GL", + "name": "Glarus" + }, + { + "code": "GR", + "name": "Graubünden" + }, + { + "code": "JU", + "name": "Jura" + }, + { + "code": "LU", + "name": "Luzern" + }, + { + "code": "NE", + "name": "Neuchâtel" + }, + { + "code": "NW", + "name": "Nidwalden" + }, + { + "code": "OW", + "name": "Obwalden" + }, + { + "code": "SH", + "name": "Schaffhausen" + }, + { + "code": "SZ", + "name": "Schwyz" + }, + { + "code": "SO", + "name": "Solothurn" + }, + { + "code": "SG", + "name": "St. Gallen" + }, + { + "code": "TG", + "name": "Thurgau" + }, + { + "code": "TI", + "name": "Ticino" + }, + { + "code": "UR", + "name": "Uri" + }, + { + "code": "VS", + "name": "Valais" + }, + { + "code": "VD", + "name": "Vaud" + }, + { + "code": "ZG", + "name": "Zug" + }, + { + "code": "ZH", + "name": "Zürich" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ch" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ci.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ci.json new file mode 100644 index 00000000000..9df32e7168a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ci.json @@ -0,0 +1,17 @@ +{ + "code": "CI", + "name": "Ivory Coast", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ci" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ck.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ck.json new file mode 100644 index 00000000000..6cc78d156af --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ck.json @@ -0,0 +1,17 @@ +{ + "code": "CK", + "name": "Cook Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ck" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cl.json new file mode 100644 index 00000000000..cc82388649a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cl.json @@ -0,0 +1,82 @@ +{ + "code": "CL", + "name": "Chile", + "states": [ + { + "code": "CL-AI", + "name": "Aisén del General Carlos Ibañez del Campo" + }, + { + "code": "CL-AN", + "name": "Antofagasta" + }, + { + "code": "CL-AP", + "name": "Arica y Parinacota" + }, + { + "code": "CL-AR", + "name": "La Araucanía" + }, + { + "code": "CL-AT", + "name": "Atacama" + }, + { + "code": "CL-BI", + "name": "Biobío" + }, + { + "code": "CL-CO", + "name": "Coquimbo" + }, + { + "code": "CL-LI", + "name": "Libertador General Bernardo O'Higgins" + }, + { + "code": "CL-LL", + "name": "Los Lagos" + }, + { + "code": "CL-LR", + "name": "Los Ríos" + }, + { + "code": "CL-MA", + "name": "Magallanes" + }, + { + "code": "CL-ML", + "name": "Maule" + }, + { + "code": "CL-NB", + "name": "Ñuble" + }, + { + "code": "CL-RM", + "name": "Región Metropolitana de Santiago" + }, + { + "code": "CL-TA", + "name": "Tarapacá" + }, + { + "code": "CL-VS", + "name": "Valparaíso" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cm.json new file mode 100644 index 00000000000..8639d967603 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cm.json @@ -0,0 +1,17 @@ +{ + "code": "CM", + "name": "Cameroon", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cn.json new file mode 100644 index 00000000000..6ef46191730 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cn.json @@ -0,0 +1,146 @@ +{ + "code": "CN", + "name": "China", + "states": [ + { + "code": "CN1", + "name": "Yunnan / 云南" + }, + { + "code": "CN2", + "name": "Beijing / 北京" + }, + { + "code": "CN3", + "name": "Tianjin / 天津" + }, + { + "code": "CN4", + "name": "Hebei / 河北" + }, + { + "code": "CN5", + "name": "Shanxi / 山西" + }, + { + "code": "CN6", + "name": "Inner Mongolia / 內蒙古" + }, + { + "code": "CN7", + "name": "Liaoning / 辽宁" + }, + { + "code": "CN8", + "name": "Jilin / 吉林" + }, + { + "code": "CN9", + "name": "Heilongjiang / 黑龙江" + }, + { + "code": "CN10", + "name": "Shanghai / 上海" + }, + { + "code": "CN11", + "name": "Jiangsu / 江苏" + }, + { + "code": "CN12", + "name": "Zhejiang / 浙江" + }, + { + "code": "CN13", + "name": "Anhui / 安徽" + }, + { + "code": "CN14", + "name": "Fujian / 福建" + }, + { + "code": "CN15", + "name": "Jiangxi / 江西" + }, + { + "code": "CN16", + "name": "Shandong / 山东" + }, + { + "code": "CN17", + "name": "Henan / 河南" + }, + { + "code": "CN18", + "name": "Hubei / 湖北" + }, + { + "code": "CN19", + "name": "Hunan / 湖南" + }, + { + "code": "CN20", + "name": "Guangdong / 广东" + }, + { + "code": "CN21", + "name": "Guangxi Zhuang / 广西壮族" + }, + { + "code": "CN22", + "name": "Hainan / 海南" + }, + { + "code": "CN23", + "name": "Chongqing / 重庆" + }, + { + "code": "CN24", + "name": "Sichuan / 四川" + }, + { + "code": "CN25", + "name": "Guizhou / 贵州" + }, + { + "code": "CN26", + "name": "Shaanxi / 陕西" + }, + { + "code": "CN27", + "name": "Gansu / 甘肃" + }, + { + "code": "CN28", + "name": "Qinghai / 青海" + }, + { + "code": "CN29", + "name": "Ningxia Hui / 宁夏" + }, + { + "code": "CN30", + "name": "Macao / 澳门" + }, + { + "code": "CN31", + "name": "Tibet / 西藏" + }, + { + "code": "CN32", + "name": "Xinjiang / 新疆" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/co.json b/plugins/woocommerce/tests/api-core-tests/data/countries/co.json new file mode 100644 index 00000000000..f3f61d87549 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/co.json @@ -0,0 +1,150 @@ +{ + "code": "CO", + "name": "Colombia", + "states": [ + { + "code": "CO-AMA", + "name": "Amazonas" + }, + { + "code": "CO-ANT", + "name": "Antioquia" + }, + { + "code": "CO-ARA", + "name": "Arauca" + }, + { + "code": "CO-ATL", + "name": "Atlántico" + }, + { + "code": "CO-BOL", + "name": "Bolívar" + }, + { + "code": "CO-BOY", + "name": "Boyacá" + }, + { + "code": "CO-CAL", + "name": "Caldas" + }, + { + "code": "CO-CAQ", + "name": "Caquetá" + }, + { + "code": "CO-CAS", + "name": "Casanare" + }, + { + "code": "CO-CAU", + "name": "Cauca" + }, + { + "code": "CO-CES", + "name": "Cesar" + }, + { + "code": "CO-CHO", + "name": "Chocó" + }, + { + "code": "CO-COR", + "name": "Córdoba" + }, + { + "code": "CO-CUN", + "name": "Cundinamarca" + }, + { + "code": "CO-DC", + "name": "Capital District" + }, + { + "code": "CO-GUA", + "name": "Guainía" + }, + { + "code": "CO-GUV", + "name": "Guaviare" + }, + { + "code": "CO-HUI", + "name": "Huila" + }, + { + "code": "CO-LAG", + "name": "La Guajira" + }, + { + "code": "CO-MAG", + "name": "Magdalena" + }, + { + "code": "CO-MET", + "name": "Meta" + }, + { + "code": "CO-NAR", + "name": "Nariño" + }, + { + "code": "CO-NSA", + "name": "Norte de Santander" + }, + { + "code": "CO-PUT", + "name": "Putumayo" + }, + { + "code": "CO-QUI", + "name": "Quindío" + }, + { + "code": "CO-RIS", + "name": "Risaralda" + }, + { + "code": "CO-SAN", + "name": "Santander" + }, + { + "code": "CO-SAP", + "name": "San Andrés & Providencia" + }, + { + "code": "CO-SUC", + "name": "Sucre" + }, + { + "code": "CO-TOL", + "name": "Tolima" + }, + { + "code": "CO-VAC", + "name": "Valle del Cauca" + }, + { + "code": "CO-VAU", + "name": "Vaupés" + }, + { + "code": "CO-VID", + "name": "Vichada" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/co" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cr.json new file mode 100644 index 00000000000..ec43d2d4af9 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cr.json @@ -0,0 +1,46 @@ +{ + "code": "CR", + "name": "Costa Rica", + "states": [ + { + "code": "CR-A", + "name": "Alajuela" + }, + { + "code": "CR-C", + "name": "Cartago" + }, + { + "code": "CR-G", + "name": "Guanacaste" + }, + { + "code": "CR-H", + "name": "Heredia" + }, + { + "code": "CR-L", + "name": "Limón" + }, + { + "code": "CR-P", + "name": "Puntarenas" + }, + { + "code": "CR-SJ", + "name": "San José" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cu.json new file mode 100644 index 00000000000..1437e4d9241 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cu.json @@ -0,0 +1,17 @@ +{ + "code": "CU", + "name": "Cuba", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cv.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cv.json new file mode 100644 index 00000000000..5af5666f138 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cv.json @@ -0,0 +1,17 @@ +{ + "code": "CV", + "name": "Cape Verde", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cv" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cw.json new file mode 100644 index 00000000000..0c97978aec4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cw.json @@ -0,0 +1,17 @@ +{ + "code": "CW", + "name": "Curaçao", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cx.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cx.json new file mode 100644 index 00000000000..f0502b0fae5 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cx.json @@ -0,0 +1,17 @@ +{ + "code": "CX", + "name": "Christmas Island", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cx" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cy.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cy.json new file mode 100644 index 00000000000..f0178524ca7 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cy.json @@ -0,0 +1,17 @@ +{ + "code": "CY", + "name": "Cyprus", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cy" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/cz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/cz.json new file mode 100644 index 00000000000..a5f60ecbd02 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/cz.json @@ -0,0 +1,17 @@ +{ + "code": "CZ", + "name": "Czech Republic", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/cz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/de.json b/plugins/woocommerce/tests/api-core-tests/data/countries/de.json new file mode 100644 index 00000000000..655803d3994 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/de.json @@ -0,0 +1,82 @@ +{ + "code": "DE", + "name": "Germany", + "states": [ + { + "code": "DE-BW", + "name": "Baden-Württemberg" + }, + { + "code": "DE-BY", + "name": "Bavaria" + }, + { + "code": "DE-BE", + "name": "Berlin" + }, + { + "code": "DE-BB", + "name": "Brandenburg" + }, + { + "code": "DE-HB", + "name": "Bremen" + }, + { + "code": "DE-HH", + "name": "Hamburg" + }, + { + "code": "DE-HE", + "name": "Hesse" + }, + { + "code": "DE-MV", + "name": "Mecklenburg-Vorpommern" + }, + { + "code": "DE-NI", + "name": "Lower Saxony" + }, + { + "code": "DE-NW", + "name": "North Rhine-Westphalia" + }, + { + "code": "DE-RP", + "name": "Rhineland-Palatinate" + }, + { + "code": "DE-SL", + "name": "Saarland" + }, + { + "code": "DE-SN", + "name": "Saxony" + }, + { + "code": "DE-ST", + "name": "Saxony-Anhalt" + }, + { + "code": "DE-SH", + "name": "Schleswig-Holstein" + }, + { + "code": "DE-TH", + "name": "Thuringia" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/de" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/dj.json b/plugins/woocommerce/tests/api-core-tests/data/countries/dj.json new file mode 100644 index 00000000000..082b88192ac --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/dj.json @@ -0,0 +1,17 @@ +{ + "code": "DJ", + "name": "Djibouti", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/dj" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/dk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/dk.json new file mode 100644 index 00000000000..caad48f4098 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/dk.json @@ -0,0 +1,17 @@ +{ + "code": "DK", + "name": "Denmark", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/dk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/dm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/dm.json new file mode 100644 index 00000000000..038cb2c0897 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/dm.json @@ -0,0 +1,17 @@ +{ + "code": "DM", + "name": "Dominica", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/dm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/do.json b/plugins/woocommerce/tests/api-core-tests/data/countries/do.json new file mode 100644 index 00000000000..348de770e82 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/do.json @@ -0,0 +1,186 @@ +{ + "code": "DO", + "name": "Dominican Republic", + "states": [ + { + "code": "DO-01", + "name": "Distrito Nacional" + }, + { + "code": "DO-02", + "name": "Azua" + }, + { + "code": "DO-03", + "name": "Baoruco" + }, + { + "code": "DO-04", + "name": "Barahona" + }, + { + "code": "DO-33", + "name": "Cibao Nordeste" + }, + { + "code": "DO-34", + "name": "Cibao Noroeste" + }, + { + "code": "DO-35", + "name": "Cibao Norte" + }, + { + "code": "DO-36", + "name": "Cibao Sur" + }, + { + "code": "DO-05", + "name": "Dajabón" + }, + { + "code": "DO-06", + "name": "Duarte" + }, + { + "code": "DO-08", + "name": "El Seibo" + }, + { + "code": "DO-37", + "name": "El Valle" + }, + { + "code": "DO-07", + "name": "Elías Piña" + }, + { + "code": "DO-38", + "name": "Enriquillo" + }, + { + "code": "DO-09", + "name": "Espaillat" + }, + { + "code": "DO-30", + "name": "Hato Mayor" + }, + { + "code": "DO-19", + "name": "Hermanas Mirabal" + }, + { + "code": "DO-39", + "name": "Higüamo" + }, + { + "code": "DO-10", + "name": "Independencia" + }, + { + "code": "DO-11", + "name": "La Altagracia" + }, + { + "code": "DO-12", + "name": "La Romana" + }, + { + "code": "DO-13", + "name": "La Vega" + }, + { + "code": "DO-14", + "name": "María Trinidad Sánchez" + }, + { + "code": "DO-28", + "name": "Monseñor Nouel" + }, + { + "code": "DO-15", + "name": "Monte Cristi" + }, + { + "code": "DO-29", + "name": "Monte Plata" + }, + { + "code": "DO-40", + "name": "Ozama" + }, + { + "code": "DO-16", + "name": "Pedernales" + }, + { + "code": "DO-17", + "name": "Peravia" + }, + { + "code": "DO-18", + "name": "Puerto Plata" + }, + { + "code": "DO-20", + "name": "Samaná" + }, + { + "code": "DO-21", + "name": "San Cristóbal" + }, + { + "code": "DO-31", + "name": "San José de Ocoa" + }, + { + "code": "DO-22", + "name": "San Juan" + }, + { + "code": "DO-23", + "name": "San Pedro de Macorís" + }, + { + "code": "DO-24", + "name": "Sánchez Ramírez" + }, + { + "code": "DO-25", + "name": "Santiago" + }, + { + "code": "DO-26", + "name": "Santiago Rodríguez" + }, + { + "code": "DO-32", + "name": "Santo Domingo" + }, + { + "code": "DO-41", + "name": "Valdesia" + }, + { + "code": "DO-27", + "name": "Valverde" + }, + { + "code": "DO-42", + "name": "Yuma" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/do" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/dz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/dz.json new file mode 100644 index 00000000000..95ea160eb62 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/dz.json @@ -0,0 +1,210 @@ +{ + "code": "DZ", + "name": "Algeria", + "states": [ + { + "code": "DZ-01", + "name": "Adrar" + }, + { + "code": "DZ-02", + "name": "Chlef" + }, + { + "code": "DZ-03", + "name": "Laghouat" + }, + { + "code": "DZ-04", + "name": "Oum El Bouaghi" + }, + { + "code": "DZ-05", + "name": "Batna" + }, + { + "code": "DZ-06", + "name": "Béjaïa" + }, + { + "code": "DZ-07", + "name": "Biskra" + }, + { + "code": "DZ-08", + "name": "Béchar" + }, + { + "code": "DZ-09", + "name": "Blida" + }, + { + "code": "DZ-10", + "name": "Bouira" + }, + { + "code": "DZ-11", + "name": "Tamanghasset" + }, + { + "code": "DZ-12", + "name": "Tébessa" + }, + { + "code": "DZ-13", + "name": "Tlemcen" + }, + { + "code": "DZ-14", + "name": "Tiaret" + }, + { + "code": "DZ-15", + "name": "Tizi Ouzou" + }, + { + "code": "DZ-16", + "name": "Algiers" + }, + { + "code": "DZ-17", + "name": "Djelfa" + }, + { + "code": "DZ-18", + "name": "Jijel" + }, + { + "code": "DZ-19", + "name": "Sétif" + }, + { + "code": "DZ-20", + "name": "Saïda" + }, + { + "code": "DZ-21", + "name": "Skikda" + }, + { + "code": "DZ-22", + "name": "Sidi Bel Abbès" + }, + { + "code": "DZ-23", + "name": "Annaba" + }, + { + "code": "DZ-24", + "name": "Guelma" + }, + { + "code": "DZ-25", + "name": "Constantine" + }, + { + "code": "DZ-26", + "name": "Médéa" + }, + { + "code": "DZ-27", + "name": "Mostaganem" + }, + { + "code": "DZ-28", + "name": "M’Sila" + }, + { + "code": "DZ-29", + "name": "Mascara" + }, + { + "code": "DZ-30", + "name": "Ouargla" + }, + { + "code": "DZ-31", + "name": "Oran" + }, + { + "code": "DZ-32", + "name": "El Bayadh" + }, + { + "code": "DZ-33", + "name": "Illizi" + }, + { + "code": "DZ-34", + "name": "Bordj Bou Arréridj" + }, + { + "code": "DZ-35", + "name": "Boumerdès" + }, + { + "code": "DZ-36", + "name": "El Tarf" + }, + { + "code": "DZ-37", + "name": "Tindouf" + }, + { + "code": "DZ-38", + "name": "Tissemsilt" + }, + { + "code": "DZ-39", + "name": "El Oued" + }, + { + "code": "DZ-40", + "name": "Khenchela" + }, + { + "code": "DZ-41", + "name": "Souk Ahras" + }, + { + "code": "DZ-42", + "name": "Tipasa" + }, + { + "code": "DZ-43", + "name": "Mila" + }, + { + "code": "DZ-44", + "name": "Aïn Defla" + }, + { + "code": "DZ-45", + "name": "Naama" + }, + { + "code": "DZ-46", + "name": "Aïn Témouchent" + }, + { + "code": "DZ-47", + "name": "Ghardaïa" + }, + { + "code": "DZ-48", + "name": "Relizane" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/dz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ec.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ec.json new file mode 100644 index 00000000000..63fd6d2c0be --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ec.json @@ -0,0 +1,114 @@ +{ + "code": "EC", + "name": "Ecuador", + "states": [ + { + "code": "EC-A", + "name": "Azuay" + }, + { + "code": "EC-B", + "name": "Bolívar" + }, + { + "code": "EC-F", + "name": "Cañar" + }, + { + "code": "EC-C", + "name": "Carchi" + }, + { + "code": "EC-H", + "name": "Chimborazo" + }, + { + "code": "EC-X", + "name": "Cotopaxi" + }, + { + "code": "EC-O", + "name": "El Oro" + }, + { + "code": "EC-E", + "name": "Esmeraldas" + }, + { + "code": "EC-W", + "name": "Galápagos" + }, + { + "code": "EC-G", + "name": "Guayas" + }, + { + "code": "EC-I", + "name": "Imbabura" + }, + { + "code": "EC-L", + "name": "Loja" + }, + { + "code": "EC-R", + "name": "Los Ríos" + }, + { + "code": "EC-M", + "name": "Manabí" + }, + { + "code": "EC-S", + "name": "Morona-Santiago" + }, + { + "code": "EC-N", + "name": "Napo" + }, + { + "code": "EC-D", + "name": "Orellana" + }, + { + "code": "EC-Y", + "name": "Pastaza" + }, + { + "code": "EC-P", + "name": "Pichincha" + }, + { + "code": "EC-SE", + "name": "Santa Elena" + }, + { + "code": "EC-SD", + "name": "Santo Domingo de los Tsáchilas" + }, + { + "code": "EC-U", + "name": "Sucumbíos" + }, + { + "code": "EC-T", + "name": "Tungurahua" + }, + { + "code": "EC-Z", + "name": "Zamora-Chinchipe" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ec" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ee.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ee.json new file mode 100644 index 00000000000..b742ea26d6c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ee.json @@ -0,0 +1,17 @@ +{ + "code": "EE", + "name": "Estonia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ee" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/eg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/eg.json new file mode 100644 index 00000000000..27de87e0df0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/eg.json @@ -0,0 +1,126 @@ +{ + "code": "EG", + "name": "Egypt", + "states": [ + { + "code": "EGALX", + "name": "Alexandria" + }, + { + "code": "EGASN", + "name": "Aswan" + }, + { + "code": "EGAST", + "name": "Asyut" + }, + { + "code": "EGBA", + "name": "Red Sea" + }, + { + "code": "EGBH", + "name": "Beheira" + }, + { + "code": "EGBNS", + "name": "Beni Suef" + }, + { + "code": "EGC", + "name": "Cairo" + }, + { + "code": "EGDK", + "name": "Dakahlia" + }, + { + "code": "EGDT", + "name": "Damietta" + }, + { + "code": "EGFYM", + "name": "Faiyum" + }, + { + "code": "EGGH", + "name": "Gharbia" + }, + { + "code": "EGGZ", + "name": "Giza" + }, + { + "code": "EGIS", + "name": "Ismailia" + }, + { + "code": "EGJS", + "name": "South Sinai" + }, + { + "code": "EGKB", + "name": "Qalyubia" + }, + { + "code": "EGKFS", + "name": "Kafr el-Sheikh" + }, + { + "code": "EGKN", + "name": "Qena" + }, + { + "code": "EGLX", + "name": "Luxor" + }, + { + "code": "EGMN", + "name": "Minya" + }, + { + "code": "EGMNF", + "name": "Monufia" + }, + { + "code": "EGMT", + "name": "Matrouh" + }, + { + "code": "EGPTS", + "name": "Port Said" + }, + { + "code": "EGSHG", + "name": "Sohag" + }, + { + "code": "EGSHR", + "name": "Al Sharqia" + }, + { + "code": "EGSIN", + "name": "North Sinai" + }, + { + "code": "EGSUZ", + "name": "Suez" + }, + { + "code": "EGWAD", + "name": "New Valley" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/eg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/eh.json b/plugins/woocommerce/tests/api-core-tests/data/countries/eh.json new file mode 100644 index 00000000000..7d0c0c3b1b2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/eh.json @@ -0,0 +1,17 @@ +{ + "code": "EH", + "name": "Western Sahara", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/eh" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/er.json b/plugins/woocommerce/tests/api-core-tests/data/countries/er.json new file mode 100644 index 00000000000..aff527009da --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/er.json @@ -0,0 +1,17 @@ +{ + "code": "ER", + "name": "Eritrea", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/er" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/es.json b/plugins/woocommerce/tests/api-core-tests/data/countries/es.json new file mode 100644 index 00000000000..b0890b825d5 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/es.json @@ -0,0 +1,226 @@ +{ + "code": "ES", + "name": "Spain", + "states": [ + { + "code": "C", + "name": "A Coruña" + }, + { + "code": "VI", + "name": "Araba/Álava" + }, + { + "code": "AB", + "name": "Albacete" + }, + { + "code": "A", + "name": "Alicante" + }, + { + "code": "AL", + "name": "Almería" + }, + { + "code": "O", + "name": "Asturias" + }, + { + "code": "AV", + "name": "Ávila" + }, + { + "code": "BA", + "name": "Badajoz" + }, + { + "code": "PM", + "name": "Baleares" + }, + { + "code": "B", + "name": "Barcelona" + }, + { + "code": "BU", + "name": "Burgos" + }, + { + "code": "CC", + "name": "Cáceres" + }, + { + "code": "CA", + "name": "Cádiz" + }, + { + "code": "S", + "name": "Cantabria" + }, + { + "code": "CS", + "name": "Castellón" + }, + { + "code": "CE", + "name": "Ceuta" + }, + { + "code": "CR", + "name": "Ciudad Real" + }, + { + "code": "CO", + "name": "Córdoba" + }, + { + "code": "CU", + "name": "Cuenca" + }, + { + "code": "GI", + "name": "Girona" + }, + { + "code": "GR", + "name": "Granada" + }, + { + "code": "GU", + "name": "Guadalajara" + }, + { + "code": "SS", + "name": "Gipuzkoa" + }, + { + "code": "H", + "name": "Huelva" + }, + { + "code": "HU", + "name": "Huesca" + }, + { + "code": "J", + "name": "Jaén" + }, + { + "code": "LO", + "name": "La Rioja" + }, + { + "code": "GC", + "name": "Las Palmas" + }, + { + "code": "LE", + "name": "León" + }, + { + "code": "L", + "name": "Lleida" + }, + { + "code": "LU", + "name": "Lugo" + }, + { + "code": "M", + "name": "Madrid" + }, + { + "code": "MA", + "name": "Málaga" + }, + { + "code": "ML", + "name": "Melilla" + }, + { + "code": "MU", + "name": "Murcia" + }, + { + "code": "NA", + "name": "Navarra" + }, + { + "code": "OR", + "name": "Ourense" + }, + { + "code": "P", + "name": "Palencia" + }, + { + "code": "PO", + "name": "Pontevedra" + }, + { + "code": "SA", + "name": "Salamanca" + }, + { + "code": "TF", + "name": "Santa Cruz de Tenerife" + }, + { + "code": "SG", + "name": "Segovia" + }, + { + "code": "SE", + "name": "Sevilla" + }, + { + "code": "SO", + "name": "Soria" + }, + { + "code": "T", + "name": "Tarragona" + }, + { + "code": "TE", + "name": "Teruel" + }, + { + "code": "TO", + "name": "Toledo" + }, + { + "code": "V", + "name": "Valencia" + }, + { + "code": "VA", + "name": "Valladolid" + }, + { + "code": "BI", + "name": "Biscay" + }, + { + "code": "ZA", + "name": "Zamora" + }, + { + "code": "Z", + "name": "Zaragoza" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/es" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/et.json b/plugins/woocommerce/tests/api-core-tests/data/countries/et.json new file mode 100644 index 00000000000..c44b461ed67 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/et.json @@ -0,0 +1,17 @@ +{ + "code": "ET", + "name": "Ethiopia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/et" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/fi.json b/plugins/woocommerce/tests/api-core-tests/data/countries/fi.json new file mode 100644 index 00000000000..4af30f6d87f --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/fi.json @@ -0,0 +1,17 @@ +{ + "code": "FI", + "name": "Finland", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/fi" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/fj.json b/plugins/woocommerce/tests/api-core-tests/data/countries/fj.json new file mode 100644 index 00000000000..78a08a39f83 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/fj.json @@ -0,0 +1,17 @@ +{ + "code": "FJ", + "name": "Fiji", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/fj" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/fk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/fk.json new file mode 100644 index 00000000000..a39bc4a01ed --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/fk.json @@ -0,0 +1,17 @@ +{ + "code": "FK", + "name": "Falkland Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/fk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/fm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/fm.json new file mode 100644 index 00000000000..0a3947ce36e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/fm.json @@ -0,0 +1,17 @@ +{ + "code": "FM", + "name": "Micronesia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/fm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/fo.json b/plugins/woocommerce/tests/api-core-tests/data/countries/fo.json new file mode 100644 index 00000000000..7cda3591022 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/fo.json @@ -0,0 +1,17 @@ +{ + "code": "FO", + "name": "Faroe Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/fo" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/fr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/fr.json new file mode 100644 index 00000000000..599a19d6899 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/fr.json @@ -0,0 +1,17 @@ +{ + "code": "FR", + "name": "France", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/fr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ga.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ga.json new file mode 100644 index 00000000000..b8d26d54aba --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ga.json @@ -0,0 +1,17 @@ +{ + "code": "GA", + "name": "Gabon", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ga" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gb.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gb.json new file mode 100644 index 00000000000..ae0c55d3742 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gb.json @@ -0,0 +1,17 @@ +{ + "code": "GB", + "name": "United Kingdom (UK)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gb" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gd.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gd.json new file mode 100644 index 00000000000..f07204fd5d1 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gd.json @@ -0,0 +1,17 @@ +{ + "code": "GD", + "name": "Grenada", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gd" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ge.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ge.json new file mode 100644 index 00000000000..824a6a5e8d0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ge.json @@ -0,0 +1,17 @@ +{ + "code": "GE", + "name": "Georgia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ge" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gf.json new file mode 100644 index 00000000000..72aa3b95fdd --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gf.json @@ -0,0 +1,17 @@ +{ + "code": "GF", + "name": "French Guiana", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gg.json new file mode 100644 index 00000000000..3740a3baf74 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gg.json @@ -0,0 +1,17 @@ +{ + "code": "GG", + "name": "Guernsey", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gh.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gh.json new file mode 100644 index 00000000000..e59c5b19b30 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gh.json @@ -0,0 +1,86 @@ +{ + "code": "GH", + "name": "Ghana", + "states": [ + { + "code": "AF", + "name": "Ahafo" + }, + { + "code": "AH", + "name": "Ashanti" + }, + { + "code": "BA", + "name": "Brong-Ahafo" + }, + { + "code": "BO", + "name": "Bono" + }, + { + "code": "BE", + "name": "Bono East" + }, + { + "code": "CP", + "name": "Central" + }, + { + "code": "EP", + "name": "Eastern" + }, + { + "code": "AA", + "name": "Greater Accra" + }, + { + "code": "NE", + "name": "North East" + }, + { + "code": "NP", + "name": "Northern" + }, + { + "code": "OT", + "name": "Oti" + }, + { + "code": "SV", + "name": "Savannah" + }, + { + "code": "UE", + "name": "Upper East" + }, + { + "code": "UW", + "name": "Upper West" + }, + { + "code": "TV", + "name": "Volta" + }, + { + "code": "WP", + "name": "Western" + }, + { + "code": "WN", + "name": "Western North" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gh" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gi.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gi.json new file mode 100644 index 00000000000..a65edb3a65d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gi.json @@ -0,0 +1,17 @@ +{ + "code": "GI", + "name": "Gibraltar", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gi" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gl.json new file mode 100644 index 00000000000..5d80057cbd6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gl.json @@ -0,0 +1,17 @@ +{ + "code": "GL", + "name": "Greenland", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gm.json new file mode 100644 index 00000000000..ffec41e6602 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gm.json @@ -0,0 +1,17 @@ +{ + "code": "GM", + "name": "Gambia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gn.json new file mode 100644 index 00000000000..19150ad2ed8 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gn.json @@ -0,0 +1,17 @@ +{ + "code": "GN", + "name": "Guinea", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gp.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gp.json new file mode 100644 index 00000000000..95ba3ce6a47 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gp.json @@ -0,0 +1,17 @@ +{ + "code": "GP", + "name": "Guadeloupe", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gp" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gq.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gq.json new file mode 100644 index 00000000000..457bfe57486 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gq.json @@ -0,0 +1,17 @@ +{ + "code": "GQ", + "name": "Equatorial Guinea", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gq" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gr.json new file mode 100644 index 00000000000..79ad9164027 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gr.json @@ -0,0 +1,70 @@ +{ + "code": "GR", + "name": "Greece", + "states": [ + { + "code": "I", + "name": "Attica" + }, + { + "code": "A", + "name": "East Macedonia and Thrace" + }, + { + "code": "B", + "name": "Central Macedonia" + }, + { + "code": "C", + "name": "West Macedonia" + }, + { + "code": "D", + "name": "Epirus" + }, + { + "code": "E", + "name": "Thessaly" + }, + { + "code": "F", + "name": "Ionian Islands" + }, + { + "code": "G", + "name": "West Greece" + }, + { + "code": "H", + "name": "Central Greece" + }, + { + "code": "J", + "name": "Peloponnese" + }, + { + "code": "K", + "name": "North Aegean" + }, + { + "code": "L", + "name": "South Aegean" + }, + { + "code": "M", + "name": "Crete" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gs.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gs.json new file mode 100644 index 00000000000..3fd4aa99b4a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gs.json @@ -0,0 +1,17 @@ +{ + "code": "GS", + "name": "South Georgia/Sandwich Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gs" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gt.json new file mode 100644 index 00000000000..b23ce803e7c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gt.json @@ -0,0 +1,106 @@ +{ + "code": "GT", + "name": "Guatemala", + "states": [ + { + "code": "GT-AV", + "name": "Alta Verapaz" + }, + { + "code": "GT-BV", + "name": "Baja Verapaz" + }, + { + "code": "GT-CM", + "name": "Chimaltenango" + }, + { + "code": "GT-CQ", + "name": "Chiquimula" + }, + { + "code": "GT-PR", + "name": "El Progreso" + }, + { + "code": "GT-ES", + "name": "Escuintla" + }, + { + "code": "GT-GU", + "name": "Guatemala" + }, + { + "code": "GT-HU", + "name": "Huehuetenango" + }, + { + "code": "GT-IZ", + "name": "Izabal" + }, + { + "code": "GT-JA", + "name": "Jalapa" + }, + { + "code": "GT-JU", + "name": "Jutiapa" + }, + { + "code": "GT-PE", + "name": "Petén" + }, + { + "code": "GT-QZ", + "name": "Quetzaltenango" + }, + { + "code": "GT-QC", + "name": "Quiché" + }, + { + "code": "GT-RE", + "name": "Retalhuleu" + }, + { + "code": "GT-SA", + "name": "Sacatepéquez" + }, + { + "code": "GT-SM", + "name": "San Marcos" + }, + { + "code": "GT-SR", + "name": "Santa Rosa" + }, + { + "code": "GT-SO", + "name": "Sololá" + }, + { + "code": "GT-SU", + "name": "Suchitepéquez" + }, + { + "code": "GT-TO", + "name": "Totonicapán" + }, + { + "code": "GT-ZA", + "name": "Zacapa" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gu.json new file mode 100644 index 00000000000..72f4bf53426 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gu.json @@ -0,0 +1,17 @@ +{ + "code": "GU", + "name": "Guam", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gw.json new file mode 100644 index 00000000000..a5d6ba6f8a1 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gw.json @@ -0,0 +1,17 @@ +{ + "code": "GW", + "name": "Guinea-Bissau", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/gy.json b/plugins/woocommerce/tests/api-core-tests/data/countries/gy.json new file mode 100644 index 00000000000..b9c993d6a60 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/gy.json @@ -0,0 +1,17 @@ +{ + "code": "GY", + "name": "Guyana", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/gy" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/hk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/hk.json new file mode 100644 index 00000000000..89992fc8936 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/hk.json @@ -0,0 +1,30 @@ +{ + "code": "HK", + "name": "Hong Kong", + "states": [ + { + "code": "HONG KONG", + "name": "Hong Kong Island" + }, + { + "code": "KOWLOON", + "name": "Kowloon" + }, + { + "code": "NEW TERRITORIES", + "name": "New Territories" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/hk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/hm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/hm.json new file mode 100644 index 00000000000..cff59bcc512 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/hm.json @@ -0,0 +1,17 @@ +{ + "code": "HM", + "name": "Heard Island and McDonald Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/hm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/hn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/hn.json new file mode 100644 index 00000000000..47fc2b80737 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/hn.json @@ -0,0 +1,90 @@ +{ + "code": "HN", + "name": "Honduras", + "states": [ + { + "code": "HN-AT", + "name": "Atlántida" + }, + { + "code": "HN-IB", + "name": "Bay Islands" + }, + { + "code": "HN-CH", + "name": "Choluteca" + }, + { + "code": "HN-CL", + "name": "Colón" + }, + { + "code": "HN-CM", + "name": "Comayagua" + }, + { + "code": "HN-CP", + "name": "Copán" + }, + { + "code": "HN-CR", + "name": "Cortés" + }, + { + "code": "HN-EP", + "name": "El Paraíso" + }, + { + "code": "HN-FM", + "name": "Francisco Morazán" + }, + { + "code": "HN-GD", + "name": "Gracias a Dios" + }, + { + "code": "HN-IN", + "name": "Intibucá" + }, + { + "code": "HN-LE", + "name": "Lempira" + }, + { + "code": "HN-LP", + "name": "La Paz" + }, + { + "code": "HN-OC", + "name": "Ocotepeque" + }, + { + "code": "HN-OL", + "name": "Olancho" + }, + { + "code": "HN-SB", + "name": "Santa Bárbara" + }, + { + "code": "HN-VA", + "name": "Valle" + }, + { + "code": "HN-YO", + "name": "Yoro" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/hn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/hr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/hr.json new file mode 100644 index 00000000000..058a5656984 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/hr.json @@ -0,0 +1,17 @@ +{ + "code": "HR", + "name": "Croatia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/hr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ht.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ht.json new file mode 100644 index 00000000000..50ef0cc7271 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ht.json @@ -0,0 +1,17 @@ +{ + "code": "HT", + "name": "Haiti", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ht" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/hu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/hu.json new file mode 100644 index 00000000000..e5fb18f6388 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/hu.json @@ -0,0 +1,98 @@ +{ + "code": "HU", + "name": "Hungary", + "states": [ + { + "code": "BK", + "name": "Bács-Kiskun" + }, + { + "code": "BE", + "name": "Békés" + }, + { + "code": "BA", + "name": "Baranya" + }, + { + "code": "BZ", + "name": "Borsod-Abaúj-Zemplén" + }, + { + "code": "BU", + "name": "Budapest" + }, + { + "code": "CS", + "name": "Csongrád-Csanád" + }, + { + "code": "FE", + "name": "Fejér" + }, + { + "code": "GS", + "name": "Győr-Moson-Sopron" + }, + { + "code": "HB", + "name": "Hajdú-Bihar" + }, + { + "code": "HE", + "name": "Heves" + }, + { + "code": "JN", + "name": "Jász-Nagykun-Szolnok" + }, + { + "code": "KE", + "name": "Komárom-Esztergom" + }, + { + "code": "NO", + "name": "Nógrád" + }, + { + "code": "PE", + "name": "Pest" + }, + { + "code": "SO", + "name": "Somogy" + }, + { + "code": "SZ", + "name": "Szabolcs-Szatmár-Bereg" + }, + { + "code": "TO", + "name": "Tolna" + }, + { + "code": "VA", + "name": "Vas" + }, + { + "code": "VE", + "name": "Veszprém" + }, + { + "code": "ZA", + "name": "Zala" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/hu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/id.json b/plugins/woocommerce/tests/api-core-tests/data/countries/id.json new file mode 100644 index 00000000000..ae1c5b0cf8a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/id.json @@ -0,0 +1,154 @@ +{ + "code": "ID", + "name": "Indonesia", + "states": [ + { + "code": "AC", + "name": "Daerah Istimewa Aceh" + }, + { + "code": "SU", + "name": "Sumatera Utara" + }, + { + "code": "SB", + "name": "Sumatera Barat" + }, + { + "code": "RI", + "name": "Riau" + }, + { + "code": "KR", + "name": "Kepulauan Riau" + }, + { + "code": "JA", + "name": "Jambi" + }, + { + "code": "SS", + "name": "Sumatera Selatan" + }, + { + "code": "BB", + "name": "Bangka Belitung" + }, + { + "code": "BE", + "name": "Bengkulu" + }, + { + "code": "LA", + "name": "Lampung" + }, + { + "code": "JK", + "name": "DKI Jakarta" + }, + { + "code": "JB", + "name": "Jawa Barat" + }, + { + "code": "BT", + "name": "Banten" + }, + { + "code": "JT", + "name": "Jawa Tengah" + }, + { + "code": "JI", + "name": "Jawa Timur" + }, + { + "code": "YO", + "name": "Daerah Istimewa Yogyakarta" + }, + { + "code": "BA", + "name": "Bali" + }, + { + "code": "NB", + "name": "Nusa Tenggara Barat" + }, + { + "code": "NT", + "name": "Nusa Tenggara Timur" + }, + { + "code": "KB", + "name": "Kalimantan Barat" + }, + { + "code": "KT", + "name": "Kalimantan Tengah" + }, + { + "code": "KI", + "name": "Kalimantan Timur" + }, + { + "code": "KS", + "name": "Kalimantan Selatan" + }, + { + "code": "KU", + "name": "Kalimantan Utara" + }, + { + "code": "SA", + "name": "Sulawesi Utara" + }, + { + "code": "ST", + "name": "Sulawesi Tengah" + }, + { + "code": "SG", + "name": "Sulawesi Tenggara" + }, + { + "code": "SR", + "name": "Sulawesi Barat" + }, + { + "code": "SN", + "name": "Sulawesi Selatan" + }, + { + "code": "GO", + "name": "Gorontalo" + }, + { + "code": "MA", + "name": "Maluku" + }, + { + "code": "MU", + "name": "Maluku Utara" + }, + { + "code": "PA", + "name": "Papua" + }, + { + "code": "PB", + "name": "Papua Barat" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/id" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ie.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ie.json new file mode 100644 index 00000000000..540d2177a33 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ie.json @@ -0,0 +1,122 @@ +{ + "code": "IE", + "name": "Ireland", + "states": [ + { + "code": "CW", + "name": "Carlow" + }, + { + "code": "CN", + "name": "Cavan" + }, + { + "code": "CE", + "name": "Clare" + }, + { + "code": "CO", + "name": "Cork" + }, + { + "code": "DL", + "name": "Donegal" + }, + { + "code": "D", + "name": "Dublin" + }, + { + "code": "G", + "name": "Galway" + }, + { + "code": "KY", + "name": "Kerry" + }, + { + "code": "KE", + "name": "Kildare" + }, + { + "code": "KK", + "name": "Kilkenny" + }, + { + "code": "LS", + "name": "Laois" + }, + { + "code": "LM", + "name": "Leitrim" + }, + { + "code": "LK", + "name": "Limerick" + }, + { + "code": "LD", + "name": "Longford" + }, + { + "code": "LH", + "name": "Louth" + }, + { + "code": "MO", + "name": "Mayo" + }, + { + "code": "MH", + "name": "Meath" + }, + { + "code": "MN", + "name": "Monaghan" + }, + { + "code": "OY", + "name": "Offaly" + }, + { + "code": "RN", + "name": "Roscommon" + }, + { + "code": "SO", + "name": "Sligo" + }, + { + "code": "TA", + "name": "Tipperary" + }, + { + "code": "WD", + "name": "Waterford" + }, + { + "code": "WH", + "name": "Westmeath" + }, + { + "code": "WX", + "name": "Wexford" + }, + { + "code": "WW", + "name": "Wicklow" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ie" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/il.json b/plugins/woocommerce/tests/api-core-tests/data/countries/il.json new file mode 100644 index 00000000000..85ee089e81a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/il.json @@ -0,0 +1,17 @@ +{ + "code": "IL", + "name": "Israel", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/il" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/im.json b/plugins/woocommerce/tests/api-core-tests/data/countries/im.json new file mode 100644 index 00000000000..39f03960ddb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/im.json @@ -0,0 +1,17 @@ +{ + "code": "IM", + "name": "Isle of Man", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/im" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/in.json b/plugins/woocommerce/tests/api-core-tests/data/countries/in.json new file mode 100644 index 00000000000..3a9befee2e7 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/in.json @@ -0,0 +1,166 @@ +{ + "code": "IN", + "name": "India", + "states": [ + { + "code": "AP", + "name": "Andhra Pradesh" + }, + { + "code": "AR", + "name": "Arunachal Pradesh" + }, + { + "code": "AS", + "name": "Assam" + }, + { + "code": "BR", + "name": "Bihar" + }, + { + "code": "CT", + "name": "Chhattisgarh" + }, + { + "code": "GA", + "name": "Goa" + }, + { + "code": "GJ", + "name": "Gujarat" + }, + { + "code": "HR", + "name": "Haryana" + }, + { + "code": "HP", + "name": "Himachal Pradesh" + }, + { + "code": "JK", + "name": "Jammu and Kashmir" + }, + { + "code": "JH", + "name": "Jharkhand" + }, + { + "code": "KA", + "name": "Karnataka" + }, + { + "code": "KL", + "name": "Kerala" + }, + { + "code": "LA", + "name": "Ladakh" + }, + { + "code": "MP", + "name": "Madhya Pradesh" + }, + { + "code": "MH", + "name": "Maharashtra" + }, + { + "code": "MN", + "name": "Manipur" + }, + { + "code": "ML", + "name": "Meghalaya" + }, + { + "code": "MZ", + "name": "Mizoram" + }, + { + "code": "NL", + "name": "Nagaland" + }, + { + "code": "OR", + "name": "Odisha" + }, + { + "code": "PB", + "name": "Punjab" + }, + { + "code": "RJ", + "name": "Rajasthan" + }, + { + "code": "SK", + "name": "Sikkim" + }, + { + "code": "TN", + "name": "Tamil Nadu" + }, + { + "code": "TS", + "name": "Telangana" + }, + { + "code": "TR", + "name": "Tripura" + }, + { + "code": "UK", + "name": "Uttarakhand" + }, + { + "code": "UP", + "name": "Uttar Pradesh" + }, + { + "code": "WB", + "name": "West Bengal" + }, + { + "code": "AN", + "name": "Andaman and Nicobar Islands" + }, + { + "code": "CH", + "name": "Chandigarh" + }, + { + "code": "DN", + "name": "Dadra and Nagar Haveli" + }, + { + "code": "DD", + "name": "Daman and Diu" + }, + { + "code": "DL", + "name": "Delhi" + }, + { + "code": "LD", + "name": "Lakshadeep" + }, + { + "code": "PY", + "name": "Pondicherry (Puducherry)" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/in" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/io.json b/plugins/woocommerce/tests/api-core-tests/data/countries/io.json new file mode 100644 index 00000000000..72634b22f16 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/io.json @@ -0,0 +1,17 @@ +{ + "code": "IO", + "name": "British Indian Ocean Territory", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/io" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/iq.json b/plugins/woocommerce/tests/api-core-tests/data/countries/iq.json new file mode 100644 index 00000000000..ccb098daa77 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/iq.json @@ -0,0 +1,17 @@ +{ + "code": "IQ", + "name": "Iraq", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/iq" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ir.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ir.json new file mode 100644 index 00000000000..6508527fd14 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ir.json @@ -0,0 +1,142 @@ +{ + "code": "IR", + "name": "Iran", + "states": [ + { + "code": "KHZ", + "name": "Khuzestan (خوزستان)" + }, + { + "code": "THR", + "name": "Tehran (تهران)" + }, + { + "code": "ILM", + "name": "Ilaam (ایلام)" + }, + { + "code": "BHR", + "name": "Bushehr (بوشهر)" + }, + { + "code": "ADL", + "name": "Ardabil (اردبیل)" + }, + { + "code": "ESF", + "name": "Isfahan (اصفهان)" + }, + { + "code": "YZD", + "name": "Yazd (یزد)" + }, + { + "code": "KRH", + "name": "Kermanshah (کرمانشاه)" + }, + { + "code": "KRN", + "name": "Kerman (کرمان)" + }, + { + "code": "HDN", + "name": "Hamadan (همدان)" + }, + { + "code": "GZN", + "name": "Ghazvin (قزوین)" + }, + { + "code": "ZJN", + "name": "Zanjan (زنجان)" + }, + { + "code": "LRS", + "name": "Luristan (لرستان)" + }, + { + "code": "ABZ", + "name": "Alborz (البرز)" + }, + { + "code": "EAZ", + "name": "East Azarbaijan (آذربایجان شرقی)" + }, + { + "code": "WAZ", + "name": "West Azarbaijan (آذربایجان غربی)" + }, + { + "code": "CHB", + "name": "Chaharmahal and Bakhtiari (چهارمحال و بختیاری)" + }, + { + "code": "SKH", + "name": "South Khorasan (خراسان جنوبی)" + }, + { + "code": "RKH", + "name": "Razavi Khorasan (خراسان رضوی)" + }, + { + "code": "NKH", + "name": "North Khorasan (خراسان شمالی)" + }, + { + "code": "SMN", + "name": "Semnan (سمنان)" + }, + { + "code": "FRS", + "name": "Fars (فارس)" + }, + { + "code": "QHM", + "name": "Qom (قم)" + }, + { + "code": "KRD", + "name": "Kurdistan / کردستان)" + }, + { + "code": "KBD", + "name": "Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)" + }, + { + "code": "GLS", + "name": "Golestan (گلستان)" + }, + { + "code": "GIL", + "name": "Gilan (گیلان)" + }, + { + "code": "MZN", + "name": "Mazandaran (مازندران)" + }, + { + "code": "MKZ", + "name": "Markazi (مرکزی)" + }, + { + "code": "HRZ", + "name": "Hormozgan (هرمزگان)" + }, + { + "code": "SBN", + "name": "Sistan and Baluchestan (سیستان و بلوچستان)" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ir" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/is.json b/plugins/woocommerce/tests/api-core-tests/data/countries/is.json new file mode 100644 index 00000000000..f0cd1e20943 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/is.json @@ -0,0 +1,17 @@ +{ + "code": "IS", + "name": "Iceland", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/is" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/it.json b/plugins/woocommerce/tests/api-core-tests/data/countries/it.json new file mode 100644 index 00000000000..d8d362eac79 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/it.json @@ -0,0 +1,446 @@ +{ + "code": "IT", + "name": "Italy", + "states": [ + { + "code": "AG", + "name": "Agrigento" + }, + { + "code": "AL", + "name": "Alessandria" + }, + { + "code": "AN", + "name": "Ancona" + }, + { + "code": "AO", + "name": "Aosta" + }, + { + "code": "AR", + "name": "Arezzo" + }, + { + "code": "AP", + "name": "Ascoli Piceno" + }, + { + "code": "AT", + "name": "Asti" + }, + { + "code": "AV", + "name": "Avellino" + }, + { + "code": "BA", + "name": "Bari" + }, + { + "code": "BT", + "name": "Barletta-Andria-Trani" + }, + { + "code": "BL", + "name": "Belluno" + }, + { + "code": "BN", + "name": "Benevento" + }, + { + "code": "BG", + "name": "Bergamo" + }, + { + "code": "BI", + "name": "Biella" + }, + { + "code": "BO", + "name": "Bologna" + }, + { + "code": "BZ", + "name": "Bolzano" + }, + { + "code": "BS", + "name": "Brescia" + }, + { + "code": "BR", + "name": "Brindisi" + }, + { + "code": "CA", + "name": "Cagliari" + }, + { + "code": "CL", + "name": "Caltanissetta" + }, + { + "code": "CB", + "name": "Campobasso" + }, + { + "code": "CE", + "name": "Caserta" + }, + { + "code": "CT", + "name": "Catania" + }, + { + "code": "CZ", + "name": "Catanzaro" + }, + { + "code": "CH", + "name": "Chieti" + }, + { + "code": "CO", + "name": "Como" + }, + { + "code": "CS", + "name": "Cosenza" + }, + { + "code": "CR", + "name": "Cremona" + }, + { + "code": "KR", + "name": "Crotone" + }, + { + "code": "CN", + "name": "Cuneo" + }, + { + "code": "EN", + "name": "Enna" + }, + { + "code": "FM", + "name": "Fermo" + }, + { + "code": "FE", + "name": "Ferrara" + }, + { + "code": "FI", + "name": "Firenze" + }, + { + "code": "FG", + "name": "Foggia" + }, + { + "code": "FC", + "name": "Forlì-Cesena" + }, + { + "code": "FR", + "name": "Frosinone" + }, + { + "code": "GE", + "name": "Genova" + }, + { + "code": "GO", + "name": "Gorizia" + }, + { + "code": "GR", + "name": "Grosseto" + }, + { + "code": "IM", + "name": "Imperia" + }, + { + "code": "IS", + "name": "Isernia" + }, + { + "code": "SP", + "name": "La Spezia" + }, + { + "code": "AQ", + "name": "L'Aquila" + }, + { + "code": "LT", + "name": "Latina" + }, + { + "code": "LE", + "name": "Lecce" + }, + { + "code": "LC", + "name": "Lecco" + }, + { + "code": "LI", + "name": "Livorno" + }, + { + "code": "LO", + "name": "Lodi" + }, + { + "code": "LU", + "name": "Lucca" + }, + { + "code": "MC", + "name": "Macerata" + }, + { + "code": "MN", + "name": "Mantova" + }, + { + "code": "MS", + "name": "Massa-Carrara" + }, + { + "code": "MT", + "name": "Matera" + }, + { + "code": "ME", + "name": "Messina" + }, + { + "code": "MI", + "name": "Milano" + }, + { + "code": "MO", + "name": "Modena" + }, + { + "code": "MB", + "name": "Monza e della Brianza" + }, + { + "code": "NA", + "name": "Napoli" + }, + { + "code": "NO", + "name": "Novara" + }, + { + "code": "NU", + "name": "Nuoro" + }, + { + "code": "OR", + "name": "Oristano" + }, + { + "code": "PD", + "name": "Padova" + }, + { + "code": "PA", + "name": "Palermo" + }, + { + "code": "PR", + "name": "Parma" + }, + { + "code": "PV", + "name": "Pavia" + }, + { + "code": "PG", + "name": "Perugia" + }, + { + "code": "PU", + "name": "Pesaro e Urbino" + }, + { + "code": "PE", + "name": "Pescara" + }, + { + "code": "PC", + "name": "Piacenza" + }, + { + "code": "PI", + "name": "Pisa" + }, + { + "code": "PT", + "name": "Pistoia" + }, + { + "code": "PN", + "name": "Pordenone" + }, + { + "code": "PZ", + "name": "Potenza" + }, + { + "code": "PO", + "name": "Prato" + }, + { + "code": "RG", + "name": "Ragusa" + }, + { + "code": "RA", + "name": "Ravenna" + }, + { + "code": "RC", + "name": "Reggio Calabria" + }, + { + "code": "RE", + "name": "Reggio Emilia" + }, + { + "code": "RI", + "name": "Rieti" + }, + { + "code": "RN", + "name": "Rimini" + }, + { + "code": "RM", + "name": "Roma" + }, + { + "code": "RO", + "name": "Rovigo" + }, + { + "code": "SA", + "name": "Salerno" + }, + { + "code": "SS", + "name": "Sassari" + }, + { + "code": "SV", + "name": "Savona" + }, + { + "code": "SI", + "name": "Siena" + }, + { + "code": "SR", + "name": "Siracusa" + }, + { + "code": "SO", + "name": "Sondrio" + }, + { + "code": "SU", + "name": "Sud Sardegna" + }, + { + "code": "TA", + "name": "Taranto" + }, + { + "code": "TE", + "name": "Teramo" + }, + { + "code": "TR", + "name": "Terni" + }, + { + "code": "TO", + "name": "Torino" + }, + { + "code": "TP", + "name": "Trapani" + }, + { + "code": "TN", + "name": "Trento" + }, + { + "code": "TV", + "name": "Treviso" + }, + { + "code": "TS", + "name": "Trieste" + }, + { + "code": "UD", + "name": "Udine" + }, + { + "code": "VA", + "name": "Varese" + }, + { + "code": "VE", + "name": "Venezia" + }, + { + "code": "VB", + "name": "Verbano-Cusio-Ossola" + }, + { + "code": "VC", + "name": "Vercelli" + }, + { + "code": "VR", + "name": "Verona" + }, + { + "code": "VV", + "name": "Vibo Valentia" + }, + { + "code": "VI", + "name": "Vicenza" + }, + { + "code": "VT", + "name": "Viterbo" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/it" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/je.json b/plugins/woocommerce/tests/api-core-tests/data/countries/je.json new file mode 100644 index 00000000000..9b13cd89293 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/je.json @@ -0,0 +1,17 @@ +{ + "code": "JE", + "name": "Jersey", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/je" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/jm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/jm.json new file mode 100644 index 00000000000..941aaa55e8c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/jm.json @@ -0,0 +1,74 @@ +{ + "code": "JM", + "name": "Jamaica", + "states": [ + { + "code": "JM-01", + "name": "Kingston" + }, + { + "code": "JM-02", + "name": "Saint Andrew" + }, + { + "code": "JM-03", + "name": "Saint Thomas" + }, + { + "code": "JM-04", + "name": "Portland" + }, + { + "code": "JM-05", + "name": "Saint Mary" + }, + { + "code": "JM-06", + "name": "Saint Ann" + }, + { + "code": "JM-07", + "name": "Trelawny" + }, + { + "code": "JM-08", + "name": "Saint James" + }, + { + "code": "JM-09", + "name": "Hanover" + }, + { + "code": "JM-10", + "name": "Westmoreland" + }, + { + "code": "JM-11", + "name": "Saint Elizabeth" + }, + { + "code": "JM-12", + "name": "Manchester" + }, + { + "code": "JM-13", + "name": "Clarendon" + }, + { + "code": "JM-14", + "name": "Saint Catherine" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/jm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/jo.json b/plugins/woocommerce/tests/api-core-tests/data/countries/jo.json new file mode 100644 index 00000000000..8c89cb31b3e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/jo.json @@ -0,0 +1,17 @@ +{ + "code": "JO", + "name": "Jordan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/jo" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/jp.json b/plugins/woocommerce/tests/api-core-tests/data/countries/jp.json new file mode 100644 index 00000000000..123c5bf42f1 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/jp.json @@ -0,0 +1,206 @@ +{ + "code": "JP", + "name": "Japan", + "states": [ + { + "code": "JP01", + "name": "Hokkaido" + }, + { + "code": "JP02", + "name": "Aomori" + }, + { + "code": "JP03", + "name": "Iwate" + }, + { + "code": "JP04", + "name": "Miyagi" + }, + { + "code": "JP05", + "name": "Akita" + }, + { + "code": "JP06", + "name": "Yamagata" + }, + { + "code": "JP07", + "name": "Fukushima" + }, + { + "code": "JP08", + "name": "Ibaraki" + }, + { + "code": "JP09", + "name": "Tochigi" + }, + { + "code": "JP10", + "name": "Gunma" + }, + { + "code": "JP11", + "name": "Saitama" + }, + { + "code": "JP12", + "name": "Chiba" + }, + { + "code": "JP13", + "name": "Tokyo" + }, + { + "code": "JP14", + "name": "Kanagawa" + }, + { + "code": "JP15", + "name": "Niigata" + }, + { + "code": "JP16", + "name": "Toyama" + }, + { + "code": "JP17", + "name": "Ishikawa" + }, + { + "code": "JP18", + "name": "Fukui" + }, + { + "code": "JP19", + "name": "Yamanashi" + }, + { + "code": "JP20", + "name": "Nagano" + }, + { + "code": "JP21", + "name": "Gifu" + }, + { + "code": "JP22", + "name": "Shizuoka" + }, + { + "code": "JP23", + "name": "Aichi" + }, + { + "code": "JP24", + "name": "Mie" + }, + { + "code": "JP25", + "name": "Shiga" + }, + { + "code": "JP26", + "name": "Kyoto" + }, + { + "code": "JP27", + "name": "Osaka" + }, + { + "code": "JP28", + "name": "Hyogo" + }, + { + "code": "JP29", + "name": "Nara" + }, + { + "code": "JP30", + "name": "Wakayama" + }, + { + "code": "JP31", + "name": "Tottori" + }, + { + "code": "JP32", + "name": "Shimane" + }, + { + "code": "JP33", + "name": "Okayama" + }, + { + "code": "JP34", + "name": "Hiroshima" + }, + { + "code": "JP35", + "name": "Yamaguchi" + }, + { + "code": "JP36", + "name": "Tokushima" + }, + { + "code": "JP37", + "name": "Kagawa" + }, + { + "code": "JP38", + "name": "Ehime" + }, + { + "code": "JP39", + "name": "Kochi" + }, + { + "code": "JP40", + "name": "Fukuoka" + }, + { + "code": "JP41", + "name": "Saga" + }, + { + "code": "JP42", + "name": "Nagasaki" + }, + { + "code": "JP43", + "name": "Kumamoto" + }, + { + "code": "JP44", + "name": "Oita" + }, + { + "code": "JP45", + "name": "Miyazaki" + }, + { + "code": "JP46", + "name": "Kagoshima" + }, + { + "code": "JP47", + "name": "Okinawa" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/jp" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ke.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ke.json new file mode 100644 index 00000000000..8bf5ef2052c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ke.json @@ -0,0 +1,206 @@ +{ + "code": "KE", + "name": "Kenya", + "states": [ + { + "code": "KE01", + "name": "Baringo" + }, + { + "code": "KE02", + "name": "Bomet" + }, + { + "code": "KE03", + "name": "Bungoma" + }, + { + "code": "KE04", + "name": "Busia" + }, + { + "code": "KE05", + "name": "Elgeyo-Marakwet" + }, + { + "code": "KE06", + "name": "Embu" + }, + { + "code": "KE07", + "name": "Garissa" + }, + { + "code": "KE08", + "name": "Homa Bay" + }, + { + "code": "KE09", + "name": "Isiolo" + }, + { + "code": "KE10", + "name": "Kajiado" + }, + { + "code": "KE11", + "name": "Kakamega" + }, + { + "code": "KE12", + "name": "Kericho" + }, + { + "code": "KE13", + "name": "Kiambu" + }, + { + "code": "KE14", + "name": "Kilifi" + }, + { + "code": "KE15", + "name": "Kirinyaga" + }, + { + "code": "KE16", + "name": "Kisii" + }, + { + "code": "KE17", + "name": "Kisumu" + }, + { + "code": "KE18", + "name": "Kitui" + }, + { + "code": "KE19", + "name": "Kwale" + }, + { + "code": "KE20", + "name": "Laikipia" + }, + { + "code": "KE21", + "name": "Lamu" + }, + { + "code": "KE22", + "name": "Machakos" + }, + { + "code": "KE23", + "name": "Makueni" + }, + { + "code": "KE24", + "name": "Mandera" + }, + { + "code": "KE25", + "name": "Marsabit" + }, + { + "code": "KE26", + "name": "Meru" + }, + { + "code": "KE27", + "name": "Migori" + }, + { + "code": "KE28", + "name": "Mombasa" + }, + { + "code": "KE29", + "name": "Murang’a" + }, + { + "code": "KE30", + "name": "Nairobi County" + }, + { + "code": "KE31", + "name": "Nakuru" + }, + { + "code": "KE32", + "name": "Nandi" + }, + { + "code": "KE33", + "name": "Narok" + }, + { + "code": "KE34", + "name": "Nyamira" + }, + { + "code": "KE35", + "name": "Nyandarua" + }, + { + "code": "KE36", + "name": "Nyeri" + }, + { + "code": "KE37", + "name": "Samburu" + }, + { + "code": "KE38", + "name": "Siaya" + }, + { + "code": "KE39", + "name": "Taita-Taveta" + }, + { + "code": "KE40", + "name": "Tana River" + }, + { + "code": "KE41", + "name": "Tharaka-Nithi" + }, + { + "code": "KE42", + "name": "Trans Nzoia" + }, + { + "code": "KE43", + "name": "Turkana" + }, + { + "code": "KE44", + "name": "Uasin Gishu" + }, + { + "code": "KE45", + "name": "Vihiga" + }, + { + "code": "KE46", + "name": "Wajir" + }, + { + "code": "KE47", + "name": "West Pokot" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ke" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kg.json new file mode 100644 index 00000000000..28ccf89c620 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kg.json @@ -0,0 +1,17 @@ +{ + "code": "KG", + "name": "Kyrgyzstan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kh.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kh.json new file mode 100644 index 00000000000..33ebe5f6f64 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kh.json @@ -0,0 +1,17 @@ +{ + "code": "KH", + "name": "Cambodia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kh" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ki.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ki.json new file mode 100644 index 00000000000..62e7c99564a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ki.json @@ -0,0 +1,17 @@ +{ + "code": "KI", + "name": "Kiribati", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ki" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/km.json b/plugins/woocommerce/tests/api-core-tests/data/countries/km.json new file mode 100644 index 00000000000..e2ca135df54 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/km.json @@ -0,0 +1,17 @@ +{ + "code": "KM", + "name": "Comoros", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/km" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kn.json new file mode 100644 index 00000000000..133987b7b67 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kn.json @@ -0,0 +1,17 @@ +{ + "code": "KN", + "name": "Saint Kitts and Nevis", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kp.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kp.json new file mode 100644 index 00000000000..04a9be27067 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kp.json @@ -0,0 +1,17 @@ +{ + "code": "KP", + "name": "North Korea", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kp" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kr.json new file mode 100644 index 00000000000..fced90641d6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kr.json @@ -0,0 +1,17 @@ +{ + "code": "KR", + "name": "South Korea", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kw.json new file mode 100644 index 00000000000..4dc33e04fca --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kw.json @@ -0,0 +1,17 @@ +{ + "code": "KW", + "name": "Kuwait", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ky.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ky.json new file mode 100644 index 00000000000..56d54806f7e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ky.json @@ -0,0 +1,17 @@ +{ + "code": "KY", + "name": "Cayman Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ky" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/kz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/kz.json new file mode 100644 index 00000000000..4c468324902 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/kz.json @@ -0,0 +1,17 @@ +{ + "code": "KZ", + "name": "Kazakhstan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/kz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/la.json b/plugins/woocommerce/tests/api-core-tests/data/countries/la.json new file mode 100644 index 00000000000..e6e66e0058a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/la.json @@ -0,0 +1,90 @@ +{ + "code": "LA", + "name": "Laos", + "states": [ + { + "code": "AT", + "name": "Attapeu" + }, + { + "code": "BK", + "name": "Bokeo" + }, + { + "code": "BL", + "name": "Bolikhamsai" + }, + { + "code": "CH", + "name": "Champasak" + }, + { + "code": "HO", + "name": "Houaphanh" + }, + { + "code": "KH", + "name": "Khammouane" + }, + { + "code": "LM", + "name": "Luang Namtha" + }, + { + "code": "LP", + "name": "Luang Prabang" + }, + { + "code": "OU", + "name": "Oudomxay" + }, + { + "code": "PH", + "name": "Phongsaly" + }, + { + "code": "SL", + "name": "Salavan" + }, + { + "code": "SV", + "name": "Savannakhet" + }, + { + "code": "VI", + "name": "Vientiane Province" + }, + { + "code": "VT", + "name": "Vientiane" + }, + { + "code": "XA", + "name": "Sainyabuli" + }, + { + "code": "XE", + "name": "Sekong" + }, + { + "code": "XI", + "name": "Xiangkhouang" + }, + { + "code": "XS", + "name": "Xaisomboun" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/la" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lb.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lb.json new file mode 100644 index 00000000000..94f78e65ae2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lb.json @@ -0,0 +1,17 @@ +{ + "code": "LB", + "name": "Lebanon", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lb" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lc.json new file mode 100644 index 00000000000..b690fcdcac5 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lc.json @@ -0,0 +1,17 @@ +{ + "code": "LC", + "name": "Saint Lucia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/li.json b/plugins/woocommerce/tests/api-core-tests/data/countries/li.json new file mode 100644 index 00000000000..be3d4f806a4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/li.json @@ -0,0 +1,17 @@ +{ + "code": "LI", + "name": "Liechtenstein", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/li" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lk.json new file mode 100644 index 00000000000..b3aed2ea5fd --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lk.json @@ -0,0 +1,17 @@ +{ + "code": "LK", + "name": "Sri Lanka", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lr.json new file mode 100644 index 00000000000..9f1fedba59c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lr.json @@ -0,0 +1,78 @@ +{ + "code": "LR", + "name": "Liberia", + "states": [ + { + "code": "BM", + "name": "Bomi" + }, + { + "code": "BN", + "name": "Bong" + }, + { + "code": "GA", + "name": "Gbarpolu" + }, + { + "code": "GB", + "name": "Grand Bassa" + }, + { + "code": "GC", + "name": "Grand Cape Mount" + }, + { + "code": "GG", + "name": "Grand Gedeh" + }, + { + "code": "GK", + "name": "Grand Kru" + }, + { + "code": "LO", + "name": "Lofa" + }, + { + "code": "MA", + "name": "Margibi" + }, + { + "code": "MY", + "name": "Maryland" + }, + { + "code": "MO", + "name": "Montserrado" + }, + { + "code": "NM", + "name": "Nimba" + }, + { + "code": "RV", + "name": "Rivercess" + }, + { + "code": "RG", + "name": "River Gee" + }, + { + "code": "SN", + "name": "Sinoe" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ls.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ls.json new file mode 100644 index 00000000000..02b69e575bb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ls.json @@ -0,0 +1,17 @@ +{ + "code": "LS", + "name": "Lesotho", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ls" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lt.json new file mode 100644 index 00000000000..93d9d8f1d6a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lt.json @@ -0,0 +1,17 @@ +{ + "code": "LT", + "name": "Lithuania", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lu.json new file mode 100644 index 00000000000..b028861adcd --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lu.json @@ -0,0 +1,17 @@ +{ + "code": "LU", + "name": "Luxembourg", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/lv.json b/plugins/woocommerce/tests/api-core-tests/data/countries/lv.json new file mode 100644 index 00000000000..bd5fe7c56e0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/lv.json @@ -0,0 +1,17 @@ +{ + "code": "LV", + "name": "Latvia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/lv" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ly.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ly.json new file mode 100644 index 00000000000..e4b3fcf2445 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ly.json @@ -0,0 +1,17 @@ +{ + "code": "LY", + "name": "Libya", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ly" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ma.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ma.json new file mode 100644 index 00000000000..cbac222e2a3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ma.json @@ -0,0 +1,17 @@ +{ + "code": "MA", + "name": "Morocco", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ma" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mc.json new file mode 100644 index 00000000000..97d77cc5042 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mc.json @@ -0,0 +1,17 @@ +{ + "code": "MC", + "name": "Monaco", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/md.json b/plugins/woocommerce/tests/api-core-tests/data/countries/md.json new file mode 100644 index 00000000000..a2b29f049c8 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/md.json @@ -0,0 +1,158 @@ +{ + "code": "MD", + "name": "Moldova", + "states": [ + { + "code": "C", + "name": "Chișinău" + }, + { + "code": "BL", + "name": "Bălți" + }, + { + "code": "AN", + "name": "Anenii Noi" + }, + { + "code": "BS", + "name": "Basarabeasca" + }, + { + "code": "BR", + "name": "Briceni" + }, + { + "code": "CH", + "name": "Cahul" + }, + { + "code": "CT", + "name": "Cantemir" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Căușeni" + }, + { + "code": "CM", + "name": "Cimișlia" + }, + { + "code": "CR", + "name": "Criuleni" + }, + { + "code": "DN", + "name": "Dondușeni" + }, + { + "code": "DR", + "name": "Drochia" + }, + { + "code": "DB", + "name": "Dubăsari" + }, + { + "code": "ED", + "name": "Edineț" + }, + { + "code": "FL", + "name": "Fălești" + }, + { + "code": "FR", + "name": "Florești" + }, + { + "code": "GE", + "name": "UTA Găgăuzia" + }, + { + "code": "GL", + "name": "Glodeni" + }, + { + "code": "HN", + "name": "Hîncești" + }, + { + "code": "IL", + "name": "Ialoveni" + }, + { + "code": "LV", + "name": "Leova" + }, + { + "code": "NS", + "name": "Nisporeni" + }, + { + "code": "OC", + "name": "Ocnița" + }, + { + "code": "OR", + "name": "Orhei" + }, + { + "code": "RZ", + "name": "Rezina" + }, + { + "code": "RS", + "name": "Rîșcani" + }, + { + "code": "SG", + "name": "Sîngerei" + }, + { + "code": "SR", + "name": "Soroca" + }, + { + "code": "ST", + "name": "Strășeni" + }, + { + "code": "SD", + "name": "Șoldănești" + }, + { + "code": "SV", + "name": "Ștefan Vodă" + }, + { + "code": "TR", + "name": "Taraclia" + }, + { + "code": "TL", + "name": "Telenești" + }, + { + "code": "UN", + "name": "Ungheni" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/md" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/me.json b/plugins/woocommerce/tests/api-core-tests/data/countries/me.json new file mode 100644 index 00000000000..cf4a9f1500c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/me.json @@ -0,0 +1,17 @@ +{ + "code": "ME", + "name": "Montenegro", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/me" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mf.json new file mode 100644 index 00000000000..c76dac618a4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mf.json @@ -0,0 +1,17 @@ +{ + "code": "MF", + "name": "Saint Martin (French part)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mg.json new file mode 100644 index 00000000000..ca091dc4c48 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mg.json @@ -0,0 +1,17 @@ +{ + "code": "MG", + "name": "Madagascar", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mh.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mh.json new file mode 100644 index 00000000000..5c994d4d310 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mh.json @@ -0,0 +1,17 @@ +{ + "code": "MH", + "name": "Marshall Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mh" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mk.json new file mode 100644 index 00000000000..ada25262efa --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mk.json @@ -0,0 +1,17 @@ +{ + "code": "MK", + "name": "North Macedonia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ml.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ml.json new file mode 100644 index 00000000000..b04bd51eea6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ml.json @@ -0,0 +1,17 @@ +{ + "code": "ML", + "name": "Mali", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ml" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mm.json new file mode 100644 index 00000000000..1fcf5ab470f --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mm.json @@ -0,0 +1,17 @@ +{ + "code": "MM", + "name": "Myanmar", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mn.json new file mode 100644 index 00000000000..d404be8418a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mn.json @@ -0,0 +1,17 @@ +{ + "code": "MN", + "name": "Mongolia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mo.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mo.json new file mode 100644 index 00000000000..047638fd812 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mo.json @@ -0,0 +1,17 @@ +{ + "code": "MO", + "name": "Macao", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mo" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mp.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mp.json new file mode 100644 index 00000000000..3c076ec73c3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mp.json @@ -0,0 +1,17 @@ +{ + "code": "MP", + "name": "Northern Mariana Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mp" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mq.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mq.json new file mode 100644 index 00000000000..80f36e2ee3e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mq.json @@ -0,0 +1,17 @@ +{ + "code": "MQ", + "name": "Martinique", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mq" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mr.json new file mode 100644 index 00000000000..beb06120d9f --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mr.json @@ -0,0 +1,17 @@ +{ + "code": "MR", + "name": "Mauritania", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ms.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ms.json new file mode 100644 index 00000000000..124ed2ed175 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ms.json @@ -0,0 +1,17 @@ +{ + "code": "MS", + "name": "Montserrat", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ms" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mt.json new file mode 100644 index 00000000000..8a04a4a80bb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mt.json @@ -0,0 +1,17 @@ +{ + "code": "MT", + "name": "Malta", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mu.json new file mode 100644 index 00000000000..a67adbb13cf --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mu.json @@ -0,0 +1,17 @@ +{ + "code": "MU", + "name": "Mauritius", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mv.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mv.json new file mode 100644 index 00000000000..bc429dc1854 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mv.json @@ -0,0 +1,17 @@ +{ + "code": "MV", + "name": "Maldives", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mv" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mw.json new file mode 100644 index 00000000000..27c03340cc8 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mw.json @@ -0,0 +1,17 @@ +{ + "code": "MW", + "name": "Malawi", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mx.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mx.json new file mode 100644 index 00000000000..9555979a732 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mx.json @@ -0,0 +1,146 @@ +{ + "code": "MX", + "name": "Mexico", + "states": [ + { + "code": "DF", + "name": "Ciudad de México" + }, + { + "code": "JA", + "name": "Jalisco" + }, + { + "code": "NL", + "name": "Nuevo León" + }, + { + "code": "AG", + "name": "Aguascalientes" + }, + { + "code": "BC", + "name": "Baja California" + }, + { + "code": "BS", + "name": "Baja California Sur" + }, + { + "code": "CM", + "name": "Campeche" + }, + { + "code": "CS", + "name": "Chiapas" + }, + { + "code": "CH", + "name": "Chihuahua" + }, + { + "code": "CO", + "name": "Coahuila" + }, + { + "code": "CL", + "name": "Colima" + }, + { + "code": "DG", + "name": "Durango" + }, + { + "code": "GT", + "name": "Guanajuato" + }, + { + "code": "GR", + "name": "Guerrero" + }, + { + "code": "HG", + "name": "Hidalgo" + }, + { + "code": "MX", + "name": "Estado de México" + }, + { + "code": "MI", + "name": "Michoacán" + }, + { + "code": "MO", + "name": "Morelos" + }, + { + "code": "NA", + "name": "Nayarit" + }, + { + "code": "OA", + "name": "Oaxaca" + }, + { + "code": "PU", + "name": "Puebla" + }, + { + "code": "QT", + "name": "Querétaro" + }, + { + "code": "QR", + "name": "Quintana Roo" + }, + { + "code": "SL", + "name": "San Luis Potosí" + }, + { + "code": "SI", + "name": "Sinaloa" + }, + { + "code": "SO", + "name": "Sonora" + }, + { + "code": "TB", + "name": "Tabasco" + }, + { + "code": "TM", + "name": "Tamaulipas" + }, + { + "code": "TL", + "name": "Tlaxcala" + }, + { + "code": "VE", + "name": "Veracruz" + }, + { + "code": "YU", + "name": "Yucatán" + }, + { + "code": "ZA", + "name": "Zacatecas" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mx" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/my.json b/plugins/woocommerce/tests/api-core-tests/data/countries/my.json new file mode 100644 index 00000000000..06e3b5768cf --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/my.json @@ -0,0 +1,82 @@ +{ + "code": "MY", + "name": "Malaysia", + "states": [ + { + "code": "JHR", + "name": "Johor" + }, + { + "code": "KDH", + "name": "Kedah" + }, + { + "code": "KTN", + "name": "Kelantan" + }, + { + "code": "LBN", + "name": "Labuan" + }, + { + "code": "MLK", + "name": "Malacca (Melaka)" + }, + { + "code": "NSN", + "name": "Negeri Sembilan" + }, + { + "code": "PHG", + "name": "Pahang" + }, + { + "code": "PNG", + "name": "Penang (Pulau Pinang)" + }, + { + "code": "PRK", + "name": "Perak" + }, + { + "code": "PLS", + "name": "Perlis" + }, + { + "code": "SBH", + "name": "Sabah" + }, + { + "code": "SWK", + "name": "Sarawak" + }, + { + "code": "SGR", + "name": "Selangor" + }, + { + "code": "TRG", + "name": "Terengganu" + }, + { + "code": "PJY", + "name": "Putrajaya" + }, + { + "code": "KUL", + "name": "Kuala Lumpur" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/my" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/mz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/mz.json new file mode 100644 index 00000000000..f34427575d1 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/mz.json @@ -0,0 +1,62 @@ +{ + "code": "MZ", + "name": "Mozambique", + "states": [ + { + "code": "MZP", + "name": "Cabo Delgado" + }, + { + "code": "MZG", + "name": "Gaza" + }, + { + "code": "MZI", + "name": "Inhambane" + }, + { + "code": "MZB", + "name": "Manica" + }, + { + "code": "MZL", + "name": "Maputo Province" + }, + { + "code": "MZMPM", + "name": "Maputo" + }, + { + "code": "MZN", + "name": "Nampula" + }, + { + "code": "MZA", + "name": "Niassa" + }, + { + "code": "MZS", + "name": "Sofala" + }, + { + "code": "MZT", + "name": "Tete" + }, + { + "code": "MZQ", + "name": "Zambézia" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/mz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/na.json b/plugins/woocommerce/tests/api-core-tests/data/countries/na.json new file mode 100644 index 00000000000..9fe217c28d7 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/na.json @@ -0,0 +1,74 @@ +{ + "code": "NA", + "name": "Namibia", + "states": [ + { + "code": "ER", + "name": "Erongo" + }, + { + "code": "HA", + "name": "Hardap" + }, + { + "code": "KA", + "name": "Karas" + }, + { + "code": "KE", + "name": "Kavango East" + }, + { + "code": "KW", + "name": "Kavango West" + }, + { + "code": "KH", + "name": "Khomas" + }, + { + "code": "KU", + "name": "Kunene" + }, + { + "code": "OW", + "name": "Ohangwena" + }, + { + "code": "OH", + "name": "Omaheke" + }, + { + "code": "OS", + "name": "Omusati" + }, + { + "code": "ON", + "name": "Oshana" + }, + { + "code": "OT", + "name": "Oshikoto" + }, + { + "code": "OD", + "name": "Otjozondjupa" + }, + { + "code": "CA", + "name": "Zambezi" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/na" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/nc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/nc.json new file mode 100644 index 00000000000..13b7f4bc3aa --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/nc.json @@ -0,0 +1,17 @@ +{ + "code": "NC", + "name": "New Caledonia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/nc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ne.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ne.json new file mode 100644 index 00000000000..9893a2586ec --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ne.json @@ -0,0 +1,17 @@ +{ + "code": "NE", + "name": "Niger", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ne" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/nf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/nf.json new file mode 100644 index 00000000000..a2723aae9eb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/nf.json @@ -0,0 +1,17 @@ +{ + "code": "NF", + "name": "Norfolk Island", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/nf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ng.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ng.json new file mode 100644 index 00000000000..f0333612c27 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ng.json @@ -0,0 +1,166 @@ +{ + "code": "NG", + "name": "Nigeria", + "states": [ + { + "code": "AB", + "name": "Abia" + }, + { + "code": "FC", + "name": "Abuja" + }, + { + "code": "AD", + "name": "Adamawa" + }, + { + "code": "AK", + "name": "Akwa Ibom" + }, + { + "code": "AN", + "name": "Anambra" + }, + { + "code": "BA", + "name": "Bauchi" + }, + { + "code": "BY", + "name": "Bayelsa" + }, + { + "code": "BE", + "name": "Benue" + }, + { + "code": "BO", + "name": "Borno" + }, + { + "code": "CR", + "name": "Cross River" + }, + { + "code": "DE", + "name": "Delta" + }, + { + "code": "EB", + "name": "Ebonyi" + }, + { + "code": "ED", + "name": "Edo" + }, + { + "code": "EK", + "name": "Ekiti" + }, + { + "code": "EN", + "name": "Enugu" + }, + { + "code": "GO", + "name": "Gombe" + }, + { + "code": "IM", + "name": "Imo" + }, + { + "code": "JI", + "name": "Jigawa" + }, + { + "code": "KD", + "name": "Kaduna" + }, + { + "code": "KN", + "name": "Kano" + }, + { + "code": "KT", + "name": "Katsina" + }, + { + "code": "KE", + "name": "Kebbi" + }, + { + "code": "KO", + "name": "Kogi" + }, + { + "code": "KW", + "name": "Kwara" + }, + { + "code": "LA", + "name": "Lagos" + }, + { + "code": "NA", + "name": "Nasarawa" + }, + { + "code": "NI", + "name": "Niger" + }, + { + "code": "OG", + "name": "Ogun" + }, + { + "code": "ON", + "name": "Ondo" + }, + { + "code": "OS", + "name": "Osun" + }, + { + "code": "OY", + "name": "Oyo" + }, + { + "code": "PL", + "name": "Plateau" + }, + { + "code": "RI", + "name": "Rivers" + }, + { + "code": "SO", + "name": "Sokoto" + }, + { + "code": "TA", + "name": "Taraba" + }, + { + "code": "YO", + "name": "Yobe" + }, + { + "code": "ZA", + "name": "Zamfara" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ng" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ni.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ni.json new file mode 100644 index 00000000000..db9bdfd2fbd --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ni.json @@ -0,0 +1,86 @@ +{ + "code": "NI", + "name": "Nicaragua", + "states": [ + { + "code": "NI-AN", + "name": "Atlántico Norte" + }, + { + "code": "NI-AS", + "name": "Atlántico Sur" + }, + { + "code": "NI-BO", + "name": "Boaco" + }, + { + "code": "NI-CA", + "name": "Carazo" + }, + { + "code": "NI-CI", + "name": "Chinandega" + }, + { + "code": "NI-CO", + "name": "Chontales" + }, + { + "code": "NI-ES", + "name": "Estelí" + }, + { + "code": "NI-GR", + "name": "Granada" + }, + { + "code": "NI-JI", + "name": "Jinotega" + }, + { + "code": "NI-LE", + "name": "León" + }, + { + "code": "NI-MD", + "name": "Madriz" + }, + { + "code": "NI-MN", + "name": "Managua" + }, + { + "code": "NI-MS", + "name": "Masaya" + }, + { + "code": "NI-MT", + "name": "Matagalpa" + }, + { + "code": "NI-NS", + "name": "Nueva Segovia" + }, + { + "code": "NI-RI", + "name": "Rivas" + }, + { + "code": "NI-SJ", + "name": "Río San Juan" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ni" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/nl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/nl.json new file mode 100644 index 00000000000..ac1bf367fd0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/nl.json @@ -0,0 +1,17 @@ +{ + "code": "NL", + "name": "Netherlands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/nl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/no.json b/plugins/woocommerce/tests/api-core-tests/data/countries/no.json new file mode 100644 index 00000000000..e0efbfdd204 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/no.json @@ -0,0 +1,17 @@ +{ + "code": "NO", + "name": "Norway", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/no" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/np.json b/plugins/woocommerce/tests/api-core-tests/data/countries/np.json new file mode 100644 index 00000000000..30a142e6acc --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/np.json @@ -0,0 +1,74 @@ +{ + "code": "NP", + "name": "Nepal", + "states": [ + { + "code": "BAG", + "name": "Bagmati" + }, + { + "code": "BHE", + "name": "Bheri" + }, + { + "code": "DHA", + "name": "Dhaulagiri" + }, + { + "code": "GAN", + "name": "Gandaki" + }, + { + "code": "JAN", + "name": "Janakpur" + }, + { + "code": "KAR", + "name": "Karnali" + }, + { + "code": "KOS", + "name": "Koshi" + }, + { + "code": "LUM", + "name": "Lumbini" + }, + { + "code": "MAH", + "name": "Mahakali" + }, + { + "code": "MEC", + "name": "Mechi" + }, + { + "code": "NAR", + "name": "Narayani" + }, + { + "code": "RAP", + "name": "Rapti" + }, + { + "code": "SAG", + "name": "Sagarmatha" + }, + { + "code": "SET", + "name": "Seti" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/np" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/nr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/nr.json new file mode 100644 index 00000000000..b52980cbda3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/nr.json @@ -0,0 +1,17 @@ +{ + "code": "NR", + "name": "Nauru", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/nr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/nu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/nu.json new file mode 100644 index 00000000000..3faf0d410af --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/nu.json @@ -0,0 +1,17 @@ +{ + "code": "NU", + "name": "Niue", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/nu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/nz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/nz.json new file mode 100644 index 00000000000..f5899ddca54 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/nz.json @@ -0,0 +1,82 @@ +{ + "code": "NZ", + "name": "New Zealand", + "states": [ + { + "code": "NTL", + "name": "Northland" + }, + { + "code": "AUK", + "name": "Auckland" + }, + { + "code": "WKO", + "name": "Waikato" + }, + { + "code": "BOP", + "name": "Bay of Plenty" + }, + { + "code": "TKI", + "name": "Taranaki" + }, + { + "code": "GIS", + "name": "Gisborne" + }, + { + "code": "HKB", + "name": "Hawke’s Bay" + }, + { + "code": "MWT", + "name": "Manawatu-Wanganui" + }, + { + "code": "WGN", + "name": "Wellington" + }, + { + "code": "NSN", + "name": "Nelson" + }, + { + "code": "MBH", + "name": "Marlborough" + }, + { + "code": "TAS", + "name": "Tasman" + }, + { + "code": "WTC", + "name": "West Coast" + }, + { + "code": "CAN", + "name": "Canterbury" + }, + { + "code": "OTA", + "name": "Otago" + }, + { + "code": "STL", + "name": "Southland" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/nz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/om.json b/plugins/woocommerce/tests/api-core-tests/data/countries/om.json new file mode 100644 index 00000000000..03431fbb29b --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/om.json @@ -0,0 +1,17 @@ +{ + "code": "OM", + "name": "Oman", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/om" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pa.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pa.json new file mode 100644 index 00000000000..b34e02bbed6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pa.json @@ -0,0 +1,70 @@ +{ + "code": "PA", + "name": "Panama", + "states": [ + { + "code": "PA-1", + "name": "Bocas del Toro" + }, + { + "code": "PA-2", + "name": "Coclé" + }, + { + "code": "PA-3", + "name": "Colón" + }, + { + "code": "PA-4", + "name": "Chiriquí" + }, + { + "code": "PA-5", + "name": "Darién" + }, + { + "code": "PA-6", + "name": "Herrera" + }, + { + "code": "PA-7", + "name": "Los Santos" + }, + { + "code": "PA-8", + "name": "Panamá" + }, + { + "code": "PA-9", + "name": "Veraguas" + }, + { + "code": "PA-10", + "name": "West Panamá" + }, + { + "code": "PA-EM", + "name": "Emberá" + }, + { + "code": "PA-KY", + "name": "Guna Yala" + }, + { + "code": "PA-NB", + "name": "Ngöbe-Buglé" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pa" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pe.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pe.json new file mode 100644 index 00000000000..8a0e89a8b8d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pe.json @@ -0,0 +1,122 @@ +{ + "code": "PE", + "name": "Peru", + "states": [ + { + "code": "CAL", + "name": "El Callao" + }, + { + "code": "LMA", + "name": "Municipalidad Metropolitana de Lima" + }, + { + "code": "AMA", + "name": "Amazonas" + }, + { + "code": "ANC", + "name": "Ancash" + }, + { + "code": "APU", + "name": "Apurímac" + }, + { + "code": "ARE", + "name": "Arequipa" + }, + { + "code": "AYA", + "name": "Ayacucho" + }, + { + "code": "CAJ", + "name": "Cajamarca" + }, + { + "code": "CUS", + "name": "Cusco" + }, + { + "code": "HUV", + "name": "Huancavelica" + }, + { + "code": "HUC", + "name": "Huánuco" + }, + { + "code": "ICA", + "name": "Ica" + }, + { + "code": "JUN", + "name": "Junín" + }, + { + "code": "LAL", + "name": "La Libertad" + }, + { + "code": "LAM", + "name": "Lambayeque" + }, + { + "code": "LIM", + "name": "Lima" + }, + { + "code": "LOR", + "name": "Loreto" + }, + { + "code": "MDD", + "name": "Madre de Dios" + }, + { + "code": "MOQ", + "name": "Moquegua" + }, + { + "code": "PAS", + "name": "Pasco" + }, + { + "code": "PIU", + "name": "Piura" + }, + { + "code": "PUN", + "name": "Puno" + }, + { + "code": "SAM", + "name": "San Martín" + }, + { + "code": "TAC", + "name": "Tacna" + }, + { + "code": "TUM", + "name": "Tumbes" + }, + { + "code": "UCA", + "name": "Ucayali" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pe" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pf.json new file mode 100644 index 00000000000..1e648c1e9f3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pf.json @@ -0,0 +1,17 @@ +{ + "code": "PF", + "name": "French Polynesia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pg.json new file mode 100644 index 00000000000..dad04dd5202 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pg.json @@ -0,0 +1,17 @@ +{ + "code": "PG", + "name": "Papua New Guinea", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ph.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ph.json new file mode 100644 index 00000000000..94e9b419d30 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ph.json @@ -0,0 +1,346 @@ +{ + "code": "PH", + "name": "Philippines", + "states": [ + { + "code": "ABR", + "name": "Abra" + }, + { + "code": "AGN", + "name": "Agusan del Norte" + }, + { + "code": "AGS", + "name": "Agusan del Sur" + }, + { + "code": "AKL", + "name": "Aklan" + }, + { + "code": "ALB", + "name": "Albay" + }, + { + "code": "ANT", + "name": "Antique" + }, + { + "code": "APA", + "name": "Apayao" + }, + { + "code": "AUR", + "name": "Aurora" + }, + { + "code": "BAS", + "name": "Basilan" + }, + { + "code": "BAN", + "name": "Bataan" + }, + { + "code": "BTN", + "name": "Batanes" + }, + { + "code": "BTG", + "name": "Batangas" + }, + { + "code": "BEN", + "name": "Benguet" + }, + { + "code": "BIL", + "name": "Biliran" + }, + { + "code": "BOH", + "name": "Bohol" + }, + { + "code": "BUK", + "name": "Bukidnon" + }, + { + "code": "BUL", + "name": "Bulacan" + }, + { + "code": "CAG", + "name": "Cagayan" + }, + { + "code": "CAN", + "name": "Camarines Norte" + }, + { + "code": "CAS", + "name": "Camarines Sur" + }, + { + "code": "CAM", + "name": "Camiguin" + }, + { + "code": "CAP", + "name": "Capiz" + }, + { + "code": "CAT", + "name": "Catanduanes" + }, + { + "code": "CAV", + "name": "Cavite" + }, + { + "code": "CEB", + "name": "Cebu" + }, + { + "code": "COM", + "name": "Compostela Valley" + }, + { + "code": "NCO", + "name": "Cotabato" + }, + { + "code": "DAV", + "name": "Davao del Norte" + }, + { + "code": "DAS", + "name": "Davao del Sur" + }, + { + "code": "DAC", + "name": "Davao Occidental" + }, + { + "code": "DAO", + "name": "Davao Oriental" + }, + { + "code": "DIN", + "name": "Dinagat Islands" + }, + { + "code": "EAS", + "name": "Eastern Samar" + }, + { + "code": "GUI", + "name": "Guimaras" + }, + { + "code": "IFU", + "name": "Ifugao" + }, + { + "code": "ILN", + "name": "Ilocos Norte" + }, + { + "code": "ILS", + "name": "Ilocos Sur" + }, + { + "code": "ILI", + "name": "Iloilo" + }, + { + "code": "ISA", + "name": "Isabela" + }, + { + "code": "KAL", + "name": "Kalinga" + }, + { + "code": "LUN", + "name": "La Union" + }, + { + "code": "LAG", + "name": "Laguna" + }, + { + "code": "LAN", + "name": "Lanao del Norte" + }, + { + "code": "LAS", + "name": "Lanao del Sur" + }, + { + "code": "LEY", + "name": "Leyte" + }, + { + "code": "MAG", + "name": "Maguindanao" + }, + { + "code": "MAD", + "name": "Marinduque" + }, + { + "code": "MAS", + "name": "Masbate" + }, + { + "code": "MSC", + "name": "Misamis Occidental" + }, + { + "code": "MSR", + "name": "Misamis Oriental" + }, + { + "code": "MOU", + "name": "Mountain Province" + }, + { + "code": "NEC", + "name": "Negros Occidental" + }, + { + "code": "NER", + "name": "Negros Oriental" + }, + { + "code": "NSA", + "name": "Northern Samar" + }, + { + "code": "NUE", + "name": "Nueva Ecija" + }, + { + "code": "NUV", + "name": "Nueva Vizcaya" + }, + { + "code": "MDC", + "name": "Occidental Mindoro" + }, + { + "code": "MDR", + "name": "Oriental Mindoro" + }, + { + "code": "PLW", + "name": "Palawan" + }, + { + "code": "PAM", + "name": "Pampanga" + }, + { + "code": "PAN", + "name": "Pangasinan" + }, + { + "code": "QUE", + "name": "Quezon" + }, + { + "code": "QUI", + "name": "Quirino" + }, + { + "code": "RIZ", + "name": "Rizal" + }, + { + "code": "ROM", + "name": "Romblon" + }, + { + "code": "WSA", + "name": "Samar" + }, + { + "code": "SAR", + "name": "Sarangani" + }, + { + "code": "SIQ", + "name": "Siquijor" + }, + { + "code": "SOR", + "name": "Sorsogon" + }, + { + "code": "SCO", + "name": "South Cotabato" + }, + { + "code": "SLE", + "name": "Southern Leyte" + }, + { + "code": "SUK", + "name": "Sultan Kudarat" + }, + { + "code": "SLU", + "name": "Sulu" + }, + { + "code": "SUN", + "name": "Surigao del Norte" + }, + { + "code": "SUR", + "name": "Surigao del Sur" + }, + { + "code": "TAR", + "name": "Tarlac" + }, + { + "code": "TAW", + "name": "Tawi-Tawi" + }, + { + "code": "ZMB", + "name": "Zambales" + }, + { + "code": "ZAN", + "name": "Zamboanga del Norte" + }, + { + "code": "ZAS", + "name": "Zamboanga del Sur" + }, + { + "code": "ZSI", + "name": "Zamboanga Sibugay" + }, + { + "code": "00", + "name": "Metro Manila" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ph" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pk.json new file mode 100644 index 00000000000..be2aada71ba --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pk.json @@ -0,0 +1,50 @@ +{ + "code": "PK", + "name": "Pakistan", + "states": [ + { + "code": "JK", + "name": "Azad Kashmir" + }, + { + "code": "BA", + "name": "Balochistan" + }, + { + "code": "TA", + "name": "FATA" + }, + { + "code": "GB", + "name": "Gilgit Baltistan" + }, + { + "code": "IS", + "name": "Islamabad Capital Territory" + }, + { + "code": "KP", + "name": "Khyber Pakhtunkhwa" + }, + { + "code": "PB", + "name": "Punjab" + }, + { + "code": "SD", + "name": "Sindh" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pl.json new file mode 100644 index 00000000000..217df9456a0 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pl.json @@ -0,0 +1,17 @@ +{ + "code": "PL", + "name": "Poland", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pm.json new file mode 100644 index 00000000000..bf3e27287eb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pm.json @@ -0,0 +1,17 @@ +{ + "code": "PM", + "name": "Saint Pierre and Miquelon", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pn.json new file mode 100644 index 00000000000..47762d28b83 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pn.json @@ -0,0 +1,17 @@ +{ + "code": "PN", + "name": "Pitcairn", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pr.json new file mode 100644 index 00000000000..42e477da6fb --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pr.json @@ -0,0 +1,17 @@ +{ + "code": "PR", + "name": "Puerto Rico", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ps.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ps.json new file mode 100644 index 00000000000..99f09bfbd0c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ps.json @@ -0,0 +1,17 @@ +{ + "code": "PS", + "name": "Palestinian Territory", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ps" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pt.json new file mode 100644 index 00000000000..e2f886eda71 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pt.json @@ -0,0 +1,17 @@ +{ + "code": "PT", + "name": "Portugal", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/pw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/pw.json new file mode 100644 index 00000000000..f1709202a6a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/pw.json @@ -0,0 +1,17 @@ +{ + "code": "PW", + "name": "Belau", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/pw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/py.json b/plugins/woocommerce/tests/api-core-tests/data/countries/py.json new file mode 100644 index 00000000000..30bc5b9b19b --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/py.json @@ -0,0 +1,90 @@ +{ + "code": "PY", + "name": "Paraguay", + "states": [ + { + "code": "PY-ASU", + "name": "Asunción" + }, + { + "code": "PY-1", + "name": "Concepción" + }, + { + "code": "PY-2", + "name": "San Pedro" + }, + { + "code": "PY-3", + "name": "Cordillera" + }, + { + "code": "PY-4", + "name": "Guairá" + }, + { + "code": "PY-5", + "name": "Caaguazú" + }, + { + "code": "PY-6", + "name": "Caazapá" + }, + { + "code": "PY-7", + "name": "Itapúa" + }, + { + "code": "PY-8", + "name": "Misiones" + }, + { + "code": "PY-9", + "name": "Paraguarí" + }, + { + "code": "PY-10", + "name": "Alto Paraná" + }, + { + "code": "PY-11", + "name": "Central" + }, + { + "code": "PY-12", + "name": "Ñeembucú" + }, + { + "code": "PY-13", + "name": "Amambay" + }, + { + "code": "PY-14", + "name": "Canindeyú" + }, + { + "code": "PY-15", + "name": "Presidente Hayes" + }, + { + "code": "PY-16", + "name": "Alto Paraguay" + }, + { + "code": "PY-17", + "name": "Boquerón" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/py" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/qa.json b/plugins/woocommerce/tests/api-core-tests/data/countries/qa.json new file mode 100644 index 00000000000..b228ac93329 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/qa.json @@ -0,0 +1,17 @@ +{ + "code": "QA", + "name": "Qatar", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/qa" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/re.json b/plugins/woocommerce/tests/api-core-tests/data/countries/re.json new file mode 100644 index 00000000000..b903eb73b03 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/re.json @@ -0,0 +1,17 @@ +{ + "code": "RE", + "name": "Reunion", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/re" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ro.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ro.json new file mode 100644 index 00000000000..1dcc4cc7114 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ro.json @@ -0,0 +1,186 @@ +{ + "code": "RO", + "name": "Romania", + "states": [ + { + "code": "AB", + "name": "Alba" + }, + { + "code": "AR", + "name": "Arad" + }, + { + "code": "AG", + "name": "Argeș" + }, + { + "code": "BC", + "name": "Bacău" + }, + { + "code": "BH", + "name": "Bihor" + }, + { + "code": "BN", + "name": "Bistrița-Năsăud" + }, + { + "code": "BT", + "name": "Botoșani" + }, + { + "code": "BR", + "name": "Brăila" + }, + { + "code": "BV", + "name": "Brașov" + }, + { + "code": "B", + "name": "București" + }, + { + "code": "BZ", + "name": "Buzău" + }, + { + "code": "CL", + "name": "Călărași" + }, + { + "code": "CS", + "name": "Caraș-Severin" + }, + { + "code": "CJ", + "name": "Cluj" + }, + { + "code": "CT", + "name": "Constanța" + }, + { + "code": "CV", + "name": "Covasna" + }, + { + "code": "DB", + "name": "Dâmbovița" + }, + { + "code": "DJ", + "name": "Dolj" + }, + { + "code": "GL", + "name": "Galați" + }, + { + "code": "GR", + "name": "Giurgiu" + }, + { + "code": "GJ", + "name": "Gorj" + }, + { + "code": "HR", + "name": "Harghita" + }, + { + "code": "HD", + "name": "Hunedoara" + }, + { + "code": "IL", + "name": "Ialomița" + }, + { + "code": "IS", + "name": "Iași" + }, + { + "code": "IF", + "name": "Ilfov" + }, + { + "code": "MM", + "name": "Maramureș" + }, + { + "code": "MH", + "name": "Mehedinți" + }, + { + "code": "MS", + "name": "Mureș" + }, + { + "code": "NT", + "name": "Neamț" + }, + { + "code": "OT", + "name": "Olt" + }, + { + "code": "PH", + "name": "Prahova" + }, + { + "code": "SJ", + "name": "Sălaj" + }, + { + "code": "SM", + "name": "Satu Mare" + }, + { + "code": "SB", + "name": "Sibiu" + }, + { + "code": "SV", + "name": "Suceava" + }, + { + "code": "TR", + "name": "Teleorman" + }, + { + "code": "TM", + "name": "Timiș" + }, + { + "code": "TL", + "name": "Tulcea" + }, + { + "code": "VL", + "name": "Vâlcea" + }, + { + "code": "VS", + "name": "Vaslui" + }, + { + "code": "VN", + "name": "Vrancea" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ro" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/rs.json b/plugins/woocommerce/tests/api-core-tests/data/countries/rs.json new file mode 100644 index 00000000000..d188b1f949c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/rs.json @@ -0,0 +1,146 @@ +{ + "code": "RS", + "name": "Serbia", + "states": [ + { + "code": "RS00", + "name": "Belgrade" + }, + { + "code": "RS14", + "name": "Bor" + }, + { + "code": "RS11", + "name": "Braničevo" + }, + { + "code": "RS02", + "name": "Central Banat" + }, + { + "code": "RS10", + "name": "Danube" + }, + { + "code": "RS23", + "name": "Jablanica" + }, + { + "code": "RS09", + "name": "Kolubara" + }, + { + "code": "RS08", + "name": "Mačva" + }, + { + "code": "RS17", + "name": "Morava" + }, + { + "code": "RS20", + "name": "Nišava" + }, + { + "code": "RS01", + "name": "North Bačka" + }, + { + "code": "RS03", + "name": "North Banat" + }, + { + "code": "RS24", + "name": "Pčinja" + }, + { + "code": "RS22", + "name": "Pirot" + }, + { + "code": "RS13", + "name": "Pomoravlje" + }, + { + "code": "RS19", + "name": "Rasina" + }, + { + "code": "RS18", + "name": "Raška" + }, + { + "code": "RS06", + "name": "South Bačka" + }, + { + "code": "RS04", + "name": "South Banat" + }, + { + "code": "RS07", + "name": "Srem" + }, + { + "code": "RS12", + "name": "Šumadija" + }, + { + "code": "RS21", + "name": "Toplica" + }, + { + "code": "RS05", + "name": "West Bačka" + }, + { + "code": "RS15", + "name": "Zaječar" + }, + { + "code": "RS16", + "name": "Zlatibor" + }, + { + "code": "RS25", + "name": "Kosovo" + }, + { + "code": "RS26", + "name": "Peć" + }, + { + "code": "RS27", + "name": "Prizren" + }, + { + "code": "RS28", + "name": "Kosovska Mitrovica" + }, + { + "code": "RS29", + "name": "Kosovo-Pomoravlje" + }, + { + "code": "RSKM", + "name": "Kosovo-Metohija" + }, + { + "code": "RSVO", + "name": "Vojvodina" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/rs" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ru.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ru.json new file mode 100644 index 00000000000..8c4e12e356a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ru.json @@ -0,0 +1,17 @@ +{ + "code": "RU", + "name": "Russia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ru" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/rw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/rw.json new file mode 100644 index 00000000000..fd0e84f955f --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/rw.json @@ -0,0 +1,17 @@ +{ + "code": "RW", + "name": "Rwanda", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/rw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sa.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sa.json new file mode 100644 index 00000000000..695091440e7 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sa.json @@ -0,0 +1,17 @@ +{ + "code": "SA", + "name": "Saudi Arabia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sa" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sb.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sb.json new file mode 100644 index 00000000000..71b9e155fae --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sb.json @@ -0,0 +1,17 @@ +{ + "code": "SB", + "name": "Solomon Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sb" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sc.json new file mode 100644 index 00000000000..f13479e7677 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sc.json @@ -0,0 +1,17 @@ +{ + "code": "SC", + "name": "Seychelles", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sd.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sd.json new file mode 100644 index 00000000000..21b2258d30e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sd.json @@ -0,0 +1,17 @@ +{ + "code": "SD", + "name": "Sudan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sd" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/se.json b/plugins/woocommerce/tests/api-core-tests/data/countries/se.json new file mode 100644 index 00000000000..d756f14a35c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/se.json @@ -0,0 +1,17 @@ +{ + "code": "SE", + "name": "Sweden", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/se" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sg.json new file mode 100644 index 00000000000..e95ca84ab8e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sg.json @@ -0,0 +1,17 @@ +{ + "code": "SG", + "name": "Singapore", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sh.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sh.json new file mode 100644 index 00000000000..efd843b0877 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sh.json @@ -0,0 +1,17 @@ +{ + "code": "SH", + "name": "Saint Helena", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sh" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/si.json b/plugins/woocommerce/tests/api-core-tests/data/countries/si.json new file mode 100644 index 00000000000..deee19bf3aa --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/si.json @@ -0,0 +1,17 @@ +{ + "code": "SI", + "name": "Slovenia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/si" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sj.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sj.json new file mode 100644 index 00000000000..7d0a19f8800 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sj.json @@ -0,0 +1,17 @@ +{ + "code": "SJ", + "name": "Svalbard and Jan Mayen", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sj" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sk.json new file mode 100644 index 00000000000..f904cd30380 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sk.json @@ -0,0 +1,17 @@ +{ + "code": "SK", + "name": "Slovakia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sl.json new file mode 100644 index 00000000000..5f1cba0b6f4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sl.json @@ -0,0 +1,17 @@ +{ + "code": "SL", + "name": "Sierra Leone", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sm.json new file mode 100644 index 00000000000..aed1ccd64e8 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sm.json @@ -0,0 +1,17 @@ +{ + "code": "SM", + "name": "San Marino", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sn.json new file mode 100644 index 00000000000..c5f6a9b6877 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sn.json @@ -0,0 +1,74 @@ +{ + "code": "SN", + "name": "Senegal", + "states": [ + { + "code": "SNDB", + "name": "Diourbel" + }, + { + "code": "SNDK", + "name": "Dakar" + }, + { + "code": "SNFK", + "name": "Fatick" + }, + { + "code": "SNKA", + "name": "Kaffrine" + }, + { + "code": "SNKD", + "name": "Kolda" + }, + { + "code": "SNKE", + "name": "Kédougou" + }, + { + "code": "SNKL", + "name": "Kaolack" + }, + { + "code": "SNLG", + "name": "Louga" + }, + { + "code": "SNMT", + "name": "Matam" + }, + { + "code": "SNSE", + "name": "Sédhiou" + }, + { + "code": "SNSL", + "name": "Saint-Louis" + }, + { + "code": "SNTC", + "name": "Tambacounda" + }, + { + "code": "SNTH", + "name": "Thiès" + }, + { + "code": "SNZG", + "name": "Ziguinchor" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/so.json b/plugins/woocommerce/tests/api-core-tests/data/countries/so.json new file mode 100644 index 00000000000..5489731b6dd --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/so.json @@ -0,0 +1,17 @@ +{ + "code": "SO", + "name": "Somalia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/so" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sr.json new file mode 100644 index 00000000000..2856a34d590 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sr.json @@ -0,0 +1,17 @@ +{ + "code": "SR", + "name": "Suriname", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ss.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ss.json new file mode 100644 index 00000000000..4980064c22e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ss.json @@ -0,0 +1,17 @@ +{ + "code": "SS", + "name": "South Sudan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ss" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/st.json b/plugins/woocommerce/tests/api-core-tests/data/countries/st.json new file mode 100644 index 00000000000..373c5aa03f3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/st.json @@ -0,0 +1,17 @@ +{ + "code": "ST", + "name": "São Tomé and Príncipe", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/st" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sv.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sv.json new file mode 100644 index 00000000000..85b79f3b852 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sv.json @@ -0,0 +1,74 @@ +{ + "code": "SV", + "name": "El Salvador", + "states": [ + { + "code": "SV-AH", + "name": "Ahuachapán" + }, + { + "code": "SV-CA", + "name": "Cabañas" + }, + { + "code": "SV-CH", + "name": "Chalatenango" + }, + { + "code": "SV-CU", + "name": "Cuscatlán" + }, + { + "code": "SV-LI", + "name": "La Libertad" + }, + { + "code": "SV-MO", + "name": "Morazán" + }, + { + "code": "SV-PA", + "name": "La Paz" + }, + { + "code": "SV-SA", + "name": "Santa Ana" + }, + { + "code": "SV-SM", + "name": "San Miguel" + }, + { + "code": "SV-SO", + "name": "Sonsonate" + }, + { + "code": "SV-SS", + "name": "San Salvador" + }, + { + "code": "SV-SV", + "name": "San Vicente" + }, + { + "code": "SV-UN", + "name": "La Unión" + }, + { + "code": "SV-US", + "name": "Usulután" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sv" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sx.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sx.json new file mode 100644 index 00000000000..438fa72915a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sx.json @@ -0,0 +1,17 @@ +{ + "code": "SX", + "name": "Saint Martin (Dutch part)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sx" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sy.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sy.json new file mode 100644 index 00000000000..d6b59270dd6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sy.json @@ -0,0 +1,17 @@ +{ + "code": "SY", + "name": "Syria", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sy" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/sz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/sz.json new file mode 100644 index 00000000000..4958056b330 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/sz.json @@ -0,0 +1,17 @@ +{ + "code": "SZ", + "name": "Eswatini", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/sz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tc.json new file mode 100644 index 00000000000..8a64a5be18b --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tc.json @@ -0,0 +1,17 @@ +{ + "code": "TC", + "name": "Turks and Caicos Islands", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/td.json b/plugins/woocommerce/tests/api-core-tests/data/countries/td.json new file mode 100644 index 00000000000..cfd3fa3cb9a --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/td.json @@ -0,0 +1,17 @@ +{ + "code": "TD", + "name": "Chad", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/td" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tf.json new file mode 100644 index 00000000000..9e7e59f7a9f --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tf.json @@ -0,0 +1,17 @@ +{ + "code": "TF", + "name": "French Southern Territories", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tg.json new file mode 100644 index 00000000000..e9e5a1e45f5 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tg.json @@ -0,0 +1,17 @@ +{ + "code": "TG", + "name": "Togo", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/th.json b/plugins/woocommerce/tests/api-core-tests/data/countries/th.json new file mode 100644 index 00000000000..5fc0fbd2cf4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/th.json @@ -0,0 +1,326 @@ +{ + "code": "TH", + "name": "Thailand", + "states": [ + { + "code": "TH-37", + "name": "Amnat Charoen" + }, + { + "code": "TH-15", + "name": "Ang Thong" + }, + { + "code": "TH-14", + "name": "Ayutthaya" + }, + { + "code": "TH-10", + "name": "Bangkok" + }, + { + "code": "TH-38", + "name": "Bueng Kan" + }, + { + "code": "TH-31", + "name": "Buri Ram" + }, + { + "code": "TH-24", + "name": "Chachoengsao" + }, + { + "code": "TH-18", + "name": "Chai Nat" + }, + { + "code": "TH-36", + "name": "Chaiyaphum" + }, + { + "code": "TH-22", + "name": "Chanthaburi" + }, + { + "code": "TH-50", + "name": "Chiang Mai" + }, + { + "code": "TH-57", + "name": "Chiang Rai" + }, + { + "code": "TH-20", + "name": "Chonburi" + }, + { + "code": "TH-86", + "name": "Chumphon" + }, + { + "code": "TH-46", + "name": "Kalasin" + }, + { + "code": "TH-62", + "name": "Kamphaeng Phet" + }, + { + "code": "TH-71", + "name": "Kanchanaburi" + }, + { + "code": "TH-40", + "name": "Khon Kaen" + }, + { + "code": "TH-81", + "name": "Krabi" + }, + { + "code": "TH-52", + "name": "Lampang" + }, + { + "code": "TH-51", + "name": "Lamphun" + }, + { + "code": "TH-42", + "name": "Loei" + }, + { + "code": "TH-16", + "name": "Lopburi" + }, + { + "code": "TH-58", + "name": "Mae Hong Son" + }, + { + "code": "TH-44", + "name": "Maha Sarakham" + }, + { + "code": "TH-49", + "name": "Mukdahan" + }, + { + "code": "TH-26", + "name": "Nakhon Nayok" + }, + { + "code": "TH-73", + "name": "Nakhon Pathom" + }, + { + "code": "TH-48", + "name": "Nakhon Phanom" + }, + { + "code": "TH-30", + "name": "Nakhon Ratchasima" + }, + { + "code": "TH-60", + "name": "Nakhon Sawan" + }, + { + "code": "TH-80", + "name": "Nakhon Si Thammarat" + }, + { + "code": "TH-55", + "name": "Nan" + }, + { + "code": "TH-96", + "name": "Narathiwat" + }, + { + "code": "TH-39", + "name": "Nong Bua Lam Phu" + }, + { + "code": "TH-43", + "name": "Nong Khai" + }, + { + "code": "TH-12", + "name": "Nonthaburi" + }, + { + "code": "TH-13", + "name": "Pathum Thani" + }, + { + "code": "TH-94", + "name": "Pattani" + }, + { + "code": "TH-82", + "name": "Phang Nga" + }, + { + "code": "TH-93", + "name": "Phatthalung" + }, + { + "code": "TH-56", + "name": "Phayao" + }, + { + "code": "TH-67", + "name": "Phetchabun" + }, + { + "code": "TH-76", + "name": "Phetchaburi" + }, + { + "code": "TH-66", + "name": "Phichit" + }, + { + "code": "TH-65", + "name": "Phitsanulok" + }, + { + "code": "TH-54", + "name": "Phrae" + }, + { + "code": "TH-83", + "name": "Phuket" + }, + { + "code": "TH-25", + "name": "Prachin Buri" + }, + { + "code": "TH-77", + "name": "Prachuap Khiri Khan" + }, + { + "code": "TH-85", + "name": "Ranong" + }, + { + "code": "TH-70", + "name": "Ratchaburi" + }, + { + "code": "TH-21", + "name": "Rayong" + }, + { + "code": "TH-45", + "name": "Roi Et" + }, + { + "code": "TH-27", + "name": "Sa Kaeo" + }, + { + "code": "TH-47", + "name": "Sakon Nakhon" + }, + { + "code": "TH-11", + "name": "Samut Prakan" + }, + { + "code": "TH-74", + "name": "Samut Sakhon" + }, + { + "code": "TH-75", + "name": "Samut Songkhram" + }, + { + "code": "TH-19", + "name": "Saraburi" + }, + { + "code": "TH-91", + "name": "Satun" + }, + { + "code": "TH-17", + "name": "Sing Buri" + }, + { + "code": "TH-33", + "name": "Sisaket" + }, + { + "code": "TH-90", + "name": "Songkhla" + }, + { + "code": "TH-64", + "name": "Sukhothai" + }, + { + "code": "TH-72", + "name": "Suphan Buri" + }, + { + "code": "TH-84", + "name": "Surat Thani" + }, + { + "code": "TH-32", + "name": "Surin" + }, + { + "code": "TH-63", + "name": "Tak" + }, + { + "code": "TH-92", + "name": "Trang" + }, + { + "code": "TH-23", + "name": "Trat" + }, + { + "code": "TH-34", + "name": "Ubon Ratchathani" + }, + { + "code": "TH-41", + "name": "Udon Thani" + }, + { + "code": "TH-61", + "name": "Uthai Thani" + }, + { + "code": "TH-53", + "name": "Uttaradit" + }, + { + "code": "TH-95", + "name": "Yala" + }, + { + "code": "TH-35", + "name": "Yasothon" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/th" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tj.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tj.json new file mode 100644 index 00000000000..5cfe919d253 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tj.json @@ -0,0 +1,17 @@ +{ + "code": "TJ", + "name": "Tajikistan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tj" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tk.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tk.json new file mode 100644 index 00000000000..40301f63b82 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tk.json @@ -0,0 +1,17 @@ +{ + "code": "TK", + "name": "Tokelau", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tk" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tl.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tl.json new file mode 100644 index 00000000000..51a695c68ec --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tl.json @@ -0,0 +1,17 @@ +{ + "code": "TL", + "name": "Timor-Leste", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tl" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tm.json new file mode 100644 index 00000000000..b25c469bdf3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tm.json @@ -0,0 +1,17 @@ +{ + "code": "TM", + "name": "Turkmenistan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tn.json new file mode 100644 index 00000000000..253772d77f5 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tn.json @@ -0,0 +1,17 @@ +{ + "code": "TN", + "name": "Tunisia", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/to.json b/plugins/woocommerce/tests/api-core-tests/data/countries/to.json new file mode 100644 index 00000000000..4d0fee6f6e4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/to.json @@ -0,0 +1,17 @@ +{ + "code": "TO", + "name": "Tonga", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/to" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tr.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tr.json new file mode 100644 index 00000000000..f88c16208f2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tr.json @@ -0,0 +1,342 @@ +{ + "code": "TR", + "name": "Turkey", + "states": [ + { + "code": "TR01", + "name": "Adana" + }, + { + "code": "TR02", + "name": "Adıyaman" + }, + { + "code": "TR03", + "name": "Afyon" + }, + { + "code": "TR04", + "name": "Ağrı" + }, + { + "code": "TR05", + "name": "Amasya" + }, + { + "code": "TR06", + "name": "Ankara" + }, + { + "code": "TR07", + "name": "Antalya" + }, + { + "code": "TR08", + "name": "Artvin" + }, + { + "code": "TR09", + "name": "Aydın" + }, + { + "code": "TR10", + "name": "Balıkesir" + }, + { + "code": "TR11", + "name": "Bilecik" + }, + { + "code": "TR12", + "name": "Bingöl" + }, + { + "code": "TR13", + "name": "Bitlis" + }, + { + "code": "TR14", + "name": "Bolu" + }, + { + "code": "TR15", + "name": "Burdur" + }, + { + "code": "TR16", + "name": "Bursa" + }, + { + "code": "TR17", + "name": "Çanakkale" + }, + { + "code": "TR18", + "name": "Çankırı" + }, + { + "code": "TR19", + "name": "Çorum" + }, + { + "code": "TR20", + "name": "Denizli" + }, + { + "code": "TR21", + "name": "Diyarbakır" + }, + { + "code": "TR22", + "name": "Edirne" + }, + { + "code": "TR23", + "name": "Elazığ" + }, + { + "code": "TR24", + "name": "Erzincan" + }, + { + "code": "TR25", + "name": "Erzurum" + }, + { + "code": "TR26", + "name": "Eskişehir" + }, + { + "code": "TR27", + "name": "Gaziantep" + }, + { + "code": "TR28", + "name": "Giresun" + }, + { + "code": "TR29", + "name": "Gümüşhane" + }, + { + "code": "TR30", + "name": "Hakkari" + }, + { + "code": "TR31", + "name": "Hatay" + }, + { + "code": "TR32", + "name": "Isparta" + }, + { + "code": "TR33", + "name": "İçel" + }, + { + "code": "TR34", + "name": "İstanbul" + }, + { + "code": "TR35", + "name": "İzmir" + }, + { + "code": "TR36", + "name": "Kars" + }, + { + "code": "TR37", + "name": "Kastamonu" + }, + { + "code": "TR38", + "name": "Kayseri" + }, + { + "code": "TR39", + "name": "Kırklareli" + }, + { + "code": "TR40", + "name": "Kırşehir" + }, + { + "code": "TR41", + "name": "Kocaeli" + }, + { + "code": "TR42", + "name": "Konya" + }, + { + "code": "TR43", + "name": "Kütahya" + }, + { + "code": "TR44", + "name": "Malatya" + }, + { + "code": "TR45", + "name": "Manisa" + }, + { + "code": "TR46", + "name": "Kahramanmaraş" + }, + { + "code": "TR47", + "name": "Mardin" + }, + { + "code": "TR48", + "name": "Muğla" + }, + { + "code": "TR49", + "name": "Muş" + }, + { + "code": "TR50", + "name": "Nevşehir" + }, + { + "code": "TR51", + "name": "Niğde" + }, + { + "code": "TR52", + "name": "Ordu" + }, + { + "code": "TR53", + "name": "Rize" + }, + { + "code": "TR54", + "name": "Sakarya" + }, + { + "code": "TR55", + "name": "Samsun" + }, + { + "code": "TR56", + "name": "Siirt" + }, + { + "code": "TR57", + "name": "Sinop" + }, + { + "code": "TR58", + "name": "Sivas" + }, + { + "code": "TR59", + "name": "Tekirdağ" + }, + { + "code": "TR60", + "name": "Tokat" + }, + { + "code": "TR61", + "name": "Trabzon" + }, + { + "code": "TR62", + "name": "Tunceli" + }, + { + "code": "TR63", + "name": "Şanlıurfa" + }, + { + "code": "TR64", + "name": "Uşak" + }, + { + "code": "TR65", + "name": "Van" + }, + { + "code": "TR66", + "name": "Yozgat" + }, + { + "code": "TR67", + "name": "Zonguldak" + }, + { + "code": "TR68", + "name": "Aksaray" + }, + { + "code": "TR69", + "name": "Bayburt" + }, + { + "code": "TR70", + "name": "Karaman" + }, + { + "code": "TR71", + "name": "Kırıkkale" + }, + { + "code": "TR72", + "name": "Batman" + }, + { + "code": "TR73", + "name": "Şırnak" + }, + { + "code": "TR74", + "name": "Bartın" + }, + { + "code": "TR75", + "name": "Ardahan" + }, + { + "code": "TR76", + "name": "Iğdır" + }, + { + "code": "TR77", + "name": "Yalova" + }, + { + "code": "TR78", + "name": "Karabük" + }, + { + "code": "TR79", + "name": "Kilis" + }, + { + "code": "TR80", + "name": "Osmaniye" + }, + { + "code": "TR81", + "name": "Düzce" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tr" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tt.json new file mode 100644 index 00000000000..8e8fbd2c5cf --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tt.json @@ -0,0 +1,17 @@ +{ + "code": "TT", + "name": "Trinidad and Tobago", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tv.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tv.json new file mode 100644 index 00000000000..b3e1fa92902 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tv.json @@ -0,0 +1,17 @@ +{ + "code": "TV", + "name": "Tuvalu", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tv" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tw.json new file mode 100644 index 00000000000..0be821777f4 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tw.json @@ -0,0 +1,17 @@ +{ + "code": "TW", + "name": "Taiwan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/tz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/tz.json new file mode 100644 index 00000000000..cca1bb80b98 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/tz.json @@ -0,0 +1,138 @@ +{ + "code": "TZ", + "name": "Tanzania", + "states": [ + { + "code": "TZ01", + "name": "Arusha" + }, + { + "code": "TZ02", + "name": "Dar es Salaam" + }, + { + "code": "TZ03", + "name": "Dodoma" + }, + { + "code": "TZ04", + "name": "Iringa" + }, + { + "code": "TZ05", + "name": "Kagera" + }, + { + "code": "TZ06", + "name": "Pemba North" + }, + { + "code": "TZ07", + "name": "Zanzibar North" + }, + { + "code": "TZ08", + "name": "Kigoma" + }, + { + "code": "TZ09", + "name": "Kilimanjaro" + }, + { + "code": "TZ10", + "name": "Pemba South" + }, + { + "code": "TZ11", + "name": "Zanzibar South" + }, + { + "code": "TZ12", + "name": "Lindi" + }, + { + "code": "TZ13", + "name": "Mara" + }, + { + "code": "TZ14", + "name": "Mbeya" + }, + { + "code": "TZ15", + "name": "Zanzibar West" + }, + { + "code": "TZ16", + "name": "Morogoro" + }, + { + "code": "TZ17", + "name": "Mtwara" + }, + { + "code": "TZ18", + "name": "Mwanza" + }, + { + "code": "TZ19", + "name": "Coast" + }, + { + "code": "TZ20", + "name": "Rukwa" + }, + { + "code": "TZ21", + "name": "Ruvuma" + }, + { + "code": "TZ22", + "name": "Shinyanga" + }, + { + "code": "TZ23", + "name": "Singida" + }, + { + "code": "TZ24", + "name": "Tabora" + }, + { + "code": "TZ25", + "name": "Tanga" + }, + { + "code": "TZ26", + "name": "Manyara" + }, + { + "code": "TZ27", + "name": "Geita" + }, + { + "code": "TZ28", + "name": "Katavi" + }, + { + "code": "TZ29", + "name": "Njombe" + }, + { + "code": "TZ30", + "name": "Simiyu" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/tz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ua.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ua.json new file mode 100644 index 00000000000..8fa2bef1350 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ua.json @@ -0,0 +1,126 @@ +{ + "code": "UA", + "name": "Ukraine", + "states": [ + { + "code": "UA05", + "name": "Vinnychchyna" + }, + { + "code": "UA07", + "name": "Volyn" + }, + { + "code": "UA09", + "name": "Luhanshchyna" + }, + { + "code": "UA12", + "name": "Dnipropetrovshchyna" + }, + { + "code": "UA14", + "name": "Donechchyna" + }, + { + "code": "UA18", + "name": "Zhytomyrshchyna" + }, + { + "code": "UA21", + "name": "Zakarpattia" + }, + { + "code": "UA23", + "name": "Zaporizhzhya" + }, + { + "code": "UA26", + "name": "Prykarpattia" + }, + { + "code": "UA30", + "name": "Kyiv" + }, + { + "code": "UA32", + "name": "Kyivshchyna" + }, + { + "code": "UA35", + "name": "Kirovohradschyna" + }, + { + "code": "UA40", + "name": "Sevastopol" + }, + { + "code": "UA43", + "name": "Crimea" + }, + { + "code": "UA46", + "name": "Lvivshchyna" + }, + { + "code": "UA48", + "name": "Mykolayivschyna" + }, + { + "code": "UA51", + "name": "Odeshchyna" + }, + { + "code": "UA53", + "name": "Poltavshchyna" + }, + { + "code": "UA56", + "name": "Rivnenshchyna" + }, + { + "code": "UA59", + "name": "Sumshchyna" + }, + { + "code": "UA61", + "name": "Ternopilshchyna" + }, + { + "code": "UA63", + "name": "Kharkivshchyna" + }, + { + "code": "UA65", + "name": "Khersonshchyna" + }, + { + "code": "UA68", + "name": "Khmelnychchyna" + }, + { + "code": "UA71", + "name": "Cherkashchyna" + }, + { + "code": "UA74", + "name": "Chernihivshchyna" + }, + { + "code": "UA77", + "name": "Chernivtsi Oblast" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ua" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ug.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ug.json new file mode 100644 index 00000000000..9035782acd6 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ug.json @@ -0,0 +1,530 @@ +{ + "code": "UG", + "name": "Uganda", + "states": [ + { + "code": "UG314", + "name": "Abim" + }, + { + "code": "UG301", + "name": "Adjumani" + }, + { + "code": "UG322", + "name": "Agago" + }, + { + "code": "UG323", + "name": "Alebtong" + }, + { + "code": "UG315", + "name": "Amolatar" + }, + { + "code": "UG324", + "name": "Amudat" + }, + { + "code": "UG216", + "name": "Amuria" + }, + { + "code": "UG316", + "name": "Amuru" + }, + { + "code": "UG302", + "name": "Apac" + }, + { + "code": "UG303", + "name": "Arua" + }, + { + "code": "UG217", + "name": "Budaka" + }, + { + "code": "UG218", + "name": "Bududa" + }, + { + "code": "UG201", + "name": "Bugiri" + }, + { + "code": "UG235", + "name": "Bugweri" + }, + { + "code": "UG420", + "name": "Buhweju" + }, + { + "code": "UG117", + "name": "Buikwe" + }, + { + "code": "UG219", + "name": "Bukedea" + }, + { + "code": "UG118", + "name": "Bukomansimbi" + }, + { + "code": "UG220", + "name": "Bukwa" + }, + { + "code": "UG225", + "name": "Bulambuli" + }, + { + "code": "UG416", + "name": "Buliisa" + }, + { + "code": "UG401", + "name": "Bundibugyo" + }, + { + "code": "UG430", + "name": "Bunyangabu" + }, + { + "code": "UG402", + "name": "Bushenyi" + }, + { + "code": "UG202", + "name": "Busia" + }, + { + "code": "UG221", + "name": "Butaleja" + }, + { + "code": "UG119", + "name": "Butambala" + }, + { + "code": "UG233", + "name": "Butebo" + }, + { + "code": "UG120", + "name": "Buvuma" + }, + { + "code": "UG226", + "name": "Buyende" + }, + { + "code": "UG317", + "name": "Dokolo" + }, + { + "code": "UG121", + "name": "Gomba" + }, + { + "code": "UG304", + "name": "Gulu" + }, + { + "code": "UG403", + "name": "Hoima" + }, + { + "code": "UG417", + "name": "Ibanda" + }, + { + "code": "UG203", + "name": "Iganga" + }, + { + "code": "UG418", + "name": "Isingiro" + }, + { + "code": "UG204", + "name": "Jinja" + }, + { + "code": "UG318", + "name": "Kaabong" + }, + { + "code": "UG404", + "name": "Kabale" + }, + { + "code": "UG405", + "name": "Kabarole" + }, + { + "code": "UG213", + "name": "Kaberamaido" + }, + { + "code": "UG427", + "name": "Kagadi" + }, + { + "code": "UG428", + "name": "Kakumiro" + }, + { + "code": "UG101", + "name": "Kalangala" + }, + { + "code": "UG222", + "name": "Kaliro" + }, + { + "code": "UG122", + "name": "Kalungu" + }, + { + "code": "UG102", + "name": "Kampala" + }, + { + "code": "UG205", + "name": "Kamuli" + }, + { + "code": "UG413", + "name": "Kamwenge" + }, + { + "code": "UG414", + "name": "Kanungu" + }, + { + "code": "UG206", + "name": "Kapchorwa" + }, + { + "code": "UG236", + "name": "Kapelebyong" + }, + { + "code": "UG126", + "name": "Kasanda" + }, + { + "code": "UG406", + "name": "Kasese" + }, + { + "code": "UG207", + "name": "Katakwi" + }, + { + "code": "UG112", + "name": "Kayunga" + }, + { + "code": "UG407", + "name": "Kibaale" + }, + { + "code": "UG103", + "name": "Kiboga" + }, + { + "code": "UG227", + "name": "Kibuku" + }, + { + "code": "UG432", + "name": "Kikuube" + }, + { + "code": "UG419", + "name": "Kiruhura" + }, + { + "code": "UG421", + "name": "Kiryandongo" + }, + { + "code": "UG408", + "name": "Kisoro" + }, + { + "code": "UG305", + "name": "Kitgum" + }, + { + "code": "UG319", + "name": "Koboko" + }, + { + "code": "UG325", + "name": "Kole" + }, + { + "code": "UG306", + "name": "Kotido" + }, + { + "code": "UG208", + "name": "Kumi" + }, + { + "code": "UG333", + "name": "Kwania" + }, + { + "code": "UG228", + "name": "Kween" + }, + { + "code": "UG123", + "name": "Kyankwanzi" + }, + { + "code": "UG422", + "name": "Kyegegwa" + }, + { + "code": "UG415", + "name": "Kyenjojo" + }, + { + "code": "UG125", + "name": "Kyotera" + }, + { + "code": "UG326", + "name": "Lamwo" + }, + { + "code": "UG307", + "name": "Lira" + }, + { + "code": "UG229", + "name": "Luuka" + }, + { + "code": "UG104", + "name": "Luwero" + }, + { + "code": "UG124", + "name": "Lwengo" + }, + { + "code": "UG114", + "name": "Lyantonde" + }, + { + "code": "UG223", + "name": "Manafwa" + }, + { + "code": "UG320", + "name": "Maracha" + }, + { + "code": "UG105", + "name": "Masaka" + }, + { + "code": "UG409", + "name": "Masindi" + }, + { + "code": "UG214", + "name": "Mayuge" + }, + { + "code": "UG209", + "name": "Mbale" + }, + { + "code": "UG410", + "name": "Mbarara" + }, + { + "code": "UG423", + "name": "Mitooma" + }, + { + "code": "UG115", + "name": "Mityana" + }, + { + "code": "UG308", + "name": "Moroto" + }, + { + "code": "UG309", + "name": "Moyo" + }, + { + "code": "UG106", + "name": "Mpigi" + }, + { + "code": "UG107", + "name": "Mubende" + }, + { + "code": "UG108", + "name": "Mukono" + }, + { + "code": "UG334", + "name": "Nabilatuk" + }, + { + "code": "UG311", + "name": "Nakapiripirit" + }, + { + "code": "UG116", + "name": "Nakaseke" + }, + { + "code": "UG109", + "name": "Nakasongola" + }, + { + "code": "UG230", + "name": "Namayingo" + }, + { + "code": "UG234", + "name": "Namisindwa" + }, + { + "code": "UG224", + "name": "Namutumba" + }, + { + "code": "UG327", + "name": "Napak" + }, + { + "code": "UG310", + "name": "Nebbi" + }, + { + "code": "UG231", + "name": "Ngora" + }, + { + "code": "UG424", + "name": "Ntoroko" + }, + { + "code": "UG411", + "name": "Ntungamo" + }, + { + "code": "UG328", + "name": "Nwoya" + }, + { + "code": "UG331", + "name": "Omoro" + }, + { + "code": "UG329", + "name": "Otuke" + }, + { + "code": "UG321", + "name": "Oyam" + }, + { + "code": "UG312", + "name": "Pader" + }, + { + "code": "UG332", + "name": "Pakwach" + }, + { + "code": "UG210", + "name": "Pallisa" + }, + { + "code": "UG110", + "name": "Rakai" + }, + { + "code": "UG429", + "name": "Rubanda" + }, + { + "code": "UG425", + "name": "Rubirizi" + }, + { + "code": "UG431", + "name": "Rukiga" + }, + { + "code": "UG412", + "name": "Rukungiri" + }, + { + "code": "UG111", + "name": "Sembabule" + }, + { + "code": "UG232", + "name": "Serere" + }, + { + "code": "UG426", + "name": "Sheema" + }, + { + "code": "UG215", + "name": "Sironko" + }, + { + "code": "UG211", + "name": "Soroti" + }, + { + "code": "UG212", + "name": "Tororo" + }, + { + "code": "UG113", + "name": "Wakiso" + }, + { + "code": "UG313", + "name": "Yumbe" + }, + { + "code": "UG330", + "name": "Zombo" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ug" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/um.json b/plugins/woocommerce/tests/api-core-tests/data/countries/um.json new file mode 100644 index 00000000000..0ae8676595d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/um.json @@ -0,0 +1,54 @@ +{ + "code": "UM", + "name": "United States (US) Minor Outlying Islands", + "states": [ + { + "code": 81, + "name": "Baker Island" + }, + { + "code": 84, + "name": "Howland Island" + }, + { + "code": 86, + "name": "Jarvis Island" + }, + { + "code": 67, + "name": "Johnston Atoll" + }, + { + "code": 89, + "name": "Kingman Reef" + }, + { + "code": 71, + "name": "Midway Atoll" + }, + { + "code": 76, + "name": "Navassa Island" + }, + { + "code": 95, + "name": "Palmyra Atoll" + }, + { + "code": 79, + "name": "Wake Island" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/um" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/us.json b/plugins/woocommerce/tests/api-core-tests/data/countries/us.json new file mode 100644 index 00000000000..217df8bf93d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/us.json @@ -0,0 +1,234 @@ +{ + "code": "US", + "name": "United States (US)", + "states": [ + { + "code": "AL", + "name": "Alabama" + }, + { + "code": "AK", + "name": "Alaska" + }, + { + "code": "AZ", + "name": "Arizona" + }, + { + "code": "AR", + "name": "Arkansas" + }, + { + "code": "CA", + "name": "California" + }, + { + "code": "CO", + "name": "Colorado" + }, + { + "code": "CT", + "name": "Connecticut" + }, + { + "code": "DE", + "name": "Delaware" + }, + { + "code": "DC", + "name": "District Of Columbia" + }, + { + "code": "FL", + "name": "Florida" + }, + { + "code": "GA", + "name": "Georgia" + }, + { + "code": "HI", + "name": "Hawaii" + }, + { + "code": "ID", + "name": "Idaho" + }, + { + "code": "IL", + "name": "Illinois" + }, + { + "code": "IN", + "name": "Indiana" + }, + { + "code": "IA", + "name": "Iowa" + }, + { + "code": "KS", + "name": "Kansas" + }, + { + "code": "KY", + "name": "Kentucky" + }, + { + "code": "LA", + "name": "Louisiana" + }, + { + "code": "ME", + "name": "Maine" + }, + { + "code": "MD", + "name": "Maryland" + }, + { + "code": "MA", + "name": "Massachusetts" + }, + { + "code": "MI", + "name": "Michigan" + }, + { + "code": "MN", + "name": "Minnesota" + }, + { + "code": "MS", + "name": "Mississippi" + }, + { + "code": "MO", + "name": "Missouri" + }, + { + "code": "MT", + "name": "Montana" + }, + { + "code": "NE", + "name": "Nebraska" + }, + { + "code": "NV", + "name": "Nevada" + }, + { + "code": "NH", + "name": "New Hampshire" + }, + { + "code": "NJ", + "name": "New Jersey" + }, + { + "code": "NM", + "name": "New Mexico" + }, + { + "code": "NY", + "name": "New York" + }, + { + "code": "NC", + "name": "North Carolina" + }, + { + "code": "ND", + "name": "North Dakota" + }, + { + "code": "OH", + "name": "Ohio" + }, + { + "code": "OK", + "name": "Oklahoma" + }, + { + "code": "OR", + "name": "Oregon" + }, + { + "code": "PA", + "name": "Pennsylvania" + }, + { + "code": "RI", + "name": "Rhode Island" + }, + { + "code": "SC", + "name": "South Carolina" + }, + { + "code": "SD", + "name": "South Dakota" + }, + { + "code": "TN", + "name": "Tennessee" + }, + { + "code": "TX", + "name": "Texas" + }, + { + "code": "UT", + "name": "Utah" + }, + { + "code": "VT", + "name": "Vermont" + }, + { + "code": "VA", + "name": "Virginia" + }, + { + "code": "WA", + "name": "Washington" + }, + { + "code": "WV", + "name": "West Virginia" + }, + { + "code": "WI", + "name": "Wisconsin" + }, + { + "code": "WY", + "name": "Wyoming" + }, + { + "code": "AA", + "name": "Armed Forces (AA)" + }, + { + "code": "AE", + "name": "Armed Forces (AE)" + }, + { + "code": "AP", + "name": "Armed Forces (AP)" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/us" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/uy.json b/plugins/woocommerce/tests/api-core-tests/data/countries/uy.json new file mode 100644 index 00000000000..73c7705ce9c --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/uy.json @@ -0,0 +1,94 @@ +{ + "code": "UY", + "name": "Uruguay", + "states": [ + { + "code": "UY-AR", + "name": "Artigas" + }, + { + "code": "UY-CA", + "name": "Canelones" + }, + { + "code": "UY-CL", + "name": "Cerro Largo" + }, + { + "code": "UY-CO", + "name": "Colonia" + }, + { + "code": "UY-DU", + "name": "Durazno" + }, + { + "code": "UY-FS", + "name": "Flores" + }, + { + "code": "UY-FD", + "name": "Florida" + }, + { + "code": "UY-LA", + "name": "Lavalleja" + }, + { + "code": "UY-MA", + "name": "Maldonado" + }, + { + "code": "UY-MO", + "name": "Montevideo" + }, + { + "code": "UY-PA", + "name": "Paysandú" + }, + { + "code": "UY-RN", + "name": "Río Negro" + }, + { + "code": "UY-RV", + "name": "Rivera" + }, + { + "code": "UY-RO", + "name": "Rocha" + }, + { + "code": "UY-SA", + "name": "Salto" + }, + { + "code": "UY-SJ", + "name": "San José" + }, + { + "code": "UY-SO", + "name": "Soriano" + }, + { + "code": "UY-TA", + "name": "Tacuarembó" + }, + { + "code": "UY-TT", + "name": "Treinta y Tres" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/uy" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/uz.json b/plugins/woocommerce/tests/api-core-tests/data/countries/uz.json new file mode 100644 index 00000000000..1f75daa7cc2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/uz.json @@ -0,0 +1,17 @@ +{ + "code": "UZ", + "name": "Uzbekistan", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/uz" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/va.json b/plugins/woocommerce/tests/api-core-tests/data/countries/va.json new file mode 100644 index 00000000000..87f0b5b451e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/va.json @@ -0,0 +1,17 @@ +{ + "code": "VA", + "name": "Vatican", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/va" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/vc.json b/plugins/woocommerce/tests/api-core-tests/data/countries/vc.json new file mode 100644 index 00000000000..5af4870165b --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/vc.json @@ -0,0 +1,17 @@ +{ + "code": "VC", + "name": "Saint Vincent and the Grenadines", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/vc" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ve.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ve.json new file mode 100644 index 00000000000..90dbb15c0f3 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ve.json @@ -0,0 +1,118 @@ +{ + "code": "VE", + "name": "Venezuela", + "states": [ + { + "code": "VE-A", + "name": "Capital" + }, + { + "code": "VE-B", + "name": "Anzoátegui" + }, + { + "code": "VE-C", + "name": "Apure" + }, + { + "code": "VE-D", + "name": "Aragua" + }, + { + "code": "VE-E", + "name": "Barinas" + }, + { + "code": "VE-F", + "name": "Bolívar" + }, + { + "code": "VE-G", + "name": "Carabobo" + }, + { + "code": "VE-H", + "name": "Cojedes" + }, + { + "code": "VE-I", + "name": "Falcón" + }, + { + "code": "VE-J", + "name": "Guárico" + }, + { + "code": "VE-K", + "name": "Lara" + }, + { + "code": "VE-L", + "name": "Mérida" + }, + { + "code": "VE-M", + "name": "Miranda" + }, + { + "code": "VE-N", + "name": "Monagas" + }, + { + "code": "VE-O", + "name": "Nueva Esparta" + }, + { + "code": "VE-P", + "name": "Portuguesa" + }, + { + "code": "VE-R", + "name": "Sucre" + }, + { + "code": "VE-S", + "name": "Táchira" + }, + { + "code": "VE-T", + "name": "Trujillo" + }, + { + "code": "VE-U", + "name": "Yaracuy" + }, + { + "code": "VE-V", + "name": "Zulia" + }, + { + "code": "VE-W", + "name": "Federal Dependencies" + }, + { + "code": "VE-X", + "name": "La Guaira (Vargas)" + }, + { + "code": "VE-Y", + "name": "Delta Amacuro" + }, + { + "code": "VE-Z", + "name": "Amazonas" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ve" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/vg.json b/plugins/woocommerce/tests/api-core-tests/data/countries/vg.json new file mode 100644 index 00000000000..7853ab2aeb9 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/vg.json @@ -0,0 +1,17 @@ +{ + "code": "VG", + "name": "Virgin Islands (British)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/vg" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/vi.json b/plugins/woocommerce/tests/api-core-tests/data/countries/vi.json new file mode 100644 index 00000000000..62e2f6c4aa2 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/vi.json @@ -0,0 +1,17 @@ +{ + "code": "VI", + "name": "Virgin Islands (US)", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/vi" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/vn.json b/plugins/woocommerce/tests/api-core-tests/data/countries/vn.json new file mode 100644 index 00000000000..8cdf947f18e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/vn.json @@ -0,0 +1,17 @@ +{ + "code": "VN", + "name": "Vietnam", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/vn" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/vu.json b/plugins/woocommerce/tests/api-core-tests/data/countries/vu.json new file mode 100644 index 00000000000..4c323c9650e --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/vu.json @@ -0,0 +1,17 @@ +{ + "code": "VU", + "name": "Vanuatu", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/vu" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/wf.json b/plugins/woocommerce/tests/api-core-tests/data/countries/wf.json new file mode 100644 index 00000000000..dfa015dea4d --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/wf.json @@ -0,0 +1,17 @@ +{ + "code": "WF", + "name": "Wallis and Futuna", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/wf" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ws.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ws.json new file mode 100644 index 00000000000..d5fdab86962 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ws.json @@ -0,0 +1,17 @@ +{ + "code": "WS", + "name": "Samoa", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ws" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/ye.json b/plugins/woocommerce/tests/api-core-tests/data/countries/ye.json new file mode 100644 index 00000000000..fc998ebda63 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/ye.json @@ -0,0 +1,17 @@ +{ + "code": "YE", + "name": "Yemen", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/ye" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/yt.json b/plugins/woocommerce/tests/api-core-tests/data/countries/yt.json new file mode 100644 index 00000000000..2f338435ac7 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/yt.json @@ -0,0 +1,17 @@ +{ + "code": "YT", + "name": "Mayotte", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/yt" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/za.json b/plugins/woocommerce/tests/api-core-tests/data/countries/za.json new file mode 100644 index 00000000000..cde0b1ade13 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/za.json @@ -0,0 +1,54 @@ +{ + "code": "ZA", + "name": "South Africa", + "states": [ + { + "code": "EC", + "name": "Eastern Cape" + }, + { + "code": "FS", + "name": "Free State" + }, + { + "code": "GP", + "name": "Gauteng" + }, + { + "code": "KZN", + "name": "KwaZulu-Natal" + }, + { + "code": "LP", + "name": "Limpopo" + }, + { + "code": "MP", + "name": "Mpumalanga" + }, + { + "code": "NC", + "name": "Northern Cape" + }, + { + "code": "NW", + "name": "North West" + }, + { + "code": "WC", + "name": "Western Cape" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/za" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/zm.json b/plugins/woocommerce/tests/api-core-tests/data/countries/zm.json new file mode 100644 index 00000000000..83c154baa52 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/zm.json @@ -0,0 +1,58 @@ +{ + "code": "ZM", + "name": "Zambia", + "states": [ + { + "code": "ZM-01", + "name": "Western" + }, + { + "code": "ZM-02", + "name": "Central" + }, + { + "code": "ZM-03", + "name": "Eastern" + }, + { + "code": "ZM-04", + "name": "Luapula" + }, + { + "code": "ZM-05", + "name": "Northern" + }, + { + "code": "ZM-06", + "name": "North-Western" + }, + { + "code": "ZM-07", + "name": "Southern" + }, + { + "code": "ZM-08", + "name": "Copperbelt" + }, + { + "code": "ZM-09", + "name": "Lusaka" + }, + { + "code": "ZM-10", + "name": "Muchinga" + } + ], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/zm" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/data/countries/zw.json b/plugins/woocommerce/tests/api-core-tests/data/countries/zw.json new file mode 100644 index 00000000000..d3e9570f309 --- /dev/null +++ b/plugins/woocommerce/tests/api-core-tests/data/countries/zw.json @@ -0,0 +1,17 @@ +{ + "code": "ZW", + "name": "Zimbabwe", + "states": [], + "_links": { + "self": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries/zw" + } + ], + "collection": [ + { + "href": "http://localhost:8086/wp-json/wc/v3/data/countries" + } + ] + } +} \ No newline at end of file diff --git a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js index 70355e749be..2c31224e053 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/data/data-crud.test.js @@ -2,10 +2,9 @@ const { test, expect } = require('@playwright/test'); -const exp = require('constants'); -const { - refund -} = require('../../data'); + +// 259 countries total +const countryCodes = ["af", "ax", "al", "dz", "as", "ad", "ao", "ai", "aq", "ag", "ar", "am", "aw", "au", "at", "az", "bs", "bh", "bd", "bb", "by", "pw", "be", "bz", "bj", "bm", "bt", "bo", "bq", "ba", "bw", "bv", "br", "io", "bn", "bg", "bf", "bi", "kh", "cm", "ca", "cv", "ky", "cf", "td", "cl", "cn", "cx", "cc", "co", "km", "cg", "cd", "ck", "cr", "hr", "cu", "cw", "cy", "cz", "dk", "dj", "dm", "do", "ec", "eg", "sv", "gq", "er", "ee", "sz", "et", "fk", "fo", "fj", "fi", "fr", "gf", "pf", "tf", "ga", "gm", "ge", "de", "gh", "gi", "gr", "gl", "gd", "gp", "gu", "gt", "gg", "gn", "gw", "gy", "ht", "hm", "hn", "hk", "hu", "is", "in", "id", "ir", "iq", "ie", "im", "il", "it", "ci", "jm", "jp", "je", "jo", "kz", "ke", "ki", "kw", "kg", "la", "lv", "lb", "ls", "lr", "ly", "li", "lt", "lu", "mo", "mg", "mw", "my", "mv", "ml", "mt", "mh", "mq", "mr", "mu", "yt", "mx", "fm", "md", "mc", "mn", "me", "ms", "ma", "mz", "mm", "na", "nr", "np", "nl", "nc", "nz", "ni", "ne", "ng", "nu", "nf", "kp", "mk", "mp", "no", "om", "pk", "ps", "pa", "pg", "py", "pe", "ph", "pn", "pl", "pt", "pr", "qa", "re", "ro", "ru", "rw", "st", "bl", "sh", "kn", "lc", "sx", "mf", "pm", "vc", "ws", "sm", "sa", "sn", "rs", "sc", "sl", "sg", "sk", "si", "sb", "so", "za", "gs", "kr", "ss", "es", "lk", "sd", "sr", "sj", "se", "ch", "sy", "tw", "tj", "tz", "th", "tl", "tg", "tk", "to", "tt", "tn", "tr", "tm", "tc", "tv", "ug", "ua", "ae", "gb", "us", "um", "uy", "uz", "vu", "va", "ve", "vn", "vg", "vi", "wf", "eh", "ye", "zm", "zw"]; /** * Tests for the WooCommerce Refunds API. @@ -70,79 +69,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "BGO", - "name": "Bengo" - }, - { - "code": "BLU", - "name": "Benguela" - }, - { - "code": "BIE", - "name": "Bié" - }, - { - "code": "CAB", - "name": "Cabinda" - }, - { - "code": "CNN", - "name": "Cunene" - }, - { - "code": "HUA", - "name": "Huambo" - }, - { - "code": "HUI", - "name": "Huíla" - }, - { - "code": "CCU", - "name": "Kuando Kubango" - }, - { - "code": "CNO", - "name": "Kwanza-Norte" - }, - { - "code": "CUS", - "name": "Kwanza-Sul" - }, - { - "code": "LUA", - "name": "Luanda" - }, - { - "code": "LNO", - "name": "Lunda-Norte" - }, - { - "code": "LSU", - "name": "Lunda-Sul" - }, - { - "code": "MAL", - "name": "Malanje" - }, - { - "code": "MOX", - "name": "Moxico" - }, - { - "code": "NAM", - "name": "Namibe" - }, - { - "code": "UIG", - "name": "Uíge" - }, - { - "code": "ZAI", - "name": "Zaire" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BF", @@ -178,55 +105,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "AL", - "name": "Alibori" - }, - { - "code": "AK", - "name": "Atakora" - }, - { - "code": "AQ", - "name": "Atlantique" - }, - { - "code": "BO", - "name": "Borgou" - }, - { - "code": "CO", - "name": "Collines" - }, - { - "code": "KO", - "name": "Kouffo" - }, - { - "code": "DO", - "name": "Donga" - }, - { - "code": "LI", - "name": "Littoral" - }, - { - "code": "MO", - "name": "Mono" - }, - { - "code": "OU", - "name": "Ouémé" - }, - { - "code": "PL", - "name": "Plateau" - }, - { - "code": "ZO", - "name": "Zou" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BW", @@ -334,199 +213,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "DZ-01", - "name": "Adrar" - }, - { - "code": "DZ-02", - "name": "Chlef" - }, - { - "code": "DZ-03", - "name": "Laghouat" - }, - { - "code": "DZ-04", - "name": "Oum El Bouaghi" - }, - { - "code": "DZ-05", - "name": "Batna" - }, - { - "code": "DZ-06", - "name": "Béjaïa" - }, - { - "code": "DZ-07", - "name": "Biskra" - }, - { - "code": "DZ-08", - "name": "Béchar" - }, - { - "code": "DZ-09", - "name": "Blida" - }, - { - "code": "DZ-10", - "name": "Bouira" - }, - { - "code": "DZ-11", - "name": "Tamanghasset" - }, - { - "code": "DZ-12", - "name": "Tébessa" - }, - { - "code": "DZ-13", - "name": "Tlemcen" - }, - { - "code": "DZ-14", - "name": "Tiaret" - }, - { - "code": "DZ-15", - "name": "Tizi Ouzou" - }, - { - "code": "DZ-16", - "name": "Algiers" - }, - { - "code": "DZ-17", - "name": "Djelfa" - }, - { - "code": "DZ-18", - "name": "Jijel" - }, - { - "code": "DZ-19", - "name": "Sétif" - }, - { - "code": "DZ-20", - "name": "Saïda" - }, - { - "code": "DZ-21", - "name": "Skikda" - }, - { - "code": "DZ-22", - "name": "Sidi Bel Abbès" - }, - { - "code": "DZ-23", - "name": "Annaba" - }, - { - "code": "DZ-24", - "name": "Guelma" - }, - { - "code": "DZ-25", - "name": "Constantine" - }, - { - "code": "DZ-26", - "name": "Médéa" - }, - { - "code": "DZ-27", - "name": "Mostaganem" - }, - { - "code": "DZ-28", - "name": "M’Sila" - }, - { - "code": "DZ-29", - "name": "Mascara" - }, - { - "code": "DZ-30", - "name": "Ouargla" - }, - { - "code": "DZ-31", - "name": "Oran" - }, - { - "code": "DZ-32", - "name": "El Bayadh" - }, - { - "code": "DZ-33", - "name": "Illizi" - }, - { - "code": "DZ-34", - "name": "Bordj Bou Arréridj" - }, - { - "code": "DZ-35", - "name": "Boumerdès" - }, - { - "code": "DZ-36", - "name": "El Tarf" - }, - { - "code": "DZ-37", - "name": "Tindouf" - }, - { - "code": "DZ-38", - "name": "Tissemsilt" - }, - { - "code": "DZ-39", - "name": "El Oued" - }, - { - "code": "DZ-40", - "name": "Khenchela" - }, - { - "code": "DZ-41", - "name": "Souk Ahras" - }, - { - "code": "DZ-42", - "name": "Tipasa" - }, - { - "code": "DZ-43", - "name": "Mila" - }, - { - "code": "DZ-44", - "name": "Aïn Defla" - }, - { - "code": "DZ-45", - "name": "Naama" - }, - { - "code": "DZ-46", - "name": "Aïn Témouchent" - }, - { - "code": "DZ-47", - "name": "Ghardaïa" - }, - { - "code": "DZ-48", - "name": "Relizane" - } - ] + "states": expect.arrayContaining([]) }, { "code": "EG", @@ -538,115 +225,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "EGALX", - "name": "Alexandria" - }, - { - "code": "EGASN", - "name": "Aswan" - }, - { - "code": "EGAST", - "name": "Asyut" - }, - { - "code": "EGBA", - "name": "Red Sea" - }, - { - "code": "EGBH", - "name": "Beheira" - }, - { - "code": "EGBNS", - "name": "Beni Suef" - }, - { - "code": "EGC", - "name": "Cairo" - }, - { - "code": "EGDK", - "name": "Dakahlia" - }, - { - "code": "EGDT", - "name": "Damietta" - }, - { - "code": "EGFYM", - "name": "Faiyum" - }, - { - "code": "EGGH", - "name": "Gharbia" - }, - { - "code": "EGGZ", - "name": "Giza" - }, - { - "code": "EGIS", - "name": "Ismailia" - }, - { - "code": "EGJS", - "name": "South Sinai" - }, - { - "code": "EGKB", - "name": "Qalyubia" - }, - { - "code": "EGKFS", - "name": "Kafr el-Sheikh" - }, - { - "code": "EGKN", - "name": "Qena" - }, - { - "code": "EGLX", - "name": "Luxor" - }, - { - "code": "EGMN", - "name": "Minya" - }, - { - "code": "EGMNF", - "name": "Monufia" - }, - { - "code": "EGMT", - "name": "Matrouh" - }, - { - "code": "EGPTS", - "name": "Port Said" - }, - { - "code": "EGSHG", - "name": "Sohag" - }, - { - "code": "EGSHR", - "name": "Al Sharqia" - }, - { - "code": "EGSIN", - "name": "North Sinai" - }, - { - "code": "EGSUZ", - "name": "Suez" - }, - { - "code": "EGWAD", - "name": "New Valley" - } - ] + "states": expect.arrayContaining([]) }, { "code": "EH", @@ -706,75 +285,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "AF", - "name": "Ahafo" - }, - { - "code": "AH", - "name": "Ashanti" - }, - { - "code": "BA", - "name": "Brong-Ahafo" - }, - { - "code": "BO", - "name": "Bono" - }, - { - "code": "BE", - "name": "Bono East" - }, - { - "code": "CP", - "name": "Central" - }, - { - "code": "EP", - "name": "Eastern" - }, - { - "code": "AA", - "name": "Greater Accra" - }, - { - "code": "NE", - "name": "North East" - }, - { - "code": "NP", - "name": "Northern" - }, - { - "code": "OT", - "name": "Oti" - }, - { - "code": "SV", - "name": "Savannah" - }, - { - "code": "UE", - "name": "Upper East" - }, - { - "code": "UW", - "name": "Upper West" - }, - { - "code": "TV", - "name": "Volta" - }, - { - "code": "WP", - "name": "Western" - }, - { - "code": "WN", - "name": "Western North" - } - ] + "states": expect.arrayContaining([]) }, { "code": "GM", @@ -834,195 +345,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "KE01", - "name": "Baringo" - }, - { - "code": "KE02", - "name": "Bomet" - }, - { - "code": "KE03", - "name": "Bungoma" - }, - { - "code": "KE04", - "name": "Busia" - }, - { - "code": "KE05", - "name": "Elgeyo-Marakwet" - }, - { - "code": "KE06", - "name": "Embu" - }, - { - "code": "KE07", - "name": "Garissa" - }, - { - "code": "KE08", - "name": "Homa Bay" - }, - { - "code": "KE09", - "name": "Isiolo" - }, - { - "code": "KE10", - "name": "Kajiado" - }, - { - "code": "KE11", - "name": "Kakamega" - }, - { - "code": "KE12", - "name": "Kericho" - }, - { - "code": "KE13", - "name": "Kiambu" - }, - { - "code": "KE14", - "name": "Kilifi" - }, - { - "code": "KE15", - "name": "Kirinyaga" - }, - { - "code": "KE16", - "name": "Kisii" - }, - { - "code": "KE17", - "name": "Kisumu" - }, - { - "code": "KE18", - "name": "Kitui" - }, - { - "code": "KE19", - "name": "Kwale" - }, - { - "code": "KE20", - "name": "Laikipia" - }, - { - "code": "KE21", - "name": "Lamu" - }, - { - "code": "KE22", - "name": "Machakos" - }, - { - "code": "KE23", - "name": "Makueni" - }, - { - "code": "KE24", - "name": "Mandera" - }, - { - "code": "KE25", - "name": "Marsabit" - }, - { - "code": "KE26", - "name": "Meru" - }, - { - "code": "KE27", - "name": "Migori" - }, - { - "code": "KE28", - "name": "Mombasa" - }, - { - "code": "KE29", - "name": "Murang’a" - }, - { - "code": "KE30", - "name": "Nairobi County" - }, - { - "code": "KE31", - "name": "Nakuru" - }, - { - "code": "KE32", - "name": "Nandi" - }, - { - "code": "KE33", - "name": "Narok" - }, - { - "code": "KE34", - "name": "Nyamira" - }, - { - "code": "KE35", - "name": "Nyandarua" - }, - { - "code": "KE36", - "name": "Nyeri" - }, - { - "code": "KE37", - "name": "Samburu" - }, - { - "code": "KE38", - "name": "Siaya" - }, - { - "code": "KE39", - "name": "Taita-Taveta" - }, - { - "code": "KE40", - "name": "Tana River" - }, - { - "code": "KE41", - "name": "Tharaka-Nithi" - }, - { - "code": "KE42", - "name": "Trans Nzoia" - }, - { - "code": "KE43", - "name": "Turkana" - }, - { - "code": "KE44", - "name": "Uasin Gishu" - }, - { - "code": "KE45", - "name": "Vihiga" - }, - { - "code": "KE46", - "name": "Wajir" - }, - { - "code": "KE47", - "name": "West Pokot" - } - ] + "states": expect.arrayContaining([]) }, { "code": "KM", @@ -1046,67 +369,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "BM", - "name": "Bomi" - }, - { - "code": "BN", - "name": "Bong" - }, - { - "code": "GA", - "name": "Gbarpolu" - }, - { - "code": "GB", - "name": "Grand Bassa" - }, - { - "code": "GC", - "name": "Grand Cape Mount" - }, - { - "code": "GG", - "name": "Grand Gedeh" - }, - { - "code": "GK", - "name": "Grand Kru" - }, - { - "code": "LO", - "name": "Lofa" - }, - { - "code": "MA", - "name": "Margibi" - }, - { - "code": "MY", - "name": "Maryland" - }, - { - "code": "MO", - "name": "Montserrado" - }, - { - "code": "NM", - "name": "Nimba" - }, - { - "code": "RV", - "name": "Rivercess" - }, - { - "code": "RG", - "name": "River Gee" - }, - { - "code": "SN", - "name": "Sinoe" - } - ] + "states": expect.arrayContaining([]) }, { "code": "LS", @@ -1214,51 +477,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "MZP", - "name": "Cabo Delgado" - }, - { - "code": "MZG", - "name": "Gaza" - }, - { - "code": "MZI", - "name": "Inhambane" - }, - { - "code": "MZB", - "name": "Manica" - }, - { - "code": "MZL", - "name": "Maputo Province" - }, - { - "code": "MZMPM", - "name": "Maputo" - }, - { - "code": "MZN", - "name": "Nampula" - }, - { - "code": "MZA", - "name": "Niassa" - }, - { - "code": "MZS", - "name": "Sofala" - }, - { - "code": "MZT", - "name": "Tete" - }, - { - "code": "MZQ", - "name": "Zambézia" - } - ] + "states": expect.arrayContaining([]) }, { "code": "NA", @@ -1270,63 +489,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "ER", - "name": "Erongo" - }, - { - "code": "HA", - "name": "Hardap" - }, - { - "code": "KA", - "name": "Karas" - }, - { - "code": "KE", - "name": "Kavango East" - }, - { - "code": "KW", - "name": "Kavango West" - }, - { - "code": "KH", - "name": "Khomas" - }, - { - "code": "KU", - "name": "Kunene" - }, - { - "code": "OW", - "name": "Ohangwena" - }, - { - "code": "OH", - "name": "Omaheke" - }, - { - "code": "OS", - "name": "Omusati" - }, - { - "code": "ON", - "name": "Oshana" - }, - { - "code": "OT", - "name": "Oshikoto" - }, - { - "code": "OD", - "name": "Otjozondjupa" - }, - { - "code": "CA", - "name": "Zambezi" - } - ] + "states": expect.arrayContaining([]) }, { "code": "NE", @@ -1350,155 +513,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "AB", - "name": "Abia" - }, - { - "code": "FC", - "name": "Abuja" - }, - { - "code": "AD", - "name": "Adamawa" - }, - { - "code": "AK", - "name": "Akwa Ibom" - }, - { - "code": "AN", - "name": "Anambra" - }, - { - "code": "BA", - "name": "Bauchi" - }, - { - "code": "BY", - "name": "Bayelsa" - }, - { - "code": "BE", - "name": "Benue" - }, - { - "code": "BO", - "name": "Borno" - }, - { - "code": "CR", - "name": "Cross River" - }, - { - "code": "DE", - "name": "Delta" - }, - { - "code": "EB", - "name": "Ebonyi" - }, - { - "code": "ED", - "name": "Edo" - }, - { - "code": "EK", - "name": "Ekiti" - }, - { - "code": "EN", - "name": "Enugu" - }, - { - "code": "GO", - "name": "Gombe" - }, - { - "code": "IM", - "name": "Imo" - }, - { - "code": "JI", - "name": "Jigawa" - }, - { - "code": "KD", - "name": "Kaduna" - }, - { - "code": "KN", - "name": "Kano" - }, - { - "code": "KT", - "name": "Katsina" - }, - { - "code": "KE", - "name": "Kebbi" - }, - { - "code": "KO", - "name": "Kogi" - }, - { - "code": "KW", - "name": "Kwara" - }, - { - "code": "LA", - "name": "Lagos" - }, - { - "code": "NA", - "name": "Nasarawa" - }, - { - "code": "NI", - "name": "Niger" - }, - { - "code": "OG", - "name": "Ogun" - }, - { - "code": "ON", - "name": "Ondo" - }, - { - "code": "OS", - "name": "Osun" - }, - { - "code": "OY", - "name": "Oyo" - }, - { - "code": "PL", - "name": "Plateau" - }, - { - "code": "RI", - "name": "Rivers" - }, - { - "code": "SO", - "name": "Sokoto" - }, - { - "code": "TA", - "name": "Taraba" - }, - { - "code": "YO", - "name": "Yobe" - }, - { - "code": "ZA", - "name": "Zamfara" - } - ] + "states": expect.arrayContaining([]) }, { "code": "RE", @@ -1678,127 +693,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "TZ01", - "name": "Arusha" - }, - { - "code": "TZ02", - "name": "Dar es Salaam" - }, - { - "code": "TZ03", - "name": "Dodoma" - }, - { - "code": "TZ04", - "name": "Iringa" - }, - { - "code": "TZ05", - "name": "Kagera" - }, - { - "code": "TZ06", - "name": "Pemba North" - }, - { - "code": "TZ07", - "name": "Zanzibar North" - }, - { - "code": "TZ08", - "name": "Kigoma" - }, - { - "code": "TZ09", - "name": "Kilimanjaro" - }, - { - "code": "TZ10", - "name": "Pemba South" - }, - { - "code": "TZ11", - "name": "Zanzibar South" - }, - { - "code": "TZ12", - "name": "Lindi" - }, - { - "code": "TZ13", - "name": "Mara" - }, - { - "code": "TZ14", - "name": "Mbeya" - }, - { - "code": "TZ15", - "name": "Zanzibar West" - }, - { - "code": "TZ16", - "name": "Morogoro" - }, - { - "code": "TZ17", - "name": "Mtwara" - }, - { - "code": "TZ18", - "name": "Mwanza" - }, - { - "code": "TZ19", - "name": "Coast" - }, - { - "code": "TZ20", - "name": "Rukwa" - }, - { - "code": "TZ21", - "name": "Ruvuma" - }, - { - "code": "TZ22", - "name": "Shinyanga" - }, - { - "code": "TZ23", - "name": "Singida" - }, - { - "code": "TZ24", - "name": "Tabora" - }, - { - "code": "TZ25", - "name": "Tanga" - }, - { - "code": "TZ26", - "name": "Manyara" - }, - { - "code": "TZ27", - "name": "Geita" - }, - { - "code": "TZ28", - "name": "Katavi" - }, - { - "code": "TZ29", - "name": "Njombe" - }, - { - "code": "TZ30", - "name": "Simiyu" - } - ] + "states": expect.arrayContaining([]) }, { "code": "UG", @@ -1810,519 +705,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "UG314", - "name": "Abim" - }, - { - "code": "UG301", - "name": "Adjumani" - }, - { - "code": "UG322", - "name": "Agago" - }, - { - "code": "UG323", - "name": "Alebtong" - }, - { - "code": "UG315", - "name": "Amolatar" - }, - { - "code": "UG324", - "name": "Amudat" - }, - { - "code": "UG216", - "name": "Amuria" - }, - { - "code": "UG316", - "name": "Amuru" - }, - { - "code": "UG302", - "name": "Apac" - }, - { - "code": "UG303", - "name": "Arua" - }, - { - "code": "UG217", - "name": "Budaka" - }, - { - "code": "UG218", - "name": "Bududa" - }, - { - "code": "UG201", - "name": "Bugiri" - }, - { - "code": "UG235", - "name": "Bugweri" - }, - { - "code": "UG420", - "name": "Buhweju" - }, - { - "code": "UG117", - "name": "Buikwe" - }, - { - "code": "UG219", - "name": "Bukedea" - }, - { - "code": "UG118", - "name": "Bukomansimbi" - }, - { - "code": "UG220", - "name": "Bukwa" - }, - { - "code": "UG225", - "name": "Bulambuli" - }, - { - "code": "UG416", - "name": "Buliisa" - }, - { - "code": "UG401", - "name": "Bundibugyo" - }, - { - "code": "UG430", - "name": "Bunyangabu" - }, - { - "code": "UG402", - "name": "Bushenyi" - }, - { - "code": "UG202", - "name": "Busia" - }, - { - "code": "UG221", - "name": "Butaleja" - }, - { - "code": "UG119", - "name": "Butambala" - }, - { - "code": "UG233", - "name": "Butebo" - }, - { - "code": "UG120", - "name": "Buvuma" - }, - { - "code": "UG226", - "name": "Buyende" - }, - { - "code": "UG317", - "name": "Dokolo" - }, - { - "code": "UG121", - "name": "Gomba" - }, - { - "code": "UG304", - "name": "Gulu" - }, - { - "code": "UG403", - "name": "Hoima" - }, - { - "code": "UG417", - "name": "Ibanda" - }, - { - "code": "UG203", - "name": "Iganga" - }, - { - "code": "UG418", - "name": "Isingiro" - }, - { - "code": "UG204", - "name": "Jinja" - }, - { - "code": "UG318", - "name": "Kaabong" - }, - { - "code": "UG404", - "name": "Kabale" - }, - { - "code": "UG405", - "name": "Kabarole" - }, - { - "code": "UG213", - "name": "Kaberamaido" - }, - { - "code": "UG427", - "name": "Kagadi" - }, - { - "code": "UG428", - "name": "Kakumiro" - }, - { - "code": "UG101", - "name": "Kalangala" - }, - { - "code": "UG222", - "name": "Kaliro" - }, - { - "code": "UG122", - "name": "Kalungu" - }, - { - "code": "UG102", - "name": "Kampala" - }, - { - "code": "UG205", - "name": "Kamuli" - }, - { - "code": "UG413", - "name": "Kamwenge" - }, - { - "code": "UG414", - "name": "Kanungu" - }, - { - "code": "UG206", - "name": "Kapchorwa" - }, - { - "code": "UG236", - "name": "Kapelebyong" - }, - { - "code": "UG126", - "name": "Kasanda" - }, - { - "code": "UG406", - "name": "Kasese" - }, - { - "code": "UG207", - "name": "Katakwi" - }, - { - "code": "UG112", - "name": "Kayunga" - }, - { - "code": "UG407", - "name": "Kibaale" - }, - { - "code": "UG103", - "name": "Kiboga" - }, - { - "code": "UG227", - "name": "Kibuku" - }, - { - "code": "UG432", - "name": "Kikuube" - }, - { - "code": "UG419", - "name": "Kiruhura" - }, - { - "code": "UG421", - "name": "Kiryandongo" - }, - { - "code": "UG408", - "name": "Kisoro" - }, - { - "code": "UG305", - "name": "Kitgum" - }, - { - "code": "UG319", - "name": "Koboko" - }, - { - "code": "UG325", - "name": "Kole" - }, - { - "code": "UG306", - "name": "Kotido" - }, - { - "code": "UG208", - "name": "Kumi" - }, - { - "code": "UG333", - "name": "Kwania" - }, - { - "code": "UG228", - "name": "Kween" - }, - { - "code": "UG123", - "name": "Kyankwanzi" - }, - { - "code": "UG422", - "name": "Kyegegwa" - }, - { - "code": "UG415", - "name": "Kyenjojo" - }, - { - "code": "UG125", - "name": "Kyotera" - }, - { - "code": "UG326", - "name": "Lamwo" - }, - { - "code": "UG307", - "name": "Lira" - }, - { - "code": "UG229", - "name": "Luuka" - }, - { - "code": "UG104", - "name": "Luwero" - }, - { - "code": "UG124", - "name": "Lwengo" - }, - { - "code": "UG114", - "name": "Lyantonde" - }, - { - "code": "UG223", - "name": "Manafwa" - }, - { - "code": "UG320", - "name": "Maracha" - }, - { - "code": "UG105", - "name": "Masaka" - }, - { - "code": "UG409", - "name": "Masindi" - }, - { - "code": "UG214", - "name": "Mayuge" - }, - { - "code": "UG209", - "name": "Mbale" - }, - { - "code": "UG410", - "name": "Mbarara" - }, - { - "code": "UG423", - "name": "Mitooma" - }, - { - "code": "UG115", - "name": "Mityana" - }, - { - "code": "UG308", - "name": "Moroto" - }, - { - "code": "UG309", - "name": "Moyo" - }, - { - "code": "UG106", - "name": "Mpigi" - }, - { - "code": "UG107", - "name": "Mubende" - }, - { - "code": "UG108", - "name": "Mukono" - }, - { - "code": "UG334", - "name": "Nabilatuk" - }, - { - "code": "UG311", - "name": "Nakapiripirit" - }, - { - "code": "UG116", - "name": "Nakaseke" - }, - { - "code": "UG109", - "name": "Nakasongola" - }, - { - "code": "UG230", - "name": "Namayingo" - }, - { - "code": "UG234", - "name": "Namisindwa" - }, - { - "code": "UG224", - "name": "Namutumba" - }, - { - "code": "UG327", - "name": "Napak" - }, - { - "code": "UG310", - "name": "Nebbi" - }, - { - "code": "UG231", - "name": "Ngora" - }, - { - "code": "UG424", - "name": "Ntoroko" - }, - { - "code": "UG411", - "name": "Ntungamo" - }, - { - "code": "UG328", - "name": "Nwoya" - }, - { - "code": "UG331", - "name": "Omoro" - }, - { - "code": "UG329", - "name": "Otuke" - }, - { - "code": "UG321", - "name": "Oyam" - }, - { - "code": "UG312", - "name": "Pader" - }, - { - "code": "UG332", - "name": "Pakwach" - }, - { - "code": "UG210", - "name": "Pallisa" - }, - { - "code": "UG110", - "name": "Rakai" - }, - { - "code": "UG429", - "name": "Rubanda" - }, - { - "code": "UG425", - "name": "Rubirizi" - }, - { - "code": "UG431", - "name": "Rukiga" - }, - { - "code": "UG412", - "name": "Rukungiri" - }, - { - "code": "UG111", - "name": "Sembabule" - }, - { - "code": "UG232", - "name": "Serere" - }, - { - "code": "UG426", - "name": "Sheema" - }, - { - "code": "UG215", - "name": "Sironko" - }, - { - "code": "UG211", - "name": "Soroti" - }, - { - "code": "UG212", - "name": "Tororo" - }, - { - "code": "UG113", - "name": "Wakiso" - }, - { - "code": "UG313", - "name": "Yumbe" - }, - { - "code": "UG330", - "name": "Zombo" - } - ] + "states": expect.arrayContaining([]) }, { "code": "YT", @@ -2346,43 +729,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "EC", - "name": "Eastern Cape" - }, - { - "code": "FS", - "name": "Free State" - }, - { - "code": "GP", - "name": "Gauteng" - }, - { - "code": "KZN", - "name": "KwaZulu-Natal" - }, - { - "code": "LP", - "name": "Limpopo" - }, - { - "code": "MP", - "name": "Mpumalanga" - }, - { - "code": "NC", - "name": "Northern Cape" - }, - { - "code": "NW", - "name": "North West" - }, - { - "code": "WC", - "name": "Western Cape" - } - ] + "states": expect.arrayContaining([]) }, { "code": "ZM", @@ -2394,47 +741,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "ZM-01", - "name": "Western" - }, - { - "code": "ZM-02", - "name": "Central" - }, - { - "code": "ZM-03", - "name": "Eastern" - }, - { - "code": "ZM-04", - "name": "Luapula" - }, - { - "code": "ZM-05", - "name": "Northern" - }, - { - "code": "ZM-06", - "name": "North-Western" - }, - { - "code": "ZM-07", - "name": "Southern" - }, - { - "code": "ZM-08", - "name": "Copperbelt" - }, - { - "code": "ZM-09", - "name": "Lusaka" - }, - { - "code": "ZM-10", - "name": "Muchinga" - } - ] + "states": expect.arrayContaining([]) }, { "code": "ZW", @@ -2547,263 +854,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "BD-05", - "name": "Bagerhat" - }, - { - "code": "BD-01", - "name": "Bandarban" - }, - { - "code": "BD-02", - "name": "Barguna" - }, - { - "code": "BD-06", - "name": "Barishal" - }, - { - "code": "BD-07", - "name": "Bhola" - }, - { - "code": "BD-03", - "name": "Bogura" - }, - { - "code": "BD-04", - "name": "Brahmanbaria" - }, - { - "code": "BD-09", - "name": "Chandpur" - }, - { - "code": "BD-10", - "name": "Chattogram" - }, - { - "code": "BD-12", - "name": "Chuadanga" - }, - { - "code": "BD-11", - "name": "Cox's Bazar" - }, - { - "code": "BD-08", - "name": "Cumilla" - }, - { - "code": "BD-13", - "name": "Dhaka" - }, - { - "code": "BD-14", - "name": "Dinajpur" - }, - { - "code": "BD-15", - "name": "Faridpur " - }, - { - "code": "BD-16", - "name": "Feni" - }, - { - "code": "BD-19", - "name": "Gaibandha" - }, - { - "code": "BD-18", - "name": "Gazipur" - }, - { - "code": "BD-17", - "name": "Gopalganj" - }, - { - "code": "BD-20", - "name": "Habiganj" - }, - { - "code": "BD-21", - "name": "Jamalpur" - }, - { - "code": "BD-22", - "name": "Jashore" - }, - { - "code": "BD-25", - "name": "Jhalokati" - }, - { - "code": "BD-23", - "name": "Jhenaidah" - }, - { - "code": "BD-24", - "name": "Joypurhat" - }, - { - "code": "BD-29", - "name": "Khagrachhari" - }, - { - "code": "BD-27", - "name": "Khulna" - }, - { - "code": "BD-26", - "name": "Kishoreganj" - }, - { - "code": "BD-28", - "name": "Kurigram" - }, - { - "code": "BD-30", - "name": "Kushtia" - }, - { - "code": "BD-31", - "name": "Lakshmipur" - }, - { - "code": "BD-32", - "name": "Lalmonirhat" - }, - { - "code": "BD-36", - "name": "Madaripur" - }, - { - "code": "BD-37", - "name": "Magura" - }, - { - "code": "BD-33", - "name": "Manikganj " - }, - { - "code": "BD-39", - "name": "Meherpur" - }, - { - "code": "BD-38", - "name": "Moulvibazar" - }, - { - "code": "BD-35", - "name": "Munshiganj" - }, - { - "code": "BD-34", - "name": "Mymensingh" - }, - { - "code": "BD-48", - "name": "Naogaon" - }, - { - "code": "BD-43", - "name": "Narail" - }, - { - "code": "BD-40", - "name": "Narayanganj" - }, - { - "code": "BD-42", - "name": "Narsingdi" - }, - { - "code": "BD-44", - "name": "Natore" - }, - { - "code": "BD-45", - "name": "Nawabganj" - }, - { - "code": "BD-41", - "name": "Netrakona" - }, - { - "code": "BD-46", - "name": "Nilphamari" - }, - { - "code": "BD-47", - "name": "Noakhali" - }, - { - "code": "BD-49", - "name": "Pabna" - }, - { - "code": "BD-52", - "name": "Panchagarh" - }, - { - "code": "BD-51", - "name": "Patuakhali" - }, - { - "code": "BD-50", - "name": "Pirojpur" - }, - { - "code": "BD-53", - "name": "Rajbari" - }, - { - "code": "BD-54", - "name": "Rajshahi" - }, - { - "code": "BD-56", - "name": "Rangamati" - }, - { - "code": "BD-55", - "name": "Rangpur" - }, - { - "code": "BD-58", - "name": "Satkhira" - }, - { - "code": "BD-62", - "name": "Shariatpur" - }, - { - "code": "BD-57", - "name": "Sherpur" - }, - { - "code": "BD-59", - "name": "Sirajganj" - }, - { - "code": "BD-61", - "name": "Sunamganj" - }, - { - "code": "BD-60", - "name": "Sylhet" - }, - { - "code": "BD-63", - "name": "Tangail" - }, - { - "code": "BD-64", - "name": "Thakurgaon" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BH", @@ -2863,135 +914,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "CN1", - "name": "Yunnan / 云南" - }, - { - "code": "CN2", - "name": "Beijing / 北京" - }, - { - "code": "CN3", - "name": "Tianjin / 天津" - }, - { - "code": "CN4", - "name": "Hebei / 河北" - }, - { - "code": "CN5", - "name": "Shanxi / 山西" - }, - { - "code": "CN6", - "name": "Inner Mongolia / 內蒙古" - }, - { - "code": "CN7", - "name": "Liaoning / 辽宁" - }, - { - "code": "CN8", - "name": "Jilin / 吉林" - }, - { - "code": "CN9", - "name": "Heilongjiang / 黑龙江" - }, - { - "code": "CN10", - "name": "Shanghai / 上海" - }, - { - "code": "CN11", - "name": "Jiangsu / 江苏" - }, - { - "code": "CN12", - "name": "Zhejiang / 浙江" - }, - { - "code": "CN13", - "name": "Anhui / 安徽" - }, - { - "code": "CN14", - "name": "Fujian / 福建" - }, - { - "code": "CN15", - "name": "Jiangxi / 江西" - }, - { - "code": "CN16", - "name": "Shandong / 山东" - }, - { - "code": "CN17", - "name": "Henan / 河南" - }, - { - "code": "CN18", - "name": "Hubei / 湖北" - }, - { - "code": "CN19", - "name": "Hunan / 湖南" - }, - { - "code": "CN20", - "name": "Guangdong / 广东" - }, - { - "code": "CN21", - "name": "Guangxi Zhuang / 广西壮族" - }, - { - "code": "CN22", - "name": "Hainan / 海南" - }, - { - "code": "CN23", - "name": "Chongqing / 重庆" - }, - { - "code": "CN24", - "name": "Sichuan / 四川" - }, - { - "code": "CN25", - "name": "Guizhou / 贵州" - }, - { - "code": "CN26", - "name": "Shaanxi / 陕西" - }, - { - "code": "CN27", - "name": "Gansu / 甘肃" - }, - { - "code": "CN28", - "name": "Qinghai / 青海" - }, - { - "code": "CN29", - "name": "Ningxia Hui / 宁夏" - }, - { - "code": "CN30", - "name": "Macao / 澳门" - }, - { - "code": "CN31", - "name": "Tibet / 西藏" - }, - { - "code": "CN32", - "name": "Xinjiang / 新疆" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CX", @@ -3039,19 +962,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "HONG KONG", - "name": "Hong Kong Island" - }, - { - "code": "KOWLOON", - "name": "Kowloon" - }, - { - "code": "NEW TERRITORIES", - "name": "New Territories" - } - ] + "states": expect.arrayContaining([]) }, { "code": "ID", @@ -3063,143 +974,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AC", - "name": "Daerah Istimewa Aceh" - }, - { - "code": "SU", - "name": "Sumatera Utara" - }, - { - "code": "SB", - "name": "Sumatera Barat" - }, - { - "code": "RI", - "name": "Riau" - }, - { - "code": "KR", - "name": "Kepulauan Riau" - }, - { - "code": "JA", - "name": "Jambi" - }, - { - "code": "SS", - "name": "Sumatera Selatan" - }, - { - "code": "BB", - "name": "Bangka Belitung" - }, - { - "code": "BE", - "name": "Bengkulu" - }, - { - "code": "LA", - "name": "Lampung" - }, - { - "code": "JK", - "name": "DKI Jakarta" - }, - { - "code": "JB", - "name": "Jawa Barat" - }, - { - "code": "BT", - "name": "Banten" - }, - { - "code": "JT", - "name": "Jawa Tengah" - }, - { - "code": "JI", - "name": "Jawa Timur" - }, - { - "code": "YO", - "name": "Daerah Istimewa Yogyakarta" - }, - { - "code": "BA", - "name": "Bali" - }, - { - "code": "NB", - "name": "Nusa Tenggara Barat" - }, - { - "code": "NT", - "name": "Nusa Tenggara Timur" - }, - { - "code": "KB", - "name": "Kalimantan Barat" - }, - { - "code": "KT", - "name": "Kalimantan Tengah" - }, - { - "code": "KI", - "name": "Kalimantan Timur" - }, - { - "code": "KS", - "name": "Kalimantan Selatan" - }, - { - "code": "KU", - "name": "Kalimantan Utara" - }, - { - "code": "SA", - "name": "Sulawesi Utara" - }, - { - "code": "ST", - "name": "Sulawesi Tengah" - }, - { - "code": "SG", - "name": "Sulawesi Tenggara" - }, - { - "code": "SR", - "name": "Sulawesi Barat" - }, - { - "code": "SN", - "name": "Sulawesi Selatan" - }, - { - "code": "GO", - "name": "Gorontalo" - }, - { - "code": "MA", - "name": "Maluku" - }, - { - "code": "MU", - "name": "Maluku Utara" - }, - { - "code": "PA", - "name": "Papua" - }, - { - "code": "PB", - "name": "Papua Barat" - } - ] + "states": expect.arrayContaining([]) }, { "code": "IL", @@ -3223,155 +998,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "AP", - "name": "Andhra Pradesh" - }, - { - "code": "AR", - "name": "Arunachal Pradesh" - }, - { - "code": "AS", - "name": "Assam" - }, - { - "code": "BR", - "name": "Bihar" - }, - { - "code": "CT", - "name": "Chhattisgarh" - }, - { - "code": "GA", - "name": "Goa" - }, - { - "code": "GJ", - "name": "Gujarat" - }, - { - "code": "HR", - "name": "Haryana" - }, - { - "code": "HP", - "name": "Himachal Pradesh" - }, - { - "code": "JK", - "name": "Jammu and Kashmir" - }, - { - "code": "JH", - "name": "Jharkhand" - }, - { - "code": "KA", - "name": "Karnataka" - }, - { - "code": "KL", - "name": "Kerala" - }, - { - "code": "LA", - "name": "Ladakh" - }, - { - "code": "MP", - "name": "Madhya Pradesh" - }, - { - "code": "MH", - "name": "Maharashtra" - }, - { - "code": "MN", - "name": "Manipur" - }, - { - "code": "ML", - "name": "Meghalaya" - }, - { - "code": "MZ", - "name": "Mizoram" - }, - { - "code": "NL", - "name": "Nagaland" - }, - { - "code": "OR", - "name": "Odisha" - }, - { - "code": "PB", - "name": "Punjab" - }, - { - "code": "RJ", - "name": "Rajasthan" - }, - { - "code": "SK", - "name": "Sikkim" - }, - { - "code": "TN", - "name": "Tamil Nadu" - }, - { - "code": "TS", - "name": "Telangana" - }, - { - "code": "TR", - "name": "Tripura" - }, - { - "code": "UK", - "name": "Uttarakhand" - }, - { - "code": "UP", - "name": "Uttar Pradesh" - }, - { - "code": "WB", - "name": "West Bengal" - }, - { - "code": "AN", - "name": "Andaman and Nicobar Islands" - }, - { - "code": "CH", - "name": "Chandigarh" - }, - { - "code": "DN", - "name": "Dadra and Nagar Haveli" - }, - { - "code": "DD", - "name": "Daman and Diu" - }, - { - "code": "DL", - "name": "Delhi" - }, - { - "code": "LD", - "name": "Lakshadeep" - }, - { - "code": "PY", - "name": "Pondicherry (Puducherry)" - } - ] + "states": expect.arrayContaining([]) }, { "code": "IO", @@ -3407,131 +1034,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "KHZ", - "name": "Khuzestan (خوزستان)" - }, - { - "code": "THR", - "name": "Tehran (تهران)" - }, - { - "code": "ILM", - "name": "Ilaam (ایلام)" - }, - { - "code": "BHR", - "name": "Bushehr (بوشهر)" - }, - { - "code": "ADL", - "name": "Ardabil (اردبیل)" - }, - { - "code": "ESF", - "name": "Isfahan (اصفهان)" - }, - { - "code": "YZD", - "name": "Yazd (یزد)" - }, - { - "code": "KRH", - "name": "Kermanshah (کرمانشاه)" - }, - { - "code": "KRN", - "name": "Kerman (کرمان)" - }, - { - "code": "HDN", - "name": "Hamadan (همدان)" - }, - { - "code": "GZN", - "name": "Ghazvin (قزوین)" - }, - { - "code": "ZJN", - "name": "Zanjan (زنجان)" - }, - { - "code": "LRS", - "name": "Luristan (لرستان)" - }, - { - "code": "ABZ", - "name": "Alborz (البرز)" - }, - { - "code": "EAZ", - "name": "East Azarbaijan (آذربایجان شرقی)" - }, - { - "code": "WAZ", - "name": "West Azarbaijan (آذربایجان غربی)" - }, - { - "code": "CHB", - "name": "Chaharmahal and Bakhtiari (چهارمحال و بختیاری)" - }, - { - "code": "SKH", - "name": "South Khorasan (خراسان جنوبی)" - }, - { - "code": "RKH", - "name": "Razavi Khorasan (خراسان رضوی)" - }, - { - "code": "NKH", - "name": "North Khorasan (خراسان شمالی)" - }, - { - "code": "SMN", - "name": "Semnan (سمنان)" - }, - { - "code": "FRS", - "name": "Fars (فارس)" - }, - { - "code": "QHM", - "name": "Qom (قم)" - }, - { - "code": "KRD", - "name": "Kurdistan / کردستان)" - }, - { - "code": "KBD", - "name": "Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)" - }, - { - "code": "GLS", - "name": "Golestan (گلستان)" - }, - { - "code": "GIL", - "name": "Gilan (گیلان)" - }, - { - "code": "MZN", - "name": "Mazandaran (مازندران)" - }, - { - "code": "MKZ", - "name": "Markazi (مرکزی)" - }, - { - "code": "HRZ", - "name": "Hormozgan (هرمزگان)" - }, - { - "code": "SBN", - "name": "Sistan and Baluchestan (سیستان و بلوچستان)" - } - ] + "states": expect.arrayContaining([]) }, { "code": "JO", @@ -3555,195 +1058,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "JP01", - "name": "Hokkaido" - }, - { - "code": "JP02", - "name": "Aomori" - }, - { - "code": "JP03", - "name": "Iwate" - }, - { - "code": "JP04", - "name": "Miyagi" - }, - { - "code": "JP05", - "name": "Akita" - }, - { - "code": "JP06", - "name": "Yamagata" - }, - { - "code": "JP07", - "name": "Fukushima" - }, - { - "code": "JP08", - "name": "Ibaraki" - }, - { - "code": "JP09", - "name": "Tochigi" - }, - { - "code": "JP10", - "name": "Gunma" - }, - { - "code": "JP11", - "name": "Saitama" - }, - { - "code": "JP12", - "name": "Chiba" - }, - { - "code": "JP13", - "name": "Tokyo" - }, - { - "code": "JP14", - "name": "Kanagawa" - }, - { - "code": "JP15", - "name": "Niigata" - }, - { - "code": "JP16", - "name": "Toyama" - }, - { - "code": "JP17", - "name": "Ishikawa" - }, - { - "code": "JP18", - "name": "Fukui" - }, - { - "code": "JP19", - "name": "Yamanashi" - }, - { - "code": "JP20", - "name": "Nagano" - }, - { - "code": "JP21", - "name": "Gifu" - }, - { - "code": "JP22", - "name": "Shizuoka" - }, - { - "code": "JP23", - "name": "Aichi" - }, - { - "code": "JP24", - "name": "Mie" - }, - { - "code": "JP25", - "name": "Shiga" - }, - { - "code": "JP26", - "name": "Kyoto" - }, - { - "code": "JP27", - "name": "Osaka" - }, - { - "code": "JP28", - "name": "Hyogo" - }, - { - "code": "JP29", - "name": "Nara" - }, - { - "code": "JP30", - "name": "Wakayama" - }, - { - "code": "JP31", - "name": "Tottori" - }, - { - "code": "JP32", - "name": "Shimane" - }, - { - "code": "JP33", - "name": "Okayama" - }, - { - "code": "JP34", - "name": "Hiroshima" - }, - { - "code": "JP35", - "name": "Yamaguchi" - }, - { - "code": "JP36", - "name": "Tokushima" - }, - { - "code": "JP37", - "name": "Kagawa" - }, - { - "code": "JP38", - "name": "Ehime" - }, - { - "code": "JP39", - "name": "Kochi" - }, - { - "code": "JP40", - "name": "Fukuoka" - }, - { - "code": "JP41", - "name": "Saga" - }, - { - "code": "JP42", - "name": "Nagasaki" - }, - { - "code": "JP43", - "name": "Kumamoto" - }, - { - "code": "JP44", - "name": "Oita" - }, - { - "code": "JP45", - "name": "Miyazaki" - }, - { - "code": "JP46", - "name": "Kagoshima" - }, - { - "code": "JP47", - "name": "Okinawa" - } - ] + "states": expect.arrayContaining([]) }, { "code": "KG", @@ -3827,79 +1142,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AT", - "name": "Attapeu" - }, - { - "code": "BK", - "name": "Bokeo" - }, - { - "code": "BL", - "name": "Bolikhamsai" - }, - { - "code": "CH", - "name": "Champasak" - }, - { - "code": "HO", - "name": "Houaphanh" - }, - { - "code": "KH", - "name": "Khammouane" - }, - { - "code": "LM", - "name": "Luang Namtha" - }, - { - "code": "LP", - "name": "Luang Prabang" - }, - { - "code": "OU", - "name": "Oudomxay" - }, - { - "code": "PH", - "name": "Phongsaly" - }, - { - "code": "SL", - "name": "Salavan" - }, - { - "code": "SV", - "name": "Savannakhet" - }, - { - "code": "VI", - "name": "Vientiane Province" - }, - { - "code": "VT", - "name": "Vientiane" - }, - { - "code": "XA", - "name": "Sainyabuli" - }, - { - "code": "XE", - "name": "Sekong" - }, - { - "code": "XI", - "name": "Xiangkhouang" - }, - { - "code": "XS", - "name": "Xaisomboun" - } - ] + "states": expect.arrayContaining([]) }, { "code": "LB", @@ -3983,71 +1226,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "JHR", - "name": "Johor" - }, - { - "code": "KDH", - "name": "Kedah" - }, - { - "code": "KTN", - "name": "Kelantan" - }, - { - "code": "LBN", - "name": "Labuan" - }, - { - "code": "MLK", - "name": "Malacca (Melaka)" - }, - { - "code": "NSN", - "name": "Negeri Sembilan" - }, - { - "code": "PHG", - "name": "Pahang" - }, - { - "code": "PNG", - "name": "Penang (Pulau Pinang)" - }, - { - "code": "PRK", - "name": "Perak" - }, - { - "code": "PLS", - "name": "Perlis" - }, - { - "code": "SBH", - "name": "Sabah" - }, - { - "code": "SWK", - "name": "Sarawak" - }, - { - "code": "SGR", - "name": "Selangor" - }, - { - "code": "TRG", - "name": "Terengganu" - }, - { - "code": "PJY", - "name": "Putrajaya" - }, - { - "code": "KUL", - "name": "Kuala Lumpur" - } - ] + "states": expect.arrayContaining([]) }, { "code": "NP", @@ -4059,63 +1238,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "BAG", - "name": "Bagmati" - }, - { - "code": "BHE", - "name": "Bheri" - }, - { - "code": "DHA", - "name": "Dhaulagiri" - }, - { - "code": "GAN", - "name": "Gandaki" - }, - { - "code": "JAN", - "name": "Janakpur" - }, - { - "code": "KAR", - "name": "Karnali" - }, - { - "code": "KOS", - "name": "Koshi" - }, - { - "code": "LUM", - "name": "Lumbini" - }, - { - "code": "MAH", - "name": "Mahakali" - }, - { - "code": "MEC", - "name": "Mechi" - }, - { - "code": "NAR", - "name": "Narayani" - }, - { - "code": "RAP", - "name": "Rapti" - }, - { - "code": "SAG", - "name": "Sagarmatha" - }, - { - "code": "SET", - "name": "Seti" - } - ] + "states": expect.arrayContaining([]) }, { "code": "OM", @@ -4139,335 +1262,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "ABR", - "name": "Abra" - }, - { - "code": "AGN", - "name": "Agusan del Norte" - }, - { - "code": "AGS", - "name": "Agusan del Sur" - }, - { - "code": "AKL", - "name": "Aklan" - }, - { - "code": "ALB", - "name": "Albay" - }, - { - "code": "ANT", - "name": "Antique" - }, - { - "code": "APA", - "name": "Apayao" - }, - { - "code": "AUR", - "name": "Aurora" - }, - { - "code": "BAS", - "name": "Basilan" - }, - { - "code": "BAN", - "name": "Bataan" - }, - { - "code": "BTN", - "name": "Batanes" - }, - { - "code": "BTG", - "name": "Batangas" - }, - { - "code": "BEN", - "name": "Benguet" - }, - { - "code": "BIL", - "name": "Biliran" - }, - { - "code": "BOH", - "name": "Bohol" - }, - { - "code": "BUK", - "name": "Bukidnon" - }, - { - "code": "BUL", - "name": "Bulacan" - }, - { - "code": "CAG", - "name": "Cagayan" - }, - { - "code": "CAN", - "name": "Camarines Norte" - }, - { - "code": "CAS", - "name": "Camarines Sur" - }, - { - "code": "CAM", - "name": "Camiguin" - }, - { - "code": "CAP", - "name": "Capiz" - }, - { - "code": "CAT", - "name": "Catanduanes" - }, - { - "code": "CAV", - "name": "Cavite" - }, - { - "code": "CEB", - "name": "Cebu" - }, - { - "code": "COM", - "name": "Compostela Valley" - }, - { - "code": "NCO", - "name": "Cotabato" - }, - { - "code": "DAV", - "name": "Davao del Norte" - }, - { - "code": "DAS", - "name": "Davao del Sur" - }, - { - "code": "DAC", - "name": "Davao Occidental" - }, - { - "code": "DAO", - "name": "Davao Oriental" - }, - { - "code": "DIN", - "name": "Dinagat Islands" - }, - { - "code": "EAS", - "name": "Eastern Samar" - }, - { - "code": "GUI", - "name": "Guimaras" - }, - { - "code": "IFU", - "name": "Ifugao" - }, - { - "code": "ILN", - "name": "Ilocos Norte" - }, - { - "code": "ILS", - "name": "Ilocos Sur" - }, - { - "code": "ILI", - "name": "Iloilo" - }, - { - "code": "ISA", - "name": "Isabela" - }, - { - "code": "KAL", - "name": "Kalinga" - }, - { - "code": "LUN", - "name": "La Union" - }, - { - "code": "LAG", - "name": "Laguna" - }, - { - "code": "LAN", - "name": "Lanao del Norte" - }, - { - "code": "LAS", - "name": "Lanao del Sur" - }, - { - "code": "LEY", - "name": "Leyte" - }, - { - "code": "MAG", - "name": "Maguindanao" - }, - { - "code": "MAD", - "name": "Marinduque" - }, - { - "code": "MAS", - "name": "Masbate" - }, - { - "code": "MSC", - "name": "Misamis Occidental" - }, - { - "code": "MSR", - "name": "Misamis Oriental" - }, - { - "code": "MOU", - "name": "Mountain Province" - }, - { - "code": "NEC", - "name": "Negros Occidental" - }, - { - "code": "NER", - "name": "Negros Oriental" - }, - { - "code": "NSA", - "name": "Northern Samar" - }, - { - "code": "NUE", - "name": "Nueva Ecija" - }, - { - "code": "NUV", - "name": "Nueva Vizcaya" - }, - { - "code": "MDC", - "name": "Occidental Mindoro" - }, - { - "code": "MDR", - "name": "Oriental Mindoro" - }, - { - "code": "PLW", - "name": "Palawan" - }, - { - "code": "PAM", - "name": "Pampanga" - }, - { - "code": "PAN", - "name": "Pangasinan" - }, - { - "code": "QUE", - "name": "Quezon" - }, - { - "code": "QUI", - "name": "Quirino" - }, - { - "code": "RIZ", - "name": "Rizal" - }, - { - "code": "ROM", - "name": "Romblon" - }, - { - "code": "WSA", - "name": "Samar" - }, - { - "code": "SAR", - "name": "Sarangani" - }, - { - "code": "SIQ", - "name": "Siquijor" - }, - { - "code": "SOR", - "name": "Sorsogon" - }, - { - "code": "SCO", - "name": "South Cotabato" - }, - { - "code": "SLE", - "name": "Southern Leyte" - }, - { - "code": "SUK", - "name": "Sultan Kudarat" - }, - { - "code": "SLU", - "name": "Sulu" - }, - { - "code": "SUN", - "name": "Surigao del Norte" - }, - { - "code": "SUR", - "name": "Surigao del Sur" - }, - { - "code": "TAR", - "name": "Tarlac" - }, - { - "code": "TAW", - "name": "Tawi-Tawi" - }, - { - "code": "ZMB", - "name": "Zambales" - }, - { - "code": "ZAN", - "name": "Zamboanga del Norte" - }, - { - "code": "ZAS", - "name": "Zamboanga del Sur" - }, - { - "code": "ZSI", - "name": "Zamboanga Sibugay" - }, - { - "code": "00", - "name": "Metro Manila" - } - ] + "states": expect.arrayContaining([]) }, { "code": "PK", @@ -4479,39 +1274,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "JK", - "name": "Azad Kashmir" - }, - { - "code": "BA", - "name": "Balochistan" - }, - { - "code": "TA", - "name": "FATA" - }, - { - "code": "GB", - "name": "Gilgit Baltistan" - }, - { - "code": "IS", - "name": "Islamabad Capital Territory" - }, - { - "code": "KP", - "name": "Khyber Pakhtunkhwa" - }, - { - "code": "PB", - "name": "Punjab" - }, - { - "code": "SD", - "name": "Sindh" - } - ] + "states": expect.arrayContaining([]) }, { "code": "PS", @@ -4583,315 +1346,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "TH-37", - "name": "Amnat Charoen" - }, - { - "code": "TH-15", - "name": "Ang Thong" - }, - { - "code": "TH-14", - "name": "Ayutthaya" - }, - { - "code": "TH-10", - "name": "Bangkok" - }, - { - "code": "TH-38", - "name": "Bueng Kan" - }, - { - "code": "TH-31", - "name": "Buri Ram" - }, - { - "code": "TH-24", - "name": "Chachoengsao" - }, - { - "code": "TH-18", - "name": "Chai Nat" - }, - { - "code": "TH-36", - "name": "Chaiyaphum" - }, - { - "code": "TH-22", - "name": "Chanthaburi" - }, - { - "code": "TH-50", - "name": "Chiang Mai" - }, - { - "code": "TH-57", - "name": "Chiang Rai" - }, - { - "code": "TH-20", - "name": "Chonburi" - }, - { - "code": "TH-86", - "name": "Chumphon" - }, - { - "code": "TH-46", - "name": "Kalasin" - }, - { - "code": "TH-62", - "name": "Kamphaeng Phet" - }, - { - "code": "TH-71", - "name": "Kanchanaburi" - }, - { - "code": "TH-40", - "name": "Khon Kaen" - }, - { - "code": "TH-81", - "name": "Krabi" - }, - { - "code": "TH-52", - "name": "Lampang" - }, - { - "code": "TH-51", - "name": "Lamphun" - }, - { - "code": "TH-42", - "name": "Loei" - }, - { - "code": "TH-16", - "name": "Lopburi" - }, - { - "code": "TH-58", - "name": "Mae Hong Son" - }, - { - "code": "TH-44", - "name": "Maha Sarakham" - }, - { - "code": "TH-49", - "name": "Mukdahan" - }, - { - "code": "TH-26", - "name": "Nakhon Nayok" - }, - { - "code": "TH-73", - "name": "Nakhon Pathom" - }, - { - "code": "TH-48", - "name": "Nakhon Phanom" - }, - { - "code": "TH-30", - "name": "Nakhon Ratchasima" - }, - { - "code": "TH-60", - "name": "Nakhon Sawan" - }, - { - "code": "TH-80", - "name": "Nakhon Si Thammarat" - }, - { - "code": "TH-55", - "name": "Nan" - }, - { - "code": "TH-96", - "name": "Narathiwat" - }, - { - "code": "TH-39", - "name": "Nong Bua Lam Phu" - }, - { - "code": "TH-43", - "name": "Nong Khai" - }, - { - "code": "TH-12", - "name": "Nonthaburi" - }, - { - "code": "TH-13", - "name": "Pathum Thani" - }, - { - "code": "TH-94", - "name": "Pattani" - }, - { - "code": "TH-82", - "name": "Phang Nga" - }, - { - "code": "TH-93", - "name": "Phatthalung" - }, - { - "code": "TH-56", - "name": "Phayao" - }, - { - "code": "TH-67", - "name": "Phetchabun" - }, - { - "code": "TH-76", - "name": "Phetchaburi" - }, - { - "code": "TH-66", - "name": "Phichit" - }, - { - "code": "TH-65", - "name": "Phitsanulok" - }, - { - "code": "TH-54", - "name": "Phrae" - }, - { - "code": "TH-83", - "name": "Phuket" - }, - { - "code": "TH-25", - "name": "Prachin Buri" - }, - { - "code": "TH-77", - "name": "Prachuap Khiri Khan" - }, - { - "code": "TH-85", - "name": "Ranong" - }, - { - "code": "TH-70", - "name": "Ratchaburi" - }, - { - "code": "TH-21", - "name": "Rayong" - }, - { - "code": "TH-45", - "name": "Roi Et" - }, - { - "code": "TH-27", - "name": "Sa Kaeo" - }, - { - "code": "TH-47", - "name": "Sakon Nakhon" - }, - { - "code": "TH-11", - "name": "Samut Prakan" - }, - { - "code": "TH-74", - "name": "Samut Sakhon" - }, - { - "code": "TH-75", - "name": "Samut Songkhram" - }, - { - "code": "TH-19", - "name": "Saraburi" - }, - { - "code": "TH-91", - "name": "Satun" - }, - { - "code": "TH-17", - "name": "Sing Buri" - }, - { - "code": "TH-33", - "name": "Sisaket" - }, - { - "code": "TH-90", - "name": "Songkhla" - }, - { - "code": "TH-64", - "name": "Sukhothai" - }, - { - "code": "TH-72", - "name": "Suphan Buri" - }, - { - "code": "TH-84", - "name": "Surat Thani" - }, - { - "code": "TH-32", - "name": "Surin" - }, - { - "code": "TH-63", - "name": "Tak" - }, - { - "code": "TH-92", - "name": "Trang" - }, - { - "code": "TH-23", - "name": "Trat" - }, - { - "code": "TH-34", - "name": "Ubon Ratchathani" - }, - { - "code": "TH-41", - "name": "Udon Thani" - }, - { - "code": "TH-61", - "name": "Uthai Thani" - }, - { - "code": "TH-53", - "name": "Uttaradit" - }, - { - "code": "TH-95", - "name": "Yala" - }, - { - "code": "TH-35", - "name": "Yasothon" - } - ] + "states": expect.arrayContaining([]) }, { "code": "TJ", @@ -5007,55 +1462,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "AL-01", - "name": "Berat" - }, - { - "code": "AL-09", - "name": "Dibër" - }, - { - "code": "AL-02", - "name": "Durrës" - }, - { - "code": "AL-03", - "name": "Elbasan" - }, - { - "code": "AL-04", - "name": "Fier" - }, - { - "code": "AL-05", - "name": "Gjirokastër" - }, - { - "code": "AL-06", - "name": "Korçë" - }, - { - "code": "AL-07", - "name": "Kukës" - }, - { - "code": "AL-08", - "name": "Lezhë" - }, - { - "code": "AL-10", - "name": "Shkodër" - }, - { - "code": "AL-11", - "name": "Tirana" - }, - { - "code": "AL-12", - "name": "Vlorë" - } - ] + "states": expect.arrayContaining([]) }, { "code": "AT", @@ -5115,119 +1522,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "BG-01", - "name": "Blagoevgrad" - }, - { - "code": "BG-02", - "name": "Burgas" - }, - { - "code": "BG-08", - "name": "Dobrich" - }, - { - "code": "BG-07", - "name": "Gabrovo" - }, - { - "code": "BG-26", - "name": "Haskovo" - }, - { - "code": "BG-09", - "name": "Kardzhali" - }, - { - "code": "BG-10", - "name": "Kyustendil" - }, - { - "code": "BG-11", - "name": "Lovech" - }, - { - "code": "BG-12", - "name": "Montana" - }, - { - "code": "BG-13", - "name": "Pazardzhik" - }, - { - "code": "BG-14", - "name": "Pernik" - }, - { - "code": "BG-15", - "name": "Pleven" - }, - { - "code": "BG-16", - "name": "Plovdiv" - }, - { - "code": "BG-17", - "name": "Razgrad" - }, - { - "code": "BG-18", - "name": "Ruse" - }, - { - "code": "BG-27", - "name": "Shumen" - }, - { - "code": "BG-19", - "name": "Silistra" - }, - { - "code": "BG-20", - "name": "Sliven" - }, - { - "code": "BG-21", - "name": "Smolyan" - }, - { - "code": "BG-23", - "name": "Sofia District" - }, - { - "code": "BG-22", - "name": "Sofia" - }, - { - "code": "BG-24", - "name": "Stara Zagora" - }, - { - "code": "BG-25", - "name": "Targovishte" - }, - { - "code": "BG-03", - "name": "Varna" - }, - { - "code": "BG-04", - "name": "Veliko Tarnovo" - }, - { - "code": "BG-05", - "name": "Vidin" - }, - { - "code": "BG-06", - "name": "Vratsa" - }, - { - "code": "BG-28", - "name": "Yambol" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BY", @@ -5251,111 +1546,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": "'", "weight_unit": "kg", - "states": [{ - "code": "AG", - "name": "Aargau" - }, - { - "code": "AR", - "name": "Appenzell Ausserrhoden" - }, - { - "code": "AI", - "name": "Appenzell Innerrhoden" - }, - { - "code": "BL", - "name": "Basel-Landschaft" - }, - { - "code": "BS", - "name": "Basel-Stadt" - }, - { - "code": "BE", - "name": "Bern" - }, - { - "code": "FR", - "name": "Fribourg" - }, - { - "code": "GE", - "name": "Geneva" - }, - { - "code": "GL", - "name": "Glarus" - }, - { - "code": "GR", - "name": "Graubünden" - }, - { - "code": "JU", - "name": "Jura" - }, - { - "code": "LU", - "name": "Luzern" - }, - { - "code": "NE", - "name": "Neuchâtel" - }, - { - "code": "NW", - "name": "Nidwalden" - }, - { - "code": "OW", - "name": "Obwalden" - }, - { - "code": "SH", - "name": "Schaffhausen" - }, - { - "code": "SZ", - "name": "Schwyz" - }, - { - "code": "SO", - "name": "Solothurn" - }, - { - "code": "SG", - "name": "St. Gallen" - }, - { - "code": "TG", - "name": "Thurgau" - }, - { - "code": "TI", - "name": "Ticino" - }, - { - "code": "UR", - "name": "Uri" - }, - { - "code": "VS", - "name": "Valais" - }, - { - "code": "VD", - "name": "Vaud" - }, - { - "code": "ZG", - "name": "Zug" - }, - { - "code": "ZH", - "name": "Zürich" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CZ", @@ -5379,71 +1570,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "DE-BW", - "name": "Baden-Württemberg" - }, - { - "code": "DE-BY", - "name": "Bavaria" - }, - { - "code": "DE-BE", - "name": "Berlin" - }, - { - "code": "DE-BB", - "name": "Brandenburg" - }, - { - "code": "DE-HB", - "name": "Bremen" - }, - { - "code": "DE-HH", - "name": "Hamburg" - }, - { - "code": "DE-HE", - "name": "Hesse" - }, - { - "code": "DE-MV", - "name": "Mecklenburg-Vorpommern" - }, - { - "code": "DE-NI", - "name": "Lower Saxony" - }, - { - "code": "DE-NW", - "name": "North Rhine-Westphalia" - }, - { - "code": "DE-RP", - "name": "Rhineland-Palatinate" - }, - { - "code": "DE-SL", - "name": "Saarland" - }, - { - "code": "DE-SN", - "name": "Saxony" - }, - { - "code": "DE-ST", - "name": "Saxony-Anhalt" - }, - { - "code": "DE-SH", - "name": "Schleswig-Holstein" - }, - { - "code": "DE-TH", - "name": "Thuringia" - } - ] + "states": expect.arrayContaining([]) }, { "code": "DK", @@ -5479,215 +1606,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "C", - "name": "A Coruña" - }, - { - "code": "VI", - "name": "Araba/Álava" - }, - { - "code": "AB", - "name": "Albacete" - }, - { - "code": "A", - "name": "Alicante" - }, - { - "code": "AL", - "name": "Almería" - }, - { - "code": "O", - "name": "Asturias" - }, - { - "code": "AV", - "name": "Ávila" - }, - { - "code": "BA", - "name": "Badajoz" - }, - { - "code": "PM", - "name": "Baleares" - }, - { - "code": "B", - "name": "Barcelona" - }, - { - "code": "BU", - "name": "Burgos" - }, - { - "code": "CC", - "name": "Cáceres" - }, - { - "code": "CA", - "name": "Cádiz" - }, - { - "code": "S", - "name": "Cantabria" - }, - { - "code": "CS", - "name": "Castellón" - }, - { - "code": "CE", - "name": "Ceuta" - }, - { - "code": "CR", - "name": "Ciudad Real" - }, - { - "code": "CO", - "name": "Córdoba" - }, - { - "code": "CU", - "name": "Cuenca" - }, - { - "code": "GI", - "name": "Girona" - }, - { - "code": "GR", - "name": "Granada" - }, - { - "code": "GU", - "name": "Guadalajara" - }, - { - "code": "SS", - "name": "Gipuzkoa" - }, - { - "code": "H", - "name": "Huelva" - }, - { - "code": "HU", - "name": "Huesca" - }, - { - "code": "J", - "name": "Jaén" - }, - { - "code": "LO", - "name": "La Rioja" - }, - { - "code": "GC", - "name": "Las Palmas" - }, - { - "code": "LE", - "name": "León" - }, - { - "code": "L", - "name": "Lleida" - }, - { - "code": "LU", - "name": "Lugo" - }, - { - "code": "M", - "name": "Madrid" - }, - { - "code": "MA", - "name": "Málaga" - }, - { - "code": "ML", - "name": "Melilla" - }, - { - "code": "MU", - "name": "Murcia" - }, - { - "code": "NA", - "name": "Navarra" - }, - { - "code": "OR", - "name": "Ourense" - }, - { - "code": "P", - "name": "Palencia" - }, - { - "code": "PO", - "name": "Pontevedra" - }, - { - "code": "SA", - "name": "Salamanca" - }, - { - "code": "TF", - "name": "Santa Cruz de Tenerife" - }, - { - "code": "SG", - "name": "Segovia" - }, - { - "code": "SE", - "name": "Sevilla" - }, - { - "code": "SO", - "name": "Soria" - }, - { - "code": "T", - "name": "Tarragona" - }, - { - "code": "TE", - "name": "Teruel" - }, - { - "code": "TO", - "name": "Toledo" - }, - { - "code": "V", - "name": "Valencia" - }, - { - "code": "VA", - "name": "Valladolid" - }, - { - "code": "BI", - "name": "Biscay" - }, - { - "code": "ZA", - "name": "Zamora" - }, - { - "code": "Z", - "name": "Zaragoza" - } - ] + "states": expect.arrayContaining([]) }, { "code": "FI", @@ -5771,59 +1690,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "I", - "name": "Attica" - }, - { - "code": "A", - "name": "East Macedonia and Thrace" - }, - { - "code": "B", - "name": "Central Macedonia" - }, - { - "code": "C", - "name": "West Macedonia" - }, - { - "code": "D", - "name": "Epirus" - }, - { - "code": "E", - "name": "Thessaly" - }, - { - "code": "F", - "name": "Ionian Islands" - }, - { - "code": "G", - "name": "West Greece" - }, - { - "code": "H", - "name": "Central Greece" - }, - { - "code": "J", - "name": "Peloponnese" - }, - { - "code": "K", - "name": "North Aegean" - }, - { - "code": "L", - "name": "South Aegean" - }, - { - "code": "M", - "name": "Crete" - } - ] + "states": expect.arrayContaining([]) }, { "code": "HR", @@ -5847,87 +1714,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "BK", - "name": "Bács-Kiskun" - }, - { - "code": "BE", - "name": "Békés" - }, - { - "code": "BA", - "name": "Baranya" - }, - { - "code": "BZ", - "name": "Borsod-Abaúj-Zemplén" - }, - { - "code": "BU", - "name": "Budapest" - }, - { - "code": "CS", - "name": "Csongrád-Csanád" - }, - { - "code": "FE", - "name": "Fejér" - }, - { - "code": "GS", - "name": "Győr-Moson-Sopron" - }, - { - "code": "HB", - "name": "Hajdú-Bihar" - }, - { - "code": "HE", - "name": "Heves" - }, - { - "code": "JN", - "name": "Jász-Nagykun-Szolnok" - }, - { - "code": "KE", - "name": "Komárom-Esztergom" - }, - { - "code": "NO", - "name": "Nógrád" - }, - { - "code": "PE", - "name": "Pest" - }, - { - "code": "SO", - "name": "Somogy" - }, - { - "code": "SZ", - "name": "Szabolcs-Szatmár-Bereg" - }, - { - "code": "TO", - "name": "Tolna" - }, - { - "code": "VA", - "name": "Vas" - }, - { - "code": "VE", - "name": "Veszprém" - }, - { - "code": "ZA", - "name": "Zala" - } - ] + "states": expect.arrayContaining([]) }, { "code": "IE", @@ -5939,111 +1726,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "CW", - "name": "Carlow" - }, - { - "code": "CN", - "name": "Cavan" - }, - { - "code": "CE", - "name": "Clare" - }, - { - "code": "CO", - "name": "Cork" - }, - { - "code": "DL", - "name": "Donegal" - }, - { - "code": "D", - "name": "Dublin" - }, - { - "code": "G", - "name": "Galway" - }, - { - "code": "KY", - "name": "Kerry" - }, - { - "code": "KE", - "name": "Kildare" - }, - { - "code": "KK", - "name": "Kilkenny" - }, - { - "code": "LS", - "name": "Laois" - }, - { - "code": "LM", - "name": "Leitrim" - }, - { - "code": "LK", - "name": "Limerick" - }, - { - "code": "LD", - "name": "Longford" - }, - { - "code": "LH", - "name": "Louth" - }, - { - "code": "MO", - "name": "Mayo" - }, - { - "code": "MH", - "name": "Meath" - }, - { - "code": "MN", - "name": "Monaghan" - }, - { - "code": "OY", - "name": "Offaly" - }, - { - "code": "RN", - "name": "Roscommon" - }, - { - "code": "SO", - "name": "Sligo" - }, - { - "code": "TA", - "name": "Tipperary" - }, - { - "code": "WD", - "name": "Waterford" - }, - { - "code": "WH", - "name": "Westmeath" - }, - { - "code": "WX", - "name": "Wexford" - }, - { - "code": "WW", - "name": "Wicklow" - } - ] + "states": expect.arrayContaining([]) }, { "code": "IM", @@ -6079,435 +1762,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AG", - "name": "Agrigento" - }, - { - "code": "AL", - "name": "Alessandria" - }, - { - "code": "AN", - "name": "Ancona" - }, - { - "code": "AO", - "name": "Aosta" - }, - { - "code": "AR", - "name": "Arezzo" - }, - { - "code": "AP", - "name": "Ascoli Piceno" - }, - { - "code": "AT", - "name": "Asti" - }, - { - "code": "AV", - "name": "Avellino" - }, - { - "code": "BA", - "name": "Bari" - }, - { - "code": "BT", - "name": "Barletta-Andria-Trani" - }, - { - "code": "BL", - "name": "Belluno" - }, - { - "code": "BN", - "name": "Benevento" - }, - { - "code": "BG", - "name": "Bergamo" - }, - { - "code": "BI", - "name": "Biella" - }, - { - "code": "BO", - "name": "Bologna" - }, - { - "code": "BZ", - "name": "Bolzano" - }, - { - "code": "BS", - "name": "Brescia" - }, - { - "code": "BR", - "name": "Brindisi" - }, - { - "code": "CA", - "name": "Cagliari" - }, - { - "code": "CL", - "name": "Caltanissetta" - }, - { - "code": "CB", - "name": "Campobasso" - }, - { - "code": "CE", - "name": "Caserta" - }, - { - "code": "CT", - "name": "Catania" - }, - { - "code": "CZ", - "name": "Catanzaro" - }, - { - "code": "CH", - "name": "Chieti" - }, - { - "code": "CO", - "name": "Como" - }, - { - "code": "CS", - "name": "Cosenza" - }, - { - "code": "CR", - "name": "Cremona" - }, - { - "code": "KR", - "name": "Crotone" - }, - { - "code": "CN", - "name": "Cuneo" - }, - { - "code": "EN", - "name": "Enna" - }, - { - "code": "FM", - "name": "Fermo" - }, - { - "code": "FE", - "name": "Ferrara" - }, - { - "code": "FI", - "name": "Firenze" - }, - { - "code": "FG", - "name": "Foggia" - }, - { - "code": "FC", - "name": "Forlì-Cesena" - }, - { - "code": "FR", - "name": "Frosinone" - }, - { - "code": "GE", - "name": "Genova" - }, - { - "code": "GO", - "name": "Gorizia" - }, - { - "code": "GR", - "name": "Grosseto" - }, - { - "code": "IM", - "name": "Imperia" - }, - { - "code": "IS", - "name": "Isernia" - }, - { - "code": "SP", - "name": "La Spezia" - }, - { - "code": "AQ", - "name": "L'Aquila" - }, - { - "code": "LT", - "name": "Latina" - }, - { - "code": "LE", - "name": "Lecce" - }, - { - "code": "LC", - "name": "Lecco" - }, - { - "code": "LI", - "name": "Livorno" - }, - { - "code": "LO", - "name": "Lodi" - }, - { - "code": "LU", - "name": "Lucca" - }, - { - "code": "MC", - "name": "Macerata" - }, - { - "code": "MN", - "name": "Mantova" - }, - { - "code": "MS", - "name": "Massa-Carrara" - }, - { - "code": "MT", - "name": "Matera" - }, - { - "code": "ME", - "name": "Messina" - }, - { - "code": "MI", - "name": "Milano" - }, - { - "code": "MO", - "name": "Modena" - }, - { - "code": "MB", - "name": "Monza e della Brianza" - }, - { - "code": "NA", - "name": "Napoli" - }, - { - "code": "NO", - "name": "Novara" - }, - { - "code": "NU", - "name": "Nuoro" - }, - { - "code": "OR", - "name": "Oristano" - }, - { - "code": "PD", - "name": "Padova" - }, - { - "code": "PA", - "name": "Palermo" - }, - { - "code": "PR", - "name": "Parma" - }, - { - "code": "PV", - "name": "Pavia" - }, - { - "code": "PG", - "name": "Perugia" - }, - { - "code": "PU", - "name": "Pesaro e Urbino" - }, - { - "code": "PE", - "name": "Pescara" - }, - { - "code": "PC", - "name": "Piacenza" - }, - { - "code": "PI", - "name": "Pisa" - }, - { - "code": "PT", - "name": "Pistoia" - }, - { - "code": "PN", - "name": "Pordenone" - }, - { - "code": "PZ", - "name": "Potenza" - }, - { - "code": "PO", - "name": "Prato" - }, - { - "code": "RG", - "name": "Ragusa" - }, - { - "code": "RA", - "name": "Ravenna" - }, - { - "code": "RC", - "name": "Reggio Calabria" - }, - { - "code": "RE", - "name": "Reggio Emilia" - }, - { - "code": "RI", - "name": "Rieti" - }, - { - "code": "RN", - "name": "Rimini" - }, - { - "code": "RM", - "name": "Roma" - }, - { - "code": "RO", - "name": "Rovigo" - }, - { - "code": "SA", - "name": "Salerno" - }, - { - "code": "SS", - "name": "Sassari" - }, - { - "code": "SV", - "name": "Savona" - }, - { - "code": "SI", - "name": "Siena" - }, - { - "code": "SR", - "name": "Siracusa" - }, - { - "code": "SO", - "name": "Sondrio" - }, - { - "code": "SU", - "name": "Sud Sardegna" - }, - { - "code": "TA", - "name": "Taranto" - }, - { - "code": "TE", - "name": "Teramo" - }, - { - "code": "TR", - "name": "Terni" - }, - { - "code": "TO", - "name": "Torino" - }, - { - "code": "TP", - "name": "Trapani" - }, - { - "code": "TN", - "name": "Trento" - }, - { - "code": "TV", - "name": "Treviso" - }, - { - "code": "TS", - "name": "Trieste" - }, - { - "code": "UD", - "name": "Udine" - }, - { - "code": "VA", - "name": "Varese" - }, - { - "code": "VE", - "name": "Venezia" - }, - { - "code": "VB", - "name": "Verbano-Cusio-Ossola" - }, - { - "code": "VC", - "name": "Vercelli" - }, - { - "code": "VR", - "name": "Verona" - }, - { - "code": "VV", - "name": "Vibo Valentia" - }, - { - "code": "VI", - "name": "Vicenza" - }, - { - "code": "VT", - "name": "Viterbo" - } - ] + "states": expect.arrayContaining([]) }, { "code": "JE", @@ -6591,147 +1846,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "C", - "name": "Chișinău" - }, - { - "code": "BL", - "name": "Bălți" - }, - { - "code": "AN", - "name": "Anenii Noi" - }, - { - "code": "BS", - "name": "Basarabeasca" - }, - { - "code": "BR", - "name": "Briceni" - }, - { - "code": "CH", - "name": "Cahul" - }, - { - "code": "CT", - "name": "Cantemir" - }, - { - "code": "CL", - "name": "Călărași" - }, - { - "code": "CS", - "name": "Căușeni" - }, - { - "code": "CM", - "name": "Cimișlia" - }, - { - "code": "CR", - "name": "Criuleni" - }, - { - "code": "DN", - "name": "Dondușeni" - }, - { - "code": "DR", - "name": "Drochia" - }, - { - "code": "DB", - "name": "Dubăsari" - }, - { - "code": "ED", - "name": "Edineț" - }, - { - "code": "FL", - "name": "Fălești" - }, - { - "code": "FR", - "name": "Florești" - }, - { - "code": "GE", - "name": "UTA Găgăuzia" - }, - { - "code": "GL", - "name": "Glodeni" - }, - { - "code": "HN", - "name": "Hîncești" - }, - { - "code": "IL", - "name": "Ialoveni" - }, - { - "code": "LV", - "name": "Leova" - }, - { - "code": "NS", - "name": "Nisporeni" - }, - { - "code": "OC", - "name": "Ocnița" - }, - { - "code": "OR", - "name": "Orhei" - }, - { - "code": "RZ", - "name": "Rezina" - }, - { - "code": "RS", - "name": "Rîșcani" - }, - { - "code": "SG", - "name": "Sîngerei" - }, - { - "code": "SR", - "name": "Soroca" - }, - { - "code": "ST", - "name": "Strășeni" - }, - { - "code": "SD", - "name": "Șoldănești" - }, - { - "code": "SV", - "name": "Ștefan Vodă" - }, - { - "code": "TR", - "name": "Taraclia" - }, - { - "code": "TL", - "name": "Telenești" - }, - { - "code": "UN", - "name": "Ungheni" - } - ] + "states": expect.arrayContaining([]) }, { "code": "ME", @@ -6827,175 +1942,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AB", - "name": "Alba" - }, - { - "code": "AR", - "name": "Arad" - }, - { - "code": "AG", - "name": "Argeș" - }, - { - "code": "BC", - "name": "Bacău" - }, - { - "code": "BH", - "name": "Bihor" - }, - { - "code": "BN", - "name": "Bistrița-Năsăud" - }, - { - "code": "BT", - "name": "Botoșani" - }, - { - "code": "BR", - "name": "Brăila" - }, - { - "code": "BV", - "name": "Brașov" - }, - { - "code": "B", - "name": "București" - }, - { - "code": "BZ", - "name": "Buzău" - }, - { - "code": "CL", - "name": "Călărași" - }, - { - "code": "CS", - "name": "Caraș-Severin" - }, - { - "code": "CJ", - "name": "Cluj" - }, - { - "code": "CT", - "name": "Constanța" - }, - { - "code": "CV", - "name": "Covasna" - }, - { - "code": "DB", - "name": "Dâmbovița" - }, - { - "code": "DJ", - "name": "Dolj" - }, - { - "code": "GL", - "name": "Galați" - }, - { - "code": "GR", - "name": "Giurgiu" - }, - { - "code": "GJ", - "name": "Gorj" - }, - { - "code": "HR", - "name": "Harghita" - }, - { - "code": "HD", - "name": "Hunedoara" - }, - { - "code": "IL", - "name": "Ialomița" - }, - { - "code": "IS", - "name": "Iași" - }, - { - "code": "IF", - "name": "Ilfov" - }, - { - "code": "MM", - "name": "Maramureș" - }, - { - "code": "MH", - "name": "Mehedinți" - }, - { - "code": "MS", - "name": "Mureș" - }, - { - "code": "NT", - "name": "Neamț" - }, - { - "code": "OT", - "name": "Olt" - }, - { - "code": "PH", - "name": "Prahova" - }, - { - "code": "SJ", - "name": "Sălaj" - }, - { - "code": "SM", - "name": "Satu Mare" - }, - { - "code": "SB", - "name": "Sibiu" - }, - { - "code": "SV", - "name": "Suceava" - }, - { - "code": "TR", - "name": "Teleorman" - }, - { - "code": "TM", - "name": "Timiș" - }, - { - "code": "TL", - "name": "Tulcea" - }, - { - "code": "VL", - "name": "Vâlcea" - }, - { - "code": "VS", - "name": "Vaslui" - }, - { - "code": "VN", - "name": "Vrancea" - } - ] + "states": expect.arrayContaining([]) }, { "code": "RS", @@ -7007,135 +1954,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "RS00", - "name": "Belgrade" - }, - { - "code": "RS14", - "name": "Bor" - }, - { - "code": "RS11", - "name": "Braničevo" - }, - { - "code": "RS02", - "name": "Central Banat" - }, - { - "code": "RS10", - "name": "Danube" - }, - { - "code": "RS23", - "name": "Jablanica" - }, - { - "code": "RS09", - "name": "Kolubara" - }, - { - "code": "RS08", - "name": "Mačva" - }, - { - "code": "RS17", - "name": "Morava" - }, - { - "code": "RS20", - "name": "Nišava" - }, - { - "code": "RS01", - "name": "North Bačka" - }, - { - "code": "RS03", - "name": "North Banat" - }, - { - "code": "RS24", - "name": "Pčinja" - }, - { - "code": "RS22", - "name": "Pirot" - }, - { - "code": "RS13", - "name": "Pomoravlje" - }, - { - "code": "RS19", - "name": "Rasina" - }, - { - "code": "RS18", - "name": "Raška" - }, - { - "code": "RS06", - "name": "South Bačka" - }, - { - "code": "RS04", - "name": "South Banat" - }, - { - "code": "RS07", - "name": "Srem" - }, - { - "code": "RS12", - "name": "Šumadija" - }, - { - "code": "RS21", - "name": "Toplica" - }, - { - "code": "RS05", - "name": "West Bačka" - }, - { - "code": "RS15", - "name": "Zaječar" - }, - { - "code": "RS16", - "name": "Zlatibor" - }, - { - "code": "RS25", - "name": "Kosovo" - }, - { - "code": "RS26", - "name": "Peć" - }, - { - "code": "RS27", - "name": "Prizren" - }, - { - "code": "RS28", - "name": "Kosovska Mitrovica" - }, - { - "code": "RS29", - "name": "Kosovo-Pomoravlje" - }, - { - "code": "RSKM", - "name": "Kosovo-Metohija" - }, - { - "code": "RSVO", - "name": "Vojvodina" - } - ] + "states": expect.arrayContaining([]) }, { "code": "RU", @@ -7219,331 +2038,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "TR01", - "name": "Adana" - }, - { - "code": "TR02", - "name": "Adıyaman" - }, - { - "code": "TR03", - "name": "Afyon" - }, - { - "code": "TR04", - "name": "Ağrı" - }, - { - "code": "TR05", - "name": "Amasya" - }, - { - "code": "TR06", - "name": "Ankara" - }, - { - "code": "TR07", - "name": "Antalya" - }, - { - "code": "TR08", - "name": "Artvin" - }, - { - "code": "TR09", - "name": "Aydın" - }, - { - "code": "TR10", - "name": "Balıkesir" - }, - { - "code": "TR11", - "name": "Bilecik" - }, - { - "code": "TR12", - "name": "Bingöl" - }, - { - "code": "TR13", - "name": "Bitlis" - }, - { - "code": "TR14", - "name": "Bolu" - }, - { - "code": "TR15", - "name": "Burdur" - }, - { - "code": "TR16", - "name": "Bursa" - }, - { - "code": "TR17", - "name": "Çanakkale" - }, - { - "code": "TR18", - "name": "Çankırı" - }, - { - "code": "TR19", - "name": "Çorum" - }, - { - "code": "TR20", - "name": "Denizli" - }, - { - "code": "TR21", - "name": "Diyarbakır" - }, - { - "code": "TR22", - "name": "Edirne" - }, - { - "code": "TR23", - "name": "Elazığ" - }, - { - "code": "TR24", - "name": "Erzincan" - }, - { - "code": "TR25", - "name": "Erzurum" - }, - { - "code": "TR26", - "name": "Eskişehir" - }, - { - "code": "TR27", - "name": "Gaziantep" - }, - { - "code": "TR28", - "name": "Giresun" - }, - { - "code": "TR29", - "name": "Gümüşhane" - }, - { - "code": "TR30", - "name": "Hakkari" - }, - { - "code": "TR31", - "name": "Hatay" - }, - { - "code": "TR32", - "name": "Isparta" - }, - { - "code": "TR33", - "name": "İçel" - }, - { - "code": "TR34", - "name": "İstanbul" - }, - { - "code": "TR35", - "name": "İzmir" - }, - { - "code": "TR36", - "name": "Kars" - }, - { - "code": "TR37", - "name": "Kastamonu" - }, - { - "code": "TR38", - "name": "Kayseri" - }, - { - "code": "TR39", - "name": "Kırklareli" - }, - { - "code": "TR40", - "name": "Kırşehir" - }, - { - "code": "TR41", - "name": "Kocaeli" - }, - { - "code": "TR42", - "name": "Konya" - }, - { - "code": "TR43", - "name": "Kütahya" - }, - { - "code": "TR44", - "name": "Malatya" - }, - { - "code": "TR45", - "name": "Manisa" - }, - { - "code": "TR46", - "name": "Kahramanmaraş" - }, - { - "code": "TR47", - "name": "Mardin" - }, - { - "code": "TR48", - "name": "Muğla" - }, - { - "code": "TR49", - "name": "Muş" - }, - { - "code": "TR50", - "name": "Nevşehir" - }, - { - "code": "TR51", - "name": "Niğde" - }, - { - "code": "TR52", - "name": "Ordu" - }, - { - "code": "TR53", - "name": "Rize" - }, - { - "code": "TR54", - "name": "Sakarya" - }, - { - "code": "TR55", - "name": "Samsun" - }, - { - "code": "TR56", - "name": "Siirt" - }, - { - "code": "TR57", - "name": "Sinop" - }, - { - "code": "TR58", - "name": "Sivas" - }, - { - "code": "TR59", - "name": "Tekirdağ" - }, - { - "code": "TR60", - "name": "Tokat" - }, - { - "code": "TR61", - "name": "Trabzon" - }, - { - "code": "TR62", - "name": "Tunceli" - }, - { - "code": "TR63", - "name": "Şanlıurfa" - }, - { - "code": "TR64", - "name": "Uşak" - }, - { - "code": "TR65", - "name": "Van" - }, - { - "code": "TR66", - "name": "Yozgat" - }, - { - "code": "TR67", - "name": "Zonguldak" - }, - { - "code": "TR68", - "name": "Aksaray" - }, - { - "code": "TR69", - "name": "Bayburt" - }, - { - "code": "TR70", - "name": "Karaman" - }, - { - "code": "TR71", - "name": "Kırıkkale" - }, - { - "code": "TR72", - "name": "Batman" - }, - { - "code": "TR73", - "name": "Şırnak" - }, - { - "code": "TR74", - "name": "Bartın" - }, - { - "code": "TR75", - "name": "Ardahan" - }, - { - "code": "TR76", - "name": "Iğdır" - }, - { - "code": "TR77", - "name": "Yalova" - }, - { - "code": "TR78", - "name": "Karabük" - }, - { - "code": "TR79", - "name": "Kilis" - }, - { - "code": "TR80", - "name": "Osmaniye" - }, - { - "code": "TR81", - "name": "Düzce" - } - ] + "states": expect.arrayContaining([]) }, { "code": "UA", @@ -7695,59 +2190,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "AB", - "name": "Alberta" - }, - { - "code": "BC", - "name": "British Columbia" - }, - { - "code": "MB", - "name": "Manitoba" - }, - { - "code": "NB", - "name": "New Brunswick" - }, - { - "code": "NL", - "name": "Newfoundland and Labrador" - }, - { - "code": "NT", - "name": "Northwest Territories" - }, - { - "code": "NS", - "name": "Nova Scotia" - }, - { - "code": "NU", - "name": "Nunavut" - }, - { - "code": "ON", - "name": "Ontario" - }, - { - "code": "PE", - "name": "Prince Edward Island" - }, - { - "code": "QC", - "name": "Quebec" - }, - { - "code": "SK", - "name": "Saskatchewan" - }, - { - "code": "YT", - "name": "Yukon Territory" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CR", @@ -7759,35 +2202,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "CR-A", - "name": "Alajuela" - }, - { - "code": "CR-C", - "name": "Cartago" - }, - { - "code": "CR-G", - "name": "Guanacaste" - }, - { - "code": "CR-H", - "name": "Heredia" - }, - { - "code": "CR-L", - "name": "Limón" - }, - { - "code": "CR-P", - "name": "Puntarenas" - }, - { - "code": "CR-SJ", - "name": "San José" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CU", @@ -7835,175 +2250,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "DO-01", - "name": "Distrito Nacional" - }, - { - "code": "DO-02", - "name": "Azua" - }, - { - "code": "DO-03", - "name": "Baoruco" - }, - { - "code": "DO-04", - "name": "Barahona" - }, - { - "code": "DO-33", - "name": "Cibao Nordeste" - }, - { - "code": "DO-34", - "name": "Cibao Noroeste" - }, - { - "code": "DO-35", - "name": "Cibao Norte" - }, - { - "code": "DO-36", - "name": "Cibao Sur" - }, - { - "code": "DO-05", - "name": "Dajabón" - }, - { - "code": "DO-06", - "name": "Duarte" - }, - { - "code": "DO-08", - "name": "El Seibo" - }, - { - "code": "DO-37", - "name": "El Valle" - }, - { - "code": "DO-07", - "name": "Elías Piña" - }, - { - "code": "DO-38", - "name": "Enriquillo" - }, - { - "code": "DO-09", - "name": "Espaillat" - }, - { - "code": "DO-30", - "name": "Hato Mayor" - }, - { - "code": "DO-19", - "name": "Hermanas Mirabal" - }, - { - "code": "DO-39", - "name": "Higüamo" - }, - { - "code": "DO-10", - "name": "Independencia" - }, - { - "code": "DO-11", - "name": "La Altagracia" - }, - { - "code": "DO-12", - "name": "La Romana" - }, - { - "code": "DO-13", - "name": "La Vega" - }, - { - "code": "DO-14", - "name": "María Trinidad Sánchez" - }, - { - "code": "DO-28", - "name": "Monseñor Nouel" - }, - { - "code": "DO-15", - "name": "Monte Cristi" - }, - { - "code": "DO-29", - "name": "Monte Plata" - }, - { - "code": "DO-40", - "name": "Ozama" - }, - { - "code": "DO-16", - "name": "Pedernales" - }, - { - "code": "DO-17", - "name": "Peravia" - }, - { - "code": "DO-18", - "name": "Puerto Plata" - }, - { - "code": "DO-20", - "name": "Samaná" - }, - { - "code": "DO-21", - "name": "San Cristóbal" - }, - { - "code": "DO-31", - "name": "San José de Ocoa" - }, - { - "code": "DO-22", - "name": "San Juan" - }, - { - "code": "DO-23", - "name": "San Pedro de Macorís" - }, - { - "code": "DO-24", - "name": "Sánchez Ramírez" - }, - { - "code": "DO-25", - "name": "Santiago" - }, - { - "code": "DO-26", - "name": "Santiago Rodríguez" - }, - { - "code": "DO-32", - "name": "Santo Domingo" - }, - { - "code": "DO-41", - "name": "Valdesia" - }, - { - "code": "DO-27", - "name": "Valverde" - }, - { - "code": "DO-42", - "name": "Yuma" - } - ] + "states": expect.arrayContaining([]) }, { "code": "GD", @@ -8051,95 +2298,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "GT-AV", - "name": "Alta Verapaz" - }, - { - "code": "GT-BV", - "name": "Baja Verapaz" - }, - { - "code": "GT-CM", - "name": "Chimaltenango" - }, - { - "code": "GT-CQ", - "name": "Chiquimula" - }, - { - "code": "GT-PR", - "name": "El Progreso" - }, - { - "code": "GT-ES", - "name": "Escuintla" - }, - { - "code": "GT-GU", - "name": "Guatemala" - }, - { - "code": "GT-HU", - "name": "Huehuetenango" - }, - { - "code": "GT-IZ", - "name": "Izabal" - }, - { - "code": "GT-JA", - "name": "Jalapa" - }, - { - "code": "GT-JU", - "name": "Jutiapa" - }, - { - "code": "GT-PE", - "name": "Petén" - }, - { - "code": "GT-QZ", - "name": "Quetzaltenango" - }, - { - "code": "GT-QC", - "name": "Quiché" - }, - { - "code": "GT-RE", - "name": "Retalhuleu" - }, - { - "code": "GT-SA", - "name": "Sacatepéquez" - }, - { - "code": "GT-SM", - "name": "San Marcos" - }, - { - "code": "GT-SR", - "name": "Santa Rosa" - }, - { - "code": "GT-SO", - "name": "Sololá" - }, - { - "code": "GT-SU", - "name": "Suchitepéquez" - }, - { - "code": "GT-TO", - "name": "Totonicapán" - }, - { - "code": "GT-ZA", - "name": "Zacapa" - } - ] + "states": expect.arrayContaining([]) }, { "code": "HN", @@ -8151,79 +2310,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "HN-AT", - "name": "Atlántida" - }, - { - "code": "HN-IB", - "name": "Bay Islands" - }, - { - "code": "HN-CH", - "name": "Choluteca" - }, - { - "code": "HN-CL", - "name": "Colón" - }, - { - "code": "HN-CM", - "name": "Comayagua" - }, - { - "code": "HN-CP", - "name": "Copán" - }, - { - "code": "HN-CR", - "name": "Cortés" - }, - { - "code": "HN-EP", - "name": "El Paraíso" - }, - { - "code": "HN-FM", - "name": "Francisco Morazán" - }, - { - "code": "HN-GD", - "name": "Gracias a Dios" - }, - { - "code": "HN-IN", - "name": "Intibucá" - }, - { - "code": "HN-LE", - "name": "Lempira" - }, - { - "code": "HN-LP", - "name": "La Paz" - }, - { - "code": "HN-OC", - "name": "Ocotepeque" - }, - { - "code": "HN-OL", - "name": "Olancho" - }, - { - "code": "HN-SB", - "name": "Santa Bárbara" - }, - { - "code": "HN-VA", - "name": "Valle" - }, - { - "code": "HN-YO", - "name": "Yoro" - } - ] + "states": expect.arrayContaining([]) }, { "code": "HT", @@ -8247,63 +2334,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "JM-01", - "name": "Kingston" - }, - { - "code": "JM-02", - "name": "Saint Andrew" - }, - { - "code": "JM-03", - "name": "Saint Thomas" - }, - { - "code": "JM-04", - "name": "Portland" - }, - { - "code": "JM-05", - "name": "Saint Mary" - }, - { - "code": "JM-06", - "name": "Saint Ann" - }, - { - "code": "JM-07", - "name": "Trelawny" - }, - { - "code": "JM-08", - "name": "Saint James" - }, - { - "code": "JM-09", - "name": "Hanover" - }, - { - "code": "JM-10", - "name": "Westmoreland" - }, - { - "code": "JM-11", - "name": "Saint Elizabeth" - }, - { - "code": "JM-12", - "name": "Manchester" - }, - { - "code": "JM-13", - "name": "Clarendon" - }, - { - "code": "JM-14", - "name": "Saint Catherine" - } - ] + "states": expect.arrayContaining([]) }, { "code": "KN", @@ -8387,135 +2418,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "DF", - "name": "Ciudad de México" - }, - { - "code": "JA", - "name": "Jalisco" - }, - { - "code": "NL", - "name": "Nuevo León" - }, - { - "code": "AG", - "name": "Aguascalientes" - }, - { - "code": "BC", - "name": "Baja California" - }, - { - "code": "BS", - "name": "Baja California Sur" - }, - { - "code": "CM", - "name": "Campeche" - }, - { - "code": "CS", - "name": "Chiapas" - }, - { - "code": "CH", - "name": "Chihuahua" - }, - { - "code": "CO", - "name": "Coahuila" - }, - { - "code": "CL", - "name": "Colima" - }, - { - "code": "DG", - "name": "Durango" - }, - { - "code": "GT", - "name": "Guanajuato" - }, - { - "code": "GR", - "name": "Guerrero" - }, - { - "code": "HG", - "name": "Hidalgo" - }, - { - "code": "MX", - "name": "Estado de México" - }, - { - "code": "MI", - "name": "Michoacán" - }, - { - "code": "MO", - "name": "Morelos" - }, - { - "code": "NA", - "name": "Nayarit" - }, - { - "code": "OA", - "name": "Oaxaca" - }, - { - "code": "PU", - "name": "Puebla" - }, - { - "code": "QT", - "name": "Querétaro" - }, - { - "code": "QR", - "name": "Quintana Roo" - }, - { - "code": "SL", - "name": "San Luis Potosí" - }, - { - "code": "SI", - "name": "Sinaloa" - }, - { - "code": "SO", - "name": "Sonora" - }, - { - "code": "TB", - "name": "Tabasco" - }, - { - "code": "TM", - "name": "Tamaulipas" - }, - { - "code": "TL", - "name": "Tlaxcala" - }, - { - "code": "VE", - "name": "Veracruz" - }, - { - "code": "YU", - "name": "Yucatán" - }, - { - "code": "ZA", - "name": "Zacatecas" - } - ] + "states": expect.arrayContaining([]) }, { "code": "NI", @@ -8527,75 +2430,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "NI-AN", - "name": "Atlántico Norte" - }, - { - "code": "NI-AS", - "name": "Atlántico Sur" - }, - { - "code": "NI-BO", - "name": "Boaco" - }, - { - "code": "NI-CA", - "name": "Carazo" - }, - { - "code": "NI-CI", - "name": "Chinandega" - }, - { - "code": "NI-CO", - "name": "Chontales" - }, - { - "code": "NI-ES", - "name": "Estelí" - }, - { - "code": "NI-GR", - "name": "Granada" - }, - { - "code": "NI-JI", - "name": "Jinotega" - }, - { - "code": "NI-LE", - "name": "León" - }, - { - "code": "NI-MD", - "name": "Madriz" - }, - { - "code": "NI-MN", - "name": "Managua" - }, - { - "code": "NI-MS", - "name": "Masaya" - }, - { - "code": "NI-MT", - "name": "Matagalpa" - }, - { - "code": "NI-NS", - "name": "Nueva Segovia" - }, - { - "code": "NI-RI", - "name": "Rivas" - }, - { - "code": "NI-SJ", - "name": "Río San Juan" - } - ] + "states": expect.arrayContaining([]) }, { "code": "PA", @@ -8607,59 +2442,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "PA-1", - "name": "Bocas del Toro" - }, - { - "code": "PA-2", - "name": "Coclé" - }, - { - "code": "PA-3", - "name": "Colón" - }, - { - "code": "PA-4", - "name": "Chiriquí" - }, - { - "code": "PA-5", - "name": "Darién" - }, - { - "code": "PA-6", - "name": "Herrera" - }, - { - "code": "PA-7", - "name": "Los Santos" - }, - { - "code": "PA-8", - "name": "Panamá" - }, - { - "code": "PA-9", - "name": "Veraguas" - }, - { - "code": "PA-10", - "name": "West Panamá" - }, - { - "code": "PA-EM", - "name": "Emberá" - }, - { - "code": "PA-KY", - "name": "Guna Yala" - }, - { - "code": "PA-NB", - "name": "Ngöbe-Buglé" - } - ] + "states": expect.arrayContaining([]) }, { "code": "PM", @@ -8695,63 +2478,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "SV-AH", - "name": "Ahuachapán" - }, - { - "code": "SV-CA", - "name": "Cabañas" - }, - { - "code": "SV-CH", - "name": "Chalatenango" - }, - { - "code": "SV-CU", - "name": "Cuscatlán" - }, - { - "code": "SV-LI", - "name": "La Libertad" - }, - { - "code": "SV-MO", - "name": "Morazán" - }, - { - "code": "SV-PA", - "name": "La Paz" - }, - { - "code": "SV-SA", - "name": "Santa Ana" - }, - { - "code": "SV-SM", - "name": "San Miguel" - }, - { - "code": "SV-SO", - "name": "Sonsonate" - }, - { - "code": "SV-SS", - "name": "San Salvador" - }, - { - "code": "SV-SV", - "name": "San Vicente" - }, - { - "code": "SV-UN", - "name": "La Unión" - }, - { - "code": "SV-US", - "name": "Usulután" - } - ] + "states": expect.arrayContaining([]) }, { "code": "SX", @@ -8799,223 +2526,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "oz", - "states": [{ - "code": "AL", - "name": "Alabama" - }, - { - "code": "AK", - "name": "Alaska" - }, - { - "code": "AZ", - "name": "Arizona" - }, - { - "code": "AR", - "name": "Arkansas" - }, - { - "code": "CA", - "name": "California" - }, - { - "code": "CO", - "name": "Colorado" - }, - { - "code": "CT", - "name": "Connecticut" - }, - { - "code": "DE", - "name": "Delaware" - }, - { - "code": "DC", - "name": "District Of Columbia" - }, - { - "code": "FL", - "name": "Florida" - }, - { - "code": "GA", - "name": "Georgia" - }, - { - "code": "HI", - "name": "Hawaii" - }, - { - "code": "ID", - "name": "Idaho" - }, - { - "code": "IL", - "name": "Illinois" - }, - { - "code": "IN", - "name": "Indiana" - }, - { - "code": "IA", - "name": "Iowa" - }, - { - "code": "KS", - "name": "Kansas" - }, - { - "code": "KY", - "name": "Kentucky" - }, - { - "code": "LA", - "name": "Louisiana" - }, - { - "code": "ME", - "name": "Maine" - }, - { - "code": "MD", - "name": "Maryland" - }, - { - "code": "MA", - "name": "Massachusetts" - }, - { - "code": "MI", - "name": "Michigan" - }, - { - "code": "MN", - "name": "Minnesota" - }, - { - "code": "MS", - "name": "Mississippi" - }, - { - "code": "MO", - "name": "Missouri" - }, - { - "code": "MT", - "name": "Montana" - }, - { - "code": "NE", - "name": "Nebraska" - }, - { - "code": "NV", - "name": "Nevada" - }, - { - "code": "NH", - "name": "New Hampshire" - }, - { - "code": "NJ", - "name": "New Jersey" - }, - { - "code": "NM", - "name": "New Mexico" - }, - { - "code": "NY", - "name": "New York" - }, - { - "code": "NC", - "name": "North Carolina" - }, - { - "code": "ND", - "name": "North Dakota" - }, - { - "code": "OH", - "name": "Ohio" - }, - { - "code": "OK", - "name": "Oklahoma" - }, - { - "code": "OR", - "name": "Oregon" - }, - { - "code": "PA", - "name": "Pennsylvania" - }, - { - "code": "RI", - "name": "Rhode Island" - }, - { - "code": "SC", - "name": "South Carolina" - }, - { - "code": "SD", - "name": "South Dakota" - }, - { - "code": "TN", - "name": "Tennessee" - }, - { - "code": "TX", - "name": "Texas" - }, - { - "code": "UT", - "name": "Utah" - }, - { - "code": "VT", - "name": "Vermont" - }, - { - "code": "VA", - "name": "Virginia" - }, - { - "code": "WA", - "name": "Washington" - }, - { - "code": "WV", - "name": "West Virginia" - }, - { - "code": "WI", - "name": "Wisconsin" - }, - { - "code": "WY", - "name": "Wyoming" - }, - { - "code": "AA", - "name": "Armed Forces (AA)" - }, - { - "code": "AE", - "name": "Armed Forces (AE)" - }, - { - "code": "AP", - "name": "Armed Forces (AP)" - } - ] + "states": expect.arrayContaining([]) }, { "code": "VC", @@ -9083,39 +2594,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "ACT", - "name": "Australian Capital Territory" - }, - { - "code": "NSW", - "name": "New South Wales" - }, - { - "code": "NT", - "name": "Northern Territory" - }, - { - "code": "QLD", - "name": "Queensland" - }, - { - "code": "SA", - "name": "South Australia" - }, - { - "code": "TAS", - "name": "Tasmania" - }, - { - "code": "VIC", - "name": "Victoria" - }, - { - "code": "WA", - "name": "Western Australia" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CK", @@ -9367,43 +2846,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": 81, - "name": "Baker Island" - }, - { - "code": 84, - "name": "Howland Island" - }, - { - "code": 86, - "name": "Jarvis Island" - }, - { - "code": 67, - "name": "Johnston Atoll" - }, - { - "code": 89, - "name": "Kingman Reef" - }, - { - "code": 71, - "name": "Midway Atoll" - }, - { - "code": 76, - "name": "Navassa Island" - }, - { - "code": 95, - "name": "Palmyra Atoll" - }, - { - "code": 79, - "name": "Wake Island" - } - ] + "states": expect.arrayContaining([]) }, { "code": "VU", @@ -9459,103 +2902,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "C", - "name": "Ciudad Autónoma de Buenos Aires" - }, - { - "code": "B", - "name": "Buenos Aires" - }, - { - "code": "K", - "name": "Catamarca" - }, - { - "code": "H", - "name": "Chaco" - }, - { - "code": "U", - "name": "Chubut" - }, - { - "code": "X", - "name": "Córdoba" - }, - { - "code": "W", - "name": "Corrientes" - }, - { - "code": "E", - "name": "Entre Ríos" - }, - { - "code": "P", - "name": "Formosa" - }, - { - "code": "Y", - "name": "Jujuy" - }, - { - "code": "L", - "name": "La Pampa" - }, - { - "code": "F", - "name": "La Rioja" - }, - { - "code": "M", - "name": "Mendoza" - }, - { - "code": "N", - "name": "Misiones" - }, - { - "code": "Q", - "name": "Neuquén" - }, - { - "code": "R", - "name": "Río Negro" - }, - { - "code": "A", - "name": "Salta" - }, - { - "code": "J", - "name": "San Juan" - }, - { - "code": "D", - "name": "San Luis" - }, - { - "code": "Z", - "name": "Santa Cruz" - }, - { - "code": "S", - "name": "Santa Fe" - }, - { - "code": "G", - "name": "Santiago del Estero" - }, - { - "code": "V", - "name": "Tierra del Fuego" - }, - { - "code": "T", - "name": "Tucumán" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BO", @@ -9567,43 +2914,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "BO-B", - "name": "Beni" - }, - { - "code": "BO-H", - "name": "Chuquisaca" - }, - { - "code": "BO-C", - "name": "Cochabamba" - }, - { - "code": "BO-L", - "name": "La Paz" - }, - { - "code": "BO-O", - "name": "Oruro" - }, - { - "code": "BO-N", - "name": "Pando" - }, - { - "code": "BO-P", - "name": "Potosí" - }, - { - "code": "BO-S", - "name": "Santa Cruz" - }, - { - "code": "BO-T", - "name": "Tarija" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BR", @@ -9615,115 +2926,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AC", - "name": "Acre" - }, - { - "code": "AL", - "name": "Alagoas" - }, - { - "code": "AP", - "name": "Amapá" - }, - { - "code": "AM", - "name": "Amazonas" - }, - { - "code": "BA", - "name": "Bahia" - }, - { - "code": "CE", - "name": "Ceará" - }, - { - "code": "DF", - "name": "Distrito Federal" - }, - { - "code": "ES", - "name": "Espírito Santo" - }, - { - "code": "GO", - "name": "Goiás" - }, - { - "code": "MA", - "name": "Maranhão" - }, - { - "code": "MT", - "name": "Mato Grosso" - }, - { - "code": "MS", - "name": "Mato Grosso do Sul" - }, - { - "code": "MG", - "name": "Minas Gerais" - }, - { - "code": "PA", - "name": "Pará" - }, - { - "code": "PB", - "name": "Paraíba" - }, - { - "code": "PR", - "name": "Paraná" - }, - { - "code": "PE", - "name": "Pernambuco" - }, - { - "code": "PI", - "name": "Piauí" - }, - { - "code": "RJ", - "name": "Rio de Janeiro" - }, - { - "code": "RN", - "name": "Rio Grande do Norte" - }, - { - "code": "RS", - "name": "Rio Grande do Sul" - }, - { - "code": "RO", - "name": "Rondônia" - }, - { - "code": "RR", - "name": "Roraima" - }, - { - "code": "SC", - "name": "Santa Catarina" - }, - { - "code": "SP", - "name": "São Paulo" - }, - { - "code": "SE", - "name": "Sergipe" - }, - { - "code": "TO", - "name": "Tocantins" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CL", @@ -9735,71 +2938,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "CL-AI", - "name": "Aisén del General Carlos Ibañez del Campo" - }, - { - "code": "CL-AN", - "name": "Antofagasta" - }, - { - "code": "CL-AP", - "name": "Arica y Parinacota" - }, - { - "code": "CL-AR", - "name": "La Araucanía" - }, - { - "code": "CL-AT", - "name": "Atacama" - }, - { - "code": "CL-BI", - "name": "Biobío" - }, - { - "code": "CL-CO", - "name": "Coquimbo" - }, - { - "code": "CL-LI", - "name": "Libertador General Bernardo O'Higgins" - }, - { - "code": "CL-LL", - "name": "Los Lagos" - }, - { - "code": "CL-LR", - "name": "Los Ríos" - }, - { - "code": "CL-MA", - "name": "Magallanes" - }, - { - "code": "CL-ML", - "name": "Maule" - }, - { - "code": "CL-NB", - "name": "Ñuble" - }, - { - "code": "CL-RM", - "name": "Región Metropolitana de Santiago" - }, - { - "code": "CL-TA", - "name": "Tarapacá" - }, - { - "code": "CL-VS", - "name": "Valparaíso" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CO", @@ -9811,139 +2950,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "CO-AMA", - "name": "Amazonas" - }, - { - "code": "CO-ANT", - "name": "Antioquia" - }, - { - "code": "CO-ARA", - "name": "Arauca" - }, - { - "code": "CO-ATL", - "name": "Atlántico" - }, - { - "code": "CO-BOL", - "name": "Bolívar" - }, - { - "code": "CO-BOY", - "name": "Boyacá" - }, - { - "code": "CO-CAL", - "name": "Caldas" - }, - { - "code": "CO-CAQ", - "name": "Caquetá" - }, - { - "code": "CO-CAS", - "name": "Casanare" - }, - { - "code": "CO-CAU", - "name": "Cauca" - }, - { - "code": "CO-CES", - "name": "Cesar" - }, - { - "code": "CO-CHO", - "name": "Chocó" - }, - { - "code": "CO-COR", - "name": "Córdoba" - }, - { - "code": "CO-CUN", - "name": "Cundinamarca" - }, - { - "code": "CO-DC", - "name": "Capital District" - }, - { - "code": "CO-GUA", - "name": "Guainía" - }, - { - "code": "CO-GUV", - "name": "Guaviare" - }, - { - "code": "CO-HUI", - "name": "Huila" - }, - { - "code": "CO-LAG", - "name": "La Guajira" - }, - { - "code": "CO-MAG", - "name": "Magdalena" - }, - { - "code": "CO-MET", - "name": "Meta" - }, - { - "code": "CO-NAR", - "name": "Nariño" - }, - { - "code": "CO-NSA", - "name": "Norte de Santander" - }, - { - "code": "CO-PUT", - "name": "Putumayo" - }, - { - "code": "CO-QUI", - "name": "Quindío" - }, - { - "code": "CO-RIS", - "name": "Risaralda" - }, - { - "code": "CO-SAN", - "name": "Santander" - }, - { - "code": "CO-SAP", - "name": "San Andrés & Providencia" - }, - { - "code": "CO-SUC", - "name": "Sucre" - }, - { - "code": "CO-TOL", - "name": "Tolima" - }, - { - "code": "CO-VAC", - "name": "Valle del Cauca" - }, - { - "code": "CO-VAU", - "name": "Vaupés" - }, - { - "code": "CO-VID", - "name": "Vichada" - } - ] + "states": expect.arrayContaining([]) }, { "code": "EC", @@ -9955,103 +2962,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "EC-A", - "name": "Azuay" - }, - { - "code": "EC-B", - "name": "Bolívar" - }, - { - "code": "EC-F", - "name": "Cañar" - }, - { - "code": "EC-C", - "name": "Carchi" - }, - { - "code": "EC-H", - "name": "Chimborazo" - }, - { - "code": "EC-X", - "name": "Cotopaxi" - }, - { - "code": "EC-O", - "name": "El Oro" - }, - { - "code": "EC-E", - "name": "Esmeraldas" - }, - { - "code": "EC-W", - "name": "Galápagos" - }, - { - "code": "EC-G", - "name": "Guayas" - }, - { - "code": "EC-I", - "name": "Imbabura" - }, - { - "code": "EC-L", - "name": "Loja" - }, - { - "code": "EC-R", - "name": "Los Ríos" - }, - { - "code": "EC-M", - "name": "Manabí" - }, - { - "code": "EC-S", - "name": "Morona-Santiago" - }, - { - "code": "EC-N", - "name": "Napo" - }, - { - "code": "EC-D", - "name": "Orellana" - }, - { - "code": "EC-Y", - "name": "Pastaza" - }, - { - "code": "EC-P", - "name": "Pichincha" - }, - { - "code": "EC-SE", - "name": "Santa Elena" - }, - { - "code": "EC-SD", - "name": "Santo Domingo de los Tsáchilas" - }, - { - "code": "EC-U", - "name": "Sucumbíos" - }, - { - "code": "EC-T", - "name": "Tungurahua" - }, - { - "code": "EC-Z", - "name": "Zamora-Chinchipe" - } - ] + "states": expect.arrayContaining([]) }, { "code": "FK", @@ -10099,111 +3010,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "CAL", - "name": "El Callao" - }, - { - "code": "LMA", - "name": "Municipalidad Metropolitana de Lima" - }, - { - "code": "AMA", - "name": "Amazonas" - }, - { - "code": "ANC", - "name": "Ancash" - }, - { - "code": "APU", - "name": "Apurímac" - }, - { - "code": "ARE", - "name": "Arequipa" - }, - { - "code": "AYA", - "name": "Ayacucho" - }, - { - "code": "CAJ", - "name": "Cajamarca" - }, - { - "code": "CUS", - "name": "Cusco" - }, - { - "code": "HUV", - "name": "Huancavelica" - }, - { - "code": "HUC", - "name": "Huánuco" - }, - { - "code": "ICA", - "name": "Ica" - }, - { - "code": "JUN", - "name": "Junín" - }, - { - "code": "LAL", - "name": "La Libertad" - }, - { - "code": "LAM", - "name": "Lambayeque" - }, - { - "code": "LIM", - "name": "Lima" - }, - { - "code": "LOR", - "name": "Loreto" - }, - { - "code": "MDD", - "name": "Madre de Dios" - }, - { - "code": "MOQ", - "name": "Moquegua" - }, - { - "code": "PAS", - "name": "Pasco" - }, - { - "code": "PIU", - "name": "Piura" - }, - { - "code": "PUN", - "name": "Puno" - }, - { - "code": "SAM", - "name": "San Martín" - }, - { - "code": "TAC", - "name": "Tacna" - }, - { - "code": "TUM", - "name": "Tumbes" - }, - { - "code": "UCA", - "name": "Ucayali" - } - ] + "states": expect.arrayContaining([]) }, { "code": "PY", @@ -10215,79 +3022,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "PY-ASU", - "name": "Asunción" - }, - { - "code": "PY-1", - "name": "Concepción" - }, - { - "code": "PY-2", - "name": "San Pedro" - }, - { - "code": "PY-3", - "name": "Cordillera" - }, - { - "code": "PY-4", - "name": "Guairá" - }, - { - "code": "PY-5", - "name": "Caaguazú" - }, - { - "code": "PY-6", - "name": "Caazapá" - }, - { - "code": "PY-7", - "name": "Itapúa" - }, - { - "code": "PY-8", - "name": "Misiones" - }, - { - "code": "PY-9", - "name": "Paraguarí" - }, - { - "code": "PY-10", - "name": "Alto Paraná" - }, - { - "code": "PY-11", - "name": "Central" - }, - { - "code": "PY-12", - "name": "Ñeembucú" - }, - { - "code": "PY-13", - "name": "Amambay" - }, - { - "code": "PY-14", - "name": "Canindeyú" - }, - { - "code": "PY-15", - "name": "Presidente Hayes" - }, - { - "code": "PY-16", - "name": "Alto Paraguay" - }, - { - "code": "PY-17", - "name": "Boquerón" - } - ] + "states": expect.arrayContaining([]) }, { "code": "SR", @@ -10311,83 +3046,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "UY-AR", - "name": "Artigas" - }, - { - "code": "UY-CA", - "name": "Canelones" - }, - { - "code": "UY-CL", - "name": "Cerro Largo" - }, - { - "code": "UY-CO", - "name": "Colonia" - }, - { - "code": "UY-DU", - "name": "Durazno" - }, - { - "code": "UY-FS", - "name": "Flores" - }, - { - "code": "UY-FD", - "name": "Florida" - }, - { - "code": "UY-LA", - "name": "Lavalleja" - }, - { - "code": "UY-MA", - "name": "Maldonado" - }, - { - "code": "UY-MO", - "name": "Montevideo" - }, - { - "code": "UY-PA", - "name": "Paysandú" - }, - { - "code": "UY-RN", - "name": "Río Negro" - }, - { - "code": "UY-RV", - "name": "Rivera" - }, - { - "code": "UY-RO", - "name": "Rocha" - }, - { - "code": "UY-SA", - "name": "Salto" - }, - { - "code": "UY-SJ", - "name": "San José" - }, - { - "code": "UY-SO", - "name": "Soriano" - }, - { - "code": "UY-TA", - "name": "Tacuarembó" - }, - { - "code": "UY-TT", - "name": "Treinta y Tres" - } - ] + "states": expect.arrayContaining([]) }, { "code": "VE", @@ -10399,107 +3058,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "VE-A", - "name": "Capital" - }, - { - "code": "VE-B", - "name": "Anzoátegui" - }, - { - "code": "VE-C", - "name": "Apure" - }, - { - "code": "VE-D", - "name": "Aragua" - }, - { - "code": "VE-E", - "name": "Barinas" - }, - { - "code": "VE-F", - "name": "Bolívar" - }, - { - "code": "VE-G", - "name": "Carabobo" - }, - { - "code": "VE-H", - "name": "Cojedes" - }, - { - "code": "VE-I", - "name": "Falcón" - }, - { - "code": "VE-J", - "name": "Guárico" - }, - { - "code": "VE-K", - "name": "Lara" - }, - { - "code": "VE-L", - "name": "Mérida" - }, - { - "code": "VE-M", - "name": "Miranda" - }, - { - "code": "VE-N", - "name": "Monagas" - }, - { - "code": "VE-O", - "name": "Nueva Esparta" - }, - { - "code": "VE-P", - "name": "Portuguesa" - }, - { - "code": "VE-R", - "name": "Sucre" - }, - { - "code": "VE-S", - "name": "Táchira" - }, - { - "code": "VE-T", - "name": "Trujillo" - }, - { - "code": "VE-U", - "name": "Yaracuy" - }, - { - "code": "VE-V", - "name": "Zulia" - }, - { - "code": "VE-W", - "name": "Federal Dependencies" - }, - { - "code": "VE-X", - "name": "La Guaira (Vargas)" - }, - { - "code": "VE-Y", - "name": "Delta Amacuro" - }, - { - "code": "VE-Z", - "name": "Amazonas" - } - ] + "states": expect.arrayContaining([]) } ], }) @@ -10542,55 +3101,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "AL-01", - "name": "Berat" - }, - { - "code": "AL-09", - "name": "Dibër" - }, - { - "code": "AL-02", - "name": "Durrës" - }, - { - "code": "AL-03", - "name": "Elbasan" - }, - { - "code": "AL-04", - "name": "Fier" - }, - { - "code": "AL-05", - "name": "Gjirokastër" - }, - { - "code": "AL-06", - "name": "Korçë" - }, - { - "code": "AL-07", - "name": "Kukës" - }, - { - "code": "AL-08", - "name": "Lezhë" - }, - { - "code": "AL-10", - "name": "Shkodër" - }, - { - "code": "AL-11", - "name": "Tirana" - }, - { - "code": "AL-12", - "name": "Vlorë" - } - ] + "states": expect.arrayContaining([]) }, { "code": "AT", @@ -10650,119 +3161,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "BG-01", - "name": "Blagoevgrad" - }, - { - "code": "BG-02", - "name": "Burgas" - }, - { - "code": "BG-08", - "name": "Dobrich" - }, - { - "code": "BG-07", - "name": "Gabrovo" - }, - { - "code": "BG-26", - "name": "Haskovo" - }, - { - "code": "BG-09", - "name": "Kardzhali" - }, - { - "code": "BG-10", - "name": "Kyustendil" - }, - { - "code": "BG-11", - "name": "Lovech" - }, - { - "code": "BG-12", - "name": "Montana" - }, - { - "code": "BG-13", - "name": "Pazardzhik" - }, - { - "code": "BG-14", - "name": "Pernik" - }, - { - "code": "BG-15", - "name": "Pleven" - }, - { - "code": "BG-16", - "name": "Plovdiv" - }, - { - "code": "BG-17", - "name": "Razgrad" - }, - { - "code": "BG-18", - "name": "Ruse" - }, - { - "code": "BG-27", - "name": "Shumen" - }, - { - "code": "BG-19", - "name": "Silistra" - }, - { - "code": "BG-20", - "name": "Sliven" - }, - { - "code": "BG-21", - "name": "Smolyan" - }, - { - "code": "BG-23", - "name": "Sofia District" - }, - { - "code": "BG-22", - "name": "Sofia" - }, - { - "code": "BG-24", - "name": "Stara Zagora" - }, - { - "code": "BG-25", - "name": "Targovishte" - }, - { - "code": "BG-03", - "name": "Varna" - }, - { - "code": "BG-04", - "name": "Veliko Tarnovo" - }, - { - "code": "BG-05", - "name": "Vidin" - }, - { - "code": "BG-06", - "name": "Vratsa" - }, - { - "code": "BG-28", - "name": "Yambol" - } - ] + "states": expect.arrayContaining([]) }, { "code": "BY", @@ -10786,111 +3185,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": "'", "weight_unit": "kg", - "states": [{ - "code": "AG", - "name": "Aargau" - }, - { - "code": "AR", - "name": "Appenzell Ausserrhoden" - }, - { - "code": "AI", - "name": "Appenzell Innerrhoden" - }, - { - "code": "BL", - "name": "Basel-Landschaft" - }, - { - "code": "BS", - "name": "Basel-Stadt" - }, - { - "code": "BE", - "name": "Bern" - }, - { - "code": "FR", - "name": "Fribourg" - }, - { - "code": "GE", - "name": "Geneva" - }, - { - "code": "GL", - "name": "Glarus" - }, - { - "code": "GR", - "name": "Graubünden" - }, - { - "code": "JU", - "name": "Jura" - }, - { - "code": "LU", - "name": "Luzern" - }, - { - "code": "NE", - "name": "Neuchâtel" - }, - { - "code": "NW", - "name": "Nidwalden" - }, - { - "code": "OW", - "name": "Obwalden" - }, - { - "code": "SH", - "name": "Schaffhausen" - }, - { - "code": "SZ", - "name": "Schwyz" - }, - { - "code": "SO", - "name": "Solothurn" - }, - { - "code": "SG", - "name": "St. Gallen" - }, - { - "code": "TG", - "name": "Thurgau" - }, - { - "code": "TI", - "name": "Ticino" - }, - { - "code": "UR", - "name": "Uri" - }, - { - "code": "VS", - "name": "Valais" - }, - { - "code": "VD", - "name": "Vaud" - }, - { - "code": "ZG", - "name": "Zug" - }, - { - "code": "ZH", - "name": "Zürich" - } - ] + "states": expect.arrayContaining([]) }, { "code": "CZ", @@ -10914,71 +3209,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "DE-BW", - "name": "Baden-Württemberg" - }, - { - "code": "DE-BY", - "name": "Bavaria" - }, - { - "code": "DE-BE", - "name": "Berlin" - }, - { - "code": "DE-BB", - "name": "Brandenburg" - }, - { - "code": "DE-HB", - "name": "Bremen" - }, - { - "code": "DE-HH", - "name": "Hamburg" - }, - { - "code": "DE-HE", - "name": "Hesse" - }, - { - "code": "DE-MV", - "name": "Mecklenburg-Vorpommern" - }, - { - "code": "DE-NI", - "name": "Lower Saxony" - }, - { - "code": "DE-NW", - "name": "North Rhine-Westphalia" - }, - { - "code": "DE-RP", - "name": "Rhineland-Palatinate" - }, - { - "code": "DE-SL", - "name": "Saarland" - }, - { - "code": "DE-SN", - "name": "Saxony" - }, - { - "code": "DE-ST", - "name": "Saxony-Anhalt" - }, - { - "code": "DE-SH", - "name": "Schleswig-Holstein" - }, - { - "code": "DE-TH", - "name": "Thuringia" - } - ] + "states": expect.arrayContaining([]) }, { "code": "DK", @@ -11014,215 +3245,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "C", - "name": "A Coruña" - }, - { - "code": "VI", - "name": "Araba/Álava" - }, - { - "code": "AB", - "name": "Albacete" - }, - { - "code": "A", - "name": "Alicante" - }, - { - "code": "AL", - "name": "Almería" - }, - { - "code": "O", - "name": "Asturias" - }, - { - "code": "AV", - "name": "Ávila" - }, - { - "code": "BA", - "name": "Badajoz" - }, - { - "code": "PM", - "name": "Baleares" - }, - { - "code": "B", - "name": "Barcelona" - }, - { - "code": "BU", - "name": "Burgos" - }, - { - "code": "CC", - "name": "Cáceres" - }, - { - "code": "CA", - "name": "Cádiz" - }, - { - "code": "S", - "name": "Cantabria" - }, - { - "code": "CS", - "name": "Castellón" - }, - { - "code": "CE", - "name": "Ceuta" - }, - { - "code": "CR", - "name": "Ciudad Real" - }, - { - "code": "CO", - "name": "Córdoba" - }, - { - "code": "CU", - "name": "Cuenca" - }, - { - "code": "GI", - "name": "Girona" - }, - { - "code": "GR", - "name": "Granada" - }, - { - "code": "GU", - "name": "Guadalajara" - }, - { - "code": "SS", - "name": "Gipuzkoa" - }, - { - "code": "H", - "name": "Huelva" - }, - { - "code": "HU", - "name": "Huesca" - }, - { - "code": "J", - "name": "Jaén" - }, - { - "code": "LO", - "name": "La Rioja" - }, - { - "code": "GC", - "name": "Las Palmas" - }, - { - "code": "LE", - "name": "León" - }, - { - "code": "L", - "name": "Lleida" - }, - { - "code": "LU", - "name": "Lugo" - }, - { - "code": "M", - "name": "Madrid" - }, - { - "code": "MA", - "name": "Málaga" - }, - { - "code": "ML", - "name": "Melilla" - }, - { - "code": "MU", - "name": "Murcia" - }, - { - "code": "NA", - "name": "Navarra" - }, - { - "code": "OR", - "name": "Ourense" - }, - { - "code": "P", - "name": "Palencia" - }, - { - "code": "PO", - "name": "Pontevedra" - }, - { - "code": "SA", - "name": "Salamanca" - }, - { - "code": "TF", - "name": "Santa Cruz de Tenerife" - }, - { - "code": "SG", - "name": "Segovia" - }, - { - "code": "SE", - "name": "Sevilla" - }, - { - "code": "SO", - "name": "Soria" - }, - { - "code": "T", - "name": "Tarragona" - }, - { - "code": "TE", - "name": "Teruel" - }, - { - "code": "TO", - "name": "Toledo" - }, - { - "code": "V", - "name": "Valencia" - }, - { - "code": "VA", - "name": "Valladolid" - }, - { - "code": "BI", - "name": "Biscay" - }, - { - "code": "ZA", - "name": "Zamora" - }, - { - "code": "Z", - "name": "Zaragoza" - } - ] + "states": expect.arrayContaining([]) }, { "code": "FI", @@ -11306,59 +3329,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "I", - "name": "Attica" - }, - { - "code": "A", - "name": "East Macedonia and Thrace" - }, - { - "code": "B", - "name": "Central Macedonia" - }, - { - "code": "C", - "name": "West Macedonia" - }, - { - "code": "D", - "name": "Epirus" - }, - { - "code": "E", - "name": "Thessaly" - }, - { - "code": "F", - "name": "Ionian Islands" - }, - { - "code": "G", - "name": "West Greece" - }, - { - "code": "H", - "name": "Central Greece" - }, - { - "code": "J", - "name": "Peloponnese" - }, - { - "code": "K", - "name": "North Aegean" - }, - { - "code": "L", - "name": "South Aegean" - }, - { - "code": "M", - "name": "Crete" - } - ] + "states": expect.arrayContaining([]) }, { "code": "HR", @@ -11382,87 +3353,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": " ", "weight_unit": "kg", - "states": [{ - "code": "BK", - "name": "Bács-Kiskun" - }, - { - "code": "BE", - "name": "Békés" - }, - { - "code": "BA", - "name": "Baranya" - }, - { - "code": "BZ", - "name": "Borsod-Abaúj-Zemplén" - }, - { - "code": "BU", - "name": "Budapest" - }, - { - "code": "CS", - "name": "Csongrád-Csanád" - }, - { - "code": "FE", - "name": "Fejér" - }, - { - "code": "GS", - "name": "Győr-Moson-Sopron" - }, - { - "code": "HB", - "name": "Hajdú-Bihar" - }, - { - "code": "HE", - "name": "Heves" - }, - { - "code": "JN", - "name": "Jász-Nagykun-Szolnok" - }, - { - "code": "KE", - "name": "Komárom-Esztergom" - }, - { - "code": "NO", - "name": "Nógrád" - }, - { - "code": "PE", - "name": "Pest" - }, - { - "code": "SO", - "name": "Somogy" - }, - { - "code": "SZ", - "name": "Szabolcs-Szatmár-Bereg" - }, - { - "code": "TO", - "name": "Tolna" - }, - { - "code": "VA", - "name": "Vas" - }, - { - "code": "VE", - "name": "Veszprém" - }, - { - "code": "ZA", - "name": "Zala" - } - ] + "states": expect.arrayContaining([]) }, { "code": "IE", @@ -11474,111 +3365,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ",", "weight_unit": "kg", - "states": [{ - "code": "CW", - "name": "Carlow" - }, - { - "code": "CN", - "name": "Cavan" - }, - { - "code": "CE", - "name": "Clare" - }, - { - "code": "CO", - "name": "Cork" - }, - { - "code": "DL", - "name": "Donegal" - }, - { - "code": "D", - "name": "Dublin" - }, - { - "code": "G", - "name": "Galway" - }, - { - "code": "KY", - "name": "Kerry" - }, - { - "code": "KE", - "name": "Kildare" - }, - { - "code": "KK", - "name": "Kilkenny" - }, - { - "code": "LS", - "name": "Laois" - }, - { - "code": "LM", - "name": "Leitrim" - }, - { - "code": "LK", - "name": "Limerick" - }, - { - "code": "LD", - "name": "Longford" - }, - { - "code": "LH", - "name": "Louth" - }, - { - "code": "MO", - "name": "Mayo" - }, - { - "code": "MH", - "name": "Meath" - }, - { - "code": "MN", - "name": "Monaghan" - }, - { - "code": "OY", - "name": "Offaly" - }, - { - "code": "RN", - "name": "Roscommon" - }, - { - "code": "SO", - "name": "Sligo" - }, - { - "code": "TA", - "name": "Tipperary" - }, - { - "code": "WD", - "name": "Waterford" - }, - { - "code": "WH", - "name": "Westmeath" - }, - { - "code": "WX", - "name": "Wexford" - }, - { - "code": "WW", - "name": "Wicklow" - } - ] + "states": expect.arrayContaining([]) }, { "code": "IM", @@ -11614,435 +3401,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AG", - "name": "Agrigento" - }, - { - "code": "AL", - "name": "Alessandria" - }, - { - "code": "AN", - "name": "Ancona" - }, - { - "code": "AO", - "name": "Aosta" - }, - { - "code": "AR", - "name": "Arezzo" - }, - { - "code": "AP", - "name": "Ascoli Piceno" - }, - { - "code": "AT", - "name": "Asti" - }, - { - "code": "AV", - "name": "Avellino" - }, - { - "code": "BA", - "name": "Bari" - }, - { - "code": "BT", - "name": "Barletta-Andria-Trani" - }, - { - "code": "BL", - "name": "Belluno" - }, - { - "code": "BN", - "name": "Benevento" - }, - { - "code": "BG", - "name": "Bergamo" - }, - { - "code": "BI", - "name": "Biella" - }, - { - "code": "BO", - "name": "Bologna" - }, - { - "code": "BZ", - "name": "Bolzano" - }, - { - "code": "BS", - "name": "Brescia" - }, - { - "code": "BR", - "name": "Brindisi" - }, - { - "code": "CA", - "name": "Cagliari" - }, - { - "code": "CL", - "name": "Caltanissetta" - }, - { - "code": "CB", - "name": "Campobasso" - }, - { - "code": "CE", - "name": "Caserta" - }, - { - "code": "CT", - "name": "Catania" - }, - { - "code": "CZ", - "name": "Catanzaro" - }, - { - "code": "CH", - "name": "Chieti" - }, - { - "code": "CO", - "name": "Como" - }, - { - "code": "CS", - "name": "Cosenza" - }, - { - "code": "CR", - "name": "Cremona" - }, - { - "code": "KR", - "name": "Crotone" - }, - { - "code": "CN", - "name": "Cuneo" - }, - { - "code": "EN", - "name": "Enna" - }, - { - "code": "FM", - "name": "Fermo" - }, - { - "code": "FE", - "name": "Ferrara" - }, - { - "code": "FI", - "name": "Firenze" - }, - { - "code": "FG", - "name": "Foggia" - }, - { - "code": "FC", - "name": "Forlì-Cesena" - }, - { - "code": "FR", - "name": "Frosinone" - }, - { - "code": "GE", - "name": "Genova" - }, - { - "code": "GO", - "name": "Gorizia" - }, - { - "code": "GR", - "name": "Grosseto" - }, - { - "code": "IM", - "name": "Imperia" - }, - { - "code": "IS", - "name": "Isernia" - }, - { - "code": "SP", - "name": "La Spezia" - }, - { - "code": "AQ", - "name": "L'Aquila" - }, - { - "code": "LT", - "name": "Latina" - }, - { - "code": "LE", - "name": "Lecce" - }, - { - "code": "LC", - "name": "Lecco" - }, - { - "code": "LI", - "name": "Livorno" - }, - { - "code": "LO", - "name": "Lodi" - }, - { - "code": "LU", - "name": "Lucca" - }, - { - "code": "MC", - "name": "Macerata" - }, - { - "code": "MN", - "name": "Mantova" - }, - { - "code": "MS", - "name": "Massa-Carrara" - }, - { - "code": "MT", - "name": "Matera" - }, - { - "code": "ME", - "name": "Messina" - }, - { - "code": "MI", - "name": "Milano" - }, - { - "code": "MO", - "name": "Modena" - }, - { - "code": "MB", - "name": "Monza e della Brianza" - }, - { - "code": "NA", - "name": "Napoli" - }, - { - "code": "NO", - "name": "Novara" - }, - { - "code": "NU", - "name": "Nuoro" - }, - { - "code": "OR", - "name": "Oristano" - }, - { - "code": "PD", - "name": "Padova" - }, - { - "code": "PA", - "name": "Palermo" - }, - { - "code": "PR", - "name": "Parma" - }, - { - "code": "PV", - "name": "Pavia" - }, - { - "code": "PG", - "name": "Perugia" - }, - { - "code": "PU", - "name": "Pesaro e Urbino" - }, - { - "code": "PE", - "name": "Pescara" - }, - { - "code": "PC", - "name": "Piacenza" - }, - { - "code": "PI", - "name": "Pisa" - }, - { - "code": "PT", - "name": "Pistoia" - }, - { - "code": "PN", - "name": "Pordenone" - }, - { - "code": "PZ", - "name": "Potenza" - }, - { - "code": "PO", - "name": "Prato" - }, - { - "code": "RG", - "name": "Ragusa" - }, - { - "code": "RA", - "name": "Ravenna" - }, - { - "code": "RC", - "name": "Reggio Calabria" - }, - { - "code": "RE", - "name": "Reggio Emilia" - }, - { - "code": "RI", - "name": "Rieti" - }, - { - "code": "RN", - "name": "Rimini" - }, - { - "code": "RM", - "name": "Roma" - }, - { - "code": "RO", - "name": "Rovigo" - }, - { - "code": "SA", - "name": "Salerno" - }, - { - "code": "SS", - "name": "Sassari" - }, - { - "code": "SV", - "name": "Savona" - }, - { - "code": "SI", - "name": "Siena" - }, - { - "code": "SR", - "name": "Siracusa" - }, - { - "code": "SO", - "name": "Sondrio" - }, - { - "code": "SU", - "name": "Sud Sardegna" - }, - { - "code": "TA", - "name": "Taranto" - }, - { - "code": "TE", - "name": "Teramo" - }, - { - "code": "TR", - "name": "Terni" - }, - { - "code": "TO", - "name": "Torino" - }, - { - "code": "TP", - "name": "Trapani" - }, - { - "code": "TN", - "name": "Trento" - }, - { - "code": "TV", - "name": "Treviso" - }, - { - "code": "TS", - "name": "Trieste" - }, - { - "code": "UD", - "name": "Udine" - }, - { - "code": "VA", - "name": "Varese" - }, - { - "code": "VE", - "name": "Venezia" - }, - { - "code": "VB", - "name": "Verbano-Cusio-Ossola" - }, - { - "code": "VC", - "name": "Vercelli" - }, - { - "code": "VR", - "name": "Verona" - }, - { - "code": "VV", - "name": "Vibo Valentia" - }, - { - "code": "VI", - "name": "Vicenza" - }, - { - "code": "VT", - "name": "Viterbo" - } - ] + "states": expect.arrayContaining([]) }, { "code": "JE", @@ -12126,147 +3485,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "C", - "name": "Chișinău" - }, - { - "code": "BL", - "name": "Bălți" - }, - { - "code": "AN", - "name": "Anenii Noi" - }, - { - "code": "BS", - "name": "Basarabeasca" - }, - { - "code": "BR", - "name": "Briceni" - }, - { - "code": "CH", - "name": "Cahul" - }, - { - "code": "CT", - "name": "Cantemir" - }, - { - "code": "CL", - "name": "Călărași" - }, - { - "code": "CS", - "name": "Căușeni" - }, - { - "code": "CM", - "name": "Cimișlia" - }, - { - "code": "CR", - "name": "Criuleni" - }, - { - "code": "DN", - "name": "Dondușeni" - }, - { - "code": "DR", - "name": "Drochia" - }, - { - "code": "DB", - "name": "Dubăsari" - }, - { - "code": "ED", - "name": "Edineț" - }, - { - "code": "FL", - "name": "Fălești" - }, - { - "code": "FR", - "name": "Florești" - }, - { - "code": "GE", - "name": "UTA Găgăuzia" - }, - { - "code": "GL", - "name": "Glodeni" - }, - { - "code": "HN", - "name": "Hîncești" - }, - { - "code": "IL", - "name": "Ialoveni" - }, - { - "code": "LV", - "name": "Leova" - }, - { - "code": "NS", - "name": "Nisporeni" - }, - { - "code": "OC", - "name": "Ocnița" - }, - { - "code": "OR", - "name": "Orhei" - }, - { - "code": "RZ", - "name": "Rezina" - }, - { - "code": "RS", - "name": "Rîșcani" - }, - { - "code": "SG", - "name": "Sîngerei" - }, - { - "code": "SR", - "name": "Soroca" - }, - { - "code": "ST", - "name": "Strășeni" - }, - { - "code": "SD", - "name": "Șoldănești" - }, - { - "code": "SV", - "name": "Ștefan Vodă" - }, - { - "code": "TR", - "name": "Taraclia" - }, - { - "code": "TL", - "name": "Telenești" - }, - { - "code": "UN", - "name": "Ungheni" - } - ] + "states": expect.arrayContaining([]) }, { "code": "ME", @@ -12362,175 +3581,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "AB", - "name": "Alba" - }, - { - "code": "AR", - "name": "Arad" - }, - { - "code": "AG", - "name": "Argeș" - }, - { - "code": "BC", - "name": "Bacău" - }, - { - "code": "BH", - "name": "Bihor" - }, - { - "code": "BN", - "name": "Bistrița-Năsăud" - }, - { - "code": "BT", - "name": "Botoșani" - }, - { - "code": "BR", - "name": "Brăila" - }, - { - "code": "BV", - "name": "Brașov" - }, - { - "code": "B", - "name": "București" - }, - { - "code": "BZ", - "name": "Buzău" - }, - { - "code": "CL", - "name": "Călărași" - }, - { - "code": "CS", - "name": "Caraș-Severin" - }, - { - "code": "CJ", - "name": "Cluj" - }, - { - "code": "CT", - "name": "Constanța" - }, - { - "code": "CV", - "name": "Covasna" - }, - { - "code": "DB", - "name": "Dâmbovița" - }, - { - "code": "DJ", - "name": "Dolj" - }, - { - "code": "GL", - "name": "Galați" - }, - { - "code": "GR", - "name": "Giurgiu" - }, - { - "code": "GJ", - "name": "Gorj" - }, - { - "code": "HR", - "name": "Harghita" - }, - { - "code": "HD", - "name": "Hunedoara" - }, - { - "code": "IL", - "name": "Ialomița" - }, - { - "code": "IS", - "name": "Iași" - }, - { - "code": "IF", - "name": "Ilfov" - }, - { - "code": "MM", - "name": "Maramureș" - }, - { - "code": "MH", - "name": "Mehedinți" - }, - { - "code": "MS", - "name": "Mureș" - }, - { - "code": "NT", - "name": "Neamț" - }, - { - "code": "OT", - "name": "Olt" - }, - { - "code": "PH", - "name": "Prahova" - }, - { - "code": "SJ", - "name": "Sălaj" - }, - { - "code": "SM", - "name": "Satu Mare" - }, - { - "code": "SB", - "name": "Sibiu" - }, - { - "code": "SV", - "name": "Suceava" - }, - { - "code": "TR", - "name": "Teleorman" - }, - { - "code": "TM", - "name": "Timiș" - }, - { - "code": "TL", - "name": "Tulcea" - }, - { - "code": "VL", - "name": "Vâlcea" - }, - { - "code": "VS", - "name": "Vaslui" - }, - { - "code": "VN", - "name": "Vrancea" - } - ] + "states": expect.arrayContaining([]) }, { "code": "RS", @@ -12542,135 +3593,7 @@ test.describe('Data API tests', () => { "num_decimals": 0, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "RS00", - "name": "Belgrade" - }, - { - "code": "RS14", - "name": "Bor" - }, - { - "code": "RS11", - "name": "Braničevo" - }, - { - "code": "RS02", - "name": "Central Banat" - }, - { - "code": "RS10", - "name": "Danube" - }, - { - "code": "RS23", - "name": "Jablanica" - }, - { - "code": "RS09", - "name": "Kolubara" - }, - { - "code": "RS08", - "name": "Mačva" - }, - { - "code": "RS17", - "name": "Morava" - }, - { - "code": "RS20", - "name": "Nišava" - }, - { - "code": "RS01", - "name": "North Bačka" - }, - { - "code": "RS03", - "name": "North Banat" - }, - { - "code": "RS24", - "name": "Pčinja" - }, - { - "code": "RS22", - "name": "Pirot" - }, - { - "code": "RS13", - "name": "Pomoravlje" - }, - { - "code": "RS19", - "name": "Rasina" - }, - { - "code": "RS18", - "name": "Raška" - }, - { - "code": "RS06", - "name": "South Bačka" - }, - { - "code": "RS04", - "name": "South Banat" - }, - { - "code": "RS07", - "name": "Srem" - }, - { - "code": "RS12", - "name": "Šumadija" - }, - { - "code": "RS21", - "name": "Toplica" - }, - { - "code": "RS05", - "name": "West Bačka" - }, - { - "code": "RS15", - "name": "Zaječar" - }, - { - "code": "RS16", - "name": "Zlatibor" - }, - { - "code": "RS25", - "name": "Kosovo" - }, - { - "code": "RS26", - "name": "Peć" - }, - { - "code": "RS27", - "name": "Prizren" - }, - { - "code": "RS28", - "name": "Kosovska Mitrovica" - }, - { - "code": "RS29", - "name": "Kosovo-Pomoravlje" - }, - { - "code": "RSKM", - "name": "Kosovo-Metohija" - }, - { - "code": "RSVO", - "name": "Vojvodina" - } - ] + "states": expect.arrayContaining([]) }, { "code": "RU", @@ -12754,331 +3677,7 @@ test.describe('Data API tests', () => { "num_decimals": 2, "thousand_sep": ".", "weight_unit": "kg", - "states": [{ - "code": "TR01", - "name": "Adana" - }, - { - "code": "TR02", - "name": "Adıyaman" - }, - { - "code": "TR03", - "name": "Afyon" - }, - { - "code": "TR04", - "name": "Ağrı" - }, - { - "code": "TR05", - "name": "Amasya" - }, - { - "code": "TR06", - "name": "Ankara" - }, - { - "code": "TR07", - "name": "Antalya" - }, - { - "code": "TR08", - "name": "Artvin" - }, - { - "code": "TR09", - "name": "Aydın" - }, - { - "code": "TR10", - "name": "Balıkesir" - }, - { - "code": "TR11", - "name": "Bilecik" - }, - { - "code": "TR12", - "name": "Bingöl" - }, - { - "code": "TR13", - "name": "Bitlis" - }, - { - "code": "TR14", - "name": "Bolu" - }, - { - "code": "TR15", - "name": "Burdur" - }, - { - "code": "TR16", - "name": "Bursa" - }, - { - "code": "TR17", - "name": "Çanakkale" - }, - { - "code": "TR18", - "name": "Çankırı" - }, - { - "code": "TR19", - "name": "Çorum" - }, - { - "code": "TR20", - "name": "Denizli" - }, - { - "code": "TR21", - "name": "Diyarbakır" - }, - { - "code": "TR22", - "name": "Edirne" - }, - { - "code": "TR23", - "name": "Elazığ" - }, - { - "code": "TR24", - "name": "Erzincan" - }, - { - "code": "TR25", - "name": "Erzurum" - }, - { - "code": "TR26", - "name": "Eskişehir" - }, - { - "code": "TR27", - "name": "Gaziantep" - }, - { - "code": "TR28", - "name": "Giresun" - }, - { - "code": "TR29", - "name": "Gümüşhane" - }, - { - "code": "TR30", - "name": "Hakkari" - }, - { - "code": "TR31", - "name": "Hatay" - }, - { - "code": "TR32", - "name": "Isparta" - }, - { - "code": "TR33", - "name": "İçel" - }, - { - "code": "TR34", - "name": "İstanbul" - }, - { - "code": "TR35", - "name": "İzmir" - }, - { - "code": "TR36", - "name": "Kars" - }, - { - "code": "TR37", - "name": "Kastamonu" - }, - { - "code": "TR38", - "name": "Kayseri" - }, - { - "code": "TR39", - "name": "Kırklareli" - }, - { - "code": "TR40", - "name": "Kırşehir" - }, - { - "code": "TR41", - "name": "Kocaeli" - }, - { - "code": "TR42", - "name": "Konya" - }, - { - "code": "TR43", - "name": "Kütahya" - }, - { - "code": "TR44", - "name": "Malatya" - }, - { - "code": "TR45", - "name": "Manisa" - }, - { - "code": "TR46", - "name": "Kahramanmaraş" - }, - { - "code": "TR47", - "name": "Mardin" - }, - { - "code": "TR48", - "name": "Muğla" - }, - { - "code": "TR49", - "name": "Muş" - }, - { - "code": "TR50", - "name": "Nevşehir" - }, - { - "code": "TR51", - "name": "Niğde" - }, - { - "code": "TR52", - "name": "Ordu" - }, - { - "code": "TR53", - "name": "Rize" - }, - { - "code": "TR54", - "name": "Sakarya" - }, - { - "code": "TR55", - "name": "Samsun" - }, - { - "code": "TR56", - "name": "Siirt" - }, - { - "code": "TR57", - "name": "Sinop" - }, - { - "code": "TR58", - "name": "Sivas" - }, - { - "code": "TR59", - "name": "Tekirdağ" - }, - { - "code": "TR60", - "name": "Tokat" - }, - { - "code": "TR61", - "name": "Trabzon" - }, - { - "code": "TR62", - "name": "Tunceli" - }, - { - "code": "TR63", - "name": "Şanlıurfa" - }, - { - "code": "TR64", - "name": "Uşak" - }, - { - "code": "TR65", - "name": "Van" - }, - { - "code": "TR66", - "name": "Yozgat" - }, - { - "code": "TR67", - "name": "Zonguldak" - }, - { - "code": "TR68", - "name": "Aksaray" - }, - { - "code": "TR69", - "name": "Bayburt" - }, - { - "code": "TR70", - "name": "Karaman" - }, - { - "code": "TR71", - "name": "Kırıkkale" - }, - { - "code": "TR72", - "name": "Batman" - }, - { - "code": "TR73", - "name": "Şırnak" - }, - { - "code": "TR74", - "name": "Bartın" - }, - { - "code": "TR75", - "name": "Ardahan" - }, - { - "code": "TR76", - "name": "Iğdır" - }, - { - "code": "TR77", - "name": "Yalova" - }, - { - "code": "TR78", - "name": "Karabük" - }, - { - "code": "TR79", - "name": "Kilis" - }, - { - "code": "TR80", - "name": "Osmaniye" - }, - { - "code": "TR81", - "name": "Düzce" - } - ] + "states": expect.arrayContaining([]) }, { "code": "UA", @@ -13109,7 +3708,7 @@ test.describe('Data API tests', () => { ); }); - test('can view all countries', async ({ + test('can view country data', async ({ request }) => { // call API to retrieve all countries @@ -13118,11231 +3717,25 @@ test.describe('Data API tests', () => { expect(response.status()).toEqual(200); expect(Array.isArray(responseJSON)).toBe(true); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AF", - "name": "Afghanistan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AX", - "name": "Åland Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AL", - "name": "Albania", - "states": [{ - "code": "AL-01", - "name": "Berat" - }, - { - "code": "AL-09", - "name": "Dibër" - }, - { - "code": "AL-02", - "name": "Durrës" - }, - { - "code": "AL-03", - "name": "Elbasan" - }, - { - "code": "AL-04", - "name": "Fier" - }, - { - "code": "AL-05", - "name": "Gjirokastër" - }, - { - "code": "AL-06", - "name": "Korçë" - }, - { - "code": "AL-07", - "name": "Kukës" - }, - { - "code": "AL-08", - "name": "Lezhë" - }, - { - "code": "AL-10", - "name": "Shkodër" - }, - { - "code": "AL-11", - "name": "Tirana" - }, - { - "code": "AL-12", - "name": "Vlorë" + // loop through all the countries and validate against the expected data + for (const country of countryCodes) { + const countryData = require(`../../data/countries/${country}.json`); + expect(responseJSON).toEqual(expect.arrayContaining([ + expect.objectContaining({ + "code": countryData.code, + "name": countryData.name, + "states": expect.arrayContaining(countryData.states), + "_links": { + "self": [{ + "href": expect.stringContaining(`/wp-json/wc/v3/data/countries/${country}`) + }], + "collection": [{ + "href": expect.stringContaining('/wp-json/wc/v3/data/countries') + }] } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "DZ", - "name": "Algeria", - "states": [{ - "code": "DZ-01", - "name": "Adrar" - }, - { - "code": "DZ-02", - "name": "Chlef" - }, - { - "code": "DZ-03", - "name": "Laghouat" - }, - { - "code": "DZ-04", - "name": "Oum El Bouaghi" - }, - { - "code": "DZ-05", - "name": "Batna" - }, - { - "code": "DZ-06", - "name": "Béjaïa" - }, - { - "code": "DZ-07", - "name": "Biskra" - }, - { - "code": "DZ-08", - "name": "Béchar" - }, - { - "code": "DZ-09", - "name": "Blida" - }, - { - "code": "DZ-10", - "name": "Bouira" - }, - { - "code": "DZ-11", - "name": "Tamanghasset" - }, - { - "code": "DZ-12", - "name": "Tébessa" - }, - { - "code": "DZ-13", - "name": "Tlemcen" - }, - { - "code": "DZ-14", - "name": "Tiaret" - }, - { - "code": "DZ-15", - "name": "Tizi Ouzou" - }, - { - "code": "DZ-16", - "name": "Algiers" - }, - { - "code": "DZ-17", - "name": "Djelfa" - }, - { - "code": "DZ-18", - "name": "Jijel" - }, - { - "code": "DZ-19", - "name": "Sétif" - }, - { - "code": "DZ-20", - "name": "Saïda" - }, - { - "code": "DZ-21", - "name": "Skikda" - }, - { - "code": "DZ-22", - "name": "Sidi Bel Abbès" - }, - { - "code": "DZ-23", - "name": "Annaba" - }, - { - "code": "DZ-24", - "name": "Guelma" - }, - { - "code": "DZ-25", - "name": "Constantine" - }, - { - "code": "DZ-26", - "name": "Médéa" - }, - { - "code": "DZ-27", - "name": "Mostaganem" - }, - { - "code": "DZ-28", - "name": "M’Sila" - }, - { - "code": "DZ-29", - "name": "Mascara" - }, - { - "code": "DZ-30", - "name": "Ouargla" - }, - { - "code": "DZ-31", - "name": "Oran" - }, - { - "code": "DZ-32", - "name": "El Bayadh" - }, - { - "code": "DZ-33", - "name": "Illizi" - }, - { - "code": "DZ-34", - "name": "Bordj Bou Arréridj" - }, - { - "code": "DZ-35", - "name": "Boumerdès" - }, - { - "code": "DZ-36", - "name": "El Tarf" - }, - { - "code": "DZ-37", - "name": "Tindouf" - }, - { - "code": "DZ-38", - "name": "Tissemsilt" - }, - { - "code": "DZ-39", - "name": "El Oued" - }, - { - "code": "DZ-40", - "name": "Khenchela" - }, - { - "code": "DZ-41", - "name": "Souk Ahras" - }, - { - "code": "DZ-42", - "name": "Tipasa" - }, - { - "code": "DZ-43", - "name": "Mila" - }, - { - "code": "DZ-44", - "name": "Aïn Defla" - }, - { - "code": "DZ-45", - "name": "Naama" - }, - { - "code": "DZ-46", - "name": "Aïn Témouchent" - }, - { - "code": "DZ-47", - "name": "Ghardaïa" - }, - { - "code": "DZ-48", - "name": "Relizane" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AS", - "name": "American Samoa", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AD", - "name": "Andorra", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AO", - "name": "Angola", - "states": [{ - "code": "BGO", - "name": "Bengo" - }, - { - "code": "BLU", - "name": "Benguela" - }, - { - "code": "BIE", - "name": "Bié" - }, - { - "code": "CAB", - "name": "Cabinda" - }, - { - "code": "CNN", - "name": "Cunene" - }, - { - "code": "HUA", - "name": "Huambo" - }, - { - "code": "HUI", - "name": "Huíla" - }, - { - "code": "CCU", - "name": "Kuando Kubango" - }, - { - "code": "CNO", - "name": "Kwanza-Norte" - }, - { - "code": "CUS", - "name": "Kwanza-Sul" - }, - { - "code": "LUA", - "name": "Luanda" - }, - { - "code": "LNO", - "name": "Lunda-Norte" - }, - { - "code": "LSU", - "name": "Lunda-Sul" - }, - { - "code": "MAL", - "name": "Malanje" - }, - { - "code": "MOX", - "name": "Moxico" - }, - { - "code": "NAM", - "name": "Namibe" - }, - { - "code": "UIG", - "name": "Uíge" - }, - { - "code": "ZAI", - "name": "Zaire" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AI", - "name": "Anguilla", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AQ", - "name": "Antarctica", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AG", - "name": "Antigua and Barbuda", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AR", - "name": "Argentina", - "states": [{ - "code": "C", - "name": "Ciudad Autónoma de Buenos Aires" - }, - { - "code": "B", - "name": "Buenos Aires" - }, - { - "code": "K", - "name": "Catamarca" - }, - { - "code": "H", - "name": "Chaco" - }, - { - "code": "U", - "name": "Chubut" - }, - { - "code": "X", - "name": "Córdoba" - }, - { - "code": "W", - "name": "Corrientes" - }, - { - "code": "E", - "name": "Entre Ríos" - }, - { - "code": "P", - "name": "Formosa" - }, - { - "code": "Y", - "name": "Jujuy" - }, - { - "code": "L", - "name": "La Pampa" - }, - { - "code": "F", - "name": "La Rioja" - }, - { - "code": "M", - "name": "Mendoza" - }, - { - "code": "N", - "name": "Misiones" - }, - { - "code": "Q", - "name": "Neuquén" - }, - { - "code": "R", - "name": "Río Negro" - }, - { - "code": "A", - "name": "Salta" - }, - { - "code": "J", - "name": "San Juan" - }, - { - "code": "D", - "name": "San Luis" - }, - { - "code": "Z", - "name": "Santa Cruz" - }, - { - "code": "S", - "name": "Santa Fe" - }, - { - "code": "G", - "name": "Santiago del Estero" - }, - { - "code": "V", - "name": "Tierra del Fuego" - }, - { - "code": "T", - "name": "Tucumán" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AM", - "name": "Armenia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AW", - "name": "Aruba", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AU", - "name": "Australia", - "states": [{ - "code": "ACT", - "name": "Australian Capital Territory" - }, - { - "code": "NSW", - "name": "New South Wales" - }, - { - "code": "NT", - "name": "Northern Territory" - }, - { - "code": "QLD", - "name": "Queensland" - }, - { - "code": "SA", - "name": "South Australia" - }, - { - "code": "TAS", - "name": "Tasmania" - }, - { - "code": "VIC", - "name": "Victoria" - }, - { - "code": "WA", - "name": "Western Australia" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AT", - "name": "Austria", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AZ", - "name": "Azerbaijan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BS", - "name": "Bahamas", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BH", - "name": "Bahrain", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BD", - "name": "Bangladesh", - "states": [{ - "code": "BD-05", - "name": "Bagerhat" - }, - { - "code": "BD-01", - "name": "Bandarban" - }, - { - "code": "BD-02", - "name": "Barguna" - }, - { - "code": "BD-06", - "name": "Barishal" - }, - { - "code": "BD-07", - "name": "Bhola" - }, - { - "code": "BD-03", - "name": "Bogura" - }, - { - "code": "BD-04", - "name": "Brahmanbaria" - }, - { - "code": "BD-09", - "name": "Chandpur" - }, - { - "code": "BD-10", - "name": "Chattogram" - }, - { - "code": "BD-12", - "name": "Chuadanga" - }, - { - "code": "BD-11", - "name": "Cox's Bazar" - }, - { - "code": "BD-08", - "name": "Cumilla" - }, - { - "code": "BD-13", - "name": "Dhaka" - }, - { - "code": "BD-14", - "name": "Dinajpur" - }, - { - "code": "BD-15", - "name": "Faridpur " - }, - { - "code": "BD-16", - "name": "Feni" - }, - { - "code": "BD-19", - "name": "Gaibandha" - }, - { - "code": "BD-18", - "name": "Gazipur" - }, - { - "code": "BD-17", - "name": "Gopalganj" - }, - { - "code": "BD-20", - "name": "Habiganj" - }, - { - "code": "BD-21", - "name": "Jamalpur" - }, - { - "code": "BD-22", - "name": "Jashore" - }, - { - "code": "BD-25", - "name": "Jhalokati" - }, - { - "code": "BD-23", - "name": "Jhenaidah" - }, - { - "code": "BD-24", - "name": "Joypurhat" - }, - { - "code": "BD-29", - "name": "Khagrachhari" - }, - { - "code": "BD-27", - "name": "Khulna" - }, - { - "code": "BD-26", - "name": "Kishoreganj" - }, - { - "code": "BD-28", - "name": "Kurigram" - }, - { - "code": "BD-30", - "name": "Kushtia" - }, - { - "code": "BD-31", - "name": "Lakshmipur" - }, - { - "code": "BD-32", - "name": "Lalmonirhat" - }, - { - "code": "BD-36", - "name": "Madaripur" - }, - { - "code": "BD-37", - "name": "Magura" - }, - { - "code": "BD-33", - "name": "Manikganj " - }, - { - "code": "BD-39", - "name": "Meherpur" - }, - { - "code": "BD-38", - "name": "Moulvibazar" - }, - { - "code": "BD-35", - "name": "Munshiganj" - }, - { - "code": "BD-34", - "name": "Mymensingh" - }, - { - "code": "BD-48", - "name": "Naogaon" - }, - { - "code": "BD-43", - "name": "Narail" - }, - { - "code": "BD-40", - "name": "Narayanganj" - }, - { - "code": "BD-42", - "name": "Narsingdi" - }, - { - "code": "BD-44", - "name": "Natore" - }, - { - "code": "BD-45", - "name": "Nawabganj" - }, - { - "code": "BD-41", - "name": "Netrakona" - }, - { - "code": "BD-46", - "name": "Nilphamari" - }, - { - "code": "BD-47", - "name": "Noakhali" - }, - { - "code": "BD-49", - "name": "Pabna" - }, - { - "code": "BD-52", - "name": "Panchagarh" - }, - { - "code": "BD-51", - "name": "Patuakhali" - }, - { - "code": "BD-50", - "name": "Pirojpur" - }, - { - "code": "BD-53", - "name": "Rajbari" - }, - { - "code": "BD-54", - "name": "Rajshahi" - }, - { - "code": "BD-56", - "name": "Rangamati" - }, - { - "code": "BD-55", - "name": "Rangpur" - }, - { - "code": "BD-58", - "name": "Satkhira" - }, - { - "code": "BD-62", - "name": "Shariatpur" - }, - { - "code": "BD-57", - "name": "Sherpur" - }, - { - "code": "BD-59", - "name": "Sirajganj" - }, - { - "code": "BD-61", - "name": "Sunamganj" - }, - { - "code": "BD-60", - "name": "Sylhet" - }, - { - "code": "BD-63", - "name": "Tangail" - }, - { - "code": "BD-64", - "name": "Thakurgaon" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BB", - "name": "Barbados", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BY", - "name": "Belarus", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PW", - "name": "Belau", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BE", - "name": "Belgium", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BZ", - "name": "Belize", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BJ", - "name": "Benin", - "states": [{ - "code": "AL", - "name": "Alibori" - }, - { - "code": "AK", - "name": "Atakora" - }, - { - "code": "AQ", - "name": "Atlantique" - }, - { - "code": "BO", - "name": "Borgou" - }, - { - "code": "CO", - "name": "Collines" - }, - { - "code": "KO", - "name": "Kouffo" - }, - { - "code": "DO", - "name": "Donga" - }, - { - "code": "LI", - "name": "Littoral" - }, - { - "code": "MO", - "name": "Mono" - }, - { - "code": "OU", - "name": "Ouémé" - }, - { - "code": "PL", - "name": "Plateau" - }, - { - "code": "ZO", - "name": "Zou" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BM", - "name": "Bermuda", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BT", - "name": "Bhutan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BO", - "name": "Bolivia", - "states": [{ - "code": "BO-B", - "name": "Beni" - }, - { - "code": "BO-H", - "name": "Chuquisaca" - }, - { - "code": "BO-C", - "name": "Cochabamba" - }, - { - "code": "BO-L", - "name": "La Paz" - }, - { - "code": "BO-O", - "name": "Oruro" - }, - { - "code": "BO-N", - "name": "Pando" - }, - { - "code": "BO-P", - "name": "Potosí" - }, - { - "code": "BO-S", - "name": "Santa Cruz" - }, - { - "code": "BO-T", - "name": "Tarija" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BQ", - "name": "Bonaire, Saint Eustatius and Saba", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BA", - "name": "Bosnia and Herzegovina", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BW", - "name": "Botswana", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BV", - "name": "Bouvet Island", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BR", - "name": "Brazil", - "states": [{ - "code": "AC", - "name": "Acre" - }, - { - "code": "AL", - "name": "Alagoas" - }, - { - "code": "AP", - "name": "Amapá" - }, - { - "code": "AM", - "name": "Amazonas" - }, - { - "code": "BA", - "name": "Bahia" - }, - { - "code": "CE", - "name": "Ceará" - }, - { - "code": "DF", - "name": "Distrito Federal" - }, - { - "code": "ES", - "name": "Espírito Santo" - }, - { - "code": "GO", - "name": "Goiás" - }, - { - "code": "MA", - "name": "Maranhão" - }, - { - "code": "MT", - "name": "Mato Grosso" - }, - { - "code": "MS", - "name": "Mato Grosso do Sul" - }, - { - "code": "MG", - "name": "Minas Gerais" - }, - { - "code": "PA", - "name": "Pará" - }, - { - "code": "PB", - "name": "Paraíba" - }, - { - "code": "PR", - "name": "Paraná" - }, - { - "code": "PE", - "name": "Pernambuco" - }, - { - "code": "PI", - "name": "Piauí" - }, - { - "code": "RJ", - "name": "Rio de Janeiro" - }, - { - "code": "RN", - "name": "Rio Grande do Norte" - }, - { - "code": "RS", - "name": "Rio Grande do Sul" - }, - { - "code": "RO", - "name": "Rondônia" - }, - { - "code": "RR", - "name": "Roraima" - }, - { - "code": "SC", - "name": "Santa Catarina" - }, - { - "code": "SP", - "name": "São Paulo" - }, - { - "code": "SE", - "name": "Sergipe" - }, - { - "code": "TO", - "name": "Tocantins" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IO", - "name": "British Indian Ocean Territory", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BN", - "name": "Brunei", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BG", - "name": "Bulgaria", - "states": [{ - "code": "BG-01", - "name": "Blagoevgrad" - }, - { - "code": "BG-02", - "name": "Burgas" - }, - { - "code": "BG-08", - "name": "Dobrich" - }, - { - "code": "BG-07", - "name": "Gabrovo" - }, - { - "code": "BG-26", - "name": "Haskovo" - }, - { - "code": "BG-09", - "name": "Kardzhali" - }, - { - "code": "BG-10", - "name": "Kyustendil" - }, - { - "code": "BG-11", - "name": "Lovech" - }, - { - "code": "BG-12", - "name": "Montana" - }, - { - "code": "BG-13", - "name": "Pazardzhik" - }, - { - "code": "BG-14", - "name": "Pernik" - }, - { - "code": "BG-15", - "name": "Pleven" - }, - { - "code": "BG-16", - "name": "Plovdiv" - }, - { - "code": "BG-17", - "name": "Razgrad" - }, - { - "code": "BG-18", - "name": "Ruse" - }, - { - "code": "BG-27", - "name": "Shumen" - }, - { - "code": "BG-19", - "name": "Silistra" - }, - { - "code": "BG-20", - "name": "Sliven" - }, - { - "code": "BG-21", - "name": "Smolyan" - }, - { - "code": "BG-23", - "name": "Sofia District" - }, - { - "code": "BG-22", - "name": "Sofia" - }, - { - "code": "BG-24", - "name": "Stara Zagora" - }, - { - "code": "BG-25", - "name": "Targovishte" - }, - { - "code": "BG-03", - "name": "Varna" - }, - { - "code": "BG-04", - "name": "Veliko Tarnovo" - }, - { - "code": "BG-05", - "name": "Vidin" - }, - { - "code": "BG-06", - "name": "Vratsa" - }, - { - "code": "BG-28", - "name": "Yambol" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BF", - "name": "Burkina Faso", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BI", - "name": "Burundi", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KH", - "name": "Cambodia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CM", - "name": "Cameroon", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CA", - "name": "Canada", - "states": [{ - "code": "AB", - "name": "Alberta" - }, - { - "code": "BC", - "name": "British Columbia" - }, - { - "code": "MB", - "name": "Manitoba" - }, - { - "code": "NB", - "name": "New Brunswick" - }, - { - "code": "NL", - "name": "Newfoundland and Labrador" - }, - { - "code": "NT", - "name": "Northwest Territories" - }, - { - "code": "NS", - "name": "Nova Scotia" - }, - { - "code": "NU", - "name": "Nunavut" - }, - { - "code": "ON", - "name": "Ontario" - }, - { - "code": "PE", - "name": "Prince Edward Island" - }, - { - "code": "QC", - "name": "Quebec" - }, - { - "code": "SK", - "name": "Saskatchewan" - }, - { - "code": "YT", - "name": "Yukon Territory" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CV", - "name": "Cape Verde", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KY", - "name": "Cayman Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CF", - "name": "Central African Republic", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TD", - "name": "Chad", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CL", - "name": "Chile", - "states": [{ - "code": "CL-AI", - "name": "Aisén del General Carlos Ibañez del Campo" - }, - { - "code": "CL-AN", - "name": "Antofagasta" - }, - { - "code": "CL-AP", - "name": "Arica y Parinacota" - }, - { - "code": "CL-AR", - "name": "La Araucanía" - }, - { - "code": "CL-AT", - "name": "Atacama" - }, - { - "code": "CL-BI", - "name": "Biobío" - }, - { - "code": "CL-CO", - "name": "Coquimbo" - }, - { - "code": "CL-LI", - "name": "Libertador General Bernardo O'Higgins" - }, - { - "code": "CL-LL", - "name": "Los Lagos" - }, - { - "code": "CL-LR", - "name": "Los Ríos" - }, - { - "code": "CL-MA", - "name": "Magallanes" - }, - { - "code": "CL-ML", - "name": "Maule" - }, - { - "code": "CL-NB", - "name": "Ñuble" - }, - { - "code": "CL-RM", - "name": "Región Metropolitana de Santiago" - }, - { - "code": "CL-TA", - "name": "Tarapacá" - }, - { - "code": "CL-VS", - "name": "Valparaíso" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CN", - "name": "China", - "states": [{ - "code": "CN1", - "name": "Yunnan / 云南" - }, - { - "code": "CN2", - "name": "Beijing / 北京" - }, - { - "code": "CN3", - "name": "Tianjin / 天津" - }, - { - "code": "CN4", - "name": "Hebei / 河北" - }, - { - "code": "CN5", - "name": "Shanxi / 山西" - }, - { - "code": "CN6", - "name": "Inner Mongolia / 內蒙古" - }, - { - "code": "CN7", - "name": "Liaoning / 辽宁" - }, - { - "code": "CN8", - "name": "Jilin / 吉林" - }, - { - "code": "CN9", - "name": "Heilongjiang / 黑龙江" - }, - { - "code": "CN10", - "name": "Shanghai / 上海" - }, - { - "code": "CN11", - "name": "Jiangsu / 江苏" - }, - { - "code": "CN12", - "name": "Zhejiang / 浙江" - }, - { - "code": "CN13", - "name": "Anhui / 安徽" - }, - { - "code": "CN14", - "name": "Fujian / 福建" - }, - { - "code": "CN15", - "name": "Jiangxi / 江西" - }, - { - "code": "CN16", - "name": "Shandong / 山东" - }, - { - "code": "CN17", - "name": "Henan / 河南" - }, - { - "code": "CN18", - "name": "Hubei / 湖北" - }, - { - "code": "CN19", - "name": "Hunan / 湖南" - }, - { - "code": "CN20", - "name": "Guangdong / 广东" - }, - { - "code": "CN21", - "name": "Guangxi Zhuang / 广西壮族" - }, - { - "code": "CN22", - "name": "Hainan / 海南" - }, - { - "code": "CN23", - "name": "Chongqing / 重庆" - }, - { - "code": "CN24", - "name": "Sichuan / 四川" - }, - { - "code": "CN25", - "name": "Guizhou / 贵州" - }, - { - "code": "CN26", - "name": "Shaanxi / 陕西" - }, - { - "code": "CN27", - "name": "Gansu / 甘肃" - }, - { - "code": "CN28", - "name": "Qinghai / 青海" - }, - { - "code": "CN29", - "name": "Ningxia Hui / 宁夏" - }, - { - "code": "CN30", - "name": "Macao / 澳门" - }, - { - "code": "CN31", - "name": "Tibet / 西藏" - }, - { - "code": "CN32", - "name": "Xinjiang / 新疆" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CX", - "name": "Christmas Island", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CC", - "name": "Cocos (Keeling) Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CO", - "name": "Colombia", - "states": [{ - "code": "CO-AMA", - "name": "Amazonas" - }, - { - "code": "CO-ANT", - "name": "Antioquia" - }, - { - "code": "CO-ARA", - "name": "Arauca" - }, - { - "code": "CO-ATL", - "name": "Atlántico" - }, - { - "code": "CO-BOL", - "name": "Bolívar" - }, - { - "code": "CO-BOY", - "name": "Boyacá" - }, - { - "code": "CO-CAL", - "name": "Caldas" - }, - { - "code": "CO-CAQ", - "name": "Caquetá" - }, - { - "code": "CO-CAS", - "name": "Casanare" - }, - { - "code": "CO-CAU", - "name": "Cauca" - }, - { - "code": "CO-CES", - "name": "Cesar" - }, - { - "code": "CO-CHO", - "name": "Chocó" - }, - { - "code": "CO-COR", - "name": "Córdoba" - }, - { - "code": "CO-CUN", - "name": "Cundinamarca" - }, - { - "code": "CO-DC", - "name": "Capital District" - }, - { - "code": "CO-GUA", - "name": "Guainía" - }, - { - "code": "CO-GUV", - "name": "Guaviare" - }, - { - "code": "CO-HUI", - "name": "Huila" - }, - { - "code": "CO-LAG", - "name": "La Guajira" - }, - { - "code": "CO-MAG", - "name": "Magdalena" - }, - { - "code": "CO-MET", - "name": "Meta" - }, - { - "code": "CO-NAR", - "name": "Nariño" - }, - { - "code": "CO-NSA", - "name": "Norte de Santander" - }, - { - "code": "CO-PUT", - "name": "Putumayo" - }, - { - "code": "CO-QUI", - "name": "Quindío" - }, - { - "code": "CO-RIS", - "name": "Risaralda" - }, - { - "code": "CO-SAN", - "name": "Santander" - }, - { - "code": "CO-SAP", - "name": "San Andrés & Providencia" - }, - { - "code": "CO-SUC", - "name": "Sucre" - }, - { - "code": "CO-TOL", - "name": "Tolima" - }, - { - "code": "CO-VAC", - "name": "Valle del Cauca" - }, - { - "code": "CO-VAU", - "name": "Vaupés" - }, - { - "code": "CO-VID", - "name": "Vichada" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KM", - "name": "Comoros", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CG", - "name": "Congo (Brazzaville)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CD", - "name": "Congo (Kinshasa)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CK", - "name": "Cook Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CR", - "name": "Costa Rica", - "states": [{ - "code": "CR-A", - "name": "Alajuela" - }, - { - "code": "CR-C", - "name": "Cartago" - }, - { - "code": "CR-G", - "name": "Guanacaste" - }, - { - "code": "CR-H", - "name": "Heredia" - }, - { - "code": "CR-L", - "name": "Limón" - }, - { - "code": "CR-P", - "name": "Puntarenas" - }, - { - "code": "CR-SJ", - "name": "San José" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "HR", - "name": "Croatia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CU", - "name": "Cuba", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CW", - "name": "Curaçao", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CY", - "name": "Cyprus", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CZ", - "name": "Czech Republic", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "DK", - "name": "Denmark", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "DJ", - "name": "Djibouti", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "DM", - "name": "Dominica", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "DO", - "name": "Dominican Republic", - "states": [{ - "code": "DO-01", - "name": "Distrito Nacional" - }, - { - "code": "DO-02", - "name": "Azua" - }, - { - "code": "DO-03", - "name": "Baoruco" - }, - { - "code": "DO-04", - "name": "Barahona" - }, - { - "code": "DO-33", - "name": "Cibao Nordeste" - }, - { - "code": "DO-34", - "name": "Cibao Noroeste" - }, - { - "code": "DO-35", - "name": "Cibao Norte" - }, - { - "code": "DO-36", - "name": "Cibao Sur" - }, - { - "code": "DO-05", - "name": "Dajabón" - }, - { - "code": "DO-06", - "name": "Duarte" - }, - { - "code": "DO-08", - "name": "El Seibo" - }, - { - "code": "DO-37", - "name": "El Valle" - }, - { - "code": "DO-07", - "name": "Elías Piña" - }, - { - "code": "DO-38", - "name": "Enriquillo" - }, - { - "code": "DO-09", - "name": "Espaillat" - }, - { - "code": "DO-30", - "name": "Hato Mayor" - }, - { - "code": "DO-19", - "name": "Hermanas Mirabal" - }, - { - "code": "DO-39", - "name": "Higüamo" - }, - { - "code": "DO-10", - "name": "Independencia" - }, - { - "code": "DO-11", - "name": "La Altagracia" - }, - { - "code": "DO-12", - "name": "La Romana" - }, - { - "code": "DO-13", - "name": "La Vega" - }, - { - "code": "DO-14", - "name": "María Trinidad Sánchez" - }, - { - "code": "DO-28", - "name": "Monseñor Nouel" - }, - { - "code": "DO-15", - "name": "Monte Cristi" - }, - { - "code": "DO-29", - "name": "Monte Plata" - }, - { - "code": "DO-40", - "name": "Ozama" - }, - { - "code": "DO-16", - "name": "Pedernales" - }, - { - "code": "DO-17", - "name": "Peravia" - }, - { - "code": "DO-18", - "name": "Puerto Plata" - }, - { - "code": "DO-20", - "name": "Samaná" - }, - { - "code": "DO-21", - "name": "San Cristóbal" - }, - { - "code": "DO-31", - "name": "San José de Ocoa" - }, - { - "code": "DO-22", - "name": "San Juan" - }, - { - "code": "DO-23", - "name": "San Pedro de Macorís" - }, - { - "code": "DO-24", - "name": "Sánchez Ramírez" - }, - { - "code": "DO-25", - "name": "Santiago" - }, - { - "code": "DO-26", - "name": "Santiago Rodríguez" - }, - { - "code": "DO-32", - "name": "Santo Domingo" - }, - { - "code": "DO-41", - "name": "Valdesia" - }, - { - "code": "DO-27", - "name": "Valverde" - }, - { - "code": "DO-42", - "name": "Yuma" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "EC", - "name": "Ecuador", - "states": [{ - "code": "EC-A", - "name": "Azuay" - }, - { - "code": "EC-B", - "name": "Bolívar" - }, - { - "code": "EC-F", - "name": "Cañar" - }, - { - "code": "EC-C", - "name": "Carchi" - }, - { - "code": "EC-H", - "name": "Chimborazo" - }, - { - "code": "EC-X", - "name": "Cotopaxi" - }, - { - "code": "EC-O", - "name": "El Oro" - }, - { - "code": "EC-E", - "name": "Esmeraldas" - }, - { - "code": "EC-W", - "name": "Galápagos" - }, - { - "code": "EC-G", - "name": "Guayas" - }, - { - "code": "EC-I", - "name": "Imbabura" - }, - { - "code": "EC-L", - "name": "Loja" - }, - { - "code": "EC-R", - "name": "Los Ríos" - }, - { - "code": "EC-M", - "name": "Manabí" - }, - { - "code": "EC-S", - "name": "Morona-Santiago" - }, - { - "code": "EC-N", - "name": "Napo" - }, - { - "code": "EC-D", - "name": "Orellana" - }, - { - "code": "EC-Y", - "name": "Pastaza" - }, - { - "code": "EC-P", - "name": "Pichincha" - }, - { - "code": "EC-SE", - "name": "Santa Elena" - }, - { - "code": "EC-SD", - "name": "Santo Domingo de los Tsáchilas" - }, - { - "code": "EC-U", - "name": "Sucumbíos" - }, - { - "code": "EC-T", - "name": "Tungurahua" - }, - { - "code": "EC-Z", - "name": "Zamora-Chinchipe" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "EG", - "name": "Egypt", - "states": [{ - "code": "EGALX", - "name": "Alexandria" - }, - { - "code": "EGASN", - "name": "Aswan" - }, - { - "code": "EGAST", - "name": "Asyut" - }, - { - "code": "EGBA", - "name": "Red Sea" - }, - { - "code": "EGBH", - "name": "Beheira" - }, - { - "code": "EGBNS", - "name": "Beni Suef" - }, - { - "code": "EGC", - "name": "Cairo" - }, - { - "code": "EGDK", - "name": "Dakahlia" - }, - { - "code": "EGDT", - "name": "Damietta" - }, - { - "code": "EGFYM", - "name": "Faiyum" - }, - { - "code": "EGGH", - "name": "Gharbia" - }, - { - "code": "EGGZ", - "name": "Giza" - }, - { - "code": "EGIS", - "name": "Ismailia" - }, - { - "code": "EGJS", - "name": "South Sinai" - }, - { - "code": "EGKB", - "name": "Qalyubia" - }, - { - "code": "EGKFS", - "name": "Kafr el-Sheikh" - }, - { - "code": "EGKN", - "name": "Qena" - }, - { - "code": "EGLX", - "name": "Luxor" - }, - { - "code": "EGMN", - "name": "Minya" - }, - { - "code": "EGMNF", - "name": "Monufia" - }, - { - "code": "EGMT", - "name": "Matrouh" - }, - { - "code": "EGPTS", - "name": "Port Said" - }, - { - "code": "EGSHG", - "name": "Sohag" - }, - { - "code": "EGSHR", - "name": "Al Sharqia" - }, - { - "code": "EGSIN", - "name": "North Sinai" - }, - { - "code": "EGSUZ", - "name": "Suez" - }, - { - "code": "EGWAD", - "name": "New Valley" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SV", - "name": "El Salvador", - "states": [{ - "code": "SV-AH", - "name": "Ahuachapán" - }, - { - "code": "SV-CA", - "name": "Cabañas" - }, - { - "code": "SV-CH", - "name": "Chalatenango" - }, - { - "code": "SV-CU", - "name": "Cuscatlán" - }, - { - "code": "SV-LI", - "name": "La Libertad" - }, - { - "code": "SV-MO", - "name": "Morazán" - }, - { - "code": "SV-PA", - "name": "La Paz" - }, - { - "code": "SV-SA", - "name": "Santa Ana" - }, - { - "code": "SV-SM", - "name": "San Miguel" - }, - { - "code": "SV-SO", - "name": "Sonsonate" - }, - { - "code": "SV-SS", - "name": "San Salvador" - }, - { - "code": "SV-SV", - "name": "San Vicente" - }, - { - "code": "SV-UN", - "name": "La Unión" - }, - { - "code": "SV-US", - "name": "Usulután" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GQ", - "name": "Equatorial Guinea", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ER", - "name": "Eritrea", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "EE", - "name": "Estonia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SZ", - "name": "Eswatini", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ET", - "name": "Ethiopia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "FK", - "name": "Falkland Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "FO", - "name": "Faroe Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "FJ", - "name": "Fiji", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "FI", - "name": "Finland", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "FR", - "name": "France", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GF", - "name": "French Guiana", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PF", - "name": "French Polynesia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TF", - "name": "French Southern Territories", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GA", - "name": "Gabon", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GM", - "name": "Gambia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GE", - "name": "Georgia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "DE", - "name": "Germany", - "states": [{ - "code": "DE-BW", - "name": "Baden-Württemberg" - }, - { - "code": "DE-BY", - "name": "Bavaria" - }, - { - "code": "DE-BE", - "name": "Berlin" - }, - { - "code": "DE-BB", - "name": "Brandenburg" - }, - { - "code": "DE-HB", - "name": "Bremen" - }, - { - "code": "DE-HH", - "name": "Hamburg" - }, - { - "code": "DE-HE", - "name": "Hesse" - }, - { - "code": "DE-MV", - "name": "Mecklenburg-Vorpommern" - }, - { - "code": "DE-NI", - "name": "Lower Saxony" - }, - { - "code": "DE-NW", - "name": "North Rhine-Westphalia" - }, - { - "code": "DE-RP", - "name": "Rhineland-Palatinate" - }, - { - "code": "DE-SL", - "name": "Saarland" - }, - { - "code": "DE-SN", - "name": "Saxony" - }, - { - "code": "DE-ST", - "name": "Saxony-Anhalt" - }, - { - "code": "DE-SH", - "name": "Schleswig-Holstein" - }, - { - "code": "DE-TH", - "name": "Thuringia" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GH", - "name": "Ghana", - "states": [{ - "code": "AF", - "name": "Ahafo" - }, - { - "code": "AH", - "name": "Ashanti" - }, - { - "code": "BA", - "name": "Brong-Ahafo" - }, - { - "code": "BO", - "name": "Bono" - }, - { - "code": "BE", - "name": "Bono East" - }, - { - "code": "CP", - "name": "Central" - }, - { - "code": "EP", - "name": "Eastern" - }, - { - "code": "AA", - "name": "Greater Accra" - }, - { - "code": "NE", - "name": "North East" - }, - { - "code": "NP", - "name": "Northern" - }, - { - "code": "OT", - "name": "Oti" - }, - { - "code": "SV", - "name": "Savannah" - }, - { - "code": "UE", - "name": "Upper East" - }, - { - "code": "UW", - "name": "Upper West" - }, - { - "code": "TV", - "name": "Volta" - }, - { - "code": "WP", - "name": "Western" - }, - { - "code": "WN", - "name": "Western North" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GI", - "name": "Gibraltar", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GR", - "name": "Greece", - "states": [{ - "code": "I", - "name": "Attica" - }, - { - "code": "A", - "name": "East Macedonia and Thrace" - }, - { - "code": "B", - "name": "Central Macedonia" - }, - { - "code": "C", - "name": "West Macedonia" - }, - { - "code": "D", - "name": "Epirus" - }, - { - "code": "E", - "name": "Thessaly" - }, - { - "code": "F", - "name": "Ionian Islands" - }, - { - "code": "G", - "name": "West Greece" - }, - { - "code": "H", - "name": "Central Greece" - }, - { - "code": "J", - "name": "Peloponnese" - }, - { - "code": "K", - "name": "North Aegean" - }, - { - "code": "L", - "name": "South Aegean" - }, - { - "code": "M", - "name": "Crete" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GL", - "name": "Greenland", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GD", - "name": "Grenada", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GP", - "name": "Guadeloupe", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GU", - "name": "Guam", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GT", - "name": "Guatemala", - "states": [{ - "code": "GT-AV", - "name": "Alta Verapaz" - }, - { - "code": "GT-BV", - "name": "Baja Verapaz" - }, - { - "code": "GT-CM", - "name": "Chimaltenango" - }, - { - "code": "GT-CQ", - "name": "Chiquimula" - }, - { - "code": "GT-PR", - "name": "El Progreso" - }, - { - "code": "GT-ES", - "name": "Escuintla" - }, - { - "code": "GT-GU", - "name": "Guatemala" - }, - { - "code": "GT-HU", - "name": "Huehuetenango" - }, - { - "code": "GT-IZ", - "name": "Izabal" - }, - { - "code": "GT-JA", - "name": "Jalapa" - }, - { - "code": "GT-JU", - "name": "Jutiapa" - }, - { - "code": "GT-PE", - "name": "Petén" - }, - { - "code": "GT-QZ", - "name": "Quetzaltenango" - }, - { - "code": "GT-QC", - "name": "Quiché" - }, - { - "code": "GT-RE", - "name": "Retalhuleu" - }, - { - "code": "GT-SA", - "name": "Sacatepéquez" - }, - { - "code": "GT-SM", - "name": "San Marcos" - }, - { - "code": "GT-SR", - "name": "Santa Rosa" - }, - { - "code": "GT-SO", - "name": "Sololá" - }, - { - "code": "GT-SU", - "name": "Suchitepéquez" - }, - { - "code": "GT-TO", - "name": "Totonicapán" - }, - { - "code": "GT-ZA", - "name": "Zacapa" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GG", - "name": "Guernsey", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GN", - "name": "Guinea", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GW", - "name": "Guinea-Bissau", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GY", - "name": "Guyana", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "HT", - "name": "Haiti", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "HM", - "name": "Heard Island and McDonald Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "HN", - "name": "Honduras", - "states": [{ - "code": "HN-AT", - "name": "Atlántida" - }, - { - "code": "HN-IB", - "name": "Bay Islands" - }, - { - "code": "HN-CH", - "name": "Choluteca" - }, - { - "code": "HN-CL", - "name": "Colón" - }, - { - "code": "HN-CM", - "name": "Comayagua" - }, - { - "code": "HN-CP", - "name": "Copán" - }, - { - "code": "HN-CR", - "name": "Cortés" - }, - { - "code": "HN-EP", - "name": "El Paraíso" - }, - { - "code": "HN-FM", - "name": "Francisco Morazán" - }, - { - "code": "HN-GD", - "name": "Gracias a Dios" - }, - { - "code": "HN-IN", - "name": "Intibucá" - }, - { - "code": "HN-LE", - "name": "Lempira" - }, - { - "code": "HN-LP", - "name": "La Paz" - }, - { - "code": "HN-OC", - "name": "Ocotepeque" - }, - { - "code": "HN-OL", - "name": "Olancho" - }, - { - "code": "HN-SB", - "name": "Santa Bárbara" - }, - { - "code": "HN-VA", - "name": "Valle" - }, - { - "code": "HN-YO", - "name": "Yoro" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "HK", - "name": "Hong Kong", - "states": [{ - "code": "HONG KONG", - "name": "Hong Kong Island" - }, - { - "code": "KOWLOON", - "name": "Kowloon" - }, - { - "code": "NEW TERRITORIES", - "name": "New Territories" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "HU", - "name": "Hungary", - "states": [{ - "code": "BK", - "name": "Bács-Kiskun" - }, - { - "code": "BE", - "name": "Békés" - }, - { - "code": "BA", - "name": "Baranya" - }, - { - "code": "BZ", - "name": "Borsod-Abaúj-Zemplén" - }, - { - "code": "BU", - "name": "Budapest" - }, - { - "code": "CS", - "name": "Csongrád-Csanád" - }, - { - "code": "FE", - "name": "Fejér" - }, - { - "code": "GS", - "name": "Győr-Moson-Sopron" - }, - { - "code": "HB", - "name": "Hajdú-Bihar" - }, - { - "code": "HE", - "name": "Heves" - }, - { - "code": "JN", - "name": "Jász-Nagykun-Szolnok" - }, - { - "code": "KE", - "name": "Komárom-Esztergom" - }, - { - "code": "NO", - "name": "Nógrád" - }, - { - "code": "PE", - "name": "Pest" - }, - { - "code": "SO", - "name": "Somogy" - }, - { - "code": "SZ", - "name": "Szabolcs-Szatmár-Bereg" - }, - { - "code": "TO", - "name": "Tolna" - }, - { - "code": "VA", - "name": "Vas" - }, - { - "code": "VE", - "name": "Veszprém" - }, - { - "code": "ZA", - "name": "Zala" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IS", - "name": "Iceland", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IN", - "name": "India", - "states": [{ - "code": "AP", - "name": "Andhra Pradesh" - }, - { - "code": "AR", - "name": "Arunachal Pradesh" - }, - { - "code": "AS", - "name": "Assam" - }, - { - "code": "BR", - "name": "Bihar" - }, - { - "code": "CT", - "name": "Chhattisgarh" - }, - { - "code": "GA", - "name": "Goa" - }, - { - "code": "GJ", - "name": "Gujarat" - }, - { - "code": "HR", - "name": "Haryana" - }, - { - "code": "HP", - "name": "Himachal Pradesh" - }, - { - "code": "JK", - "name": "Jammu and Kashmir" - }, - { - "code": "JH", - "name": "Jharkhand" - }, - { - "code": "KA", - "name": "Karnataka" - }, - { - "code": "KL", - "name": "Kerala" - }, - { - "code": "LA", - "name": "Ladakh" - }, - { - "code": "MP", - "name": "Madhya Pradesh" - }, - { - "code": "MH", - "name": "Maharashtra" - }, - { - "code": "MN", - "name": "Manipur" - }, - { - "code": "ML", - "name": "Meghalaya" - }, - { - "code": "MZ", - "name": "Mizoram" - }, - { - "code": "NL", - "name": "Nagaland" - }, - { - "code": "OR", - "name": "Odisha" - }, - { - "code": "PB", - "name": "Punjab" - }, - { - "code": "RJ", - "name": "Rajasthan" - }, - { - "code": "SK", - "name": "Sikkim" - }, - { - "code": "TN", - "name": "Tamil Nadu" - }, - { - "code": "TS", - "name": "Telangana" - }, - { - "code": "TR", - "name": "Tripura" - }, - { - "code": "UK", - "name": "Uttarakhand" - }, - { - "code": "UP", - "name": "Uttar Pradesh" - }, - { - "code": "WB", - "name": "West Bengal" - }, - { - "code": "AN", - "name": "Andaman and Nicobar Islands" - }, - { - "code": "CH", - "name": "Chandigarh" - }, - { - "code": "DN", - "name": "Dadra and Nagar Haveli" - }, - { - "code": "DD", - "name": "Daman and Diu" - }, - { - "code": "DL", - "name": "Delhi" - }, - { - "code": "LD", - "name": "Lakshadeep" - }, - { - "code": "PY", - "name": "Pondicherry (Puducherry)" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ID", - "name": "Indonesia", - "states": [{ - "code": "AC", - "name": "Daerah Istimewa Aceh" - }, - { - "code": "SU", - "name": "Sumatera Utara" - }, - { - "code": "SB", - "name": "Sumatera Barat" - }, - { - "code": "RI", - "name": "Riau" - }, - { - "code": "KR", - "name": "Kepulauan Riau" - }, - { - "code": "JA", - "name": "Jambi" - }, - { - "code": "SS", - "name": "Sumatera Selatan" - }, - { - "code": "BB", - "name": "Bangka Belitung" - }, - { - "code": "BE", - "name": "Bengkulu" - }, - { - "code": "LA", - "name": "Lampung" - }, - { - "code": "JK", - "name": "DKI Jakarta" - }, - { - "code": "JB", - "name": "Jawa Barat" - }, - { - "code": "BT", - "name": "Banten" - }, - { - "code": "JT", - "name": "Jawa Tengah" - }, - { - "code": "JI", - "name": "Jawa Timur" - }, - { - "code": "YO", - "name": "Daerah Istimewa Yogyakarta" - }, - { - "code": "BA", - "name": "Bali" - }, - { - "code": "NB", - "name": "Nusa Tenggara Barat" - }, - { - "code": "NT", - "name": "Nusa Tenggara Timur" - }, - { - "code": "KB", - "name": "Kalimantan Barat" - }, - { - "code": "KT", - "name": "Kalimantan Tengah" - }, - { - "code": "KI", - "name": "Kalimantan Timur" - }, - { - "code": "KS", - "name": "Kalimantan Selatan" - }, - { - "code": "KU", - "name": "Kalimantan Utara" - }, - { - "code": "SA", - "name": "Sulawesi Utara" - }, - { - "code": "ST", - "name": "Sulawesi Tengah" - }, - { - "code": "SG", - "name": "Sulawesi Tenggara" - }, - { - "code": "SR", - "name": "Sulawesi Barat" - }, - { - "code": "SN", - "name": "Sulawesi Selatan" - }, - { - "code": "GO", - "name": "Gorontalo" - }, - { - "code": "MA", - "name": "Maluku" - }, - { - "code": "MU", - "name": "Maluku Utara" - }, - { - "code": "PA", - "name": "Papua" - }, - { - "code": "PB", - "name": "Papua Barat" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IR", - "name": "Iran", - "states": [{ - "code": "KHZ", - "name": "Khuzestan (خوزستان)" - }, - { - "code": "THR", - "name": "Tehran (تهران)" - }, - { - "code": "ILM", - "name": "Ilaam (ایلام)" - }, - { - "code": "BHR", - "name": "Bushehr (بوشهر)" - }, - { - "code": "ADL", - "name": "Ardabil (اردبیل)" - }, - { - "code": "ESF", - "name": "Isfahan (اصفهان)" - }, - { - "code": "YZD", - "name": "Yazd (یزد)" - }, - { - "code": "KRH", - "name": "Kermanshah (کرمانشاه)" - }, - { - "code": "KRN", - "name": "Kerman (کرمان)" - }, - { - "code": "HDN", - "name": "Hamadan (همدان)" - }, - { - "code": "GZN", - "name": "Ghazvin (قزوین)" - }, - { - "code": "ZJN", - "name": "Zanjan (زنجان)" - }, - { - "code": "LRS", - "name": "Luristan (لرستان)" - }, - { - "code": "ABZ", - "name": "Alborz (البرز)" - }, - { - "code": "EAZ", - "name": "East Azarbaijan (آذربایجان شرقی)" - }, - { - "code": "WAZ", - "name": "West Azarbaijan (آذربایجان غربی)" - }, - { - "code": "CHB", - "name": "Chaharmahal and Bakhtiari (چهارمحال و بختیاری)" - }, - { - "code": "SKH", - "name": "South Khorasan (خراسان جنوبی)" - }, - { - "code": "RKH", - "name": "Razavi Khorasan (خراسان رضوی)" - }, - { - "code": "NKH", - "name": "North Khorasan (خراسان شمالی)" - }, - { - "code": "SMN", - "name": "Semnan (سمنان)" - }, - { - "code": "FRS", - "name": "Fars (فارس)" - }, - { - "code": "QHM", - "name": "Qom (قم)" - }, - { - "code": "KRD", - "name": "Kurdistan / کردستان)" - }, - { - "code": "KBD", - "name": "Kohgiluyeh and BoyerAhmad (کهگیلوییه و بویراحمد)" - }, - { - "code": "GLS", - "name": "Golestan (گلستان)" - }, - { - "code": "GIL", - "name": "Gilan (گیلان)" - }, - { - "code": "MZN", - "name": "Mazandaran (مازندران)" - }, - { - "code": "MKZ", - "name": "Markazi (مرکزی)" - }, - { - "code": "HRZ", - "name": "Hormozgan (هرمزگان)" - }, - { - "code": "SBN", - "name": "Sistan and Baluchestan (سیستان و بلوچستان)" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IQ", - "name": "Iraq", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IE", - "name": "Ireland", - "states": [{ - "code": "CW", - "name": "Carlow" - }, - { - "code": "CN", - "name": "Cavan" - }, - { - "code": "CE", - "name": "Clare" - }, - { - "code": "CO", - "name": "Cork" - }, - { - "code": "DL", - "name": "Donegal" - }, - { - "code": "D", - "name": "Dublin" - }, - { - "code": "G", - "name": "Galway" - }, - { - "code": "KY", - "name": "Kerry" - }, - { - "code": "KE", - "name": "Kildare" - }, - { - "code": "KK", - "name": "Kilkenny" - }, - { - "code": "LS", - "name": "Laois" - }, - { - "code": "LM", - "name": "Leitrim" - }, - { - "code": "LK", - "name": "Limerick" - }, - { - "code": "LD", - "name": "Longford" - }, - { - "code": "LH", - "name": "Louth" - }, - { - "code": "MO", - "name": "Mayo" - }, - { - "code": "MH", - "name": "Meath" - }, - { - "code": "MN", - "name": "Monaghan" - }, - { - "code": "OY", - "name": "Offaly" - }, - { - "code": "RN", - "name": "Roscommon" - }, - { - "code": "SO", - "name": "Sligo" - }, - { - "code": "TA", - "name": "Tipperary" - }, - { - "code": "WD", - "name": "Waterford" - }, - { - "code": "WH", - "name": "Westmeath" - }, - { - "code": "WX", - "name": "Wexford" - }, - { - "code": "WW", - "name": "Wicklow" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IM", - "name": "Isle of Man", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IL", - "name": "Israel", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "IT", - "name": "Italy", - "states": [{ - "code": "AG", - "name": "Agrigento" - }, - { - "code": "AL", - "name": "Alessandria" - }, - { - "code": "AN", - "name": "Ancona" - }, - { - "code": "AO", - "name": "Aosta" - }, - { - "code": "AR", - "name": "Arezzo" - }, - { - "code": "AP", - "name": "Ascoli Piceno" - }, - { - "code": "AT", - "name": "Asti" - }, - { - "code": "AV", - "name": "Avellino" - }, - { - "code": "BA", - "name": "Bari" - }, - { - "code": "BT", - "name": "Barletta-Andria-Trani" - }, - { - "code": "BL", - "name": "Belluno" - }, - { - "code": "BN", - "name": "Benevento" - }, - { - "code": "BG", - "name": "Bergamo" - }, - { - "code": "BI", - "name": "Biella" - }, - { - "code": "BO", - "name": "Bologna" - }, - { - "code": "BZ", - "name": "Bolzano" - }, - { - "code": "BS", - "name": "Brescia" - }, - { - "code": "BR", - "name": "Brindisi" - }, - { - "code": "CA", - "name": "Cagliari" - }, - { - "code": "CL", - "name": "Caltanissetta" - }, - { - "code": "CB", - "name": "Campobasso" - }, - { - "code": "CE", - "name": "Caserta" - }, - { - "code": "CT", - "name": "Catania" - }, - { - "code": "CZ", - "name": "Catanzaro" - }, - { - "code": "CH", - "name": "Chieti" - }, - { - "code": "CO", - "name": "Como" - }, - { - "code": "CS", - "name": "Cosenza" - }, - { - "code": "CR", - "name": "Cremona" - }, - { - "code": "KR", - "name": "Crotone" - }, - { - "code": "CN", - "name": "Cuneo" - }, - { - "code": "EN", - "name": "Enna" - }, - { - "code": "FM", - "name": "Fermo" - }, - { - "code": "FE", - "name": "Ferrara" - }, - { - "code": "FI", - "name": "Firenze" - }, - { - "code": "FG", - "name": "Foggia" - }, - { - "code": "FC", - "name": "Forlì-Cesena" - }, - { - "code": "FR", - "name": "Frosinone" - }, - { - "code": "GE", - "name": "Genova" - }, - { - "code": "GO", - "name": "Gorizia" - }, - { - "code": "GR", - "name": "Grosseto" - }, - { - "code": "IM", - "name": "Imperia" - }, - { - "code": "IS", - "name": "Isernia" - }, - { - "code": "SP", - "name": "La Spezia" - }, - { - "code": "AQ", - "name": "L'Aquila" - }, - { - "code": "LT", - "name": "Latina" - }, - { - "code": "LE", - "name": "Lecce" - }, - { - "code": "LC", - "name": "Lecco" - }, - { - "code": "LI", - "name": "Livorno" - }, - { - "code": "LO", - "name": "Lodi" - }, - { - "code": "LU", - "name": "Lucca" - }, - { - "code": "MC", - "name": "Macerata" - }, - { - "code": "MN", - "name": "Mantova" - }, - { - "code": "MS", - "name": "Massa-Carrara" - }, - { - "code": "MT", - "name": "Matera" - }, - { - "code": "ME", - "name": "Messina" - }, - { - "code": "MI", - "name": "Milano" - }, - { - "code": "MO", - "name": "Modena" - }, - { - "code": "MB", - "name": "Monza e della Brianza" - }, - { - "code": "NA", - "name": "Napoli" - }, - { - "code": "NO", - "name": "Novara" - }, - { - "code": "NU", - "name": "Nuoro" - }, - { - "code": "OR", - "name": "Oristano" - }, - { - "code": "PD", - "name": "Padova" - }, - { - "code": "PA", - "name": "Palermo" - }, - { - "code": "PR", - "name": "Parma" - }, - { - "code": "PV", - "name": "Pavia" - }, - { - "code": "PG", - "name": "Perugia" - }, - { - "code": "PU", - "name": "Pesaro e Urbino" - }, - { - "code": "PE", - "name": "Pescara" - }, - { - "code": "PC", - "name": "Piacenza" - }, - { - "code": "PI", - "name": "Pisa" - }, - { - "code": "PT", - "name": "Pistoia" - }, - { - "code": "PN", - "name": "Pordenone" - }, - { - "code": "PZ", - "name": "Potenza" - }, - { - "code": "PO", - "name": "Prato" - }, - { - "code": "RG", - "name": "Ragusa" - }, - { - "code": "RA", - "name": "Ravenna" - }, - { - "code": "RC", - "name": "Reggio Calabria" - }, - { - "code": "RE", - "name": "Reggio Emilia" - }, - { - "code": "RI", - "name": "Rieti" - }, - { - "code": "RN", - "name": "Rimini" - }, - { - "code": "RM", - "name": "Roma" - }, - { - "code": "RO", - "name": "Rovigo" - }, - { - "code": "SA", - "name": "Salerno" - }, - { - "code": "SS", - "name": "Sassari" - }, - { - "code": "SV", - "name": "Savona" - }, - { - "code": "SI", - "name": "Siena" - }, - { - "code": "SR", - "name": "Siracusa" - }, - { - "code": "SO", - "name": "Sondrio" - }, - { - "code": "SU", - "name": "Sud Sardegna" - }, - { - "code": "TA", - "name": "Taranto" - }, - { - "code": "TE", - "name": "Teramo" - }, - { - "code": "TR", - "name": "Terni" - }, - { - "code": "TO", - "name": "Torino" - }, - { - "code": "TP", - "name": "Trapani" - }, - { - "code": "TN", - "name": "Trento" - }, - { - "code": "TV", - "name": "Treviso" - }, - { - "code": "TS", - "name": "Trieste" - }, - { - "code": "UD", - "name": "Udine" - }, - { - "code": "VA", - "name": "Varese" - }, - { - "code": "VE", - "name": "Venezia" - }, - { - "code": "VB", - "name": "Verbano-Cusio-Ossola" - }, - { - "code": "VC", - "name": "Vercelli" - }, - { - "code": "VR", - "name": "Verona" - }, - { - "code": "VV", - "name": "Vibo Valentia" - }, - { - "code": "VI", - "name": "Vicenza" - }, - { - "code": "VT", - "name": "Viterbo" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CI", - "name": "Ivory Coast", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "JM", - "name": "Jamaica", - "states": [{ - "code": "JM-01", - "name": "Kingston" - }, - { - "code": "JM-02", - "name": "Saint Andrew" - }, - { - "code": "JM-03", - "name": "Saint Thomas" - }, - { - "code": "JM-04", - "name": "Portland" - }, - { - "code": "JM-05", - "name": "Saint Mary" - }, - { - "code": "JM-06", - "name": "Saint Ann" - }, - { - "code": "JM-07", - "name": "Trelawny" - }, - { - "code": "JM-08", - "name": "Saint James" - }, - { - "code": "JM-09", - "name": "Hanover" - }, - { - "code": "JM-10", - "name": "Westmoreland" - }, - { - "code": "JM-11", - "name": "Saint Elizabeth" - }, - { - "code": "JM-12", - "name": "Manchester" - }, - { - "code": "JM-13", - "name": "Clarendon" - }, - { - "code": "JM-14", - "name": "Saint Catherine" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "JP", - "name": "Japan", - "states": [{ - "code": "JP01", - "name": "Hokkaido" - }, - { - "code": "JP02", - "name": "Aomori" - }, - { - "code": "JP03", - "name": "Iwate" - }, - { - "code": "JP04", - "name": "Miyagi" - }, - { - "code": "JP05", - "name": "Akita" - }, - { - "code": "JP06", - "name": "Yamagata" - }, - { - "code": "JP07", - "name": "Fukushima" - }, - { - "code": "JP08", - "name": "Ibaraki" - }, - { - "code": "JP09", - "name": "Tochigi" - }, - { - "code": "JP10", - "name": "Gunma" - }, - { - "code": "JP11", - "name": "Saitama" - }, - { - "code": "JP12", - "name": "Chiba" - }, - { - "code": "JP13", - "name": "Tokyo" - }, - { - "code": "JP14", - "name": "Kanagawa" - }, - { - "code": "JP15", - "name": "Niigata" - }, - { - "code": "JP16", - "name": "Toyama" - }, - { - "code": "JP17", - "name": "Ishikawa" - }, - { - "code": "JP18", - "name": "Fukui" - }, - { - "code": "JP19", - "name": "Yamanashi" - }, - { - "code": "JP20", - "name": "Nagano" - }, - { - "code": "JP21", - "name": "Gifu" - }, - { - "code": "JP22", - "name": "Shizuoka" - }, - { - "code": "JP23", - "name": "Aichi" - }, - { - "code": "JP24", - "name": "Mie" - }, - { - "code": "JP25", - "name": "Shiga" - }, - { - "code": "JP26", - "name": "Kyoto" - }, - { - "code": "JP27", - "name": "Osaka" - }, - { - "code": "JP28", - "name": "Hyogo" - }, - { - "code": "JP29", - "name": "Nara" - }, - { - "code": "JP30", - "name": "Wakayama" - }, - { - "code": "JP31", - "name": "Tottori" - }, - { - "code": "JP32", - "name": "Shimane" - }, - { - "code": "JP33", - "name": "Okayama" - }, - { - "code": "JP34", - "name": "Hiroshima" - }, - { - "code": "JP35", - "name": "Yamaguchi" - }, - { - "code": "JP36", - "name": "Tokushima" - }, - { - "code": "JP37", - "name": "Kagawa" - }, - { - "code": "JP38", - "name": "Ehime" - }, - { - "code": "JP39", - "name": "Kochi" - }, - { - "code": "JP40", - "name": "Fukuoka" - }, - { - "code": "JP41", - "name": "Saga" - }, - { - "code": "JP42", - "name": "Nagasaki" - }, - { - "code": "JP43", - "name": "Kumamoto" - }, - { - "code": "JP44", - "name": "Oita" - }, - { - "code": "JP45", - "name": "Miyazaki" - }, - { - "code": "JP46", - "name": "Kagoshima" - }, - { - "code": "JP47", - "name": "Okinawa" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "JE", - "name": "Jersey", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "JO", - "name": "Jordan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KZ", - "name": "Kazakhstan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KE", - "name": "Kenya", - "states": [{ - "code": "KE01", - "name": "Baringo" - }, - { - "code": "KE02", - "name": "Bomet" - }, - { - "code": "KE03", - "name": "Bungoma" - }, - { - "code": "KE04", - "name": "Busia" - }, - { - "code": "KE05", - "name": "Elgeyo-Marakwet" - }, - { - "code": "KE06", - "name": "Embu" - }, - { - "code": "KE07", - "name": "Garissa" - }, - { - "code": "KE08", - "name": "Homa Bay" - }, - { - "code": "KE09", - "name": "Isiolo" - }, - { - "code": "KE10", - "name": "Kajiado" - }, - { - "code": "KE11", - "name": "Kakamega" - }, - { - "code": "KE12", - "name": "Kericho" - }, - { - "code": "KE13", - "name": "Kiambu" - }, - { - "code": "KE14", - "name": "Kilifi" - }, - { - "code": "KE15", - "name": "Kirinyaga" - }, - { - "code": "KE16", - "name": "Kisii" - }, - { - "code": "KE17", - "name": "Kisumu" - }, - { - "code": "KE18", - "name": "Kitui" - }, - { - "code": "KE19", - "name": "Kwale" - }, - { - "code": "KE20", - "name": "Laikipia" - }, - { - "code": "KE21", - "name": "Lamu" - }, - { - "code": "KE22", - "name": "Machakos" - }, - { - "code": "KE23", - "name": "Makueni" - }, - { - "code": "KE24", - "name": "Mandera" - }, - { - "code": "KE25", - "name": "Marsabit" - }, - { - "code": "KE26", - "name": "Meru" - }, - { - "code": "KE27", - "name": "Migori" - }, - { - "code": "KE28", - "name": "Mombasa" - }, - { - "code": "KE29", - "name": "Murang’a" - }, - { - "code": "KE30", - "name": "Nairobi County" - }, - { - "code": "KE31", - "name": "Nakuru" - }, - { - "code": "KE32", - "name": "Nandi" - }, - { - "code": "KE33", - "name": "Narok" - }, - { - "code": "KE34", - "name": "Nyamira" - }, - { - "code": "KE35", - "name": "Nyandarua" - }, - { - "code": "KE36", - "name": "Nyeri" - }, - { - "code": "KE37", - "name": "Samburu" - }, - { - "code": "KE38", - "name": "Siaya" - }, - { - "code": "KE39", - "name": "Taita-Taveta" - }, - { - "code": "KE40", - "name": "Tana River" - }, - { - "code": "KE41", - "name": "Tharaka-Nithi" - }, - { - "code": "KE42", - "name": "Trans Nzoia" - }, - { - "code": "KE43", - "name": "Turkana" - }, - { - "code": "KE44", - "name": "Uasin Gishu" - }, - { - "code": "KE45", - "name": "Vihiga" - }, - { - "code": "KE46", - "name": "Wajir" - }, - { - "code": "KE47", - "name": "West Pokot" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KI", - "name": "Kiribati", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KW", - "name": "Kuwait", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KG", - "name": "Kyrgyzstan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LA", - "name": "Laos", - "states": [{ - "code": "AT", - "name": "Attapeu" - }, - { - "code": "BK", - "name": "Bokeo" - }, - { - "code": "BL", - "name": "Bolikhamsai" - }, - { - "code": "CH", - "name": "Champasak" - }, - { - "code": "HO", - "name": "Houaphanh" - }, - { - "code": "KH", - "name": "Khammouane" - }, - { - "code": "LM", - "name": "Luang Namtha" - }, - { - "code": "LP", - "name": "Luang Prabang" - }, - { - "code": "OU", - "name": "Oudomxay" - }, - { - "code": "PH", - "name": "Phongsaly" - }, - { - "code": "SL", - "name": "Salavan" - }, - { - "code": "SV", - "name": "Savannakhet" - }, - { - "code": "VI", - "name": "Vientiane Province" - }, - { - "code": "VT", - "name": "Vientiane" - }, - { - "code": "XA", - "name": "Sainyabuli" - }, - { - "code": "XE", - "name": "Sekong" - }, - { - "code": "XI", - "name": "Xiangkhouang" - }, - { - "code": "XS", - "name": "Xaisomboun" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LV", - "name": "Latvia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LB", - "name": "Lebanon", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LS", - "name": "Lesotho", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LR", - "name": "Liberia", - "states": [{ - "code": "BM", - "name": "Bomi" - }, - { - "code": "BN", - "name": "Bong" - }, - { - "code": "GA", - "name": "Gbarpolu" - }, - { - "code": "GB", - "name": "Grand Bassa" - }, - { - "code": "GC", - "name": "Grand Cape Mount" - }, - { - "code": "GG", - "name": "Grand Gedeh" - }, - { - "code": "GK", - "name": "Grand Kru" - }, - { - "code": "LO", - "name": "Lofa" - }, - { - "code": "MA", - "name": "Margibi" - }, - { - "code": "MY", - "name": "Maryland" - }, - { - "code": "MO", - "name": "Montserrado" - }, - { - "code": "NM", - "name": "Nimba" - }, - { - "code": "RV", - "name": "Rivercess" - }, - { - "code": "RG", - "name": "River Gee" - }, - { - "code": "SN", - "name": "Sinoe" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LY", - "name": "Libya", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LI", - "name": "Liechtenstein", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LT", - "name": "Lithuania", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LU", - "name": "Luxembourg", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MO", - "name": "Macao", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MG", - "name": "Madagascar", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MW", - "name": "Malawi", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MY", - "name": "Malaysia", - "states": [{ - "code": "JHR", - "name": "Johor" - }, - { - "code": "KDH", - "name": "Kedah" - }, - { - "code": "KTN", - "name": "Kelantan" - }, - { - "code": "LBN", - "name": "Labuan" - }, - { - "code": "MLK", - "name": "Malacca (Melaka)" - }, - { - "code": "NSN", - "name": "Negeri Sembilan" - }, - { - "code": "PHG", - "name": "Pahang" - }, - { - "code": "PNG", - "name": "Penang (Pulau Pinang)" - }, - { - "code": "PRK", - "name": "Perak" - }, - { - "code": "PLS", - "name": "Perlis" - }, - { - "code": "SBH", - "name": "Sabah" - }, - { - "code": "SWK", - "name": "Sarawak" - }, - { - "code": "SGR", - "name": "Selangor" - }, - { - "code": "TRG", - "name": "Terengganu" - }, - { - "code": "PJY", - "name": "Putrajaya" - }, - { - "code": "KUL", - "name": "Kuala Lumpur" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MV", - "name": "Maldives", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ML", - "name": "Mali", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MT", - "name": "Malta", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MH", - "name": "Marshall Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MQ", - "name": "Martinique", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MR", - "name": "Mauritania", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MU", - "name": "Mauritius", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "YT", - "name": "Mayotte", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MX", - "name": "Mexico", - "states": [{ - "code": "DF", - "name": "Ciudad de México" - }, - { - "code": "JA", - "name": "Jalisco" - }, - { - "code": "NL", - "name": "Nuevo León" - }, - { - "code": "AG", - "name": "Aguascalientes" - }, - { - "code": "BC", - "name": "Baja California" - }, - { - "code": "BS", - "name": "Baja California Sur" - }, - { - "code": "CM", - "name": "Campeche" - }, - { - "code": "CS", - "name": "Chiapas" - }, - { - "code": "CH", - "name": "Chihuahua" - }, - { - "code": "CO", - "name": "Coahuila" - }, - { - "code": "CL", - "name": "Colima" - }, - { - "code": "DG", - "name": "Durango" - }, - { - "code": "GT", - "name": "Guanajuato" - }, - { - "code": "GR", - "name": "Guerrero" - }, - { - "code": "HG", - "name": "Hidalgo" - }, - { - "code": "MX", - "name": "Estado de México" - }, - { - "code": "MI", - "name": "Michoacán" - }, - { - "code": "MO", - "name": "Morelos" - }, - { - "code": "NA", - "name": "Nayarit" - }, - { - "code": "OA", - "name": "Oaxaca" - }, - { - "code": "PU", - "name": "Puebla" - }, - { - "code": "QT", - "name": "Querétaro" - }, - { - "code": "QR", - "name": "Quintana Roo" - }, - { - "code": "SL", - "name": "San Luis Potosí" - }, - { - "code": "SI", - "name": "Sinaloa" - }, - { - "code": "SO", - "name": "Sonora" - }, - { - "code": "TB", - "name": "Tabasco" - }, - { - "code": "TM", - "name": "Tamaulipas" - }, - { - "code": "TL", - "name": "Tlaxcala" - }, - { - "code": "VE", - "name": "Veracruz" - }, - { - "code": "YU", - "name": "Yucatán" - }, - { - "code": "ZA", - "name": "Zacatecas" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "FM", - "name": "Micronesia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MD", - "name": "Moldova", - "states": [{ - "code": "C", - "name": "Chișinău" - }, - { - "code": "BL", - "name": "Bălți" - }, - { - "code": "AN", - "name": "Anenii Noi" - }, - { - "code": "BS", - "name": "Basarabeasca" - }, - { - "code": "BR", - "name": "Briceni" - }, - { - "code": "CH", - "name": "Cahul" - }, - { - "code": "CT", - "name": "Cantemir" - }, - { - "code": "CL", - "name": "Călărași" - }, - { - "code": "CS", - "name": "Căușeni" - }, - { - "code": "CM", - "name": "Cimișlia" - }, - { - "code": "CR", - "name": "Criuleni" - }, - { - "code": "DN", - "name": "Dondușeni" - }, - { - "code": "DR", - "name": "Drochia" - }, - { - "code": "DB", - "name": "Dubăsari" - }, - { - "code": "ED", - "name": "Edineț" - }, - { - "code": "FL", - "name": "Fălești" - }, - { - "code": "FR", - "name": "Florești" - }, - { - "code": "GE", - "name": "UTA Găgăuzia" - }, - { - "code": "GL", - "name": "Glodeni" - }, - { - "code": "HN", - "name": "Hîncești" - }, - { - "code": "IL", - "name": "Ialoveni" - }, - { - "code": "LV", - "name": "Leova" - }, - { - "code": "NS", - "name": "Nisporeni" - }, - { - "code": "OC", - "name": "Ocnița" - }, - { - "code": "OR", - "name": "Orhei" - }, - { - "code": "RZ", - "name": "Rezina" - }, - { - "code": "RS", - "name": "Rîșcani" - }, - { - "code": "SG", - "name": "Sîngerei" - }, - { - "code": "SR", - "name": "Soroca" - }, - { - "code": "ST", - "name": "Strășeni" - }, - { - "code": "SD", - "name": "Șoldănești" - }, - { - "code": "SV", - "name": "Ștefan Vodă" - }, - { - "code": "TR", - "name": "Taraclia" - }, - { - "code": "TL", - "name": "Telenești" - }, - { - "code": "UN", - "name": "Ungheni" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MC", - "name": "Monaco", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MN", - "name": "Mongolia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ME", - "name": "Montenegro", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MS", - "name": "Montserrat", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MA", - "name": "Morocco", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MZ", - "name": "Mozambique", - "states": [{ - "code": "MZP", - "name": "Cabo Delgado" - }, - { - "code": "MZG", - "name": "Gaza" - }, - { - "code": "MZI", - "name": "Inhambane" - }, - { - "code": "MZB", - "name": "Manica" - }, - { - "code": "MZL", - "name": "Maputo Province" - }, - { - "code": "MZMPM", - "name": "Maputo" - }, - { - "code": "MZN", - "name": "Nampula" - }, - { - "code": "MZA", - "name": "Niassa" - }, - { - "code": "MZS", - "name": "Sofala" - }, - { - "code": "MZT", - "name": "Tete" - }, - { - "code": "MZQ", - "name": "Zambézia" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MM", - "name": "Myanmar", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NA", - "name": "Namibia", - "states": [{ - "code": "ER", - "name": "Erongo" - }, - { - "code": "HA", - "name": "Hardap" - }, - { - "code": "KA", - "name": "Karas" - }, - { - "code": "KE", - "name": "Kavango East" - }, - { - "code": "KW", - "name": "Kavango West" - }, - { - "code": "KH", - "name": "Khomas" - }, - { - "code": "KU", - "name": "Kunene" - }, - { - "code": "OW", - "name": "Ohangwena" - }, - { - "code": "OH", - "name": "Omaheke" - }, - { - "code": "OS", - "name": "Omusati" - }, - { - "code": "ON", - "name": "Oshana" - }, - { - "code": "OT", - "name": "Oshikoto" - }, - { - "code": "OD", - "name": "Otjozondjupa" - }, - { - "code": "CA", - "name": "Zambezi" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NR", - "name": "Nauru", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NP", - "name": "Nepal", - "states": [{ - "code": "BAG", - "name": "Bagmati" - }, - { - "code": "BHE", - "name": "Bheri" - }, - { - "code": "DHA", - "name": "Dhaulagiri" - }, - { - "code": "GAN", - "name": "Gandaki" - }, - { - "code": "JAN", - "name": "Janakpur" - }, - { - "code": "KAR", - "name": "Karnali" - }, - { - "code": "KOS", - "name": "Koshi" - }, - { - "code": "LUM", - "name": "Lumbini" - }, - { - "code": "MAH", - "name": "Mahakali" - }, - { - "code": "MEC", - "name": "Mechi" - }, - { - "code": "NAR", - "name": "Narayani" - }, - { - "code": "RAP", - "name": "Rapti" - }, - { - "code": "SAG", - "name": "Sagarmatha" - }, - { - "code": "SET", - "name": "Seti" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NL", - "name": "Netherlands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NC", - "name": "New Caledonia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NZ", - "name": "New Zealand", - "states": expect.arrayContaining([]), - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NI", - "name": "Nicaragua", - "states": [{ - "code": "NI-AN", - "name": "Atlántico Norte" - }, - { - "code": "NI-AS", - "name": "Atlántico Sur" - }, - { - "code": "NI-BO", - "name": "Boaco" - }, - { - "code": "NI-CA", - "name": "Carazo" - }, - { - "code": "NI-CI", - "name": "Chinandega" - }, - { - "code": "NI-CO", - "name": "Chontales" - }, - { - "code": "NI-ES", - "name": "Estelí" - }, - { - "code": "NI-GR", - "name": "Granada" - }, - { - "code": "NI-JI", - "name": "Jinotega" - }, - { - "code": "NI-LE", - "name": "León" - }, - { - "code": "NI-MD", - "name": "Madriz" - }, - { - "code": "NI-MN", - "name": "Managua" - }, - { - "code": "NI-MS", - "name": "Masaya" - }, - { - "code": "NI-MT", - "name": "Matagalpa" - }, - { - "code": "NI-NS", - "name": "Nueva Segovia" - }, - { - "code": "NI-RI", - "name": "Rivas" - }, - { - "code": "NI-SJ", - "name": "Río San Juan" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NE", - "name": "Niger", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NG", - "name": "Nigeria", - "states": [{ - "code": "AB", - "name": "Abia" - }, - { - "code": "FC", - "name": "Abuja" - }, - { - "code": "AD", - "name": "Adamawa" - }, - { - "code": "AK", - "name": "Akwa Ibom" - }, - { - "code": "AN", - "name": "Anambra" - }, - { - "code": "BA", - "name": "Bauchi" - }, - { - "code": "BY", - "name": "Bayelsa" - }, - { - "code": "BE", - "name": "Benue" - }, - { - "code": "BO", - "name": "Borno" - }, - { - "code": "CR", - "name": "Cross River" - }, - { - "code": "DE", - "name": "Delta" - }, - { - "code": "EB", - "name": "Ebonyi" - }, - { - "code": "ED", - "name": "Edo" - }, - { - "code": "EK", - "name": "Ekiti" - }, - { - "code": "EN", - "name": "Enugu" - }, - { - "code": "GO", - "name": "Gombe" - }, - { - "code": "IM", - "name": "Imo" - }, - { - "code": "JI", - "name": "Jigawa" - }, - { - "code": "KD", - "name": "Kaduna" - }, - { - "code": "KN", - "name": "Kano" - }, - { - "code": "KT", - "name": "Katsina" - }, - { - "code": "KE", - "name": "Kebbi" - }, - { - "code": "KO", - "name": "Kogi" - }, - { - "code": "KW", - "name": "Kwara" - }, - { - "code": "LA", - "name": "Lagos" - }, - { - "code": "NA", - "name": "Nasarawa" - }, - { - "code": "NI", - "name": "Niger" - }, - { - "code": "OG", - "name": "Ogun" - }, - { - "code": "ON", - "name": "Ondo" - }, - { - "code": "OS", - "name": "Osun" - }, - { - "code": "OY", - "name": "Oyo" - }, - { - "code": "PL", - "name": "Plateau" - }, - { - "code": "RI", - "name": "Rivers" - }, - { - "code": "SO", - "name": "Sokoto" - }, - { - "code": "TA", - "name": "Taraba" - }, - { - "code": "YO", - "name": "Yobe" - }, - { - "code": "ZA", - "name": "Zamfara" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NU", - "name": "Niue", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NF", - "name": "Norfolk Island", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KP", - "name": "North Korea", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MK", - "name": "North Macedonia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MP", - "name": "Northern Mariana Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "NO", - "name": "Norway", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "OM", - "name": "Oman", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PK", - "name": "Pakistan", - "states": [{ - "code": "JK", - "name": "Azad Kashmir" - }, - { - "code": "BA", - "name": "Balochistan" - }, - { - "code": "TA", - "name": "FATA" - }, - { - "code": "GB", - "name": "Gilgit Baltistan" - }, - { - "code": "IS", - "name": "Islamabad Capital Territory" - }, - { - "code": "KP", - "name": "Khyber Pakhtunkhwa" - }, - { - "code": "PB", - "name": "Punjab" - }, - { - "code": "SD", - "name": "Sindh" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PS", - "name": "Palestinian Territory", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PA", - "name": "Panama", - "states": [{ - "code": "PA-1", - "name": "Bocas del Toro" - }, - { - "code": "PA-2", - "name": "Coclé" - }, - { - "code": "PA-3", - "name": "Colón" - }, - { - "code": "PA-4", - "name": "Chiriquí" - }, - { - "code": "PA-5", - "name": "Darién" - }, - { - "code": "PA-6", - "name": "Herrera" - }, - { - "code": "PA-7", - "name": "Los Santos" - }, - { - "code": "PA-8", - "name": "Panamá" - }, - { - "code": "PA-9", - "name": "Veraguas" - }, - { - "code": "PA-10", - "name": "West Panamá" - }, - { - "code": "PA-EM", - "name": "Emberá" - }, - { - "code": "PA-KY", - "name": "Guna Yala" - }, - { - "code": "PA-NB", - "name": "Ngöbe-Buglé" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PG", - "name": "Papua New Guinea", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PY", - "name": "Paraguay", - "states": [{ - "code": "PY-ASU", - "name": "Asunción" - }, - { - "code": "PY-1", - "name": "Concepción" - }, - { - "code": "PY-2", - "name": "San Pedro" - }, - { - "code": "PY-3", - "name": "Cordillera" - }, - { - "code": "PY-4", - "name": "Guairá" - }, - { - "code": "PY-5", - "name": "Caaguazú" - }, - { - "code": "PY-6", - "name": "Caazapá" - }, - { - "code": "PY-7", - "name": "Itapúa" - }, - { - "code": "PY-8", - "name": "Misiones" - }, - { - "code": "PY-9", - "name": "Paraguarí" - }, - { - "code": "PY-10", - "name": "Alto Paraná" - }, - { - "code": "PY-11", - "name": "Central" - }, - { - "code": "PY-12", - "name": "Ñeembucú" - }, - { - "code": "PY-13", - "name": "Amambay" - }, - { - "code": "PY-14", - "name": "Canindeyú" - }, - { - "code": "PY-15", - "name": "Presidente Hayes" - }, - { - "code": "PY-16", - "name": "Alto Paraguay" - }, - { - "code": "PY-17", - "name": "Boquerón" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PE", - "name": "Peru", - "states": [{ - "code": "CAL", - "name": "El Callao" - }, - { - "code": "LMA", - "name": "Municipalidad Metropolitana de Lima" - }, - { - "code": "AMA", - "name": "Amazonas" - }, - { - "code": "ANC", - "name": "Ancash" - }, - { - "code": "APU", - "name": "Apurímac" - }, - { - "code": "ARE", - "name": "Arequipa" - }, - { - "code": "AYA", - "name": "Ayacucho" - }, - { - "code": "CAJ", - "name": "Cajamarca" - }, - { - "code": "CUS", - "name": "Cusco" - }, - { - "code": "HUV", - "name": "Huancavelica" - }, - { - "code": "HUC", - "name": "Huánuco" - }, - { - "code": "ICA", - "name": "Ica" - }, - { - "code": "JUN", - "name": "Junín" - }, - { - "code": "LAL", - "name": "La Libertad" - }, - { - "code": "LAM", - "name": "Lambayeque" - }, - { - "code": "LIM", - "name": "Lima" - }, - { - "code": "LOR", - "name": "Loreto" - }, - { - "code": "MDD", - "name": "Madre de Dios" - }, - { - "code": "MOQ", - "name": "Moquegua" - }, - { - "code": "PAS", - "name": "Pasco" - }, - { - "code": "PIU", - "name": "Piura" - }, - { - "code": "PUN", - "name": "Puno" - }, - { - "code": "SAM", - "name": "San Martín" - }, - { - "code": "TAC", - "name": "Tacna" - }, - { - "code": "TUM", - "name": "Tumbes" - }, - { - "code": "UCA", - "name": "Ucayali" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PH", - "name": "Philippines", - "states": [{ - "code": "ABR", - "name": "Abra" - }, - { - "code": "AGN", - "name": "Agusan del Norte" - }, - { - "code": "AGS", - "name": "Agusan del Sur" - }, - { - "code": "AKL", - "name": "Aklan" - }, - { - "code": "ALB", - "name": "Albay" - }, - { - "code": "ANT", - "name": "Antique" - }, - { - "code": "APA", - "name": "Apayao" - }, - { - "code": "AUR", - "name": "Aurora" - }, - { - "code": "BAS", - "name": "Basilan" - }, - { - "code": "BAN", - "name": "Bataan" - }, - { - "code": "BTN", - "name": "Batanes" - }, - { - "code": "BTG", - "name": "Batangas" - }, - { - "code": "BEN", - "name": "Benguet" - }, - { - "code": "BIL", - "name": "Biliran" - }, - { - "code": "BOH", - "name": "Bohol" - }, - { - "code": "BUK", - "name": "Bukidnon" - }, - { - "code": "BUL", - "name": "Bulacan" - }, - { - "code": "CAG", - "name": "Cagayan" - }, - { - "code": "CAN", - "name": "Camarines Norte" - }, - { - "code": "CAS", - "name": "Camarines Sur" - }, - { - "code": "CAM", - "name": "Camiguin" - }, - { - "code": "CAP", - "name": "Capiz" - }, - { - "code": "CAT", - "name": "Catanduanes" - }, - { - "code": "CAV", - "name": "Cavite" - }, - { - "code": "CEB", - "name": "Cebu" - }, - { - "code": "COM", - "name": "Compostela Valley" - }, - { - "code": "NCO", - "name": "Cotabato" - }, - { - "code": "DAV", - "name": "Davao del Norte" - }, - { - "code": "DAS", - "name": "Davao del Sur" - }, - { - "code": "DAC", - "name": "Davao Occidental" - }, - { - "code": "DAO", - "name": "Davao Oriental" - }, - { - "code": "DIN", - "name": "Dinagat Islands" - }, - { - "code": "EAS", - "name": "Eastern Samar" - }, - { - "code": "GUI", - "name": "Guimaras" - }, - { - "code": "IFU", - "name": "Ifugao" - }, - { - "code": "ILN", - "name": "Ilocos Norte" - }, - { - "code": "ILS", - "name": "Ilocos Sur" - }, - { - "code": "ILI", - "name": "Iloilo" - }, - { - "code": "ISA", - "name": "Isabela" - }, - { - "code": "KAL", - "name": "Kalinga" - }, - { - "code": "LUN", - "name": "La Union" - }, - { - "code": "LAG", - "name": "Laguna" - }, - { - "code": "LAN", - "name": "Lanao del Norte" - }, - { - "code": "LAS", - "name": "Lanao del Sur" - }, - { - "code": "LEY", - "name": "Leyte" - }, - { - "code": "MAG", - "name": "Maguindanao" - }, - { - "code": "MAD", - "name": "Marinduque" - }, - { - "code": "MAS", - "name": "Masbate" - }, - { - "code": "MSC", - "name": "Misamis Occidental" - }, - { - "code": "MSR", - "name": "Misamis Oriental" - }, - { - "code": "MOU", - "name": "Mountain Province" - }, - { - "code": "NEC", - "name": "Negros Occidental" - }, - { - "code": "NER", - "name": "Negros Oriental" - }, - { - "code": "NSA", - "name": "Northern Samar" - }, - { - "code": "NUE", - "name": "Nueva Ecija" - }, - { - "code": "NUV", - "name": "Nueva Vizcaya" - }, - { - "code": "MDC", - "name": "Occidental Mindoro" - }, - { - "code": "MDR", - "name": "Oriental Mindoro" - }, - { - "code": "PLW", - "name": "Palawan" - }, - { - "code": "PAM", - "name": "Pampanga" - }, - { - "code": "PAN", - "name": "Pangasinan" - }, - { - "code": "QUE", - "name": "Quezon" - }, - { - "code": "QUI", - "name": "Quirino" - }, - { - "code": "RIZ", - "name": "Rizal" - }, - { - "code": "ROM", - "name": "Romblon" - }, - { - "code": "WSA", - "name": "Samar" - }, - { - "code": "SAR", - "name": "Sarangani" - }, - { - "code": "SIQ", - "name": "Siquijor" - }, - { - "code": "SOR", - "name": "Sorsogon" - }, - { - "code": "SCO", - "name": "South Cotabato" - }, - { - "code": "SLE", - "name": "Southern Leyte" - }, - { - "code": "SUK", - "name": "Sultan Kudarat" - }, - { - "code": "SLU", - "name": "Sulu" - }, - { - "code": "SUN", - "name": "Surigao del Norte" - }, - { - "code": "SUR", - "name": "Surigao del Sur" - }, - { - "code": "TAR", - "name": "Tarlac" - }, - { - "code": "TAW", - "name": "Tawi-Tawi" - }, - { - "code": "ZMB", - "name": "Zambales" - }, - { - "code": "ZAN", - "name": "Zamboanga del Norte" - }, - { - "code": "ZAS", - "name": "Zamboanga del Sur" - }, - { - "code": "ZSI", - "name": "Zamboanga Sibugay" - }, - { - "code": "00", - "name": "Metro Manila" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PN", - "name": "Pitcairn", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PL", - "name": "Poland", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PT", - "name": "Portugal", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PR", - "name": "Puerto Rico", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "QA", - "name": "Qatar", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "RE", - "name": "Reunion", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "RO", - "name": "Romania", - "states": [{ - "code": "AB", - "name": "Alba" - }, - { - "code": "AR", - "name": "Arad" - }, - { - "code": "AG", - "name": "Argeș" - }, - { - "code": "BC", - "name": "Bacău" - }, - { - "code": "BH", - "name": "Bihor" - }, - { - "code": "BN", - "name": "Bistrița-Năsăud" - }, - { - "code": "BT", - "name": "Botoșani" - }, - { - "code": "BR", - "name": "Brăila" - }, - { - "code": "BV", - "name": "Brașov" - }, - { - "code": "B", - "name": "București" - }, - { - "code": "BZ", - "name": "Buzău" - }, - { - "code": "CL", - "name": "Călărași" - }, - { - "code": "CS", - "name": "Caraș-Severin" - }, - { - "code": "CJ", - "name": "Cluj" - }, - { - "code": "CT", - "name": "Constanța" - }, - { - "code": "CV", - "name": "Covasna" - }, - { - "code": "DB", - "name": "Dâmbovița" - }, - { - "code": "DJ", - "name": "Dolj" - }, - { - "code": "GL", - "name": "Galați" - }, - { - "code": "GR", - "name": "Giurgiu" - }, - { - "code": "GJ", - "name": "Gorj" - }, - { - "code": "HR", - "name": "Harghita" - }, - { - "code": "HD", - "name": "Hunedoara" - }, - { - "code": "IL", - "name": "Ialomița" - }, - { - "code": "IS", - "name": "Iași" - }, - { - "code": "IF", - "name": "Ilfov" - }, - { - "code": "MM", - "name": "Maramureș" - }, - { - "code": "MH", - "name": "Mehedinți" - }, - { - "code": "MS", - "name": "Mureș" - }, - { - "code": "NT", - "name": "Neamț" - }, - { - "code": "OT", - "name": "Olt" - }, - { - "code": "PH", - "name": "Prahova" - }, - { - "code": "SJ", - "name": "Sălaj" - }, - { - "code": "SM", - "name": "Satu Mare" - }, - { - "code": "SB", - "name": "Sibiu" - }, - { - "code": "SV", - "name": "Suceava" - }, - { - "code": "TR", - "name": "Teleorman" - }, - { - "code": "TM", - "name": "Timiș" - }, - { - "code": "TL", - "name": "Tulcea" - }, - { - "code": "VL", - "name": "Vâlcea" - }, - { - "code": "VS", - "name": "Vaslui" - }, - { - "code": "VN", - "name": "Vrancea" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "RU", - "name": "Russia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "RW", - "name": "Rwanda", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ST", - "name": "São Tomé and Príncipe", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "BL", - "name": "Saint Barthélemy", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SH", - "name": "Saint Helena", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KN", - "name": "Saint Kitts and Nevis", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LC", - "name": "Saint Lucia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SX", - "name": "Saint Martin (Dutch part)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "MF", - "name": "Saint Martin (French part)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "PM", - "name": "Saint Pierre and Miquelon", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VC", - "name": "Saint Vincent and the Grenadines", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "WS", - "name": "Samoa", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SM", - "name": "San Marino", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SA", - "name": "Saudi Arabia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SN", - "name": "Senegal", - "states": expect.arrayContaining([]), - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "RS", - "name": "Serbia", - "states": [{ - "code": "RS00", - "name": "Belgrade" - }, - { - "code": "RS14", - "name": "Bor" - }, - { - "code": "RS11", - "name": "Braničevo" - }, - { - "code": "RS02", - "name": "Central Banat" - }, - { - "code": "RS10", - "name": "Danube" - }, - { - "code": "RS23", - "name": "Jablanica" - }, - { - "code": "RS09", - "name": "Kolubara" - }, - { - "code": "RS08", - "name": "Mačva" - }, - { - "code": "RS17", - "name": "Morava" - }, - { - "code": "RS20", - "name": "Nišava" - }, - { - "code": "RS01", - "name": "North Bačka" - }, - { - "code": "RS03", - "name": "North Banat" - }, - { - "code": "RS24", - "name": "Pčinja" - }, - { - "code": "RS22", - "name": "Pirot" - }, - { - "code": "RS13", - "name": "Pomoravlje" - }, - { - "code": "RS19", - "name": "Rasina" - }, - { - "code": "RS18", - "name": "Raška" - }, - { - "code": "RS06", - "name": "South Bačka" - }, - { - "code": "RS04", - "name": "South Banat" - }, - { - "code": "RS07", - "name": "Srem" - }, - { - "code": "RS12", - "name": "Šumadija" - }, - { - "code": "RS21", - "name": "Toplica" - }, - { - "code": "RS05", - "name": "West Bačka" - }, - { - "code": "RS15", - "name": "Zaječar" - }, - { - "code": "RS16", - "name": "Zlatibor" - }, - { - "code": "RS25", - "name": "Kosovo" - }, - { - "code": "RS26", - "name": "Peć" - }, - { - "code": "RS27", - "name": "Prizren" - }, - { - "code": "RS28", - "name": "Kosovska Mitrovica" - }, - { - "code": "RS29", - "name": "Kosovo-Pomoravlje" - }, - { - "code": "RSKM", - "name": "Kosovo-Metohija" - }, - { - "code": "RSVO", - "name": "Vojvodina" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SC", - "name": "Seychelles", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SL", - "name": "Sierra Leone", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SG", - "name": "Singapore", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SK", - "name": "Slovakia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SI", - "name": "Slovenia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SB", - "name": "Solomon Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SO", - "name": "Somalia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ZA", - "name": "South Africa", - "states": [{ - "code": "EC", - "name": "Eastern Cape" - }, - { - "code": "FS", - "name": "Free State" - }, - { - "code": "GP", - "name": "Gauteng" - }, - { - "code": "KZN", - "name": "KwaZulu-Natal" - }, - { - "code": "LP", - "name": "Limpopo" - }, - { - "code": "MP", - "name": "Mpumalanga" - }, - { - "code": "NC", - "name": "Northern Cape" - }, - { - "code": "NW", - "name": "North West" - }, - { - "code": "WC", - "name": "Western Cape" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GS", - "name": "South Georgia/Sandwich Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "KR", - "name": "South Korea", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SS", - "name": "South Sudan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ES", - "name": "Spain", - "states": [{ - "code": "C", - "name": "A Coruña" - }, - { - "code": "VI", - "name": "Araba/Álava" - }, - { - "code": "AB", - "name": "Albacete" - }, - { - "code": "A", - "name": "Alicante" - }, - { - "code": "AL", - "name": "Almería" - }, - { - "code": "O", - "name": "Asturias" - }, - { - "code": "AV", - "name": "Ávila" - }, - { - "code": "BA", - "name": "Badajoz" - }, - { - "code": "PM", - "name": "Baleares" - }, - { - "code": "B", - "name": "Barcelona" - }, - { - "code": "BU", - "name": "Burgos" - }, - { - "code": "CC", - "name": "Cáceres" - }, - { - "code": "CA", - "name": "Cádiz" - }, - { - "code": "S", - "name": "Cantabria" - }, - { - "code": "CS", - "name": "Castellón" - }, - { - "code": "CE", - "name": "Ceuta" - }, - { - "code": "CR", - "name": "Ciudad Real" - }, - { - "code": "CO", - "name": "Córdoba" - }, - { - "code": "CU", - "name": "Cuenca" - }, - { - "code": "GI", - "name": "Girona" - }, - { - "code": "GR", - "name": "Granada" - }, - { - "code": "GU", - "name": "Guadalajara" - }, - { - "code": "SS", - "name": "Gipuzkoa" - }, - { - "code": "H", - "name": "Huelva" - }, - { - "code": "HU", - "name": "Huesca" - }, - { - "code": "J", - "name": "Jaén" - }, - { - "code": "LO", - "name": "La Rioja" - }, - { - "code": "GC", - "name": "Las Palmas" - }, - { - "code": "LE", - "name": "León" - }, - { - "code": "L", - "name": "Lleida" - }, - { - "code": "LU", - "name": "Lugo" - }, - { - "code": "M", - "name": "Madrid" - }, - { - "code": "MA", - "name": "Málaga" - }, - { - "code": "ML", - "name": "Melilla" - }, - { - "code": "MU", - "name": "Murcia" - }, - { - "code": "NA", - "name": "Navarra" - }, - { - "code": "OR", - "name": "Ourense" - }, - { - "code": "P", - "name": "Palencia" - }, - { - "code": "PO", - "name": "Pontevedra" - }, - { - "code": "SA", - "name": "Salamanca" - }, - { - "code": "TF", - "name": "Santa Cruz de Tenerife" - }, - { - "code": "SG", - "name": "Segovia" - }, - { - "code": "SE", - "name": "Sevilla" - }, - { - "code": "SO", - "name": "Soria" - }, - { - "code": "T", - "name": "Tarragona" - }, - { - "code": "TE", - "name": "Teruel" - }, - { - "code": "TO", - "name": "Toledo" - }, - { - "code": "V", - "name": "Valencia" - }, - { - "code": "VA", - "name": "Valladolid" - }, - { - "code": "BI", - "name": "Biscay" - }, - { - "code": "ZA", - "name": "Zamora" - }, - { - "code": "Z", - "name": "Zaragoza" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "LK", - "name": "Sri Lanka", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SD", - "name": "Sudan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SR", - "name": "Suriname", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SJ", - "name": "Svalbard and Jan Mayen", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SE", - "name": "Sweden", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "CH", - "name": "Switzerland", - "states": [{ - "code": "AG", - "name": "Aargau" - }, - { - "code": "AR", - "name": "Appenzell Ausserrhoden" - }, - { - "code": "AI", - "name": "Appenzell Innerrhoden" - }, - { - "code": "BL", - "name": "Basel-Landschaft" - }, - { - "code": "BS", - "name": "Basel-Stadt" - }, - { - "code": "BE", - "name": "Bern" - }, - { - "code": "FR", - "name": "Fribourg" - }, - { - "code": "GE", - "name": "Geneva" - }, - { - "code": "GL", - "name": "Glarus" - }, - { - "code": "GR", - "name": "Graubünden" - }, - { - "code": "JU", - "name": "Jura" - }, - { - "code": "LU", - "name": "Luzern" - }, - { - "code": "NE", - "name": "Neuchâtel" - }, - { - "code": "NW", - "name": "Nidwalden" - }, - { - "code": "OW", - "name": "Obwalden" - }, - { - "code": "SH", - "name": "Schaffhausen" - }, - { - "code": "SZ", - "name": "Schwyz" - }, - { - "code": "SO", - "name": "Solothurn" - }, - { - "code": "SG", - "name": "St. Gallen" - }, - { - "code": "TG", - "name": "Thurgau" - }, - { - "code": "TI", - "name": "Ticino" - }, - { - "code": "UR", - "name": "Uri" - }, - { - "code": "VS", - "name": "Valais" - }, - { - "code": "VD", - "name": "Vaud" - }, - { - "code": "ZG", - "name": "Zug" - }, - { - "code": "ZH", - "name": "Zürich" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "SY", - "name": "Syria", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TW", - "name": "Taiwan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TJ", - "name": "Tajikistan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TZ", - "name": "Tanzania", - "states": [{ - "code": "TZ01", - "name": "Arusha" - }, - { - "code": "TZ02", - "name": "Dar es Salaam" - }, - { - "code": "TZ03", - "name": "Dodoma" - }, - { - "code": "TZ04", - "name": "Iringa" - }, - { - "code": "TZ05", - "name": "Kagera" - }, - { - "code": "TZ06", - "name": "Pemba North" - }, - { - "code": "TZ07", - "name": "Zanzibar North" - }, - { - "code": "TZ08", - "name": "Kigoma" - }, - { - "code": "TZ09", - "name": "Kilimanjaro" - }, - { - "code": "TZ10", - "name": "Pemba South" - }, - { - "code": "TZ11", - "name": "Zanzibar South" - }, - { - "code": "TZ12", - "name": "Lindi" - }, - { - "code": "TZ13", - "name": "Mara" - }, - { - "code": "TZ14", - "name": "Mbeya" - }, - { - "code": "TZ15", - "name": "Zanzibar West" - }, - { - "code": "TZ16", - "name": "Morogoro" - }, - { - "code": "TZ17", - "name": "Mtwara" - }, - { - "code": "TZ18", - "name": "Mwanza" - }, - { - "code": "TZ19", - "name": "Coast" - }, - { - "code": "TZ20", - "name": "Rukwa" - }, - { - "code": "TZ21", - "name": "Ruvuma" - }, - { - "code": "TZ22", - "name": "Shinyanga" - }, - { - "code": "TZ23", - "name": "Singida" - }, - { - "code": "TZ24", - "name": "Tabora" - }, - { - "code": "TZ25", - "name": "Tanga" - }, - { - "code": "TZ26", - "name": "Manyara" - }, - { - "code": "TZ27", - "name": "Geita" - }, - { - "code": "TZ28", - "name": "Katavi" - }, - { - "code": "TZ29", - "name": "Njombe" - }, - { - "code": "TZ30", - "name": "Simiyu" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TH", - "name": "Thailand", - "states": [{ - "code": "TH-37", - "name": "Amnat Charoen" - }, - { - "code": "TH-15", - "name": "Ang Thong" - }, - { - "code": "TH-14", - "name": "Ayutthaya" - }, - { - "code": "TH-10", - "name": "Bangkok" - }, - { - "code": "TH-38", - "name": "Bueng Kan" - }, - { - "code": "TH-31", - "name": "Buri Ram" - }, - { - "code": "TH-24", - "name": "Chachoengsao" - }, - { - "code": "TH-18", - "name": "Chai Nat" - }, - { - "code": "TH-36", - "name": "Chaiyaphum" - }, - { - "code": "TH-22", - "name": "Chanthaburi" - }, - { - "code": "TH-50", - "name": "Chiang Mai" - }, - { - "code": "TH-57", - "name": "Chiang Rai" - }, - { - "code": "TH-20", - "name": "Chonburi" - }, - { - "code": "TH-86", - "name": "Chumphon" - }, - { - "code": "TH-46", - "name": "Kalasin" - }, - { - "code": "TH-62", - "name": "Kamphaeng Phet" - }, - { - "code": "TH-71", - "name": "Kanchanaburi" - }, - { - "code": "TH-40", - "name": "Khon Kaen" - }, - { - "code": "TH-81", - "name": "Krabi" - }, - { - "code": "TH-52", - "name": "Lampang" - }, - { - "code": "TH-51", - "name": "Lamphun" - }, - { - "code": "TH-42", - "name": "Loei" - }, - { - "code": "TH-16", - "name": "Lopburi" - }, - { - "code": "TH-58", - "name": "Mae Hong Son" - }, - { - "code": "TH-44", - "name": "Maha Sarakham" - }, - { - "code": "TH-49", - "name": "Mukdahan" - }, - { - "code": "TH-26", - "name": "Nakhon Nayok" - }, - { - "code": "TH-73", - "name": "Nakhon Pathom" - }, - { - "code": "TH-48", - "name": "Nakhon Phanom" - }, - { - "code": "TH-30", - "name": "Nakhon Ratchasima" - }, - { - "code": "TH-60", - "name": "Nakhon Sawan" - }, - { - "code": "TH-80", - "name": "Nakhon Si Thammarat" - }, - { - "code": "TH-55", - "name": "Nan" - }, - { - "code": "TH-96", - "name": "Narathiwat" - }, - { - "code": "TH-39", - "name": "Nong Bua Lam Phu" - }, - { - "code": "TH-43", - "name": "Nong Khai" - }, - { - "code": "TH-12", - "name": "Nonthaburi" - }, - { - "code": "TH-13", - "name": "Pathum Thani" - }, - { - "code": "TH-94", - "name": "Pattani" - }, - { - "code": "TH-82", - "name": "Phang Nga" - }, - { - "code": "TH-93", - "name": "Phatthalung" - }, - { - "code": "TH-56", - "name": "Phayao" - }, - { - "code": "TH-67", - "name": "Phetchabun" - }, - { - "code": "TH-76", - "name": "Phetchaburi" - }, - { - "code": "TH-66", - "name": "Phichit" - }, - { - "code": "TH-65", - "name": "Phitsanulok" - }, - { - "code": "TH-54", - "name": "Phrae" - }, - { - "code": "TH-83", - "name": "Phuket" - }, - { - "code": "TH-25", - "name": "Prachin Buri" - }, - { - "code": "TH-77", - "name": "Prachuap Khiri Khan" - }, - { - "code": "TH-85", - "name": "Ranong" - }, - { - "code": "TH-70", - "name": "Ratchaburi" - }, - { - "code": "TH-21", - "name": "Rayong" - }, - { - "code": "TH-45", - "name": "Roi Et" - }, - { - "code": "TH-27", - "name": "Sa Kaeo" - }, - { - "code": "TH-47", - "name": "Sakon Nakhon" - }, - { - "code": "TH-11", - "name": "Samut Prakan" - }, - { - "code": "TH-74", - "name": "Samut Sakhon" - }, - { - "code": "TH-75", - "name": "Samut Songkhram" - }, - { - "code": "TH-19", - "name": "Saraburi" - }, - { - "code": "TH-91", - "name": "Satun" - }, - { - "code": "TH-17", - "name": "Sing Buri" - }, - { - "code": "TH-33", - "name": "Sisaket" - }, - { - "code": "TH-90", - "name": "Songkhla" - }, - { - "code": "TH-64", - "name": "Sukhothai" - }, - { - "code": "TH-72", - "name": "Suphan Buri" - }, - { - "code": "TH-84", - "name": "Surat Thani" - }, - { - "code": "TH-32", - "name": "Surin" - }, - { - "code": "TH-63", - "name": "Tak" - }, - { - "code": "TH-92", - "name": "Trang" - }, - { - "code": "TH-23", - "name": "Trat" - }, - { - "code": "TH-34", - "name": "Ubon Ratchathani" - }, - { - "code": "TH-41", - "name": "Udon Thani" - }, - { - "code": "TH-61", - "name": "Uthai Thani" - }, - { - "code": "TH-53", - "name": "Uttaradit" - }, - { - "code": "TH-95", - "name": "Yala" - }, - { - "code": "TH-35", - "name": "Yasothon" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TL", - "name": "Timor-Leste", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TG", - "name": "Togo", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TK", - "name": "Tokelau", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TO", - "name": "Tonga", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TT", - "name": "Trinidad and Tobago", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TN", - "name": "Tunisia", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TR", - "name": "Turkey", - "states": [{ - "code": "TR01", - "name": "Adana" - }, - { - "code": "TR02", - "name": "Adıyaman" - }, - { - "code": "TR03", - "name": "Afyon" - }, - { - "code": "TR04", - "name": "Ağrı" - }, - { - "code": "TR05", - "name": "Amasya" - }, - { - "code": "TR06", - "name": "Ankara" - }, - { - "code": "TR07", - "name": "Antalya" - }, - { - "code": "TR08", - "name": "Artvin" - }, - { - "code": "TR09", - "name": "Aydın" - }, - { - "code": "TR10", - "name": "Balıkesir" - }, - { - "code": "TR11", - "name": "Bilecik" - }, - { - "code": "TR12", - "name": "Bingöl" - }, - { - "code": "TR13", - "name": "Bitlis" - }, - { - "code": "TR14", - "name": "Bolu" - }, - { - "code": "TR15", - "name": "Burdur" - }, - { - "code": "TR16", - "name": "Bursa" - }, - { - "code": "TR17", - "name": "Çanakkale" - }, - { - "code": "TR18", - "name": "Çankırı" - }, - { - "code": "TR19", - "name": "Çorum" - }, - { - "code": "TR20", - "name": "Denizli" - }, - { - "code": "TR21", - "name": "Diyarbakır" - }, - { - "code": "TR22", - "name": "Edirne" - }, - { - "code": "TR23", - "name": "Elazığ" - }, - { - "code": "TR24", - "name": "Erzincan" - }, - { - "code": "TR25", - "name": "Erzurum" - }, - { - "code": "TR26", - "name": "Eskişehir" - }, - { - "code": "TR27", - "name": "Gaziantep" - }, - { - "code": "TR28", - "name": "Giresun" - }, - { - "code": "TR29", - "name": "Gümüşhane" - }, - { - "code": "TR30", - "name": "Hakkari" - }, - { - "code": "TR31", - "name": "Hatay" - }, - { - "code": "TR32", - "name": "Isparta" - }, - { - "code": "TR33", - "name": "İçel" - }, - { - "code": "TR34", - "name": "İstanbul" - }, - { - "code": "TR35", - "name": "İzmir" - }, - { - "code": "TR36", - "name": "Kars" - }, - { - "code": "TR37", - "name": "Kastamonu" - }, - { - "code": "TR38", - "name": "Kayseri" - }, - { - "code": "TR39", - "name": "Kırklareli" - }, - { - "code": "TR40", - "name": "Kırşehir" - }, - { - "code": "TR41", - "name": "Kocaeli" - }, - { - "code": "TR42", - "name": "Konya" - }, - { - "code": "TR43", - "name": "Kütahya" - }, - { - "code": "TR44", - "name": "Malatya" - }, - { - "code": "TR45", - "name": "Manisa" - }, - { - "code": "TR46", - "name": "Kahramanmaraş" - }, - { - "code": "TR47", - "name": "Mardin" - }, - { - "code": "TR48", - "name": "Muğla" - }, - { - "code": "TR49", - "name": "Muş" - }, - { - "code": "TR50", - "name": "Nevşehir" - }, - { - "code": "TR51", - "name": "Niğde" - }, - { - "code": "TR52", - "name": "Ordu" - }, - { - "code": "TR53", - "name": "Rize" - }, - { - "code": "TR54", - "name": "Sakarya" - }, - { - "code": "TR55", - "name": "Samsun" - }, - { - "code": "TR56", - "name": "Siirt" - }, - { - "code": "TR57", - "name": "Sinop" - }, - { - "code": "TR58", - "name": "Sivas" - }, - { - "code": "TR59", - "name": "Tekirdağ" - }, - { - "code": "TR60", - "name": "Tokat" - }, - { - "code": "TR61", - "name": "Trabzon" - }, - { - "code": "TR62", - "name": "Tunceli" - }, - { - "code": "TR63", - "name": "Şanlıurfa" - }, - { - "code": "TR64", - "name": "Uşak" - }, - { - "code": "TR65", - "name": "Van" - }, - { - "code": "TR66", - "name": "Yozgat" - }, - { - "code": "TR67", - "name": "Zonguldak" - }, - { - "code": "TR68", - "name": "Aksaray" - }, - { - "code": "TR69", - "name": "Bayburt" - }, - { - "code": "TR70", - "name": "Karaman" - }, - { - "code": "TR71", - "name": "Kırıkkale" - }, - { - "code": "TR72", - "name": "Batman" - }, - { - "code": "TR73", - "name": "Şırnak" - }, - { - "code": "TR74", - "name": "Bartın" - }, - { - "code": "TR75", - "name": "Ardahan" - }, - { - "code": "TR76", - "name": "Iğdır" - }, - { - "code": "TR77", - "name": "Yalova" - }, - { - "code": "TR78", - "name": "Karabük" - }, - { - "code": "TR79", - "name": "Kilis" - }, - { - "code": "TR80", - "name": "Osmaniye" - }, - { - "code": "TR81", - "name": "Düzce" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TM", - "name": "Turkmenistan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TC", - "name": "Turks and Caicos Islands", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "TV", - "name": "Tuvalu", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "UG", - "name": "Uganda", - "states": [{ - "code": "UG314", - "name": "Abim" - }, - { - "code": "UG301", - "name": "Adjumani" - }, - { - "code": "UG322", - "name": "Agago" - }, - { - "code": "UG323", - "name": "Alebtong" - }, - { - "code": "UG315", - "name": "Amolatar" - }, - { - "code": "UG324", - "name": "Amudat" - }, - { - "code": "UG216", - "name": "Amuria" - }, - { - "code": "UG316", - "name": "Amuru" - }, - { - "code": "UG302", - "name": "Apac" - }, - { - "code": "UG303", - "name": "Arua" - }, - { - "code": "UG217", - "name": "Budaka" - }, - { - "code": "UG218", - "name": "Bududa" - }, - { - "code": "UG201", - "name": "Bugiri" - }, - { - "code": "UG235", - "name": "Bugweri" - }, - { - "code": "UG420", - "name": "Buhweju" - }, - { - "code": "UG117", - "name": "Buikwe" - }, - { - "code": "UG219", - "name": "Bukedea" - }, - { - "code": "UG118", - "name": "Bukomansimbi" - }, - { - "code": "UG220", - "name": "Bukwa" - }, - { - "code": "UG225", - "name": "Bulambuli" - }, - { - "code": "UG416", - "name": "Buliisa" - }, - { - "code": "UG401", - "name": "Bundibugyo" - }, - { - "code": "UG430", - "name": "Bunyangabu" - }, - { - "code": "UG402", - "name": "Bushenyi" - }, - { - "code": "UG202", - "name": "Busia" - }, - { - "code": "UG221", - "name": "Butaleja" - }, - { - "code": "UG119", - "name": "Butambala" - }, - { - "code": "UG233", - "name": "Butebo" - }, - { - "code": "UG120", - "name": "Buvuma" - }, - { - "code": "UG226", - "name": "Buyende" - }, - { - "code": "UG317", - "name": "Dokolo" - }, - { - "code": "UG121", - "name": "Gomba" - }, - { - "code": "UG304", - "name": "Gulu" - }, - { - "code": "UG403", - "name": "Hoima" - }, - { - "code": "UG417", - "name": "Ibanda" - }, - { - "code": "UG203", - "name": "Iganga" - }, - { - "code": "UG418", - "name": "Isingiro" - }, - { - "code": "UG204", - "name": "Jinja" - }, - { - "code": "UG318", - "name": "Kaabong" - }, - { - "code": "UG404", - "name": "Kabale" - }, - { - "code": "UG405", - "name": "Kabarole" - }, - { - "code": "UG213", - "name": "Kaberamaido" - }, - { - "code": "UG427", - "name": "Kagadi" - }, - { - "code": "UG428", - "name": "Kakumiro" - }, - { - "code": "UG101", - "name": "Kalangala" - }, - { - "code": "UG222", - "name": "Kaliro" - }, - { - "code": "UG122", - "name": "Kalungu" - }, - { - "code": "UG102", - "name": "Kampala" - }, - { - "code": "UG205", - "name": "Kamuli" - }, - { - "code": "UG413", - "name": "Kamwenge" - }, - { - "code": "UG414", - "name": "Kanungu" - }, - { - "code": "UG206", - "name": "Kapchorwa" - }, - { - "code": "UG236", - "name": "Kapelebyong" - }, - { - "code": "UG126", - "name": "Kasanda" - }, - { - "code": "UG406", - "name": "Kasese" - }, - { - "code": "UG207", - "name": "Katakwi" - }, - { - "code": "UG112", - "name": "Kayunga" - }, - { - "code": "UG407", - "name": "Kibaale" - }, - { - "code": "UG103", - "name": "Kiboga" - }, - { - "code": "UG227", - "name": "Kibuku" - }, - { - "code": "UG432", - "name": "Kikuube" - }, - { - "code": "UG419", - "name": "Kiruhura" - }, - { - "code": "UG421", - "name": "Kiryandongo" - }, - { - "code": "UG408", - "name": "Kisoro" - }, - { - "code": "UG305", - "name": "Kitgum" - }, - { - "code": "UG319", - "name": "Koboko" - }, - { - "code": "UG325", - "name": "Kole" - }, - { - "code": "UG306", - "name": "Kotido" - }, - { - "code": "UG208", - "name": "Kumi" - }, - { - "code": "UG333", - "name": "Kwania" - }, - { - "code": "UG228", - "name": "Kween" - }, - { - "code": "UG123", - "name": "Kyankwanzi" - }, - { - "code": "UG422", - "name": "Kyegegwa" - }, - { - "code": "UG415", - "name": "Kyenjojo" - }, - { - "code": "UG125", - "name": "Kyotera" - }, - { - "code": "UG326", - "name": "Lamwo" - }, - { - "code": "UG307", - "name": "Lira" - }, - { - "code": "UG229", - "name": "Luuka" - }, - { - "code": "UG104", - "name": "Luwero" - }, - { - "code": "UG124", - "name": "Lwengo" - }, - { - "code": "UG114", - "name": "Lyantonde" - }, - { - "code": "UG223", - "name": "Manafwa" - }, - { - "code": "UG320", - "name": "Maracha" - }, - { - "code": "UG105", - "name": "Masaka" - }, - { - "code": "UG409", - "name": "Masindi" - }, - { - "code": "UG214", - "name": "Mayuge" - }, - { - "code": "UG209", - "name": "Mbale" - }, - { - "code": "UG410", - "name": "Mbarara" - }, - { - "code": "UG423", - "name": "Mitooma" - }, - { - "code": "UG115", - "name": "Mityana" - }, - { - "code": "UG308", - "name": "Moroto" - }, - { - "code": "UG309", - "name": "Moyo" - }, - { - "code": "UG106", - "name": "Mpigi" - }, - { - "code": "UG107", - "name": "Mubende" - }, - { - "code": "UG108", - "name": "Mukono" - }, - { - "code": "UG334", - "name": "Nabilatuk" - }, - { - "code": "UG311", - "name": "Nakapiripirit" - }, - { - "code": "UG116", - "name": "Nakaseke" - }, - { - "code": "UG109", - "name": "Nakasongola" - }, - { - "code": "UG230", - "name": "Namayingo" - }, - { - "code": "UG234", - "name": "Namisindwa" - }, - { - "code": "UG224", - "name": "Namutumba" - }, - { - "code": "UG327", - "name": "Napak" - }, - { - "code": "UG310", - "name": "Nebbi" - }, - { - "code": "UG231", - "name": "Ngora" - }, - { - "code": "UG424", - "name": "Ntoroko" - }, - { - "code": "UG411", - "name": "Ntungamo" - }, - { - "code": "UG328", - "name": "Nwoya" - }, - { - "code": "UG331", - "name": "Omoro" - }, - { - "code": "UG329", - "name": "Otuke" - }, - { - "code": "UG321", - "name": "Oyam" - }, - { - "code": "UG312", - "name": "Pader" - }, - { - "code": "UG332", - "name": "Pakwach" - }, - { - "code": "UG210", - "name": "Pallisa" - }, - { - "code": "UG110", - "name": "Rakai" - }, - { - "code": "UG429", - "name": "Rubanda" - }, - { - "code": "UG425", - "name": "Rubirizi" - }, - { - "code": "UG431", - "name": "Rukiga" - }, - { - "code": "UG412", - "name": "Rukungiri" - }, - { - "code": "UG111", - "name": "Sembabule" - }, - { - "code": "UG232", - "name": "Serere" - }, - { - "code": "UG426", - "name": "Sheema" - }, - { - "code": "UG215", - "name": "Sironko" - }, - { - "code": "UG211", - "name": "Soroti" - }, - { - "code": "UG212", - "name": "Tororo" - }, - { - "code": "UG113", - "name": "Wakiso" - }, - { - "code": "UG313", - "name": "Yumbe" - }, - { - "code": "UG330", - "name": "Zombo" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "UA", - "name": "Ukraine", - "states": expect.arrayContaining([]), - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "AE", - "name": "United Arab Emirates", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "GB", - "name": "United Kingdom (UK)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "US", - "name": "United States (US)", - "states": [{ - "code": "AL", - "name": "Alabama" - }, - { - "code": "AK", - "name": "Alaska" - }, - { - "code": "AZ", - "name": "Arizona" - }, - { - "code": "AR", - "name": "Arkansas" - }, - { - "code": "CA", - "name": "California" - }, - { - "code": "CO", - "name": "Colorado" - }, - { - "code": "CT", - "name": "Connecticut" - }, - { - "code": "DE", - "name": "Delaware" - }, - { - "code": "DC", - "name": "District Of Columbia" - }, - { - "code": "FL", - "name": "Florida" - }, - { - "code": "GA", - "name": "Georgia" - }, - { - "code": "HI", - "name": "Hawaii" - }, - { - "code": "ID", - "name": "Idaho" - }, - { - "code": "IL", - "name": "Illinois" - }, - { - "code": "IN", - "name": "Indiana" - }, - { - "code": "IA", - "name": "Iowa" - }, - { - "code": "KS", - "name": "Kansas" - }, - { - "code": "KY", - "name": "Kentucky" - }, - { - "code": "LA", - "name": "Louisiana" - }, - { - "code": "ME", - "name": "Maine" - }, - { - "code": "MD", - "name": "Maryland" - }, - { - "code": "MA", - "name": "Massachusetts" - }, - { - "code": "MI", - "name": "Michigan" - }, - { - "code": "MN", - "name": "Minnesota" - }, - { - "code": "MS", - "name": "Mississippi" - }, - { - "code": "MO", - "name": "Missouri" - }, - { - "code": "MT", - "name": "Montana" - }, - { - "code": "NE", - "name": "Nebraska" - }, - { - "code": "NV", - "name": "Nevada" - }, - { - "code": "NH", - "name": "New Hampshire" - }, - { - "code": "NJ", - "name": "New Jersey" - }, - { - "code": "NM", - "name": "New Mexico" - }, - { - "code": "NY", - "name": "New York" - }, - { - "code": "NC", - "name": "North Carolina" - }, - { - "code": "ND", - "name": "North Dakota" - }, - { - "code": "OH", - "name": "Ohio" - }, - { - "code": "OK", - "name": "Oklahoma" - }, - { - "code": "OR", - "name": "Oregon" - }, - { - "code": "PA", - "name": "Pennsylvania" - }, - { - "code": "RI", - "name": "Rhode Island" - }, - { - "code": "SC", - "name": "South Carolina" - }, - { - "code": "SD", - "name": "South Dakota" - }, - { - "code": "TN", - "name": "Tennessee" - }, - { - "code": "TX", - "name": "Texas" - }, - { - "code": "UT", - "name": "Utah" - }, - { - "code": "VT", - "name": "Vermont" - }, - { - "code": "VA", - "name": "Virginia" - }, - { - "code": "WA", - "name": "Washington" - }, - { - "code": "WV", - "name": "West Virginia" - }, - { - "code": "WI", - "name": "Wisconsin" - }, - { - "code": "WY", - "name": "Wyoming" - }, - { - "code": "AA", - "name": "Armed Forces (AA)" - }, - { - "code": "AE", - "name": "Armed Forces (AE)" - }, - { - "code": "AP", - "name": "Armed Forces (AP)" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "UM", - "name": "United States (US) Minor Outlying Islands", - "states": [{ - "code": 81, - "name": "Baker Island" - }, - { - "code": 84, - "name": "Howland Island" - }, - { - "code": 86, - "name": "Jarvis Island" - }, - { - "code": 67, - "name": "Johnston Atoll" - }, - { - "code": 89, - "name": "Kingman Reef" - }, - { - "code": 71, - "name": "Midway Atoll" - }, - { - "code": 76, - "name": "Navassa Island" - }, - { - "code": 95, - "name": "Palmyra Atoll" - }, - { - "code": 79, - "name": "Wake Island" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "UY", - "name": "Uruguay", - "states": [{ - "code": "UY-AR", - "name": "Artigas" - }, - { - "code": "UY-CA", - "name": "Canelones" - }, - { - "code": "UY-CL", - "name": "Cerro Largo" - }, - { - "code": "UY-CO", - "name": "Colonia" - }, - { - "code": "UY-DU", - "name": "Durazno" - }, - { - "code": "UY-FS", - "name": "Flores" - }, - { - "code": "UY-FD", - "name": "Florida" - }, - { - "code": "UY-LA", - "name": "Lavalleja" - }, - { - "code": "UY-MA", - "name": "Maldonado" - }, - { - "code": "UY-MO", - "name": "Montevideo" - }, - { - "code": "UY-PA", - "name": "Paysandú" - }, - { - "code": "UY-RN", - "name": "Río Negro" - }, - { - "code": "UY-RV", - "name": "Rivera" - }, - { - "code": "UY-RO", - "name": "Rocha" - }, - { - "code": "UY-SA", - "name": "Salto" - }, - { - "code": "UY-SJ", - "name": "San José" - }, - { - "code": "UY-SO", - "name": "Soriano" - }, - { - "code": "UY-TA", - "name": "Tacuarembó" - }, - { - "code": "UY-TT", - "name": "Treinta y Tres" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "UZ", - "name": "Uzbekistan", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VU", - "name": "Vanuatu", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VA", - "name": "Vatican", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VE", - "name": "Venezuela", - "states": [{ - "code": "VE-A", - "name": "Capital" - }, - { - "code": "VE-B", - "name": "Anzoátegui" - }, - { - "code": "VE-C", - "name": "Apure" - }, - { - "code": "VE-D", - "name": "Aragua" - }, - { - "code": "VE-E", - "name": "Barinas" - }, - { - "code": "VE-F", - "name": "Bolívar" - }, - { - "code": "VE-G", - "name": "Carabobo" - }, - { - "code": "VE-H", - "name": "Cojedes" - }, - { - "code": "VE-I", - "name": "Falcón" - }, - { - "code": "VE-J", - "name": "Guárico" - }, - { - "code": "VE-K", - "name": "Lara" - }, - { - "code": "VE-L", - "name": "Mérida" - }, - { - "code": "VE-M", - "name": "Miranda" - }, - { - "code": "VE-N", - "name": "Monagas" - }, - { - "code": "VE-O", - "name": "Nueva Esparta" - }, - { - "code": "VE-P", - "name": "Portuguesa" - }, - { - "code": "VE-R", - "name": "Sucre" - }, - { - "code": "VE-S", - "name": "Táchira" - }, - { - "code": "VE-T", - "name": "Trujillo" - }, - { - "code": "VE-U", - "name": "Yaracuy" - }, - { - "code": "VE-V", - "name": "Zulia" - }, - { - "code": "VE-W", - "name": "Federal Dependencies" - }, - { - "code": "VE-X", - "name": "La Guaira (Vargas)" - }, - { - "code": "VE-Y", - "name": "Delta Amacuro" - }, - { - "code": "VE-Z", - "name": "Amazonas" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VN", - "name": "Vietnam", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VG", - "name": "Virgin Islands (British)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "VI", - "name": "Virgin Islands (US)", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "WF", - "name": "Wallis and Futuna", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "EH", - "name": "Western Sahara", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "YE", - "name": "Yemen", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ZM", - "name": "Zambia", - "states": [{ - "code": "ZM-01", - "name": "Western" - }, - { - "code": "ZM-02", - "name": "Central" - }, - { - "code": "ZM-03", - "name": "Eastern" - }, - { - "code": "ZM-04", - "name": "Luapula" - }, - { - "code": "ZM-05", - "name": "Northern" - }, - { - "code": "ZM-06", - "name": "North-Western" - }, - { - "code": "ZM-07", - "name": "Southern" - }, - { - "code": "ZM-08", - "name": "Copperbelt" - }, - { - "code": "ZM-09", - "name": "Lusaka" - }, - { - "code": "ZM-10", - "name": "Muchinga" - } - ], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - expect(responseJSON).toEqual(expect.arrayContaining([ - expect.objectContaining({ - "code": "ZW", - "name": "Zimbabwe", - "states": [], - "_links": { - "self": [{ - "href": expect.any(String) - }], - "collection": [{ - "href": expect.any(String) - }] - } - }) - ])); - }); - - test('can view country data', async ({ - request - }) => { - // call API to retrieve a specific country data - const response = await request.get('/wp-json/wc/v3/data/countries/au'); - const responseJSON = await response.json(); - expect(response.status()).toEqual(200); - expect(Array.isArray(responseJSON)).toBe(false); - - expect(responseJSON).toEqual( - expect.objectContaining({ - "code": "AU", - "name": "Australia", - "states": [{ - "code": "ACT", - "name": "Australian Capital Territory" - }, - { - "code": "NSW", - "name": "New South Wales" - }, - { - "code": "NT", - "name": "Northern Territory" - }, - { - "code": "QLD", - "name": "Queensland" - }, - { - "code": "SA", - "name": "South Australia" - }, - { - "code": "TAS", - "name": "Tasmania" - }, - { - "code": "VIC", - "name": "Victoria" - }, - { - "code": "WA", - "name": "Western Australia" - } - ], - }) - ); + }) + ])); + } }); test('can view all currencies', async ({ diff --git a/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js index 9aea42c6e95..378ce377755 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js @@ -2550,4 +2550,4 @@ test.describe('Settings API tests: CRUD', () => { }); }); -}); +}); \ No newline at end of file From 527249f754e38c6391b7aa12a62f06fea2035085 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Wed, 23 Nov 2022 08:52:46 -0800 Subject: [PATCH 0112/1680] Fix unread notes count in inbox panel (#35396) * Mark note as read when viewing * Show unread note count * Add ability to fetch read or unread notes * Count unread notes on server side to avoid pagination limits * Add changelog entry * Add data changelog entry * Add check for note actions before checking length * Add changelog entry * Mark note as read after 3s delay --- packages/js/data/changelog/fix-34929 | 4 + packages/js/data/src/notes/types.ts | 1 + packages/js/experimental/changelog/fix-34929 | 4 + .../src/inbox-note/inbox-note.tsx | 2 +- .../client/inbox-panel/index.js | 84 ++++++++++++------- plugins/woocommerce/changelog/fix-34929 | 4 + plugins/woocommerce/src/Admin/API/Notes.php | 4 + .../woocommerce/src/Admin/Notes/DataStore.php | 4 + 8 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 packages/js/data/changelog/fix-34929 create mode 100644 packages/js/experimental/changelog/fix-34929 create mode 100644 plugins/woocommerce/changelog/fix-34929 diff --git a/packages/js/data/changelog/fix-34929 b/packages/js/data/changelog/fix-34929 new file mode 100644 index 00000000000..c01aa5a1f0b --- /dev/null +++ b/packages/js/data/changelog/fix-34929 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add is_read query option for notes data store diff --git a/packages/js/data/src/notes/types.ts b/packages/js/data/src/notes/types.ts index 4fd8c183f7a..8494970fcbd 100644 --- a/packages/js/data/src/notes/types.ts +++ b/packages/js/data/src/notes/types.ts @@ -52,6 +52,7 @@ export type Note = { // [Notes.php](https://github.com/woocommerce/woocommerce/blob/af97aaf41067bcd0b7ff12df9b6169f97c326c0f/plugins/woocommerce/src/Admin/API/Notes.php#L629-L699) export type NoteQuery = Partial< { context: string; + is_read: boolean; order: 'asc' | 'desc'; orderby: 'note_id' | 'date' | 'type' | 'title' | 'status'; page: number; diff --git a/packages/js/experimental/changelog/fix-34929 b/packages/js/experimental/changelog/fix-34929 new file mode 100644 index 00000000000..2fedcc1e932 --- /dev/null +++ b/packages/js/experimental/changelog/fix-34929 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Check for note actions before checking length diff --git a/packages/js/experimental/src/inbox-note/inbox-note.tsx b/packages/js/experimental/src/inbox-note/inbox-note.tsx index 1df953e5fa0..0ad957e921f 100644 --- a/packages/js/experimental/src/inbox-note/inbox-note.tsx +++ b/packages/js/experimental/src/inbox-note/inbox-note.tsx @@ -171,7 +171,7 @@ const InboxNoteCard: React.FC< InboxNoteProps > = ( { const actionWrapperClassName = classnames( 'woocommerce-inbox-message__actions', { - 'has-multiple-actions': note.actions.length > 1, + 'has-multiple-actions': note.actions?.length > 1, } ); diff --git a/plugins/woocommerce-admin/client/inbox-panel/index.js b/plugins/woocommerce-admin/client/inbox-panel/index.js index 6917abeb6c6..87184556951 100644 --- a/plugins/woocommerce-admin/client/inbox-panel/index.js +++ b/plugins/woocommerce-admin/client/inbox-panel/index.js @@ -93,11 +93,13 @@ const renderNotes = ( { notes, onDismiss, onNoteActionClick, + onNoteVisible, setShowDismissAllModal: onDismissAll, showHeader = true, loadMoreNotes, allNotesFetched, notesHaveResolved, + unreadNotesCount, } ) => { if ( isBatchUpdating ) { return; @@ -114,17 +116,6 @@ const renderNotes = ( { hasFiredPanelViewTrack = true; } - const screen = getScreenName(); - const onNoteVisible = ( note ) => { - recordEvent( 'inbox_note_view', { - note_content: note.content, - note_name: note.name, - note_title: note.title, - note_type: note.type, - screen, - } ); - }; - const notesArray = Object.keys( notes ).map( ( key ) => notes[ key ] ); return ( @@ -135,7 +126,7 @@ const renderNotes = ( { { __( 'Inbox', 'woocommerce' ) } - +
    { ); const [ allNotesFetched, setAllNotesFetched ] = useState( false ); const [ allNotes, setAllNotes ] = useState( [] ); + const [ viewedNotes, setViewedNotes ] = useState( {} ); const { createNotice } = useDispatch( 'core/notices' ); const { removeNote, @@ -223,6 +215,7 @@ const InboxPanel = ( { showHeader = true } ) => { triggerNoteAction, invalidateResolutionForStoreSelector, } = useDispatch( NOTES_STORE_NAME ); + const screen = getScreenName(); const inboxQuery = useMemo( () => { return { @@ -231,25 +224,34 @@ const InboxPanel = ( { showHeader = true } ) => { }; }, [ noteDisplayQty ] ); - const { isError, notes, notesHaveResolved, isBatchUpdating } = useSelect( - ( select ) => { - const { - getNotes, - getNotesError, - isNotesRequesting, - hasFinishedResolution, - } = select( NOTES_STORE_NAME ); + const { + isError, + notes, + notesHaveResolved, + isBatchUpdating, + unreadNotesCount, + } = useSelect( ( select ) => { + const { + getNotes, + getNotesError, + isNotesRequesting, + hasFinishedResolution, + } = select( NOTES_STORE_NAME ); - return { - notes: getNotes( inboxQuery ), - isError: Boolean( getNotesError( 'getNotes', [ inboxQuery ] ) ), - isBatchUpdating: isNotesRequesting( 'batchUpdateNotes' ), - notesHaveResolved: - ! isNotesRequesting( 'batchUpdateNotes' ) && - hasFinishedResolution( 'getNotes', [ inboxQuery ] ), - }; - } - ); + return { + notes: getNotes( inboxQuery ), + unreadNotesCount: getNotes( { + ...DEFAULT_INBOX_QUERY, + is_read: false, + per_page: -1, + } ).length, + isError: Boolean( getNotesError( 'getNotes', [ inboxQuery ] ) ), + isBatchUpdating: isNotesRequesting( 'batchUpdateNotes' ), + notesHaveResolved: + ! isNotesRequesting( 'batchUpdateNotes' ) && + hasFinishedResolution( 'getNotes', [ inboxQuery ] ), + }; + } ); useEffect( () => { if ( notesHaveResolved && notes.length < noteDisplayQty ) { @@ -284,9 +286,25 @@ const InboxPanel = ( { showHeader = true } ) => { const [ showDismissAllModal, setShowDismissAllModal ] = useState( false ); - const onDismiss = async ( note ) => { - const screen = getScreenName(); + const onNoteVisible = ( note ) => { + if ( ! viewedNotes[ note.id ] && ! note.is_read ) { + setViewedNotes( { ...viewedNotes, [ note.id ]: true } ); + setTimeout( () => { + updateNote( note.id, { + is_read: true, + } ); + }, 3000 ); + } + recordEvent( 'inbox_note_view', { + note_content: note.content, + note_name: note.name, + note_title: note.title, + note_type: note.type, + screen, + } ); + }; + const onDismiss = async ( note ) => { recordEvent( 'inbox_action_dismiss', { note_name: note.name, note_title: note.title, @@ -383,10 +401,12 @@ const InboxPanel = ( { showHeader = true } ) => { onNoteActionClick: ( note, action ) => { triggerNoteAction( note.id, action.id ); }, + onNoteVisible, setShowDismissAllModal, showHeader, allNotesFetched, notesHaveResolved, + unreadNotesCount, } ) } diff --git a/plugins/woocommerce/changelog/fix-34929 b/plugins/woocommerce/changelog/fix-34929 new file mode 100644 index 00000000000..c012434ce93 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-34929 @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Fix unread note count on inbox panel diff --git a/plugins/woocommerce/src/Admin/API/Notes.php b/plugins/woocommerce/src/Admin/API/Notes.php index d1f18517523..8b92945c1c9 100644 --- a/plugins/woocommerce/src/Admin/API/Notes.php +++ b/plugins/woocommerce/src/Admin/API/Notes.php @@ -263,6 +263,10 @@ class Notes extends \WC_REST_CRUD_Controller { $args['source'] = isset( $request['source'] ) ? $request['source'] : array(); $args['is_deleted'] = 0; + if ( isset( $request['is_read'] ) ) { + $args['is_read'] = filter_var( $request['is_read'], FILTER_VALIDATE_BOOLEAN ); + } + if ( 'date' === $args['orderby'] ) { $args['orderby'] = 'date_created'; } diff --git a/plugins/woocommerce/src/Admin/Notes/DataStore.php b/plugins/woocommerce/src/Admin/Notes/DataStore.php index d0f6d035cd0..d128edd8065 100644 --- a/plugins/woocommerce/src/Admin/Notes/DataStore.php +++ b/plugins/woocommerce/src/Admin/Notes/DataStore.php @@ -508,6 +508,10 @@ class DataStore extends \WC_Data_Store_WP implements \WC_Object_Data_Store_Inter $where_clauses .= " AND source IN ($escaped_where_source)"; } + if ( isset( $args['is_read'] ) ) { + $where_clauses .= $args['is_read'] ? ' AND is_read = 1' : ' AND is_read = 0'; + } + $where_clauses .= $escaped_is_deleted ? ' AND is_deleted = 1' : ' AND is_deleted = 0'; return $where_clauses; From 085149ad82ad115dac13af96c2642e176d956297 Mon Sep 17 00:00:00 2001 From: Marco Almeida Date: Wed, 23 Nov 2022 19:22:51 +0000 Subject: [PATCH 0113/1680] Add $formatted_destination as an argument to the woocommerce_cart_no_shipping_available_html filter (#30723) Add $formatted_destination as an argument to the woocommerce_cart_no_shipping_available_html filter. Developers should be able to access the $formatted_destination variable directly in order to return a new string to the filter including that address. * Add docblock and changelog for woocommerce_cart_no_shipping_available_html tweak. * Bump version tag for cart-shipping template. Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> --- .../changelog/adjust-no-shipping-hook | 4 ++++ .../templates/cart/cart-shipping.php | 20 ++++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/adjust-no-shipping-hook diff --git a/plugins/woocommerce/changelog/adjust-no-shipping-hook b/plugins/woocommerce/changelog/adjust-no-shipping-hook new file mode 100644 index 00000000000..76dc9b0a2a1 --- /dev/null +++ b/plugins/woocommerce/changelog/adjust-no-shipping-hook @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Make the formatted shipping address available via the `woocommerce_cart_no_shipping_available_html` hook. diff --git a/plugins/woocommerce/templates/cart/cart-shipping.php b/plugins/woocommerce/templates/cart/cart-shipping.php index 134b05b3496..9884318207a 100644 --- a/plugins/woocommerce/templates/cart/cart-shipping.php +++ b/plugins/woocommerce/templates/cart/cart-shipping.php @@ -14,7 +14,7 @@ * * @see https://docs.woocommerce.com/document/template-structure/ * @package WooCommerce\Templates - * @version 3.6.0 + * @version 7.3.0 */ defined( 'ABSPATH' ) || exit; @@ -66,8 +66,22 @@ $calculator_text = ''; elseif ( ! is_cart() ) : echo wp_kses_post( apply_filters( 'woocommerce_no_shipping_available_html', __( 'There are no shipping options available. Please ensure that your address has been entered correctly, or contact us if you need any help.', 'woocommerce' ) ) ); else : - // Translators: $s shipping destination. - echo wp_kses_post( apply_filters( 'woocommerce_cart_no_shipping_available_html', sprintf( esc_html__( 'No shipping options were found for %s.', 'woocommerce' ) . ' ', '' . esc_html( $formatted_destination ) . '' ) ) ); + echo wp_kses_post( + /** + * Provides a means of overriding the default 'no shipping available' HTML string. + * + * @since 3.0.0 + * + * @param string $html HTML message. + * @param string $formatted_destination The formatted shipping destination. + */ + apply_filters( + 'woocommerce_cart_no_shipping_available_html', + // Translators: $s shipping destination. + sprintf( esc_html__( 'No shipping options were found for %s.', 'woocommerce' ) . ' ', '' . esc_html( $formatted_destination ) . '' ), + $formatted_destination + ) + ); $calculator_text = esc_html__( 'Enter a different address', 'woocommerce' ); endif; ?> From f7f3f01be07704ba3cec0635388b85921085487f Mon Sep 17 00:00:00 2001 From: Kevin Brent Date: Wed, 23 Nov 2022 13:50:25 -0700 Subject: [PATCH 0114/1680] Fix attribute taxonomy sort order meta key (#34645) Fix attribute taxonomy sort order meta key for improved consistency. * whoops - close array for order meta key update * Changelog. * Update phpcs annotation. Co-authored-by: barryhughes <3594411+barryhughes@users.noreply.github.com> --- plugins/woocommerce/changelog/fix-34213 | 4 ++++ .../woocommerce/includes/admin/class-wc-admin-taxonomies.php | 4 +--- plugins/woocommerce/includes/wc-attribute-functions.php | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-34213 diff --git a/plugins/woocommerce/changelog/fix-34213 b/plugins/woocommerce/changelog/fix-34213 new file mode 100644 index 00000000000..fdbf3db98d5 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-34213 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Increase consistency in relation to the way taxonomy term ordering is persisted. diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-taxonomies.php b/plugins/woocommerce/includes/admin/class-wc-admin-taxonomies.php index fd6d297dfa1..41c0212a679 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-taxonomies.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-taxonomies.php @@ -103,9 +103,7 @@ class WC_Admin_Taxonomies { return; } - $meta_name = taxonomy_is_product_attribute( $taxonomy ) ? 'order_' . esc_attr( $taxonomy ) : 'order'; - - update_term_meta( $term_id, $meta_name, 0 ); + update_term_meta( $term_id, 'order', 0 ); } /** diff --git a/plugins/woocommerce/includes/wc-attribute-functions.php b/plugins/woocommerce/includes/wc-attribute-functions.php index 0202f28c2e5..3b899a5cae0 100644 --- a/plugins/woocommerce/includes/wc-attribute-functions.php +++ b/plugins/woocommerce/includes/wc-attribute-functions.php @@ -569,7 +569,7 @@ function wc_create_attribute( $args ) { // Update taxonomy ordering term meta. $wpdb->update( $wpdb->termmeta, - array( 'meta_key' => 'order_pa_' . sanitize_title( $data['attribute_name'] ) ), // WPCS: slow query ok. + array( 'meta_key' => 'order' ), // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key array( 'meta_key' => 'order_pa_' . sanitize_title( $old_slug ) ) // WPCS: slow query ok. ); From 44ce3bd0c3319063d7d0eb8b0d33bf2cdf9e0c38 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Thu, 24 Nov 2022 13:16:56 +0100 Subject: [PATCH 0115/1680] Make sure the `woocommerce` page hook name remains untranslated (#35695) * Make sure the WooCommerce page hook is untranslated This works around a WP core bug, and addresses compatibility issues where WC core or 3rd party code expect the pagename or screen ID for one of our submenu pages to remain fixed despite translations. * Add changelog * Make PHPCS happy --- plugins/woocommerce/changelog/fix-35677 | 4 ++++ plugins/woocommerce/includes/admin/class-wc-admin-menus.php | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-35677 diff --git a/plugins/woocommerce/changelog/fix-35677 b/plugins/woocommerce/changelog/fix-35677 new file mode 100644 index 00000000000..12dccdc926d --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35677 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fixes fatal error resulting from translating the WooCommerce main menu. diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php index 8b1491042b7..acaaf32dd9d 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php @@ -60,7 +60,7 @@ class WC_Admin_Menus { * Add menu items. */ public function admin_menu() { - global $menu; + global $menu, $admin_page_hooks; $woocommerce_icon = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMDI0IDEwMjQiPjxwYXRoIGZpbGw9IiNhMmFhYjIiIGQ9Ik02MTIuMTkyIDQyNi4zMzZjMC02Ljg5Ni0zLjEzNi01MS42LTI4LTUxLjYtMzcuMzYgMC00Ni43MDQgNzIuMjU2LTQ2LjcwNCA4Mi42MjQgMCAzLjQwOCAzLjE1MiA1OC40OTYgMjguMDMyIDU4LjQ5NiAzNC4xOTItLjAzMiA0Ni42NzItNzIuMjg4IDQ2LjY3Mi04OS41MnptMjAyLjE5MiAwYzAtNi44OTYtMy4xNTItNTEuNi0yOC4wMzItNTEuNi0zNy4yOCAwLTQ2LjYwOCA3Mi4yNTYtNDYuNjA4IDgyLjYyNCAwIDMuNDA4IDMuMDcyIDU4LjQ5NiAyNy45NTIgNTguNDk2IDM0LjE5Mi0uMDMyIDQ2LjY4OC03Mi4yODggNDYuNjg4LTg5LjUyek0xNDEuMjk2Ljc2OGMtNjguMjI0IDAtMTIzLjUwNCA1NS40ODgtMTIzLjUwNCAxMjMuOTJ2NjUwLjcyYzAgNjguNDMyIDU1LjI5NiAxMjMuOTIgMTIzLjUwNCAxMjMuOTJoMzM5LjgwOGwxMjMuNTA0IDEyMy45MzZWODk5LjMyOGgyNzguMDQ4YzY4LjIyNCAwIDEyMy41Mi01NS40NzIgMTIzLjUyLTEyMy45MnYtNjUwLjcyYzAtNjguNDMyLTU1LjI5Ni0xMjMuOTItMTIzLjUyLTEyMy45MmgtNzQxLjM2em01MjYuODY0IDQyMi4xNmMwIDU1LjA4OC0zMS4wODggMTU0Ljg4LTEwMi42NCAxNTQuODgtNi4yMDggMC0xOC40OTYtMy42MTYtMjUuNDI0LTYuMDE2LTMyLjUxMi0xMS4xNjgtNTAuMTkyLTQ5LjY5Ni01Mi4zNTItNjYuMjU2IDAgMC0zLjA3Mi0xNy43OTItMy4wNzItNDAuNzUyIDAtMjIuOTkyIDMuMDcyLTQ1LjMyOCAzLjA3Mi00NS4zMjggMTUuNTUyLTc1LjcyOCA0My41NTItMTA2LjczNiA5Ni40NDgtMTA2LjczNiA1OS4wNzItLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4ek00ODYuNDk2IDMwMi40YzAgMy4zOTItNDMuNTUyIDE0MS4xNjgtNDMuNTUyIDIxMy40MjR2NzUuNzEyYy0yLjU5MiAxMi4wOC00LjE2IDI0LjE0NC0yMS44MjQgMjQuMTQ0LTQ2LjYwOCAwLTg4Ljg4LTE1MS40NzItOTIuMDE2LTE2MS44NC02LjIwOCA2Ljg5Ni02Mi4yNCAxNjEuODQtOTYuNDQ4IDE2MS44NC0yNC44NjQgMC00My41NTItMTEzLjY0OC00Ni42MDgtMTIzLjkzNkMxNzYuNzA0IDQzNi42NzIgMTYwIDMzNC4yMjQgMTYwIDMyNy4zMjhjMC0yMC42NzIgMS4xNTItMzguNzM2IDI2LjA0OC0zOC43MzYgNi4yMDggMCAyMS42IDYuMDY0IDIzLjcxMiAxNy4xNjggMTEuNjQ4IDYyLjAzMiAxNi42ODggMTIwLjUxMiAyOS4xNjggMTg1Ljk2OCAxLjg1NiAyLjkyOCAxLjUwNCA3LjAwOCA0LjU2IDEwLjQzMiAzLjE1Mi0xMC4yODggNjYuOTI4LTE2OC43ODQgOTQuOTYtMTY4Ljc4NCAyMi41NDQgMCAzMC40IDQ0LjU5MiAzMy41MzYgNjEuODI0IDYuMjA4IDIwLjY1NiAxMy4wODggNTUuMjE2IDIyLjQxNiA4Mi43NTIgMC0xMy43NzYgMTIuNDgtMjAzLjEyIDY1LjM5Mi0yMDMuMTIgMTguNTkyLjAzMiAyNi43MDQgNi45MjggMjYuNzA0IDI3LjU2OHpNODcwLjMyIDQyMi45MjhjMCA1NS4wODgtMzEuMDg4IDE1NC44OC0xMDIuNjQgMTU0Ljg4LTYuMTkyIDAtMTguNDQ4LTMuNjE2LTI1LjQyNC02LjAxNi0zMi40MzItMTEuMTY4LTUwLjE3Ni00OS42OTYtNTIuMjg4LTY2LjI1NiAwIDAtMy44ODgtMTcuOTItMy44ODgtNDAuODk2czMuODg4LTQ1LjE4NCAzLjg4OC00NS4xODRjMTUuNTUyLTc1LjcyOCA0My40ODgtMTA2LjczNiA5Ni4zODQtMTA2LjczNiA1OS4xMDQtLjAzMiA4My45NjggNTguNTI4IDgzLjk2OCAxMTAuMjA4eiIvPjwvc3ZnPg=='; @@ -70,6 +70,10 @@ class WC_Admin_Menus { add_menu_page( __( 'WooCommerce', 'woocommerce' ), __( 'WooCommerce', 'woocommerce' ), 'edit_others_shop_orders', 'woocommerce', null, $woocommerce_icon, '55.5' ); + // Work around https://github.com/woocommerce/woocommerce/issues/35677 (and related https://core.trac.wordpress.org/ticket/18857). + // Translating the menu item breaks screen IDs and page hooks, so we force the hookname to be untranslated. + $admin_page_hooks['woocommerce'] = 'woocommerce'; // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited + add_submenu_page( 'edit.php?post_type=product', __( 'Attributes', 'woocommerce' ), __( 'Attributes', 'woocommerce' ), 'manage_product_terms', 'product_attributes', array( $this, 'attributes_page' ) ); } From a811009a06de9786acb8a582d5f192291894b941 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Thu, 24 Nov 2022 21:46:08 +0800 Subject: [PATCH 0116/1680] Add one-click installation for recommended extensions in multichannel Marketing page (#35542) --- .../client/marketing/data/action-types.js | 2 + .../client/marketing/data/actions.js | 10 + .../client/marketing/data/reducer.js | 14 ++ .../client/marketing/hooks/index.ts | 1 + .../useInstalledPlugins.ts} | 14 +- .../DiscoverTools/DiscoverTools.test.tsx | 133 ++++++++++---- .../DiscoverTools/DiscoverTools.tsx | 98 ++-------- .../DiscoverTools/PluginsTabPanel.tsx | 171 ++++++++++++++++++ .../DiscoverTools/types.ts | 1 + .../DiscoverTools/useRecommendedPlugins.ts | 38 ++-- .../InstalledExtensions.tsx | 6 +- .../types.tsx => types/Plugin.ts} | 0 .../client/marketing/types/index.ts | 1 + .../feature-marketing-one-click-installation | 4 + 14 files changed, 348 insertions(+), 145 deletions(-) create mode 100644 plugins/woocommerce-admin/client/marketing/hooks/index.ts rename plugins/woocommerce-admin/client/marketing/{overview-multichannel/InstalledExtensions/usePlugins.ts => hooks/useInstalledPlugins.ts} (60%) create mode 100644 plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx rename plugins/woocommerce-admin/client/marketing/{overview-multichannel/InstalledExtensions/types.tsx => types/Plugin.ts} (100%) create mode 100644 plugins/woocommerce-admin/client/marketing/types/index.ts create mode 100644 plugins/woocommerce/changelog/feature-marketing-one-click-installation diff --git a/plugins/woocommerce-admin/client/marketing/data/action-types.js b/plugins/woocommerce-admin/client/marketing/data/action-types.js index 7c5aa7ba881..edc1e20fee9 100644 --- a/plugins/woocommerce-admin/client/marketing/data/action-types.js +++ b/plugins/woocommerce-admin/client/marketing/data/action-types.js @@ -3,6 +3,8 @@ const TYPES = { SET_ACTIVATING_PLUGIN: 'SET_ACTIVATING_PLUGIN', REMOVE_ACTIVATING_PLUGIN: 'REMOVE_ACTIVATING_PLUGIN', SET_RECOMMENDED_PLUGINS: 'SET_RECOMMENDED_PLUGINS', + INSTALL_AND_ACTIVATE_RECOMMENDED_PLUGIN: + 'INSTALL_AND_ACTIVATE_RECOMMENDED_PLUGIN', SET_BLOG_POSTS: 'SET_BLOG_POSTS', SET_ERROR: 'SET_ERROR', }; diff --git a/plugins/woocommerce-admin/client/marketing/data/actions.js b/plugins/woocommerce-admin/client/marketing/data/actions.js index ef178dc9125..01f30d909b9 100644 --- a/plugins/woocommerce-admin/client/marketing/data/actions.js +++ b/plugins/woocommerce-admin/client/marketing/data/actions.js @@ -124,3 +124,13 @@ export function* loadInstalledPluginsAfterActivation( activatedPluginSlug ) { ); } } + +export function* installAndActivateRecommendedPlugin( + recommendedPluginSlug, + category +) { + return { + type: TYPES.INSTALL_AND_ACTIVATE_RECOMMENDED_PLUGIN, + data: { pluginSlug: recommendedPluginSlug, category }, + }; +} diff --git a/plugins/woocommerce-admin/client/marketing/data/reducer.js b/plugins/woocommerce-admin/client/marketing/data/reducer.js index 4220ec60b82..f27d6b0a302 100644 --- a/plugins/woocommerce-admin/client/marketing/data/reducer.js +++ b/plugins/woocommerce-admin/client/marketing/data/reducer.js @@ -50,6 +50,20 @@ const reducer = ( state = DEFAULT_STATE, action ) => { [ action.data.category ]: action.data.plugins, }, }; + case TYPES.INSTALL_AND_ACTIVATE_RECOMMENDED_PLUGIN: + const newPlugins = state.recommendedPlugins[ + action.data.category + ]?.filter( + ( plugin ) => plugin.product !== action.data.pluginSlug + ); + + return { + ...state, + recommendedPlugins: { + ...state.recommendedPlugins, + [ action.data.category ]: newPlugins, + }, + }; case TYPES.SET_BLOG_POSTS: return { ...state, diff --git a/plugins/woocommerce-admin/client/marketing/hooks/index.ts b/plugins/woocommerce-admin/client/marketing/hooks/index.ts new file mode 100644 index 00000000000..a504ae73f17 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/hooks/index.ts @@ -0,0 +1 @@ +export { useInstalledPlugins } from './useInstalledPlugins'; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/usePlugins.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts similarity index 60% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/usePlugins.ts rename to plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts index 60b906c7477..94dd9905dda 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/usePlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts @@ -7,15 +7,19 @@ import { useSelect, useDispatch } from '@wordpress/data'; * Internal dependencies */ import { STORE_KEY } from '~/marketing/data/constants'; -import { Plugin } from './types'; +import { Plugin } from '~/marketing/types'; -export type UsePluginsType = { +export type UseInstalledPlugins = { installedPlugins: Plugin[]; activatingPlugins: string[]; activateInstalledPlugin: ( slug: string ) => void; + loadInstalledPluginsAfterActivation: ( slug: string ) => void; }; -export const usePlugins = (): UsePluginsType => { +/** + * Hook to return plugins and methods for "Installed extensions" card. + */ +export const useInstalledPlugins = (): UseInstalledPlugins => { const { installedPlugins, activatingPlugins } = useSelect( ( select ) => { const { getInstalledPlugins, getActivatingPlugins } = select( STORE_KEY ); @@ -25,11 +29,13 @@ export const usePlugins = (): UsePluginsType => { activatingPlugins: getActivatingPlugins(), }; }, [] ); - const { activateInstalledPlugin } = useDispatch( STORE_KEY ); + const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } = + useDispatch( STORE_KEY ); return { installedPlugins, activatingPlugins, activateInstalledPlugin, + loadInstalledPluginsAfterActivation, }; }; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx index ce353c1775d..568b353147f 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx @@ -6,6 +6,7 @@ import { render, screen } from '@testing-library/react'; /** * Internal dependencies */ +import { useInstalledPlugins } from '../../hooks'; import { useRecommendedPlugins } from './useRecommendedPlugins'; import { DiscoverTools } from './DiscoverTools'; @@ -23,12 +24,20 @@ jest.mock( './useRecommendedPlugins', () => ( { useRecommendedPlugins: jest.fn(), } ) ); +jest.mock( '../../hooks', () => ( { + useInstalledPlugins: jest.fn(), +} ) ); + describe( 'DiscoverTools component', () => { it( 'should render a Spinner when loading is in progress', () => { ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + isInitializing: true, isLoading: true, plugins: [], } ); + ( useInstalledPlugins as jest.Mock ).mockReturnValue( { + loadInstalledPluginsAfterActivation: jest.fn(), + } ); render( ); expect( screen.getByTestId( 'spinner' ) ).toBeInTheDocument(); @@ -36,9 +45,13 @@ describe( 'DiscoverTools component', () => { it( 'should render message and link when loading is finish and there are no plugins', () => { ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + isInitializing: false, isLoading: false, plugins: [], } ); + ( useInstalledPlugins as jest.Mock ).mockReturnValue( { + loadInstalledPluginsAfterActivation: jest.fn(), + } ); render( ); expect( @@ -51,43 +64,89 @@ describe( 'DiscoverTools component', () => { ).toBeInTheDocument(); } ); - it( 'should render tabs with plugins', () => { - ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { - isLoading: false, - plugins: [ - { - title: 'Google Listings and Ads', - description: - 'Get in front of shoppers and drive traffic so you can grow your business with Smart Shopping Campaigns and free listings.', - url: 'https://woocommerce.com/products/google-listings-and-ads/?utm_source=marketingtab&utm_medium=product&utm_campaign=wcaddons', - icon: 'https://woocommerce.test/wp-content/plugins/wccom-plugins/marketing-tab-rest-api/icons/google.svg', - product: 'google-listings-and-ads', - plugin: 'google-listings-and-ads/google-listings-and-ads.php', - categories: [ 'marketing' ], - subcategories: [ - { - slug: 'sales-channels', - name: 'Sales channels', - }, - ], - tags: [ - { - slug: 'built-by-woocommerce', - name: 'Built by WooCommerce', - }, - ], - }, - ], - } ); - render( ); + describe( 'With plugins loaded', () => { + it( 'should render `direct_install: true` plugins with "Install plugin" button', () => { + ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + isInitializing: false, + isLoading: false, + plugins: [ + { + title: 'Google Listings and Ads', + description: + 'Get in front of shoppers and drive traffic so you can grow your business with Smart Shopping Campaigns and free listings.', + url: 'https://woocommerce.com/products/google-listings-and-ads/?utm_source=marketingtab&utm_medium=product&utm_campaign=wcaddons', + direct_install: true, + icon: 'https://woocommerce.com/wp-content/plugins/wccom-plugins/marketing-tab-rest-api/icons/google.svg', + product: 'google-listings-and-ads', + plugin: 'google-listings-and-ads/google-listings-and-ads.php', + categories: [ 'marketing' ], + subcategories: [ + { + slug: 'sales-channels', + name: 'Sales channels', + }, + ], + tags: [ + { + slug: 'built-by-woocommerce', + name: 'Built by WooCommerce', + }, + ], + }, + ], + } ); + ( useInstalledPlugins as jest.Mock ).mockReturnValue( { + loadInstalledPluginsAfterActivation: jest.fn(), + } ); + render( ); - // Assert that we have the "Sales channels" tab, with the corresponding plugin displayed, and with the "Built by WooCommerce" pill. - expect( screen.getByText( 'Sales channels' ) ).toBeInTheDocument(); - expect( - screen.getByText( 'Google Listings and Ads' ) - ).toBeInTheDocument(); - expect( - screen.getByText( 'Built by WooCommerce' ) - ).toBeInTheDocument(); + // Assert that we have the "Sales channels" tab, the plugin name, the "Built by WooCommerce" pill, and the "Install plugin" button. + expect( screen.getByText( 'Sales channels' ) ).toBeInTheDocument(); + expect( + screen.getByText( 'Google Listings and Ads' ) + ).toBeInTheDocument(); + expect( + screen.getByText( 'Built by WooCommerce' ) + ).toBeInTheDocument(); + expect( screen.getByText( 'Install plugin' ) ).toBeInTheDocument(); + } ); + + it( 'should render `direct_install: false` plugins with "View details" button', () => { + ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + isInitializing: false, + isLoading: false, + plugins: [ + { + title: 'WooCommerce Zapier', + description: + 'Integrate your WooCommerce store with 5000+ cloud apps and services today. Trusted by 11,000+ users.', + url: 'https://woocommerce.com/products/woocommerce-zapier/?utm_source=marketingtab&utm_medium=product&utm_campaign=wcaddons', + direct_install: false, + icon: 'https://woocommerce.com/wp-content/plugins/wccom-plugins/marketing-tab-rest-api/icons/zapier.png', + product: 'woocommerce-zapier', + plugin: 'woocommerce-zapier/woocommerce-zapier.php', + categories: [ 'marketing' ], + subcategories: [ + { + slug: 'crm', + name: 'CRM', + }, + ], + tags: [], + }, + ], + } ); + ( useInstalledPlugins as jest.Mock ).mockReturnValue( { + loadInstalledPluginsAfterActivation: jest.fn(), + } ); + render( ); + + // Assert that we have the CRM tab, plugin name, and "View details" button. + expect( screen.getByText( 'CRM' ) ).toBeInTheDocument(); + expect( + screen.getByText( 'WooCommerce Zapier' ) + ).toBeInTheDocument(); + expect( screen.getByText( 'View details' ) ).toBeInTheDocument(); + } ); } ); } ); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.tsx index fa66f95fd66..ca79f53b085 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.tsx @@ -1,94 +1,33 @@ /** * External dependencies */ -import { Fragment } from '@wordpress/element'; import { __ } from '@wordpress/i18n'; -import { TabPanel, Button } from '@wordpress/components'; +import { Button } from '@wordpress/components'; import { Icon, trendingUp } from '@wordpress/icons'; import { recordEvent } from '@woocommerce/tracks'; -import { Pill, Spinner } from '@woocommerce/components'; -import { flatMapDeep, uniqBy } from 'lodash'; +import { Spinner } from '@woocommerce/components'; /** * Internal dependencies */ -import { - CollapsibleCard, - CardDivider, - CardBody, - PluginCardBody, -} from '~/marketing/components'; -import { getInAppPurchaseUrl } from '~/lib/in-app-purchase'; -import { Plugin } from './types'; +import { CollapsibleCard, CardBody } from '~/marketing/components'; import { useRecommendedPlugins } from './useRecommendedPlugins'; +import { PluginsTabPanel } from './PluginsTabPanel'; import './DiscoverTools.scss'; -/** - * Return tabs (`{ name, title }`) for the TabPanel. - * - * Subcategories that have no plugins - * will not be displayed as a tab in the UI. - * This is done by doing the following: - * - * 1. Get an array of unique subcategories from the list of plugins. - * 2. Map the subcategories schema into tabs schema. - */ -const getTabs = ( plugins: Plugin[] ) => { - const pluginSubcategories = uniqBy( - flatMapDeep( plugins, ( p ) => p.subcategories ), - ( subcategory ) => subcategory.slug - ); - - return pluginSubcategories.map( ( subcategory ) => ( { - name: subcategory.slug, - title: subcategory.name, - } ) ); -}; - -const renderPluginCardBodies = ( plugins: Plugin[] ) => { - return plugins.map( ( el, idx ) => { - return ( - - } - name={ el.title } - pills={ el.tags.map( ( tag ) => ( - { tag.name } - ) ) } - description={ el.description } - button={ - - } - /> - { idx !== plugins.length - 1 && } - - ); - } ); -}; - export const DiscoverTools = () => { - const { isLoading, plugins } = useRecommendedPlugins(); + const { isInitializing, isLoading, plugins, installAndActivate } = + useRecommendedPlugins(); /** * Renders card body. * * - If loading is in progress, it renders a loading indicator. * - If there are zero plugins, it renders an empty content. - * - Otherwise, it renders a TabPanel. Each tab is a subcategory displaying the plugins. + * - Otherwise, it renders PluginsTabPanel. */ const renderCardContent = () => { - if ( isLoading ) { + if ( isInitializing ) { return ( @@ -123,22 +62,11 @@ export const DiscoverTools = () => { } return ( - - { ( tab ) => { - const subcategoryPlugins = plugins.filter( ( el ) => - el.subcategories.some( - ( subcategory ) => subcategory.slug === tab.name - ) - ); - - return ( - <> - - { renderPluginCardBodies( subcategoryPlugins ) } - - ); - } } - + ); }; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx new file mode 100644 index 00000000000..8528e199672 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx @@ -0,0 +1,171 @@ +/** + * External dependencies + */ +import { Fragment, useState } from '@wordpress/element'; +import { useDispatch } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; +import { TabPanel, Button } from '@wordpress/components'; +import { recordEvent } from '@woocommerce/tracks'; +import { Pill } from '@woocommerce/components'; +import { PLUGINS_STORE_NAME } from '@woocommerce/data'; +import { flatMapDeep, uniqBy } from 'lodash'; + +/** + * Internal dependencies + */ +import { CardDivider, PluginCardBody } from '~/marketing/components'; +import { useInstalledPlugins } from '~/marketing/hooks'; +import { getInAppPurchaseUrl } from '~/lib/in-app-purchase'; +import { createNoticesFromResponse } from '~/lib/notices'; +import { Plugin } from './types'; +import './DiscoverTools.scss'; + +/** + * Return tabs (`{ name, title }`) for the TabPanel. + * + * Subcategories that have no plugins + * will not be displayed as a tab in the UI. + * This is done by doing the following: + * + * 1. Get an array of unique subcategories from the list of plugins. + * 2. Map the subcategories schema into tabs schema. + */ +const getTabs = ( plugins: Plugin[] ) => { + const pluginSubcategories = uniqBy( + flatMapDeep( plugins, ( p ) => p.subcategories ), + ( subcategory ) => subcategory.slug + ); + + return pluginSubcategories.map( ( subcategory ) => ( { + name: subcategory.slug, + title: subcategory.name, + } ) ); +}; + +type PluginsTabPanelType = { + isLoading: boolean; + plugins: Plugin[]; + onInstallAndActivate: ( pluginSlug: string ) => void; +}; + +/** + * A TabPanel where each tab is a plugin subcategory. + */ +export const PluginsTabPanel = ( { + isLoading, + plugins, + onInstallAndActivate, +}: PluginsTabPanelType ) => { + const [ currentPlugin, setCurrentPlugin ] = useState< string | null >( + null + ); + const { installAndActivatePlugins } = useDispatch( PLUGINS_STORE_NAME ); + const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); + + /** + * Install and activate a plugin. + * + * When the process is successful, the plugin will disappear in the recommended list, + * and appear in the installed extension list. A success notice will be displayed. + * + * When the process is not successful, an error notice will be displayed. + * + * @param plugin Plugin to be installed and activated. + */ + const installAndActivate = async ( plugin: Plugin ) => { + setCurrentPlugin( plugin.product ); + + try { + recordEvent( 'marketing_recommended_extension', { + name: plugin.title, + } ); + + const response = await installAndActivatePlugins( [ + plugin.product, + ] ); + + onInstallAndActivate( plugin.product ); + loadInstalledPluginsAfterActivation( plugin.product ); + createNoticesFromResponse( response ); + } catch ( error ) { + createNoticesFromResponse( error ); + } + + setCurrentPlugin( null ); + }; + + return ( + + { ( tab ) => { + const subcategoryPlugins = plugins.filter( ( plugin ) => + plugin.subcategories.some( + ( subcategory ) => subcategory.slug === tab.name + ) + ); + + const renderButton = ( plugin: Plugin ) => { + const buttonDisabled = !! currentPlugin || isLoading; + + if ( plugin.direct_install ) { + return ( + + ); + } + + return ( + + ); + }; + + return ( + <> + { subcategoryPlugins.map( ( plugin ) => ( + + + + } + name={ plugin.title } + pills={ plugin.tags.map( ( tag ) => ( + + { tag.name } + + ) ) } + description={ plugin.description } + button={ renderButton( plugin ) } + /> + + ) ) } + + ); + } } + + ); +}; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/types.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/types.ts index f82faad4c73..4c7eb88f922 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/types.ts +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/types.ts @@ -12,6 +12,7 @@ export type Plugin = { title: string; description: string; url: string; + direct_install: boolean; icon: string; product: string; plugin: string; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts index b09b050e603..6cb2556e9eb 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts @@ -1,7 +1,7 @@ /** * External dependencies */ -import { useSelect } from '@wordpress/data'; +import { useSelect, useDispatch } from '@wordpress/data'; /** * Internal dependencies @@ -9,23 +9,29 @@ import { useSelect } from '@wordpress/data'; import { STORE_KEY } from '~/marketing/data/constants'; import { Plugin } from './types'; +const selector = 'getRecommendedPlugins'; const category = 'marketing'; -type SelectResult = { - isLoading: boolean; - plugins: Plugin[]; -}; - export const useRecommendedPlugins = () => { - return useSelect< SelectResult >( - ( select ) => { - const { getRecommendedPlugins, isResolving } = select( STORE_KEY ); + const { invalidateResolution, installAndActivateRecommendedPlugin } = + useDispatch( STORE_KEY ); - return { - isLoading: isResolving( 'getRecommendedPlugins', [ category ] ), - plugins: getRecommendedPlugins( category ), - }; - }, - [ category ] - ); + const installAndActivate = ( plugin: string ) => { + installAndActivateRecommendedPlugin( plugin, category ); + invalidateResolution( selector, [ category ] ); + }; + + return useSelect( ( select ) => { + const { getRecommendedPlugins, hasFinishedResolution } = + select( STORE_KEY ); + const plugins = getRecommendedPlugins< Plugin[] >( category ); + const isLoading = ! hasFinishedResolution( selector, [ category ] ); + + return { + isInitializing: ! plugins.length && isLoading, + isLoading, + plugins, + installAndActivate, + }; + }, [] ); }; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx index 1e6cf1cf6f6..8fb7100b83d 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx @@ -15,12 +15,12 @@ import { ProductIcon, PluginCardBody, } from '~/marketing/components'; -import { Plugin } from './types'; -import { usePlugins } from './usePlugins'; +import { Plugin } from '~/marketing/types'; +import { useInstalledPlugins } from '~/marketing/hooks'; export const InstalledExtensions = () => { const { installedPlugins, activatingPlugins, activateInstalledPlugin } = - usePlugins(); + useInstalledPlugins(); if ( installedPlugins.length === 0 ) { return null; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/types.tsx b/plugins/woocommerce-admin/client/marketing/types/Plugin.ts similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/types.tsx rename to plugins/woocommerce-admin/client/marketing/types/Plugin.ts diff --git a/plugins/woocommerce-admin/client/marketing/types/index.ts b/plugins/woocommerce-admin/client/marketing/types/index.ts new file mode 100644 index 00000000000..48bf19df237 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/types/index.ts @@ -0,0 +1 @@ +export { Plugin } from './Plugin'; diff --git a/plugins/woocommerce/changelog/feature-marketing-one-click-installation b/plugins/woocommerce/changelog/feature-marketing-one-click-installation new file mode 100644 index 00000000000..9cff168e930 --- /dev/null +++ b/plugins/woocommerce/changelog/feature-marketing-one-click-installation @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add one-click installation to recommended extensions in Marketing page. From db737f219039cb0bd0a369434f399fca928ee2e4 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 24 Nov 2022 06:00:20 -0800 Subject: [PATCH 0117/1680] Add responsiveness to product form header (#35623) * Update product title in smaller viewports * Move secondary product actions to menu group on mobile * Hide settings menu on smaller viewports * Add changelog entry --- .../client/products/product-form-actions.scss | 23 ++++ .../client/products/product-form-actions.tsx | 114 ++++++++++-------- .../product-settings/product-settings.scss | 9 +- .../product-settings/product-settings.tsx | 3 +- .../client/products/product-title.scss | 13 ++ .../client/products/product-title.tsx | 11 +- plugins/woocommerce/changelog/update-35168 | 4 + 7 files changed, 124 insertions(+), 53 deletions(-) create mode 100644 plugins/woocommerce-admin/client/products/product-title.scss create mode 100644 plugins/woocommerce/changelog/update-35168 diff --git a/plugins/woocommerce-admin/client/products/product-form-actions.scss b/plugins/woocommerce-admin/client/products/product-form-actions.scss index 79d7bbeb13b..0dc999c656c 100644 --- a/plugins/woocommerce-admin/client/products/product-form-actions.scss +++ b/plugins/woocommerce-admin/client/products/product-form-actions.scss @@ -8,6 +8,23 @@ $gutenberg-blue-darker: var(--wp-admin-theme-color-darker-20); justify-content: flex-end; padding-right: $gap-smaller; + @include breakpoint( '<782px' ) { + position: fixed; + bottom: 0; + left: 0; + width: 100%; + background: $white; + padding: $gap; + border-top: 1px solid $gray-200; + + .components-button-group { + width: 100%; + > button { + width: 100%; + } + } + } + > .components-button { margin-right: $gap-smaller; } @@ -36,3 +53,9 @@ $gutenberg-blue-darker: var(--wp-admin-theme-color-darker-20); } } } + +@include breakpoint( '<782px' ) { + .woocommerce-layout { + margin-bottom: calc(70px + $gap); // Product actions height + gap. + } +} diff --git a/plugins/woocommerce-admin/client/products/product-form-actions.tsx b/plugins/woocommerce-admin/client/products/product-form-actions.tsx index 271f3de898a..f7954bc71a3 100644 --- a/plugins/woocommerce-admin/client/products/product-form-actions.tsx +++ b/plugins/woocommerce-admin/client/products/product-form-actions.tsx @@ -15,6 +15,11 @@ import { useFormContext } from '@woocommerce/components'; import { Product } from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; import { navigateTo } from '@woocommerce/navigation'; +import { useSelect } from '@wordpress/data'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore No types for this exist yet. +// eslint-disable-next-line @woocommerce/dependency-group +import { store } from '@wordpress/viewport'; /** * Internal dependencies @@ -39,6 +44,14 @@ export const ProductFormActions: React.FC = () => { usePreventLeavingPage( isDirty ); + const { isSmallViewport } = useSelect( ( select ) => { + return { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore Types don't appear to be working correctly on this package. + isSmallViewport: select( store ).isViewportMatch( '< medium' ), + }; + } ); + const getProductDataForTracks = () => { return { product_id: values.id, @@ -142,59 +155,63 @@ export const ProductFormActions: React.FC = () => { }; const isPublished = values.id && values.status === 'publish'; + const SecondaryActionsComponent = isSmallViewport ? MenuItem : Button; + const secondaryActions = ( + <> + + { ! isDirty && values.id && values.status !== 'publish' && ( + + ) } + { isUpdatingDraft ? __( 'Saving', 'woocommerce' ) : null } + { ( isDirty || ! values.id ) && + ! isUpdatingDraft && + values.status !== 'publish' + ? __( 'Save draft', 'woocommerce' ) + : null } + { values.status === 'publish' && ! isUpdatingDraft + ? __( 'Switch to draft', 'woocommerce' ) + : null } + { ! isDirty && + values.id && + ! isUpdatingDraft && + values.status !== 'publish' + ? __( 'Saved', 'woocommerce' ) + : null } + + + recordEvent( 'product_preview_changes', { + new_product_page: true, + ...getProductDataForTracks(), + } ) + } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + //@ts-ignore The `href` prop works for both Buttons and MenuItem's. + href={ values.permalink + '?preview=true' } + disabled={ ! isValidForm || ! values.permalink } + target="_blank" + > + { __( 'Preview', 'woocommerce' ) } + + + ); return ( { () => (
    - - + { ! isSmallViewport && secondaryActions }
    @@ -162,7 +240,9 @@ function CustomerFeedbackModal( { CustomerFeedbackModal.propTypes = { recordScoreCallback: PropTypes.func.isRequired, - label: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, + firstQuestion: PropTypes.string.isRequired, + secondQuestion: PropTypes.string.isRequired, defaultScore: PropTypes.number, onCloseModal: PropTypes.func, }; diff --git a/packages/js/customer-effort-score/src/customer-feedback-modal/test/index.tsx b/packages/js/customer-effort-score/src/customer-feedback-modal/test/index.tsx index 40829821a4e..2604b415ee7 100644 --- a/packages/js/customer-effort-score/src/customer-feedback-modal/test/index.tsx +++ b/packages/js/customer-effort-score/src/customer-feedback-modal/test/index.tsx @@ -16,7 +16,9 @@ describe( 'CustomerFeedbackModal', () => { render( ); @@ -33,13 +35,15 @@ describe( 'CustomerFeedbackModal', () => { render( ); await screen.findByRole( 'dialog' ); // Wait for the modal to render. - fireEvent.click( screen.getByRole( 'button', { name: /send/i } ) ); // Press send button. + fireEvent.click( screen.getByRole( 'button', { name: /share/i } ) ); // Press send button. // Wait for error message. await screen.findByRole( 'alert' ); @@ -51,7 +55,9 @@ describe( 'CustomerFeedbackModal', () => { render( ); @@ -59,7 +65,9 @@ describe( 'CustomerFeedbackModal', () => { await screen.findByRole( 'dialog' ); expect( - screen.queryByLabelText( 'Comments (optional)' ) + screen.queryByLabelText( + 'How is that screen useful to you? What features would you add or change?' + ) ).not.toBeInTheDocument(); } ); @@ -69,7 +77,9 @@ describe( 'CustomerFeedbackModal', () => { render( ); @@ -77,18 +87,22 @@ describe( 'CustomerFeedbackModal', () => { await screen.findByRole( 'dialog' ); // Select the option. - fireEvent.click( screen.getByLabelText( labelText ) ); + fireEvent.click( screen.getAllByLabelText( labelText )[ 0 ] ); // Wait for comments field to show. - await screen.findByLabelText( 'Comments (optional)' ); + await screen.findByLabelText( + 'How is that screen useful to you? What features would you add or change?' + ); // Select neutral score. - fireEvent.click( screen.getByLabelText( 'Neutral' ) ); + fireEvent.click( screen.getAllByLabelText( 'Neutral' )[ 0 ] ); // Wait for comments field to hide. await waitFor( () => { expect( - screen.queryByLabelText( 'Comments (optional)' ) + screen.queryByLabelText( + 'How is that screen useful to you? What features would you add or change?' + ) ).not.toBeInTheDocument(); } ); } diff --git a/packages/js/customer-effort-score/src/style.scss b/packages/js/customer-effort-score/src/style.scss index 7af35552e4a..adabb8fdba9 100644 --- a/packages/js/customer-effort-score/src/style.scss +++ b/packages/js/customer-effort-score/src/style.scss @@ -1,7 +1,7 @@ @import 'customer-feedback-simple/customer-feedback-simple.scss'; .woocommerce-customer-effort-score__selection { - margin: 1em 0; + margin: 1em 0 1.5em 0; .components-base-control__field { display: flex; @@ -91,10 +91,14 @@ } .woocommerce-customer-effort-score__comments { + margin-bottom: 1.5em; + label { display: block; color: inherit; font-weight: bold; + text-transform: none; + font-size: 14px; } textarea { @@ -109,3 +113,8 @@ margin-left: 1em; } } + +.woocommerce-customer-effort-score .woocommerce-customer-effort-score__intro { + max-width: 550px; + margin: 0 0 1.5em 0; +} diff --git a/packages/js/customer-effort-score/src/test/index.tsx b/packages/js/customer-effort-score/src/test/index.tsx index 59f54f2afce..e8bd5e774cc 100644 --- a/packages/js/customer-effort-score/src/test/index.tsx +++ b/packages/js/customer-effort-score/src/test/index.tsx @@ -35,7 +35,9 @@ describe( 'CustomerEffortScore', () => { render( @@ -45,7 +47,7 @@ describe( 'CustomerEffortScore', () => { // Notice status. expect.any( String ), // Notice message. - 'label', + 'title', // Notice options. expect.objectContaining( { icon, @@ -63,7 +65,9 @@ describe( 'CustomerEffortScore', () => { const { rerender } = render( ); @@ -71,7 +75,9 @@ describe( 'CustomerEffortScore', () => { rerender( ); @@ -82,7 +88,9 @@ describe( 'CustomerEffortScore', () => { render( ); @@ -121,7 +129,9 @@ describe( 'CustomerEffortScore', () => { render( ); diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js b/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js index 32fba5c39e6..42dae830326 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js +++ b/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js @@ -49,7 +49,9 @@ function CustomerEffortScoreTracksContainer( { diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js b/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js index b55b39548e3..de458563360 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js +++ b/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js @@ -22,7 +22,9 @@ const ALLOW_TRACKING_OPTION_NAME = 'woocommerce_allow_tracking'; * @param {Object} props Component props. * @param {string} props.action The action name sent to Tracks. * @param {Object} props.trackProps Additional props sent to Tracks. - * @param {string} props.label The label displayed in the modal. + * @param {string} props.title The title displayed in the modal. + * @param {string} props.firstQuestion The first survey question. + * @param {string} props.secondQuestion The second survey question. * @param {string} props.onSubmitLabel The label displayed upon survey submission. * @param {Array} props.cesShownForActions The array of actions that the CES modal has been shown for. * @param {boolean} props.allowTracking Whether tracking is allowed or not. @@ -34,7 +36,9 @@ const ALLOW_TRACKING_OPTION_NAME = 'woocommerce_allow_tracking'; function CustomerEffortScoreTracks( { action, trackProps, - label, + title, + firstQuestion, + secondQuestion, onSubmitLabel = __( 'Thank you for your feedback!', 'woocommerce' ), cesShownForActions, allowTracking, @@ -104,10 +108,12 @@ function CustomerEffortScoreTracks( { addActionToShownOption(); }; - const recordScore = ( score, comments ) => { + const recordScore = ( score, secondScore, comments ) => { recordEvent( 'ces_feedback', { action, score, + score_second_question: secondScore, + score_combined: score + secondScore, comments: comments || '', store_age: storeAgeInWeeks, ...trackProps, @@ -118,7 +124,9 @@ function CustomerEffortScoreTracks( { return ( { } const newTrack = { action: action.action, - label: action.label, + title: action.title, + firstQuestion: action.firstQuestion, + secondQuestion: action.secondQuestion, pagenow: action.pageNow, adminpage: action.adminPage, onSubmitLabel: action.onSubmitLabel, diff --git a/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx b/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx index 26eada04092..91e7623b723 100644 --- a/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx +++ b/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx @@ -97,10 +97,20 @@ export const TaskListCompletedHeader: React.FC< } }, [ hasSubmittedScore ] ); - const submitScore = ( recordedScore: number, comments?: string ) => { + const submitScore = ( { + firstScore, + secondScore, + comments, + }: { + firstScore: number; + secondScore?: number; + comments?: string; + } ) => { recordEvent( 'ces_feedback', { action: CUSTOMER_EFFORT_SCORE_ACTION, - score: recordedScore, + score: firstScore, + score_second_question: secondScore ?? null, + score_combined: firstScore + ( secondScore ?? 0 ), comments: comments || '', store_age: storeAgeInWeeks, } ); @@ -116,7 +126,7 @@ export const TaskListCompletedHeader: React.FC< const recordScore = ( recordedScore: number ) => { if ( recordedScore > 2 ) { setScore( recordedScore ); - submitScore( recordedScore ); + submitScore( { firstScore: recordedScore } ); } else { setScore( recordedScore ); setShowCesModal( true ); @@ -127,9 +137,13 @@ export const TaskListCompletedHeader: React.FC< } }; - const recordModalScore = ( recordedScore: number, comments: string ) => { + const recordModalScore = ( + firstScore: number, + secondScore: number, + comments: string + ) => { setShowCesModal( false ); - submitScore( recordedScore, comments ); + submitScore( { firstScore, secondScore, comments } ); }; return ( @@ -230,7 +244,15 @@ export const TaskListCompletedHeader: React.FC< { showCesModal ? ( { diff --git a/plugins/woocommerce/changelog/add-35124-ces-add-question b/plugins/woocommerce/changelog/add-35124-ces-add-question new file mode 100644 index 00000000000..550dc1d8ebe --- /dev/null +++ b/plugins/woocommerce/changelog/add-35124-ces-add-question @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Updating all CES events to support two questions in modal. diff --git a/plugins/woocommerce/src/Internal/Admin/CustomerEffortScoreTracks.php b/plugins/woocommerce/src/Internal/Admin/CustomerEffortScoreTracks.php index ab99e1a5c71..9ef4f2e65b0 100644 --- a/plugins/woocommerce/src/Internal/Admin/CustomerEffortScoreTracks.php +++ b/plugins/woocommerce/src/Internal/Admin/CustomerEffortScoreTracks.php @@ -142,11 +142,13 @@ class CustomerEffortScoreTracks { * an increase of the number of rows in tags table * * @param string $action Action name for the survey. - * @param string $label Label for the snackbar. + * @param string $title Title for the snackbar. + * @param string $first_question The text for the first question. + * @param string $second_question The text for the second question. * * @return string Generated JavaScript to append to page. */ - private function get_script_track_edit_php( $action, $label ) { + private function get_script_track_edit_php( $action, $title, $first_question, $second_question ) { return sprintf( "(function( $ ) { 'use strict'; @@ -158,7 +160,7 @@ class CustomerEffortScoreTracks { if ( $('.tags tbody > tr').length > initialCount ) { // New tag detected. clearInterval( interval ); - wp.data.dispatch('wc/customer-effort-score').addCesSurvey( '%s', '%s', window.pagenow, window.adminpage, '%s' ); + wp.data.dispatch('wc/customer-effort-score').addCesSurvey({ action: '%s', title: '%s', firstQuestion: '%s', secondQuestion: '%s', onsubmitLabel: '%s' }); } else { // Form is no longer loading, most likely failed. if ( $( '#addtag .submit .spinner.is-active' ).length < 1 ) { @@ -169,7 +171,9 @@ class CustomerEffortScoreTracks { }); })( jQuery );", esc_js( $action ), - esc_js( $label ), + esc_js( $title ), + esc_js( $first_question ), + esc_js( $second_question ), esc_js( $this->onsubmit_label ) ); } @@ -271,10 +275,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::SEARCH_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to use search?', 'woocommerce' ), + 'firstQuestion' => __( + 'The search feature in WooCommerce is easy to use.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'The search\'s functionality meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => $page_now, 'adminpage' => $admin_page, @@ -337,10 +349,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::PRODUCT_ADD_PUBLISH_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to add a product?', 'woocommerce' ), + 'firstQuestion' => __( + 'The product creation screen is easy to use.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'The product creation screen\'s functionality meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => 'product', 'adminpage' => 'post-php', @@ -362,10 +382,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::PRODUCT_UPDATE_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to edit your product?', 'woocommerce' ), + 'firstQuestion' => __( + 'The product update process is easy to complete.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'The product update process meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => 'product', 'adminpage' => 'post-php', @@ -387,10 +415,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::SHOP_ORDER_UPDATE_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to update an order?', 'woocommerce' ), + 'firstQuestion' => __( + 'The order details screen is easy to use.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'The order details screen\'s functionality meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => 'shop_order', 'adminpage' => 'post-php', @@ -447,7 +483,9 @@ class CustomerEffortScoreTracks { wc_enqueue_js( $this->get_script_track_edit_php( self::ADD_PRODUCT_CATEGORIES_ACTION_NAME, - __( 'How easy was it to add product category?', 'woocommerce' ) + __( 'How easy was it to add product category?', 'woocommerce' ), + __( 'The product category details screen is easy to use.', 'woocommerce' ), + __( "The product category details screen's functionality meets my needs.", 'woocommerce' ) ) ); } @@ -463,7 +501,9 @@ class CustomerEffortScoreTracks { wc_enqueue_js( $this->get_script_track_edit_php( self::ADD_PRODUCT_TAGS_ACTION_NAME, - __( 'How easy was it to add a product tag?', 'woocommerce' ) + __( 'How easy was it to add a product tag?', 'woocommerce' ), + __( 'The product tag details screen is easy to use.', 'woocommerce' ), + __( "The product tag details screen's functionality meets my needs.", 'woocommerce' ) ) ); } @@ -484,10 +524,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::IMPORT_PRODUCTS_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to import products?', 'woocommerce' ), + 'firstQuestion' => __( + 'The product import process is easy to complete.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'The product import process meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => 'product_page_product_importer', 'adminpage' => 'product_page_product_importer', @@ -519,10 +567,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::SETTINGS_CHANGE_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to update your settings?', 'woocommerce' ), + 'firstQuestion' => __( + 'The settings screen is easy to use.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'The settings screen\'s functionality meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => 'woocommerce_page_wc-settings', 'adminpage' => 'woocommerce_page_wc-settings', @@ -542,10 +598,18 @@ class CustomerEffortScoreTracks { $this->enqueue_to_ces_tracks( array( 'action' => self::ADD_PRODUCT_ATTRIBUTES_ACTION_NAME, - 'label' => __( + 'title' => __( 'How easy was it to add a product attribute?', 'woocommerce' ), + 'firstQuestion' => __( + 'Product attributes are easy to use.', + 'woocommerce' + ), + 'secondQuestion' => __( + 'Product attributes\' functionality meets my needs.', + 'woocommerce' + ), 'onsubmit_label' => $this->onsubmit_label, 'pagenow' => 'product_page_product_attributes', 'adminpage' => 'product_page_product_attributes', From 79566d7e6b5cbce3065c5f8c48439cad1e0efb84 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Tue, 29 Nov 2022 15:11:57 -0300 Subject: [PATCH 0138/1680] Add a bottom padding to the whole form (#35721) --- plugins/woocommerce-admin/client/layout/style.scss | 4 ++-- plugins/woocommerce/changelog/enhancement-35571 | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/enhancement-35571 diff --git a/plugins/woocommerce-admin/client/layout/style.scss b/plugins/woocommerce-admin/client/layout/style.scss index 70999ebeaa0..1cc441263d6 100644 --- a/plugins/woocommerce-admin/client/layout/style.scss +++ b/plugins/woocommerce-admin/client/layout/style.scss @@ -15,8 +15,8 @@ } .woocommerce-layout__primary { - margin: $gutter-large 0 0 $fallback-gutter-large; - margin: $gutter-large 0 0 $gutter-large; + margin: $gutter-large 0 128px $fallback-gutter-large; + margin: $gutter-large 0 128px $gutter-large; @include breakpoint( '<782px' ) { margin-top: 20px; diff --git a/plugins/woocommerce/changelog/enhancement-35571 b/plugins/woocommerce/changelog/enhancement-35571 new file mode 100644 index 00000000000..4f735210b23 --- /dev/null +++ b/plugins/woocommerce/changelog/enhancement-35571 @@ -0,0 +1,4 @@ +Significance: patch +Type: enhancement + +Add a bottom padding to the whole form From 4b07384574c855196640c1e8120898b66511cec1 Mon Sep 17 00:00:00 2001 From: Stefano Iachetta <36002130+stfn00@users.noreply.github.com> Date: Tue, 29 Nov 2022 20:32:27 +0100 Subject: [PATCH 0139/1680] Fix wrong version typo (#35473) * Fix wrong version typo * Fix "since" tag in docblock * Add changelog Co-authored-by: Jorge A. Torres --- plugins/woocommerce/changelog/fix-wrong-template-version | 4 ++++ plugins/woocommerce/includes/wc-conditional-functions.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-wrong-template-version diff --git a/plugins/woocommerce/changelog/fix-wrong-template-version b/plugins/woocommerce/changelog/fix-wrong-template-version new file mode 100644 index 00000000000..7ddcea3106d --- /dev/null +++ b/plugins/woocommerce/changelog/fix-wrong-template-version @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix version in template and function docblocks. diff --git a/plugins/woocommerce/includes/wc-conditional-functions.php b/plugins/woocommerce/includes/wc-conditional-functions.php index aa9d3d522b4..d992cf24c2c 100644 --- a/plugins/woocommerce/includes/wc-conditional-functions.php +++ b/plugins/woocommerce/includes/wc-conditional-functions.php @@ -531,7 +531,7 @@ function wc_current_theme_supports_woocommerce_or_fse() { * * @param string $element The name of the element. * - * @since 7.1.0 + * @since 7.0.1 * @return string */ function wc_wp_theme_get_element_class_name( $element ) { From a734772c69f953fa466e861670f39732f0c83c7f Mon Sep 17 00:00:00 2001 From: Roy Ho Date: Tue, 29 Nov 2022 13:18:45 -0800 Subject: [PATCH 0140/1680] Add codeowners file (#35765) --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000000..614fa2f46be --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +/.github/ @woocommerce/atlas From 978604d0f16c9e6f00f4bdaf993af70651b9c0e9 Mon Sep 17 00:00:00 2001 From: Sam Seay Date: Wed, 30 Nov 2022 14:17:27 +1300 Subject: [PATCH 0141/1680] Introduce live branches UI page to WooCommerce Beta Tester (#35643) * Add basic classes to register the Live Branches page * Add API endpoint to load live branch manifest * TS/JS tooling, prettier tooling --- .../woocommerce-beta-tester/.prettierrc.js | 3 + plugins/woocommerce-beta-tester/api/api.php | 27 +- .../api/live-branches/manifest.php | 24 + .../changelog/dev-live-branches-ui | 4 + .../class-wc-beta-tester-live-branches.php | 78 ++ .../includes/class-wc-beta-tester.php | 1 + plugins/woocommerce-beta-tester/package.json | 19 +- .../src/live-branches/App.tsx | 48 + .../live-branches/components/BranchList.tsx | 51 + .../src/live-branches/hooks/live-branches.tsx | 41 + .../src/live-branches/index.tsx | 22 + plugins/woocommerce-beta-tester/tsconfig.json | 26 + .../woocommerce-beta-tester/webpack.config.js | 19 + pnpm-lock.yaml | 1182 ++++++----------- 14 files changed, 786 insertions(+), 759 deletions(-) create mode 100644 plugins/woocommerce-beta-tester/.prettierrc.js create mode 100644 plugins/woocommerce-beta-tester/api/live-branches/manifest.php create mode 100644 plugins/woocommerce-beta-tester/changelog/dev-live-branches-ui create mode 100644 plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-live-branches.php create mode 100644 plugins/woocommerce-beta-tester/src/live-branches/App.tsx create mode 100644 plugins/woocommerce-beta-tester/src/live-branches/components/BranchList.tsx create mode 100644 plugins/woocommerce-beta-tester/src/live-branches/hooks/live-branches.tsx create mode 100644 plugins/woocommerce-beta-tester/src/live-branches/index.tsx create mode 100644 plugins/woocommerce-beta-tester/tsconfig.json diff --git a/plugins/woocommerce-beta-tester/.prettierrc.js b/plugins/woocommerce-beta-tester/.prettierrc.js new file mode 100644 index 00000000000..548adf77728 --- /dev/null +++ b/plugins/woocommerce-beta-tester/.prettierrc.js @@ -0,0 +1,3 @@ +// Import the default config file and expose it in the project root. +// Useful for editor integrations. +module.exports = require("@wordpress/prettier-config"); diff --git a/plugins/woocommerce-beta-tester/api/api.php b/plugins/woocommerce-beta-tester/api/api.php index fdf4da27aa6..54775b66741 100644 --- a/plugins/woocommerce-beta-tester/api/api.php +++ b/plugins/woocommerce-beta-tester/api/api.php @@ -41,16 +41,17 @@ function register_woocommerce_admin_test_helper_rest_route( $route, $callback, $ ); } -require( 'admin-notes/delete-all-notes.php' ); -require( 'admin-notes/add-note.php' ); -require( 'tools/trigger-wca-install.php' ); -require( 'tools/trigger-cron-job.php' ); -require( 'tools/run-wc-admin-daily.php' ); -require( 'options/rest-api.php' ); -require( 'tools/delete-all-products.php' ); -require( 'tools/disable-wc-email.php' ); -require( 'tools/trigger-update-callbacks.php' ); -require( 'tracks/class-tracks-debug-log.php' ); -require( 'features/features.php' ); -require( 'rest-api-filters/rest-api-filters.php' ); -require( 'rest-api-filters/hook.php' ); +require 'admin-notes/delete-all-notes.php'; +require 'admin-notes/add-note.php'; +require 'tools/trigger-wca-install.php'; +require 'tools/trigger-cron-job.php'; +require 'tools/run-wc-admin-daily.php'; +require 'options/rest-api.php'; +require 'tools/delete-all-products.php'; +require 'tools/disable-wc-email.php'; +require 'tools/trigger-update-callbacks.php'; +require 'tracks/class-tracks-debug-log.php'; +require 'features/features.php'; +require 'rest-api-filters/rest-api-filters.php'; +require 'rest-api-filters/hook.php'; +require 'live-branches/manifest.php'; diff --git a/plugins/woocommerce-beta-tester/api/live-branches/manifest.php b/plugins/woocommerce-beta-tester/api/live-branches/manifest.php new file mode 100644 index 00000000000..a49e944c17a --- /dev/null +++ b/plugins/woocommerce-beta-tester/api/live-branches/manifest.php @@ -0,0 +1,24 @@ + 'GET', + ) +); + +/** + * API endpoint to fetch the manifest of live branches. + */ +function fetch_live_branches_manifest() { + $response = wp_remote_get( 'https://betadownload.jetpack.me/woocommerce-branches.json' ); + $body = wp_remote_retrieve_body( $response ); + + return new WP_REST_Response( json_decode( $body ), 200 ); +} diff --git a/plugins/woocommerce-beta-tester/changelog/dev-live-branches-ui b/plugins/woocommerce-beta-tester/changelog/dev-live-branches-ui new file mode 100644 index 00000000000..9fa8315448c --- /dev/null +++ b/plugins/woocommerce-beta-tester/changelog/dev-live-branches-ui @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add a basic UI screen for installing from live branches (disabled in prod) diff --git a/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-live-branches.php b/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-live-branches.php new file mode 100644 index 00000000000..902dd5d35fb --- /dev/null +++ b/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester-live-branches.php @@ -0,0 +1,78 @@ +register_page()`. + } + + /** + * Register live branches scripts. + */ + public function register_scripts() { + if ( ! method_exists( 'Automattic\WooCommerce\Admin\PageController', 'is_admin_or_embed_page' ) || + ! \Automattic\WooCommerce\Admin\PageController::is_admin_or_embed_page() + ) { + return; + } + + $script_path = '/build/live-branches.js'; + $script_asset_path = dirname( __FILE__ ) . '/../build/live-branches.asset.php'; + $script_asset = file_exists( $script_asset_path ) + ? require $script_asset_path + : array( + 'dependencies' => array(), + 'version' => filemtime( $script_path ), + ); + $script_url = WC_Beta_Tester::instance()->plugin_url() . $script_path; + + wp_register_script( + 'woocommerce-beta-tester-live-branches', + $script_url, + $script_asset['dependencies'], + $script_asset['version'], + true + ); + + wp_enqueue_script( 'woocommerce-beta-tester-live-branches' ); + } + + /** + * Register live branches page. + */ + public function register_page() { + if ( ! function_exists( 'wc_admin_register_page' ) ) { + return; + } + + wc_admin_register_page( + array( + 'id' => 'woocommerce-beta-tester-live-branches', + // phpcs:disable + 'title' => __( 'Live Branches', 'woocommerce-beta-tester' ), + 'path' => '/live-branches', + 'parent' => 'woocommerce', + 'capability' => 'read', + ) + ); + } +} + +return new WC_Beta_Tester_Live_Branches(); diff --git a/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester.php b/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester.php index 64028b5d43b..d0f2ae69ff1 100644 --- a/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester.php +++ b/plugins/woocommerce-beta-tester/includes/class-wc-beta-tester.php @@ -101,6 +101,7 @@ class WC_Beta_Tester { * Include any classes we need within admin. */ public function includes() { + include_once dirname( __FILE__ ) . '/class-wc-beta-tester-live-branches.php'; include_once dirname( __FILE__ ) . '/class-wc-beta-tester-admin-menus.php'; include_once dirname( __FILE__ ) . '/class-wc-beta-tester-admin-assets.php'; } diff --git a/plugins/woocommerce-beta-tester/package.json b/plugins/woocommerce-beta-tester/package.json index ef676667545..a30d8ce36f6 100644 --- a/plugins/woocommerce-beta-tester/package.json +++ b/plugins/woocommerce-beta-tester/package.json @@ -10,25 +10,38 @@ "version": "2.1.0", "homepage": "http://github.com/woocommerce/woocommerce-beta-tester", "devDependencies": { + "@types/react": "^17.0.2", + "@types/react-dom": "^18.0.6", + "@types/wordpress__components": "^19.10.1", "@woocommerce/dependency-extraction-webpack-plugin": "workspace:*", "@woocommerce/eslint-plugin": "workspace:*", "@wordpress/env": "^4.8.0", + "@wordpress/prettier-config": "^2.5.0", "@wordpress/scripts": "^19.2.4", "eslint": "5.16.0", + "prettier": "npm:wp-prettier@^2.6.2", + "ts-loader": "^9.4.1", + "typescript": "^4.8.3", "uglify-js": "^3.5.3" }, "dependencies": { + "@emotion/react": "^11.10.4", "@types/prop-types": "^15.7.4", + "@woocommerce/components": "workspace:*", "@woocommerce/data": "workspace:*", - "@wordpress/api-fetch": "^3.21.5", - "@wordpress/components": "^12.0.7", + "@wordpress/api-fetch": "^3.23.1", + "@wordpress/components": "^12.0.9", "@wordpress/compose": "^3.24.4", "@wordpress/data": "^4.26.7", "@wordpress/data-controls": "^1.20.7", - "@wordpress/element": "^2.19.1", + "@wordpress/element": "^4.18.0", "@wordpress/hooks": "^2.11.1", "prop-types": "^15.8.1" }, + "peerDependencies": { + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, "assets": { "js": { "min": "assets/js/*.min.js", diff --git a/plugins/woocommerce-beta-tester/src/live-branches/App.tsx b/plugins/woocommerce-beta-tester/src/live-branches/App.tsx new file mode 100644 index 00000000000..525687042ae --- /dev/null +++ b/plugins/woocommerce-beta-tester/src/live-branches/App.tsx @@ -0,0 +1,48 @@ +/** + * External dependencies + */ +import { + Card, + CardBody, + CardFooter, + CardHeader, + // @ts-ignore + __experimentalHeading as Heading, +} from '@wordpress/components'; +import { Spinner } from '@woocommerce/components'; +import { css } from '@emotion/react'; + +/** + * Internal dependencies + */ +import { useLiveBranchesData } from './hooks/live-branches'; +import { BranchList } from './components/BranchList'; + +const cardStyle = css( { + marginTop: '32px', +} ); + +export const App = () => { + const { branches, isLoading } = useLiveBranchesData(); + + return ( + <> + + Live Branches - Install and test WooCommerce PRs + + + +

    Active PRs

    +
    + + { isLoading ? ( + + ) : ( + + ) } + + +
    + + ); +}; diff --git a/plugins/woocommerce-beta-tester/src/live-branches/components/BranchList.tsx b/plugins/woocommerce-beta-tester/src/live-branches/components/BranchList.tsx new file mode 100644 index 00000000000..df57fccbac5 --- /dev/null +++ b/plugins/woocommerce-beta-tester/src/live-branches/components/BranchList.tsx @@ -0,0 +1,51 @@ +/** + * External dependencies + */ +import { + // @ts-ignore + __experimentalItemGroup as ItemGroup, + // @ts-ignore + __experimentalItem as Item, + Button, +} from '@wordpress/components'; + +/** + * Internal dependencies + */ +import { Branch } from '../hooks/live-branches'; + +const BranchListItem = ( { branch }: { branch: Branch } ) => { + return ( + +

    + Download URL:{ ' ' } + { branch.download_url } +

    +

    + Pull Request:{ ' ' } + + { branch.branch } + +

    + +
    + ); +}; + +export const BranchList = ( { branches }: { branches: Branch[] } ) => { + return ( + + { /* @ts-ignore */ } + { branches.map( ( branch ) => ( + + ) ) } + + ); +}; diff --git a/plugins/woocommerce-beta-tester/src/live-branches/hooks/live-branches.tsx b/plugins/woocommerce-beta-tester/src/live-branches/hooks/live-branches.tsx new file mode 100644 index 00000000000..340d1dcdb17 --- /dev/null +++ b/plugins/woocommerce-beta-tester/src/live-branches/hooks/live-branches.tsx @@ -0,0 +1,41 @@ +// @ts-ignore +import apiFetch from '@wordpress/api-fetch'; +import { useEffect, useState } from 'react'; +// @ts-ignore +import { API_NAMESPACE } from '../../features/data/constants'; + +export type Branch = { + branch: string; + commit: string; + download_url: string; + update_date: string; + version: string; + pr: number; +}; + +export const useLiveBranchesData = () => { + const [ branches, setBranches ] = useState< Branch[] >( [] ); + const [ loading, setLoading ] = useState< boolean >( true ); + + useEffect( () => { + const getBranches = async () => { + const res = await apiFetch( { + path: `${ API_NAMESPACE }/live-branches/manifest/v1`, + method: 'GET', + } ); + + setBranches( + // @ts-ignore + Object.entries( res.pr ).map( ( [ , value ] ) => { + return value; + } ) as Branch[] + ); + + setLoading( false ); + }; + + getBranches(); + }, [] ); + + return { branches, isLoading: loading }; +}; diff --git a/plugins/woocommerce-beta-tester/src/live-branches/index.tsx b/plugins/woocommerce-beta-tester/src/live-branches/index.tsx new file mode 100644 index 00000000000..6451d95615b --- /dev/null +++ b/plugins/woocommerce-beta-tester/src/live-branches/index.tsx @@ -0,0 +1,22 @@ +/** + * External dependencies + */ +import { addFilter } from '@wordpress/hooks'; + +/** + * Internal dependencies + */ +import { App } from './App'; + +addFilter( 'woocommerce_admin_pages_list', 'live-branches', ( pages ) => { + pages.push( { + container: App, + path: '/live-branches', + wpOpenMenu: 'toplevel_page_woocommerce', + capability: 'read', + breadcrumbs: [ 'Live Branches' ], + navArgs: { id: 'live-branches' }, + } ); + + return pages; +} ); diff --git a/plugins/woocommerce-beta-tester/tsconfig.json b/plugins/woocommerce-beta-tester/tsconfig.json new file mode 100644 index 00000000000..3961d163119 --- /dev/null +++ b/plugins/woocommerce-beta-tester/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + // Target latest version of ECMAScript. + "target": "esnext", + + // Search under node_modules for non-relative imports. + "moduleResolution": "node", + + "jsx": "react-jsx", + + // Temporary for resolving the test data json, remove when moving to using the API + "resolveJsonModule": true, + + "jsxImportSource": "@emotion/react", + + // Enable strictest settings like strictNullChecks & noImplicitAny. + "strict": true, + + // Import non-ES modules as default imports. + "esModuleInterop": true, + + // Skip type checking of declaration files because some libraries define two copies of the same type in an inconsistent way + "skipLibCheck": true, + "module": "esnext", + }, +} diff --git a/plugins/woocommerce-beta-tester/webpack.config.js b/plugins/woocommerce-beta-tester/webpack.config.js index 7c211bc7ca0..e7fff48497a 100644 --- a/plugins/woocommerce-beta-tester/webpack.config.js +++ b/plugins/woocommerce-beta-tester/webpack.config.js @@ -3,6 +3,25 @@ const WooCommerceDependencyExtractionWebpackPlugin = require( '@woocommerce/depe module.exports = { ...defaultConfig, + entry: { + ...defaultConfig.entry, + // Separate entry point for the live-branches page. + 'live-branches': './src/live-branches/index.tsx', + }, + module: { + ...defaultConfig.module, + rules: [ + ...defaultConfig.module.rules, + { + test: /\.tsx?$/, + use: 'ts-loader', + exclude: /node_modules/, + }, + ], + }, + resolve: { + extensions: [ '.js', '.jsx', '.tsx', '.ts' ], + }, plugins: [ ...defaultConfig.plugins.filter( ( plugin ) => diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49e9440dc83..f8d78f52f13 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1742,39 +1742,61 @@ importers: plugins/woocommerce-beta-tester: specifiers: + '@emotion/react': ^11.10.4 '@types/prop-types': ^15.7.4 + '@types/react': ^17.0.2 + '@types/react-dom': ^18.0.6 + '@types/wordpress__components': ^19.10.1 + '@woocommerce/components': workspace:* '@woocommerce/data': workspace:* '@woocommerce/dependency-extraction-webpack-plugin': workspace:* '@woocommerce/eslint-plugin': workspace:* - '@wordpress/api-fetch': ^3.21.5 - '@wordpress/components': ^12.0.7 + '@wordpress/api-fetch': ^3.23.1 + '@wordpress/components': ^12.0.9 '@wordpress/compose': ^3.24.4 '@wordpress/data': ^4.26.7 '@wordpress/data-controls': ^1.20.7 - '@wordpress/element': ^2.19.1 + '@wordpress/element': ^4.18.0 '@wordpress/env': ^4.8.0 '@wordpress/hooks': ^2.11.1 + '@wordpress/prettier-config': ^2.5.0 '@wordpress/scripts': ^19.2.4 eslint: 5.16.0 + prettier: npm:wp-prettier@^2.6.2 prop-types: ^15.8.1 + react: ^17.0.2 + react-dom: ^17.0.2 + ts-loader: ^9.4.1 + typescript: ^4.8.3 uglify-js: ^3.5.3 dependencies: + '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau '@types/prop-types': 15.7.4 + '@woocommerce/components': link:../../packages/js/components '@woocommerce/data': link:../../packages/js/data '@wordpress/api-fetch': 3.23.1_react-native@0.70.0 - '@wordpress/components': 12.0.9_xskq4rpwld77646vdfceli5qtq - '@wordpress/compose': 3.25.3_react@16.14.0 - '@wordpress/data': 4.27.3_react@16.14.0 - '@wordpress/data-controls': 1.21.3_3lfrqxmbuwi67co5eklk724ov4 - '@wordpress/element': 2.20.3 + '@wordpress/components': 12.0.9_tymsfwxsfigcu46i7beagdrini + '@wordpress/compose': 3.25.3_react@17.0.2 + '@wordpress/data': 4.27.3_react@17.0.2 + '@wordpress/data-controls': 1.21.3_6mfjqmjzo7vxk4q6gjrwvpc2y4 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 2.12.3 prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 devDependencies: + '@types/react': 17.0.50 + '@types/react-dom': 18.0.9 + '@types/wordpress__components': 19.10.1_sfoxds7t5ydpegc3knd667wn6m '@woocommerce/dependency-extraction-webpack-plugin': link:../../packages/js/dependency-extraction-webpack-plugin '@woocommerce/eslint-plugin': link:../../packages/js/eslint-plugin '@wordpress/env': 4.9.0 - '@wordpress/scripts': 19.2.4_n2e5qpfnvmhjuka25cq4kn6xqu + '@wordpress/prettier-config': 2.5.0_wp-prettier@2.6.2 + '@wordpress/scripts': 19.2.4_acp5qrdj4cc6vmqqhp4stdanfe eslint: 5.16.0 + prettier: /wp-prettier/2.6.2 + ts-loader: 9.4.1_27qmdvvfdw5s3nqwnln6yerdsa + typescript: 4.8.4 uglify-js: 3.14.5 plugins/woocommerce/client/legacy: @@ -2302,7 +2324,7 @@ packages: '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/dom': 3.10.0 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/i18n': 4.10.0 '@wordpress/icons': 9.1.0 '@wordpress/primitives': 3.8.0 @@ -2594,6 +2616,32 @@ packages: semver: 6.3.0 dev: true + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.16.7 + browserslist: 4.20.4 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.16.12 + '@babel/helper-validator-option': 7.16.7 + browserslist: 4.20.4 + semver: 6.3.0 + dev: false + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -3455,7 +3503,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-remap-async-to-generator': 7.16.8 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 transitivePeerDependencies: @@ -3469,7 +3517,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-remap-async-to-generator': 7.16.8 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 transitivePeerDependencies: @@ -4000,12 +4048,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 dev: true /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.16.12: @@ -4014,12 +4062,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.12 dev: false /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: @@ -5139,7 +5187,7 @@ packages: '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.16.7 '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 globals: 11.12.0 @@ -5158,7 +5206,7 @@ packages: '@babel/helper-environment-visitor': 7.16.7 '@babel/helper-function-name': 7.16.7 '@babel/helper-optimise-call-expression': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-replace-supers': 7.16.7 '@babel/helper-split-export-declaration': 7.16.7 globals: 11.12.0 @@ -5321,7 +5369,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: true /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.16.12: @@ -5332,7 +5380,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: false /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: @@ -5446,7 +5494,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: true /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.16.12: @@ -5457,7 +5505,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-builder-binary-assignment-operator-visitor': 7.16.7 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: false /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: @@ -5863,7 +5911,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-hoist-variables': 7.16.7 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-identifier': 7.16.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5879,7 +5927,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-hoist-variables': 7.16.7 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-identifier': 7.16.7 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5938,7 +5986,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: - supports-color dev: true @@ -5951,7 +5999,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 transitivePeerDependencies: - supports-color dev: false @@ -6194,16 +6242,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.16.12: - resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.17.8: resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} engines: {node: '>=6.9.0'} @@ -6608,8 +6646,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 dev: true /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: @@ -6619,8 +6657,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-skip-transparent-expression-wrappers': 7.16.0 dev: false /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: @@ -6798,7 +6836,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.16.12 transitivePeerDependencies: @@ -6899,7 +6937,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: true /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.16.12: @@ -6910,7 +6948,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-create-regexp-features-plugin': 7.17.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.18.9 dev: false /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: @@ -7026,7 +7064,7 @@ packages: dependencies: '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.16.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 @@ -7093,7 +7131,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.19.3 + '@babel/types': 7.17.0 babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 @@ -7111,7 +7149,7 @@ packages: dependencies: '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 '@babel/helper-plugin-utils': 7.18.9 '@babel/helper-validator-option': 7.16.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 @@ -7178,7 +7216,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.19.3 + '@babel/types': 7.17.0 babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 @@ -7429,8 +7467,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.16.12 transitivePeerDependencies: - supports-color @@ -7619,8 +7657,8 @@ packages: engines: {node: '>=10.0.0'} dev: true - /@emotion/babel-plugin/11.7.2_@babel+core@7.17.8: - resolution: {integrity: sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==} + /@emotion/babel-plugin/11.10.5_@babel+core@7.17.8: + resolution: {integrity: sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -7628,15 +7666,15 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.17.8 '@babel/runtime': 7.19.0 - '@emotion/hash': 0.8.0 - '@emotion/memoize': 0.7.5 - '@emotion/serialize': 1.0.2 - babel-plugin-macros: 2.8.0 + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/serialize': 1.1.1 + babel-plugin-macros: 3.1.0 convert-source-map: 1.8.0 escape-string-regexp: 4.0.0 find-root: 1.1.0 source-map: 0.5.7 - stylis: 4.0.13 + stylis: 4.1.3 /@emotion/cache/10.0.29: resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} @@ -7646,27 +7684,23 @@ packages: '@emotion/utils': 0.11.3 '@emotion/weak-memoize': 0.2.5 + /@emotion/cache/11.10.5: + resolution: {integrity: sha512-dGYHWyzTdmK+f2+EnIGBpkz1lKc4Zbj2KHd4cX3Wi8/OWr5pKslNjc3yABKH4adRGCvSX4VDC0i04mrrq0aiRA==} + dependencies: + '@emotion/memoize': 0.8.0 + '@emotion/sheet': 1.2.1 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + stylis: 4.1.3 + /@emotion/cache/11.7.1: resolution: {integrity: sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==} dependencies: '@emotion/memoize': 0.7.5 '@emotion/sheet': 1.1.0 - '@emotion/utils': 1.1.0 + '@emotion/utils': 1.2.0 '@emotion/weak-memoize': 0.2.5 stylis: 4.0.13 - - /@emotion/core/10.3.1_react@16.14.0: - resolution: {integrity: sha512-447aUEjPIm0MnE6QYIaFz9VQOHSXf4Iu6EWOIqq11EAPqinkSZmfymPTmlOE3QjLv846lH4JVZBUOtwGbuQoww==} - peerDependencies: - react: '>=16.3.0' - dependencies: - '@babel/runtime': 7.19.0 - '@emotion/cache': 10.0.29 - '@emotion/css': 10.0.27 - '@emotion/serialize': 0.11.16 - '@emotion/sheet': 0.9.4 - '@emotion/utils': 0.11.3 - react: 16.14.0 dev: false /@emotion/core/10.3.1_react@17.0.2: @@ -7681,7 +7715,6 @@ packages: '@emotion/sheet': 0.9.4 '@emotion/utils': 0.11.3 react: 17.0.2 - dev: true /@emotion/css/10.0.27: resolution: {integrity: sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==} @@ -7699,15 +7732,18 @@ packages: optional: true dependencies: '@babel/core': 7.17.8 - '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 - '@emotion/cache': 11.7.1 - '@emotion/serialize': 1.0.2 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 '@emotion/sheet': 1.1.0 - '@emotion/utils': 1.1.0 + '@emotion/utils': 1.2.0 /@emotion/hash/0.8.0: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} + /@emotion/hash/0.9.0: + resolution: {integrity: sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==} + /@emotion/is-prop-valid/0.8.8: resolution: {integrity: sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==} requiresBuild: true @@ -7725,31 +7761,34 @@ packages: /@emotion/memoize/0.7.5: resolution: {integrity: sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ==} - /@emotion/native/10.0.27_peeplpcor766cv2dor4ihhuuki: + /@emotion/memoize/0.8.0: + resolution: {integrity: sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==} + + /@emotion/native/10.0.27_cs25t3dnf4q4hgs5y5gkeqxj6m: resolution: {integrity: sha512-3qxR2XFizGfABKKbX9kAYc0PHhKuCEuyxshoq3TaMEbi9asWHdQVChg32ULpblm4XAf9oxaitAU7J9SfdwFxtw==} peerDependencies: react-native: '>=0.14.0 <1' dependencies: - '@emotion/primitives-core': 10.0.27_qzeatvug73zaio2r3dlvejynye - react-native: 0.70.0_kb6wpw22f5rcob6qxj2uco6yqa + '@emotion/primitives-core': 10.0.27_gfrer23gq2rp2t523t6qbxrx6m + react-native: 0.70.0_j7uotthv7togybeij4kylbfq2y transitivePeerDependencies: - '@emotion/core' - react dev: false - /@emotion/primitives-core/10.0.27_qzeatvug73zaio2r3dlvejynye: + /@emotion/primitives-core/10.0.27_gfrer23gq2rp2t523t6qbxrx6m: resolution: {integrity: sha512-fRBEDNPSFFOrBJ0OcheuElayrNTNdLF9DzMxtL0sFgsCFvvadlzwJHhJMSwEJuxwARm9GhVLr1p8G8JGkK98lQ==} peerDependencies: '@emotion/core': ^10.0.27 react: '>=16.3.0' dependencies: - '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/core': 10.3.1_react@17.0.2 css-to-react-native: 2.3.2 - react: 16.14.0 + react: 17.0.2 dev: false - /@emotion/react/11.8.2_lvgioobbs7lf3pr6y4xfpughau: - resolution: {integrity: sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==} + /@emotion/react/11.10.5_lvgioobbs7lf3pr6y4xfpughau: + resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==} peerDependencies: '@babel/core': ^7.0.0 '@types/react': '*' @@ -7762,17 +7801,18 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/runtime': 7.19.0 - '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 - '@emotion/cache': 11.7.1 - '@emotion/serialize': 1.0.2 - '@emotion/utils': 1.1.0 - '@emotion/weak-memoize': 0.2.5 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@17.0.2 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 '@types/react': 17.0.50 hoist-non-react-statics: 3.3.2 react: 17.0.2 - /@emotion/react/11.8.2_mcptgafjogap2nfvnfqvfwh6uu: - resolution: {integrity: sha512-+1bcHBaNJv5nkIIgnGKVsie3otS0wF9f1T1hteF3WeVvMNQEtfZ4YyFpnphGoot3ilU/wWMgP2SgIDuHLE/wAA==} + /@emotion/react/11.10.5_mcptgafjogap2nfvnfqvfwh6uu: + resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==} peerDependencies: '@babel/core': ^7.0.0 '@types/react': '*' @@ -7785,11 +7825,12 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/runtime': 7.19.0 - '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 - '@emotion/cache': 11.7.1 - '@emotion/serialize': 1.0.2 - '@emotion/utils': 1.1.0 - '@emotion/weak-memoize': 0.2.5 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@17.0.2 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 hoist-non-react-statics: 3.3.2 react: 17.0.2 dev: false @@ -7809,7 +7850,17 @@ packages: '@emotion/hash': 0.8.0 '@emotion/memoize': 0.7.5 '@emotion/unitless': 0.7.5 - '@emotion/utils': 1.1.0 + '@emotion/utils': 1.2.0 + csstype: 3.1.1 + dev: false + + /@emotion/serialize/1.1.1: + resolution: {integrity: sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==} + dependencies: + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/unitless': 0.8.0 + '@emotion/utils': 1.2.0 csstype: 3.1.1 /@emotion/sheet/0.9.4: @@ -7818,6 +7869,9 @@ packages: /@emotion/sheet/1.1.0: resolution: {integrity: sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g==} + /@emotion/sheet/1.2.1: + resolution: {integrity: sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==} + /@emotion/styled-base/10.3.0_gfrer23gq2rp2t523t6qbxrx6m: resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} peerDependencies: @@ -7830,21 +7884,6 @@ packages: '@emotion/serialize': 0.11.16 '@emotion/utils': 0.11.3 react: 17.0.2 - dev: true - - /@emotion/styled-base/10.3.0_qzeatvug73zaio2r3dlvejynye: - resolution: {integrity: sha512-PBRqsVKR7QRNkmfH78hTSSwHWcwDpecH9W6heujWAcyp2wdz/64PP73s7fWS1dIPm8/Exc8JAzYS8dEWXjv60w==} - peerDependencies: - '@emotion/core': ^10.0.28 - react: '>=16.3.0' - dependencies: - '@babel/runtime': 7.19.0 - '@emotion/core': 10.3.1_react@16.14.0 - '@emotion/is-prop-valid': 0.8.8 - '@emotion/serialize': 0.11.16 - '@emotion/utils': 0.11.3 - react: 16.14.0 - dev: false /@emotion/styled/10.3.0_gfrer23gq2rp2t523t6qbxrx6m: resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} @@ -7856,21 +7895,8 @@ packages: '@emotion/styled-base': 10.3.0_gfrer23gq2rp2t523t6qbxrx6m babel-plugin-emotion: 10.2.2 react: 17.0.2 - dev: true - /@emotion/styled/10.3.0_qzeatvug73zaio2r3dlvejynye: - resolution: {integrity: sha512-GgcUpXBBEU5ido+/p/mCT2/Xx+Oqmp9JzQRuC+a4lYM4i4LBBn/dWvc0rQ19N9ObA8/T4NWMrPNe79kMBDJqoQ==} - peerDependencies: - '@emotion/core': ^10.0.27 - react: '>=16.3.0' - dependencies: - '@emotion/core': 10.3.1_react@16.14.0 - '@emotion/styled-base': 10.3.0_qzeatvug73zaio2r3dlvejynye - babel-plugin-emotion: 10.2.2 - react: 16.14.0 - dev: false - - /@emotion/styled/11.8.1_336qi3gvxoqj6dyikirbxktxtq: + /@emotion/styled/11.8.1_c2qm47vaialpqni522adyu6za4: resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} peerDependencies: '@babel/core': ^7.0.0 @@ -7885,43 +7911,53 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/runtime': 7.19.0 - '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 '@emotion/is-prop-valid': 1.1.2 - '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau - '@emotion/serialize': 1.0.2 - '@emotion/utils': 1.1.0 + '@emotion/react': 11.10.5_mcptgafjogap2nfvnfqvfwh6uu + '@emotion/serialize': 1.1.1 + '@emotion/utils': 1.2.0 + react: 17.0.2 + dev: false + + /@emotion/styled/11.8.1_hhesyqfwklnojgamcachhyxace: + resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} + peerDependencies: + '@babel/core': ^7.0.0 + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/core': 7.17.8 + '@babel/runtime': 7.19.0 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 + '@emotion/is-prop-valid': 1.1.2 + '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau + '@emotion/serialize': 1.1.1 + '@emotion/utils': 1.2.0 '@types/react': 17.0.50 react: 17.0.2 - /@emotion/styled/11.8.1_lddnk6nv2rrayprsm6yu5n7lz4: - resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} - peerDependencies: - '@babel/core': ^7.0.0 - '@emotion/react': ^11.0.0-rc.0 - '@types/react': '*' - react: '>=16.8.0' - peerDependenciesMeta: - '@babel/core': - optional: true - '@types/react': - optional: true - dependencies: - '@babel/core': 7.17.8 - '@babel/runtime': 7.19.0 - '@emotion/babel-plugin': 11.7.2_@babel+core@7.17.8 - '@emotion/is-prop-valid': 1.1.2 - '@emotion/react': 11.8.2_mcptgafjogap2nfvnfqvfwh6uu - '@emotion/serialize': 1.0.2 - '@emotion/utils': 1.1.0 - react: 17.0.2 - dev: false - /@emotion/stylis/0.8.5: resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==} /@emotion/unitless/0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} + /@emotion/unitless/0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + + /@emotion/use-insertion-effect-with-fallbacks/1.0.0_react@17.0.2: + resolution: {integrity: sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 17.0.2 + /@emotion/utils/0.11.3: resolution: {integrity: sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw==} @@ -7929,12 +7965,15 @@ packages: resolution: {integrity: sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA==} dev: false - /@emotion/utils/1.1.0: - resolution: {integrity: sha512-iRLa/Y4Rs5H/f2nimczYmS5kFJEbpiVvgN3XVfZ022IYhuNA1IRSHEizcof88LtCTXtl9S2Cxt32KgaXEu72JQ==} + /@emotion/utils/1.2.0: + resolution: {integrity: sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==} /@emotion/weak-memoize/0.2.5: resolution: {integrity: sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==} + /@emotion/weak-memoize/0.3.0: + resolution: {integrity: sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==} + /@es-joy/jsdoccomment/0.10.8: resolution: {integrity: sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==} engines: {node: ^12 || ^14 || ^16} @@ -13250,7 +13289,7 @@ packages: dependencies: '@babel/runtime': 7.17.7 '@types/react': 17.0.50 - '@types/react-dom': 17.0.13 + '@types/react-dom': 18.0.9 '@types/react-test-renderer': 17.0.1 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 @@ -13266,7 +13305,7 @@ packages: dependencies: '@babel/runtime': 7.17.7 '@testing-library/dom': 8.11.3 - '@types/react-dom': 17.0.13 + '@types/react-dom': 18.0.9 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 @@ -13675,13 +13714,13 @@ packages: dependencies: '@types/react': 16.14.31 - /@types/react-dom/17.0.13: - resolution: {integrity: sha512-wEP+B8hzvy6ORDv1QBhcQia4j6ea4SFIBttHYpXKPFZRviBvknq0FRh3VrIxeXUmsPkwuXVZrVGG7KUVONmXCQ==} + /@types/react-dom/17.0.17: + resolution: {integrity: sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==} dependencies: '@types/react': 17.0.50 - /@types/react-dom/17.0.17: - resolution: {integrity: sha512-VjnqEmqGnasQKV0CWLevqMTXBYG9GbwuE6x3VetERLh0cq2LTptFE73MrQi2S7GkKXCf2GgwItB/melLnxfnsg==} + /@types/react-dom/18.0.9: + resolution: {integrity: sha512-qnVvHxASt/H7i+XG1U1xMiY5t+IHcPGUK7TDMDzom08xa7e86eCeKOiLZezwCKVxJn6NEiiy2ekgX8aQssjIKg==} dependencies: '@types/react': 17.0.50 @@ -13846,7 +13885,7 @@ packages: '@types/wordpress__components': 19.10.1_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__data': 6.0.0 '@types/wordpress__keycodes': 2.3.1 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react @@ -13861,7 +13900,7 @@ packages: dependencies: '@types/react': 17.0.50 '@types/wordpress__components': 19.10.1_sfoxds7t5ydpegc3knd667wn6m - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -13873,7 +13912,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_prpqlkd37azqwypxturxi7uyci transitivePeerDependencies: @@ -13888,7 +13927,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: @@ -13928,7 +13967,7 @@ packages: dependencies: '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__core-data': 2.4.5 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -15021,36 +15060,6 @@ packages: react-is: 17.0.2 react-test-renderer: 17.0.2_react@17.0.2 - /@wojtekmaj/enzyme-adapter-react-17/0.6.6_ik7hpot7mnfxczcz2kfmgakhdq: - resolution: {integrity: sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==} - peerDependencies: - enzyme: ^3.0.0 - react: ^17.0.0-0 - react-dom: ^17.0.0-0 - dependencies: - '@wojtekmaj/enzyme-adapter-utils': 0.1.2_react@16.14.0 - enzyme: 3.11.0 - enzyme-shallow-equal: 1.0.4 - has: 1.0.3 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - react-is: 17.0.2 - react-test-renderer: 17.0.2_react@16.14.0 - dev: true - - /@wojtekmaj/enzyme-adapter-utils/0.1.2_react@16.14.0: - resolution: {integrity: sha512-MM/DqDqvxNVlWLqSVQiUbRN9MuDLJfefmPbJ8ZKdmdf5ID8G+i42XhFpoQh5bAZUCdwzRae3+WSZl2lXcFOrhw==} - peerDependencies: - react: ^17.0.0-0 - dependencies: - function.prototype.name: 1.1.5 - has: 1.0.3 - object.fromentries: 2.0.5 - prop-types: 15.8.1 - react: 16.14.0 - dev: true - /@wojtekmaj/enzyme-adapter-utils/0.1.2_react@17.0.2: resolution: {integrity: sha512-MM/DqDqvxNVlWLqSVQiUbRN9MuDLJfefmPbJ8ZKdmdf5ID8G+i42XhFpoQh5bAZUCdwzRae3+WSZl2lXcFOrhw==} peerDependencies: @@ -15129,7 +15138,7 @@ packages: /@wordpress/api-fetch/3.23.1_react-native@0.70.0: resolution: {integrity: sha512-dmeigLuvqYAzpQ2hWUQT1P5VQAjkj9hS1z7PgNi1CcULFPbY8BWW+KiBETUu6Wm+rlSbUL2dC8qrA4JDv9ja5A==} dependencies: - '@babel/runtime': 7.17.7 + '@babel/runtime': 7.19.0 '@wordpress/i18n': 3.20.0 '@wordpress/url': 2.22.2_react-native@0.70.0 transitivePeerDependencies: @@ -15162,15 +15171,6 @@ packages: '@wordpress/url': 3.5.1 dev: false - /@wordpress/api-fetch/6.12.0: - resolution: {integrity: sha512-5zfpvmAd1Fx+89R+ldBfA+mbHxatmpNWxH9BRdF8tFXIFcJhKLFvGK7NsJuqnTu4DH0pr1tAzQyf+QcF4UkV9A==} - engines: {node: '>=12'} - dependencies: - '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.19.0 - '@wordpress/url': 3.20.0 - dev: false - /@wordpress/api-fetch/6.16.0: resolution: {integrity: sha512-tDgBIMTyOEfLo2d05CV4/O7quTvv8WcfTWy2i/SZg/HmOebbb92UNL9h4N71vaClJJaROqZkK+S2jy506jgCrQ==} engines: {node: '>=12'} @@ -15297,7 +15297,7 @@ packages: '@babel/runtime': 7.19.0 '@wordpress/babel-plugin-import-jsx-pragma': 3.2.0_@babel+core@7.17.8 '@wordpress/browserslist-config': 4.1.3 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/warning': 2.19.0 browserslist: 4.21.4 core-js: 3.25.5 @@ -15317,7 +15317,7 @@ packages: '@babel/runtime': 7.17.7 '@wordpress/babel-plugin-import-jsx-pragma': 3.1.0_@babel+core@7.16.12 '@wordpress/browserslist-config': 4.1.0 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/warning': 2.2.2 browserslist: 4.19.3 core-js: 3.21.1 @@ -15337,7 +15337,7 @@ packages: '@babel/runtime': 7.17.7 '@wordpress/babel-plugin-import-jsx-pragma': 3.1.2_@babel+core@7.17.8 '@wordpress/browserslist-config': 4.1.2 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/warning': 2.4.1 browserslist: 4.20.2 core-js: 3.21.1 @@ -15357,7 +15357,7 @@ packages: '@babel/runtime': 7.19.0 '@wordpress/babel-plugin-import-jsx-pragma': 4.2.0_@babel+core@7.17.8 '@wordpress/browserslist-config': 5.2.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/warning': 2.19.0 browserslist: 4.21.4 core-js: 3.25.5 @@ -15412,7 +15412,7 @@ packages: '@wordpress/date': 4.19.0 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 3.19.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15470,7 +15470,7 @@ packages: '@wordpress/date': 4.19.0 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 3.19.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15525,7 +15525,7 @@ packages: '@wordpress/date': 4.19.0 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 3.19.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15578,7 +15578,7 @@ packages: '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 3.19.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15611,7 +15611,7 @@ packages: '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 3.19.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15651,16 +15651,16 @@ packages: engines: {node: '>=14'} dev: false - /@wordpress/components/12.0.9_xskq4rpwld77646vdfceli5qtq: + /@wordpress/components/12.0.9_tymsfwxsfigcu46i7beagdrini: resolution: {integrity: sha512-J6uM20Jpchr/NywQmAeVqx/LohwKizi2F8HylqN1Xt2mYzuOrDirlEhQT1wmfqiEqEt0l+mefZEBlxeknMfBag==} dependencies: - '@babel/runtime': 7.17.7 - '@emotion/core': 10.3.1_react@16.14.0 + '@babel/runtime': 7.19.0 + '@emotion/core': 10.3.1_react@17.0.2 '@emotion/css': 10.0.27 - '@emotion/native': 10.0.27_peeplpcor766cv2dor4ihhuuki - '@emotion/styled': 10.3.0_qzeatvug73zaio2r3dlvejynye + '@emotion/native': 10.0.27_cs25t3dnf4q4hgs5y5gkeqxj6m + '@emotion/styled': 10.3.0_gfrer23gq2rp2t523t6qbxrx6m '@wordpress/a11y': 2.15.3 - '@wordpress/compose': 3.25.3_react@16.14.0 + '@wordpress/compose': 3.25.3_react@17.0.2 '@wordpress/date': 3.15.1 '@wordpress/deprecated': 2.12.3 '@wordpress/dom': 2.18.0 @@ -15671,27 +15671,27 @@ packages: '@wordpress/is-shallow-equal': 3.1.3 '@wordpress/keycodes': 2.19.3 '@wordpress/primitives': 1.12.3 - '@wordpress/rich-text': 3.25.3_react@16.14.0 + '@wordpress/rich-text': 3.25.3_react@17.0.2 '@wordpress/warning': 1.4.2 - '@wp-g2/components': 0.0.140_uk23rajygp47dvnd4kbkngbaoi - '@wp-g2/context': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi - '@wp-g2/styles': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi - '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise + '@wp-g2/components': 0.0.140_g7gpsdcw7mgpnynijiym6txcri + '@wp-g2/context': 0.0.140_6t4oliramvohoz25xwl6ezwdry + '@wp-g2/styles': 0.0.140_6t4oliramvohoz25xwl6ezwdry + '@wp-g2/utils': 0.0.140_hiunvzosbwliizyirxfy6hjyim classnames: 2.3.1 dom-scroll-into-view: 1.2.1 - downshift: 6.1.9_react@16.14.0 + downshift: 6.1.12_react@17.0.2 gradient-parser: 0.1.5 highlight-words-core: 1.2.2 lodash: 4.17.21 memize: 1.1.0 moment: 2.29.1 - re-resizable: 6.9.5_wdcame2n4eqmtj7c7r7wzweise - react-dates: 17.2.0_t7wigbjrq4ddrqvcj3sylvd3bi + re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m + react-dates: 17.2.0_doem77jvh4k7pyuvpbnkip467u react-merge-refs: 1.1.0 - react-resize-aware: 3.1.1_react@16.14.0 - react-spring: 8.0.27_wdcame2n4eqmtj7c7r7wzweise - react-use-gesture: 9.1.3_react@16.14.0 - reakit: 1.3.11_wdcame2n4eqmtj7c7r7wzweise + react-resize-aware: 3.1.1_react@17.0.2 + react-spring: 8.0.27_sfoxds7t5ydpegc3knd667wn6m + react-use-gesture: 9.1.3_react@17.0.2 + reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m rememo: 3.0.0 tinycolor2: 1.4.2 uuid: 8.3.2 @@ -15712,11 +15712,11 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@emotion/cache': 11.7.1 + '@emotion/cache': 11.10.5 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau - '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq + '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace '@emotion/utils': 1.0.0 '@floating-ui/react-dom': 0.6.3_hiunvzosbwliizyirxfy6hjyim '@use-gesture/react': 10.2.10_react@17.0.2 @@ -15725,7 +15725,7 @@ packages: '@wordpress/date': 4.19.0 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.19.0 '@wordpress/hooks': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15768,9 +15768,9 @@ packages: '@babel/runtime': 7.17.7 '@emotion/cache': 11.7.1 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_mcptgafjogap2nfvnfqvfwh6uu + '@emotion/react': 11.10.5_mcptgafjogap2nfvnfqvfwh6uu '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_lddnk6nv2rrayprsm6yu5n7lz4 + '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 '@wordpress/a11y': 3.4.1 @@ -15778,7 +15778,7 @@ packages: '@wordpress/date': 4.4.1 '@wordpress/deprecated': 3.4.1 '@wordpress/dom': 3.4.1 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.4.1 '@wordpress/hooks': 3.5.0 '@wordpress/i18n': 4.4.1 @@ -15822,9 +15822,9 @@ packages: '@babel/runtime': 7.17.7 '@emotion/cache': 11.7.1 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_mcptgafjogap2nfvnfqvfwh6uu + '@emotion/react': 11.10.5_mcptgafjogap2nfvnfqvfwh6uu '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_lddnk6nv2rrayprsm6yu5n7lz4 + '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 '@wordpress/a11y': 3.4.1 @@ -15832,7 +15832,7 @@ packages: '@wordpress/date': 4.4.1 '@wordpress/deprecated': 3.4.1 '@wordpress/dom': 3.4.1 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.4.1 '@wordpress/hooks': 3.5.0 '@wordpress/i18n': 4.4.1 @@ -15876,9 +15876,9 @@ packages: '@babel/runtime': 7.17.7 '@emotion/cache': 11.7.1 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau + '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq + '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 '@wordpress/a11y': 3.4.1 @@ -15886,7 +15886,7 @@ packages: '@wordpress/date': 4.4.1 '@wordpress/deprecated': 3.4.1 '@wordpress/dom': 3.4.1 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.4.1 '@wordpress/hooks': 3.5.0 '@wordpress/i18n': 4.4.1 @@ -15928,12 +15928,12 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@emotion/cache': 11.7.1 + '@emotion/cache': 11.10.5 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau - '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq - '@emotion/utils': 1.1.0 + '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace + '@emotion/utils': 1.2.0 '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m '@use-gesture/react': 10.2.10_react@17.0.2 '@wordpress/a11y': 3.19.0 @@ -15941,7 +15941,7 @@ packages: '@wordpress/date': 4.19.0 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.19.0 '@wordpress/hooks': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -15982,12 +15982,12 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@emotion/cache': 11.7.1 + '@emotion/cache': 11.10.5 '@emotion/css': 11.7.1_@babel+core@7.17.8 - '@emotion/react': 11.8.2_lvgioobbs7lf3pr6y4xfpughau - '@emotion/serialize': 1.0.2 - '@emotion/styled': 11.8.1_336qi3gvxoqj6dyikirbxktxtq - '@emotion/utils': 1.1.0 + '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace + '@emotion/utils': 1.2.0 '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m '@use-gesture/react': 10.2.10_react@17.0.2 '@wordpress/a11y': 3.19.0 @@ -15995,7 +15995,7 @@ packages: '@wordpress/date': 4.19.0 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.19.0 '@wordpress/hooks': 3.19.0 '@wordpress/i18n': 4.19.0 @@ -16053,6 +16053,7 @@ packages: use-memo-one: 1.1.2_react@16.14.0 transitivePeerDependencies: - react + dev: true /@wordpress/compose/3.25.3_react@17.0.2: resolution: {integrity: sha512-tCO2EnJCkCH548OqA0uU8V1k/1skz2QwBlHs8ZQSpimqUS4OWWsAlndCEFe4U4vDTqFt2ow7tzAir+05Cw8MAg==} @@ -16084,7 +16085,7 @@ packages: '@types/mousetrap': 1.6.9 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/keycodes': 3.19.0 '@wordpress/priority-queue': 2.16.0 @@ -16105,7 +16106,7 @@ packages: '@types/mousetrap': 1.6.9 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/keycodes': 3.19.0 '@wordpress/priority-queue': 2.19.0 @@ -16126,7 +16127,7 @@ packages: '@types/mousetrap': 1.6.9 '@wordpress/deprecated': 3.19.0 '@wordpress/dom': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/keycodes': 3.19.0 '@wordpress/priority-queue': 2.4.1 @@ -16145,11 +16146,11 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.17.7 - '@wordpress/api-fetch': 6.1.1 + '@wordpress/api-fetch': 6.16.0 '@wordpress/blocks': 11.3.1_react@17.0.2 '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/deprecated': 3.4.1 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/html-entities': 3.4.1 '@wordpress/i18n': 4.4.1 '@wordpress/is-shallow-equal': 4.4.1 @@ -16174,7 +16175,7 @@ packages: '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/html-entities': 3.19.0 '@wordpress/i18n': 4.19.0 '@wordpress/is-shallow-equal': 4.19.0 @@ -16198,29 +16199,16 @@ packages: webpack: 5.70.0_webpack-cli@4.9.2 dev: true - /@wordpress/data-controls/1.21.3_3lfrqxmbuwi67co5eklk724ov4: - resolution: {integrity: sha512-aLpx/HvKaxCQfWSLGIz699SB9Guyq8Yoq5XLlH8eNWnf/8HkQg8hQ6yagDY8BinV/t8HScc5A7a6n6pvZNGtjg==} - dependencies: - '@babel/runtime': 7.17.7 - '@wordpress/api-fetch': 4.0.0_react-native@0.70.0 - '@wordpress/data': 4.27.3_react@16.14.0 - '@wordpress/deprecated': 2.12.3 - transitivePeerDependencies: - - react - - react-native - dev: false - /@wordpress/data-controls/1.21.3_6mfjqmjzo7vxk4q6gjrwvpc2y4: resolution: {integrity: sha512-aLpx/HvKaxCQfWSLGIz699SB9Guyq8Yoq5XLlH8eNWnf/8HkQg8hQ6yagDY8BinV/t8HScc5A7a6n6pvZNGtjg==} dependencies: - '@babel/runtime': 7.19.0 + '@babel/runtime': 7.17.7 '@wordpress/api-fetch': 4.0.0_react-native@0.70.0 '@wordpress/data': 4.27.3_react@17.0.2 '@wordpress/deprecated': 2.12.3 transitivePeerDependencies: - react - react-native - dev: true /@wordpress/data-controls/2.10.0_react@17.0.2: resolution: {integrity: sha512-QbRLuEfwLyy/GVDHl7mzf/W6/hKMzCruggeR197JDOP7U3+HZXnbaZo7wb9YcdLKIyRNNwi4aNrFrgBgJAB72g==} @@ -16242,33 +16230,12 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.17.7 - '@wordpress/api-fetch': 6.1.1 + '@wordpress/api-fetch': 6.16.0 '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/deprecated': 3.4.1 react: 17.0.2 dev: false - /@wordpress/data/4.27.3_react@16.14.0: - resolution: {integrity: sha512-5763NgNV9IIa1CC3Q80dAvrH6108tJtj3IrHfUCZmUk1atSNsOMBCkLdQ7tGTTi2JFejeGEMg1LJI22JD5zM6Q==} - dependencies: - '@babel/runtime': 7.19.0 - '@wordpress/compose': 3.25.3_react@16.14.0 - '@wordpress/deprecated': 2.12.3 - '@wordpress/element': 2.20.3 - '@wordpress/is-shallow-equal': 3.1.3 - '@wordpress/priority-queue': 1.11.2 - '@wordpress/redux-routine': 3.14.2 - equivalent-key-map: 0.2.2 - is-promise: 4.0.0 - lodash: 4.17.21 - memize: 1.1.0 - redux: 4.2.0 - turbo-combine-reducers: 1.0.2 - use-memo-one: 1.1.2_react@16.14.0 - transitivePeerDependencies: - - react - dev: false - /@wordpress/data/4.27.3_react@17.0.2: resolution: {integrity: sha512-5763NgNV9IIa1CC3Q80dAvrH6108tJtj3IrHfUCZmUk1atSNsOMBCkLdQ7tGTTi2JFejeGEMg1LJI22JD5zM6Q==} dependencies: @@ -16288,7 +16255,6 @@ packages: use-memo-one: 1.1.2_react@17.0.2 transitivePeerDependencies: - react - dev: true /@wordpress/data/6.15.0_react@17.0.2: resolution: {integrity: sha512-EReq6QQ3ASWPcB60q18GLfDBhQQrf2Ru9Vvkid/tk7tn4ttqy/axn09/ck/GQ1uwi9BoSRyydPOnQCsluPAgNA==} @@ -16299,7 +16265,7 @@ packages: '@babel/runtime': 7.17.7 '@wordpress/compose': 5.14.0_react@17.0.2 '@wordpress/deprecated': 3.16.0 - '@wordpress/element': 4.14.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.16.0 '@wordpress/priority-queue': 2.16.0 '@wordpress/redux-routine': 4.16.0_redux@4.2.0 @@ -16321,7 +16287,7 @@ packages: '@babel/runtime': 7.19.0 '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/priority-queue': 2.4.1 '@wordpress/redux-routine': 4.4.1_redux@4.2.0 @@ -16343,7 +16309,7 @@ packages: '@babel/runtime': 7.19.0 '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/priority-queue': 2.19.0 '@wordpress/redux-routine': 4.19.0_redux@4.2.0 @@ -16573,27 +16539,14 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: true - /@wordpress/element/4.14.0: - resolution: {integrity: sha512-puH6E1sY5HYcU9MTnwpvwmlGqs0prxNd0JuT2/WcHAd/qwDC2wQPB/7fDaffjB0+gIYUt6WBl8kCWkqQ7g6cbQ==} - engines: {node: '>=12'} - dependencies: - '@babel/runtime': 7.19.0 - '@types/react': 17.0.50 - '@types/react-dom': 17.0.13 - '@wordpress/escape-html': 2.19.0 - change-case: 4.1.2 - is-plain-object: 5.0.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - - /@wordpress/element/4.17.0: - resolution: {integrity: sha512-ASOlR1XtsdO7Fr91FZvnzSgoRWqAq6DvbHpnncfreRW5NX50jTjmHq6fmKQP8ABSa+/hgMRvmzM4wGga6IsyGg==} + /@wordpress/element/4.20.0: + resolution: {integrity: sha512-Ou7EoGtGe4FUL6fKALINXJLKoSfyWTBJzkJfN2HzSgM1wira9EuWahl8MQN0HAUaWeOoDqMKPvnglfS+kC8JLA==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 '@types/react': 17.0.50 '@types/react-dom': 17.0.17 - '@wordpress/escape-html': 2.19.0 + '@wordpress/escape-html': 2.22.0 change-case: 4.1.2 is-plain-object: 5.0.0 react: 17.0.2 @@ -16605,11 +16558,12 @@ packages: dependencies: '@babel/runtime': 7.17.7 '@types/react': 17.0.50 - '@types/react-dom': 17.0.13 + '@types/react-dom': 17.0.17 '@wordpress/escape-html': 2.15.0 lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: false /@wordpress/env/4.9.0: resolution: {integrity: sha512-C2g5aOYxl1Bd9lypvEMjXZ1s1Gx/JHpFWuPlCAI8gAzwzB9jCIZkqpU85GsGScpZLAANS/N7wF3LMY68UkN9fQ==} @@ -16641,6 +16595,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 + dev: false /@wordpress/escape-html/2.19.0: resolution: {integrity: sha512-pBMuDDaV15SGXNu4cSu1pYiavkcx1rCBOuzGTSJ/WYLAC+K6PK+1lacPsPajVqnm2LLeKkNG4b9yn3PSZlbCww==} @@ -16648,6 +16603,12 @@ packages: dependencies: '@babel/runtime': 7.19.0 + /@wordpress/escape-html/2.22.0: + resolution: {integrity: sha512-GUo6VLugIZxen1rdYuotvz6Vqa+5fNtVelNjXLwDqRu0iY2RXeoTux9V5bZWXPnGb54ryqfYmR4gH6F8xZhWzQ==} + engines: {node: '>=12'} + dependencies: + '@babel/runtime': 7.19.0 + /@wordpress/escape-html/2.4.1: resolution: {integrity: sha512-iom52wT6VqUQUytnSvsOSJp3J/amKC55bTp4AQjGIhM6uLzpWD32n9ZDl8ntuNsck+v5llxehq9XKJZBZiCR+g==} engines: {node: '>=12'} @@ -16716,7 +16677,7 @@ packages: '@typescript-eslint/eslint-plugin': 5.43.0_hhpcbb6wqnhvo6wpcctutdxelq '@typescript-eslint/parser': 5.43.0_z4bbprzjrhnsfa24uvmcbu7f5q '@wordpress/babel-preset-default': 7.3.0 - '@wordpress/prettier-config': 2.2.0_prettier@2.3.0 + '@wordpress/prettier-config': 2.5.0_prettier@2.3.0 cosmiconfig: 7.0.1 eslint: 8.25.0 eslint-config-prettier: 8.5.0_eslint@8.25.0 @@ -16936,7 +16897,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.17.0 dev: false @@ -16945,7 +16906,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.3.0 dev: false @@ -16954,7 +16915,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.17.0 dev: false @@ -16963,7 +16924,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.17.0 /@wordpress/is-shallow-equal/3.1.3: @@ -17057,13 +17018,13 @@ packages: - supports-color dev: true - /@wordpress/jest-preset-default/7.1.3_kgfn5gxhgsc3jb23nkojlweryy: + /@wordpress/jest-preset-default/7.1.3_3kt4xu3sgkhoqdvxwcvxppk7nm: resolution: {integrity: sha512-rz9V/YRr3TjLdZJQu7DAZHo848PpZ4N5ThtP4Lujy1O/UtcvtKF0r34SZTNDlFQO/G1USZQX/WL6HRhgl57iHA==} engines: {node: '>=12'} peerDependencies: jest: '>=26' dependencies: - '@wojtekmaj/enzyme-adapter-react-17': 0.6.6_ik7hpot7mnfxczcz2kfmgakhdq + '@wojtekmaj/enzyme-adapter-react-17': 0.6.6_7ltvq4e2railvf5uya4ffxpe2a '@wordpress/jest-console': 4.1.1_jest@26.6.3 babel-jest: 26.6.3_@babel+core@7.17.8 enzyme: 3.11.0 @@ -17125,7 +17086,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 '@wordpress/data': 7.3.0_react@17.0.2 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/keycodes': 3.19.0 react: 17.0.2 rememo: 4.0.0 @@ -17160,9 +17121,9 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/api-fetch': 6.12.0 + '@wordpress/api-fetch': 6.16.0 '@wordpress/blob': 3.15.0 - '@wordpress/element': 4.14.0 + '@wordpress/element': 4.20.0 '@wordpress/i18n': 4.15.0 dev: false @@ -17216,7 +17177,7 @@ packages: dependencies: '@babel/runtime': 7.17.7 '@wordpress/compose': 5.2.1_react@17.0.2 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 '@wordpress/hooks': 3.5.0 '@wordpress/icons': 8.1.0 lodash: 4.17.21 @@ -17276,8 +17237,8 @@ packages: engines: {node: '>=12'} dev: true - /@wordpress/prettier-config/2.2.0_prettier@2.3.0: - resolution: {integrity: sha512-PdljwMrrjYxhS7JUVThJ+lZTdRKrWaSRDSX6bqMzO++jI3a+egPR0ZDgbH0TwcvlmGTB0V9YNCqKpMmGGPRDjw==} + /@wordpress/prettier-config/2.5.0_prettier@2.3.0: + resolution: {integrity: sha512-YI7CwUScwFW3N6PCH6IH2tvnfgkhAYEnYDOJ30JG2P0E3vXG6lnvrdVpQyKlEsGqUDy3FBcTPIP/m3/SHpp6Iw==} engines: {node: '>=14'} peerDependencies: prettier: '>=2' @@ -17285,6 +17246,15 @@ packages: prettier: 2.3.0 dev: false + /@wordpress/prettier-config/2.5.0_wp-prettier@2.6.2: + resolution: {integrity: sha512-YI7CwUScwFW3N6PCH6IH2tvnfgkhAYEnYDOJ30JG2P0E3vXG6lnvrdVpQyKlEsGqUDy3FBcTPIP/m3/SHpp6Iw==} + engines: {node: '>=14'} + peerDependencies: + prettier: '>=2' + dependencies: + prettier: /wp-prettier/2.6.2 + dev: true + /@wordpress/primitives/1.12.3: resolution: {integrity: sha512-LIF44bVlJS7CJEVmk6TLuV6HZMdj5iwkyM8do4ukGY6qnZIzrXpBablgJeDBcyjzWrWRLn+w+tiZ/8l+2egoVA==} dependencies: @@ -17298,7 +17268,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 classnames: 2.3.1 /@wordpress/primitives/3.2.1: @@ -17306,7 +17276,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/element': 4.8.0 + '@wordpress/element': 4.20.0 classnames: 2.3.1 dev: false @@ -17315,7 +17285,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 classnames: 2.3.1 dev: false @@ -17324,7 +17294,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 classnames: 2.3.1 dev: false @@ -17358,7 +17328,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/i18n': 4.19.0 utility-types: 3.10.0 dev: false @@ -17421,7 +17391,7 @@ packages: '@wordpress/components': 21.2.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/core-data': 5.2.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/i18n': 4.19.0 '@wordpress/icons': 9.10.0 '@wordpress/notices': 3.19.0_react@17.0.2 @@ -17438,12 +17408,12 @@ packages: - vite dev: false - /@wordpress/rich-text/3.25.3_react@16.14.0: + /@wordpress/rich-text/3.25.3_react@17.0.2: resolution: {integrity: sha512-FdqL1/rHTsRxZ1gW1UEWuy0URmUEqMzj5hcAbOhHFPO5m0ENrkzC9bBa195KqZBSNSmBmXnDZdHu4UJUolzcZg==} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 3.25.3_react@16.14.0 - '@wordpress/data': 4.27.3_react@16.14.0 + '@wordpress/compose': 3.25.3_react@17.0.2 + '@wordpress/data': 4.27.3_react@17.0.2 '@wordpress/dom': 2.18.0 '@wordpress/element': 2.20.3 '@wordpress/escape-html': 1.12.2 @@ -17468,7 +17438,7 @@ packages: '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.19.0 '@wordpress/i18n': 4.19.0 '@wordpress/keycodes': 3.19.0 @@ -17486,7 +17456,7 @@ packages: '@wordpress/a11y': 3.19.0 '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 6.15.0_react@17.0.2 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.19.0 '@wordpress/i18n': 4.19.0 '@wordpress/keycodes': 3.19.0 @@ -17562,7 +17532,7 @@ packages: - webpack-command dev: true - /@wordpress/scripts/19.2.4_n2e5qpfnvmhjuka25cq4kn6xqu: + /@wordpress/scripts/19.2.4_acp5qrdj4cc6vmqqhp4stdanfe: resolution: {integrity: sha512-klkfjBOPfr/RT/3Tvmx+gLbZ+dxq5L0dJQHCHxEURMRW/A8SfJJPtmC29L9sE1KhO3zUMWxrkn2L6HhSzbvQbA==} engines: {node: '>=12.13', npm: '>=6.9'} hasBin: true @@ -17572,7 +17542,7 @@ packages: '@wordpress/browserslist-config': 4.1.2 '@wordpress/dependency-extraction-webpack-plugin': 3.4.1_webpack@5.70.0 '@wordpress/eslint-plugin': 9.3.0_gvdiv7jt74qfcmw4bmvrh4kane - '@wordpress/jest-preset-default': 7.1.3_kgfn5gxhgsc3jb23nkojlweryy + '@wordpress/jest-preset-default': 7.1.3_3kt4xu3sgkhoqdvxwcvxppk7nm '@wordpress/npm-package-json-lint-config': 4.2.0_ngbyqqcq5j4itme2ewj5k5pf2y '@wordpress/postcss-plugins-preset': 3.10.0_postcss@8.4.12 '@wordpress/prettier-config': 1.1.3 @@ -17660,7 +17630,7 @@ packages: '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 7.3.0_react@17.0.2 '@wordpress/deprecated': 3.19.0 - '@wordpress/element': 4.17.0 + '@wordpress/element': 4.20.0 '@wordpress/i18n': 4.19.0 '@wordpress/url': 3.20.0 lodash: 4.17.21 @@ -17813,7 +17783,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 - /@wp-g2/components/0.0.140_uk23rajygp47dvnd4kbkngbaoi: + /@wp-g2/components/0.0.140_g7gpsdcw7mgpnynijiym6txcri: resolution: {integrity: sha512-bychuhZ3wPSB457CHYcogoPQPlP/eUA9GoTo0Fv0rj7f44Gr9XlPoqVT+GQa3CmPnvSCAl1sjoe75Vkaoo/O1w==} peerDependencies: '@wordpress/i18n': '>=3.17.0' @@ -17824,46 +17794,46 @@ packages: '@popperjs/core': 2.11.4 '@wordpress/i18n': 3.20.0 '@wordpress/icons': 2.10.3 - '@wp-g2/context': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi - '@wp-g2/styles': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi - '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise + '@wp-g2/context': 0.0.140_6t4oliramvohoz25xwl6ezwdry + '@wp-g2/styles': 0.0.140_6t4oliramvohoz25xwl6ezwdry + '@wp-g2/utils': 0.0.140_hiunvzosbwliizyirxfy6hjyim csstype: 3.1.1 - downshift: 6.1.12_react@16.14.0 - framer-motion: 2.9.5_wdcame2n4eqmtj7c7r7wzweise + downshift: 6.1.12_react@17.0.2 + framer-motion: 2.9.5_sfoxds7t5ydpegc3knd667wn6m highlight-words-core: 1.2.2 history: 4.10.1 lodash: 4.17.21 path-to-regexp: 1.8.0 - react: 16.14.0 - react-colorful: 4.4.4_wdcame2n4eqmtj7c7r7wzweise - react-dom: 17.0.0-rc.3_react@16.14.0 - react-textarea-autosize: 8.3.3_react@16.14.0 - react-use-gesture: 9.1.3_react@16.14.0 - reakit: 1.1.0_wdcame2n4eqmtj7c7r7wzweise + react: 17.0.2 + react-colorful: 4.4.4_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + react-textarea-autosize: 8.3.3_pxzommwrsowkd4kgag6q3sluym + react-use-gesture: 9.1.3_react@17.0.2 + reakit: 1.1.0_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - '@types/react' - '@wordpress/data' - '@wordpress/is-shallow-equal' dev: false - /@wp-g2/context/0.0.140_lnjyjqhbidocvrkn4aqhnph4yi: + /@wp-g2/context/0.0.140_6t4oliramvohoz25xwl6ezwdry: resolution: {integrity: sha512-z32fxZ2tCVmYQC+wyyziyrhEvWBPFBQfUhUHF85JmTUPzQQeEPiLC3rgDAT0fUTFlJHinPJQq6871RDqFSwCUA==} peerDependencies: react: ^16.13.1 react-dom: ^16.13.1 dependencies: - '@wp-g2/styles': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi - '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise + '@wp-g2/styles': 0.0.140_6t4oliramvohoz25xwl6ezwdry + '@wp-g2/utils': 0.0.140_hiunvzosbwliizyirxfy6hjyim lodash: 4.17.21 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 transitivePeerDependencies: - '@types/react' - '@wordpress/data' - '@wordpress/is-shallow-equal' dev: false - /@wp-g2/create-styles/0.0.140_lnjyjqhbidocvrkn4aqhnph4yi: + /@wp-g2/create-styles/0.0.140_6t4oliramvohoz25xwl6ezwdry: resolution: {integrity: sha512-/60DxWjCAhsoYOqY7aiHVbkTAF+L6qZIyHyH50oNs9FTVkcRLHQFSC0kHgAam+Z9K3eImQ7hM52wfBDqae0q2Q==} peerDependencies: '@wordpress/data': '>=4.26' @@ -17871,41 +17841,41 @@ packages: react: ^16.13.1 react-dom: ^16.13.1 dependencies: - '@emotion/core': 10.3.1_react@16.14.0 + '@emotion/core': 10.3.1_react@17.0.2 '@emotion/is-prop-valid': 0.8.8 - '@wordpress/data': 4.27.3_react@16.14.0 + '@wordpress/data': 4.27.3_react@17.0.2 '@wordpress/is-shallow-equal': 3.1.3 - '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise + '@wp-g2/utils': 0.0.140_hiunvzosbwliizyirxfy6hjyim create-emotion: 10.0.27 emotion: 10.0.27 - emotion-theming: 10.3.0_qzeatvug73zaio2r3dlvejynye + emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m lodash: 4.17.21 mitt: 2.1.0 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 rtlcss: 2.6.2 styled-griddie: 0.1.3 transitivePeerDependencies: - '@types/react' dev: false - /@wp-g2/styles/0.0.140_lnjyjqhbidocvrkn4aqhnph4yi: + /@wp-g2/styles/0.0.140_6t4oliramvohoz25xwl6ezwdry: resolution: {integrity: sha512-wAvtqQOqX2zYpfEdVK4l4abH/hUUgw/+8+E5PvPgrsvqFg8IehNSksnjNF5/IloLRGAH70d8ytjMuMnUK8PVYA==} peerDependencies: react: ^16.13.1 react-dom: ^16.13.1 dependencies: - '@wp-g2/create-styles': 0.0.140_lnjyjqhbidocvrkn4aqhnph4yi - '@wp-g2/utils': 0.0.140_wdcame2n4eqmtj7c7r7wzweise - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + '@wp-g2/create-styles': 0.0.140_6t4oliramvohoz25xwl6ezwdry + '@wp-g2/utils': 0.0.140_hiunvzosbwliizyirxfy6hjyim + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 transitivePeerDependencies: - '@types/react' - '@wordpress/data' - '@wordpress/is-shallow-equal' dev: false - /@wp-g2/utils/0.0.140_wdcame2n4eqmtj7c7r7wzweise: + /@wp-g2/utils/0.0.140_hiunvzosbwliizyirxfy6hjyim: resolution: {integrity: sha512-a4uYi/XQEDrOAIO3JUQ+L/oeSkgp+08pSy41xxQ1nIRHs7X+Du84X2EFQrvZfGBRuXuVlVuUIlN2e0IE8yUZKw==} peerDependencies: react: ^16.13.1 @@ -17919,14 +17889,14 @@ packages: json2mq: 0.2.0 lodash: 4.17.21 memize: 1.1.0 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 react-merge-refs: 1.1.0 - react-resize-aware: 3.1.1_react@16.14.0 - reakit-warning: 0.5.5_wdcame2n4eqmtj7c7r7wzweise + react-resize-aware: 3.1.1_react@17.0.2 + reakit-warning: 0.5.5_sfoxds7t5ydpegc3knd667wn6m tinycolor2: 1.4.2 - use-enhanced-state: 0.0.13_react@16.14.0 - use-isomorphic-layout-effect: 1.1.1_react@16.14.0 + use-enhanced-state: 0.0.13_react@17.0.2 + use-isomorphic-layout-effect: 1.1.1_pxzommwrsowkd4kgag6q3sluym transitivePeerDependencies: - '@types/react' dev: false @@ -18132,23 +18102,6 @@ packages: symbol.prototype.description: 1.0.5 dev: true - /airbnb-prop-types/2.16.0_react@16.14.0: - resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} - peerDependencies: - react: ^0.14 || ^15.0.0 || ^16.0.0-alpha - dependencies: - array.prototype.find: 2.1.2 - function.prototype.name: 1.1.5 - is-regex: 1.1.4 - object-is: 1.1.5 - object.assign: 4.1.4 - object.entries: 1.1.5 - prop-types: 15.8.1 - prop-types-exact: 1.2.0 - react: 16.14.0 - react-is: 16.13.1 - dev: false - /airbnb-prop-types/2.16.0_react@17.0.2: resolution: {integrity: sha512-7WHOFolP/6cS96PhKNrslCLMYAI8yB1Pp6u6XmxozQOiZbsI5ycglZr5cHhBFfuRcQQjzCMith5ZPZdYiJCxUg==} peerDependencies: @@ -19122,7 +19075,6 @@ packages: '@babel/runtime': 7.19.0 cosmiconfig: 7.0.1 resolve: 1.20.0 - dev: true /babel-plugin-named-asset-import/0.3.8_@babel+core@7.17.8: resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} @@ -19137,7 +19089,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.19.3 '@babel/core': 7.12.9 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.12.9 semver: 6.3.0 @@ -19150,7 +19102,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.19.3 '@babel/core': 7.16.12 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.16.12 semver: 6.3.0 @@ -19238,7 +19190,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.12.9 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 transitivePeerDependencies: - supports-color dev: true @@ -19250,7 +19202,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-define-polyfill-provider': 0.3.1_@babel+core@7.16.12 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 transitivePeerDependencies: - supports-color dev: false @@ -19336,7 +19288,7 @@ packages: dev: true /babel-plugin-syntax-jsx/6.18.0: - resolution: {integrity: sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=} + resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==} /babel-plugin-syntax-trailing-function-commas/7.0.0-beta.0: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} @@ -21542,7 +21494,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.0 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /css-loader/5.2.7_webpack@5.70.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} @@ -22512,19 +22464,6 @@ packages: engines: {node: '>=10'} dev: true - /downshift/6.1.12_react@16.14.0: - resolution: {integrity: sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==} - peerDependencies: - react: '>=16.12.0' - dependencies: - '@babel/runtime': 7.19.0 - compute-scroll-into-view: 1.0.17 - prop-types: 15.8.1 - react: 16.14.0 - react-is: 17.0.2 - tslib: 2.3.1 - dev: false - /downshift/6.1.12_react@17.0.2: resolution: {integrity: sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA==} peerDependencies: @@ -22550,19 +22489,6 @@ packages: tslib: 2.3.1 dev: false - /downshift/6.1.9_react@16.14.0: - resolution: {integrity: sha512-mzvk61WOX4MEsYHMKCXEVwuz/zM84x/WrCbaCQw71hyNN0fmWXvV673uOQy2idgIA+yqDsjtkV5KPfAFWuQylg==} - peerDependencies: - react: '>=16.12.0' - dependencies: - '@babel/runtime': 7.19.0 - compute-scroll-into-view: 1.0.17 - prop-types: 15.8.1 - react: 16.14.0 - react-is: 17.0.2 - tslib: 2.3.1 - dev: false - /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -22672,20 +22598,6 @@ packages: '@emotion/weak-memoize': 0.2.5 hoist-non-react-statics: 3.3.2 react: 17.0.2 - dev: true - - /emotion-theming/10.3.0_qzeatvug73zaio2r3dlvejynye: - resolution: {integrity: sha512-mXiD2Oj7N9b6+h/dC6oLf9hwxbtKHQjoIqtodEyL8CpkN4F3V4IK/BT4D0C7zSs4BBFOu4UlPJbvvBLa88SGEA==} - peerDependencies: - '@emotion/core': ^10.0.27 - react: '>=16.3.0' - dependencies: - '@babel/runtime': 7.19.0 - '@emotion/core': 10.3.1_react@16.14.0 - '@emotion/weak-memoize': 0.2.5 - hoist-non-react-statics: 3.3.2 - react: 16.14.0 - dev: false /emotion/10.0.27: resolution: {integrity: sha512-2xdDzdWWzue8R8lu4G76uWX5WhyQuzATon9LmNeCy/2BHVC6dsEpfhN1a0qhELgtDVdjyEA6J8Y/VlI5ZnaH0g==} @@ -23240,7 +23152,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -23271,7 +23183,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -23302,7 +23214,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -25411,7 +25323,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 @@ -25422,7 +25334,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.8.4 webpack: 5.70.0 @@ -25442,7 +25354,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 @@ -25454,7 +25366,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0_webpack-cli@3.3.12 @@ -25506,7 +25418,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 @@ -25517,7 +25429,7 @@ packages: memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0 @@ -25589,7 +25501,7 @@ packages: dependencies: map-cache: 0.2.2 - /framer-motion/2.9.5_wdcame2n4eqmtj7c7r7wzweise: + /framer-motion/2.9.5_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-epSX4Co1YbDv0mjfHouuY0q361TpHE7WQzCp/xMTilxy4kXd+Z23uJzPVorfzbm1a/9q1Yu8T5bndaw65NI4Tg==} peerDependencies: react: '>=16.8' @@ -25598,8 +25510,8 @@ packages: framesync: 4.1.0 hey-listen: 1.0.8 popmotion: 9.0.0-rc.20 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 style-value-types: 3.2.0 tslib: 1.14.1 optionalDependencies: @@ -32342,6 +32254,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -35496,17 +35409,6 @@ packages: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - /re-resizable/6.9.5_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-Q4+K8gOPbUBmbJCa0qfoVXBGnCwkAJrZ9KUca4GDn5FmxyV2HtLrBz7u43uUOb0y7xKbwcfuftweiOCIDEiCQA==} - peerDependencies: - react: ^16.13.1 || ^17.0.0 - react-dom: ^16.13.1 || ^17.0.0 - dependencies: - fast-memoize: 2.5.2 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - dev: false - /react-addons-create-fragment/15.6.2: resolution: {integrity: sha1-o5TefCx77Na1R1uhuXrEcs58dPg=} dependencies: @@ -35533,14 +35435,14 @@ packages: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - /react-colorful/4.4.4_wdcame2n4eqmtj7c7r7wzweise: + /react-colorful/4.4.4_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-01V2/6rr6sa1vaZntWZJXZxnU7ew02NG2rqq0eoVp4d3gFU5Ug9lDzNMbr+8ns0byXsJbBR8LbwQTlAjz6x7Kg==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 dev: false /react-colorful/5.5.1_prpqlkd37azqwypxturxi7uyci: @@ -35616,33 +35518,6 @@ packages: - react-with-direction dev: false - /react-dates/17.2.0_t7wigbjrq4ddrqvcj3sylvd3bi: - resolution: {integrity: sha512-RDlerU8DdRRrlYS0MQ7Z9igPWABGLDwz6+ykBNff67RM3Sset2TDqeuOr+R5o00Ggn5U47GeLsGcSDxlZd9cHw==} - peerDependencies: - moment: ^2.18.1 - react: ^0.14 || ^15.5.4 || ^16.1.1 - react-dom: ^0.14 || ^15.5.4 || ^16.1.1 - dependencies: - airbnb-prop-types: 2.16.0_react@16.14.0 - consolidated-events: 2.0.2 - is-touch-device: 1.0.1 - lodash: 4.17.21 - moment: 2.29.1 - object.assign: 4.1.4 - object.values: 1.1.5 - prop-types: 15.8.1 - react: 16.14.0 - react-addons-shallow-compare: 15.6.3 - react-dom: 17.0.0-rc.3_react@16.14.0 - react-moment-proptypes: 1.8.1_moment@2.29.1 - react-outside-click-handler: 1.3.0_wdcame2n4eqmtj7c7r7wzweise - react-portal: 4.2.1_wdcame2n4eqmtj7c7r7wzweise - react-with-styles: 3.2.3_wunono5fri6mu4ojuug6cyhj7m - react-with-styles-interface-css: 4.0.3_react-with-styles@3.2.3 - transitivePeerDependencies: - - react-with-direction - dev: false - /react-dates/21.8.0_3e2zt6dsmku6uyxszuwububhzi: resolution: {integrity: sha512-PPriGqi30CtzZmoHiGdhlA++YPYPYGCZrhydYmXXQ6RAvAsaONcPtYgXRTLozIOrsQ5mSo40+DiA5eOFHnZ6xw==} peerDependencies: @@ -35761,16 +35636,6 @@ packages: react: 17.0.2 scheduler: 0.19.1 - /react-dom/17.0.0-rc.3_react@16.14.0: - resolution: {integrity: sha512-rrmZ91kdXBaCVomiNUQ1WvEClb5GcmxewGurd3FnsXKJBOhFdlkGbT5MY5ZQkMXH5xnIvs5ZEEB2iBr2ZqKiqg==} - peerDependencies: - react: 17.0.0-rc.3 - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react: 16.14.0 - scheduler: 0.20.0-rc.3 - /react-dom/17.0.2_react@17.0.2: resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} peerDependencies: @@ -35932,10 +35797,10 @@ packages: peerDependencies: react-native: '*' dependencies: - react-native: 0.70.0_kb6wpw22f5rcob6qxj2uco6yqa + react-native: 0.70.0_j7uotthv7togybeij4kylbfq2y whatwg-url-without-unicode: 8.0.0-3 - /react-native/0.70.0_kb6wpw22f5rcob6qxj2uco6yqa: + /react-native/0.70.0_j7uotthv7togybeij4kylbfq2y: resolution: {integrity: sha512-QjXLbrK9f+/B2eCzn6kAvglLV/8nwPuFGaFv7ggPpAzFRyx5bVN1dwQLHL3MrP7iXR/M7Jc6Nnid7tmRSic6vA==} engines: {node: '>=14'} hasBin: true @@ -35963,16 +35828,16 @@ packages: nullthrows: 1.1.1 pretty-format: 26.6.2 promise: 8.2.0 - react: 16.14.0 + react: 17.0.2 react-devtools-core: 4.24.0 react-native-codegen: 0.70.4_@babel+preset-env@7.19.3 react-native-gradle-plugin: 0.70.2 react-refresh: 0.4.3 - react-shallow-renderer: 16.15.0_react@16.14.0 + react-shallow-renderer: 16.15.0_react@17.0.2 regenerator-runtime: 0.13.9 scheduler: 0.22.0 stacktrace-parser: 0.1.10 - use-sync-external-store: 1.2.0_react@16.14.0 + use-sync-external-store: 1.2.0_react@17.0.2 whatwg-fetch: 3.6.2 ws: 6.2.2 transitivePeerDependencies: @@ -36013,21 +35878,6 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false - /react-outside-click-handler/1.3.0_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-Te/7zFU0oHpAnctl//pP3hEAeobfeHMyygHB8MnjP6sX5OR8KHT1G3jmLsV3U9RnIYo+Yn+peJYWu+D5tUS8qQ==} - peerDependencies: - react: ^0.14 || >=15 - react-dom: ^0.14 || >=15 - dependencies: - airbnb-prop-types: 2.16.0_react@16.14.0 - consolidated-events: 2.0.2 - document.contains: 1.0.2 - object.values: 1.1.5 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - dev: false - /react-popper-tooltip/3.1.1_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-EnERAnnKRptQBJyaee5GJScWNUKQPDD2ywvzZyUjst/wj5U64C8/CnSYLNEmP2hG0IJ3ZhtDxE8oDN+KOyavXQ==} peerDependencies: @@ -36074,17 +35924,6 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false - /react-portal/4.2.1_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-fE9kOBagwmTXZ3YGRYb4gcMy+kSA+yLO0xnPankjRlfBv4uCpFXqKPfkpsGQQR15wkZ9EssnvTOl1yMzbkxhPQ==} - peerDependencies: - react: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 - react-dom: ^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0 - dependencies: - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - dev: false - /react-query/3.39.1_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-qYKT1bavdDiQZbngWZyPotlBVzcBjDYEJg5RQLBa++5Ix5jjfbEYJmHSZRZD+USVHUSvl/ey9Hu+QfF1QAK80A==} peerDependencies: @@ -36119,6 +35958,7 @@ packages: react: ^16.8.0 || 17.x dependencies: react: 16.14.0 + dev: true /react-resize-aware/3.1.1_react@17.0.2: resolution: {integrity: sha512-M8IyVLBN8D6tEUss+bxQlWte3ZYtNEGhg7rBxtCVG8yEBjUlZwUo5EFLq6tnvTZXcgAbCLjsQn+NCoTJKumRYg==} @@ -36199,16 +36039,6 @@ packages: react-transition-group: 4.4.2_sfoxds7t5ydpegc3knd667wn6m dev: true - /react-shallow-renderer/16.14.1_react@16.14.0: - resolution: {integrity: sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 - dependencies: - object-assign: 4.1.1 - react: 16.14.0 - react-is: 17.0.2 - dev: true - /react-shallow-renderer/16.14.1_react@17.0.2: resolution: {integrity: sha512-rkIMcQi01/+kxiTE9D3fdS959U1g7gs+/rborw++42m1O9FAQiNI/UNRZExVUoAOprn4umcXf+pFRou8i4zuBg==} peerDependencies: @@ -36218,13 +36048,13 @@ packages: react: 17.0.2 react-is: 17.0.2 - /react-shallow-renderer/16.15.0_react@16.14.0: + /react-shallow-renderer/16.15.0_react@17.0.2: resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 dependencies: object-assign: 4.1.1 - react: 16.14.0 + react: 17.0.2 react-is: 17.0.2 /react-sizeme/3.0.2: @@ -36236,7 +36066,7 @@ packages: throttle-debounce: 3.0.1 dev: true - /react-spring/8.0.27_wdcame2n4eqmtj7c7r7wzweise: + /react-spring/8.0.27_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-nDpWBe3ZVezukNRandTeLSPcwwTMjNVu1IDq9qA/AMiUqHuRN4BeSWvKr3eIxxg1vtiYiOLy4FqdfCP5IoP77g==} peerDependencies: react: '>= 16.8.0' @@ -36244,8 +36074,8 @@ packages: dependencies: '@babel/runtime': 7.19.0 prop-types: 15.8.1 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 dev: false /react-syntax-highlighter/13.5.3_react@17.0.2: @@ -36273,18 +36103,6 @@ packages: scheduler: 0.19.1 dev: true - /react-test-renderer/17.0.2_react@16.14.0: - resolution: {integrity: sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==} - peerDependencies: - react: 17.0.2 - dependencies: - object-assign: 4.1.1 - react: 16.14.0 - react-is: 17.0.2 - react-shallow-renderer: 16.14.1_react@16.14.0 - scheduler: 0.20.2 - dev: true - /react-test-renderer/17.0.2_react@17.0.2: resolution: {integrity: sha512-yaQ9cB89c17PUb0x6UfWRs7kQCorVdHlutU1boVPEsB8IDZH6n9tHxMacc3y0JoXOJUsZb/t/Mb8FUWMKaM7iQ==} peerDependencies: @@ -36308,21 +36126,6 @@ packages: use-latest: 1.2.0_pxzommwrsowkd4kgag6q3sluym transitivePeerDependencies: - '@types/react' - dev: true - - /react-textarea-autosize/8.3.3_react@16.14.0: - resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} - engines: {node: '>=10'} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - dependencies: - '@babel/runtime': 7.19.0 - react: 16.14.0 - use-composed-ref: 1.2.1_react@16.14.0 - use-latest: 1.2.0_react@16.14.0 - transitivePeerDependencies: - - '@types/react' - dev: false /react-textarea-autosize/8.3.3_react@17.0.2: resolution: {integrity: sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==} @@ -36351,13 +36154,13 @@ packages: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - /react-use-gesture/9.1.3_react@16.14.0: + /react-use-gesture/9.1.3_react@17.0.2: resolution: {integrity: sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg==} deprecated: This package is no longer maintained. Please use @use-gesture/react instead peerDependencies: react: '>= 16.8.0' dependencies: - react: 16.14.0 + react: 17.0.2 dev: false /react-visibility-sensor/5.1.1_sfoxds7t5ydpegc3knd667wn6m: @@ -36389,24 +36192,6 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false - /react-with-direction/1.4.0_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==} - peerDependencies: - react: ^0.14 || ^15 || ^16 - react-dom: ^0.14 || ^15 || ^16 - dependencies: - airbnb-prop-types: 2.16.0_react@16.14.0 - brcast: 2.0.2 - deepmerge: 1.5.2 - direction: 1.0.4 - hoist-non-react-statics: 3.3.2 - object.assign: 4.1.4 - object.values: 1.1.5 - prop-types: 15.8.1 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - dev: false - /react-with-styles-interface-css/4.0.3_react-with-styles@3.2.3: resolution: {integrity: sha512-wE43PIyjal2dexxyyx4Lhbcb+E42amoYPnkunRZkb9WTA+Z+9LagbyxwsI352NqMdFmghR0opg29dzDO4/YXbw==} peerDependencies: @@ -36414,7 +36199,7 @@ packages: dependencies: array.prototype.flat: 1.2.5 global-cache: 1.2.1 - react-with-styles: 3.2.3_wunono5fri6mu4ojuug6cyhj7m + react-with-styles: 3.2.3_f6ta4w4ch5ogxra4gx65xzrqki dev: false /react-with-styles-interface-css/6.0.0_sjrqpgd5uboanyy2xkv2xcu6vm: @@ -36454,19 +36239,6 @@ packages: react-with-direction: 1.4.0_sfoxds7t5ydpegc3knd667wn6m dev: false - /react-with-styles/3.2.3_wunono5fri6mu4ojuug6cyhj7m: - resolution: {integrity: sha512-MTI1UOvMHABRLj5M4WpODfwnveHaip6X7QUMI2x6zovinJiBXxzhA9AJP7MZNaKqg1JRFtHPXZdroUC8KcXwlQ==} - peerDependencies: - react: '>=0.14' - react-with-direction: ^1.1.0 - dependencies: - hoist-non-react-statics: 3.3.2 - object.assign: 4.1.4 - prop-types: 15.8.1 - react: 16.14.0 - react-with-direction: 1.4.0_wdcame2n4eqmtj7c7r7wzweise - dev: false - /react-with-styles/4.2.0_tzgwoaxjvs23ve2qhnwxwqxt3e: resolution: {integrity: sha512-tZCTY27KriRNhwHIbg1NkSdTTOSfXDg6Z7s+Q37mtz0Ym7Sc7IOr3PzVt4qJhJMW6Nkvfi3g34FuhtiGAJCBQA==} peerDependencies: @@ -36654,15 +36426,15 @@ packages: /readline/1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} - /reakit-system/0.13.1_wdcame2n4eqmtj7c7r7wzweise: + /reakit-system/0.13.1_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-qglfQ53FsJh5+VSkjMtBg7eZiowj9zXOyfJJxfaXh/XYTVe/5ibzWg6rvGHyvSm6C3D7Q2sg/NPCLmCtYGGvQA==} peerDependencies: react: ^16.8.0 react-dom: ^16.8.0 dependencies: - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - reakit-utils: 0.13.1_wdcame2n4eqmtj7c7r7wzweise + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + reakit-utils: 0.13.1_sfoxds7t5ydpegc3knd667wn6m dev: false /reakit-system/0.15.2_prpqlkd37azqwypxturxi7uyci: @@ -36686,35 +36458,24 @@ packages: react-dom: 17.0.2_react@17.0.2 reakit-utils: 0.15.2_sfoxds7t5ydpegc3knd667wn6m - /reakit-system/0.15.2_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-TvRthEz0DmD0rcJkGamMYx+bATwnGNWJpe/lc8UV2Js8nnPvkaxrHk5fX9cVASFrWbaIyegZHCWUBfxr30bmmA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - reakit-utils: 0.15.2_wdcame2n4eqmtj7c7r7wzweise - dev: false - - /reakit-utils/0.13.1_wdcame2n4eqmtj7c7r7wzweise: + /reakit-utils/0.13.1_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-NBKgsot3tU91gZgK5MTInI/PR0T3kIsTmbU5MbGggSOcwU2dG/kbE8IrM2lC6ayCSL2W2QWkijT6kewdrIX7Gw==} peerDependencies: react: ^16.8.0 react-dom: ^16.8.0 dependencies: - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 dev: false - /reakit-utils/0.14.4_wdcame2n4eqmtj7c7r7wzweise: + /reakit-utils/0.14.4_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-jDEf/NmZVJ6fs10G16ifD+RFhQikSLN7VfjRHu0CPoUj4g6lFXd5PPcRXCY81qiqc9FVHjr2d2fmsw1hs6xUxA==} peerDependencies: react: ^16.8.0 react-dom: ^16.8.0 dependencies: - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 dev: false /reakit-utils/0.15.2_prpqlkd37azqwypxturxi7uyci: @@ -36736,34 +36497,24 @@ packages: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - /reakit-utils/0.15.2_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-i/RYkq+W6hvfFmXw5QW7zvfJJT/K8a4qZ0hjA79T61JAFPGt23DsfxwyBbyK91GZrJ9HMrXFVXWMovsKBc1qEQ==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - dev: false - - /reakit-warning/0.4.1_wdcame2n4eqmtj7c7r7wzweise: + /reakit-warning/0.4.1_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-AgnRN6cf8DYBF/mK2JEMFVL67Sbon8fDbFy1kfm0EDibtGsMOQtsFYfozZL7TwmJ4yg68VMhg8tmPHchVQRrlg==} peerDependencies: react: ^16.8.0 dependencies: - react: 16.14.0 - reakit-utils: 0.13.1_wdcame2n4eqmtj7c7r7wzweise + react: 17.0.2 + reakit-utils: 0.13.1_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react-dom dev: false - /reakit-warning/0.5.5_wdcame2n4eqmtj7c7r7wzweise: + /reakit-warning/0.5.5_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-OuP1r7rlSSJZsoLuc0CPA2ACPKnWO8HDbFktiiidbT67UjuX6udYV1AUsIgMJ8ado9K5gZGjPj7IB/GDYo9Yjg==} peerDependencies: react: ^16.8.0 dependencies: - react: 16.14.0 - reakit-utils: 0.14.4_wdcame2n4eqmtj7c7r7wzweise + react: 17.0.2 + reakit-utils: 0.14.4_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react-dom dev: false @@ -36789,18 +36540,7 @@ packages: transitivePeerDependencies: - react-dom - /reakit-warning/0.6.2_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-z/3fvuc46DJyD3nJAUOto6inz2EbSQTjvI/KBQDqxwB0y02HDyeP8IWOJxvkuAUGkWpeSx+H3QWQFSNiPcHtmw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - dependencies: - react: 16.14.0 - reakit-utils: 0.15.2_wdcame2n4eqmtj7c7r7wzweise - transitivePeerDependencies: - - react-dom - dev: false - - /reakit/1.1.0_wdcame2n4eqmtj7c7r7wzweise: + /reakit/1.1.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-d/ERtwgBndBPsyPBPUl5jueyfFgsglIfQCnLMKuxM0PaWiIZ6Ys3XsYaNy/AaG8k46Ee5cQPMdRrR30nVcSToQ==} peerDependencies: react: ^16.8.0 @@ -36808,11 +36548,11 @@ packages: dependencies: '@popperjs/core': 2.11.4 body-scroll-lock: 3.1.5 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - reakit-system: 0.13.1_wdcame2n4eqmtj7c7r7wzweise - reakit-utils: 0.13.1_wdcame2n4eqmtj7c7r7wzweise - reakit-warning: 0.4.1_wdcame2n4eqmtj7c7r7wzweise + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + reakit-system: 0.13.1_sfoxds7t5ydpegc3knd667wn6m + reakit-utils: 0.13.1_sfoxds7t5ydpegc3knd667wn6m + reakit-warning: 0.4.1_sfoxds7t5ydpegc3knd667wn6m dev: false /reakit/1.3.11_prpqlkd37azqwypxturxi7uyci: @@ -36844,21 +36584,6 @@ packages: reakit-utils: 0.15.2_sfoxds7t5ydpegc3knd667wn6m reakit-warning: 0.6.2_sfoxds7t5ydpegc3knd667wn6m - /reakit/1.3.11_wdcame2n4eqmtj7c7r7wzweise: - resolution: {integrity: sha512-mYxw2z0fsJNOQKAEn5FJCPTU3rcrY33YZ/HzoWqZX0G7FwySp1wkCYW79WhuYMNIUFQ8s3Baob1RtsEywmZSig==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - dependencies: - '@popperjs/core': 2.11.4 - body-scroll-lock: 3.1.5 - react: 16.14.0 - react-dom: 17.0.0-rc.3_react@16.14.0 - reakit-system: 0.15.2_wdcame2n4eqmtj7c7r7wzweise - reakit-utils: 0.15.2_wdcame2n4eqmtj7c7r7wzweise - reakit-warning: 0.6.2_wdcame2n4eqmtj7c7r7wzweise - dev: false - /realpath-native/1.1.0: resolution: {integrity: sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==} engines: {node: '>=4'} @@ -36917,7 +36642,7 @@ packages: '@babel/runtime': 7.19.0 /reflect.ownkeys/0.2.0: - resolution: {integrity: sha1-dJrO7H8/34tj+SegSAnpDFwLNGA=} + resolution: {integrity: sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==} /refractor/3.6.0: resolution: {integrity: sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==} @@ -37612,7 +37337,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 semver: 7.3.5 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /sass-loader/12.6.0_sass@1.49.9+webpack@5.70.0: resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} @@ -37700,12 +37425,6 @@ packages: loose-envify: 1.4.0 object-assign: 4.1.1 - /scheduler/0.20.0-rc.3: - resolution: {integrity: sha512-rPwhSgPKhRqximLHdl+oJ/8HVcMS2vyZlH74OQHqKbH04ONgKNkJ13DZLPdFSYFos8FUj6+PduO9+OoRaG6QWQ==} - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - /scheduler/0.20.2: resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} dependencies: @@ -39080,6 +38799,10 @@ packages: /stylis/4.0.13: resolution: {integrity: sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag==} + dev: false + + /stylis/4.1.3: + resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} /sudo-prompt/9.2.1: resolution: {integrity: sha512-Mu7R0g4ig9TUuGSxJavny5Rv0egCEtpZRNMrZaYS1vxkiIxGiGUwoezU3LazIQ+KE04hTrTfNPgxU5gzi7F5Pw==} @@ -39524,7 +39247,7 @@ packages: serialize-javascript: 6.0.0 source-map: 0.6.1 terser: 5.10.0_acorn@8.8.0 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 transitivePeerDependencies: - acorn @@ -40008,6 +39731,21 @@ packages: yargs-parser: 20.2.9 dev: true + /ts-loader/9.4.1_27qmdvvfdw5s3nqwnln6yerdsa: + resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.9.2 + micromatch: 4.0.4 + semver: 7.3.8 + typescript: 4.8.4 + webpack: 5.70.0_bgqcrdgdviybk52kjcpjat65sa + dev: true + /ts-node/10.9.1_66qcjwcvmucahiv4aiph345ggy: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true @@ -40804,21 +40542,12 @@ packages: querystring: 0.2.0 dev: true - /use-composed-ref/1.2.1_react@16.14.0: - resolution: {integrity: sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 - dependencies: - react: 16.14.0 - dev: false - /use-composed-ref/1.2.1_react@17.0.2: resolution: {integrity: sha512-6+X1FLlIcjvFMAeAD/hcxDT8tmyrWnbSPMU0EnxQuDLIxokuFzWliXBiYZuGIx+mrAMLBw0WFfCkaPw8ebzAhw==} peerDependencies: react: ^16.8.0 || ^17.0.0 dependencies: react: 17.0.2 - dev: true /use-debounce/3.4.3_react@17.0.2: resolution: {integrity: sha512-nxy+opOxDccWfhMl36J5BSCTpvcj89iaQk2OZWLAtBJQj7ISCtx1gh+rFbdjGfMl6vtCZf6gke/kYvrkVfHMoA==} @@ -40828,13 +40557,13 @@ packages: react: 17.0.2 dev: false - /use-enhanced-state/0.0.13_react@16.14.0: + /use-enhanced-state/0.0.13_react@17.0.2: resolution: {integrity: sha512-RCtUQdhfUXu/0GAQqLnKPetUt3BheYFpOTogppHe9x1XGwluiu6DQLKVNnc3yMfj0HM3IOVBgw5nVJJuZS5TWQ==} peerDependencies: react: ^16.8.0 dependencies: '@itsjonq/is': 0.0.2 - react: 16.14.0 + react: 17.0.2 tiny-warning: 1.0.3 dev: false @@ -40850,18 +40579,6 @@ packages: '@types/react': 17.0.50 react: 17.0.2 - /use-isomorphic-layout-effect/1.1.1_react@16.14.0: - resolution: {integrity: sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - react: 16.14.0 - dev: false - /use-isomorphic-layout-effect/1.1.1_react@17.0.2: resolution: {integrity: sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==} peerDependencies: @@ -40886,20 +40603,6 @@ packages: '@types/react': 17.0.50 react: 17.0.2 use-isomorphic-layout-effect: 1.1.1_pxzommwrsowkd4kgag6q3sluym - dev: true - - /use-latest/1.2.0_react@16.14.0: - resolution: {integrity: sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==} - peerDependencies: - '@types/react': '*' - react: ^16.8.0 || ^17.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - react: 16.14.0 - use-isomorphic-layout-effect: 1.1.1_react@16.14.0 - dev: false /use-latest/1.2.0_react@17.0.2: resolution: {integrity: sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==} @@ -40930,6 +40633,7 @@ packages: react: ^16.8.0 || ^17.0.0 dependencies: react: 16.14.0 + dev: true /use-memo-one/1.1.2_react@17.0.2: resolution: {integrity: sha512-u2qFKtxLsia/r8qG0ZKkbytbztzRb317XCkT7yP8wxL0tZ/CzK2G+WWie5vWvpyeP7+YoPIwbJoIHJ4Ba4k0oQ==} @@ -40953,20 +40657,12 @@ packages: dependencies: react: 17.0.2 - /use-sync-external-store/1.2.0_react@16.14.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - dependencies: - react: 16.14.0 - /use-sync-external-store/1.2.0_react@17.0.2: resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 dependencies: react: 17.0.2 - dev: false /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} From f16cfbc9d6f8784151ebc19a966c6c596807f6fc Mon Sep 17 00:00:00 2001 From: louwie17 Date: Wed, 30 Nov 2022 04:05:11 -0400 Subject: [PATCH 0142/1680] Add open on focus to attribute fields (#35758) * Add experimental open menu on focus to attribute input fields * Add changelog --- .../fields/attribute-input-field/attribute-input-field.tsx | 1 + .../attribute-term-input-field/attribute-term-input-field.tsx | 1 + .../changelog/add-35576_open_on_focus_to_attribute_fields | 4 ++++ 3 files changed, 6 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-35576_open_on_focus_to_attribute_fields diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx index bb4f7683dde..7f19b7cdff1 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-input-field/attribute-input-field.tsx @@ -124,6 +124,7 @@ export const AttributeInputField: React.FC< AttributeInputFieldProps > = ( { ); } } onRemove={ () => onChange() } + __experimentalOpenMenuOnFocus > { ( { items: renderItems, diff --git a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx index 32fdc11d0d0..0fa9ab8470a 100644 --- a/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx +++ b/plugins/woocommerce-admin/client/products/fields/attribute-term-input-field/attribute-term-input-field.tsx @@ -188,6 +188,7 @@ export const AttributeTermInputField: React.FC< 'woocommerce-attribute-term-field ' + attributeTermInputId.current } + __experimentalOpenMenuOnFocus > { ( { items, diff --git a/plugins/woocommerce/changelog/add-35576_open_on_focus_to_attribute_fields b/plugins/woocommerce/changelog/add-35576_open_on_focus_to_attribute_fields new file mode 100644 index 00000000000..f28b462b041 --- /dev/null +++ b/plugins/woocommerce/changelog/add-35576_open_on_focus_to_attribute_fields @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Add experimental open menu on focus option to the attribute and attribute term input fields. From 716d5ab322b55b439d6bb6ee3d1c23cc45ba251b Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Wed, 30 Nov 2022 09:00:14 -0300 Subject: [PATCH 0143/1680] Move file picker by clicking card into the MediaUploader component (#35738) * Fix `MediaUploader` component * Fix storybook * Fix image section * Add changelogs * Fix code comment * Fix text Co-authored-by: Fernando Marichal --- ...v-35714_move_file_picker_to_media_uploader | 4 + .../src/media-uploader/media-uploader.tsx | 87 +++++++---- .../src/media-uploader/stories/index.tsx | 29 +++- .../products/sections/images-section.tsx | 136 ++++++------------ ...v-35714_move_file_picker_to_media_uploader | 4 + 5 files changed, 143 insertions(+), 117 deletions(-) create mode 100644 packages/js/components/changelog/dev-35714_move_file_picker_to_media_uploader create mode 100644 plugins/woocommerce/changelog/dev-35714_move_file_picker_to_media_uploader diff --git a/packages/js/components/changelog/dev-35714_move_file_picker_to_media_uploader b/packages/js/components/changelog/dev-35714_move_file_picker_to_media_uploader new file mode 100644 index 00000000000..62cf00b1a9d --- /dev/null +++ b/packages/js/components/changelog/dev-35714_move_file_picker_to_media_uploader @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Move file picker by clicking card into the MediaUploader component diff --git a/packages/js/components/src/media-uploader/media-uploader.tsx b/packages/js/components/src/media-uploader/media-uploader.tsx index c04534e50db..54bdb924821 100644 --- a/packages/js/components/src/media-uploader/media-uploader.tsx +++ b/packages/js/components/src/media-uploader/media-uploader.tsx @@ -2,7 +2,7 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; -import { Button, DropZone } from '@wordpress/components'; +import { Button, DropZone, FormFileUpload } from '@wordpress/components'; import { createElement } from 'react'; import { MediaItem, @@ -32,6 +32,7 @@ type MediaUploaderProps = { file: File; } ) => void; onUpload?: ( files: MediaItem[] ) => void; + onFileUploadChange?: ( files: MediaItem[] ) => void; uploadMedia?: ( options: UploadMediaOptions ) => Promise< void >; }; @@ -43,36 +44,74 @@ export const MediaUploader = ( { maxUploadFileSize = 10000000, MediaUploadComponent = MediaUpload, onError = () => null, + onFileUploadChange = () => null, onUpload = () => null, onSelect = () => null, uploadMedia = wpUploadMedia, }: MediaUploaderProps ) => { + const getFormFileUploadAcceptedFiles = () => + allowedMediaTypes.map( ( type ) => `${ type }/*` ); + return ( -
    -
    { label }
    + { + uploadMedia( { + filesList: currentTarget.files as FileList, + onError, + onFileChange: onFileUploadChange, + maxUploadFileSize, + } ); + } } + render={ ( { openFileDialog } ) => ( +
    {} } + tabIndex={ 0 } + role="button" + onClick={ ( + event: React.MouseEvent< HTMLDivElement, MouseEvent > + ) => { + const { target } = event; + if ( + ( target as HTMLButtonElement )?.type !== 'button' + ) { + openFileDialog(); + } + } } + onBlur={ () => {} } + > +
    +
    + { label } +
    - ( - - ) } - /> + ( + + ) } + /> - { hasDropZone && ( - - uploadMedia( { - filesList: files, - onError, - onFileChange: onUpload, - maxUploadFileSize, - } ) - } - /> + { hasDropZone && ( + + uploadMedia( { + filesList: files, + onError, + onFileChange: onUpload, + maxUploadFileSize, + } ) + } + /> + ) } +
    +
    ) } -
    + /> ); }; diff --git a/packages/js/components/src/media-uploader/stories/index.tsx b/packages/js/components/src/media-uploader/stories/index.tsx index 05f7ae230bf..373a1aeb7f5 100644 --- a/packages/js/components/src/media-uploader/stories/index.tsx +++ b/packages/js/components/src/media-uploader/stories/index.tsx @@ -17,7 +17,7 @@ declare let Blob: { new (): Blob; }; -export const MockMediaUpload = ( { onSelect, render } ) => { +const MockMediaUpload = ( { onSelect, render } ) => { const [ isOpen, setOpen ] = useState( false ); return ( @@ -28,7 +28,10 @@ export const MockMediaUpload = ( { onSelect, render } ) => { { isOpen && ( setOpen( false ) } + onRequestClose={ ( event ) => { + setOpen( false ); + event.stopPropagation(); + } } >

    Use the default built-in{ ' ' } @@ -39,12 +42,13 @@ export const MockMediaUpload = ( { onSelect, render } ) => { return ( + - +

    diff --git a/plugins/woocommerce/includes/class-wc-ajax.php b/plugins/woocommerce/includes/class-wc-ajax.php index a3567584f5e..f81f25d564c 100644 --- a/plugins/woocommerce/includes/class-wc-ajax.php +++ b/plugins/woocommerce/includes/class-wc-ajax.php @@ -133,6 +133,7 @@ class WC_AJAX { 'add_new_attribute', 'remove_variations', 'save_attributes', + 'add_attributes_and_variations', 'add_variation', 'link_all_variations', 'revoke_access_to_download', @@ -677,14 +678,7 @@ class WC_AJAX { try { parse_str( wp_unslash( $_POST['data'] ), $data ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized - $attributes = WC_Meta_Box_Product_Data::prepare_attributes( $data ); - $product_id = absint( wp_unslash( $_POST['post_id'] ) ); - $product_type = ! empty( $_POST['product_type'] ) ? wc_clean( wp_unslash( $_POST['product_type'] ) ) : 'simple'; - $classname = WC_Product_Factory::get_product_classname( $product_id, $product_type ); - $product = new $classname( $product_id ); - - $product->set_attributes( $attributes ); - $product->save(); + $product = self::create_product_with_attributes( $data ); ob_start(); $attributes = $product->get_attributes( 'edit' ); @@ -716,6 +710,65 @@ class WC_AJAX { wp_send_json_success( $response ); } + /** + * Save attributes and variations via ajax. + */ + public static function add_attributes_and_variations() { + check_ajax_referer( 'add-attributes-and-variations', 'security' ); + + if ( ! current_user_can( 'edit_products' ) || ! isset( $_POST['data'], $_POST['post_id'] ) ) { + wp_die( -1 ); + } + + try { + parse_str( wp_unslash( $_POST['data'] ), $data ); // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized + + $product = self::create_product_with_attributes( $data ); + self::create_all_product_variations( $product ); + + wp_send_json_success(); + wp_die(); + + } catch ( Exception $e ) { + wp_send_json_error( array( 'error' => $e->getMessage() ) ); + } + } + /** + * Create product with attributes from POST data. + * + * @param array $data Attribute data. + * @return mixed Product class. + */ + private static function create_product_with_attributes( $data ) { + // phpcs:disable WordPress.Security.NonceVerification.Missing + if ( ! isset( $_POST['post_id'] ) ) { + wp_die( -1 ); + } + $attributes = WC_Meta_Box_Product_Data::prepare_attributes( $data ); + $product_id = absint( wp_unslash( $_POST['post_id'] ) ); + $product_type = ! empty( $_POST['product_type'] ) ? wc_clean( wp_unslash( $_POST['product_type'] ) ) : 'simple'; + $classname = WC_Product_Factory::get_product_classname( $product_id, $product_type ); + $product = new $classname( $product_id ); + $product->set_attributes( $attributes ); + $product->save(); + return $product; + } + /** + * Create all product variations from existing attributes. + * + * @param mixed $product Product class. + * @returns int Number of variations created. + */ + private static function create_all_product_variations( $product ) { + $data_store = $product->get_data_store(); + if ( ! is_callable( array( $data_store, 'create_all_product_variations' ) ) ) { + wp_die(); + } + $number = $data_store->create_all_product_variations( $product, Constants::get_constant( 'WC_MAX_LINKED_VARIATIONS' ) ); + $data_store->sort_all_product_variations( $product->get_id() ); + return $number; + } + /** * Add variation via ajax function. */ @@ -761,16 +814,11 @@ class WC_AJAX { wp_die(); } - $product = wc_get_product( $post_id ); - $data_store = $product->get_data_store(); + $product = wc_get_product( $post_id ); + $number_created = self::create_all_product_variations( $product ); - if ( ! is_callable( array( $data_store, 'create_all_product_variations' ) ) ) { - wp_die(); - } + echo esc_html( $number_created ); - echo esc_html( $data_store->create_all_product_variations( $product, Constants::get_constant( 'WC_MAX_LINKED_VARIATIONS' ) ) ); - - $data_store->sort_all_product_variations( $product->get_id() ); wp_die(); } From 185b8ae252344f52eefec104dbcfa2b274f02c2b Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 1 Mar 2023 17:43:36 +0530 Subject: [PATCH 0890/1680] Use common method to mark HPOS tests as skipped. --- .../legacy/framework/class-wc-unit-test-case.php | 12 ++++++++++++ .../admin/class-wc-tests-admin-dashboard.php | 10 ++-------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php b/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php index a7f00cb42e7..488cea9e120 100644 --- a/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php +++ b/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php @@ -7,6 +7,7 @@ use Automattic\WooCommerce\Proxies\LegacyProxy; use Automattic\WooCommerce\Testing\Tools\CodeHacking\CodeHacker; +use Automattic\WooCommerce\Utilities\OrderUtil; use PHPUnit\Framework\Constraint\IsType; /** @@ -388,4 +389,15 @@ class WC_Unit_Test_Case extends WP_HTTP_TestCase { $events = self::get_tracks_events( $event_name ); $this->assertEmpty( $events ); } + + /** + * Mark test skipped when HPOS is enabled. + * + * @param string $message Message to display when test is skipped. + */ + protected function skip_if_hpos_enabled( $message ) { + if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { + $this->markTestSkipped( $message ); + } + } } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php b/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php index 46d3d9972f2..535869c41b0 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php @@ -5,8 +5,6 @@ * @package WooCommerce\Tests\Admin */ -use Automattic\WooCommerce\Utilities\OrderUtil; - /** * Tests for the WC_Admin_Report class. */ @@ -39,9 +37,7 @@ class WC_Tests_Admin_Dashboard extends WC_Unit_Test_Case { * Test: get_status_widget */ public function test_status_widget() { - if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { - $this->markTestSkipped( 'We don\'t support legacy reports in HPOS.' ); - } + $this->skip_if_hpos_enabled( 'We don\'t support legacy reports on HPOS' ); wp_set_current_user( $this->user ); $order = WC_Helper_Order::create_order(); $order->set_status( 'completed' ); @@ -63,9 +59,7 @@ class WC_Tests_Admin_Dashboard extends WC_Unit_Test_Case { * Test: get_status_widget with woo admin disabled. */ public function test_status_widget_with_woo_admin_disabled() { - if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { - $this->markTestSkipped( 'We don\'t support legacy reports in HPOS.' ); - } + $this->skip_if_hpos_enabled( 'We don\'t support legacy reports on HPOS' ); wp_set_current_user( $this->user ); $order = WC_Helper_Order::create_order(); $order->set_status( 'completed' ); From 25497c4faaa182210bfc1f4e001be1fb1cc4d32b Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Wed, 1 Mar 2023 11:56:49 -0300 Subject: [PATCH 0891/1680] Add existing global attribute layout (#36944) * Changed `has_local_attributes` * Add new layout * Add attribute layout * Add changelog * Create method `toggle_add_global_attribute_layout` * Add global attribute layout * Fix button in mobile * Remove commented code * Change changelog * Fix typo * Fix style * Fix buttons visibility * Fix div visibility * Fix buttons visibility --------- Co-authored-by: Fernando Marichal --- .../images/icons/global-attributes-icon.svg | 8 ++ .../add-36661_existing_attribute_layout | 4 + .../woocommerce/client/legacy/css/admin.scss | 29 ++++++- .../legacy/js/admin/meta-boxes-product.js | 28 ++++++- .../includes/admin/class-wc-admin-assets.php | 2 +- .../views/html-product-data-attributes.php | 82 +++++++++++++------ 6 files changed, 122 insertions(+), 31 deletions(-) create mode 100644 plugins/woocommerce/assets/images/icons/global-attributes-icon.svg create mode 100644 plugins/woocommerce/changelog/add-36661_existing_attribute_layout diff --git a/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg b/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg new file mode 100644 index 00000000000..bbb5d8122d7 --- /dev/null +++ b/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/woocommerce/changelog/add-36661_existing_attribute_layout b/plugins/woocommerce/changelog/add-36661_existing_attribute_layout new file mode 100644 index 00000000000..7ea6d84a2e2 --- /dev/null +++ b/plugins/woocommerce/changelog/add-36661_existing_attribute_layout @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Add existing global attribute layout #36944 diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index 212770b53d0..8e07798ded9 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -1012,6 +1012,31 @@ } #product_attributes { + .add-global-attribute-container { + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 32px 0px; + gap: 24px; + height: 360px; + @media screen and ( max-width: 782px ) { + button { + vertical-align: top; + } + } + p { + width: 90%; + max-width: 544px; + font-size: 14px; + line-height: 18px; + text-align: center; + } + &.hidden { + display: none; + } + } .toolbar-top { .button, .select2-container { @@ -5384,8 +5409,10 @@ img.help_tip { .toolbar { margin: 0 !important; border-top: 1px solid white; - border-bottom: 1px solid #eee; padding: 9px 12px !important; + &:not( .expand-close-hidden ) { + border-bottom: 1px solid #eee; + } &:first-child { border-top: 0; diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js index 994b45618b9..754bbedd6b7 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js @@ -58,7 +58,7 @@ jQuery( function ( $ ) { } ); $( function () { - if ( ! woocommerce_admin_meta_boxes.has_attributes ) { + if ( ! woocommerce_admin_meta_boxes.has_local_attributes ) { $( 'button.add_attribute' ).trigger( 'click' ); } } ); @@ -434,6 +434,12 @@ jQuery( function ( $ ) { selectedAttributes ); + function toggle_add_global_attribute_layout() { + $( 'div.add-attribute-container' ).toggle(); + $( 'div.add-global-attribute-container' ).toggle(); + $( '#product_attributes > .toolbar-buttons' ).toggle(); + } + function add_attribute( element, attribute ) { var size = $( '.product_attributes .woocommerce_attribute' ).length; var $wrapper = $( element ).closest( '#product_attributes' ); @@ -499,6 +505,12 @@ jQuery( function ( $ ) { } $( this ).val( null ); $( this ).trigger( 'change' ); + if ( + $( 'div.add-attribute-container' ).hasClass( 'hidden' ) && + ! $( 'div.add-global-attribute-container' ).hasClass( 'hidden' ) + ) { + toggle_add_global_attribute_layout(); + } return false; } ); @@ -522,6 +534,12 @@ jQuery( function ( $ ) { $( 'button.add_custom_attribute' ).on( 'click', function () { add_attribute( this, '' ); + if ( + $( 'div.add-attribute-container' ).hasClass( 'hidden' ) && + ! $( 'div.add-global-attribute-container' ).hasClass( 'hidden' ) + ) { + toggle_add_global_attribute_layout(); + } return false; } ); @@ -571,7 +589,6 @@ jQuery( function ( $ ) { term.term_id + '"]' ); - console.log( currentItem ); if ( currentItem && currentItem.length > 0 ) { currentItem.prop( 'selected', 'selected' ); } else { @@ -634,6 +651,13 @@ jQuery( function ( $ ) { $parent.hide(); attribute_row_indexes(); } + + if ( + ! $( '.woocommerce_attribute_data' ).is( ':visible' ) && + ! $( 'div.add-global-attribute-container' ).hasClass( 'hidden' ) + ) { + toggle_add_global_attribute_layout(); + } } return false; } ); diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index c71d7196353..1b6f454ea8f 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -405,7 +405,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : 'rounding_precision' => wc_get_rounding_precision(), 'tax_rounding_mode' => wc_get_tax_rounding_mode(), 'product_types' => array_unique( array_merge( array( 'simple', 'grouped', 'variable', 'external' ), array_keys( wc_get_product_types() ) ) ), - 'has_attributes' => ! empty( wc_get_attribute_taxonomies() ) || ! empty( $product ? $product->get_attributes( 'edit' ) : array() ), + 'has_local_attributes' => ! empty( wc_get_attribute_taxonomies() ), 'i18n_download_permission_fail' => __( 'Could not grant access - the user may already have permission for this file or billing email is not set. Ensure the billing email is set, and the order has been saved.', 'woocommerce' ), 'i18n_permission_revoke' => __( 'Are you sure you want to revoke access to this download?', 'woocommerce' ), 'i18n_tax_rate_already_exists' => __( 'You cannot add the same tax rate twice!', 'woocommerce' ), diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php index bf84ef7e988..d40339ffdd4 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php @@ -1,19 +1,46 @@ get_attributes( 'edit' ); +$has_local_attributes = empty( $attribute_taxonomies ); +$has_global_attributes = empty( $product_attributes ); +$is_add_global_attribute_visible = ! $has_local_attributes && $has_global_attributes; +$icon_url = WC_ADMIN_IMAGES_FOLDER_URL . '/icons/global-attributes-icon.svg'; ?>
    + + + + + + + + + + + + + + +
    VersionRelease
    Release Candidate + <%= rcReleaseDate.toLocaleDateString('en-US', { month: + 'long', day: 'numeric', year: 'numeric' }) %> +
    Final Release + <%= finalReleaseDate.toLocaleDateString('en-US', { month: + 'long', day: 'numeric', year: 'numeric' }) %> +
    + + + + +

    Testing

    + + + +

    + If you'd like to dive in and help test this new release, our handy WooCommerce Beta Tester plugin allows you to switch between beta versions and release candidates. + You can also download the release from WordPress.org. +

    + + + +

    + A set of testing instructions has been published on our Wiki page in GitHub. We've also posted a helpful writeup on beta testing to help get you started. +

    + + + +

    + If you discover any bugs during the testing process, please let us know + by logging a report in GitHub. +

    + + + +

    + diff --git a/tools/release-posts/tsconfig.json b/tools/release-posts/tsconfig.json index b49d71cfb0a..0b425cd5c54 100644 --- a/tools/release-posts/tsconfig.json +++ b/tools/release-posts/tsconfig.json @@ -1,7 +1,10 @@ { - "extends": "@tsconfig/node16/tsconfig.json", - "ts-node": { - "transpileOnly": true, - "files": true, - } + "extends": "@tsconfig/node16/tsconfig.json", + "compilerOptions": { + "module": "Node16" + }, + "ts-node": { + "transpileOnly": true, + "files": true + } } From 5ed070d78a840fa18e7e89384fc8bdf3e827ee6e Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 16 Mar 2023 14:46:38 -0700 Subject: [PATCH 1063/1680] Add tests around product block editor tabs (#37225) * Add tests around tabs * Add changelog entry * Fix up frozen lock file * Fix up frozen lock file * Fix up lock file after rebase --- .../product-editor/changelog/add-37096-tests | 4 + .../src/components/tab/edit.tsx | 2 +- .../src/components/tabs/test/tabs.spec.tsx | 160 ++ pnpm-lock.yaml | 2361 +++++++---------- 4 files changed, 1141 insertions(+), 1386 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37096-tests create mode 100644 packages/js/product-editor/src/components/tabs/test/tabs.spec.tsx diff --git a/packages/js/product-editor/changelog/add-37096-tests b/packages/js/product-editor/changelog/add-37096-tests new file mode 100644 index 00000000000..a95e829ad3d --- /dev/null +++ b/packages/js/product-editor/changelog/add-37096-tests @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add tests around product block editor tabs diff --git a/packages/js/product-editor/src/components/tab/edit.tsx b/packages/js/product-editor/src/components/tab/edit.tsx index a7bf3586b55..226dbd92ea8 100644 --- a/packages/js/product-editor/src/components/tab/edit.tsx +++ b/packages/js/product-editor/src/components/tab/edit.tsx @@ -17,7 +17,7 @@ export function Edit( { }: { attributes: BlockAttributes; context?: { - selectedTab?: string; + selectedTab?: string | null; }; } ) { const blockProps = useBlockProps(); diff --git a/packages/js/product-editor/src/components/tabs/test/tabs.spec.tsx b/packages/js/product-editor/src/components/tabs/test/tabs.spec.tsx new file mode 100644 index 00000000000..615f50cc46a --- /dev/null +++ b/packages/js/product-editor/src/components/tabs/test/tabs.spec.tsx @@ -0,0 +1,160 @@ +/** + * External dependencies + */ +import { render, fireEvent } from '@testing-library/react'; +import { getQuery, navigateTo } from '@woocommerce/navigation'; +import React, { createElement } from 'react'; +import { SlotFillProvider } from '@wordpress/components'; +import { useState } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { Tabs } from '../'; +import { Edit as Tab } from '../../tab/edit'; + +jest.mock( '@wordpress/block-editor', () => ( { + ...jest.requireActual( '@wordpress/block-editor' ), + useBlockProps: jest.fn(), +} ) ); + +jest.mock( '@woocommerce/navigation', () => ( { + ...jest.requireActual( '@woocommerce/navigation' ), + navigateTo: jest.fn(), + getQuery: jest.fn().mockReturnValue( {} ), +} ) ); + +function MockTabs( { onChange = jest.fn() } ) { + const [ selected, setSelected ] = useState< string | null >( null ); + const mockContext = { + selectedTab: selected, + }; + + return ( + + { + setSelected( tabId ); + onChange( tabId ); + } } + /> + + + + + ); +} + +describe( 'Tabs', () => { + beforeEach( () => { + ( getQuery as jest.Mock ).mockReturnValue( { + tab: null, + } ); + } ); + + it( 'should render tab buttons added to the slot', () => { + const { queryByText } = render( ); + expect( queryByText( 'Test button 1' ) ).toBeInTheDocument(); + expect( queryByText( 'Test button 2' ) ).toBeInTheDocument(); + } ); + + it( 'should set the first tab as active initially', () => { + const { queryByText } = render( ); + expect( queryByText( 'Test button 1' ) ).toHaveAttribute( + 'aria-selected', + 'true' + ); + expect( queryByText( 'Test button 2' ) ).toHaveAttribute( + 'aria-selected', + 'false' + ); + } ); + + it( 'should navigate to a new URL when a tab is clicked', () => { + const { getByText } = render( ); + const button = getByText( 'Test button 2' ); + fireEvent.click( button ); + + expect( navigateTo ).toHaveBeenLastCalledWith( { + url: 'admin.php?page=wc-admin&tab=test2', + } ); + } ); + + it( 'should select the tab provided in the URL initially', () => { + ( getQuery as jest.Mock ).mockReturnValue( { + tab: 'test2', + } ); + + const { getByText } = render( ); + + expect( getByText( 'Test button 2' ) ).toHaveAttribute( + 'aria-selected', + 'true' + ); + } ); + + it( 'should select the tab provided on URL change', () => { + const { getByText, rerender } = render( ); + + ( getQuery as jest.Mock ).mockReturnValue( { + tab: 'test3', + } ); + + rerender( ); + + expect( getByText( 'Test button 3' ) ).toHaveAttribute( + 'aria-selected', + 'true' + ); + } ); + + it( 'should call the onChange props when changing', async () => { + const mockOnChange = jest.fn(); + const { rerender } = render( ); + + expect( mockOnChange ).toHaveBeenCalledWith( 'test1' ); + + ( getQuery as jest.Mock ).mockReturnValue( { + tab: 'test2', + } ); + + rerender( ); + + expect( mockOnChange ).toHaveBeenCalledWith( 'test2' ); + } ); + + it( 'should add a class to the initially selected tab panel', async () => { + const { getByRole } = render( ); + const panel1 = getByRole( 'tabpanel', { name: 'Test button 1' } ); + const panel2 = getByRole( 'tabpanel', { name: 'Test button 2' } ); + + expect( panel1.classList ).toContain( 'is-selected' ); + expect( panel2.classList ).not.toContain( 'is-selected' ); + } ); + + it( 'should add a class to the newly selected tab panel', async () => { + const { getByText, getByRole, rerender } = render( ); + const button = getByText( 'Test button 2' ); + fireEvent.click( button ); + const panel1 = getByRole( 'tabpanel', { name: 'Test button 1' } ); + const panel2 = getByRole( 'tabpanel', { name: 'Test button 2' } ); + + ( getQuery as jest.Mock ).mockReturnValue( { + tab: 'test2', + } ); + + rerender( ); + + expect( panel1.classList ).not.toContain( 'is-selected' ); + expect( panel2.classList ).toContain( 'is-selected' ); + } ); +} ); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c561616240f..cc2c32e5e75 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1835,7 +1835,7 @@ importers: '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 '@babel/runtime': 7.17.7 '@octokit/core': 3.5.1 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.10_vvsky5staxf7riqd5ia3sjvzsm + '@pmmmwh/react-refresh-webpack-plugin': 0.5.10_kgzwhhiezcyg2m3alqq7chac3a '@testing-library/dom': 8.11.3 '@testing-library/jest-dom': 5.16.2 '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m @@ -1944,8 +1944,8 @@ importers: url-loader: 1.1.2_webpack@5.70.0 webpack: 5.70.0_webpack-cli@4.9.2 webpack-bundle-analyzer: 3.9.0 - webpack-cli: 4.9.2_p2twkydmemoqwqiml4djllh5wi - webpack-dev-server: 4.11.1_jaxrlecucqtr54lmhmx67obzmy + webpack-cli: 4.9.2_ciq5cijsysjq5sik752b4nyq2m + webpack-dev-server: 4.12.0_jaxrlecucqtr54lmhmx67obzmy webpack-fix-style-only-entries: 0.6.1 webpack-merge: 5.8.0 webpack-rtl-plugin: 2.0.0 @@ -2674,6 +2674,7 @@ packages: /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} + dev: true /@babel/compat-data/7.19.3: resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} @@ -2816,6 +2817,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 + dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -2833,18 +2835,6 @@ packages: /@babel/helper-compilation-targets/7.16.3_@babel+core@7.12.9: 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.19.3 - '@babel/core': 7.12.9 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - semver: 6.3.0 - - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -2853,20 +2843,6 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.19.3 semver: 6.3.0 - dev: true - - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.19.3 - semver: 6.3.0 - dev: false /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} @@ -2918,42 +2894,6 @@ packages: browserslist: 4.21.4 semver: 6.3.0 - /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: - resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.16.12: - resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-member-expression-to-functions': 7.18.9 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -3158,6 +3098,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 + dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -3236,6 +3177,7 @@ packages: '@babel/types': 7.19.3 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} @@ -3373,26 +3315,6 @@ packages: dependencies: '@babel/types': 7.19.3 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} @@ -3403,6 +3325,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3412,30 +3354,6 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} @@ -3448,6 +3366,30 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + dev: false + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -3472,34 +3414,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.12.9: - resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.16.12: - resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} engines: {node: '>=6.9.0'} @@ -3528,6 +3442,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.16.12: + resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} engines: {node: '>=6.9.0'} @@ -3554,32 +3483,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} engines: {node: '>=6.9.0'} @@ -3604,6 +3507,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -3616,34 +3532,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: - resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.16.12: - resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} @@ -3658,6 +3546,34 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -3695,28 +3611,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} @@ -3728,6 +3622,28 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -3768,28 +3684,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} @@ -3801,6 +3695,28 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -3821,28 +3737,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} @@ -3854,6 +3748,28 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -3874,28 +3790,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} @@ -3907,6 +3801,28 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -3927,28 +3843,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} engines: {node: '>=6.9.0'} @@ -3969,6 +3863,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -3989,28 +3894,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} @@ -4022,6 +3905,28 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -4056,34 +3961,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.12.9 - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.12.9: - resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.16.12: - resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} engines: {node: '>=6.9.0'} @@ -4111,6 +3988,20 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} @@ -4134,28 +4025,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -4177,6 +4046,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -4198,30 +4078,6 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} engines: {node: '>=6.9.0'} @@ -4279,32 +4135,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.12.9: - resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.16.12: - resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.8: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} engines: {node: '>=6.9.0'} @@ -4318,6 +4148,32 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4330,36 +4186,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.16.7 - '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} engines: {node: '>=6.9.0'} @@ -4375,6 +4201,36 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4399,28 +4255,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} - engines: {node: '>=4'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -5016,26 +4850,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} engines: {node: '>=6.9.0'} @@ -5055,6 +4869,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -5077,34 +4901,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.12.9: - resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-remap-async-to-generator': 7.16.8 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.16.12: - resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-remap-async-to-generator': 7.16.8 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} engines: {node: '>=6.9.0'} @@ -5132,6 +4928,20 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -5154,26 +4964,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -5193,6 +4983,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -5211,26 +5011,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} engines: {node: '>=6.9.0'} @@ -5250,6 +5030,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -5276,44 +5066,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} engines: {node: '>=6.9.0'} @@ -5352,6 +5104,26 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-classes/7.19.0_@babel+core@7.16.12: + resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-classes/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} engines: {node: '>=6.9.0'} @@ -5380,26 +5152,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} engines: {node: '>=6.9.0'} @@ -5419,6 +5171,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -5437,26 +5199,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} @@ -5476,6 +5218,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.16.12: + resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.17.8: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -5495,28 +5247,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -5568,26 +5298,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} @@ -5598,6 +5308,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -5617,28 +5347,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -5660,6 +5368,17 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -5699,26 +5418,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} engines: {node: '>=6.9.0'} @@ -5738,6 +5437,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.16.12: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.17.8: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -5757,30 +5466,6 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -5804,6 +5489,18 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -5824,26 +5521,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} engines: {node: '>=6.9.0'} @@ -5863,6 +5540,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -5881,26 +5568,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -5920,6 +5587,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -5942,34 +5619,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} @@ -5984,6 +5633,34 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -6011,36 +5688,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.12.9: - resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.16.12: - resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} @@ -6069,6 +5716,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -6098,38 +5760,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.12.9: - resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.16.12: - resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} @@ -6146,6 +5776,38 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.12.9: + resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.16.12: + resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} engines: {node: '>=6.9.0'} @@ -6173,32 +5835,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} @@ -6212,6 +5848,32 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} @@ -6233,26 +5895,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.12.9: - resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - dev: true - - /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.16.12: - resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} engines: {node: '>=6.9.0'} @@ -6273,6 +5915,17 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.16.12: + resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} @@ -6292,26 +5945,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} @@ -6322,6 +5955,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -6343,32 +5996,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -6394,6 +6021,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -6415,26 +6055,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} engines: {node: '>=6.9.0'} @@ -6482,26 +6102,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -6521,6 +6121,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -6692,26 +6302,6 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - regenerator-transform: 0.14.5 - dev: true - - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - regenerator-transform: 0.14.5 - dev: false - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} engines: {node: '>=6.9.0'} @@ -6722,6 +6312,28 @@ packages: regenerator-transform: 0.14.5 dev: true + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + regenerator-transform: 0.15.0 + dev: true + + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + regenerator-transform: 0.15.0 + dev: false + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -6741,26 +6353,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} @@ -6771,6 +6363,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.12.9: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -6804,9 +6416,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@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.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -6821,9 +6433,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 @@ -6872,26 +6484,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} engines: {node: '>=6.9.0'} @@ -6911,6 +6503,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -6930,28 +6532,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: true - - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: false - /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} engines: {node: '>=6.9.0'} @@ -6973,6 +6553,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.16.12: + resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -6992,26 +6583,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -7031,6 +6602,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -7049,26 +6630,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} engines: {node: '>=6.9.0'} @@ -7088,6 +6649,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -7106,26 +6677,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} @@ -7136,6 +6687,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.12.9: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.16.12: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -7207,26 +6778,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} @@ -7237,6 +6788,26 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.12.9: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.16.12: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.17.8: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -7256,28 +6827,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.12.9: - resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.16.12: - resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -7299,6 +6848,17 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.16.12: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -7398,28 +6958,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.19.3 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.12.9 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.12.9 - '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.12.9 - '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.12.9 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 @@ -7434,44 +6994,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.9 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.12.9 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.12.9 - '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.12.9 - '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.12.9 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.17.0 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 + '@babel/types': 7.19.3 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 - core-js-compat: 3.21.1 + core-js-compat: 3.25.5 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7483,28 +7043,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.19.3 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.16.7 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.16.12 - '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.16.12 - '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.16.12 - '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.16.12 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.16.12 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.12 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 @@ -7519,44 +7079,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.12 - '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.16.12 - '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.16.12 - '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.16.12 - '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.16.12 - '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.16.12 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.16.12 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.16.12 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.16.12 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.16.12 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.16.12 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.17.0 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 + '@babel/types': 7.19.3 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 - core-js-compat: 3.21.1 + core-js-compat: 3.25.5 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7865,7 +7425,7 @@ packages: resolution: {integrity: sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==} engines: {node: '>=6.9.0'} dependencies: - core-js-pure: 3.19.1 + core-js-pure: 3.29.1 regenerator-runtime: 0.13.9 /@babel/runtime/7.17.7: @@ -9931,7 +9491,7 @@ packages: playwright-core: 1.30.0 dev: true - /@pmmmwh/react-refresh-webpack-plugin/0.5.10_vvsky5staxf7riqd5ia3sjvzsm: + /@pmmmwh/react-refresh-webpack-plugin/0.5.10_kgzwhhiezcyg2m3alqq7chac3a: resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==} engines: {node: '>= 10.13'} peerDependencies: @@ -9959,7 +9519,7 @@ packages: dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 - core-js-pure: 3.29.0 + core-js-pure: 3.29.1 error-stack-parser: 2.0.6 find-up: 5.0.0 html-entities: 2.3.2 @@ -9968,7 +9528,7 @@ packages: schema-utils: 3.1.1 source-map: 0.7.3 webpack: 5.70.0_webpack-cli@4.9.2 - webpack-dev-server: 4.11.1_jaxrlecucqtr54lmhmx67obzmy + webpack-dev-server: 4.12.0_jaxrlecucqtr54lmhmx67obzmy dev: true /@pmmmwh/react-refresh-webpack-plugin/0.5.1_a3gyllrqvxpec3fpybsrposvju: @@ -9999,11 +9559,11 @@ packages: dependencies: ansi-html-community: 0.0.8 common-path-prefix: 3.0.0 - core-js-pure: 3.19.1 + core-js-pure: 3.29.1 error-stack-parser: 2.0.6 find-up: 5.0.0 html-entities: 2.3.2 - loader-utils: 2.0.2 + loader-utils: 2.0.4 react-refresh: 0.11.0 schema-utils: 3.1.1 source-map: 0.7.3 @@ -12032,7 +11592,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0_webpack-cli@3.3.12 - ws: 8.12.1 + ws: 8.13.0 transitivePeerDependencies: - '@types/react' - acorn @@ -12109,7 +11669,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 - ws: 8.12.1 + ws: 8.13.0 transitivePeerDependencies: - '@types/react' - acorn @@ -12184,7 +11744,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0_webpack-cli@3.3.12 - ws: 8.12.1 + ws: 8.13.0 transitivePeerDependencies: - '@types/react' - acorn @@ -12259,7 +11819,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0_webpack-cli@3.3.12 - ws: 8.12.1 + ws: 8.13.0 transitivePeerDependencies: - '@types/react' - acorn @@ -12336,7 +11896,7 @@ packages: util-deprecate: 1.0.2 watchpack: 2.3.1 webpack: 4.46.0 - ws: 8.12.1 + ws: 8.13.0 transitivePeerDependencies: - '@types/react' - acorn @@ -13221,7 +12781,7 @@ packages: core-js: 3.21.1 estraverse: 5.3.0 global: 4.4.0 - loader-utils: 2.0.2 + loader-utils: 2.0.4 lodash: 4.17.21 prettier: 2.3.0 react: 17.0.2 @@ -13294,7 +12854,7 @@ packages: '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m copy-to-clipboard: 3.3.1 core-js: 3.25.5 - core-js-pure: 3.19.1 + core-js-pure: 3.29.1 downshift: 6.1.12_react@17.0.2 emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m fuse.js: 3.6.1 @@ -13334,7 +12894,7 @@ packages: '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m copy-to-clipboard: 3.3.1 core-js: 3.25.5 - core-js-pure: 3.19.1 + core-js-pure: 3.29.1 downshift: 6.1.12_react@17.0.2 emotion-theming: 10.3.0_gfrer23gq2rp2t523t6qbxrx6m fuse.js: 3.6.1 @@ -13488,7 +13048,7 @@ packages: '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 - loader-utils: 2.0.2 + loader-utils: 2.0.4 transitivePeerDependencies: - supports-color dev: true @@ -15003,7 +14563,7 @@ packages: webpack-cli: 4.x.x dependencies: webpack: 5.70.0_webpack-cli@4.9.2 - webpack-cli: 4.9.2_p2twkydmemoqwqiml4djllh5wi + webpack-cli: 4.9.2_ciq5cijsysjq5sik752b4nyq2m dev: true /@webpack-cli/info/1.4.1_webpack-cli@4.9.2: @@ -15012,10 +14572,10 @@ packages: webpack-cli: 4.x.x dependencies: envinfo: 7.8.1 - webpack-cli: 4.9.2_p2twkydmemoqwqiml4djllh5wi + webpack-cli: 4.9.2_ciq5cijsysjq5sik752b4nyq2m dev: true - /@webpack-cli/serve/1.6.1_oqvzz5d42buklxsrf2oiyc3dxq: + /@webpack-cli/serve/1.6.1_ht4xi23ezbiqlmpjtiwigrodwi: resolution: {integrity: sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==} peerDependencies: webpack-cli: 4.x.x @@ -15024,8 +14584,8 @@ packages: webpack-dev-server: optional: true dependencies: - webpack-cli: 4.9.2_p2twkydmemoqwqiml4djllh5wi - webpack-dev-server: 4.11.1_jaxrlecucqtr54lmhmx67obzmy + webpack-cli: 4.9.2_ciq5cijsysjq5sik752b4nyq2m + webpack-dev-server: 4.12.0_jaxrlecucqtr54lmhmx67obzmy dev: true /@webpack-cli/serve/1.6.1_webpack-cli@4.9.2: @@ -15288,7 +14848,7 @@ packages: '@wordpress/browserslist-config': 4.1.3 '@wordpress/element': 4.20.0 '@wordpress/warning': 2.28.0 - browserslist: 4.21.4 + browserslist: 4.19.3 core-js: 3.25.5 transitivePeerDependencies: - supports-color @@ -15348,7 +14908,7 @@ packages: '@wordpress/browserslist-config': 5.11.0 '@wordpress/element': 5.5.0 '@wordpress/warning': 2.28.0 - browserslist: 4.21.4 + browserslist: 4.19.3 core-js: 3.25.5 transitivePeerDependencies: - supports-color @@ -15515,7 +15075,7 @@ packages: '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 '@wordpress/keycodes': 3.28.0 - '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/notices': 3.19.0_react@17.0.2 '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/shortcode': 3.19.0 '@wordpress/style-engine': 0.15.0 @@ -15568,7 +15128,7 @@ packages: '@wordpress/i18n': 4.28.0 '@wordpress/icons': 9.19.0 '@wordpress/keycodes': 3.28.0 - '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/notices': 3.19.0_react@17.0.2 '@wordpress/primitives': 3.17.0 '@wordpress/reusable-blocks': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/rich-text': 5.17.0_react@17.0.2 @@ -16149,6 +15709,7 @@ packages: mousetrap: 1.6.5 react: 17.0.2 use-memo-one: 1.1.2_react@17.0.2 + dev: false /@wordpress/core-data/4.4.5_react@17.0.2: resolution: {integrity: sha512-vhMbz/Q3xEMWTSFMs0D6n93qFSOhUZr/EgtRhLGRHdjskfgegFTlx13HrhDZ+U3xzkv1b8mH1klk4aZX+f0B8Q==} @@ -16357,6 +15918,7 @@ packages: redux: 4.2.0 turbo-combine-reducers: 1.0.2 use-memo-one: 1.1.2_react@17.0.2 + dev: false /@wordpress/date/4.28.0: resolution: {integrity: sha512-NtKVryepjrYIKS1gRubCtJhcT++3KtiHuf9w1nNWnbY0Onk0pMQUXkZyVL2Bk1EZ3ylUx6S6k/TLOv0QVPxgzA==} @@ -17188,6 +16750,17 @@ packages: lodash: 4.17.21 dev: false + /@wordpress/notices/3.19.0_react@17.0.2: + resolution: {integrity: sha512-NXL5fpfUHPYd1AA9mq0e5xubBzRg1KblR0hXpzV7GBWf2ohM/417HJkBfbzC3HLONMkmuoWR0T9WexYP26qQqw==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@wordpress/a11y': 3.28.0 + '@wordpress/data': 7.3.0_react@17.0.2 + react: 17.0.2 + /@wordpress/notices/3.28.0_react@17.0.2: resolution: {integrity: sha512-XftApWHyLlf2vq6FLYiqACoG4CxDsRqc6zQSjOA5UHQooVPbSsbYXl4eadloPtMnJohlzjzvb0SEIafjMyxjCA==} engines: {node: '>=12'} @@ -17197,6 +16770,7 @@ packages: '@wordpress/data': 8.5.0_react@17.0.2 transitivePeerDependencies: - react + dev: false /@wordpress/notices/3.6.1_react@17.0.2: resolution: {integrity: sha512-S+hOO+4NJJzaqcqm+XPa6uuvt/pkYjRz20HK3xt8Srb+HjO87D3X5feYGQMxEx5ueJl72+5/uOZwmXKJR4pzog==} @@ -17402,6 +16976,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 + dev: false /@wordpress/react-i18n/3.8.0: resolution: {integrity: sha512-5jg7DY05jCWfzCZRt+VCT4cKn6mCZwQhQlJIApcuzUGT51tlLk/BwyxBMfnn5ZT5IVSp9YxedExycohNPXEPjg==} @@ -18582,7 +18157,7 @@ packages: hasBin: true dependencies: browserslist: 3.2.8 - caniuse-lite: 1.0.30001418 + caniuse-lite: 1.0.30001146 normalize-range: 0.1.2 num2fraction: 1.2.2 postcss: 6.0.23 @@ -19047,19 +18622,6 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.16.12: - resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: @@ -19085,6 +18647,19 @@ packages: transitivePeerDependencies: - supports-color + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.16.12: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: @@ -19889,7 +19464,7 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001418 + caniuse-lite: 1.0.30001146 electron-to-chromium: 1.4.276 dev: true @@ -21251,7 +20826,7 @@ packages: /core-js-compat/3.19.1: resolution: {integrity: sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 semver: 7.0.0 /core-js-compat/3.21.1: @@ -21259,22 +20834,17 @@ packages: dependencies: browserslist: 4.19.3 semver: 7.0.0 + dev: true /core-js-compat/3.25.5: resolution: {integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==} dependencies: browserslist: 4.21.4 - /core-js-pure/3.19.1: - resolution: {integrity: sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==} - deprecated: core-js-pure@<3.23.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. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js-pure. + /core-js-pure/3.29.1: + resolution: {integrity: sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg==} requiresBuild: true - /core-js-pure/3.29.0: - resolution: {integrity: sha512-v94gUjN5UTe1n0yN/opTihJ8QBWD2O8i19RfTZR7foONPWArnjB96QA/wk5ozu1mm6ja3udQCzOzwQXTxi3xOQ==} - requiresBuild: true - dev: true - /core-js/1.2.7: resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} deprecated: core-js@<3.23.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. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. @@ -21568,7 +21138,7 @@ packages: webpack: ^4.27.0 || ^5.0.0 dependencies: icss-utils: 5.1.0_postcss@8.4.12 - loader-utils: 2.0.2 + loader-utils: 2.0.4 postcss: 8.4.12 postcss-modules-extract-imports: 3.0.0_postcss@8.4.12 postcss-modules-local-by-default: 4.0.0_postcss@8.4.12 @@ -21640,7 +21210,7 @@ packages: engines: {node: '>= 6'} /css.escape/1.5.1: - resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} + resolution: {integrity: sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=} /css/3.0.0: resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} @@ -23245,7 +22815,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.0.4 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -23276,7 +22846,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.0.4 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -25037,7 +24607,7 @@ packages: deepmerge: 4.3.0 fs-extra: 9.1.0 glob: 7.2.0 - memfs: 3.3.0 + memfs: 3.4.13 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.8 @@ -25101,7 +24671,7 @@ packages: eslint: 8.32.0 fs-extra: 9.1.0 glob: 7.2.0 - memfs: 3.3.0 + memfs: 3.4.13 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.8 @@ -25132,7 +24702,7 @@ packages: deepmerge: 4.3.0 fs-extra: 9.1.0 glob: 7.2.0 - memfs: 3.3.0 + memfs: 3.4.13 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.8 @@ -30284,6 +29854,13 @@ packages: package-json: 4.0.1 dev: true + /launch-editor/2.6.0: + resolution: {integrity: sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==} + dependencies: + picocolors: 1.0.0 + shell-quote: 1.7.3 + dev: true + /lazy-cache/0.2.7: resolution: {integrity: sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==} engines: {node: '>=0.10.0'} @@ -31839,7 +31416,6 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 - dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -34212,7 +33788,7 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.21.4 + browserslist: 4.19.3 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 @@ -35225,7 +34801,7 @@ packages: is-touch-device: 1.0.1 lodash: 4.17.21 moment: 2.29.4 - object.assign: 4.1.2 + object.assign: 4.1.4 object.values: 1.1.5 prop-types: 15.8.1 raf: 3.4.1 @@ -38060,7 +37636,7 @@ packages: peerDependencies: webpack: ^4.0.0 || ^5.0.0 dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.4 schema-utils: 3.1.1 webpack: 5.70.0 dev: true @@ -39992,7 +39568,7 @@ packages: file-loader: optional: true dependencies: - loader-utils: 2.0.2 + loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.1.1 webpack: 5.70.0_bgqcrdgdviybk52kjcpjat65sa @@ -40593,7 +40169,7 @@ packages: webpack: 5.70.0_webpack-cli@3.3.12 yargs: 13.3.2 - /webpack-cli/4.9.2_p2twkydmemoqwqiml4djllh5wi: + /webpack-cli/4.9.2_ciq5cijsysjq5sik752b4nyq2m: resolution: {integrity: sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -40616,7 +40192,7 @@ packages: '@discoveryjs/json-ext': 0.5.7 '@webpack-cli/configtest': 1.1.1_spmstbzrmxjdafr7ccogoqrx6e '@webpack-cli/info': 1.4.1_webpack-cli@4.9.2 - '@webpack-cli/serve': 1.6.1_oqvzz5d42buklxsrf2oiyc3dxq + '@webpack-cli/serve': 1.6.1_ht4xi23ezbiqlmpjtiwigrodwi colorette: 2.0.16 commander: 7.2.0 execa: 5.1.1 @@ -40626,7 +40202,7 @@ packages: rechoir: 0.7.1 webpack: 5.70.0_webpack-cli@4.9.2 webpack-bundle-analyzer: 3.9.0 - webpack-dev-server: 4.11.1_jaxrlecucqtr54lmhmx67obzmy + webpack-dev-server: 4.12.0_jaxrlecucqtr54lmhmx67obzmy webpack-merge: 5.8.0 dev: true @@ -40687,7 +40263,7 @@ packages: dependencies: colorette: 1.4.0 mem: 8.1.1 - memfs: 3.3.0 + memfs: 3.4.13 mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 3.1.1 @@ -40708,8 +40284,8 @@ packages: webpack: 5.70.0_webpack-cli@4.9.2 dev: true - /webpack-dev-server/4.11.1_jaxrlecucqtr54lmhmx67obzmy: - resolution: {integrity: sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==} + /webpack-dev-server/4.12.0_jaxrlecucqtr54lmhmx67obzmy: + resolution: {integrity: sha512-XRN9YRnvOj3TQQ5w/0pR1y1xDcVnbWtNkTri46kuEbaWUPTHsWUvOyAAI7PZHLY+hsFki2kRltJjKMw7e+IiqA==} engines: {node: '>= 12.13.0'} hasBin: true peerDependencies: @@ -40738,6 +40314,7 @@ packages: html-entities: 2.3.2 http-proxy-middleware: 2.0.6_fs2s5z67bp6aaux2wfl66yxz5e ipaddr.js: 2.0.1 + launch-editor: 2.6.0 open: 8.4.0 p-retry: 4.6.1 rimraf: 3.0.2 @@ -40747,9 +40324,9 @@ packages: sockjs: 0.3.24 spdy: 4.0.2 webpack: 5.70.0_webpack-cli@4.9.2 - webpack-cli: 4.9.2_p2twkydmemoqwqiml4djllh5wi + webpack-cli: 4.9.2_ciq5cijsysjq5sik752b4nyq2m webpack-dev-middleware: 5.3.3_webpack@5.70.0 - ws: 8.12.1 + ws: 8.13.0 transitivePeerDependencies: - bufferutil - debug @@ -40966,7 +40543,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 + browserslist: 4.19.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41005,7 +40582,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 + browserslist: 4.19.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41086,7 +40663,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.21.4 + browserslist: 4.19.3 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41102,7 +40679,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.2.5_acorn@8.8.1+webpack@5.70.0 watchpack: 2.3.1 - webpack-cli: 4.9.2_p2twkydmemoqwqiml4djllh5wi + webpack-cli: 4.9.2_ciq5cijsysjq5sik752b4nyq2m webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -41480,6 +41057,20 @@ packages: optional: true utf-8-validate: optional: true + dev: false + + /ws/8.13.0: + resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==} + 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 /x-is-string/0.1.0: resolution: {integrity: sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=} From 04f34e9636bfdd67c1533c5c5ec3f5fb043e74ba Mon Sep 17 00:00:00 2001 From: RJ <27843274+rjchow@users.noreply.github.com> Date: Fri, 17 Mar 2023 12:29:19 +0800 Subject: [PATCH 1064/1680] fix: payments recommendations pane wrong image size (#37259) --- .../client/payments/payment-recommendations.tsx | 9 ++++++++- .../changelog/fix-payment-recommendations-wrong-image | 4 ++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image diff --git a/plugins/woocommerce-admin/client/payments/payment-recommendations.tsx b/plugins/woocommerce-admin/client/payments/payment-recommendations.tsx index babef4e8679..1425d26fab0 100644 --- a/plugins/woocommerce-admin/client/payments/payment-recommendations.tsx +++ b/plugins/woocommerce-admin/client/payments/payment-recommendations.tsx @@ -193,7 +193,14 @@ const PaymentRecommendations: React.FC = () => { ), before: ( - + ), }; } ); diff --git a/plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image b/plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image new file mode 100644 index 00000000000..c13c27b0db3 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Fixed payments recommendations pane in WooCommerce Payment Settings using the wrong image prop From 23b79428f72219f72f78345c0be378b9c9f1f824 Mon Sep 17 00:00:00 2001 From: RJ <27843274+rjchow@users.noreply.github.com> Date: Fri, 17 Mar 2023 13:49:50 +0800 Subject: [PATCH 1065/1680] add: payment transaction processor images to payment recommendations (#37230) --- .../components/List/Item.js | 16 ++++++++++++++++ .../components/List/List.scss | 12 ++++++++++++ .../changelog/add-payment-recommendations-images | 4 ++++ .../src/Admin/API/PaymentGatewaySuggestions.php | 10 ++++++++++ 4 files changed, 42 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-payment-recommendations-images diff --git a/plugins/woocommerce-admin/client/tasks/fills/PaymentGatewaySuggestions/components/List/Item.js b/plugins/woocommerce-admin/client/tasks/fills/PaymentGatewaySuggestions/components/List/Item.js index 80bdede39d2..25ceb1c4557 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/PaymentGatewaySuggestions/components/List/Item.js +++ b/plugins/woocommerce-admin/client/tasks/fills/PaymentGatewaySuggestions/components/List/Item.js @@ -31,6 +31,7 @@ export const Item = ( { isRecommended, markConfigured, paymentGateway } ) => { settingsUrl: manageUrl, is_local_partner: isLocalPartner, external_link: externalLink, + transaction_processors: transactionProcessors, } = paymentGateway; const connectSlot = useSlot( @@ -88,6 +89,21 @@ export const Item = ( { isRecommended, markConfigured, paymentGateway } ) => {
    { content }
    + { transactionProcessors && ( +
    + { Object.keys( transactionProcessors ).map( + ( key ) => { + return ( + { + ); + } + ) } +
    + ) }
    array( 'view', 'edit' ), 'readonly' => true, ), + 'transaction_processors' => array( + 'description' => __( 'Array of transaction processors and their images.', 'woocommerce' ), + 'type' => 'object', + 'addtionalProperties' => array( + 'type' => 'string', + 'format' => 'uri', + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), ), ); From 2699aeca6ba71917fe413de284c1781af459fb26 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 17 Mar 2023 14:38:35 +0800 Subject: [PATCH 1066/1680] Update default payment gateways for payment partners (#37233) * Update default payment gateways * Add changelog * Move cod --- .../changelog/update-payment-gateways | 4 + .../DefaultPaymentGateways.php | 762 +++++++++++++----- 2 files changed, 564 insertions(+), 202 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-payment-gateways diff --git a/plugins/woocommerce/changelog/update-payment-gateways b/plugins/woocommerce/changelog/update-payment-gateways new file mode 100644 index 00000000000..7bb1e74a1c5 --- /dev/null +++ b/plugins/woocommerce/changelog/update-payment-gateways @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update obw payment gateways diff --git a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php index a1846b7ef81..b23fc7b06c4 100644 --- a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php +++ b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php @@ -47,6 +47,263 @@ class DefaultPaymentGateways { */ public static function get_all() { $payment_gateways = array( + array( + 'id' => 'affirm', + 'title' => __( 'Affirm', 'woocommerce' ), + 'content' => __( 'Affirm’s tailored Buy Now Pay Later programs remove price as a barrier, turning browsers into buyers, increasing average order value, and expanding your customer base.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/affirm.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/affirm.png', + 'plugins' => array(), + 'external_link' => 'https://woocommerce.com/products/woocommerce-gateway-affirm', + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'US', + 'CA', + ) + ), + ), + 'category_other' => array(), + 'category_additional' => array( + 'US', + 'CA', + ), + ), + array( + 'id' => 'afterpay', + 'title' => __( 'Afterpay', 'woocommerce' ), + 'content' => __( 'Afterpay allows customers to receive products immediately and pay for purchases over four installments, always interest-free.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/afterpay.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/afterpay.png', + 'plugins' => array( 'afterpay-gateway-for-woocommerce' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'US', + 'CA', + 'AU', + ) + ), + ), + 'category_other' => array(), + 'category_additional' => array( + 'US', + 'CA', + 'AU', + ), + ), + array( + 'id' => 'amazon_payments_advanced', + 'title' => __( 'Amazon Pay', 'woocommerce' ), + 'content' => __( 'Enable a familiar, fast checkout for hundreds of millions of active Amazon customers globally.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/amazonpay.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/amazonpay.png', + 'plugins' => array( 'woocommerce-gateway-amazon-payments-advanced' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'US', + 'AT', + 'BE', + 'CY', + 'DK', + 'ES', + 'FR', + 'DE', + 'GB', + 'HU', + 'IE', + 'IT', + 'LU', + 'NL', + 'PT', + 'SL', + 'SE', + 'JP', + ) + ), + ), + 'category_other' => array(), + 'category_additional' => array( + 'US', + 'AT', + 'BE', + 'CY', + 'DK', + 'ES', + 'FR', + 'DE', + 'GB', + 'HU', + 'IE', + 'IT', + 'LU', + 'NL', + 'PT', + 'SL', + 'SE', + 'JP', + ), + ), + array( + 'id' => 'bacs', + 'title' => __( 'Direct bank transfer', 'woocommerce' ), + 'content' => __( 'Take payments via bank transfer.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/bacs.svg', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/bacs.png', + 'is_visible' => array( + self::get_rules_for_cbd( false ), + ), + 'is_offline' => true, + ), + array( + 'id' => 'cod', + 'title' => __( 'Cash on delivery', 'woocommerce' ), + 'content' => __( 'Take payments in cash upon delivery.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/cod.svg', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/cod.png', + 'is_visible' => array( + self::get_rules_for_cbd( false ), + ), + 'is_offline' => true, + ), + array( + 'id' => 'eway', + 'title' => __( 'Eway', 'woocommerce' ), + 'content' => __( 'The Eway extension for WooCommerce allows you to take credit card payments directly on your store without redirecting your customers to a third party site to make payment.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/eway.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/eway.png', + 'plugins' => array( 'woocommerce-gateway-eway' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'NZ', + 'HK', + 'SG', + 'AU', + ) + ), + self::get_rules_for_cbd( false ), + ), + 'category_other' => array( + 'NZ', + 'HK', + 'SG', + 'AU', + ), + 'category_additional' => array(), + ), + array( + 'id' => 'kco', + 'title' => __( 'Klarna Checkout', 'woocommerce' ), + 'content' => __( 'Choose the payment that you want, pay now, pay later or slice it. No credit card numbers, no passwords, no worries.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/klarna-black.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/klarna.png', + 'plugins' => array( 'klarna-checkout-for-woocommerce' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'NO', + 'SE', + 'FI', + ) + ), + self::get_rules_for_cbd( false ), + ), + 'category_other' => array( + 'NO', + 'SE', + 'FI', + ), + 'category_additional' => array(), + ), + array( + 'id' => 'klarna_payments', + 'title' => __( 'Klarna Payments', 'woocommerce' ), + 'content' => __( 'Choose the payment that you want, pay now, pay later or slice it. No credit card numbers, no passwords, no worries.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/klarna-black.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/klarna.png', + 'plugins' => array( 'klarna-payments-for-woocommerce' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'AT', + 'BE', + 'CH', + 'DK', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'IT', + 'NL', + 'NO', + 'PL', + 'SE', + ) + ), + self::get_rules_for_cbd( false ), + ), + 'category_other' => array(), + 'category_additional' => array( + 'US', + 'CA', + 'AT', + 'BE', + 'CH', + 'DK', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'IT', + 'NL', + 'NO', + 'PL', + 'SE', + ), + ), + array( + 'id' => 'mollie_wc_gateway_banktransfer', + 'title' => __( 'Mollie', 'woocommerce' ), + 'content' => __( 'Effortless payments by Mollie: Offer global and local payment methods, get onboarded in minutes, and supported in your language.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/mollie.svg', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/mollie.png', + 'plugins' => array( 'mollie-payments-for-woocommerce' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'AT', + 'BE', + 'CH', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'IT', + 'NL', + 'PL', + ) + ), + ), + 'category_other' => array( + 'AT', + 'BE', + 'CH', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'IT', + 'NL', + 'PL', + ), + 'category_additional' => array(), + ), array( 'id' => 'payfast', 'title' => __( 'PayFast', 'woocommerce' ), @@ -55,27 +312,10 @@ class DefaultPaymentGateways { 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/payfast.png', 'plugins' => array( 'woocommerce-payfast-gateway' ), 'is_visible' => array( - self::get_rules_for_countries( array( 'ZA', 'GH', 'NG' ) ), + self::get_rules_for_countries( array( 'ZA' ) ), self::get_rules_for_cbd( false ), ), - 'category_other' => array( 'ZA', 'GH', 'NG' ), - 'category_additional' => array(), - ), - array( - 'id' => 'stripe', - 'title' => __( ' Stripe', 'woocommerce' ), - 'content' => __( 'Accept debit and credit cards in 135+ currencies, methods such as Alipay, and one-touch checkout with Apple Pay.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/stripe.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/stripe.png', - 'plugins' => array( 'woocommerce-gateway-stripe' ), - 'is_visible' => array( - // https://stripe.com/global. - self::get_rules_for_countries( - array( 'AU', 'AT', 'BE', 'BG', 'BR', 'CA', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HK', 'IN', 'IE', 'IT', 'JP', 'LV', 'LT', 'LU', 'MY', 'MT', 'MX', 'NL', 'NZ', 'NO', 'PL', 'PT', 'RO', 'SG', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB', 'US', 'PR', 'HU', 'SL', 'ID', 'MY', 'SI', 'PR' ) - ), - self::get_rules_for_cbd( false ), - ), - 'category_other' => array( 'AU', 'AT', 'BE', 'BG', 'BR', 'CA', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HK', 'IN', 'IE', 'IT', 'JP', 'LV', 'LT', 'LU', 'MY', 'MT', 'MX', 'NL', 'NZ', 'NO', 'PL', 'PT', 'RO', 'SG', 'SK', 'SI', 'ES', 'SE', 'CH', 'GB', 'US', 'PR', 'HU', 'SL', 'ID', 'MY', 'SI', 'PR' ), + 'category_other' => array( 'ZA' ), 'category_additional' => array(), ), array( @@ -93,62 +333,21 @@ class DefaultPaymentGateways { 'category_additional' => array(), ), array( - 'id' => 'kco', - 'title' => __( 'Klarna Checkout', 'woocommerce' ), - 'content' => __( 'Choose the payment that you want, pay now, pay later or slice it. No credit card numbers, no passwords, no worries.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/klarna-black.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/klarna.png', - 'plugins' => array( 'klarna-checkout-for-woocommerce' ), + 'id' => 'payubiz', + 'title' => __( 'PayU for WooCommerce', 'woocommerce' ), + 'content' => __( 'Enable PayU’s exclusive plugin for WooCommerce to start accepting payments in 100+ payment methods available in India including credit cards, debit cards, UPI, & more!', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/payu.svg', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/payu.png', + 'plugins' => array( 'payu-india' ), 'is_visible' => array( - self::get_rules_for_countries( array( 'SE', 'FI', 'NO' ) ), - self::get_rules_for_cbd( false ), - ), - 'category_other' => array( 'SE', 'FI', 'NO' ), - 'category_additional' => array(), - ), - array( - 'id' => 'klarna_payments', - 'title' => __( 'Klarna Payments', 'woocommerce' ), - 'content' => __( 'Choose the payment that you want, pay now, pay later or slice it. No credit card numbers, no passwords, no worries.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/klarna-black.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/klarna.png', - 'plugins' => array( 'klarna-payments-for-woocommerce' ), - 'is_visible' => array( - self::get_rules_for_countries( - array( 'DK', 'DE', 'AT', 'NL', 'CH', 'BE', 'SP', 'PL', 'FR', 'IT', 'GB', 'ES', 'FI', 'NO', 'SE', 'ES', 'FI', 'NO', 'SE' ) + (object) array( + 'type' => 'base_location_country', + 'value' => 'IN', + 'operation' => '=', ), self::get_rules_for_cbd( false ), ), - 'category_other' => array(), - 'category_additional' => array( 'DK', 'DE', 'AT', 'NL', 'CH', 'BE', 'SP', 'PL', 'FR', 'IT', 'GB', 'ES', 'FI', 'NO', 'SE', 'ES', 'FI', 'NO', 'SE' ), - ), - array( - 'id' => 'mollie_wc_gateway_banktransfer', - 'title' => __( 'Mollie', 'woocommerce' ), - 'content' => __( 'Effortless payments by Mollie: Offer global and local payment methods, get onboarded in minutes, and supported in your language.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/mollie.svg', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/mollie.png', - 'plugins' => array( 'mollie-payments-for-woocommerce' ), - 'is_visible' => array( - self::get_rules_for_countries( - array( 'FR', 'DE', 'GB', 'AT', 'CH', 'ES', 'IT', 'PL', 'FI', 'NL', 'BE' ) - ), - ), - 'category_other' => array( 'FR', 'DE', 'GB', 'AT', 'CH', 'ES', 'IT', 'PL', 'FI', 'NL', 'BE' ), - 'category_additional' => array(), - ), - array( - 'id' => 'woo-mercado-pago-custom', - 'title' => __( 'Mercado Pago Checkout Pro & Custom', 'woocommerce' ), - 'content' => __( 'Accept credit and debit cards, offline (cash or bank transfer) and logged-in payments with money in Mercado Pago. Safe and secure payments with the leading payment processor in LATAM.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/mercadopago.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/mercadopago.png', - 'plugins' => array( 'woocommerce-mercadopago' ), - 'is_visible' => array( - self::get_rules_for_countries( array( 'AR', 'BR', 'CL', 'CO', 'MX', 'PE', 'UY' ) ), - ), - 'is_local_partner' => true, - 'category_other' => array( 'AR', 'BR', 'CL', 'CO', 'MX', 'PE', 'UY' ), + 'category_other' => array( 'IN' ), 'category_additional' => array(), ), array( @@ -166,30 +365,304 @@ class DefaultPaymentGateways { ), self::get_rules_for_cbd( false ), ), - 'category_other' => array( 'US', 'CA', 'AT', 'BE', 'BG', 'HR', 'CH', 'CY', 'CZ', 'DK', 'EE', 'ES', 'FI', 'FR', 'DE', 'GB', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'SK', 'SL', 'SE', 'MX', 'BR', 'AR', 'CL', 'CO', 'EC', 'PE', 'UY', 'VE', 'AU', 'NZ', 'HK', 'JP', 'SG', 'CN', 'ID', 'ZA', 'NG', 'GH' ), - 'category_additional' => array( 'US', 'CA', 'AT', 'BE', 'BG', 'HR', 'CH', 'CY', 'CZ', 'DK', 'EE', 'ES', 'FI', 'FR', 'DE', 'GB', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'NO', 'PL', 'PT', 'RO', 'SK', 'SL', 'SE', 'MX', 'BR', 'AR', 'CL', 'CO', 'EC', 'PE', 'UY', 'VE', 'AU', 'NZ', 'HK', 'JP', 'SG', 'CN', 'ID', 'IN', 'ZA', 'NG', 'GH' ), + 'category_other' => array( + 'US', + 'CA', + 'MX', + 'BR', + 'AR', + 'CL', + 'CO', + 'EC', + 'PE', + 'UY', + 'VE', + 'AT', + 'BE', + 'BG', + 'HR', + 'CH', + 'CY', + 'CZ', + 'DK', + 'EE', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'GR', + 'HU', + 'IE', + 'IT', + 'LV', + 'LT', + 'LU', + 'MT', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'SK', + 'SL', + 'SE', + 'AU', + 'NZ', + 'HK', + 'JP', + 'SG', + 'CN', + 'ID', + 'IN', + ), + 'category_additional' => array( + 'US', + 'CA', + 'ZA', + 'NG', + 'GH', + 'EC', + 'VE', + 'AR', + 'CL', + 'CO', + 'PE', + 'UY', + 'MX', + 'BR', + 'AT', + 'BE', + 'BG', + 'HR', + 'CH', + 'CY', + 'CZ', + 'DK', + 'EE', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'GR', + 'HU', + 'IE', + 'IT', + 'LV', + 'LT', + 'LU', + 'MT', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'SK', + 'SL', + 'SE', + 'AU', + 'NZ', + 'HK', + 'JP', + 'SG', + 'CN', + 'ID', + ), ), array( - 'id' => 'cod', - 'title' => __( 'Cash on delivery', 'woocommerce' ), - 'content' => __( 'Take payments in cash upon delivery.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/cod.svg', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/cod.png', - 'is_visible' => array( + 'id' => 'razorpay', + 'title' => __( 'Razorpay', 'woocommerce' ), + 'content' => __( 'The official Razorpay extension for WooCommerce allows you to accept credit cards, debit cards, netbanking, wallet, and UPI payments.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/razorpay.svg', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/razorpay.png', + 'plugins' => array( 'woo-razorpay' ), + 'is_visible' => array( + (object) array( + 'type' => 'base_location_country', + 'value' => 'IN', + 'operation' => '=', + ), self::get_rules_for_cbd( false ), ), - 'is_offline' => true, + 'category_other' => array( 'IN' ), + 'category_additional' => array(), ), array( - 'id' => 'bacs', - 'title' => __( 'Direct bank transfer', 'woocommerce' ), - 'content' => __( 'Take payments via bank transfer.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/bacs.svg', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/bacs.png', - 'is_visible' => array( + 'id' => 'square_credit_card', + 'title' => __( 'Square', 'woocommerce' ), + 'content' => __( 'Securely accept credit and debit cards with one low rate, no surprise fees (custom rates available). Sell online and in store and track sales and inventory in one place.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/square-black.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/square.png', + 'plugins' => array( 'woocommerce-square' ), + 'is_visible' => array( + (object) array( + 'type' => 'or', + 'operands' => (object) array( + array( + self::get_rules_for_countries( array( 'US' ) ), + self::get_rules_for_cbd( true ), + ), + array( + self::get_rules_for_countries( + array( + 'US', + 'CA', + 'IE', + 'ES', + 'FR', + 'GB', + 'AU', + 'JP', + ) + ), + self::get_rules_for_selling_venues( array( 'brick-mortar', 'brick-mortar-other' ) ), + ), + ), + ), + ), + 'category_other' => array( + 'US', + 'CA', + 'IE', + 'ES', + 'FR', + 'GB', + 'AU', + 'JP', + ), + 'category_additional' => array(), + ), + array( + 'id' => 'stripe', + 'title' => __( ' Stripe', 'woocommerce' ), + 'content' => __( 'Accept debit and credit cards in 135+ currencies, methods such as Alipay, and one-touch checkout with Apple Pay.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/stripe.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/stripe.png', + 'plugins' => array( 'woocommerce-gateway-stripe' ), + 'is_visible' => array( + // https://stripe.com/global. + self::get_rules_for_countries( + array( + 'US', + 'CA', + 'MX', + 'BR', + 'AT', + 'BE', + 'BG', + 'CH', + 'CY', + 'CZ', + 'DK', + 'EE', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'GR', + 'HU', + 'IE', + 'IT', + 'LV', + 'LT', + 'LU', + 'MT', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'SK', + 'SL', + 'SE', + 'AU', + 'NZ', + 'HK', + 'JP', + 'SG', + 'ID', + 'IN', + ) + ), self::get_rules_for_cbd( false ), ), - 'is_offline' => true, + 'category_other' => array( + 'US', + 'CA', + 'MX', + 'BR', + 'AT', + 'BE', + 'BG', + 'CH', + 'CY', + 'CZ', + 'DK', + 'EE', + 'ES', + 'FI', + 'FR', + 'DE', + 'GB', + 'GR', + 'HU', + 'IE', + 'IT', + 'LV', + 'LT', + 'LU', + 'MT', + 'NL', + 'NO', + 'PL', + 'PT', + 'RO', + 'SK', + 'SL', + 'SE', + 'AU', + 'NZ', + 'HK', + 'JP', + 'SG', + 'ID', + 'IN', + ), + 'category_additional' => array(), + ), + array( + 'id' => 'woo-mercado-pago-custom', + 'title' => __( 'Mercado Pago Checkout Pro & Custom', 'woocommerce' ), + 'content' => __( 'Accept credit and debit cards, offline (cash or bank transfer) and logged-in payments with money in Mercado Pago. Safe and secure payments with the leading payment processor in LATAM.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/mercadopago.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/mercadopago.png', + 'plugins' => array( 'woocommerce-mercadopago' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'AR', + 'CL', + 'CO', + 'PE', + 'UY', + 'MX', + 'BR', + ) + ), + ), + 'is_local_partner' => true, + 'category_other' => array( + 'AR', + 'CL', + 'CO', + 'PE', + 'UY', + 'MX', + 'BR', + ), + 'category_additional' => array(), ), // This is for backwards compatibility only (WC < 5.10.0-dev or WCA < 2.9.0-dev). array( @@ -303,121 +776,6 @@ class DefaultPaymentGateways { ), ), ), - array( - 'id' => 'razorpay', - 'title' => __( 'Razorpay', 'woocommerce' ), - 'content' => __( 'The official Razorpay extension for WooCommerce allows you to accept credit cards, debit cards, netbanking, wallet, and UPI payments.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/razorpay.svg', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/razorpay.png', - 'plugins' => array( 'woo-razorpay' ), - 'is_visible' => array( - (object) array( - 'type' => 'base_location_country', - 'value' => 'IN', - 'operation' => '=', - ), - self::get_rules_for_cbd( false ), - ), - 'category_other' => array( 'IN' ), - 'category_additional' => array(), - ), - array( - 'id' => 'payubiz', - 'title' => __( 'PayU for WooCommerce', 'woocommerce' ), - 'content' => __( 'Enable PayU’s exclusive plugin for WooCommerce to start accepting payments in 100+ payment methods available in India including credit cards, debit cards, UPI, & more!', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/payu.svg', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/payu.png', - 'plugins' => array( 'payu-india' ), - 'is_visible' => array( - (object) array( - 'type' => 'base_location_country', - 'value' => 'IN', - 'operation' => '=', - ), - self::get_rules_for_cbd( false ), - ), - 'category_other' => array( 'IN' ), - 'category_additional' => array(), - ), - array( - 'id' => 'eway', - 'title' => __( 'Eway', 'woocommerce' ), - 'content' => __( 'The Eway extension for WooCommerce allows you to take credit card payments directly on your store without redirecting your customers to a third party site to make payment.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/eway.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/eway.png', - 'plugins' => array( 'woocommerce-gateway-eway' ), - 'is_visible' => array( - self::get_rules_for_countries( array( 'AU', 'NZ' ) ), - self::get_rules_for_cbd( false ), - ), - 'category_other' => array( 'AU', 'NZ' ), - 'category_additional' => array(), - ), - array( - 'id' => 'square_credit_card', - 'title' => __( 'Square', 'woocommerce' ), - 'content' => __( 'Securely accept credit and debit cards with one low rate, no surprise fees (custom rates available). Sell online and in store and track sales and inventory in one place.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/square-black.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/square.png', - 'plugins' => array( 'woocommerce-square' ), - 'is_visible' => array( - (object) array( - 'type' => 'or', - 'operands' => (object) array( - array( - self::get_rules_for_countries( array( 'US' ) ), - self::get_rules_for_cbd( true ), - ), - array( - self::get_rules_for_countries( array( 'US', 'CA', 'JP', 'GB', 'AU', 'IE', 'FR', 'ES', 'FI' ) ), - self::get_rules_for_selling_venues( array( 'brick-mortar', 'brick-mortar-other' ) ), - ), - ), - ), - ), - 'category_other' => array( 'US', 'CA', 'JP', 'GB', 'AU', 'IE', 'FR', 'ES', 'FI' ), - 'category_additional' => array(), - ), - array( - 'id' => 'afterpay', - 'title' => __( 'Afterpay', 'woocommerce' ), - 'content' => __( 'Afterpay allows customers to receive products immediately and pay for purchases over four installments, always interest-free.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/afterpay.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/afterpay.png', - 'plugins' => array( 'afterpay-gateway-for-woocommerce' ), - 'is_visible' => array( - self::get_rules_for_countries( array( 'US', 'CA' ) ), - ), - 'category_other' => array(), - 'category_additional' => array( 'US', 'CA' ), - ), - array( - 'id' => 'amazon_payments_advanced', - 'title' => __( 'Amazon Pay', 'woocommerce' ), - 'content' => __( 'Enable a familiar, fast checkout for hundreds of millions of active Amazon customers globally.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/amazonpay.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/amazonpay.png', - 'plugins' => array( 'woocommerce-gateway-amazon-payments-advanced' ), - 'is_visible' => array( - self::get_rules_for_countries( array( 'US', 'GB', 'JP', 'AT', 'BE', 'CY', 'DK', 'ES', 'FR', 'DE', 'HU', 'IE', 'IT', 'LU', 'NL', 'PT', 'SL', 'SE' ) ), - ), - 'category_other' => array(), - 'category_additional' => array( 'US', 'GB', 'JP', 'AT', 'BE', 'CY', 'DK', 'ES', 'FR', 'DE', 'HU', 'IE', 'IT', 'LU', 'NL', 'PT', 'SL', 'SE' ), - ), - array( - 'id' => 'affirm', - 'title' => __( 'Affirm', 'woocommerce' ), - 'content' => __( 'Affirm’s tailored Buy Now Pay Later programs remove price as a barrier, turning browsers into buyers, increasing average order value, and expanding your customer base.', 'woocommerce' ), - 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/affirm.png', - 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/affirm.png', - 'plugins' => array(), - 'external_link' => 'https://woocommerce.com/products/woocommerce-gateway-affirm', - 'is_visible' => array( - self::get_rules_for_countries( array( 'US', 'CA' ) ), - ), - 'category_other' => array(), - 'category_additional' => array( 'US', 'CA' ), - ), ); foreach ( $payment_gateways as $index => $payment_gateway ) { From a643fef112d1eb0eea65eb2386c109a9a208c7b0 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 17 Mar 2023 15:11:33 +0800 Subject: [PATCH 1067/1680] Fix woocommerce-admin "packages" commands (#37204) Fix WCA run packages command Add changelog --- plugins/woocommerce-admin/package.json | 6 +++--- plugins/woocommerce/changelog/fix-wca-run-packages-cmd | 5 +++++ 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-wca-run-packages-cmd diff --git a/plugins/woocommerce-admin/package.json b/plugins/woocommerce-admin/package.json index 8a493229dbc..72f6d43a919 100644 --- a/plugins/woocommerce-admin/package.json +++ b/plugins/woocommerce-admin/package.json @@ -33,9 +33,9 @@ "lint:js-pre-commit": "eslint --ext=js,ts,tsx", "prepack": "pnpm install && pnpm run lint && pnpm run test && cross-env WC_ADMIN_PHASE=core pnpm run build", "packages:fix:textdomain": "node ./bin/package-update-textdomain.js", - "packages:build": "cross-env WC_ADMIN_PHASE=development pnpm -w run build --filter='./packages/js/*'", - "packages:watch": "cross-env WC_ADMIN_PHASE=development pnpm run:packages -- start --parallel", - "run:packages": "pnpm run --filter ../../packages/js/", + "packages:build": "pnpm run:packages -- build", + "packages:watch": "pnpm run:packages -- start", + "run:packages": "pnpm run --parallel --filter='../../packages/js/**'", "prestart": "pnpm packages:build && cross-env WC_ADMIN_PHASE=development pnpm run build:feature-config", "start": "concurrently \"cross-env WC_ADMIN_PHASE=development webpack --watch\" \"cross-env WC_ADMIN_PHASE=development pnpm packages:watch\"", "start:hot": "pnpm prestart && concurrently \"cross-env WC_ADMIN_PHASE=development webpack serve\" \"cross-env WC_ADMIN_PHASE=development pnpm packages:watch\"", diff --git a/plugins/woocommerce/changelog/fix-wca-run-packages-cmd b/plugins/woocommerce/changelog/fix-wca-run-packages-cmd new file mode 100644 index 00000000000..a8e2884b420 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-wca-run-packages-cmd @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Fix woocommerce-admin run packages commands + + From 76dca5548b6aeeb2dd2e706a3b99759ab891918f Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 15:41:06 +0800 Subject: [PATCH 1068/1680] Use separate files --- .../upload-allure-files-to-bucket/action.yml | 39 ++++++++----------- .../scripts/upload-allure-report.sh | 8 ++++ .../scripts/upload-allure-results.sh | 8 ++++ .../scripts/verify-allure-dirs.js | 10 +++++ .github/workflows/smoke-test-release.yml | 20 ++++++---- 5 files changed, 55 insertions(+), 30 deletions(-) create mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh create mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh create mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js diff --git a/.github/actions/tests/upload-allure-files-to-bucket/action.yml b/.github/actions/tests/upload-allure-files-to-bucket/action.yml index d3146e99367..5ca2514eee6 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/action.yml +++ b/.github/actions/tests/upload-allure-files-to-bucket/action.yml @@ -16,14 +16,6 @@ inputs: required: true include-allure-results: dafault: false - allure-results-dir: - description: Path to the allure-results folder - default: ${{ env.ALLURE_RESULTS_DIR }} - required: true - allure-report-dir: - description: Path to the allure-report folder - default: ${{ env.ALLURE_REPORT_DIR }} - required: true runs: using: composite @@ -35,23 +27,26 @@ runs: aws-access-key-id: ${{ inputs.aws-access-key-id }} aws-secret-access-key: ${{ inputs.aws-secret-access-key }} + - name: Verify allure-results and allure-report paths + uses: actions/github-script@v6 + with: + script: | + const script = require('./.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js') + script({core}) + - name: Upload 'allure-results' folder if: inputs.include-allure-results == true shell: bash - run: | - echo "Uploading allure-results folder..." - aws s3 cp ${{ inputs.allure-results-dir }} \ - ${{ inputs.s3-bucket }}/artifacts/${{ github.run_id }}/${{ inputs.destination-dir }}/allure-results \ - --recursive \ - --quiet - echo "Done" + working-directory: .github/actions/tests/upload-allure-files-to-bucket/scripts + run: bash upload-allure-results.sh + env: + DESTINATION_DIR: ${{ inputs.destination-dir }} + S3_BUCKET: ${{ inputs.s3-bucket }} - name: Upload 'allure-report' folder shell: bash - run: | - echo "Uploading allure-report folder..." - aws s3 cp ${{ inputs.allure-report-dir }} \ - ${{ inputs.s3-bucket }}/artifacts/${{ github.run_id }}/${{ inputs.destination-dir }}/allure-report \ - --recursive \ - --quiet - echo "Done" + working-directory: .github/actions/tests/upload-allure-files-to-bucket/scripts + run: bash upload-allure-report.sh + env: + DESTINATION_DIR: ${{ inputs.destination-dir }} + S3_BUCKET: ${{ inputs.s3-bucket }} diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh new file mode 100644 index 00000000000..7002ff3e130 --- /dev/null +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +echo "Uploading allure-report folder..." +aws s3 cp $ALLURE_REPORT_DIR \ + $S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-report \ + --recursive \ + --only-show-errors +echo "Done" \ No newline at end of file diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh new file mode 100644 index 00000000000..b45893309e2 --- /dev/null +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash + +echo "Uploading allure-results folder..." +aws s3 cp $ALLURE_RESULTS_DIR \ + $S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-results \ + --recursive \ + --only-show-errors +echo "Done" \ No newline at end of file diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js new file mode 100644 index 00000000000..bb19bff49c2 --- /dev/null +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js @@ -0,0 +1,10 @@ +const { ALLURE_REPORT_DIR, ALLURE_RESULTS_DIR } = process.env; + +if ( ! ( ALLURE_REPORT_DIR || ALLURE_RESULTS_DIR ) ) { + const errorMessage = + 'You tried to use the "upload-allure-files-to-bucket" action without specifying the path to the allure-results and/or allure-report folders.\n' + + 'To use this action, set the paths using the ALLURE_REPORT_DIR and ALLURE_RESULTS_DIR environment variables.'; + + core.setFailed( errorMessage ); + process.exit(); +} diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 386d6e66c00..e84b210d907 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -369,14 +369,15 @@ jobs: - name: Upload Allure files to bucket if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket + env: + ALLURE_RESULTS_DIR: ${{ env.API_ALLURE_RESULTS_DIR }} + ALLURE_REPORT_DIR: ${{ env.API_ALLURE_REPORT_DIR }} with: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} destination-dir: ${{ env.API_WP_LATEST_X_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - allure-results-dir: ${{ env.API_ALLURE_RESULTS_DIR }} - allure-report-dir: ${{ env.API_ALLURE_REPORT_DIR }} - name: Publish API Allure report if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) @@ -410,14 +411,15 @@ jobs: - name: Upload Allure files to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket + env: + ALLURE_RESULTS_DIR: ${{ env.E2E_ALLURE_RESULTS_DIR }} + ALLURE_REPORT_DIR: ${{ env.E2E_ALLURE_REPORT_DIR }} with: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} destination-dir: ${{ env.E2E_WP_LATEST_X_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - allure-results-dir: ${{ env.E2E_ALLURE_RESULTS_DIR }} - allure-report-dir: ${{ env.E2E_ALLURE_REPORT_DIR }} - name: Publish E2E Allure report if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) @@ -489,14 +491,15 @@ jobs: - name: Upload Allure files to bucket if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket + env: + ALLURE_RESULTS_DIR: ${{ env.API_ALLURE_RESULTS_DIR }} + ALLURE_REPORT_DIR: ${{ env.API_ALLURE_REPORT_DIR }} with: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} destination-dir: ${{ env.API_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - allure-results-dir: ${{ env.API_ALLURE_RESULTS_DIR }} - allure-report-dir: ${{ env.API_ALLURE_REPORT_DIR }} - name: Publish API Allure report if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) @@ -530,14 +533,15 @@ jobs: - name: Upload Allure files to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket + env: + ALLURE_RESULTS_DIR: ${{ env.E2E_ALLURE_RESULTS_DIR }} + ALLURE_REPORT_DIR: ${{ env.E2E_ALLURE_REPORT_DIR }} with: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} destination-dir: ${{ env.E2E_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - allure-results-dir: ${{ env.E2E_ALLURE_RESULTS_DIR }} - allure-report-dir: ${{ env.E2E_ALLURE_REPORT_DIR }} - name: Publish E2E Allure report if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) From d3928b61211e7e11fc7559f8310e73587cf68f95 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 15:44:57 +0800 Subject: [PATCH 1069/1680] Remove unnecessary explicit exit --- .../upload-allure-files-to-bucket/scripts/verify-allure-dirs.js | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js index bb19bff49c2..d6fbda2f4fd 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js @@ -6,5 +6,4 @@ if ( ! ( ALLURE_REPORT_DIR || ALLURE_RESULTS_DIR ) ) { 'To use this action, set the paths using the ALLURE_REPORT_DIR and ALLURE_RESULTS_DIR environment variables.'; core.setFailed( errorMessage ); - process.exit(); } From bcd9a7f9e7e9df6cece30a1dd4f516e44dc1b31c Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 15:47:23 +0800 Subject: [PATCH 1070/1680] Export function --- .../scripts/verify-allure-dirs.js | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js index d6fbda2f4fd..e12a7dcdae3 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js @@ -1,9 +1,11 @@ -const { ALLURE_REPORT_DIR, ALLURE_RESULTS_DIR } = process.env; +module.exports = ( { core } ) => { + const { ALLURE_REPORT_DIR, ALLURE_RESULTS_DIR } = process.env; -if ( ! ( ALLURE_REPORT_DIR || ALLURE_RESULTS_DIR ) ) { - const errorMessage = - 'You tried to use the "upload-allure-files-to-bucket" action without specifying the path to the allure-results and/or allure-report folders.\n' + - 'To use this action, set the paths using the ALLURE_REPORT_DIR and ALLURE_RESULTS_DIR environment variables.'; + if ( ! ( ALLURE_REPORT_DIR || ALLURE_RESULTS_DIR ) ) { + const errorMessage = + 'You tried to use the "upload-allure-files-to-bucket" action without specifying the path to the allure-results and/or allure-report folders.\n' + + 'To use this action, set the paths using the ALLURE_REPORT_DIR and ALLURE_RESULTS_DIR environment variables.'; - core.setFailed( errorMessage ); -} + core.setFailed( errorMessage ); + } +}; From 31134c705570d7a238ef6bc2b6f94e675a93caf5 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 17 Mar 2023 14:01:52 +0530 Subject: [PATCH 1071/1680] Revert "Also delete when order type is placehoder, since it was created by HPOS." This reverts commit 5e636046dd6319d1ccafcc48e9b488e4fb479636. Reverting so that it can be properly included in a seperate PR --- .../DataStores/Orders/OrdersTableDataStore.php | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 4226af8c8b8..eb42a9eefb0 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -1790,18 +1790,9 @@ FROM $order_meta_table $order->set_id( 0 ); - /** We can delete the post data if: - * 1. If the HPOS table is authoritative and synchronization is enabled. - * 2. If the post record is of type `shop_order_placehold`, since this is created by the HPOS in the first place. - * - * In other words, we do not delete the post record when HPOS table is authoritative and synchronization is disabled but post record is a full record and not just a placeholder, because it implies that the order was created before HPOS was enabled. - */ + // Only delete post data if the posts table is authoritative and synchronization is enabled. $data_synchronizer = wc_get_container()->get( DataSynchronizer::class ); - if ( - ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) || - ( get_post_type( $order_id ) === 'shop_order_placehold' ) - ) { - + if ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) { // Delete the associated post, which in turn deletes order items, etc. through {@see WC_Post_Data}. // Once we stop creating posts for orders, we should do the cleanup here instead. wp_delete_post( $order_id ); From 22cfecd522836a7507474e4017bd2404f060f2f0 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 17 Mar 2023 14:02:59 +0530 Subject: [PATCH 1072/1680] Also delete when order type is placehoder, since it was created by HPOS. --- .../DataStores/Orders/OrdersTableDataStore.php | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index eb42a9eefb0..4226af8c8b8 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -1790,9 +1790,18 @@ FROM $order_meta_table $order->set_id( 0 ); - // Only delete post data if the posts table is authoritative and synchronization is enabled. + /** We can delete the post data if: + * 1. If the HPOS table is authoritative and synchronization is enabled. + * 2. If the post record is of type `shop_order_placehold`, since this is created by the HPOS in the first place. + * + * In other words, we do not delete the post record when HPOS table is authoritative and synchronization is disabled but post record is a full record and not just a placeholder, because it implies that the order was created before HPOS was enabled. + */ $data_synchronizer = wc_get_container()->get( DataSynchronizer::class ); - if ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) { + if ( + ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) || + ( get_post_type( $order_id ) === 'shop_order_placehold' ) + ) { + // Delete the associated post, which in turn deletes order items, etc. through {@see WC_Post_Data}. // Once we stop creating posts for orders, we should do the cleanup here instead. wp_delete_post( $order_id ); From c99f17592cde2ab9a6324f60ad5fc658be7aa802 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 17 Mar 2023 14:03:47 +0530 Subject: [PATCH 1073/1680] Add changelog. --- plugins/woocommerce/changelog/fix-delete_placeholder | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-delete_placeholder diff --git a/plugins/woocommerce/changelog/fix-delete_placeholder b/plugins/woocommerce/changelog/fix-delete_placeholder new file mode 100644 index 00000000000..d9fd0ac2cc1 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-delete_placeholder @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Also delete when order type is placehoder, since it was created by HPOS. From 329c65ed7655cc1e89f672c04a23f6489eac8810 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 17 Mar 2023 14:58:35 +0530 Subject: [PATCH 1074/1680] Better language, and allow deleting by inherited classes too. --- .../DataStores/Orders/OrdersTableDataStore.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 4226af8c8b8..72dda5adbec 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -1791,17 +1791,13 @@ FROM $order_meta_table $order->set_id( 0 ); /** We can delete the post data if: - * 1. If the HPOS table is authoritative and synchronization is enabled. - * 2. If the post record is of type `shop_order_placehold`, since this is created by the HPOS in the first place. + * 1. The HPOS table is authoritative and synchronization is enabled. + * 2. The post record is of type `shop_order_placehold`, since this is created by the HPOS in the first place. * * In other words, we do not delete the post record when HPOS table is authoritative and synchronization is disabled but post record is a full record and not just a placeholder, because it implies that the order was created before HPOS was enabled. */ $data_synchronizer = wc_get_container()->get( DataSynchronizer::class ); - if ( - ( $data_synchronizer->data_sync_is_enabled() && $order->get_data_store()->get_current_class_name() === self::class ) || - ( get_post_type( $order_id ) === 'shop_order_placehold' ) - ) { - + if ( $data_synchronizer->data_sync_is_enabled() || get_post_type( $order_id ) === 'shop_order_placehold' ) { // Delete the associated post, which in turn deletes order items, etc. through {@see WC_Post_Data}. // Once we stop creating posts for orders, we should do the cleanup here instead. wp_delete_post( $order_id ); From f7c7a2c451b1e785ce1f62493adc6e268c5d32d8 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 17:47:28 +0800 Subject: [PATCH 1075/1680] Add plugin tests --- .github/workflows/smoke-test-release.yml | 95 ++++++++++++++++++++++++ 1 file changed, 95 insertions(+) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index e84b210d907..7953c93468a 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -558,3 +558,98 @@ jobs: -f env_description="${{ env.ENV_DESCRIPTION }}" \ -f test_type="e2e" \ --repo woocommerce/woocommerce-test-reports + + test-plugins: + name: Test with ${{ matrix.plugin }} installed + runs-on: ubuntu-20.04 + needs: [get-tag] + env: + ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-results + ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report + ARTIFACT_NAME: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report + strategy: + fail-fast: false + matrix: + include: + - plugin: 'WooCommerce Payments' + repo: 'automattic/woocommerce-payments' + - plugin: 'WooCommerce PayPal Payments' + repo: 'woocommerce/woocommerce-paypal-payments' + - plugin: 'WooCommerce Shipping & Tax' + repo: 'automattic/woocommerce-services' + - plugin: 'WooCommerce Subscriptions' + repo: WC_SUBSCRIPTIONS_REPO + private: true + - plugin: 'WordPress SEO' # Yoast SEO in the UI, but the slug is wordpress-seo + repo: 'Yoast/wordpress-seo' + - plugin: 'Contact Form 7' + repo: 'takayukister/contact-form-7' + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Setup WooCommerce Monorepo + uses: ./.github/actions/setup-woocommerce-monorepo + with: + install-filters: woocommerce + + - name: Launch WP Env + working-directory: plugins/woocommerce + run: pnpm run env:test + + - name: Download release zip + env: + GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }} + run: gh release download ${{ needs.get-wp-versions.outputs.tag }} --dir tmp + + - name: Replace `plugins/woocommerce` with unzipped woocommerce release build + run: unzip -d plugins -o tmp/woocommerce.zip + + - name: Run 'Upload plugin' test + id: run-upload-test + timeout-minutes: 60 + uses: ./.github/actions/tests/run-e2e-tests + with: + report-name: ${{ env.ARTIFACT_NAME }} + tests: upload-plugin.spec.js + env: + GITHUB_TOKEN: ${{ secrets.E2E_GH_TOKEN }} + PLUGIN_NAME: ${{ matrix.plugin }} + PLUGIN_REPOSITORY: ${{ matrix.private && secrets[matrix.repo] || matrix.repo }} + + - name: Run the rest of E2E tests + id: run-e2e-composite-action + timeout-minutes: 60 + uses: ./.github/actions/tests/run-e2e-tests + with: + playwright-config: ignore-plugin-tests.playwright.config.js + report-name: ${{ env.ARTIFACT_NAME }} + tests: basic.spec.js # mytodo remove this later + env: + E2E_MAX_FAILURES: 15 + + - name: Upload Allure files to bucket + if: success() || ( failure() && steps.run-upload-test.conclusion == 'failure' ) + uses: ./.github/actions/tests/upload-allure-files-to-bucket + with: + aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} + aws-region: ${{ secrets.REPORTS_AWS_REGION }} + aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} + destination-dir: ${{ env.ARTIFACT_NAME }} + s3-bucket: ${{ secrets.REPORTS_BUCKET }} + + # - name: Publish E2E Allure report + # if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) + # env: + # GITHUB_TOKEN: ${{ secrets.REPORTS_TOKEN }} + # ENV_DESCRIPTION: ${{ matrix.version.env_description }} + # run: | + # gh workflow run publish-test-reports-release.yml \ + # -f created_at="${{ needs.get-wp-versions.outputs.created }}" \ + # -f run_id=${{ github.run_id }} \ + # -f run_number=${{ github.run_number }} \ + # -f release_tag=${{ needs.get-wp-versions.outputs.tag }} \ + # -f artifact="${{ env.E2E_WP_LATEST_X_ARTIFACT }}" \ + # -f env_description="${{ env.ENV_DESCRIPTION }}" \ + # -f test_type="e2e" \ + # --repo woocommerce/woocommerce-test-reports From b2e7478a30291e9f064a5dc3677896ef91452ccf Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 17:48:26 +0800 Subject: [PATCH 1076/1680] Only run hello API tests --- .github/workflows/smoke-test-release.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 7953c93468a..dec6550755f 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -362,6 +362,7 @@ jobs: uses: ./.github/actions/tests/run-api-tests with: report-name: ${{ env.API_WP_LATEST_X_ARTIFACT }} + tests: hello env: ALLURE_RESULTS_DIR: ${{ env.API_ALLURE_RESULTS_DIR }} ALLURE_REPORT_DIR: ${{ env.API_ALLURE_REPORT_DIR }} @@ -484,6 +485,7 @@ jobs: uses: ./.github/actions/tests/run-api-tests with: report-name: ${{ env.API_ARTIFACT }} + tests: hello env: ALLURE_RESULTS_DIR: ${{ env.API_ALLURE_RESULTS_DIR }} ALLURE_REPORT_DIR: ${{ env.API_ALLURE_REPORT_DIR }} From b7cb3f82848d1e0e4c1b622dc9d7b9f0aef63b57 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 17:52:11 +0800 Subject: [PATCH 1077/1680] Correct if condition --- .github/workflows/smoke-test-release.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index dec6550755f..ca9423b2805 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -631,7 +631,10 @@ jobs: E2E_MAX_FAILURES: 15 - name: Upload Allure files to bucket - if: success() || ( failure() && steps.run-upload-test.conclusion == 'failure' ) + if: | + success() || + ( failure() && + ( steps.run-upload-test.conclusion == 'failure' || steps.run-e2e-composite-action.conclusion == 'failure' ) ) uses: ./.github/actions/tests/upload-allure-files-to-bucket with: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} From a6e3398e0635a0dd01df86e874d38ed83469a3f7 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 17 Mar 2023 17:52:24 +0800 Subject: [PATCH 1078/1680] Disable React Fast Refresh completely in webpack when running start command --- plugins/woocommerce-admin/package.json | 2 +- plugins/woocommerce-admin/webpack.config.js | 37 ++++++++++++--------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/plugins/woocommerce-admin/package.json b/plugins/woocommerce-admin/package.json index 72f6d43a919..8a500e53f63 100644 --- a/plugins/woocommerce-admin/package.json +++ b/plugins/woocommerce-admin/package.json @@ -38,7 +38,7 @@ "run:packages": "pnpm run --parallel --filter='../../packages/js/**'", "prestart": "pnpm packages:build && cross-env WC_ADMIN_PHASE=development pnpm run build:feature-config", "start": "concurrently \"cross-env WC_ADMIN_PHASE=development webpack --watch\" \"cross-env WC_ADMIN_PHASE=development pnpm packages:watch\"", - "start:hot": "pnpm prestart && concurrently \"cross-env WC_ADMIN_PHASE=development webpack serve\" \"cross-env WC_ADMIN_PHASE=development pnpm packages:watch\"", + "start:hot": "pnpm prestart && concurrently \"cross-env HOT=true WC_ADMIN_PHASE=development webpack serve\" \"cross-env WC_ADMIN_PHASE=development pnpm packages:watch\"", "test-staged": "pnpm run test:client --bail --findRelatedTests", "test:client": "jest --config client/jest.config.js", "test:debug": "node --inspect-brk ./node_modules/.bin/jest --config client/jest.config.js --watch --runInBand --no-cache", diff --git a/plugins/woocommerce-admin/webpack.config.js b/plugins/woocommerce-admin/webpack.config.js index 949227462c2..54a6afebd25 100644 --- a/plugins/woocommerce-admin/webpack.config.js +++ b/plugins/woocommerce-admin/webpack.config.js @@ -22,6 +22,7 @@ const WooCommerceDependencyExtractionWebpackPlugin = require( '../../packages/js const NODE_ENV = process.env.NODE_ENV || 'development'; const WC_ADMIN_PHASE = process.env.WC_ADMIN_PHASE || 'development'; +const isHot = Boolean( process.env.HOT ); const isProduction = NODE_ENV === 'production'; const wcAdminPackages = [ @@ -134,6 +135,7 @@ const webpackConfig = { plugins: [ '@babel/plugin-proposal-class-properties', ! isProduction && + isHot && require.resolve( 'react-refresh/babel' ), ].filter( Boolean ), }, @@ -190,7 +192,7 @@ const webpackConfig = { } ) ), } ), // React Fast Refresh. - ! isProduction && new ReactRefreshWebpackPlugin(), + ! isProduction && isHot && new ReactRefreshWebpackPlugin(), // We reuse this Webpack setup for Storybook, where we need to disable dependency extraction. ! process.env.STORYBOOK && @@ -228,23 +230,26 @@ const webpackConfig = { if ( ! isProduction || WC_ADMIN_PHASE === 'development' ) { // Set default sourcemap mode if it wasn't set by WP_DEVTOOL. webpackConfig.devtool = webpackConfig.devtool || 'source-map'; - // Add dev server config - // Copied from https://github.com/WordPress/gutenberg/blob/05bea6dd5c6198b0287c41a401d36a06b48831eb/packages/scripts/config/webpack.config.js#L312-L326 - webpackConfig.devServer = { - devMiddleware: { - writeToDisk: true, - }, - allowedHosts: 'auto', - host: 'localhost', - port: 8887, - proxy: { - '/build': { - pathRewrite: { - '^/build': '', + + if ( isHot ) { + // Add dev server config + // Copied from https://github.com/WordPress/gutenberg/blob/05bea6dd5c6198b0287c41a401d36a06b48831eb/packages/scripts/config/webpack.config.js#L312-L326 + webpackConfig.devServer = { + devMiddleware: { + writeToDisk: true, + }, + allowedHosts: 'auto', + host: 'localhost', + port: 8887, + proxy: { + '/build': { + pathRewrite: { + '^/build': '', + }, }, }, - }, - }; + }; + } } module.exports = webpackConfig; From f5b80b84cf06bf590f937af9e43f8c62aa059bc0 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 17 Mar 2023 17:53:14 +0800 Subject: [PATCH 1079/1680] Add changelog --- plugins/woocommerce/changelog/dev-update-webpack-config | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 plugins/woocommerce/changelog/dev-update-webpack-config diff --git a/plugins/woocommerce/changelog/dev-update-webpack-config b/plugins/woocommerce/changelog/dev-update-webpack-config new file mode 100644 index 00000000000..5741df584c5 --- /dev/null +++ b/plugins/woocommerce/changelog/dev-update-webpack-config @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Update WCA webpack config and package.json to use start command when script debug is false + + From 99e243a347c879575f5057437425193652860474 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 17:53:55 +0800 Subject: [PATCH 1080/1680] Shorten job name --- .github/workflows/smoke-test-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index ca9423b2805..807d5df709f 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -562,7 +562,7 @@ jobs: --repo woocommerce/woocommerce-test-reports test-plugins: - name: Test with ${{ matrix.plugin }} installed + name: With ${{ matrix.plugin }} runs-on: ubuntu-20.04 needs: [get-tag] env: From 6a2239183deeaeac3c8343099f1fb31fb96dd0ed Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 17:55:55 +0800 Subject: [PATCH 1081/1680] Remove install-filters in plugin tests --- .github/workflows/smoke-test-release.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 807d5df709f..610a0edf8ab 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -592,8 +592,6 @@ jobs: - name: Setup WooCommerce Monorepo uses: ./.github/actions/setup-woocommerce-monorepo - with: - install-filters: woocommerce - name: Launch WP Env working-directory: plugins/woocommerce From bc44562329317438f3fc8b00745984a085e168a0 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 18:07:32 +0800 Subject: [PATCH 1082/1680] Fix dependent job id --- .github/workflows/smoke-test-release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 610a0edf8ab..30dee11df41 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -600,7 +600,7 @@ jobs: - name: Download release zip env: GH_TOKEN: ${{ secrets.E2E_GH_TOKEN }} - run: gh release download ${{ needs.get-wp-versions.outputs.tag }} --dir tmp + run: gh release download ${{ needs.get-tag.outputs.tag }} --dir tmp - name: Replace `plugins/woocommerce` with unzipped woocommerce release build run: unzip -d plugins -o tmp/woocommerce.zip @@ -648,10 +648,10 @@ jobs: # ENV_DESCRIPTION: ${{ matrix.version.env_description }} # run: | # gh workflow run publish-test-reports-release.yml \ - # -f created_at="${{ needs.get-wp-versions.outputs.created }}" \ + # -f created_at="${{ needs.get-tag.outputs.created }}" \ # -f run_id=${{ github.run_id }} \ # -f run_number=${{ github.run_number }} \ - # -f release_tag=${{ needs.get-wp-versions.outputs.tag }} \ + # -f release_tag=${{ needs.get-tag.outputs.tag }} \ # -f artifact="${{ env.E2E_WP_LATEST_X_ARTIFACT }}" \ # -f env_description="${{ env.ENV_DESCRIPTION }}" \ # -f test_type="e2e" \ From b95b9000ce09e3bbe22861626169a637a1b46f2e Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 18:13:43 +0800 Subject: [PATCH 1083/1680] Fix artifact name --- .github/workflows/smoke-test-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 30dee11df41..f1d1000965e 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -568,7 +568,7 @@ jobs: env: ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-results ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report - ARTIFACT_NAME: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report + ARTIFACT_NAME: e2e-plugin-${{ matrix.plugin }} strategy: fail-fast: false matrix: From a45b67d39039643987fcb1237144edde532ee574 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Fri, 17 Mar 2023 12:03:17 +0100 Subject: [PATCH 1084/1680] Prevent dbDelta from running unnecessary ALTER table during upgrade (#37277) --- .../changelog/fix-stop-alters-from-dbdelta | 4 + .../woocommerce/includes/class-wc-install.php | 138 +++++++++--------- .../tests/legacy/unit-tests/util/install.php | 1 + .../php/includes/class-wc-install-test.php | 8 + 4 files changed, 84 insertions(+), 67 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta diff --git a/plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta b/plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta new file mode 100644 index 00000000000..f076bd36dea --- /dev/null +++ b/plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Update column definitions with synonymous types to prevent dbDelta from trying to ALTER them on each install. diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index cfee24b3945..33e21419f48 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -1001,6 +1001,8 @@ class WC_Install { * woocommerce_order_itemmeta - Order line item meta is stored in a table for storing extra data. * woocommerce_tax_rates - Tax Rates are stored inside 2 tables making tax queries simple and efficient. * woocommerce_tax_rate_locations - Each rate can be applied to more than one postcode/city hence the second table. + * + * @return array Strings containing the results of the various update queries as returned by dbDelta. */ public static function create_tables() { global $wpdb; @@ -1015,7 +1017,7 @@ class WC_Install { */ if ( $wpdb->get_var( "SHOW TABLES LIKE '{$wpdb->prefix}woocommerce_downloadable_product_permissions';" ) ) { if ( ! $wpdb->get_var( "SHOW COLUMNS FROM `{$wpdb->prefix}woocommerce_downloadable_product_permissions` LIKE 'permission_id';" ) ) { - $wpdb->query( "ALTER TABLE {$wpdb->prefix}woocommerce_downloadable_product_permissions DROP PRIMARY KEY, ADD `permission_id` BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT;" ); + $wpdb->query( "ALTER TABLE {$wpdb->prefix}woocommerce_downloadable_product_permissions DROP PRIMARY KEY, ADD `permission_id` bigint(20) unsigned NOT NULL PRIMARY KEY AUTO_INCREMENT;" ); } } @@ -1035,7 +1037,7 @@ class WC_Install { } } - dbDelta( self::get_schema() ); + $db_delta_result = dbDelta( self::get_schema() ); $index_exists = $wpdb->get_row( "SHOW INDEX FROM {$wpdb->comments} WHERE column_name = 'comment_type' and key_name = 'woo_idx_comment_type'" ); @@ -1047,6 +1049,8 @@ class WC_Install { // Clear table caches. delete_transient( 'wc_attribute_taxonomies' ); + + return $db_delta_result; } /** @@ -1085,16 +1089,16 @@ class WC_Install { $tables = " CREATE TABLE {$wpdb->prefix}woocommerce_sessions ( - session_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + session_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, session_key char(32) NOT NULL, session_value longtext NOT NULL, - session_expiry BIGINT UNSIGNED NOT NULL, + session_expiry bigint(20) unsigned NOT NULL, PRIMARY KEY (session_id), UNIQUE KEY session_key (session_key) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_api_keys ( - key_id BIGINT UNSIGNED NOT NULL auto_increment, - user_id BIGINT UNSIGNED NOT NULL, + key_id bigint(20) unsigned NOT NULL auto_increment, + user_id bigint(20) unsigned NOT NULL, description varchar(200) NULL, permissions varchar(10) NOT NULL, consumer_key char(64) NOT NULL, @@ -1107,7 +1111,7 @@ CREATE TABLE {$wpdb->prefix}woocommerce_api_keys ( KEY consumer_secret (consumer_secret) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_attribute_taxonomies ( - attribute_id BIGINT UNSIGNED NOT NULL auto_increment, + attribute_id bigint(20) unsigned NOT NULL auto_increment, attribute_name varchar(200) NOT NULL, attribute_label varchar(200) NULL, attribute_type varchar(20) NOT NULL, @@ -1117,17 +1121,17 @@ CREATE TABLE {$wpdb->prefix}woocommerce_attribute_taxonomies ( KEY attribute_name (attribute_name(20)) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_downloadable_product_permissions ( - permission_id BIGINT UNSIGNED NOT NULL auto_increment, + permission_id bigint(20) unsigned NOT NULL auto_increment, download_id varchar(36) NOT NULL, - product_id BIGINT UNSIGNED NOT NULL, - order_id BIGINT UNSIGNED NOT NULL DEFAULT 0, + product_id bigint(20) unsigned NOT NULL, + order_id bigint(20) unsigned NOT NULL DEFAULT 0, order_key varchar(200) NOT NULL, user_email varchar(200) NOT NULL, - user_id BIGINT UNSIGNED NULL, + user_id bigint(20) unsigned NULL, downloads_remaining varchar(9) NULL, access_granted datetime NOT NULL default '0000-00-00 00:00:00', access_expires datetime NULL default null, - download_count BIGINT UNSIGNED NOT NULL DEFAULT 0, + download_count bigint(20) unsigned NOT NULL DEFAULT 0, PRIMARY KEY (permission_id), KEY download_order_key_product (product_id,order_id,order_key(16),download_id), KEY download_order_product (download_id,order_id,product_id), @@ -1135,16 +1139,16 @@ CREATE TABLE {$wpdb->prefix}woocommerce_downloadable_product_permissions ( KEY user_order_remaining_expires (user_id,order_id,downloads_remaining,access_expires) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_order_items ( - order_item_id BIGINT UNSIGNED NOT NULL auto_increment, - order_item_name TEXT NOT NULL, + order_item_id bigint(20) unsigned NOT NULL auto_increment, + order_item_name text NOT NULL, order_item_type varchar(200) NOT NULL DEFAULT '', - order_id BIGINT UNSIGNED NOT NULL, + order_id bigint(20) unsigned NOT NULL, PRIMARY KEY (order_item_id), KEY order_id (order_id) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_order_itemmeta ( - meta_id BIGINT UNSIGNED NOT NULL auto_increment, - order_item_id BIGINT UNSIGNED NOT NULL, + meta_id bigint(20) unsigned NOT NULL auto_increment, + order_item_id bigint(20) unsigned NOT NULL, meta_key varchar(255) default NULL, meta_value longtext NULL, PRIMARY KEY (meta_id), @@ -1152,15 +1156,15 @@ CREATE TABLE {$wpdb->prefix}woocommerce_order_itemmeta ( KEY meta_key (meta_key(32)) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_tax_rates ( - tax_rate_id BIGINT UNSIGNED NOT NULL auto_increment, + tax_rate_id bigint(20) unsigned NOT NULL auto_increment, tax_rate_country varchar(2) NOT NULL DEFAULT '', tax_rate_state varchar(200) NOT NULL DEFAULT '', tax_rate varchar(8) NOT NULL DEFAULT '', tax_rate_name varchar(200) NOT NULL DEFAULT '', - tax_rate_priority BIGINT UNSIGNED NOT NULL, + tax_rate_priority bigint(20) unsigned NOT NULL, tax_rate_compound int(1) NOT NULL DEFAULT 0, tax_rate_shipping int(1) NOT NULL DEFAULT 1, - tax_rate_order BIGINT UNSIGNED NOT NULL, + tax_rate_order bigint(20) unsigned NOT NULL, tax_rate_class varchar(200) NOT NULL DEFAULT '', PRIMARY KEY (tax_rate_id), KEY tax_rate_country (tax_rate_country), @@ -1169,23 +1173,23 @@ CREATE TABLE {$wpdb->prefix}woocommerce_tax_rates ( KEY tax_rate_priority (tax_rate_priority) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_tax_rate_locations ( - location_id BIGINT UNSIGNED NOT NULL auto_increment, + location_id bigint(20) unsigned NOT NULL auto_increment, location_code varchar(200) NOT NULL, - tax_rate_id BIGINT UNSIGNED NOT NULL, + tax_rate_id bigint(20) unsigned NOT NULL, location_type varchar(40) NOT NULL, PRIMARY KEY (location_id), KEY tax_rate_id (tax_rate_id), KEY location_type_code (location_type(10),location_code(20)) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_shipping_zones ( - zone_id BIGINT UNSIGNED NOT NULL auto_increment, + zone_id bigint(20) unsigned NOT NULL auto_increment, zone_name varchar(200) NOT NULL, - zone_order BIGINT UNSIGNED NOT NULL, + zone_order bigint(20) unsigned NOT NULL, PRIMARY KEY (zone_id) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_shipping_zone_locations ( - location_id BIGINT UNSIGNED NOT NULL auto_increment, - zone_id BIGINT UNSIGNED NOT NULL, + location_id bigint(20) unsigned NOT NULL auto_increment, + zone_id bigint(20) unsigned NOT NULL, location_code varchar(200) NOT NULL, location_type varchar(40) NOT NULL, PRIMARY KEY (location_id), @@ -1193,26 +1197,26 @@ CREATE TABLE {$wpdb->prefix}woocommerce_shipping_zone_locations ( KEY location_type_code (location_type(10),location_code(20)) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_shipping_zone_methods ( - zone_id BIGINT UNSIGNED NOT NULL, - instance_id BIGINT UNSIGNED NOT NULL auto_increment, + zone_id bigint(20) unsigned NOT NULL, + instance_id bigint(20) unsigned NOT NULL auto_increment, method_id varchar(200) NOT NULL, - method_order BIGINT UNSIGNED NOT NULL, + method_order bigint(20) unsigned NOT NULL, is_enabled tinyint(1) NOT NULL DEFAULT '1', PRIMARY KEY (instance_id) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_payment_tokens ( - token_id BIGINT UNSIGNED NOT NULL auto_increment, + token_id bigint(20) unsigned NOT NULL auto_increment, gateway_id varchar(200) NOT NULL, token text NOT NULL, - user_id BIGINT UNSIGNED NOT NULL DEFAULT '0', + user_id bigint(20) unsigned NOT NULL DEFAULT '0', type varchar(200) NOT NULL, is_default tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (token_id), KEY user_id (user_id) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_payment_tokenmeta ( - meta_id BIGINT UNSIGNED NOT NULL auto_increment, - payment_token_id BIGINT UNSIGNED NOT NULL, + meta_id bigint(20) unsigned NOT NULL auto_increment, + payment_token_id bigint(20) unsigned NOT NULL, meta_key varchar(255) NULL, meta_value longtext NULL, PRIMARY KEY (meta_id), @@ -1220,7 +1224,7 @@ CREATE TABLE {$wpdb->prefix}woocommerce_payment_tokenmeta ( KEY meta_key (meta_key(32)) ) $collate; CREATE TABLE {$wpdb->prefix}woocommerce_log ( - log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + log_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, timestamp datetime NOT NULL, level smallint(4) NOT NULL, source varchar(200) NOT NULL, @@ -1230,10 +1234,10 @@ CREATE TABLE {$wpdb->prefix}woocommerce_log ( KEY level (level) ) $collate; CREATE TABLE {$wpdb->prefix}wc_webhooks ( - webhook_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + webhook_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, status varchar(200) NOT NULL, name text NOT NULL, - user_id BIGINT UNSIGNED NOT NULL, + user_id bigint(20) unsigned NOT NULL, delivery_url text NOT NULL, secret text NOT NULL, topic varchar(200) NOT NULL, @@ -1248,11 +1252,11 @@ CREATE TABLE {$wpdb->prefix}wc_webhooks ( KEY user_id (user_id) ) $collate; CREATE TABLE {$wpdb->prefix}wc_download_log ( - download_log_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + download_log_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, timestamp datetime NOT NULL, - permission_id BIGINT UNSIGNED NOT NULL, - user_id BIGINT UNSIGNED NULL, - user_ip_address VARCHAR(100) NULL DEFAULT '', + permission_id bigint(20) unsigned NOT NULL, + user_id bigint(20) unsigned NULL, + user_ip_address varchar(100) NULL DEFAULT '', PRIMARY KEY (download_log_id), KEY permission_id (permission_id), KEY timestamp (timestamp) @@ -1281,7 +1285,7 @@ CREATE TABLE {$wpdb->prefix}wc_product_meta_lookup ( KEY min_max_price (`min_price`, `max_price`) ) $collate; CREATE TABLE {$wpdb->prefix}wc_tax_rate_classes ( - tax_rate_class_id BIGINT UNSIGNED NOT NULL auto_increment, + tax_rate_class_id bigint(20) unsigned NOT NULL auto_increment, name varchar(200) NOT NULL DEFAULT '', slug varchar(200) NOT NULL DEFAULT '', PRIMARY KEY (tax_rate_class_id), @@ -1296,18 +1300,18 @@ CREATE TABLE {$wpdb->prefix}wc_reserved_stock ( PRIMARY KEY (`order_id`, `product_id`) ) $collate; CREATE TABLE {$wpdb->prefix}wc_rate_limits ( - rate_limit_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + rate_limit_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, rate_limit_key varchar(200) NOT NULL, - rate_limit_expiry BIGINT UNSIGNED NOT NULL, + rate_limit_expiry bigint(20) unsigned NOT NULL, rate_limit_remaining smallint(10) NOT NULL DEFAULT '0', PRIMARY KEY (rate_limit_id), UNIQUE KEY rate_limit_key (rate_limit_key($max_index_length)) ) $collate; $product_attributes_lookup_table_creation_sql CREATE TABLE {$wpdb->prefix}wc_product_download_directories ( - url_id BIGINT UNSIGNED NOT NULL auto_increment, + url_id bigint(20) unsigned NOT NULL auto_increment, url varchar(256) NOT NULL, - enabled TINYINT(1) NOT NULL DEFAULT 0, + enabled tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (url_id), KEY url (url($max_index_length)) ) $collate; @@ -1323,22 +1327,22 @@ CREATE TABLE {$wpdb->prefix}wc_order_stats ( tax_total double DEFAULT 0 NOT NULL, shipping_total double DEFAULT 0 NOT NULL, net_total double DEFAULT 0 NOT NULL, - returning_customer boolean DEFAULT NULL, + returning_customer tinyint(1) DEFAULT NULL, status varchar(200) NOT NULL, - customer_id BIGINT UNSIGNED NOT NULL, + customer_id bigint(20) unsigned NOT NULL, PRIMARY KEY (order_id), KEY date_created (date_created), KEY customer_id (customer_id), KEY status (status({$max_index_length})) ) $collate; CREATE TABLE {$wpdb->prefix}wc_order_product_lookup ( - order_item_id BIGINT UNSIGNED NOT NULL, - order_id BIGINT UNSIGNED NOT NULL, - product_id BIGINT UNSIGNED NOT NULL, - variation_id BIGINT UNSIGNED NOT NULL, - customer_id BIGINT UNSIGNED NULL, + order_item_id bigint(20) unsigned NOT NULL, + order_id bigint(20) unsigned NOT NULL, + product_id bigint(20) unsigned NOT NULL, + variation_id bigint(20) unsigned NOT NULL, + customer_id bigint(20) unsigned NULL, date_created datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, - product_qty INT NOT NULL, + product_qty int(11) NOT NULL, product_net_revenue double DEFAULT 0 NOT NULL, product_gross_revenue double DEFAULT 0 NOT NULL, coupon_amount double DEFAULT 0 NOT NULL, @@ -1352,8 +1356,8 @@ CREATE TABLE {$wpdb->prefix}wc_order_product_lookup ( KEY date_created (date_created) ) $collate; CREATE TABLE {$wpdb->prefix}wc_order_tax_lookup ( - order_id BIGINT UNSIGNED NOT NULL, - tax_rate_id BIGINT UNSIGNED NOT NULL, + order_id bigint(20) unsigned NOT NULL, + tax_rate_id bigint(20) unsigned NOT NULL, date_created datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, shipping_tax double DEFAULT 0 NOT NULL, order_tax double DEFAULT 0 NOT NULL, @@ -1363,8 +1367,8 @@ CREATE TABLE {$wpdb->prefix}wc_order_tax_lookup ( KEY date_created (date_created) ) $collate; CREATE TABLE {$wpdb->prefix}wc_order_coupon_lookup ( - order_id BIGINT UNSIGNED NOT NULL, - coupon_id BIGINT NOT NULL, + order_id bigint(20) unsigned NOT NULL, + coupon_id bigint(20) NOT NULL, date_created datetime DEFAULT '0000-00-00 00:00:00' NOT NULL, discount_amount double DEFAULT 0 NOT NULL, PRIMARY KEY (order_id, coupon_id), @@ -1372,7 +1376,7 @@ CREATE TABLE {$wpdb->prefix}wc_order_coupon_lookup ( KEY date_created (date_created) ) $collate; CREATE TABLE {$wpdb->prefix}wc_admin_notes ( - note_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, + note_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, type varchar(20) NOT NULL, locale varchar(20) NOT NULL, @@ -1383,17 +1387,17 @@ CREATE TABLE {$wpdb->prefix}wc_admin_notes ( source varchar(200) NOT NULL, date_created datetime NOT NULL default '0000-00-00 00:00:00', date_reminder datetime NULL default null, - is_snoozable boolean DEFAULT 0 NOT NULL, + is_snoozable tinyint(1) DEFAULT 0 NOT NULL, layout varchar(20) DEFAULT '' NOT NULL, image varchar(200) NULL DEFAULT NULL, - is_deleted boolean DEFAULT 0 NOT NULL, - is_read boolean DEFAULT 0 NOT NULL, + is_deleted tinyint(1) DEFAULT 0 NOT NULL, + is_read tinyint(1) DEFAULT 0 NOT NULL, icon varchar(200) NOT NULL default 'info', PRIMARY KEY (note_id) ) $collate; CREATE TABLE {$wpdb->prefix}wc_admin_note_actions ( - action_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - note_id BIGINT UNSIGNED NOT NULL, + action_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + note_id bigint(20) unsigned NOT NULL, name varchar(255) NOT NULL, label varchar(255) NOT NULL, query longtext NOT NULL, @@ -1405,8 +1409,8 @@ CREATE TABLE {$wpdb->prefix}wc_admin_note_actions ( KEY note_id (note_id) ) $collate; CREATE TABLE {$wpdb->prefix}wc_customer_lookup ( - customer_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, - user_id BIGINT UNSIGNED DEFAULT NULL, + customer_id bigint(20) unsigned NOT NULL AUTO_INCREMENT, + user_id bigint(20) unsigned DEFAULT NULL, username varchar(60) DEFAULT '' NOT NULL, first_name varchar(255) NOT NULL, last_name varchar(255) NOT NULL, @@ -1422,8 +1426,8 @@ CREATE TABLE {$wpdb->prefix}wc_customer_lookup ( KEY email (email) ) $collate; CREATE TABLE {$wpdb->prefix}wc_category_lookup ( - category_tree_id BIGINT UNSIGNED NOT NULL, - category_id BIGINT UNSIGNED NOT NULL, + category_tree_id bigint(20) unsigned NOT NULL, + category_id bigint(20) unsigned NOT NULL, PRIMARY KEY (category_tree_id,category_id) ) $collate; "; diff --git a/plugins/woocommerce/tests/legacy/unit-tests/util/install.php b/plugins/woocommerce/tests/legacy/unit-tests/util/install.php index 70af9b7c15c..5783c85e7b9 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/util/install.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/util/install.php @@ -166,4 +166,5 @@ class WC_Tests_Install extends WC_Unit_Test_Case { $this->assertContains( 'some_table_name', WC_Install::get_tables() ); } + } diff --git a/plugins/woocommerce/tests/php/includes/class-wc-install-test.php b/plugins/woocommerce/tests/php/includes/class-wc-install-test.php index a2ec3899ec6..0afda1bbea1 100644 --- a/plugins/woocommerce/tests/php/includes/class-wc-install-test.php +++ b/plugins/woocommerce/tests/php/includes/class-wc-install-test.php @@ -97,4 +97,12 @@ class WC_Install_Test extends \WC_Unit_Test_Case { $this->assertContains( 'premium_support', array_keys( $plugin_row_data ) ); } + /** + * Test that dbDelta is a noop on an installed site. + */ + public function test_dbDelta_is_a_noop() { + $db_delta_result = WC_Install::create_tables(); + $this->assertEmpty( $db_delta_result ); + } + } From cbafbd53c4442be628d9b92417bfca1e46085c8e Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 17 Mar 2023 19:44:09 +0800 Subject: [PATCH 1085/1680] Update plugins/woocommerce/changelog/dev-update-webpack-config Co-authored-by: Gan Eng Chin --- plugins/woocommerce/changelog/dev-update-webpack-config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/changelog/dev-update-webpack-config b/plugins/woocommerce/changelog/dev-update-webpack-config index 5741df584c5..d2f975eba32 100644 --- a/plugins/woocommerce/changelog/dev-update-webpack-config +++ b/plugins/woocommerce/changelog/dev-update-webpack-config @@ -1,5 +1,5 @@ Significance: patch Type: dev -Comment: Update WCA webpack config and package.json to use start command when script debug is false +Comment: Use React Fast Refresh for WooCommerce Admin "start:hot" command only; fix empty page issue with "start" command when SCRIPT_DEBUG is set to false. From 9ea8b630eed18028ed826b40540a9950321f28b4 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 17 Mar 2023 20:15:31 +0800 Subject: [PATCH 1086/1680] Remove cart2cart option from product task (#37285) * Remove cart2cart option from add product task * Remove cart2cart link test * Add changelog * Fix unit test * Fix lint --- .../tasks/fills/import-products/cards.scss | 4 ++- .../fills/import-products/importTypes.tsx | 31 ------------------- .../fills/import-products/test/index.tsx | 18 ----------- .../client/tasks/fills/products/footer.tsx | 17 +--------- .../tasks/fills/products/test/footer.tsx | 19 ++---------- .../changelog/update-remove-cart2cart | 4 +++ 6 files changed, 10 insertions(+), 83 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-remove-cart2cart diff --git a/plugins/woocommerce-admin/client/tasks/fills/import-products/cards.scss b/plugins/woocommerce-admin/client/tasks/fills/import-products/cards.scss index 715d2bd6eaf..29e15f6cdb8 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/import-products/cards.scss +++ b/plugins/woocommerce-admin/client/tasks/fills/import-products/cards.scss @@ -8,7 +8,9 @@ grid-template-columns: auto auto; grid-column-gap: 16px; grid-row-gap: 24px; - justify-content: start; + // Set it to center here since we only have one import option. + // We can change it to start when we have more import options. + justify-content: center; } .woocommerce-list__item { diff --git a/plugins/woocommerce-admin/client/tasks/fills/import-products/importTypes.tsx b/plugins/woocommerce-admin/client/tasks/fills/import-products/importTypes.tsx index abb15efd783..dd8a3cd77b0 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/import-products/importTypes.tsx +++ b/plugins/woocommerce-admin/client/tasks/fills/import-products/importTypes.tsx @@ -3,10 +3,7 @@ */ import { __ } from '@wordpress/i18n'; import PageIcon from 'gridicons/dist/pages'; -import ReblogIcon from 'gridicons/dist/reblog'; import { getAdminLink } from '@woocommerce/settings'; -import interpolateComponents from '@automattic/interpolate-components'; -import { ExternalLink } from '@wordpress/components'; import { recordEvent } from '@woocommerce/tracks'; export const importTypes = [ @@ -25,32 +22,4 @@ export const importTypes = [ ); }, }, - { - key: 'from-cart2cart' as const, - title: __( 'FROM CART2CART', 'woocommerce' ), - content: interpolateComponents( { - mixedString: __( - 'Migrate all store data like products, customers, and orders in no time with this 3rd party plugin. {{link}}Learn more{{/link}}', - 'woocommerce' - ), - components: { - link: ( - e.preventDefault() } - > - ), - }, - } ), - before: , - onClick: () => { - recordEvent( 'tasklist_add_product', { method: 'migrate' } ); - window - .open( - 'https://woocommerce.com/products/cart2cart/?utm_medium=product', - '_blank' - ) - ?.focus(); - }, - }, ]; diff --git a/plugins/woocommerce-admin/client/tasks/fills/import-products/test/index.tsx b/plugins/woocommerce-admin/client/tasks/fills/import-products/test/index.tsx index 981543421f5..6bf835fea08 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/import-products/test/index.tsx +++ b/plugins/woocommerce-admin/client/tasks/fills/import-products/test/index.tsx @@ -57,24 +57,6 @@ describe( 'Products', () => { ); } ); - test( 'should fire "tasklist_add_product" event when the cart2cart option clicked', async () => { - const { getByRole } = render( ); - - userEvent.click( - getByRole( 'menuitem', { - name: 'FROM CART2CART Migrate all store data like products, customers, and orders in no time with this 3rd party plugin. Learn more (opens in a new tab)', - } ) - ); - await waitFor( () => - expect( recordEvent ).toHaveBeenCalledWith( - 'tasklist_add_product', - { - method: 'migrate', - } - ) - ); - } ); - test( 'should fire "task_completion_time" event when an option clicked', async () => { Object.defineProperty( window, 'performance', { value: { diff --git a/plugins/woocommerce-admin/client/tasks/fills/products/footer.tsx b/plugins/woocommerce-admin/client/tasks/fills/products/footer.tsx index 2538012b50b..86dba20973c 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/products/footer.tsx +++ b/plugins/woocommerce-admin/client/tasks/fills/products/footer.tsx @@ -4,7 +4,6 @@ import { __ } from '@wordpress/i18n'; import interpolateComponents from '@automattic/interpolate-components'; import { Text } from '@woocommerce/experimental'; -import { ExternalLink } from '@wordpress/components'; import { Link } from '@woocommerce/components'; import { getAdminLink } from '@woocommerce/settings'; import { recordEvent } from '@woocommerce/tracks'; @@ -25,7 +24,7 @@ const Footer: React.FC = () => { { interpolateComponents( { mixedString: __( - '{{importCSVLink}}Import your products from a CSV file{{/importCSVLink}} or {{_3rdLink}}use a 3rd party migration plugin{{/_3rdLink}}.', + '{{importCSVLink}}Import your products from a CSV file{{/importCSVLink}}.', 'woocommerce' ), components: { @@ -47,20 +46,6 @@ const Footer: React.FC = () => { <> ), - _3rdLink: ( - { - recordEvent( 'tasklist_add_product', { - method: 'migrate', - } ); - recordCompletionTime(); - } } - href="https://woocommerce.com/products/cart2cart/?utm_medium=product" - type="external" - > - <> - - ), }, } ) } diff --git a/plugins/woocommerce-admin/client/tasks/fills/products/test/footer.tsx b/plugins/woocommerce-admin/client/tasks/fills/products/test/footer.tsx index f042aa61be2..b75e20d3107 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/products/test/footer.tsx +++ b/plugins/woocommerce-admin/client/tasks/fills/products/test/footer.tsx @@ -16,9 +16,9 @@ describe( 'Footer', () => { beforeEach( () => { ( recordEvent as jest.Mock ).mockClear(); } ); - it( 'should render footer with two links', () => { + it( 'should render footer with one links', () => { const { queryAllByRole } = render(
    ); - expect( queryAllByRole( 'link' ) ).toHaveLength( 2 ); + expect( queryAllByRole( 'link' ) ).toHaveLength( 1 ); } ); it( 'clicking on import CSV should fire event tasklist_add_product with method:import and task_completion_time', () => { @@ -35,19 +35,4 @@ describe( 'Footer', () => { { task_name: 'products', time: '0-2s' } ); } ); - - it( 'clicking on start blank should fire event tasklist_add_product with method:migrate and task_completion_time', () => { - const { getByText } = render(
    ); - userEvent.click( getByText( 'use a 3rd party migration plugin' ) ); - expect( recordEvent ).toHaveBeenNthCalledWith( - 1, - 'tasklist_add_product', - { method: 'migrate' } - ); - expect( recordEvent ).toHaveBeenNthCalledWith( - 2, - 'task_completion_time', - { task_name: 'products', time: '0-2s' } - ); - } ); } ); diff --git a/plugins/woocommerce/changelog/update-remove-cart2cart b/plugins/woocommerce/changelog/update-remove-cart2cart new file mode 100644 index 00000000000..fe5b3f56305 --- /dev/null +++ b/plugins/woocommerce/changelog/update-remove-cart2cart @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove Cart2Cart option from add product task From 9503868d71205f7ddba85cdbcdd2f9ecef899211 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 20:16:01 +0800 Subject: [PATCH 1087/1680] Set environment descriptions --- .github/workflows/smoke-test-release.yml | 35 ++++++++++++++---------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index f1d1000965e..1390e39d2e6 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -575,17 +575,23 @@ jobs: include: - plugin: 'WooCommerce Payments' repo: 'automattic/woocommerce-payments' + env_description: 'woocommerce-payments' - plugin: 'WooCommerce PayPal Payments' repo: 'woocommerce/woocommerce-paypal-payments' + env_description: 'woocommerce-paypal-payments' - plugin: 'WooCommerce Shipping & Tax' repo: 'automattic/woocommerce-services' + env_description: 'woocommerce-shipping-&-tax' - plugin: 'WooCommerce Subscriptions' repo: WC_SUBSCRIPTIONS_REPO private: true + env_description: 'woocommerce-subscriptions' - plugin: 'WordPress SEO' # Yoast SEO in the UI, but the slug is wordpress-seo repo: 'Yoast/wordpress-seo' + env_description: 'wordpress-seo' - plugin: 'Contact Form 7' repo: 'takayukister/contact-form-7' + env_description: 'contact-form-7' steps: - name: Checkout uses: actions/checkout@v3 @@ -641,18 +647,17 @@ jobs: destination-dir: ${{ env.ARTIFACT_NAME }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - # - name: Publish E2E Allure report - # if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) - # env: - # GITHUB_TOKEN: ${{ secrets.REPORTS_TOKEN }} - # ENV_DESCRIPTION: ${{ matrix.version.env_description }} - # run: | - # gh workflow run publish-test-reports-release.yml \ - # -f created_at="${{ needs.get-tag.outputs.created }}" \ - # -f run_id=${{ github.run_id }} \ - # -f run_number=${{ github.run_number }} \ - # -f release_tag=${{ needs.get-tag.outputs.tag }} \ - # -f artifact="${{ env.E2E_WP_LATEST_X_ARTIFACT }}" \ - # -f env_description="${{ env.ENV_DESCRIPTION }}" \ - # -f test_type="e2e" \ - # --repo woocommerce/woocommerce-test-reports + - name: Publish E2E Allure report + if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) + env: + GITHUB_TOKEN: ${{ secrets.REPORTS_TOKEN }} + run: | + gh workflow run publish-test-reports-release.yml \ + -f created_at="${{ needs.get-tag.outputs.created }}" \ + -f run_id=${{ github.run_id }} \ + -f run_number=${{ github.run_number }} \ + -f release_tag=${{ needs.get-tag.outputs.tag }} \ + -f artifact="${{ env.ARTIFACT_NAME }}" \ + -f env_description="${{ matrix.env_description }}" \ + -f test_type="e2e" \ + --repo woocommerce/woocommerce-test-reports From ad8d2f9b445e4a0793bc74594cc20bf45900931f Mon Sep 17 00:00:00 2001 From: rodelgc Date: Fri, 17 Mar 2023 20:31:10 +0800 Subject: [PATCH 1088/1680] More readable artifact names --- .github/workflows/smoke-test-release.yml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 1390e39d2e6..e68183353ca 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -12,9 +12,8 @@ concurrency: cancel-in-progress: true permissions: {} env: - E2E_WP_LATEST_ARTIFACT: e2e-wp-latest--run-${{ github.run_number }} - E2E_UPDATE_WC_ARTIFACT: e2e-update-wc--run-${{ github.run_number }} - FORCE_COLOR: 1 + E2E_WP_LATEST_ARTIFACT: E2E test on release smoke test site with WP Latest (run-${{ github.run_number }}) + E2E_UPDATE_WC_ARTIFACT: WooCommerce version update test on release smoke test site (run-${{ github.run_number }}) jobs: get-tag: @@ -132,7 +131,7 @@ jobs: env: ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/api-test-report/allure-report ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/api-test-report/allure-results - API_WP_LATEST_ARTIFACT: api-wp-latest--run-${{ github.run_number }} + API_WP_LATEST_ARTIFACT: API test on release smoke test site with WP Latest (run-${{ github.run_number }}) steps: - uses: actions/checkout@v3 @@ -318,10 +317,10 @@ jobs: env: API_ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/api/allure-report API_ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/api/allure-results - API_WP_LATEST_X_ARTIFACT: api-${{ matrix.version.env_description }}--run-${{ github.run_number }} + API_WP_LATEST_X_ARTIFACT: API test on wp-env with WordPress ${{ matrix.version.number }} (run ${{ github.run_number }}) E2E_ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/e2e/allure-report E2E_ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/e2e/allure-results - E2E_WP_LATEST_X_ARTIFACT: e2e-${{ matrix.version.env_description }}--run-${{ github.run_number }} + E2E_WP_LATEST_X_ARTIFACT: E2E test on wp-env with WordPress ${{ matrix.version.number }} (run ${{ github.run_number }}) permissions: contents: read steps: @@ -449,10 +448,10 @@ jobs: env: API_ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/test-results/allure-report API_ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/test-results/allure-results - API_ARTIFACT: api-php-${{ matrix.php_version }}--run-${{ github.run_number }} + API_ARTIFACT: API test on wp-env with PHP ${{ matrix.php_version }} (run ${{ github.run_number }}) E2E_ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/allure-report E2E_ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/allure-results - E2E_ARTIFACT: e2e-php-${{ matrix.php_version }}--run-${{ github.run_number }} + E2E_ARTIFACT: E2E test on wp-env with PHP ${{ matrix.php_version }} (run ${{ github.run_number }}) steps: - name: Checkout uses: actions/checkout@v3 @@ -568,7 +567,7 @@ jobs: env: ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-results ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report - ARTIFACT_NAME: e2e-plugin-${{ matrix.plugin }} + ARTIFACT_NAME: E2E test on wp-env with ${{ matrix.plugin }} installed strategy: fail-fast: false matrix: From ffc5b911ee67a7afb0a54a085f6e97127b11da38 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Fri, 17 Mar 2023 10:11:06 -0400 Subject: [PATCH 1089/1680] Bypass scheduled actions for customer updates (#37265) * Bypass scheduler for customer update * Handle case when wc_last_active user meta doesn't exist at all * Bypass scheduler for wc_last_active customer update * Bypass scheduler for delete_user and remove_user_from_blog * Bypass scheduler for woocommerce_privacy_remove_order_personal_data * Bypass scheduler for woocommerce_new_customer * Remove obsolete test for last_active_update sync * Remove assertions for pending wc-admin_import_customers --- ...update-bypass-actions-for-customer-updates | 4 + .../Admin/API/Reports/Customers/DataStore.php | 84 +++++++++++ .../Admin/Schedulers/CustomersScheduler.php | 141 ------------------ .../unit-tests/woocommerce-admin/api-init.php | 22 --- .../woocommerce-admin/api/reports-import.php | 2 - 5 files changed, 88 insertions(+), 165 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates diff --git a/plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates b/plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates new file mode 100644 index 00000000000..51208715e95 --- /dev/null +++ b/plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates @@ -0,0 +1,4 @@ +Significance: patch +Type: performance + +Bypass Action Scheduler for customer updates. diff --git a/plugins/woocommerce/src/Admin/API/Reports/Customers/DataStore.php b/plugins/woocommerce/src/Admin/API/Reports/Customers/DataStore.php index e1ca489389a..18a4d7a8c4c 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/Customers/DataStore.php +++ b/plugins/woocommerce/src/Admin/API/Reports/Customers/DataStore.php @@ -84,7 +84,19 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { * Set up all the hooks for maintaining and populating table data. */ public static function init() { + add_action( 'woocommerce_new_customer', array( __CLASS__, 'update_registered_customer' ) ); + + add_action( 'woocommerce_update_customer', array( __CLASS__, 'update_registered_customer' ) ); add_action( 'profile_update', array( __CLASS__, 'update_registered_customer' ) ); + + add_action( 'added_user_meta', array( __CLASS__, 'update_registered_customer_via_last_active' ), 10, 3 ); + add_action( 'updated_user_meta', array( __CLASS__, 'update_registered_customer_via_last_active' ), 10, 3 ); + + add_action( 'delete_user', array( __CLASS__, 'delete_customer_by_user_id' ) ); + add_action( 'remove_user_from_blog', array( __CLASS__, 'delete_customer_by_user_id' ) ); + + add_action( 'woocommerce_privacy_remove_order_personal_data', array( __CLASS__, 'anonymize_customer' ) ); + add_action( 'woocommerce_analytics_delete_order_stats', array( __CLASS__, 'sync_on_order_delete' ), 15, 2 ); } @@ -775,6 +787,20 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { return $results; } + /** + * Update the database if the "last active" meta value was changed. + * Function expects to be hooked into the `added_user_meta` and `updated_user_meta` actions. + * + * @param int $meta_id ID of updated metadata entry. + * @param int $user_id ID of the user being updated. + * @param string $meta_key Meta key being updated. + */ + public static function update_registered_customer_via_last_active( $meta_id, $user_id, $meta_key ) { + if ( 'wc_last_active' === $meta_key ) { + self::update_registered_customer( $user_id ); + } + } + /** * Check if a user ID is a valid customer or other user role with past orders. * @@ -835,6 +861,11 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { public static function delete_customer_by_user_id( $user_id ) { global $wpdb; + if ( (int) $user_id < 1 || doing_action( 'wp_uninitialize_site' ) ) { + // Skip the deletion. + return; + } + $user_id = (int) $user_id; $num_deleted = $wpdb->delete( self::get_db_table_name(), array( 'user_id' => $user_id ) ); @@ -843,6 +874,59 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { } } + /** + * Anonymize the customer data for a single order. + * + * @internal + * @param int $order_id Order id. + * @return void + */ + public static function anonymize_customer( $order_id ) { + global $wpdb; + + $customer_id = $wpdb->get_var( + $wpdb->prepare( "SELECT customer_id FROM {$wpdb->prefix}wc_order_stats WHERE order_id = %d", $order_id ) + ); + + if ( ! $customer_id ) { + return; + } + + // Long form query because $wpdb->update rejects [deleted]. + $deleted_text = __( '[deleted]', 'woocommerce' ); + $updated = $wpdb->query( + $wpdb->prepare( + "UPDATE {$wpdb->prefix}wc_customer_lookup + SET + user_id = NULL, + username = %s, + first_name = %s, + last_name = %s, + email = %s, + country = '', + postcode = %s, + city = %s, + state = %s + WHERE + customer_id = %d", + array( + $deleted_text, + $deleted_text, + $deleted_text, + 'deleted@site.invalid', + $deleted_text, + $deleted_text, + $deleted_text, + $customer_id, + ) + ) + ); + // If the customer row was anonymized, flush the cache. + if ( $updated ) { + ReportsCache::invalidate(); + } + } + /** * Initialize query objects. */ diff --git a/plugins/woocommerce/src/Internal/Admin/Schedulers/CustomersScheduler.php b/plugins/woocommerce/src/Internal/Admin/Schedulers/CustomersScheduler.php index 4b8533d3efc..05bba2f5802 100644 --- a/plugins/woocommerce/src/Internal/Admin/Schedulers/CustomersScheduler.php +++ b/plugins/woocommerce/src/Internal/Admin/Schedulers/CustomersScheduler.php @@ -27,13 +27,6 @@ class CustomersScheduler extends ImportScheduler { * @internal */ public static function init() { - add_action( 'woocommerce_new_customer', array( __CLASS__, 'schedule_import' ) ); - add_action( 'woocommerce_update_customer', array( __CLASS__, 'schedule_import' ) ); - add_action( 'updated_user_meta', array( __CLASS__, 'schedule_import_via_last_active' ), 10, 3 ); - add_action( 'woocommerce_privacy_remove_order_personal_data', array( __CLASS__, 'schedule_anonymize' ) ); - add_action( 'delete_user', array( __CLASS__, 'schedule_user_delete' ) ); - add_action( 'remove_user_from_blog', array( __CLASS__, 'schedule_user_delete' ) ); - CustomersDataStore::init(); parent::init(); } @@ -47,8 +40,6 @@ class CustomersScheduler extends ImportScheduler { public static function get_dependencies() { return array( 'delete_batch_init' => OrdersScheduler::get_action( 'delete_batch_init' ), - 'anonymize' => self::get_action( 'import' ), - 'delete_user' => self::get_action( 'import' ), ); } @@ -120,74 +111,6 @@ class CustomersScheduler extends ImportScheduler { return $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->prefix}wc_customer_lookup" ); } - /** - * Get all available scheduling actions. - * Used to determine action hook names and clear events. - * - * @internal - * @return array - */ - public static function get_scheduler_actions() { - $actions = parent::get_scheduler_actions(); - $actions['anonymize'] = 'wc-admin_anonymize_' . static::$name; - $actions['delete_user'] = 'wc-admin_delete_user_' . static::$name; - return $actions; - } - - /** - * Schedule import. - * - * @internal - * @param int $user_id User ID. - * @return void - */ - public static function schedule_import( $user_id ) { - self::schedule_action( 'import', array( $user_id ) ); - } - - /** - * Schedule an import if the "last active" meta value was changed. - * Function expects to be hooked into the `updated_user_meta` action. - * - * @internal - * @param int $meta_id ID of updated metadata entry. - * @param int $user_id ID of the user being updated. - * @param string $meta_key Meta key being updated. - */ - public static function schedule_import_via_last_active( $meta_id, $user_id, $meta_key ) { - if ( 'wc_last_active' === $meta_key ) { - self::schedule_import( $user_id ); - } - } - - /** - * Schedule an action to anonymize a single Order. - * - * @internal - * @param WC_Order $order Order object. - * @return void - */ - public static function schedule_anonymize( $order ) { - if ( is_a( $order, 'WC_Order' ) ) { - // Postpone until any pending updates are completed. - self::schedule_action( 'anonymize', array( $order->get_id() ) ); - } - } - - /** - * Schedule an action to delete a single User. - * - * @internal - * @param int $user_id User ID. - * @return void - */ - public static function schedule_user_delete( $user_id ) { - if ( (int) $user_id > 0 && ! doing_action( 'wp_uninitialize_site' ) ) { - // Postpone until any pending updates are completed. - self::schedule_action( 'delete_user', array( $user_id ) ); - } - } - /** * Imports a single customer. * @@ -220,68 +143,4 @@ class CustomersScheduler extends ImportScheduler { CustomersDataStore::delete_customer( $customer_id ); } } - - /** - * Anonymize the customer data for a single order. - * - * @internal - * @param int $order_id Order id. - * @return void - */ - public static function anonymize( $order_id ) { - global $wpdb; - - $customer_id = $wpdb->get_var( - $wpdb->prepare( "SELECT customer_id FROM {$wpdb->prefix}wc_order_stats WHERE order_id = %d", $order_id ) - ); - - if ( ! $customer_id ) { - return; - } - - // Long form query because $wpdb->update rejects [deleted]. - $deleted_text = __( '[deleted]', 'woocommerce' ); - $updated = $wpdb->query( - $wpdb->prepare( - "UPDATE {$wpdb->prefix}wc_customer_lookup - SET - user_id = NULL, - username = %s, - first_name = %s, - last_name = %s, - email = %s, - country = '', - postcode = %s, - city = %s, - state = %s - WHERE - customer_id = %d", - array( - $deleted_text, - $deleted_text, - $deleted_text, - 'deleted@site.invalid', - $deleted_text, - $deleted_text, - $deleted_text, - $customer_id, - ) - ) - ); - // If the customer row was anonymized, flush the cache. - if ( $updated ) { - ReportsCache::invalidate(); - } - } - - /** - * Delete the customer data for a single user. - * - * @internal - * @param int $user_id User ID. - * @return void - */ - public static function delete_user( $user_id ) { - CustomersDataStore::delete_customer_by_user_id( $user_id ); - } } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api-init.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api-init.php index ed6812b89e6..ff2855420f8 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api-init.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api-init.php @@ -104,26 +104,4 @@ class WC_Admin_Tests_API_Init extends WC_REST_Unit_Test_Case { $this->assertEmpty( $this->queue->actions ); } - - /** - * Test that updating wc_last_active triggers a customer sync. - * - * @return void - */ - public function test_other_last_active_update_customer_sync() { - // First call creates the meta key. - // These don't use wc_update_user_last_active() because the timestamps will be the same. - update_user_meta( 1, 'wc_last_active', time() - 10 ); - // Second call updates it which triggers the sync. - update_user_meta( 1, 'wc_last_active', time() ); - - $this->assertCount( 1, $this->queue->actions ); - $this->assertArraySubset( - array( - 'hook' => CustomersScheduler::get_action( 'import' ), - 'args' => array( 1 ), - ), - $this->queue->actions[0] - ); - } } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/reports-import.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/reports-import.php index b4a78652004..8aac4611d0b 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/reports-import.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/api/reports-import.php @@ -207,7 +207,6 @@ class WC_Admin_Tests_API_Reports_Import extends WC_REST_Unit_Test_Case { $pending_actions ); $this->assertContains( 'wc-admin_import_orders', $pending_hooks ); - $this->assertContains( 'wc-admin_import_customers', $pending_hooks ); // Cancel outstanding actions. $request = new WP_REST_Request( 'POST', $this->endpoint . '/cancel' ); @@ -226,7 +225,6 @@ class WC_Admin_Tests_API_Reports_Import extends WC_REST_Unit_Test_Case { $pending_actions ); $this->assertNotContains( 'wc-admin_import_orders', $pending_hooks ); - $this->assertNotContains( 'wc-admin_import_customers', $pending_hooks ); } /** From a4c9e471b2d298d682144936ec4acc514b24382f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 10:11:46 -0500 Subject: [PATCH 1090/1680] Delete changelog files based on PR 37277 (#37294) Delete changelog files for 37277 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta diff --git a/plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta b/plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta deleted file mode 100644 index f076bd36dea..00000000000 --- a/plugins/woocommerce/changelog/fix-stop-alters-from-dbdelta +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Update column definitions with synonymous types to prevent dbDelta from trying to ALTER them on each install. From 14675be4f09ac0b85b53113a2a762c43f39119ea Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Mar 2023 10:14:18 -0500 Subject: [PATCH 1091/1680] Delete changelog files based on PR 36871 (#37297) Delete changelog files for 36871 Co-authored-by: WooCommerce Bot --- .../woocommerce/changelog/fix-36855-qty-selector-in-variables | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-36855-qty-selector-in-variables diff --git a/plugins/woocommerce/changelog/fix-36855-qty-selector-in-variables b/plugins/woocommerce/changelog/fix-36855-qty-selector-in-variables deleted file mode 100644 index 1f55fad5c17..00000000000 --- a/plugins/woocommerce/changelog/fix-36855-qty-selector-in-variables +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix no enforcing of min/max limits in quantity selector of variable products. From e370f25c0c07e5c468c519c2158fbee9f7edfaca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Fri, 17 Mar 2023 13:21:15 -0300 Subject: [PATCH 1092/1680] Add a product header component to the blocks interface (#37152) * Add button and saving logic * Add comment suggestions * Add changelog files * Add comment suggestions * Set header title to product name if the name field is dirty otherwise the default title value * Navigate to EditProductPage after creating the product succesfully * Add get-header-title util and expose edited product name from useSelect --- .../js/product-editor/changelog/add-37005 | 4 + .../src/components/editor/editor.tsx | 10 ++- .../src/components/header/header.tsx | 77 ++++++++++++++++++- .../src/components/header/style.scss | 4 + .../js/product-editor/src/utils/constants.ts | 1 + .../src/utils/get-header-title.ts | 35 +++++++++ .../src/utils/get-product-title.ts | 5 +- packages/js/product-editor/src/utils/index.ts | 5 +- .../client/products/product-page.tsx | 27 ++++--- plugins/woocommerce/changelog/add-37005 | 4 + 10 files changed, 154 insertions(+), 18 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37005 create mode 100644 packages/js/product-editor/src/utils/get-header-title.ts create mode 100644 plugins/woocommerce/changelog/add-37005 diff --git a/packages/js/product-editor/changelog/add-37005 b/packages/js/product-editor/changelog/add-37005 new file mode 100644 index 00000000000..2b45e42e13d --- /dev/null +++ b/packages/js/product-editor/changelog/add-37005 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add a product header component to the blocks interface diff --git a/packages/js/product-editor/src/components/editor/editor.tsx b/packages/js/product-editor/src/components/editor/editor.tsx index ea6ef097811..b789f2539bf 100644 --- a/packages/js/product-editor/src/components/editor/editor.tsx +++ b/packages/js/product-editor/src/components/editor/editor.tsx @@ -12,7 +12,6 @@ import { Product } from '@woocommerce/data'; // @ts-ignore No types for this exist yet. // eslint-disable-next-line @woocommerce/dependency-group import { EntityProvider } from '@wordpress/core-data'; - // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore No types for this exist yet. // eslint-disable-next-line @woocommerce/dependency-group @@ -30,9 +29,11 @@ import { BlockEditor } from '../block-editor'; import { initBlocks } from './init-blocks'; initBlocks(); + export type ProductEditorSettings = Partial< EditorSettings & EditorBlockListSettings >; + type EditorProps = { product: Product; settings: ProductEditorSettings | undefined; @@ -46,7 +47,12 @@ export function Editor( { product, settings }: EditorProps ) { } + header={ +
    + } content={ { + const { isSavingEntityRecord, getEditedEntityRecord } = + select( 'core' ); + const { isPostSavingLocked } = select( 'core/editor' ); + + const product: Product = getEditedEntityRecord( + 'postType', + 'product', + productId + ); + + return { + isProductLocked: isPostSavingLocked(), + isSaving: isSavingEntityRecord( + 'postType', + 'product', + productId + ), + editedProductName: product?.name, + }; + }, + [ productId ] + ); + + const isDisabled = isProductLocked || isSaving; + const isCreating = productName === AUTO_DRAFT_NAME; + + const { saveEditedEntityRecord } = useDispatch( 'core' ); + + function handleSave() { + saveEditedEntityRecord< Product >( + 'postType', + 'product', + productId + ).then( ( response ) => { + if ( isCreating ) { + navigateTo( { + url: getNewPath( {}, `/product/${ response.id }` ), + } ); + } + } ); + } + return (
    -

    { title }

    +

    + { getHeaderTitle( editedProductName, productName ) } +

    + +
    + +
    ); } diff --git a/packages/js/product-editor/src/components/header/style.scss b/packages/js/product-editor/src/components/header/style.scss index 79b59a277ad..a91b0280e7c 100644 --- a/packages/js/product-editor/src/components/header/style.scss +++ b/packages/js/product-editor/src/components/header/style.scss @@ -3,4 +3,8 @@ display: flex; align-items: center; padding: 0 $gap; + + &__actions { + margin-left: auto; + } } diff --git a/packages/js/product-editor/src/utils/constants.ts b/packages/js/product-editor/src/utils/constants.ts index 0aa72fd516a..6c0b603d436 100644 --- a/packages/js/product-editor/src/utils/constants.ts +++ b/packages/js/product-editor/src/utils/constants.ts @@ -7,3 +7,4 @@ export const ADD_NEW_SHIPPING_CLASS_OPTION_VALUE = export const UNCATEGORIZED_CATEGORY_SLUG = 'uncategorized'; export const PRODUCT_VARIATION_TITLE_LIMIT = 32; export const STANDARD_RATE_TAX_CLASS_SLUG = 'standard'; +export const AUTO_DRAFT_NAME = 'AUTO-DRAFT'; diff --git a/packages/js/product-editor/src/utils/get-header-title.ts b/packages/js/product-editor/src/utils/get-header-title.ts new file mode 100644 index 00000000000..a0c6d712855 --- /dev/null +++ b/packages/js/product-editor/src/utils/get-header-title.ts @@ -0,0 +1,35 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import { AUTO_DRAFT_NAME } from './constants'; + +/** + * Get the header title using the product name. + * + * @param editedProductName Name value entered for the product. + * @param initialProductName Name already persisted to the database. + * @return The new title + */ +export const getHeaderTitle = ( + editedProductName: string, + initialProductName: string +): string => { + const isProductNameNotEmpty = Boolean( editedProductName ); + const isProductNameDirty = editedProductName !== initialProductName; + const isCreating = initialProductName === AUTO_DRAFT_NAME; + + if ( isProductNameNotEmpty && isProductNameDirty ) { + return editedProductName; + } + + if ( isCreating ) { + return __( 'Add new product', 'woocommerce' ); + } + + return initialProductName; +}; diff --git a/packages/js/product-editor/src/utils/get-product-title.ts b/packages/js/product-editor/src/utils/get-product-title.ts index 2f92e9d81b9..dc090527ca0 100644 --- a/packages/js/product-editor/src/utils/get-product-title.ts +++ b/packages/js/product-editor/src/utils/get-product-title.ts @@ -3,7 +3,10 @@ */ import { __ } from '@wordpress/i18n'; -export const AUTO_DRAFT_NAME = 'AUTO-DRAFT'; +/** + * Internal dependencies + */ +import { AUTO_DRAFT_NAME } from './constants'; /** * Get the product title for use in the header. diff --git a/packages/js/product-editor/src/utils/index.ts b/packages/js/product-editor/src/utils/index.ts index b2ddb029f36..67a0014effc 100644 --- a/packages/js/product-editor/src/utils/index.ts +++ b/packages/js/product-editor/src/utils/index.ts @@ -1,16 +1,18 @@ /** * Internal dependencies */ +import { AUTO_DRAFT_NAME } from './constants'; import { formatCurrencyDisplayValue } from './format-currency-display-value'; import { getCheckboxTracks } from './get-checkbox-tracks'; import { getCurrencySymbolProps } from './get-currency-symbol-props'; import { getDerivedProductType } from './get-derived-product-type'; +import { getHeaderTitle } from './get-header-title'; import { getProductStatus, PRODUCT_STATUS_LABELS } from './get-product-status'; import { getProductStockStatus, getProductStockStatusClass, } from './get-product-stock-status'; -import { getProductTitle, AUTO_DRAFT_NAME } from './get-product-title'; +import { getProductTitle } from './get-product-title'; import { getProductVariationTitle, getTruncatedProductVariationTitle, @@ -27,6 +29,7 @@ export { getCheckboxTracks, getCurrencySymbolProps, getDerivedProductType, + getHeaderTitle, getProductStatus, getProductStockStatus, getProductStockStatusClass, diff --git a/plugins/woocommerce-admin/client/products/product-page.tsx b/plugins/woocommerce-admin/client/products/product-page.tsx index 5f3eb9873c8..e0f14f8e358 100644 --- a/plugins/woocommerce-admin/client/products/product-page.tsx +++ b/plugins/woocommerce-admin/client/products/product-page.tsx @@ -34,18 +34,23 @@ const ProductEditor: React.FC< { product: Product | undefined } > = ( { ); }; -const EditProductEditor: React.FC< { productId: string } > = ( { +const EditProductEditor: React.FC< { productId: number } > = ( { productId, } ) => { - const { product } = useSelect( ( select: typeof WPSelect ) => { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore Missing types. - const { getEditedEntityRecord } = select( 'core' ); + const { product } = useSelect( + ( select: typeof WPSelect ) => { + const { getEntityRecord } = select( 'core' ); - return { - product: getEditedEntityRecord( 'postType', 'product', productId ), - }; - } ); + return { + product: getEntityRecord( + 'postType', + 'product', + productId + ) as Product, + }; + }, + [ productId ] + ); return ; }; @@ -74,7 +79,9 @@ export default function ProductPage() { const { productId } = useParams(); if ( productId ) { - return ; + return ( + + ); } return ; diff --git a/plugins/woocommerce/changelog/add-37005 b/plugins/woocommerce/changelog/add-37005 new file mode 100644 index 00000000000..3b84f6b28ff --- /dev/null +++ b/plugins/woocommerce/changelog/add-37005 @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Add productId dependency when getting the product by id in ProductPage From bd0da16eab22ff190fd5e5f38f8d7e2117f517b8 Mon Sep 17 00:00:00 2001 From: Michael Pretty Date: Fri, 17 Mar 2023 12:15:53 -0400 Subject: [PATCH 1093/1680] Replace information_schema queries in wc-update-functions.php with create table searches Partially fixes #37276 --- .../includes/wc-update-functions.php | 52 +++++++------------ 1 file changed, 20 insertions(+), 32 deletions(-) diff --git a/plugins/woocommerce/includes/wc-update-functions.php b/plugins/woocommerce/includes/wc-update-functions.php index 0fe137d07a1..681dbb52e49 100644 --- a/plugins/woocommerce/includes/wc-update-functions.php +++ b/plugins/woocommerce/includes/wc-update-functions.php @@ -1843,18 +1843,14 @@ function wc_update_340_db_version() { function wc_update_343_cleanup_foreign_keys() { global $wpdb; - $results = $wpdb->get_results( - "SELECT CONSTRAINT_NAME - FROM information_schema.TABLE_CONSTRAINTS - WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}' - AND CONSTRAINT_NAME LIKE '%wc_download_log_ib%' - AND CONSTRAINT_TYPE = 'FOREIGN KEY' - AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'" - ); + $create_table_sql = $wpdb->get_var( "SHOW CREATE TABLE {$wpdb->prefix}wc_download_log", 1 ); - if ( $results ) { - foreach ( $results as $fk ) { - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY {$fk->CONSTRAINT_NAME}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + if ( ! empty( $create_table_sql ) ) { + // Extract and remove the foreign key constraints matching %wc_download_log_ib% + if ( preg_match_all( '/CONSTRAINT `([^`]*wc_download_log_ib[^`]*)` FOREIGN KEY/', $create_table_sql, $matches ) && ! empty( $matches[1] ) ) { + foreach ( $matches[1] as $foreign_key_name ) { + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY `{$foreign_key_name}`" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + } } } } @@ -1912,18 +1908,13 @@ function wc_update_350_db_version() { */ function wc_update_352_drop_download_log_fk() { global $wpdb; - $results = $wpdb->get_results( - "SELECT CONSTRAINT_NAME - FROM information_schema.TABLE_CONSTRAINTS - WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}' - AND CONSTRAINT_NAME = 'fk_wc_download_log_permission_id' - AND CONSTRAINT_TYPE = 'FOREIGN KEY' - AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'" - ); - // We only need to drop the old key as WC_Install::create_tables() takes care of creating the new FK. - if ( $results ) { - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY fk_wc_download_log_permission_id" ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared + $create_table_sql = $wpdb->get_var( "SHOW CREATE TABLE {$wpdb->prefix}wc_download_log", 1 ); + + if ( ! empty( $create_table_sql ) ) { + if ( strpos( $create_table_sql, 'CONSTRAINT `fk_wc_download_log_permission_id` FOREIGN KEY' ) !== false ) { + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY fk_wc_download_log_permission_id" ); // phpcs:ignore WordPress.WP.PreparedSQL.NotPrepared + } } } @@ -2451,17 +2442,14 @@ function wc_update_670_purge_comments_count_cache() { function wc_update_700_remove_download_log_fk() { global $wpdb; - $results = $wpdb->get_results( - "SELECT CONSTRAINT_NAME - FROM information_schema.TABLE_CONSTRAINTS - WHERE CONSTRAINT_SCHEMA = '{$wpdb->dbname}' - AND CONSTRAINT_TYPE = 'FOREIGN KEY' - AND TABLE_NAME = '{$wpdb->prefix}wc_download_log'" - ); + $create_table_sql = $wpdb->get_var( "SHOW CREATE TABLE {$wpdb->prefix}wc_download_log", 1 ); - if ( $results ) { - foreach ( $results as $fk ) { - $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY {$fk->CONSTRAINT_NAME}" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + if ( ! empty( $create_table_sql ) ) { + // Extract the foreign key constraints + if ( preg_match_all( '/CONSTRAINT `([^`]*)` FOREIGN KEY/', $create_table_sql, $matches ) && ! empty( $matches[1] ) ) { + foreach ( $matches[1] as $foreign_key_name ) { + $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY `{$foreign_key_name}`" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + } } } } From 00bf0760be167ee724664bc1e6122a477d568228 Mon Sep 17 00:00:00 2001 From: Michael Pretty Date: Fri, 17 Mar 2023 12:29:50 -0400 Subject: [PATCH 1094/1680] Update changelog --- .../changelog/fix-37276-remove-information-schema-queries | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-37276-remove-information-schema-queries diff --git a/plugins/woocommerce/changelog/fix-37276-remove-information-schema-queries b/plugins/woocommerce/changelog/fix-37276-remove-information-schema-queries new file mode 100644 index 00000000000..eb03b735fd3 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-37276-remove-information-schema-queries @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Replace information_schema queries in favor of create table parsing to remove foreign key constraints during updates From 1aaa26e07d2cb62e1bbff1876b56cecbe4a20889 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 18 Mar 2023 00:47:54 +0800 Subject: [PATCH 1095/1680] Reload installed extensions data after installing recommended channels. This is because the channel may not have registered itself as a marketing channel and it should show up in the Installed extensions card. --- .../components/PluginCardBody/SmartPluginCardBody.tsx | 4 ++-- .../CreateNewCampaignModal/CreateNewCampaignModal.tsx | 9 +++++++-- .../overview-multichannel/Channels/Channels.tsx | 2 +- .../MarketingOverviewMultichannel.tsx | 7 +++++-- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/components/PluginCardBody/SmartPluginCardBody.tsx b/plugins/woocommerce-admin/client/marketing/components/PluginCardBody/SmartPluginCardBody.tsx index 32262e7139c..76cf16f01aa 100644 --- a/plugins/woocommerce-admin/client/marketing/components/PluginCardBody/SmartPluginCardBody.tsx +++ b/plugins/woocommerce-admin/client/marketing/components/PluginCardBody/SmartPluginCardBody.tsx @@ -21,7 +21,7 @@ import './PluginCardBody.scss'; type SmartPluginCardBodyProps = { plugin: RecommendedPlugin; - onInstalledAndActivated?: () => void; + onInstalledAndActivated?: ( pluginSlug: string ) => void; }; /** @@ -62,7 +62,7 @@ export const SmartPluginCardBody = ( { plugin.product, ] ); - onInstalledAndActivated(); + onInstalledAndActivated( plugin.product ); createNoticesFromResponse( response ); } catch ( error ) { createNoticesFromResponse( error ); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx index 8bfcac186ef..3a3b5c20a9e 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx @@ -21,6 +21,7 @@ import { useRecommendedChannels, useCampaignTypes, useRegisteredChannels, + useInstalledPlugins, } from '~/marketing/hooks'; import { SmartPluginCardBody } from '~/marketing/components'; import './CreateNewCampaignModal.scss'; @@ -43,10 +44,12 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { useCampaignTypes(); const { refetch: refetchRegisteredChannels } = useRegisteredChannels(); const { data: recommendedChannels } = useRecommendedChannels(); + const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); - const refetch = () => { + const onInstalledAndActivated = ( pluginSlug: string ) => { refetchCampaignTypes(); refetchRegisteredChannels(); + loadInstalledPluginsAfterActivation( pluginSlug ); }; return ( @@ -143,7 +146,9 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { ) ) } diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx index 992726a366f..3d3f7ddc6ea 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx @@ -29,7 +29,7 @@ import './Channels.scss'; type ChannelsProps = { registeredChannels: Array< RegisteredChannel >; recommendedChannels: Array< RecommendedChannel >; - onInstalledAndActivated?: () => void; + onInstalledAndActivated?: ( pluginSlug: string ) => void; }; export const Channels: React.FC< ChannelsProps > = ( { diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index 3922d1cba32..54f01596ca6 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -13,6 +13,7 @@ import { useRegisteredChannels, useRecommendedChannels, useCampaignTypes, + useInstalledPlugins, } from '~/marketing/hooks'; import { getAdminSetting } from '~/utils/admin-settings'; import { Campaigns } from './Campaigns'; @@ -35,6 +36,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { } = useRegisteredChannels(); const { loading: loadingRecommended, data: dataRecommended } = useRecommendedChannels(); + const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); const { currentUserCan } = useUser(); if ( @@ -49,9 +51,10 @@ export const MarketingOverviewMultichannel: React.FC = () => { getAdminSetting( 'allowMarketplaceSuggestions', false ) && currentUserCan( 'install_plugins' ); - const refetch = () => { + const onInstalledAndActivated = ( pluginSlug: string ) => { refetchCampaignTypes(); refetchRegisteredChannels(); + loadInstalledPluginsAfterActivation( pluginSlug ); }; return ( @@ -62,7 +65,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { ) } From ffc36d808c783be861d72f0eadc721ae7f4403a7 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 18 Mar 2023 00:52:04 +0800 Subject: [PATCH 1096/1680] Add changelog. --- .../feature-37127-marketing-reload-installed-extensions | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-37127-marketing-reload-installed-extensions diff --git a/plugins/woocommerce/changelog/feature-37127-marketing-reload-installed-extensions b/plugins/woocommerce/changelog/feature-37127-marketing-reload-installed-extensions new file mode 100644 index 00000000000..932bb4a3710 --- /dev/null +++ b/plugins/woocommerce/changelog/feature-37127-marketing-reload-installed-extensions @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Refetch data for "Installed extensions" card after installing a recommended marketing channel. From 345ad589198b495ac16628906f394c612af02d27 Mon Sep 17 00:00:00 2001 From: louwie17 Date: Fri, 17 Mar 2023 14:03:10 -0300 Subject: [PATCH 1097/1680] Add product pricing block (#37211) * Adding initial pricing block * Have price block render in form * Make sure price is loaded correctly and fix template rendering * Make pricing block abstract and add list and sale price to template * Add changelogs * Revert changes in wc/data package * Fix lint issues * Fix type error * Add styling * Fix styling lint issues * Revert config change missed in rebase * Make use of base control help text for field info * Allow additional callbacks for onFocus and onKeyUp --- .../add-37098_add_product_list_price_block | 4 + packages/js/product-editor/package.json | 1 + .../src/components/editor/init-blocks.ts | 8 + .../src/components/pricing-block/block.json | 29 + .../src/components/pricing-block/edit.tsx | 89 + .../src/components/pricing-block/index.ts | 17 + packages/js/product-editor/src/hooks/index.ts | 1 + .../src/hooks/use-currency-input-props.ts | 77 + .../src/utils/get-product-stock-status.ts | 8 +- .../js/product-editor/typings/global.d.ts | 1 - packages/js/product-editor/typings/index.d.ts | 18 + .../client/products/product-block-page.scss | 47 + .../client/products/product-page.tsx | 1 + .../add-37098_add_product_list_price_block | 4 + .../includes/class-wc-post-types.php | 37 + pnpm-lock.yaml | 2237 ++++++++++------- 16 files changed, 1685 insertions(+), 894 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37098_add_product_list_price_block create mode 100644 packages/js/product-editor/src/components/pricing-block/block.json create mode 100644 packages/js/product-editor/src/components/pricing-block/edit.tsx create mode 100644 packages/js/product-editor/src/components/pricing-block/index.ts create mode 100644 packages/js/product-editor/src/hooks/use-currency-input-props.ts create mode 100644 packages/js/product-editor/typings/index.d.ts create mode 100644 plugins/woocommerce-admin/client/products/product-block-page.scss create mode 100644 plugins/woocommerce/changelog/add-37098_add_product_list_price_block diff --git a/packages/js/product-editor/changelog/add-37098_add_product_list_price_block b/packages/js/product-editor/changelog/add-37098_add_product_list_price_block new file mode 100644 index 00000000000..6ee3c274aa8 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37098_add_product_list_price_block @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add new pricing block to the product editor package. diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index 677e915c674..ee99b501d5b 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -36,6 +36,7 @@ "@woocommerce/data": "workspace:^4.1.0", "@woocommerce/navigation": "workspace:^8.1.0", "@woocommerce/number": "workspace:*", + "@woocommerce/settings": "^1.0.0", "@woocommerce/tracks": "workspace:^1.3.0", "@wordpress/block-editor": "^9.8.0", "@wordpress/blocks": "^12.3.0", diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index c91b20202e3..3072621d8ce 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -1,12 +1,20 @@ +/** + * External dependencies + */ +import { registerCoreBlocks } from '@wordpress/block-library'; + /** * Internal dependencies */ import { init as initName } from '../details-name-block'; import { init as initSection } from '../section'; import { init as initTab } from '../tab'; +import { init as initPricing } from '../pricing-block'; export const initBlocks = () => { + registerCoreBlocks(); initName(); initSection(); initTab(); + initPricing(); }; diff --git a/packages/js/product-editor/src/components/pricing-block/block.json b/packages/js/product-editor/src/components/pricing-block/block.json new file mode 100644 index 00000000000..9ca3884ba5f --- /dev/null +++ b/packages/js/product-editor/src/components/pricing-block/block.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-pricing", + "description": "A product price block with currency display.", + "title": "Product pricing", + "category": "widgets", + "keywords": [ "products", "price" ], + "textdomain": "default", + "attributes": { + "name": { + "type": "string" + }, + "label": { + "type": "string" + }, + "showPricingSection": { + "type": "boolean" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": false, + "reusable": false, + "inserter": false, + "lock": false + } +} diff --git a/packages/js/product-editor/src/components/pricing-block/edit.tsx b/packages/js/product-editor/src/components/pricing-block/edit.tsx new file mode 100644 index 00000000000..b9b01ed1445 --- /dev/null +++ b/packages/js/product-editor/src/components/pricing-block/edit.tsx @@ -0,0 +1,89 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { createElement, useContext, Fragment } from '@wordpress/element'; +import interpolateComponents from '@automattic/interpolate-components'; +import { Link } from '@woocommerce/components'; +import { useBlockProps } from '@wordpress/block-editor'; +import { useEntityProp } from '@wordpress/core-data'; +import { BlockAttributes } from '@wordpress/blocks'; +import { CurrencyContext } from '@woocommerce/currency'; +import { getSetting } from '@woocommerce/settings'; +import { recordEvent } from '@woocommerce/tracks'; +import { + BaseControl, + // @ts-expect-error `__experimentalInputControl` does exist. + __experimentalInputControl as InputControl, +} from '@wordpress/components'; + +/** + * Internal dependencies + */ +import { formatCurrencyDisplayValue } from '../../utils'; +import { useCurrencyInputProps } from '../../hooks/use-currency-input-props'; + +export function Edit( { attributes }: { attributes: BlockAttributes } ) { + const blockProps = useBlockProps(); + const { name, label, showPricingSection = false } = attributes; + const [ regularPrice, setRegularPrice ] = useEntityProp< string >( + 'postType', + 'product', + name + ); + const context = useContext( CurrencyContext ); + const { getCurrencyConfig, formatAmount } = context; + const currencyConfig = getCurrencyConfig(); + const inputProps = useCurrencyInputProps( { + value: regularPrice, + setValue: setRegularPrice, + } ); + + const taxSettingsElement = showPricingSection + ? interpolateComponents( { + mixedString: __( + 'Manage more settings in {{link}}Pricing.{{/link}}', + 'woocommerce' + ), + components: { + link: ( + { + recordEvent( + 'product_pricing_list_price_help_tax_settings_click' + ); + } } + > + <> + + ), + }, + } ) + : null; + + return ( +
    + + + +
    + ); +} diff --git a/packages/js/product-editor/src/components/pricing-block/index.ts b/packages/js/product-editor/src/components/pricing-block/index.ts new file mode 100644 index 00000000000..f0c73e48b2b --- /dev/null +++ b/packages/js/product-editor/src/components/pricing-block/index.ts @@ -0,0 +1,17 @@ +/** + * Internal dependencies + */ +import { initBlock } from '../../utils'; +import metadata from './block.json'; +import { Edit } from './edit'; + +const { name } = metadata; + +export { metadata, name }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export const init = () => initBlock( { name, metadata, settings } ); diff --git a/packages/js/product-editor/src/hooks/index.ts b/packages/js/product-editor/src/hooks/index.ts index 700bcf73864..6899f9e1335 100644 --- a/packages/js/product-editor/src/hooks/index.ts +++ b/packages/js/product-editor/src/hooks/index.ts @@ -1,2 +1,3 @@ export { useProductHelper as __experimentalUseProductHelper } from './use-product-helper'; export { useVariationsOrder as __experimentalUseVariationsOrder } from './use-variations-order'; +export { useCurrencyInputProps as __experimentalUseCurrencyInputProps } from './use-currency-input-props'; diff --git a/packages/js/product-editor/src/hooks/use-currency-input-props.ts b/packages/js/product-editor/src/hooks/use-currency-input-props.ts new file mode 100644 index 00000000000..da6b53d573a --- /dev/null +++ b/packages/js/product-editor/src/hooks/use-currency-input-props.ts @@ -0,0 +1,77 @@ +/** + * External dependencies + */ +import { CurrencyContext } from '@woocommerce/currency'; +import { useContext } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { useProductHelper } from './use-product-helper'; + +export type CurrencyInputProps = { + prefix: string; + className: string; + sanitize: ( value: string | number ) => string; + onFocus: ( event: React.FocusEvent< HTMLInputElement > ) => void; + onKeyUp: ( event: React.KeyboardEvent< HTMLInputElement > ) => void; +}; + +type Props = { + value: string; + setValue: ( value: string ) => void; + onFocus?: ( event: React.FocusEvent< HTMLInputElement > ) => void; + onKeyUp?: ( event: React.KeyboardEvent< HTMLInputElement > ) => void; +}; + +export const useCurrencyInputProps = ( { + value, + setValue, + onFocus, + onKeyUp, +}: Props ) => { + const { sanitizePrice } = useProductHelper(); + + const context = useContext( CurrencyContext ); + const { getCurrencyConfig } = context; + const currencyConfig = getCurrencyConfig(); + + const currencyInputProps: CurrencyInputProps = { + prefix: currencyConfig.symbol, + className: 'half-width-field components-currency-control', + sanitize: ( val: string | number ) => { + return sanitizePrice( String( val ) ); + }, + onFocus( event: React.FocusEvent< HTMLInputElement > ) { + // In some browsers like safari .select() function inside + // the onFocus event doesn't work as expected because it + // conflicts with onClick the first time user click the + // input. Using setTimeout defers the text selection and + // avoid the unexpected behaviour. + setTimeout( + function deferSelection( element: HTMLInputElement ) { + element.select(); + }, + 0, + event.currentTarget + ); + if ( onFocus ) { + onFocus( event ); + } + }, + onKeyUp( event: React.KeyboardEvent< HTMLInputElement > ) { + const amount = Number.parseFloat( sanitizePrice( value || '0' ) ); + const step = Number( event.currentTarget.step || '1' ); + if ( event.code === 'ArrowUp' ) { + setValue( String( amount + step ) ); + } + if ( event.code === 'ArrowDown' ) { + setValue( String( amount - step ) ); + } + if ( onKeyUp ) { + onKeyUp( event ); + } + }, + }; + return currencyInputProps; +}; diff --git a/packages/js/product-editor/src/utils/get-product-stock-status.ts b/packages/js/product-editor/src/utils/get-product-stock-status.ts index 88ba69a46eb..9cc8f5419f3 100644 --- a/packages/js/product-editor/src/utils/get-product-stock-status.ts +++ b/packages/js/product-editor/src/utils/get-product-stock-status.ts @@ -51,7 +51,9 @@ export const getProductStockStatus = ( } if ( product.stock_status ) { - return PRODUCT_STOCK_STATUS_LABELS[ product.stock_status ]; + return PRODUCT_STOCK_STATUS_LABELS[ + product.stock_status as PRODUCT_STOCK_STATUS_KEYS + ]; } return PRODUCT_STOCK_STATUS_LABELS.instock; @@ -77,6 +79,8 @@ export const getProductStockStatusClass = ( return PRODUCT_STOCK_STATUS_CLASSES.outofstock; } return product.stock_status - ? PRODUCT_STOCK_STATUS_CLASSES[ product.stock_status ] + ? PRODUCT_STOCK_STATUS_CLASSES[ + product.stock_status as PRODUCT_STOCK_STATUS_KEYS + ] : ''; }; diff --git a/packages/js/product-editor/typings/global.d.ts b/packages/js/product-editor/typings/global.d.ts index 69abbdeff5e..3a27ae17ad8 100644 --- a/packages/js/product-editor/typings/global.d.ts +++ b/packages/js/product-editor/typings/global.d.ts @@ -6,4 +6,3 @@ declare global { /*~ If your module exports nothing, you'll need this line. Otherwise, delete it */ export {}; - diff --git a/packages/js/product-editor/typings/index.d.ts b/packages/js/product-editor/typings/index.d.ts new file mode 100644 index 00000000000..fa38181628c --- /dev/null +++ b/packages/js/product-editor/typings/index.d.ts @@ -0,0 +1,18 @@ +declare module '@woocommerce/settings' { + export declare function getAdminLink( path: string ): string; + export declare function getSetting< T >( + name: string, + fallback?: unknown, + filter = ( val: unknown, fb: unknown ) => + typeof val !== 'undefined' ? val : fb + ): T; +} + +declare module '@wordpress/core-data' { + function useEntityProp< T = unknown >( + kind: string, + name: string, + prop: string, + id?: string + ): [ T, ( value: T ) => void, T ]; +} diff --git a/plugins/woocommerce-admin/client/products/product-block-page.scss b/plugins/woocommerce-admin/client/products/product-block-page.scss new file mode 100644 index 00000000000..9dc12e60198 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-block-page.scss @@ -0,0 +1,47 @@ +.woocommerce-product-block-editor { + .components-input-control { + &__prefix { + margin-left: $gap-smaller; + } + + &__suffix { + margin-right: $gap-smaller; + } + } + + .components-currency-control { + .components-input-control__prefix { + color: $gray-700; + } + + .components-input-control__input { + text-align: right; + } + } + + .woocommerce-product-form { + &__custom-label-input { + display: flex; + flex-direction: column; + + label { + display: block; + margin-bottom: $gap-smaller; + } + } + + &__optional-input { + color: $gray-700; + } + } + + .wp-block-columns { + gap: $gap-large; + } + + .wp-block-woocommerce-product-section { + > .block-editor-inner-blocks > .block-editor-block-list__layout > .wp-block:not(:first-child) { + margin-top: $gap-large; + } + } +} diff --git a/plugins/woocommerce-admin/client/products/product-page.tsx b/plugins/woocommerce-admin/client/products/product-page.tsx index e0f14f8e358..e62c91a6dce 100644 --- a/plugins/woocommerce-admin/client/products/product-page.tsx +++ b/plugins/woocommerce-admin/client/products/product-page.tsx @@ -16,6 +16,7 @@ import { useParams } from 'react-router-dom'; * Internal dependencies */ import './product-page.scss'; +import './product-block-page.scss'; declare const productBlockEditorSettings: ProductEditorSettings; diff --git a/plugins/woocommerce/changelog/add-37098_add_product_list_price_block b/plugins/woocommerce/changelog/add-37098_add_product_list_price_block new file mode 100644 index 00000000000..2a4844cfb48 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37098_add_product_list_price_block @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Update product template by adding the list price and sale price blocks. diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 326102f9788..c2072a9257a 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -387,6 +387,43 @@ class WC_Post_Types { 'name' => 'Product name', ), ), + array( + 'core/columns', + array(), + array( + array( + 'core/column', + array( + 'templateLock' => 'all', + ), + array( + array( + 'woocommerce/product-pricing', + array( + 'name' => 'regular_price', + 'label' => __( 'List price', 'woocommerce' ), + 'showPricingSection' => true, + ), + ), + ), + ), + array( + 'core/column', + array( + 'templateLock' => 'all', + ), + array( + array( + 'woocommerce/product-pricing', + array( + 'name' => 'sale_price', + 'label' => __( 'Sale price', 'woocommerce' ), + ), + ), + ), + ), + ), + ), ), ), ), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc2c32e5e75..19dfd5615bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1379,6 +1379,7 @@ importers: '@woocommerce/internal-style-build': workspace:* '@woocommerce/navigation': workspace:^8.1.0 '@woocommerce/number': workspace:* + '@woocommerce/settings': ^1.0.0 '@woocommerce/tracks': workspace:^1.3.0 '@wordpress/block-editor': ^9.8.0 '@wordpress/blocks': ^12.3.0 @@ -1424,6 +1425,7 @@ importers: '@woocommerce/data': link:../data '@woocommerce/navigation': link:../navigation '@woocommerce/number': link:../number + '@woocommerce/settings': 1.0.0 '@woocommerce/tracks': link:../tracks '@wordpress/block-editor': 9.8.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/blocks': 12.5.0_react@17.0.2 @@ -2674,7 +2676,6 @@ packages: /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/compat-data/7.19.3: resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} @@ -2817,7 +2818,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 - dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -2844,6 +2844,32 @@ packages: browserslist: 4.19.3 semver: 6.3.0 + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: false + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -2894,6 +2920,42 @@ packages: browserslist: 4.21.4 semver: 6.3.0 + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.16.12: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -3098,7 +3160,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.3 - dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -3177,7 +3238,6 @@ packages: '@babel/types': 7.19.3 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} @@ -3315,6 +3375,26 @@ packages: dependencies: '@babel/types': 7.19.3 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} @@ -3325,26 +3405,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3354,6 +3414,30 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 + dev: false + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} @@ -3366,30 +3450,6 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -3414,6 +3474,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} engines: {node: '>=6.9.0'} @@ -3442,21 +3530,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.16.12: - resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} engines: {node: '>=6.9.0'} @@ -3483,6 +3556,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} engines: {node: '>=6.9.0'} @@ -3507,19 +3606,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -3532,6 +3618,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.16.12: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} @@ -3546,34 +3660,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -3611,6 +3697,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} @@ -3622,28 +3730,6 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -3684,6 +3770,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} @@ -3695,28 +3803,6 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -3737,6 +3823,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} @@ -3748,28 +3856,6 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -3790,6 +3876,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} @@ -3801,28 +3909,6 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -3843,6 +3929,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} engines: {node: '>=6.9.0'} @@ -3863,17 +3971,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -3894,6 +3991,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} @@ -3905,28 +4024,6 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -3961,6 +4058,34 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.12.9 + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.12.9: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.16.12: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} engines: {node: '>=6.9.0'} @@ -3988,20 +4113,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} @@ -4025,6 +4136,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -4046,17 +4179,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 - dev: false - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -4078,6 +4200,30 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} engines: {node: '>=6.9.0'} @@ -4135,6 +4281,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.12.9: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.16.12: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.8: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} engines: {node: '>=6.9.0'} @@ -4148,32 +4320,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4186,6 +4332,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} engines: {node: '>=6.9.0'} @@ -4201,36 +4377,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4255,6 +4401,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -4850,6 +5018,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} engines: {node: '>=6.9.0'} @@ -4869,16 +5057,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -4901,6 +5079,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} engines: {node: '>=6.9.0'} @@ -4928,20 +5134,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -4964,6 +5156,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -4983,16 +5195,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -5011,6 +5213,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} engines: {node: '>=6.9.0'} @@ -5030,16 +5252,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -5066,6 +5278,44 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} engines: {node: '>=6.9.0'} @@ -5104,26 +5354,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} engines: {node: '>=6.9.0'} @@ -5152,6 +5382,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} engines: {node: '>=6.9.0'} @@ -5171,16 +5421,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -5199,6 +5439,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} @@ -5218,16 +5478,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.16.12: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.17.8: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -5247,6 +5497,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -5298,6 +5570,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} @@ -5308,26 +5600,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -5347,6 +5619,28 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -5368,17 +5662,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -5418,6 +5701,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} engines: {node: '>=6.9.0'} @@ -5437,16 +5740,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.16.12: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.17.8: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -5466,6 +5759,30 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -5489,18 +5806,6 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-function-name': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -5521,6 +5826,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} engines: {node: '>=6.9.0'} @@ -5540,16 +5865,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -5568,6 +5883,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -5587,16 +5922,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -5619,6 +5944,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} @@ -5633,34 +5986,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -5688,6 +6013,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} @@ -5716,21 +6071,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -5760,6 +6100,38 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.12.9: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.16.12: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} @@ -5776,38 +6148,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.12.9: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} engines: {node: '>=6.9.0'} @@ -5835,6 +6175,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} @@ -5848,32 +6214,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} @@ -5895,6 +6235,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + dev: false + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} engines: {node: '>=6.9.0'} @@ -5915,17 +6275,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.16.12: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.17.8: resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} @@ -5945,6 +6294,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} @@ -5955,26 +6324,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -5996,6 +6345,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -6021,19 +6396,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: false - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -6055,6 +6417,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} engines: {node: '>=6.9.0'} @@ -6102,6 +6484,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -6121,16 +6523,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -6302,6 +6694,26 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + regenerator-transform: 0.14.5 + dev: false + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} engines: {node: '>=6.9.0'} @@ -6312,28 +6724,6 @@ packages: regenerator-transform: 0.14.5 dev: true - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: true - - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: false - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -6353,6 +6743,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} @@ -6363,26 +6773,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -6416,9 +6806,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 + '@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.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -6433,9 +6823,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 + '@babel/helper-module-imports': 7.16.0 + '@babel/helper-plugin-utils': 7.14.5 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 semver: 6.3.0 @@ -6484,6 +6874,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} engines: {node: '>=6.9.0'} @@ -6503,16 +6913,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -6532,6 +6932,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: true + + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} engines: {node: '>=6.9.0'} @@ -6553,17 +6975,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: false - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -6583,6 +6994,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -6602,16 +7033,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -6630,6 +7051,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} engines: {node: '>=6.9.0'} @@ -6649,16 +7090,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -6677,6 +7108,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} @@ -6687,26 +7138,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -6778,6 +7209,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} @@ -6788,26 +7239,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.12.9: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.16.12: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.17.8: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -6827,6 +7258,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -6848,17 +7301,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -6958,28 +7400,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.12.9 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.12.9 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.12.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 @@ -6994,44 +7436,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.9 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.12.9 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.12.9 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.19.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.12.9 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7043,28 +7485,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.16.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.16.12 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.16.12 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.16.12 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.12 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 @@ -7079,44 +7521,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.12 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.16.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.16.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.16.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.16.12 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.16.12 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.19.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7421,6 +7863,13 @@ packages: pirates: 4.0.5 source-map-support: 0.5.20 + /@babel/runtime-corejs2/7.5.5: + resolution: {integrity: sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A==} + dependencies: + core-js: 2.6.12 + regenerator-runtime: 0.13.9 + dev: false + /@babel/runtime-corejs3/7.16.3: resolution: {integrity: sha512-IAdDC7T0+wEB4y2gbIL0uOXEYpiZEeuFUTVbdGq+UwCcF35T/tS8KrmMomEwEc5wBbyfH3PJVpTSUqrhPDXFcQ==} engines: {node: '>=6.9.0'} @@ -11253,7 +11702,7 @@ packages: '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.21.1 + core-js: 3.25.5 global: 4.4.0 lodash: 4.17.21 qs: 6.10.3 @@ -11331,7 +11780,7 @@ packages: '@storybook/ui': 6.4.19_sfoxds7t5ydpegc3knd667wn6m airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.21.1 + core-js: 3.25.5 global: 4.4.0 lodash: 4.17.21 qs: 6.10.3 @@ -11370,7 +11819,7 @@ packages: '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim airbnb-js-shims: 2.2.1 ansi-to-html: 0.6.15 - core-js: 3.21.1 + core-js: 3.25.5 global: 4.4.0 lodash: 4.17.21 qs: 6.10.3 @@ -14646,6 +15095,12 @@ packages: - react-native dev: false + /@woocommerce/settings/1.0.0: + resolution: {integrity: sha512-BjrT56Cz8XTRHw2JNPmANRkYh2rzdF33wOa56lah1qb/MjHUKuVJ0PTSZ19S5Trb92IkxfcIVB26CSdxXnf5Og==} + dependencies: + '@babel/runtime-corejs2': 7.5.5 + dev: false + /@woocommerce/woocommerce-rest-api/1.0.1: resolution: {integrity: sha512-YBk3EEYE0zax/egx6Rhpbu6hcCFyZpYQrjH9JO4NUGU3n3T0W9Edn7oAUbjL/c7Oezcg+UaQluCaKjY/B3zwxg==} engines: {node: '>=8.0.0'} @@ -18622,6 +19077,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.16.12: + resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.16.12 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: false + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: @@ -18647,19 +19115,6 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.16.12: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.19.3 - '@babel/core': 7.16.12 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: false - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: @@ -20834,7 +21289,6 @@ packages: dependencies: browserslist: 4.19.3 semver: 7.0.0 - dev: true /core-js-compat/3.25.5: resolution: {integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==} @@ -20844,6 +21298,7 @@ packages: /core-js-pure/3.29.1: resolution: {integrity: sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg==} requiresBuild: true + dev: true /core-js/1.2.7: resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} @@ -20854,7 +21309,6 @@ packages: resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==} deprecated: core-js@<3.4 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 - dev: true /core-js/3.21.1: resolution: {integrity: sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==} @@ -22815,7 +23269,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -22846,7 +23300,7 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 resolve: 1.20.0 tsconfig-paths: 3.14.0 @@ -31416,6 +31870,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -34801,7 +35256,7 @@ packages: is-touch-device: 1.0.1 lodash: 4.17.21 moment: 2.29.4 - object.assign: 4.1.4 + object.assign: 4.1.2 object.values: 1.1.5 prop-types: 15.8.1 raf: 3.4.1 From c5564a15c11eae5b30de7ab6e37edbd973a29ebe Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Fri, 17 Mar 2023 14:05:51 -0400 Subject: [PATCH 1098/1680] Filter Variations report variation attributes correctly (#37223) * FIx Variations report * Fix Orders report * Remove ability to pass table into get_attribute_subqueries since it should always be the same table we join on --- .../changelog/try-fix-variations-report-filtering | 4 ++++ .../woocommerce/src/Admin/API/Reports/DataStore.php | 13 ++++++------- .../src/Admin/API/Reports/Orders/DataStore.php | 2 +- .../Admin/API/Reports/Orders/Stats/DataStore.php | 2 +- .../src/Admin/API/Reports/Variations/DataStore.php | 2 +- 5 files changed, 13 insertions(+), 10 deletions(-) create mode 100644 plugins/woocommerce/changelog/try-fix-variations-report-filtering diff --git a/plugins/woocommerce/changelog/try-fix-variations-report-filtering b/plugins/woocommerce/changelog/try-fix-variations-report-filtering new file mode 100644 index 00000000000..31750d25a32 --- /dev/null +++ b/plugins/woocommerce/changelog/try-fix-variations-report-filtering @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fixes filtering by attributes in the Analytics Orders and Variations reports. diff --git a/plugins/woocommerce/src/Admin/API/Reports/DataStore.php b/plugins/woocommerce/src/Admin/API/Reports/DataStore.php index b84c843d281..082d36992dc 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/DataStore.php +++ b/plugins/woocommerce/src/Admin/API/Reports/DataStore.php @@ -1305,11 +1305,10 @@ class DataStore extends SqlQuery { * Returns product attribute subquery elements used in JOIN and WHERE clauses, * based on query arguments from the user. * - * @param array $query_args Parameters supplied by the user. - * @param string $table_name Database table name. + * @param array $query_args Parameters supplied by the user. * @return array */ - protected function get_attribute_subqueries( $query_args, $table_name ) { + protected function get_attribute_subqueries( $query_args ) { global $wpdb; $sql_clauses = array( @@ -1363,11 +1362,11 @@ class DataStore extends SqlQuery { $meta_value = esc_sql( $attribute_term[1] ); } - $join_alias = 'orderitemmeta1'; + $join_alias = 'orderitemmeta1'; + $table_to_join_on = "{$wpdb->prefix}wc_order_product_lookup"; if ( empty( $sql_clauses['join'] ) ) { - $table_name = esc_sql( $table_name ); - $sql_clauses['join'][] = "JOIN {$wpdb->prefix}woocommerce_order_items orderitems ON orderitems.order_id = {$table_name}.order_id"; + $sql_clauses['join'][] = "JOIN {$wpdb->prefix}woocommerce_order_items orderitems ON orderitems.order_id = {$table_to_join_on}.order_id"; } // If we're matching all filters (AND), we'll need multiple JOINs on postmeta. @@ -1375,7 +1374,7 @@ class DataStore extends SqlQuery { if ( 'AND' === $match_operator || 1 === count( $sql_clauses['join'] ) ) { $join_idx = count( $sql_clauses['join'] ); $join_alias = 'orderitemmeta' . $join_idx; - $sql_clauses['join'][] = "JOIN {$wpdb->prefix}woocommerce_order_itemmeta as {$join_alias} ON {$join_alias}.order_item_id = orderitems.order_item_id"; + $sql_clauses['join'][] = "JOIN {$wpdb->prefix}woocommerce_order_itemmeta as {$join_alias} ON {$join_alias}.order_item_id = {$table_to_join_on}.order_item_id"; } // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared diff --git a/plugins/woocommerce/src/Admin/API/Reports/Orders/DataStore.php b/plugins/woocommerce/src/Admin/API/Reports/Orders/DataStore.php index e2523030c87..0c8a86a607d 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/Orders/DataStore.php +++ b/plugins/woocommerce/src/Admin/API/Reports/Orders/DataStore.php @@ -191,7 +191,7 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { $where_subquery[] = "{$order_tax_lookup_table}.tax_rate_id NOT IN ({$excluded_tax_rates}) OR {$order_tax_lookup_table}.tax_rate_id IS NULL"; } - $attribute_subqueries = $this->get_attribute_subqueries( $query_args, $order_stats_lookup_table ); + $attribute_subqueries = $this->get_attribute_subqueries( $query_args ); if ( $attribute_subqueries['join'] && $attribute_subqueries['where'] ) { $this->subquery->add_sql_clause( 'join', "JOIN {$order_product_lookup_table} ON {$order_stats_lookup_table}.order_id = {$order_product_lookup_table}.order_id" ); diff --git a/plugins/woocommerce/src/Admin/API/Reports/Orders/Stats/DataStore.php b/plugins/woocommerce/src/Admin/API/Reports/Orders/Stats/DataStore.php index 45d3245686d..1a7d6be74a3 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/Orders/Stats/DataStore.php +++ b/plugins/woocommerce/src/Admin/API/Reports/Orders/Stats/DataStore.php @@ -208,7 +208,7 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { ); // Product attribute filters. - $attribute_subqueries = $this->get_attribute_subqueries( $query_args, $orders_stats_table ); + $attribute_subqueries = $this->get_attribute_subqueries( $query_args ); if ( $attribute_subqueries['join'] && $attribute_subqueries['where'] ) { // Build a subquery for getting order IDs by product attribute(s). // Done here since our use case is a little more complicated than get_object_where_filter() can handle. diff --git a/plugins/woocommerce/src/Admin/API/Reports/Variations/DataStore.php b/plugins/woocommerce/src/Admin/API/Reports/Variations/DataStore.php index 7b86926db3f..6b84a8c216d 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/Variations/DataStore.php +++ b/plugins/woocommerce/src/Admin/API/Reports/Variations/DataStore.php @@ -119,7 +119,7 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { */ protected function get_order_item_by_attribute_subquery( $query_args ) { $order_product_lookup_table = self::get_db_table_name(); - $attribute_subqueries = $this->get_attribute_subqueries( $query_args, $order_product_lookup_table ); + $attribute_subqueries = $this->get_attribute_subqueries( $query_args ); if ( $attribute_subqueries['join'] && $attribute_subqueries['where'] ) { // Perform a subquery for DISTINCT order items that match our attribute filters. From 2e3057052f41c386d58aa5ffbd0a35a95016b324 Mon Sep 17 00:00:00 2001 From: Michael Pretty Date: Fri, 17 Mar 2023 15:27:28 -0400 Subject: [PATCH 1099/1680] fix lint issues --- plugins/woocommerce/includes/wc-update-functions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/woocommerce/includes/wc-update-functions.php b/plugins/woocommerce/includes/wc-update-functions.php index 681dbb52e49..7c9020db0c7 100644 --- a/plugins/woocommerce/includes/wc-update-functions.php +++ b/plugins/woocommerce/includes/wc-update-functions.php @@ -1846,7 +1846,7 @@ function wc_update_343_cleanup_foreign_keys() { $create_table_sql = $wpdb->get_var( "SHOW CREATE TABLE {$wpdb->prefix}wc_download_log", 1 ); if ( ! empty( $create_table_sql ) ) { - // Extract and remove the foreign key constraints matching %wc_download_log_ib% + // Extract and remove the foreign key constraints matching %wc_download_log_ib%. if ( preg_match_all( '/CONSTRAINT `([^`]*wc_download_log_ib[^`]*)` FOREIGN KEY/', $create_table_sql, $matches ) && ! empty( $matches[1] ) ) { foreach ( $matches[1] as $foreign_key_name ) { $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY `{$foreign_key_name}`" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared @@ -2445,7 +2445,6 @@ function wc_update_700_remove_download_log_fk() { $create_table_sql = $wpdb->get_var( "SHOW CREATE TABLE {$wpdb->prefix}wc_download_log", 1 ); if ( ! empty( $create_table_sql ) ) { - // Extract the foreign key constraints if ( preg_match_all( '/CONSTRAINT `([^`]*)` FOREIGN KEY/', $create_table_sql, $matches ) && ! empty( $matches[1] ) ) { foreach ( $matches[1] as $foreign_key_name ) { $wpdb->query( "ALTER TABLE {$wpdb->prefix}wc_download_log DROP FOREIGN KEY `{$foreign_key_name}`" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared From 96b27622bb7f57800fd760513591d84c50aa26b8 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Sat, 18 Mar 2023 07:27:48 +0800 Subject: [PATCH 1100/1680] Enclose in double quotes --- .../scripts/upload-allure-report.sh | 2 +- .../scripts/upload-allure-results.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh index 7002ff3e130..970b9d6f09d 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh @@ -2,7 +2,7 @@ echo "Uploading allure-report folder..." aws s3 cp $ALLURE_REPORT_DIR \ - $S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-report \ + "$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-report" \ --recursive \ --only-show-errors echo "Done" \ No newline at end of file diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh index b45893309e2..470d6e74f79 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh @@ -2,7 +2,7 @@ echo "Uploading allure-results folder..." aws s3 cp $ALLURE_RESULTS_DIR \ - $S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-results \ + "$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-results" \ --recursive \ --only-show-errors echo "Done" \ No newline at end of file From 2110d011aefb0fecdd9b5c182e1ceaea385d51db Mon Sep 17 00:00:00 2001 From: rodelgc Date: Sat, 18 Mar 2023 08:02:43 +0800 Subject: [PATCH 1101/1680] More accurate step name --- .github/workflows/smoke-test-release.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index e68183353ca..c3f11528aff 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -96,7 +96,7 @@ jobs: GITHUB_TOKEN: ${{ secrets.E2E_GH_TOKEN }} UPDATE_WC: ${{ needs.get-tag.outputs.tag }} - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket with: @@ -152,7 +152,7 @@ jobs: USER_KEY: ${{ secrets.RELEASE_TEST_ADMIN_USER }} USER_SECRET: ${{ secrets.RELEASE_TEST_ADMIN_PASSWORD }} - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket with: @@ -243,7 +243,7 @@ jobs: if-no-files-found: ignore retention-days: 5 - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket with: @@ -366,7 +366,7 @@ jobs: ALLURE_RESULTS_DIR: ${{ env.API_ALLURE_RESULTS_DIR }} ALLURE_REPORT_DIR: ${{ env.API_ALLURE_REPORT_DIR }} - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket env: @@ -408,7 +408,7 @@ jobs: report-name: ${{ env.E2E_WP_LATEST_X_ARTIFACT }} tests: basic.spec.js # mytodo remove this later - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket env: @@ -489,7 +489,7 @@ jobs: ALLURE_RESULTS_DIR: ${{ env.API_ALLURE_RESULTS_DIR }} ALLURE_REPORT_DIR: ${{ env.API_ALLURE_REPORT_DIR }} - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket env: @@ -531,7 +531,7 @@ jobs: report-name: ${{ env.E2E_ARTIFACT }} tests: basic.spec.js # mytodo remove this later - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) uses: ./.github/actions/tests/upload-allure-files-to-bucket env: @@ -633,7 +633,7 @@ jobs: env: E2E_MAX_FAILURES: 15 - - name: Upload Allure files to bucket + - name: Upload Allure artifacts to bucket if: | success() || ( failure() && From 45071f2f034ed2bd7276b2e7770b971f339eab4f Mon Sep 17 00:00:00 2001 From: rodelgc Date: Sat, 18 Mar 2023 08:29:56 +0800 Subject: [PATCH 1102/1680] Simplify upload scripts --- .../upload-allure-files-to-bucket/action.yml | 31 +++++-------------- .../scripts/upload-allure-artifact.sh | 29 +++++++++++++++++ .../scripts/upload-allure-report.sh | 8 ----- .../scripts/upload-allure-results.sh | 8 ----- .../scripts/verify-allure-dirs.js | 11 ------- .github/workflows/smoke-test-release.yml | 16 +++++----- 6 files changed, 45 insertions(+), 58 deletions(-) create mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh delete mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh delete mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh delete mode 100644 .github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js diff --git a/.github/actions/tests/upload-allure-files-to-bucket/action.yml b/.github/actions/tests/upload-allure-files-to-bucket/action.yml index 5ca2514eee6..c99f5fd5c42 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/action.yml +++ b/.github/actions/tests/upload-allure-files-to-bucket/action.yml @@ -3,8 +3,8 @@ description: Upload Allure files to bucket. permissions: {} inputs: - destination-dir: - description: Directory under the "artifacts" S3 folder to which the Allure files would be uploaded. + artifact-name: + description: Name of the artifact that contains the allure-report and/or allure-results folders. required: true aws-region: required: true @@ -27,26 +27,11 @@ runs: aws-access-key-id: ${{ inputs.aws-access-key-id }} aws-secret-access-key: ${{ inputs.aws-secret-access-key }} - - name: Verify allure-results and allure-report paths - uses: actions/github-script@v6 - with: - script: | - const script = require('./.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js') - script({core}) - - - name: Upload 'allure-results' folder - if: inputs.include-allure-results == true + - name: Upload Allure artifact + env: + ARTIFACT_NAME: ${{ inputs.artifact-name }} + S3_BUCKET: ${{ inputs.s3-bucket }} + INCLUDE_ALLURE_RESULTS: ${{ inputs.include-allure-results }} shell: bash working-directory: .github/actions/tests/upload-allure-files-to-bucket/scripts - run: bash upload-allure-results.sh - env: - DESTINATION_DIR: ${{ inputs.destination-dir }} - S3_BUCKET: ${{ inputs.s3-bucket }} - - - name: Upload 'allure-report' folder - shell: bash - working-directory: .github/actions/tests/upload-allure-files-to-bucket/scripts - run: bash upload-allure-report.sh - env: - DESTINATION_DIR: ${{ inputs.destination-dir }} - S3_BUCKET: ${{ inputs.s3-bucket }} + run: bash upload-allure-artifact.sh diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh new file mode 100644 index 00000000000..8bd9c7842ae --- /dev/null +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +upload_allure_results () { + if [[ $INCLUDE_ALLURE_RESULTS != "true" ]]; then + return + fi + + SOURCE="$ALLURE_RESULTS_DIR" + DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-results" + + aws s3 cp "$SOURCE" "$DESTINATION" \ + --recursive \ + --only-show-errors +} + +upload_allure_report () { + SOURCE="$ALLURE_REPORT_DIR" + DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-report" + + aws s3 cp "$SOURCE" "$DESTINATION" \ + --recursive \ + --only-show-errors +} + +upload_allure_results +upload_allure_report + +EXIT_CODE=$(echo $?) +exit $EXIT_CODE \ No newline at end of file diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh deleted file mode 100644 index 970b9d6f09d..00000000000 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-report.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -echo "Uploading allure-report folder..." -aws s3 cp $ALLURE_REPORT_DIR \ - "$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-report" \ - --recursive \ - --only-show-errors -echo "Done" \ No newline at end of file diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh deleted file mode 100644 index 470d6e74f79..00000000000 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-results.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -echo "Uploading allure-results folder..." -aws s3 cp $ALLURE_RESULTS_DIR \ - "$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-results" \ - --recursive \ - --only-show-errors -echo "Done" \ No newline at end of file diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js b/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js deleted file mode 100644 index e12a7dcdae3..00000000000 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/verify-allure-dirs.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = ( { core } ) => { - const { ALLURE_REPORT_DIR, ALLURE_RESULTS_DIR } = process.env; - - if ( ! ( ALLURE_REPORT_DIR || ALLURE_RESULTS_DIR ) ) { - const errorMessage = - 'You tried to use the "upload-allure-files-to-bucket" action without specifying the path to the allure-results and/or allure-report folders.\n' + - 'To use this action, set the paths using the ALLURE_REPORT_DIR and ALLURE_RESULTS_DIR environment variables.'; - - core.setFailed( errorMessage ); - } -}; diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index c3f11528aff..44c37a4faf1 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -103,7 +103,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.E2E_WP_LATEST_ARTIFACT }} + artifact-name: ${{ env.E2E_WP_LATEST_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish E2E Allure report @@ -159,7 +159,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.API_WP_LATEST_ARTIFACT }} + artifact-name: ${{ env.API_WP_LATEST_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish API Allure report @@ -250,7 +250,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.E2E_WP_LATEST_ARTIFACT }} + artifact-name: ${{ env.E2E_WP_LATEST_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish E2E Allure report @@ -376,7 +376,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.API_WP_LATEST_X_ARTIFACT }} + artifact-name: ${{ env.API_WP_LATEST_X_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish API Allure report @@ -418,7 +418,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.E2E_WP_LATEST_X_ARTIFACT }} + artifact-name: ${{ env.E2E_WP_LATEST_X_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish E2E Allure report @@ -499,7 +499,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.API_ARTIFACT }} + artifact-name: ${{ env.API_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish API Allure report @@ -541,7 +541,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.E2E_ARTIFACT }} + artifact-name: ${{ env.E2E_ARTIFACT }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish E2E Allure report @@ -643,7 +643,7 @@ jobs: aws-access-key-id: ${{ secrets.REPORTS_AWS_ACCESS_KEY_ID }} aws-region: ${{ secrets.REPORTS_AWS_REGION }} aws-secret-access-key: ${{ secrets.REPORTS_AWS_SECRET_ACCESS_KEY }} - destination-dir: ${{ env.ARTIFACT_NAME }} + artifact-name: ${{ env.ARTIFACT_NAME }} s3-bucket: ${{ secrets.REPORTS_BUCKET }} - name: Publish E2E Allure report From 874faf8d4e4957c18e4cc2ec1de846dd08e052c4 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Sat, 18 Mar 2023 08:35:03 +0800 Subject: [PATCH 1103/1680] Use single function to do s3 upload --- .../scripts/upload-allure-artifact.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh index 8bd9c7842ae..19308d7845a 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh @@ -1,25 +1,27 @@ #!/usr/bin/env bash +s3_upload () { + aws s3 cp "$1" "$2" \ + --recursive \ + --only-show-errors +} + upload_allure_results () { if [[ $INCLUDE_ALLURE_RESULTS != "true" ]]; then return fi SOURCE="$ALLURE_RESULTS_DIR" - DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-results" + DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$ARTIFACT_NAME/allure-results" - aws s3 cp "$SOURCE" "$DESTINATION" \ - --recursive \ - --only-show-errors + s3_upload $SOURCE $DESTINATION } upload_allure_report () { SOURCE="$ALLURE_REPORT_DIR" - DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$DESTINATION_DIR/allure-report" + DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$ARTIFACT_NAME/allure-report" - aws s3 cp "$SOURCE" "$DESTINATION" \ - --recursive \ - --only-show-errors + s3_upload $SOURCE $DESTINATION } upload_allure_results From a80f65cc11b85587016519f3bc5ff86f72fe7db6 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Sat, 18 Mar 2023 08:36:22 +0800 Subject: [PATCH 1104/1680] Add run number --- .github/workflows/smoke-test-release.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 44c37a4faf1..dab595db063 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -567,7 +567,7 @@ jobs: env: ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-results ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report - ARTIFACT_NAME: E2E test on wp-env with ${{ matrix.plugin }} installed + ARTIFACT_NAME: E2E test on wp-env with ${{ matrix.plugin }} installed (run-${{ github.run_number }}) strategy: fail-fast: false matrix: From 65c698a386076bab7c1ed5f3d1aa0543cf2d1e48 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Sat, 18 Mar 2023 08:37:39 +0800 Subject: [PATCH 1105/1680] Remove unnecessary dash --- .github/workflows/smoke-test-release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index dab595db063..e007a33d957 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -12,8 +12,8 @@ concurrency: cancel-in-progress: true permissions: {} env: - E2E_WP_LATEST_ARTIFACT: E2E test on release smoke test site with WP Latest (run-${{ github.run_number }}) - E2E_UPDATE_WC_ARTIFACT: WooCommerce version update test on release smoke test site (run-${{ github.run_number }}) + E2E_WP_LATEST_ARTIFACT: E2E test on release smoke test site with WP Latest (run ${{ github.run_number }}) + E2E_UPDATE_WC_ARTIFACT: WooCommerce version update test on release smoke test site (run ${{ github.run_number }}) jobs: get-tag: @@ -131,7 +131,7 @@ jobs: env: ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/api-test-report/allure-report ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/api-test-report/allure-results - API_WP_LATEST_ARTIFACT: API test on release smoke test site with WP Latest (run-${{ github.run_number }}) + API_WP_LATEST_ARTIFACT: API test on release smoke test site with WP Latest (run ${{ github.run_number }}) steps: - uses: actions/checkout@v3 @@ -567,7 +567,7 @@ jobs: env: ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-results ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/allure-report - ARTIFACT_NAME: E2E test on wp-env with ${{ matrix.plugin }} installed (run-${{ github.run_number }}) + ARTIFACT_NAME: E2E test on wp-env with ${{ matrix.plugin }} installed (run ${{ github.run_number }}) strategy: fail-fast: false matrix: From 555116f3dfa737c67379372867dfd4b8fda30725 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 17:59:35 +0800 Subject: [PATCH 1106/1680] Fix broken tests for CreateNewCampaignModal. The tests had errors because useInstalledPlugins is added into the component and it is not mocked in the tests. --- .../CreateNewCampaignModal.test.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx index 1fbd8d270ff..1f1e754ec4d 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx @@ -11,6 +11,7 @@ import { useCampaignTypes, useRecommendedChannels, useRegisteredChannels, + useInstalledPlugins, } from '~/marketing/hooks'; import { CreateNewCampaignModal } from './CreateNewCampaignModal'; @@ -28,6 +29,7 @@ jest.mock( '~/marketing/hooks', () => ( { useCampaignTypes: jest.fn(), useRecommendedChannels: jest.fn(), useRegisteredChannels: jest.fn(), + useInstalledPlugins: jest.fn(), } ) ); const google = { @@ -77,6 +79,15 @@ const amazon = { }; describe( 'CreateNewCampaignModal component', () => { + beforeEach( () => { + ( useRegisteredChannels as jest.Mock ).mockReturnValue( { + refetch: jest.fn(), + } ); + ( useInstalledPlugins as jest.Mock ).mockReturnValue( { + loadInstalledPluginsAfterActivation: jest.fn(), + } ); + } ); + it( 'renders new campaign types with recommended channels', async () => { ( useCampaignTypes as jest.Mock ).mockReturnValue( { data: [ google ], @@ -84,9 +95,6 @@ describe( 'CreateNewCampaignModal component', () => { ( useRecommendedChannels as jest.Mock ).mockReturnValue( { data: [ pinterest, amazon ], } ); - ( useRegisteredChannels as jest.Mock ).mockReturnValue( { - refetch: jest.fn(), - } ); render( {} } /> ); expect( screen.getByText( 'Google Ads' ) ).toBeInTheDocument(); @@ -121,9 +129,6 @@ describe( 'CreateNewCampaignModal component', () => { ( useRecommendedChannels as jest.Mock ).mockReturnValue( { data: [], } ); - ( useRegisteredChannels as jest.Mock ).mockReturnValue( { - refetch: jest.fn(), - } ); render( {} } /> ); // The expand button should not be there. From 8c151984ad10969ee1ca18dd7b10795e4fbe318f Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 8 Mar 2023 23:21:54 +0800 Subject: [PATCH 1107/1680] Filter installed plugins against marketing channels in useInstalledPlugins. --- .../marketing/hooks/useInstalledPlugins.ts | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts index 88c39ac3e68..ab2a2c97a7a 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts @@ -2,12 +2,15 @@ * External dependencies */ import { useSelect, useDispatch } from '@wordpress/data'; +import { chain } from 'lodash'; /** * Internal dependencies */ import { STORE_KEY } from '~/marketing/data/constants'; import { InstalledPlugin } from '~/marketing/types'; +import { useRecommendedChannels } from './useRecommendedChannels'; +import { useRegisteredChannels } from './useRegisteredChannels'; export type UseInstalledPlugins = { installedPlugins: InstalledPlugin[]; @@ -18,22 +21,36 @@ export type UseInstalledPlugins = { /** * Hook to return plugins and methods for "Installed extensions" card. + * + * The list of installed plugins will not include registered and recommended marketing channels. */ export const useInstalledPlugins = (): UseInstalledPlugins => { + const { data: dataRegisteredChannels = [] } = useRegisteredChannels(); + const { data: dataRecommendedChannels = [] } = useRecommendedChannels(); + const { installedPlugins, activatingPlugins } = useSelect( ( select ) => { const { getInstalledPlugins, getActivatingPlugins } = select( STORE_KEY ); return { - installedPlugins: getInstalledPlugins(), + installedPlugins: getInstalledPlugins< InstalledPlugin[] >(), activatingPlugins: getActivatingPlugins(), }; }, [] ); + + const installedPluginsWithoutChannels = chain( installedPlugins ) + .differenceWith( dataRegisteredChannels, ( a, b ) => a.slug === b.slug ) + .differenceWith( + dataRecommendedChannels, + ( a, b ) => a.slug === b.product + ) + .value(); + const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } = useDispatch( STORE_KEY ); return { - installedPlugins, + installedPlugins: installedPluginsWithoutChannels, activatingPlugins, activateInstalledPlugin, loadInstalledPluginsAfterActivation, From e20b9d1ac976ec5e7160f4d82f47c18eb4817f70 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 8 Mar 2023 23:42:02 +0800 Subject: [PATCH 1108/1680] Filter out marketing channels in useRecommendedPlugins. --- .../DiscoverTools/useRecommendedPlugins.ts | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts index e8865fd4888..a17107498e6 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts @@ -2,17 +2,20 @@ * External dependencies */ import { useSelect, useDispatch } from '@wordpress/data'; +import { differenceWith } from 'lodash'; /** * Internal dependencies */ import { STORE_KEY } from '~/marketing/data/constants'; +import { useRecommendedChannels } from '~/marketing/hooks'; import { RecommendedPlugin } from '~/marketing/types'; const selector = 'getRecommendedPlugins'; const category = 'marketing'; export const useRecommendedPlugins = () => { + const { data: dataRecommendedChannels } = useRecommendedChannels(); const { invalidateResolution, installAndActivateRecommendedPlugin } = useDispatch( STORE_KEY ); @@ -21,18 +24,26 @@ export const useRecommendedPlugins = () => { invalidateResolution( selector, [ category ] ); }; - return useSelect( ( select ) => { + const { isLoading, plugins } = useSelect( ( select ) => { const { getRecommendedPlugins, hasFinishedResolution } = select( STORE_KEY ); - const plugins = - getRecommendedPlugins< RecommendedPlugin[] >( category ); - const isLoading = ! hasFinishedResolution( selector, [ category ] ); return { - isInitializing: ! plugins.length && isLoading, - isLoading, - plugins, - installAndActivate, + isLoading: ! hasFinishedResolution( selector, [ category ] ), + plugins: getRecommendedPlugins< RecommendedPlugin[] >( category ), }; }, [] ); + + const recommendedPluginsWithoutChannels = differenceWith( + plugins, + dataRecommendedChannels || [], + ( a, b ) => a.product === b.product + ); + + return { + isInitializing: ! recommendedPluginsWithoutChannels.length && isLoading, + isLoading, + plugins: recommendedPluginsWithoutChannels, + installAndActivate, + }; }; From f45e43b990c794ad3a0dc5c8468aabe908c19344 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 8 Mar 2023 23:48:57 +0800 Subject: [PATCH 1109/1680] Add changelog. --- .../changelog/feature-34907-marketing-exclude-channels | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-34907-marketing-exclude-channels diff --git a/plugins/woocommerce/changelog/feature-34907-marketing-exclude-channels b/plugins/woocommerce/changelog/feature-34907-marketing-exclude-channels new file mode 100644 index 00000000000..941984e2475 --- /dev/null +++ b/plugins/woocommerce/changelog/feature-34907-marketing-exclude-channels @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Filter out marketing channels in "Installed extensions" and "Discover more marketing tools" cards. From 49253425b213c97b2a855854055a249817b869dc Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:12:09 +0800 Subject: [PATCH 1110/1680] Specify dependency for useSelect in useIntroductionBanner. Co-authored-by: Eason --- .../client/marketing/hooks/useIntroductionBanner.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts index 4d565afbe2f..9a4ff91a292 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts @@ -36,5 +36,5 @@ export const useIntroductionBanner = (): UseIntroductionBanner => { getOption( OPTION_NAME ) === OPTION_VALUE || isUpdateRequesting, dismissIntroductionBanner, }; - } ); + }, [] ); }; From 162d790a7afb4385eab63d8407ef70c1e2e530f1 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:16:04 +0800 Subject: [PATCH 1111/1680] Update option name and value to make it more indicative. --- .../client/marketing/hooks/useIntroductionBanner.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts index 9a4ff91a292..369f5d14747 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts @@ -11,16 +11,16 @@ type UseIntroductionBanner = { dismissIntroductionBanner: () => void; }; -const OPTION_NAME = +const OPTION_NAME_BANNER_DISMISSED = 'woocommerce_marketing_overview_multichannel_banner_dismissed'; -const OPTION_VALUE = 'yes'; +const OPTION_VALUE_YES = 'yes'; export const useIntroductionBanner = (): UseIntroductionBanner => { const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); const dismissIntroductionBanner = () => { updateOptions( { - [ OPTION_NAME ]: OPTION_VALUE, + [ OPTION_NAME_BANNER_DISMISSED ]: OPTION_VALUE_YES, } ); recordEvent( 'marketing_multichannel_banner_dismissed', {} ); }; @@ -31,9 +31,12 @@ export const useIntroductionBanner = (): UseIntroductionBanner => { const isUpdateRequesting = isOptionsUpdating(); return { - loading: ! hasFinishedResolution( 'getOption', [ OPTION_NAME ] ), + loading: ! hasFinishedResolution( 'getOption', [ + OPTION_NAME_BANNER_DISMISSED, + ] ), isIntroductionBannerDismissed: - getOption( OPTION_NAME ) === OPTION_VALUE || isUpdateRequesting, + getOption( OPTION_NAME_BANNER_DISMISSED ) === + OPTION_VALUE_YES || isUpdateRequesting, dismissIntroductionBanner, }; }, [] ); From 99c6ebff1554b8ed7fd111af20395e9b8c7cb0c1 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:38:20 +0800 Subject: [PATCH 1112/1680] Remove the use of isOptionsUpdating in useIntroductionBanner. isOptionsUpdating will return true for any option update, not just our option here. This causes issue as shown in demo video in https://github.com/woocommerce/woocommerce/pull/37110#discussion_r1130531104. We can just depend on getOption. When we update an option, it will be updated immediately in wp.data store before making API request to update the option in database (see https://github.com/woocommerce/woocommerce/blob/c5564a15c11eae5b30de7ab6e37edbd973a29ebe/packages/js/data/src/options/actions.ts#L44). --- .../client/marketing/hooks/useIntroductionBanner.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts index 369f5d14747..5d55c9a41d2 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts @@ -26,17 +26,15 @@ export const useIntroductionBanner = (): UseIntroductionBanner => { }; return useSelect( ( select ) => { - const { getOption, isOptionsUpdating, hasFinishedResolution } = + const { getOption, hasFinishedResolution } = select( OPTIONS_STORE_NAME ); - const isUpdateRequesting = isOptionsUpdating(); return { loading: ! hasFinishedResolution( 'getOption', [ OPTION_NAME_BANNER_DISMISSED, ] ), isIntroductionBannerDismissed: - getOption( OPTION_NAME_BANNER_DISMISSED ) === - OPTION_VALUE_YES || isUpdateRequesting, + getOption( OPTION_NAME_BANNER_DISMISSED ) === OPTION_VALUE_YES, dismissIntroductionBanner, }; }, [] ); From 1b65be0a5338f3b235f048fa7da29a42330e3227 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:50:37 +0800 Subject: [PATCH 1113/1680] Fix useSelect dependency in useIntroductionBanner. --- .../client/marketing/hooks/useIntroductionBanner.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts index 5d55c9a41d2..0eebcb471a1 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts @@ -25,7 +25,7 @@ export const useIntroductionBanner = (): UseIntroductionBanner => { recordEvent( 'marketing_multichannel_banner_dismissed', {} ); }; - return useSelect( ( select ) => { + const { loading, data } = useSelect( ( select ) => { const { getOption, hasFinishedResolution } = select( OPTIONS_STORE_NAME ); @@ -33,9 +33,13 @@ export const useIntroductionBanner = (): UseIntroductionBanner => { loading: ! hasFinishedResolution( 'getOption', [ OPTION_NAME_BANNER_DISMISSED, ] ), - isIntroductionBannerDismissed: - getOption( OPTION_NAME_BANNER_DISMISSED ) === OPTION_VALUE_YES, - dismissIntroductionBanner, + data: getOption( OPTION_NAME_BANNER_DISMISSED ), }; }, [] ); + + return { + loading, + isIntroductionBannerDismissed: data === OPTION_VALUE_YES, + dismissIntroductionBanner, + }; }; From 65523e36dda2f0758e5917e0e275b744a36ea3b1 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:54:34 +0800 Subject: [PATCH 1114/1680] Fix spacing for close button in IntroductionBanner. --- .../IntroductionBanner/IntroductionBanner.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss index 7c46d7887f5..95209ff6e1f 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss @@ -36,7 +36,7 @@ .woocommerce-marketing-introduction-banner-close-button { position: absolute; - top: $gap-smaller; + top: $gap-small; right: $gap; padding: 0; } From 155211d77ac41caf3143a77f483ee1f43bc227ce Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:56:00 +0800 Subject: [PATCH 1115/1680] Remove unneeded Icon component. --- .../IntroductionBanner/IntroductionBanner.tsx | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx index 4fb9cfef079..9ff0049ce5c 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx @@ -90,18 +90,11 @@ export const IntroductionBanner = ( { - - } + { { __( 'Built by WooCommerce', 'woocommerce' ) } From 6b75b5db384de2a9c9d9d5c3f2b37a3bc55a5617 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 20:58:54 +0800 Subject: [PATCH 1116/1680] Rename variables to make them clearer. --- .../IntroductionBanner/IntroductionBanner.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx index 9ff0049ce5c..38631a83b39 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx @@ -28,7 +28,7 @@ export const IntroductionBanner = ( { onDismiss, onAddChannels, }: IntroductionBannerProps ) => { - const [ open, setOpen ] = useState( false ); + const [ isModalOpen, setModalOpen ] = useState( false ); const { data: dataRegistered } = useRegisteredChannels(); const { data: dataRecommended } = useRecommendedChannels(); @@ -111,7 +111,7 @@ export const IntroductionBanner = ( {
    From c6a95ae9bf47ea38a6c9a1fa654a8fd3ee561f0a Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 21:10:22 +0800 Subject: [PATCH 1117/1680] Rename callback props in IntroductionBanner to make them clearer. --- .../IntroductionBanner/IntroductionBanner.tsx | 12 ++++++------ .../MarketingOverviewMultichannel.tsx | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx index 38631a83b39..cf3d1cae97e 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx @@ -20,13 +20,13 @@ import illustrationUrl from './illustration.svg'; import illustrationLargeUrl from './illustration-large.svg'; type IntroductionBannerProps = { - onDismiss: () => void; - onAddChannels: () => void; + onDismissClick: () => void; + onAddChannelsClick: () => void; }; export const IntroductionBanner = ( { - onDismiss, - onAddChannels, + onDismissClick, + onAddChannelsClick, }: IntroductionBannerProps ) => { const [ isModalOpen, setModalOpen ] = useState( false ); const { data: dataRegistered } = useRegisteredChannels(); @@ -120,7 +120,7 @@ export const IntroductionBanner = ( { { showAddChannelsButton && ( @@ -137,7 +137,7 @@ export const IntroductionBanner = ( { diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index 46de03f7709..4b5eb7f21ec 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -68,8 +68,8 @@ export const MarketingOverviewMultichannel: React.FC = () => {
    { ! isIntroductionBannerDismissed && ( { + onDismissClick={ dismissIntroductionBanner } + onAddChannelsClick={ () => { addChannelsButtonRef.current?.focus(); addChannelsButtonRef.current?.click(); addChannelsButtonRef.current?.scrollIntoView(); From 458c16bad9b88c409e1d0928506582fa9463abfa Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 22:54:55 +0800 Subject: [PATCH 1118/1680] Move useCampaigns to shared hooks directory. --- plugins/woocommerce-admin/client/marketing/hooks/index.ts | 1 + .../Campaigns => hooks}/useCampaigns.ts | 0 .../overview-multichannel/Campaigns/Campaigns.test.tsx | 8 ++------ .../overview-multichannel/Campaigns/Campaigns.tsx | 2 +- 4 files changed, 4 insertions(+), 7 deletions(-) rename plugins/woocommerce-admin/client/marketing/{overview-multichannel/Campaigns => hooks}/useCampaigns.ts (100%) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/index.ts b/plugins/woocommerce-admin/client/marketing/hooks/index.ts index 459b0938447..3492d275ed0 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/index.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/index.ts @@ -3,3 +3,4 @@ export { useInstalledPlugins } from './useInstalledPlugins'; export { useRegisteredChannels } from './useRegisteredChannels'; export { useRecommendedChannels } from './useRecommendedChannels'; export { useCampaignTypes } from './useCampaignTypes'; +export { useCampaigns } from './useCampaigns'; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/useCampaigns.ts b/plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/useCampaigns.ts rename to plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.test.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.test.tsx index 96fd6105337..aaa59396728 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.test.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.test.tsx @@ -7,15 +7,11 @@ import userEvent from '@testing-library/user-event'; /** * Internal dependencies */ -import { useCampaigns } from './useCampaigns'; -import { useCampaignTypes } from '~/marketing/hooks'; +import { useCampaignTypes, useCampaigns } from '~/marketing/hooks'; import { Campaigns } from './Campaigns'; -jest.mock( './useCampaigns', () => ( { - useCampaigns: jest.fn(), -} ) ); - jest.mock( '~/marketing/hooks', () => ( { + useCampaigns: jest.fn(), useCampaignTypes: jest.fn(), } ) ); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx index 9867a2495b0..d3fdcf71bca 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx @@ -28,7 +28,7 @@ import { CardHeaderTitle, CreateNewCampaignModal, } from '~/marketing/components'; -import { useCampaigns } from './useCampaigns'; +import { useCampaigns } from '~/marketing/hooks'; import './Campaigns.scss'; const tableCaption = __( 'Campaigns', 'woocommerce' ); From 11683be1a86fb50dbf4c6f5d7743be72097452cf Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 23:17:22 +0800 Subject: [PATCH 1119/1680] Set default parameter values for useCampaigns. --- .../client/marketing/hooks/useCampaigns.ts | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts b/plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts index 01765b61b62..6b1672142b6 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts @@ -27,13 +27,10 @@ type UseCampaignsType = { /** * Custom hook to get campaigns. * - * @param page Page number. First page is `1`. - * @param perPage Page size, i.e. number of records in one page. + * @param page Page number. Default is `1`. + * @param perPage Page size, i.e. number of records in one page. Default is `5`. */ -export const useCampaigns = ( - page: number, - perPage: number -): UseCampaignsType => { +export const useCampaigns = ( page = 1, perPage = 5 ): UseCampaignsType => { const { data: channels } = useRegisteredChannels(); return useSelect( From ddd287cc4cfb5c2a8de186c7d6b16f86860da292 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sun, 19 Mar 2023 23:30:21 +0800 Subject: [PATCH 1120/1680] Show Campaigns card when banner is dismissed or campaigns total is truthy. --- .../MarketingOverviewMultichannel.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index 4b5eb7f21ec..efdd1cbd46c 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -12,6 +12,7 @@ import '~/marketing/data-multichannel'; import { CenteredSpinner } from '~/marketing/components'; import { useIntroductionBanner, + useCampaigns, useRegisteredChannels, useRecommendedChannels, useCampaignTypes, @@ -31,6 +32,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { isIntroductionBannerDismissed, dismissIntroductionBanner, } = useIntroductionBanner(); + const { loading: loadingCampaigns, meta: metaCampaigns } = useCampaigns(); const { loading: loadingCampaignTypes, data: dataCampaignTypes, @@ -48,6 +50,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { if ( loadingIntroductionBanner || + ( loadingCampaigns && metaCampaigns?.total === undefined ) || ( loadingCampaignTypes && ! dataCampaignTypes ) || ( loadingRegistered && ! dataRegistered ) || ( loadingRecommended && ! dataRecommended ) @@ -55,6 +58,10 @@ export const MarketingOverviewMultichannel: React.FC = () => { return ; } + const shouldShowCampaigns = + dataRegistered?.length && + ( isIntroductionBannerDismissed || !! metaCampaigns?.total ); + const shouldShowExtensions = getAdminSetting( 'allowMarketplaceSuggestions', false ) && currentUserCan( 'install_plugins' ); @@ -76,7 +83,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { } } /> ) } - { !! dataRegistered?.length && } + { !! shouldShowCampaigns && } { !! ( dataRegistered && dataRecommended ) && !! ( dataRegistered.length || dataRecommended.length ) && ( Date: Sun, 19 Mar 2023 23:34:17 +0800 Subject: [PATCH 1121/1680] Remove unneeded CSS. --- .../IntroductionBanner/IntroductionBanner.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss index 95209ff6e1f..66144e3387e 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss @@ -9,15 +9,11 @@ .woocommerce-marketing-introduction-banner-title { font-size: 20px; - font-weight: 400; line-height: 28px; margin-bottom: $gap-smaller; } .woocommerce-marketing-introduction-banner-features { - font-size: 13px; - font-weight: 400; - line-height: 16px; color: $gray-700; svg { @@ -32,7 +28,11 @@ .woocommerce-marketing-introduction-banner-illustration { width: 271px; - background: linear-gradient(90deg, rgba(247, 237, 247, 0) 5.31%, rgba(196, 152, 217, 0.12) 77.75%); + background: linear-gradient( + 90deg, + rgba( 247, 237, 247, 0 ) 5.31%, + rgba( 196, 152, 217, 0.12 ) 77.75% + ); .woocommerce-marketing-introduction-banner-close-button { position: absolute; From 75c11a681db3fe7ee13f1446a4462531db6f8a89 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 20 Mar 2023 00:11:32 +0800 Subject: [PATCH 1122/1680] Simplify CSS to have less hardcoded width value. --- .../IntroductionBanner/IntroductionBanner.scss | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss index 66144e3387e..93ee80d5f3c 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss @@ -1,10 +1,11 @@ .woocommerce-marketing-introduction-banner { & > div { display: flex; + flex-wrap: wrap; } .woocommerce-marketing-introduction-banner-content { - width: 350px; + flex: 1 0; margin: 32px 20px 32px 40px; .woocommerce-marketing-introduction-banner-title { @@ -27,12 +28,8 @@ } .woocommerce-marketing-introduction-banner-illustration { - width: 271px; - background: linear-gradient( - 90deg, - rgba( 247, 237, 247, 0 ) 5.31%, - rgba( 196, 152, 217, 0.12 ) 77.75% - ); + flex: 0 0 270px; + background: linear-gradient(90deg, rgba(247, 237, 247, 0) 5.31%, rgba(196, 152, 217, 0.12) 77.75%); .woocommerce-marketing-introduction-banner-close-button { position: absolute; From 5455abcabb31ce7ecf4261711b22cdd4b3959bc9 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 20 Mar 2023 01:00:19 +0800 Subject: [PATCH 1123/1680] Use useImperativeHandle instead of exposing button ref in Channels. --- .../Channels/Channels.tsx | 156 ++++++++++-------- .../overview-multichannel/Channels/index.ts | 1 + .../MarketingOverviewMultichannel.tsx | 10 +- 3 files changed, 96 insertions(+), 71 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx index 37095169b23..5abf9f0d13f 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx @@ -1,7 +1,13 @@ /** * External dependencies */ -import { Fragment, useState } from '@wordpress/element'; +import { + Fragment, + useState, + forwardRef, + useImperativeHandle, + useRef, +} from '@wordpress/element'; import { __ } from '@wordpress/i18n'; import { Card, @@ -27,80 +33,100 @@ import { RegisteredChannelCardBody } from './RegisteredChannelCardBody'; import './Channels.scss'; type ChannelsProps = { - addChannelsButtonRef: React.ForwardedRef< HTMLButtonElement >; registeredChannels: Array< RegisteredChannel >; recommendedChannels: Array< RecommendedChannel >; onInstalledAndActivated?: () => void; }; -export const Channels: React.FC< ChannelsProps > = ( { - addChannelsButtonRef, - registeredChannels, - recommendedChannels, - onInstalledAndActivated, -} ) => { - const hasRegisteredChannels = registeredChannels.length >= 1; - +export type ChannelsRef = { /** - * State to collapse / expand the recommended channels. - * Initial state is expanded if there are no registered channels in first page load. + * Scroll into the "Add channels" section in the card. + * The section will be expanded, and the "Add channels" button will be in focus. */ - const [ expanded, setExpanded ] = useState( ! hasRegisteredChannels ); + scrollIntoAddChannels: () => void; +}; - return ( - - - - { __( 'Channels', 'woocommerce' ) } - - { ! hasRegisteredChannels && ( - - { __( - 'Start by adding a channel to your store', - 'woocommerce' - ) } - - ) } - +export const Channels = forwardRef< ChannelsRef, ChannelsProps >( + ( + { registeredChannels, recommendedChannels, onInstalledAndActivated }, + ref + ) => { + const hasRegisteredChannels = registeredChannels.length >= 1; - { /* Registered channels section. */ } - { registeredChannels.map( ( el, idx ) => { - return ( + /** + * State to collapse / expand the recommended channels. + * Initial state is expanded if there are no registered channels in first page load. + */ + const [ expanded, setExpanded ] = useState( ! hasRegisteredChannels ); + const addChannelsButtonRef = useRef< HTMLButtonElement >( null ); + + useImperativeHandle( + ref, + () => ( { + scrollIntoAddChannels: () => { + setExpanded( true ); + addChannelsButtonRef.current?.focus(); + addChannelsButtonRef.current?.scrollIntoView(); + }, + } ), + [] + ); + + return ( + + + + { __( 'Channels', 'woocommerce' ) } + + { ! hasRegisteredChannels && ( + + { __( + 'Start by adding a channel to your store', + 'woocommerce' + ) } + + ) } + + + { /* Registered channels section. */ } + { registeredChannels.map( ( el, idx ) => ( { idx !== registeredChannels.length - 1 && ( ) } - ); - } ) } + ) ) } - { /* Recommended channels section. */ } - { recommendedChannels.length >= 1 && ( -
    - { !! hasRegisteredChannels && ( - <> - - - - - - ) } - { !! expanded && - recommendedChannels.map( ( el, idx ) => { - return ( + > + { __( 'Add channels', 'woocommerce' ) } + + + + + ) } + { !! expanded && + recommendedChannels.map( ( el, idx ) => ( = ( { ) } - ); - } ) } -
    - ) } -
    - ); -}; + ) ) } +
    + ) } + + ); + } +); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/index.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/index.ts index da0d9c56072..f0e4fcc3762 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/index.ts +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/index.ts @@ -1 +1,2 @@ export { Channels } from './Channels'; +export type { ChannelsRef } from './Channels'; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index efdd1cbd46c..3919ab5e482 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -20,7 +20,7 @@ import { import { getAdminSetting } from '~/utils/admin-settings'; import { IntroductionBanner } from './IntroductionBanner'; import { Campaigns } from './Campaigns'; -import { Channels } from './Channels'; +import { Channels, ChannelsRef } from './Channels'; import { InstalledExtensions } from './InstalledExtensions'; import { DiscoverTools } from './DiscoverTools'; import { LearnMarketing } from './LearnMarketing'; @@ -46,7 +46,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { const { loading: loadingRecommended, data: dataRecommended } = useRecommendedChannels(); const { currentUserCan } = useUser(); - const addChannelsButtonRef = useRef< HTMLButtonElement >( null ); + const channelsRef = useRef< ChannelsRef >( null ); if ( loadingIntroductionBanner || @@ -77,9 +77,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { { - addChannelsButtonRef.current?.focus(); - addChannelsButtonRef.current?.click(); - addChannelsButtonRef.current?.scrollIntoView(); + channelsRef.current?.scrollIntoAddChannels(); } } /> ) } @@ -87,7 +85,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { { !! ( dataRegistered && dataRecommended ) && !! ( dataRegistered.length || dataRecommended.length ) && ( Date: Mon, 20 Mar 2023 10:38:30 +0800 Subject: [PATCH 1124/1680] Add tracks for plugin installation and activation (#37261) * Add @woocommerce/tracks to @woocommerce/data dependencies * Add tracks for plugin actions and handle plugin error properly * Add changelog * Add doc * Update doc --- .../add-track-event-for-plugins-actions | 4 ++ packages/js/data/package.json | 1 + packages/js/data/src/plugins/actions.ts | 71 +++++++++++-------- pnpm-lock.yaml | 2 + 4 files changed, 48 insertions(+), 30 deletions(-) create mode 100644 packages/js/data/changelog/add-track-event-for-plugins-actions diff --git a/packages/js/data/changelog/add-track-event-for-plugins-actions b/packages/js/data/changelog/add-track-event-for-plugins-actions new file mode 100644 index 00000000000..d766dff9913 --- /dev/null +++ b/packages/js/data/changelog/add-track-event-for-plugins-actions @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Add tracks for plugin actions and handle plugin error properly diff --git a/packages/js/data/package.json b/packages/js/data/package.json index 2e9a37e793f..b237e40a7f2 100644 --- a/packages/js/data/package.json +++ b/packages/js/data/package.json @@ -28,6 +28,7 @@ "dependencies": { "@woocommerce/date": "workspace:*", "@woocommerce/navigation": "workspace:*", + "@woocommerce/tracks": "workspace:*", "@wordpress/api-fetch": "wp-6.0", "@wordpress/compose": "wp-6.0", "@wordpress/core-data": "wp-6.0", diff --git a/packages/js/data/src/plugins/actions.ts b/packages/js/data/src/plugins/actions.ts index 8a15fc82441..be5df5aea54 100644 --- a/packages/js/data/src/plugins/actions.ts +++ b/packages/js/data/src/plugins/actions.ts @@ -9,6 +9,7 @@ import { import { _n, sprintf } from '@wordpress/i18n'; import { DispatchFromMap } from '@automattic/data-stores'; import { controls } from '@wordpress/data'; +import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies @@ -49,21 +50,22 @@ const isPluginResponseError = ( typeof error === 'object' && error !== null && plugins[ 0 ] in error; const formatErrorMessage = ( - pluginErrors: PluginResponseErrors, - actionType = 'install' + actionType: 'install' | 'activate' = 'install', + plugins: Partial< PluginNames >[], + rawErrorMessage: string ) => { return sprintf( /* translators: %(actionType): install or activate (the plugin). %(pluginName): a plugin slug (e.g. woocommerce-services). %(error): a single error message or in plural a comma separated error message list.*/ _n( 'Could not %(actionType)s %(pluginName)s plugin, %(error)s', 'Could not %(actionType)s the following plugins: %(pluginName)s with these Errors: %(error)s', - Object.keys( pluginErrors ).length || 1, + Object.keys( plugins ).length || 1, 'woocommerce' ), { actionType, - pluginName: Object.keys( pluginErrors ).join( ', ' ), - error: Object.values( pluginErrors ).join( ', \n' ), + pluginName: plugins.join( ', ' ), + error: rawErrorMessage, } ); }; @@ -174,35 +176,42 @@ export function setRecommendedPlugins( } function* handlePluginAPIError( - actionType: string, + actionType: 'install' | 'activate', plugins: Partial< PluginNames >[], error: unknown ) { - yield setError( 'installPlugins', error ); + let rawErrorMessage; - let pluginResponseError = error; - if ( - ( error instanceof Error || isRestApiError( error ) ) && - plugins[ 0 ] - ) { - pluginResponseError = { - [ plugins[ 0 ] ]: [ error.message ], - }; - } - - if ( isPluginResponseError( plugins, pluginResponseError ) ) { - throw new PluginError( - formatErrorMessage( pluginResponseError, actionType ), - pluginResponseError - ); + if ( isPluginResponseError( plugins, error ) ) { + // Backend error messages are in the form of { plugin-slug: [ error messages ] }. + rawErrorMessage = Object.values( error ).join( ', \n' ); } else { - throw new PluginError( - `Unexpected Plugin Error: ${ JSON.stringify( - pluginResponseError - ) }`, - pluginResponseError - ); + // Other error such as API connection errors. + rawErrorMessage = + isRestApiError( error ) || error instanceof Error + ? error.message + : JSON.stringify( error ); } + + // Track the error. + switch ( actionType ) { + case 'install': + recordEvent( 'install_plugins_error', { + plugins: plugins.join( ', ' ), + message: rawErrorMessage, + } ); + break; + case 'activate': + recordEvent( 'activate_plugins_error', { + plugins: plugins.join( ', ' ), + message: rawErrorMessage, + } ); + } + + throw new PluginError( + formatErrorMessage( actionType, plugins, rawErrorMessage ), + error + ); } // Action Creator Generators @@ -225,6 +234,7 @@ export function* installPlugins( plugins: Partial< PluginNames >[] ) { return results; } catch ( error ) { + yield setError( 'installPlugins', error ); yield handlePluginAPIError( 'install', plugins, error ); } finally { yield setIsRequesting( 'installPlugins', false ); @@ -251,6 +261,7 @@ export function* activatePlugins( plugins: Partial< PluginNames >[] ) { return results; } catch ( error ) { + yield setError( 'activatePlugins', error ); yield handlePluginAPIError( 'activate', plugins, error ); } finally { yield setIsRequesting( 'activatePlugins', false ); @@ -305,7 +316,7 @@ export function* connectToJetpack( } export function* installJetpackAndConnect( - errorAction: ( errorMesage: string ) => void, + errorAction: ( errorMessage: string ) => void, getAdminLink: ( endpoint: string ) => string ) { try { @@ -329,7 +340,7 @@ export function* installJetpackAndConnect( export function* connectToJetpackWithFailureRedirect( failureRedirect: string, - errorAction: ( errorMesage: string ) => void, + errorAction: ( errorMessage: string ) => void, getAdminLink: ( endpoint: string ) => string ) { try { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19dfd5615bf..efd192efeec 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -608,6 +608,7 @@ importers: '@woocommerce/date': workspace:* '@woocommerce/eslint-plugin': workspace:* '@woocommerce/navigation': workspace:* + '@woocommerce/tracks': workspace:* '@wordpress/api-fetch': wp-6.0 '@wordpress/compose': wp-6.0 '@wordpress/core-data': wp-6.0 @@ -635,6 +636,7 @@ importers: dependencies: '@woocommerce/date': link:../date '@woocommerce/navigation': link:../navigation + '@woocommerce/tracks': link:../tracks '@wordpress/api-fetch': 6.3.1 '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/core-data': 4.4.5_react@17.0.2 From e8a00edaefa675f0b8175206383b1dc104a4b94e Mon Sep 17 00:00:00 2001 From: Moon Date: Sun, 19 Mar 2023 21:33:10 -0700 Subject: [PATCH 1125/1680] Visual tweaks for shipping task partners (#37229) * Visual tweaks for 2 partners layout * Add spacing between banner image and list * Add changelog * Add spacing between banner image and list * Align buttons at the bottom * Lint fix --- .../components/plugin-banner.scss | 15 ++++++++++----- ...36977-visual-tweaks-for-shipping-task-partners | 4 ++++ 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-36977-visual-tweaks-for-shipping-task-partners diff --git a/plugins/woocommerce-admin/client/tasks/fills/experimental-shipping-recommendation/components/plugin-banner.scss b/plugins/woocommerce-admin/client/tasks/fills/experimental-shipping-recommendation/components/plugin-banner.scss index aeb41e3fafe..64a78605fab 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/experimental-shipping-recommendation/components/plugin-banner.scss +++ b/plugins/woocommerce-admin/client/tasks/fills/experimental-shipping-recommendation/components/plugin-banner.scss @@ -1,5 +1,4 @@ .woocommerce-task-shipping-recommendation__plugins-install { - display: flex; padding: $gap-large calc($gap + $gap-smallest); border: 1px solid #ddd; border-radius: 3px; @@ -7,19 +6,20 @@ margin-bottom: $gap-large; &.dual { + display: flex; flex-direction: column; - justify-content: space-between; + justify-content: flex-start; width: 285px; - height: 322px; p { margin-top: 0; - margin-bottom: -$gap-smaller; + margin-bottom: 15px; color: $gray-700; } .plugins-install__plugin-banner-image { display: flex; + margin-bottom: $gap-large; img { width: 120px; height: 28px; @@ -28,8 +28,9 @@ } &.single { + display: flex; .plugins-install__list { - max-width: 380px; + max-width: 360px; } } @@ -51,6 +52,10 @@ .woocommerce-task-shipping-recommendations_plugins-buttons { display: flex; justify-content: space-between; + margin-top: $gap-large; + flex-grow: 1; + align-items: flex-end; + button { min-width: 40%; padding-inline: $gap-smaller; diff --git a/plugins/woocommerce/changelog/update-36977-visual-tweaks-for-shipping-task-partners b/plugins/woocommerce/changelog/update-36977-visual-tweaks-for-shipping-task-partners new file mode 100644 index 00000000000..62342e6c96a --- /dev/null +++ b/plugins/woocommerce/changelog/update-36977-visual-tweaks-for-shipping-task-partners @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Visual tweaks for shipping partner banners From 1aa899ae9188809a37c5cd022c1ee528f4008218 Mon Sep 17 00:00:00 2001 From: Moon Date: Sun, 19 Mar 2023 22:37:24 -0700 Subject: [PATCH 1126/1680] Add shipping partner suggestions api (#37155) * Add wp-json/wc-admin/shipping-partner-suggestions API endpoint * lint fix * lint fix * Update plugins/woocommerce/src/Admin/API/ShippingPartnerSuggestions.php Co-authored-by: Chi-Hsuan Huang * Update plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestions.php Co-authored-by: Chi-Hsuan Huang * Change row to column and column to row -- I put them incorrectly * Fix force_default_suggestions description * Chagne row to colmun and column to row * Override is_visible value after evaluation * Lint fix * Lint fix * Correct asset path --------- Co-authored-by: Chi-Hsuan Huang --- .../assets/images/shipping_partners/check.svg | 3 + .../images/shipping_partners/discount.svg | 6 + .../images/shipping_partners/envia-column.svg | 75 ++++++ .../shipping_partners/packlink-column.svg | 69 +++++ .../images/shipping_partners/packlink-row.svg | 39 +++ .../shipping_partners/sendcloud-column.svg | 78 ++++++ .../shipping_partners/sendcloud-row.svg | 23 ++ .../shipping_partners/shipstation-column.svg | 62 +++++ .../shipping_partners/shipstation-row.svg | 23 ++ .../shipping_partners/skydropx-column.svg | 69 +++++ .../assets/images/shipping_partners/star.svg | 9 + .../assets/images/shipping_partners/timer.svg | 9 + .../images/shipping_partners/wcs-column.svg | 58 ++++ ...add-36281-shipping-partners-suggestion-api | 4 + plugins/woocommerce/src/Admin/API/Init.php | 1 + .../Admin/API/ShippingPartnerSuggestions.php | 212 +++++++++++++++ .../DefaultShippingPartners.php | 250 ++++++++++++++++++ .../ShippingPartnerSuggestions.php | 70 +++++ ...pingPartnerSuggestionsDataSourcePoller.php | 40 +++ 19 files changed, 1100 insertions(+) create mode 100644 plugins/woocommerce/assets/images/shipping_partners/check.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/discount.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/envia-column.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/packlink-column.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/packlink-row.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/sendcloud-column.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/sendcloud-row.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/shipstation-column.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/shipstation-row.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/skydropx-column.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/star.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/timer.svg create mode 100644 plugins/woocommerce/assets/images/shipping_partners/wcs-column.svg create mode 100644 plugins/woocommerce/changelog/add-36281-shipping-partners-suggestion-api create mode 100644 plugins/woocommerce/src/Admin/API/ShippingPartnerSuggestions.php create mode 100644 plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/DefaultShippingPartners.php create mode 100644 plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestions.php create mode 100644 plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestionsDataSourcePoller.php diff --git a/plugins/woocommerce/assets/images/shipping_partners/check.svg b/plugins/woocommerce/assets/images/shipping_partners/check.svg new file mode 100644 index 00000000000..2ddc7203902 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/check.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/discount.svg b/plugins/woocommerce/assets/images/shipping_partners/discount.svg new file mode 100644 index 00000000000..2855be644bd --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/discount.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/envia-column.svg b/plugins/woocommerce/assets/images/shipping_partners/envia-column.svg new file mode 100644 index 00000000000..ab9b864ed21 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/envia-column.svg @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/packlink-column.svg b/plugins/woocommerce/assets/images/shipping_partners/packlink-column.svg new file mode 100644 index 00000000000..26e912a6c77 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/packlink-column.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/packlink-row.svg b/plugins/woocommerce/assets/images/shipping_partners/packlink-row.svg new file mode 100644 index 00000000000..31be20af962 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/packlink-row.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/sendcloud-column.svg b/plugins/woocommerce/assets/images/shipping_partners/sendcloud-column.svg new file mode 100644 index 00000000000..5eb02636c50 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/sendcloud-column.svg @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/sendcloud-row.svg b/plugins/woocommerce/assets/images/shipping_partners/sendcloud-row.svg new file mode 100644 index 00000000000..7af5c26fe42 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/sendcloud-row.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/shipstation-column.svg b/plugins/woocommerce/assets/images/shipping_partners/shipstation-column.svg new file mode 100644 index 00000000000..7e4ce249077 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/shipstation-column.svg @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/shipstation-row.svg b/plugins/woocommerce/assets/images/shipping_partners/shipstation-row.svg new file mode 100644 index 00000000000..965fcdb3e8f --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/shipstation-row.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/skydropx-column.svg b/plugins/woocommerce/assets/images/shipping_partners/skydropx-column.svg new file mode 100644 index 00000000000..bb7e0f47fdd --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/skydropx-column.svg @@ -0,0 +1,69 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/star.svg b/plugins/woocommerce/assets/images/shipping_partners/star.svg new file mode 100644 index 00000000000..2283a6f2cb4 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/star.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/timer.svg b/plugins/woocommerce/assets/images/shipping_partners/timer.svg new file mode 100644 index 00000000000..afb0cdc184b --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/timer.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plugins/woocommerce/assets/images/shipping_partners/wcs-column.svg b/plugins/woocommerce/assets/images/shipping_partners/wcs-column.svg new file mode 100644 index 00000000000..57d2056c995 --- /dev/null +++ b/plugins/woocommerce/assets/images/shipping_partners/wcs-column.svg @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce/changelog/add-36281-shipping-partners-suggestion-api b/plugins/woocommerce/changelog/add-36281-shipping-partners-suggestion-api new file mode 100644 index 00000000000..c4cf04442d7 --- /dev/null +++ b/plugins/woocommerce/changelog/add-36281-shipping-partners-suggestion-api @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add wp-json/wc-admin/shipping-partner-suggestions API endpoint diff --git a/plugins/woocommerce/src/Admin/API/Init.php b/plugins/woocommerce/src/Admin/API/Init.php index 80d74c8c2ad..d0e6197ec7e 100644 --- a/plugins/woocommerce/src/Admin/API/Init.php +++ b/plugins/woocommerce/src/Admin/API/Init.php @@ -90,6 +90,7 @@ class Init { 'Automattic\WooCommerce\Admin\API\NavigationFavorites', 'Automattic\WooCommerce\Admin\API\Taxes', 'Automattic\WooCommerce\Admin\API\MobileAppMagicLink', + 'Automattic\WooCommerce\Admin\API\ShippingPartnerSuggestions', ); $product_form_controllers = array(); diff --git a/plugins/woocommerce/src/Admin/API/ShippingPartnerSuggestions.php b/plugins/woocommerce/src/Admin/API/ShippingPartnerSuggestions.php new file mode 100644 index 00000000000..0c5c8c2a95d --- /dev/null +++ b/plugins/woocommerce/src/Admin/API/ShippingPartnerSuggestions.php @@ -0,0 +1,212 @@ +namespace, + '/' . $this->rest_base, + array( + array( + 'methods' => \WP_REST_Server::READABLE, + 'callback' => array( $this, 'get_suggestions' ), + 'permission_callback' => array( $this, 'get_permission_check' ), + 'args' => array( + 'force_default_suggestions' => array( + 'type' => 'boolean', + 'description' => __( 'Return the default shipping partner suggestions when woocommerce_show_marketplace_suggestions option is set to no', 'woocommerce' ), + ), + ), + ), + 'schema' => array( $this, 'get_suggestions_schema' ), + ) + ); + + } + + /** + * Check if a given request has access to manage plugins. + * + * @param WP_REST_Request $request Full details about the request. + * @return WP_Error|boolean + */ + public function get_permission_check( $request ) { + if ( ! current_user_can( 'install_plugins' ) ) { + return new \WP_Error( 'woocommerce_rest_cannot_update', __( 'Sorry, you cannot manage plugins.', 'woocommerce' ), array( 'status' => rest_authorization_required_code() ) ); + } + return true; + } + + /** + * Check if suggestions should be shown in the settings screen. + * + * @return bool + */ + private function should_display() { + if ( 'no' === get_option( 'woocommerce_show_marketplace_suggestions', 'yes' ) ) { + return false; + } + + /** + * The return value can be controlled via woocommerce_allow_shipping_partner_suggestions filter. + * + * @since 7.4.1 + */ + return apply_filters( 'woocommerce_allow_shipping_partner_suggestions', true ); + } + + /** + * Return suggested shipping partners. + * + * @param WP_REST_Request $request Full details about the request. + * @return \WP_Error|\WP_HTTP_Response|\WP_REST_Response + */ + public function get_suggestions( $request ) { + $should_display = $this->should_display(); + $force_default = $request->get_param( 'force_default_suggestions' ); + + if ( $should_display ) { + return Suggestions::get_suggestions(); + } elseif ( false === $should_display && true === $force_default ) { + return rest_ensure_response( Suggestions::get_suggestions( DefaultShippingPartners::get_all() ) ); + } + + return rest_ensure_response( Suggestions::get_suggestions( DefaultShippingPartners::get_all() ) ); + } + + /** + * Get the schema, conforming to JSON Schema. + * + * @return array + */ + public static function get_suggestions_schema() { + $feature_def = array( + 'type' => 'array', + 'items' => array( + 'type' => 'object', + 'properties' => array( + 'icon' => array( + 'type' => 'string', + ), + 'title' => array( + 'type' => 'string', + ), + 'description' => array( + 'type' => 'string', + ), + ), + ), + ); + $layout_def = array( + 'type' => 'object', + 'properties' => array( + 'image' => array( + 'type' => 'string', + 'description' => '', + ), + 'features' => $feature_def, + ), + ); + + $item_schema = array( + 'type' => 'object', + 'required' => array( 'name', 'is_visible', 'available_layouts' ), + // require layout_row or layout_column. One of them must exist. + 'anyOf' => array( + array( + 'required' => 'layout_row', + ), + array( + 'required' => 'layout_column', + ), + ), + 'properties' => array( + 'name' => array( + 'description' => __( 'Plugin name.', 'woocommerce' ), + 'type' => 'string', + 'required' => true, + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'slug' => array( + 'description' => __( 'Plugin slug used in https://wordpress.org/plugins/{slug}.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'layout_row' => $layout_def, + 'layout_column' => $layout_def, + 'description' => array( + 'description' => __( 'Description', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'learn_more_link' => array( + 'description' => __( 'Learn more link .', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'is_visible' => array( + 'description' => __( 'Suggestion visibility.', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + 'available_layouts' => array( + 'description' => __( 'Available layouts -- single, dual, or both', 'woocommerce' ), + 'type' => 'array', + 'items' => array( + 'type' => 'string', + 'enum' => array( 'row', 'column' ), + ), + 'context' => array( 'view', 'edit' ), + 'readonly' => true, + ), + ), + ); + + $schema = array( + '$schema' => 'http://json-schema.org/draft-04/schema#', + 'title' => 'shipping-partner-suggestions', + 'type' => 'array', + 'items' => array( $item_schema ), + ); + + return $schema; + } +} diff --git a/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/DefaultShippingPartners.php b/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/DefaultShippingPartners.php new file mode 100644 index 00000000000..866d156482c --- /dev/null +++ b/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/DefaultShippingPartners.php @@ -0,0 +1,250 @@ +plugin_url() . '/assets/images/shipping_partners/'; + $column_layout_features = array( + array( + 'icon' => $asset_base_url . 'timer.svg', + 'title' => __( 'Save time', 'woocommerce' ), + 'description' => __( + 'Automatically import order information to quickly print your labels.', + 'woocommerce' + ), + ), + array( + 'icon' => $asset_base_url . 'discount.svg', + 'title' => __( 'Save money', 'woocommerce' ), + 'description' => __( + 'Shop for the best shipping rates, and access pre-negotiated discounted rates.', + 'woocommerce' + ), + ), + array( + 'icon' => $asset_base_url . 'star.svg', + 'title' => __( 'Wow your shoppers', 'woocommerce' ), + 'description' => __( + 'Keep your customers informed with tracking notifications.', + 'woocommerce' + ), + ), + ); + + $check_icon = $asset_base_url . 'check.svg'; + + return array( + array( + 'name' => 'ShipStation', + 'slug' => 'woocommerce-shipstation-integration', + 'description' => __( 'Powerful yet easy-to-use solution:', 'woocommerce' ), + 'layout_column' => array( + 'image' => $asset_base_url . 'shipstation-column.svg', + 'features' => $column_layout_features, + ), + 'layout_row' => array( + 'image' => $asset_base_url . 'shipstation-row.svg', + 'features' => array( + array( + 'icon' => $check_icon, + 'description' => __( + 'Print labels from Royal Mail, Parcel Force, DPD, and many more', + 'woocommerce' + ), + ), + array( + 'icon' => $check_icon, + 'description' => __( + 'Shop for the best rates, in real-time', + 'woocommerce' + ), + ), + array( + 'icon' => $check_icon, + 'description' => __( 'Connect selling channels easily', 'woocommerce' ), + ), + array( + 'icon' => $check_icon, + 'description' => __( 'Advance automated workflows', 'woocommerce' ), + ), + array( + 'icon' => $check_icon, + 'description' => __( '30-days free trial', 'woocommerce' ), + ), + ), + ), + 'learn_more_link' => 'https://wordpress.org/plugins/woocommerce-shipstation-integration/', + 'is_visible' => array( + self::get_rules_for_countries( array( 'AU', 'CA', 'GB' ) ), + ), + 'available_layouts' => array( 'row', 'column' ), + ), + array( + 'name' => 'Skydropx', + 'slug' => 'skydropx-cotizador-y-envios', + 'layout_column' => array( + 'image' => $asset_base_url . 'skydropx-column.svg', + 'features' => $column_layout_features, + ), + 'description' => '', + 'learn_more_link' => 'https://wordpress.org/plugins/skydropx-cotizador-y-envios/', + 'is_visible' => array( + self::get_rules_for_countries( array( 'MX', 'CO' ) ), + ), + 'available_layouts' => array( 'column' ), + ), + array( + 'name' => 'Envia', + 'slug' => '', + 'description' => '', + 'layout_column' => array( + 'image' => $asset_base_url . 'envia-column.svg', + 'features' => $column_layout_features, + ), + 'learn_more_link' => 'https://woocommerce.com/products/envia-shipping-and-fulfillment/', + 'is_visible' => array( + self::get_rules_for_countries( array( 'CL', 'AR', 'PE', 'BR', 'UY', 'GT' ) ), + ), + 'available_layouts' => array( 'column' ), + ), + array( + 'name' => 'Sendcloud', + 'slug' => 'sendcloud-shipping', + 'description' => __( 'All-in-one shipping tool:', 'woocommerce' ), + 'layout_column' => array( + 'image' => $asset_base_url . 'sendcloud-column.svg', + 'features' => $column_layout_features, + ), + 'layout_row' => array( + 'image' => $asset_base_url . 'sendcloud-row.svg', + 'features' => array( + array( + 'icon' => $check_icon, + 'description' => __( 'Print labels from 80+ carriers', 'woocommerce' ), + ), + array( + 'icon' => $check_icon, + 'description' => __( + 'Process orders in just a few clicks', + 'woocommerce' + ), + ), + array( + 'icon' => $check_icon, + 'description' => __( 'Customize checkout options', 'woocommerce' ), + ), + + array( + 'icon' => $check_icon, + 'description' => __( 'Self-service tracking & returns', 'woocommerce' ), + ), + array( + 'icon' => $check_icon, + 'description' => __( 'Start with a free plan', 'woocommerce' ), + ), + ), + ), + 'learn_more_link' => 'https://wordpress.org/plugins/sendcloud-shipping/', + 'is_visible' => array( + self::get_rules_for_countries( array( 'NL', 'AT', 'BE', 'FR', 'DE', 'ES', 'GB', 'IT' ) ), + ), + 'available_layouts' => array( 'row', 'column' ), + ), + array( + 'name' => 'Packlink', + 'slug' => 'packlink-pro-shipping', + 'description' => __( 'Optimize your full shipping process:', 'woocommerce' ), + 'layout_column' => array( + 'image' => $asset_base_url . 'packlink-column.svg', + 'features' => $column_layout_features, + ), + 'layout_row' => array( + 'image' => $asset_base_url . 'packlink-row.svg', + 'features' => array( + array( + 'icon' => $check_icon, + 'description' => __( + 'Automated, real-time order import', + 'woocommerce' + ), + ), + array( + 'icon' => $check_icon, + 'description' => __( + 'Direct access to leading carriers', + 'woocommerce' + ), + ), + array( + 'icon' => $check_icon, + 'description' => __( + 'Access competitive shipping prices', + 'woocommerce' + ), + ), + array( + 'icon' => $check_icon, + 'description' => __( 'Quickly bulk print labels', 'woocommerce' ), + ), + array( + 'icon' => $check_icon, + 'description' => __( 'Free shipping platform', 'woocommerce' ), + ), + ), + ), + 'learn_more_link' => 'https://wordpress.org/plugins/packlink-pro-shipping/', + 'is_visible' => array( + self::get_rules_for_countries( array( 'FR', 'DE', 'ES', 'IT' ) ), + ), + 'available_layouts' => array( 'row', 'column' ), + ), + array( + 'title' => 'WooCommerce Shipping', + 'slug' => 'woocommerce-services', + 'description' => __( 'Save time and money by printing your shipping labels right from your computer with WooCommerce Shipping. Try WooCommerce Shipping for free.', 'woocommerce' ), + 'layout_column' => array( + 'image' => $asset_base_url . 'wcs-column.svg', + 'features' => $column_layout_features, + ), + 'learn_more_link' => 'https://woocommerce.com/products/shipping/', + 'is_visible' => array( + self::get_rules_for_countries( array( 'US' ) ), + ), + 'available_layouts' => array( 'column' ), + ), + ); + } + + /** + * Get rules that match the store base location to one of the provided countries. + * + * @param array $countries Array of countries to match. + * @return object Rules to match. + */ + public static function get_rules_for_countries( $countries ) { + $rules = array(); + + foreach ( $countries as $country ) { + $rules[] = (object) array( + 'type' => 'base_location_country', + 'value' => $country, + 'operation' => '=', + ); + } + + return (object) array( + 'type' => 'or', + 'operands' => $rules, + ); + } +} diff --git a/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestions.php b/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestions.php new file mode 100644 index 00000000000..dd31e22d5ea --- /dev/null +++ b/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestions.php @@ -0,0 +1,70 @@ +is_visible ) ) { + $is_visible = $rule_evaluator->evaluate( $spec->is_visible ); + if ( $is_visible ) { + $spec->is_visible = true; + $suggestions[] = $spec; + } + } + } + + return $suggestions; + } + + /** + * Get specs or fetch remotely if they don't exist. + */ + public static function get_specs_from_datasource() { + if ( 'no' === get_option( 'woocommerce_show_marketplace_suggestions', 'yes' ) ) { + /** + * It can be used to modify shipping partner suggestions spec. + * + * @since 7.4.1 + */ + return apply_filters( 'woocommerce_admin_shipping_partner_suggestions_specs', DefaultShippingPartners::get_all() ); + } + $specs = ShippingPartnerSuggestionsDataSourcePoller::get_instance()->get_specs_from_data_sources(); + + // Fetch specs if they don't yet exist. + if ( false === $specs || ! is_array( $specs ) || 0 === count( $specs ) ) { + /** + * It can be used to modify shipping partner suggestions spec. + * + * @since 7.4.1 + */ + return apply_filters( 'woocommerce_admin_shipping_partner_suggestions_specs', DefaultShippingPartners::get_all() ); + } + + /** + * It can be used to modify shipping partner suggestions spec. + * + * @since 7.4.1 + */ + return apply_filters( 'woocommerce_admin_shipping_partner_suggestions_specs', $specs ); + } +} diff --git a/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestionsDataSourcePoller.php b/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestionsDataSourcePoller.php new file mode 100644 index 00000000000..04c2708c523 --- /dev/null +++ b/plugins/woocommerce/src/Admin/Features/ShippingPartnerSuggestions/ShippingPartnerSuggestionsDataSourcePoller.php @@ -0,0 +1,40 @@ + Date: Mon, 20 Mar 2023 16:48:44 +0800 Subject: [PATCH 1127/1680] fix: added skydropx slug back to shipping partners list (#37286) --- .../fills/shipping/shipping-providers/shipping-providers.ts | 1 + plugins/woocommerce/changelog/fix-skydropx-auto-install | 4 ++++ 2 files changed, 5 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-skydropx-auto-install diff --git a/plugins/woocommerce-admin/client/tasks/fills/shipping/shipping-providers/shipping-providers.ts b/plugins/woocommerce-admin/client/tasks/fills/shipping/shipping-providers/shipping-providers.ts index 58df653cdbf..10f703ac863 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/shipping/shipping-providers/shipping-providers.ts +++ b/plugins/woocommerce-admin/client/tasks/fills/shipping/shipping-providers/shipping-providers.ts @@ -83,6 +83,7 @@ const providers = { }, Skydropx: { name: 'Skydropx' as const, + slug: 'skydropx-cotizador-y-envios', // https://wordpress.org/plugins/skydropx-cotizador-y-envios/ url: 'https://wordpress.org/plugins/skydropx-cotizador-y-envios/', 'single-partner-layout': SkydropxSinglePartner, }, diff --git a/plugins/woocommerce/changelog/fix-skydropx-auto-install b/plugins/woocommerce/changelog/fix-skydropx-auto-install new file mode 100644 index 00000000000..c499483a4d9 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-skydropx-auto-install @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Added skydropx slug back to shipping partners list so that it can be installed through the shipping task From 29299903c3f31ca3307ba63e172b07089c77facc Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 20 Mar 2023 17:23:20 +0800 Subject: [PATCH 1128/1680] Make shouldShowCampaigns boolean type. --- .../MarketingOverviewMultichannel.tsx | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index 3919ab5e482..94784f01468 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -58,9 +58,10 @@ export const MarketingOverviewMultichannel: React.FC = () => { return ; } - const shouldShowCampaigns = + const shouldShowCampaigns = !! ( dataRegistered?.length && - ( isIntroductionBannerDismissed || !! metaCampaigns?.total ); + ( isIntroductionBannerDismissed || metaCampaigns?.total ) + ); const shouldShowExtensions = getAdminSetting( 'allowMarketplaceSuggestions', false ) && @@ -81,7 +82,7 @@ export const MarketingOverviewMultichannel: React.FC = () => { } } /> ) } - { !! shouldShowCampaigns && } + { shouldShowCampaigns && } { !! ( dataRegistered && dataRecommended ) && !! ( dataRegistered.length || dataRecommended.length ) && ( Date: Mon, 20 Mar 2023 17:46:54 +0800 Subject: [PATCH 1129/1680] Make scrollIntoView center on the "Add channels" button. --- .../marketing/overview-multichannel/Channels/Channels.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx index 5abf9f0d13f..7427f3f15f1 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Channels/Channels.tsx @@ -66,7 +66,9 @@ export const Channels = forwardRef< ChannelsRef, ChannelsProps >( scrollIntoAddChannels: () => { setExpanded( true ); addChannelsButtonRef.current?.focus(); - addChannelsButtonRef.current?.scrollIntoView(); + addChannelsButtonRef.current?.scrollIntoView( { + block: 'center', + } ); }, } ), [] From 4e38969ce7d2f3b1246573fac46c4eb7b4d3b9af Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 20 Mar 2023 18:07:30 +0800 Subject: [PATCH 1130/1680] Use one illustration instead of two in IntroductionBanner. --- .../IntroductionBanner/IntroductionBanner.scss | 9 ++++++++- .../IntroductionBanner/IntroductionBanner.tsx | 16 +++++----------- .../IntroductionBanner/illustration-large.svg | 5 ----- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss index 93ee80d5f3c..99ac6dc8ad4 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss @@ -29,7 +29,14 @@ .woocommerce-marketing-introduction-banner-illustration { flex: 0 0 270px; - background: linear-gradient(90deg, rgba(247, 237, 247, 0) 5.31%, rgba(196, 152, 217, 0.12) 77.75%); + background: linear-gradient(90deg, rgba(247, 237, 247, 0) 5.31%, rgba(196, 152, 217, 0.12) 77.75%), + linear-gradient(90deg, rgba(247, 237, 247, 0) 22%, rgba(196, 152, 217, 0.12) 84.6%); + + .woocommerce-marketing-introduction-banner-image-placeholder { + width: 100%; + height: 100%; + background: center / contain no-repeat; + } .woocommerce-marketing-introduction-banner-close-button { position: absolute; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx index cf3d1cae97e..8c470ec627f 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx @@ -16,7 +16,6 @@ import { } from '~/marketing/hooks'; import './IntroductionBanner.scss'; import wooIconUrl from './woo.svg'; -import illustrationUrl from './illustration.svg'; import illustrationLargeUrl from './illustration-large.svg'; type IntroductionBannerProps = { @@ -141,16 +140,11 @@ export const IntroductionBanner = ( { > - {
    diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration-large.svg b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration-large.svg index 0bd6ed50302..3a00d63416c 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration-large.svg +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration-large.svg @@ -1,6 +1,5 @@ - @@ -62,10 +61,6 @@ - - - - From 0300078dfdd52eccf3cce3eb4650986f9e895439 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 20 Mar 2023 18:08:30 +0800 Subject: [PATCH 1131/1680] Remove unused illustration.svg file. --- .../IntroductionBanner/illustration.svg | 73 ------------------- 1 file changed, 73 deletions(-) delete mode 100644 plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg deleted file mode 100644 index b2834e68fb8..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From a2b02fc00c044cd8d59a01f7e28fd53b73279d92 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 20 Mar 2023 18:11:02 +0800 Subject: [PATCH 1132/1680] Rename illustration-large.svg to illustration.svg. --- .../IntroductionBanner/IntroductionBanner.tsx | 4 ++-- .../{illustration-large.svg => illustration.svg} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/{illustration-large.svg => illustration.svg} (100%) diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx index 8c470ec627f..829152f03dd 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx @@ -16,7 +16,7 @@ import { } from '~/marketing/hooks'; import './IntroductionBanner.scss'; import wooIconUrl from './woo.svg'; -import illustrationLargeUrl from './illustration-large.svg'; +import illustrationUrl from './illustration.svg'; type IntroductionBannerProps = { onDismissClick: () => void; @@ -143,7 +143,7 @@ export const IntroductionBanner = ( {
    diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration-large.svg b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration-large.svg rename to plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg From da4f2739631143058733982ac658976a644e4c38 Mon Sep 17 00:00:00 2001 From: Tam Mullen Date: Mon, 20 Mar 2023 11:21:24 +0000 Subject: [PATCH 1133/1680] Update labels in pr labeller to include Solaris focus (#37275) Update labels in labeller to include Solaris focus --- .github/project-pr-labeler.yml | 9 +++++++++ .../changelog/update-pr-labeler-solaris-focus | 5 +++++ 2 files changed, 14 insertions(+) create mode 100644 plugins/woocommerce/changelog/update-pr-labeler-solaris-focus diff --git a/.github/project-pr-labeler.yml b/.github/project-pr-labeler.yml index 3055e4667cc..c80da44a922 100644 --- a/.github/project-pr-labeler.yml +++ b/.github/project-pr-labeler.yml @@ -65,3 +65,12 @@ - plugins/woocommerce/src/Admin/**/* - plugins/woocommerce/src/Internal/Admin/**/* - plugins/woocommerce-admin/**/* + +'focus: performance tests [team:Solaris]': +- plugins/woocommerce/tests/performance/**/* + +'focus: api tests [team:Solaris]': +- plugins/woocommerce/tests/api-core-tests/**/* + +'focus: e2e tests [team:Solaris]': +- plugins/woocommerce/tests/e2e-pw/**/* diff --git a/plugins/woocommerce/changelog/update-pr-labeler-solaris-focus b/plugins/woocommerce/changelog/update-pr-labeler-solaris-focus new file mode 100644 index 00000000000..b7d4b3d5bc3 --- /dev/null +++ b/plugins/woocommerce/changelog/update-pr-labeler-solaris-focus @@ -0,0 +1,5 @@ +Significance: patch +Type: update +Comment: workflow update not included in release zip + + From 748677c4a12217f1c309b22229249b2e1495a2ee Mon Sep 17 00:00:00 2001 From: Dharmesh Patel Date: Mon, 20 Mar 2023 17:23:19 +0530 Subject: [PATCH 1134/1680] Fix incorrect VAT exempt behaviour on shop page when prices are exclusive of tax. (#33991) --- plugins/woocommerce/changelog/fix-27012 | 4 ++ .../includes/wc-product-functions.php | 19 +++-- .../includes/wc-product-functions-test.php | 69 +++++++++++++++++++ 3 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-27012 diff --git a/plugins/woocommerce/changelog/fix-27012 b/plugins/woocommerce/changelog/fix-27012 new file mode 100644 index 00000000000..7078b14ef61 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-27012 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix incorrect VAT exempt behaviour on shop page when prices are exclusive of tax. diff --git a/plugins/woocommerce/includes/wc-product-functions.php b/plugins/woocommerce/includes/wc-product-functions.php index 746069ef5f2..f27291d3ca9 100644 --- a/plugins/woocommerce/includes/wc-product-functions.php +++ b/plugins/woocommerce/includes/wc-product-functions.php @@ -1001,13 +1001,18 @@ function wc_get_price_including_tax( $product, $args = array() ) { if ( $product->is_taxable() ) { if ( ! wc_prices_include_tax() ) { - $tax_rates = WC_Tax::get_rates( $product->get_tax_class() ); - $taxes = WC_Tax::calc_tax( $line_price, $tax_rates, false ); - - if ( 'yes' === get_option( 'woocommerce_tax_round_at_subtotal' ) ) { - $taxes_total = array_sum( $taxes ); + // If the customer is exempt from VAT, set tax total to 0. + if ( ! empty( WC()->customer ) && WC()->customer->get_is_vat_exempt() ) { + $taxes_total = 0.00; } else { - $taxes_total = array_sum( array_map( 'wc_round_tax_total', $taxes ) ); + $tax_rates = WC_Tax::get_rates( $product->get_tax_class() ); + $taxes = WC_Tax::calc_tax( $line_price, $tax_rates, false ); + + if ( 'yes' === get_option( 'woocommerce_tax_round_at_subtotal' ) ) { + $taxes_total = array_sum( $taxes ); + } else { + $taxes_total = array_sum( array_map( 'wc_round_tax_total', $taxes ) ); + } } $return_price = NumberUtil::round( $line_price + $taxes_total, wc_get_price_decimals() ); @@ -1016,7 +1021,7 @@ function wc_get_price_including_tax( $product, $args = array() ) { $base_tax_rates = WC_Tax::get_base_tax_rates( $product->get_tax_class( 'unfiltered' ) ); /** - * If the customer is excempt from VAT, remove the taxes here. + * If the customer is exempt from VAT, remove the taxes here. * Either remove the base or the user taxes depending on woocommerce_adjust_non_base_location_prices setting. */ if ( ! empty( WC()->customer ) && WC()->customer->get_is_vat_exempt() ) { // @codingStandardsIgnoreLine. diff --git a/plugins/woocommerce/tests/php/includes/wc-product-functions-test.php b/plugins/woocommerce/tests/php/includes/wc-product-functions-test.php index 2a68d98f8c2..1dcba8d1356 100644 --- a/plugins/woocommerce/tests/php/includes/wc-product-functions-test.php +++ b/plugins/woocommerce/tests/php/includes/wc-product-functions-test.php @@ -128,4 +128,73 @@ class WC_Product_Functions_Tests extends \WC_Unit_Test_Case { remove_filter( 'woocommerce_adjust_non_base_location_prices', '__return_false' ); } } + + /** + * @testdox Test 'wc_get_price_including_tax'. + * + * @testWith [true, true] + * [true, false] + * [false, true] + * [false, false] + * + * @param bool $prices_include_tax Whether entered prices are inclusive of tax. + * @param bool $is_vat_exempt Whether the VAT is exempted for customer. + */ + public function test_wc_get_price_including_tax( $prices_include_tax, $is_vat_exempt ) { + // Set VAT exempt and Mock prices_include_tax. + WC()->customer->set_is_vat_exempt( $is_vat_exempt ); + FunctionsMockerHack::add_function_mocks( + array( + 'wc_prices_include_tax' => $prices_include_tax ? '__return_true' : '__return_false', + ) + ); + + // Add dummy tax-rate. + $tax_rate = array( + 'tax_rate_country' => '', + 'tax_rate_state' => '', + 'tax_rate' => '20.0000', + 'tax_rate_name' => 'VAT', + 'tax_rate_priority' => '1', + 'tax_rate_compound' => '0', + 'tax_rate_shipping' => '1', + 'tax_rate_order' => '1', + 'tax_rate_class' => '', + ); + $tax_rate_id = WC_Tax::_insert_tax_rate( $tax_rate ); + + $wc_tax_enabled = wc_tax_enabled(); + if ( ! $wc_tax_enabled ) { + update_option( 'woocommerce_calc_taxes', 'yes' ); + } + + $product = WC_Helper_Product::create_simple_product(); + $expected_prices = array( + '10' => array( 8.33, 10, 10, 12 ), + '50' => array( 41.67, 50, 50, 60 ), + '100' => array( 83.33, 100, 100, 120 ), + ); + + foreach ( $expected_prices as $price => $value ) { + $product->set_price( $price ); + $product->save(); + if ( $prices_include_tax && $is_vat_exempt ) { + $this->assertEquals( $value[0], wc_get_price_including_tax( $product ) ); + } elseif ( $prices_include_tax && ! $is_vat_exempt ) { + $this->assertEquals( $value[1], wc_get_price_including_tax( $product ) ); + } elseif ( ! $prices_include_tax && $is_vat_exempt ) { + $this->assertEquals( $value[2], wc_get_price_including_tax( $product ) ); + } elseif ( ! $prices_include_tax && ! $is_vat_exempt ) { + $this->assertEquals( $value[3], wc_get_price_including_tax( $product ) ); + } + } + + // Test clean up. + WC()->customer->set_is_vat_exempt( false ); + WC_Tax::_delete_tax_rate( $tax_rate_id ); + WC_Helper_Product::delete_product( $product->get_id() ); + if ( ! $wc_tax_enabled ) { + update_option( 'woocommerce_calc_taxes', 'no' ); + } + } } From d0450fa43c0d2b13158a9cd7c2baca8255065538 Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Mon, 20 Mar 2023 09:32:38 -0300 Subject: [PATCH 1135/1680] Show `Stock status` options as radio buttons (#37278) * Add check to show Stock status as radiobuttons * Add changelog * Fix lint * Fix typo * Fix flaky e2e tests * Rename hook * Fix validation to show radio --------- Co-authored-by: Fernando Marichal --- ...v-37116_show_stock_status_as_radio_buttons | 4 +++ .../views/html-product-data-inventory.php | 35 +++++++++++++------ .../merchant/create-variable-product.spec.js | 18 +++++----- 3 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 plugins/woocommerce/changelog/dev-37116_show_stock_status_as_radio_buttons diff --git a/plugins/woocommerce/changelog/dev-37116_show_stock_status_as_radio_buttons b/plugins/woocommerce/changelog/dev-37116_show_stock_status_as_radio_buttons new file mode 100644 index 00000000000..3d2554ce4db --- /dev/null +++ b/plugins/woocommerce/changelog/dev-37116_show_stock_status_as_radio_buttons @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Show "Stock status" as a collection of radio buttons diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php index 952e063cd07..1e0b358ad7d 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -115,18 +115,33 @@ if ( ! defined( 'ABSPATH' ) ) { } - woocommerce_wp_select( - array( - 'id' => '_stock_status', - 'value' => $product_object->get_stock_status( 'edit' ), - 'wrapper_class' => 'stock_status_field hide_if_variable hide_if_external hide_if_grouped', - 'label' => __( 'Stock status', 'woocommerce' ), - 'options' => wc_get_product_stock_status_options(), - 'desc_tip' => true, - 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), - ) + $stock_status_options = wc_get_product_stock_status_options(); + $stock_status_count = count( $stock_status_options ); + $common_stock_status_args = array( + 'id' => '_stock_status', + 'value' => $product_object->get_stock_status( 'edit' ), + 'wrapper_class' => 'stock_status_field hide_if_variable hide_if_external hide_if_grouped', + 'label' => __( 'Stock status', 'woocommerce' ), + 'options' => $stock_status_options, ); + /** + * Allow 3rd parties to control whether the "Stock status" option will use radio buttons or a select. + * + * @since 7.6.0 + * + * @param bool If false, the "Stock status" will be shown as a select. Default: it will use radio buttons. + */ + if ( apply_filters( 'woocommerce_product_stock_status_use_radio', $stock_status_count <= 3 && $stock_status_count >= 1 ) ) { + woocommerce_wp_radio( $common_stock_status_args ); + } else { + $select_input_args = array( + 'desc_tip' => true, + 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), + ); + woocommerce_wp_select( array_merge( $common_stock_status_args, $select_input_args ) ); + } + do_action( 'woocommerce_product_options_stock_status' ); ?>

    diff --git a/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js index 22409e42599..0e52a26e8fd 100644 --- a/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js +++ b/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js @@ -55,10 +55,10 @@ test.describe.serial( 'Add New Variable Product Page', () => { if ( i > 0 ) { await page.click( 'button.add_attribute' ); } - await page.fill( - `input[name="attribute_names[${ i }]"]`, - `attr #${ i + 1 }` - ); + const input = `input[name="attribute_names[${ i }]"]`; + + await page.waitForSelector( input, { timeout: 1000 } ); // Wait for up to 1 second + await page.fill( input, `attr #${ i + 1 }` ); await page.fill( `textarea[name="attribute_values[${ i }]"]`, 'val1 | val2' @@ -67,6 +67,7 @@ test.describe.serial( 'Add New Variable Product Page', () => { await page.keyboard.press( 'ArrowUp' ); await page.click( 'text=Save attributes' ); + await page.waitForTimeout( 1000 ); // Wait for 1 second // Save before going to the Variations tab to prevent variations from all attributes to be automatically created await page.locator( '#save-post' ).click(); await expect( @@ -205,10 +206,10 @@ test.describe.serial( 'Add New Variable Product Page', () => { if ( i > 0 ) { await page.click( 'button.add_attribute' ); } - await page.fill( - `input[name="attribute_names[${ i }]"]`, - `attr #${ i + 1 }` - ); + const input = `input[name="attribute_names[${ i }]"]`; + + await page.waitForSelector( input, { timeout: 1000 } ); // Wait for up to 1 seconds + await page.fill( input, `attr #${ i + 1 }` ); await page.fill( `textarea[name="attribute_values[${ i }]"]`, 'val1 | val2' @@ -222,6 +223,7 @@ test.describe.serial( 'Add New Variable Product Page', () => { ).toBeVisible(); } + await page.waitForTimeout( 1000 ); // Wait for 1 second // Save before going to the Variations tab to prevent variations from all attributes to be automatically created await page.locator( '#save-post' ).click(); await expect( From bd7b672e4508b5eee1d170421dd3b645da21e59f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:24:33 -0500 Subject: [PATCH 1136/1680] Update changelog.txt from release 7.5.0 (#37212) Prep trunk post release 7.5.0 Co-authored-by: WooCommerce Bot --- changelog.txt | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/changelog.txt b/changelog.txt index ab4640efbf2..8d4a7b71421 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,70 @@ == Changelog == += 7.5.0 2023-03-14 = + +**WooCommerce** + +* Fix - Add HPOS support to the reserved stock query [#36535](https://github.com/woocommerce/woocommerce/pull/36535) +* Fix - Comment: Fix inconsistencies on Analytics > Orders table when using date_paid or date_completed [#36876](https://github.com/woocommerce/woocommerce/pull/36876) +* Fix - Define a public `api` property in the WooCommerce class to prevent a PHP deprecation warning [#36545](https://github.com/woocommerce/woocommerce/pull/36545) +* Fix - Don't delete order from posts table when deleted from orders table if the later is authoritative and sync is off [#36617](https://github.com/woocommerce/woocommerce/pull/36617) +* Fix - Eliminate data store internal meta keys duplicates [#36611](https://github.com/woocommerce/woocommerce/pull/36611) +* Fix - Ensure changes made via the `woocommerce_order_list_table_prepare_items_query_args` are observed. [#36649](https://github.com/woocommerce/woocommerce/pull/36649) +* Fix - Ensuring that we know if allowTracking is true before adding exit page. [#36656](https://github.com/woocommerce/woocommerce/pull/36656) +* Fix - Fix Ampersand changed to & on product attribute export [#36525](https://github.com/woocommerce/woocommerce/pull/36525) +* Fix - Fix decimal points for NOK currency [#36780](https://github.com/woocommerce/woocommerce/pull/36780) +* Fix - Fix inconsitent product task icon colors [#36889](https://github.com/woocommerce/woocommerce/pull/36889) +* Fix - Fix WordPress unit tests libraries being installed in a symlinked folder structure [#36641](https://github.com/woocommerce/woocommerce/pull/36641) +* Fix - Make states optional for Hungary and Bulgaria. [#36701](https://github.com/woocommerce/woocommerce/pull/36701) +* Fix - Screen ID matching switched to untranslated 'woocommerce' strings. [#36854](https://github.com/woocommerce/woocommerce/pull/36854) +* Fix - Translate the labels for units of measure. [#36708](https://github.com/woocommerce/woocommerce/pull/36708) +* Fix - Update `config@3.3.7` (from `3.3.3`). Fix `node_env_var_name is not defined` error. [#33828](https://github.com/woocommerce/woocommerce/pull/33828) +* Add - Add 'add_tab' method in FormFactory to allow plugins to extend the WooCommerce admin product form [#36583](https://github.com/woocommerce/woocommerce/pull/36583) +* Add - Add @woocommerce/product-editor dependency and change dependency of ProductSectionLayout component. [#36600](https://github.com/woocommerce/woocommerce/pull/36600) +* Add - Add additional global attributes and local attributes information when saving product attributes [#36858](https://github.com/woocommerce/woocommerce/pull/36858) +* Add - Add a new Channels card in multichannel marketing page. [#36541](https://github.com/woocommerce/woocommerce/pull/36541) +* Add - Add an experimental slot for marketing overview extensibility [#36828](https://github.com/woocommerce/woocommerce/pull/36828) +* Add - Add slot fill support for tabs for the new product management MVP. [#36551](https://github.com/woocommerce/woocommerce/pull/36551) +* Add - Add survey after disabling new experience [#36544](https://github.com/woocommerce/woocommerce/pull/36544) +* Add - Add unique sku option to error data when setting product sku [#36612](https://github.com/woocommerce/woocommerce/pull/36612) +* Add - Add WC-specific criteria to the Site Health test for persistent object caches [#35202](https://github.com/woocommerce/woocommerce/pull/35202) +* Add - Enable new experience when new user selects "Physical product". [#36406](https://github.com/woocommerce/woocommerce/pull/36406) +* Update - Update WooCommerce Blocks to 9.6.5 [#37051](https://github.com/woocommerce/woocommerce/pull/37051) +* Update - Update WooCommerce Blocks to 9.6.3 [#36992](https://github.com/woocommerce/woocommerce/pull/36992) +* Update - Update WooCommerce Blocks to 9.6.2 [#36919](https://github.com/woocommerce/woocommerce/pull/36919) +* Update - Add date_paid and date_completed date sorting options for Revenue and Order reports [#36492](https://github.com/woocommerce/woocommerce/pull/36492) +* Update - Add default value for backorders [#36607](https://github.com/woocommerce/woocommerce/pull/36607) +* Update - Add Skydropx, Envia, Sendcloud, Packlink to shipping task [#36873](https://github.com/woocommerce/woocommerce/pull/36873) +* Update - Always show comments for product feedback form [#36484](https://github.com/woocommerce/woocommerce/pull/36484) +* Update - Delete FlexSlider code for legacy browsers. [#36690](https://github.com/woocommerce/woocommerce/pull/36690) +* Update - Disable the new product editor, pending design updates. [#36894](https://github.com/woocommerce/woocommerce/pull/36894) +* Update - Have "Grow your store" appear first in marketing task by default [#36826](https://github.com/woocommerce/woocommerce/pull/36826) +* Update - Migrating product editor pricing section to slot fills. [#36500](https://github.com/woocommerce/woocommerce/pull/36500) +* Update - Refactor slot fills to ensure variant fills have distinct slots. [#36646](https://github.com/woocommerce/woocommerce/pull/36646) +* Update - Removed I.D column from product import samples [#36857](https://github.com/woocommerce/woocommerce/pull/36857) +* Update - Remove Meta from grow your store list [#36886](https://github.com/woocommerce/woocommerce/pull/36886) +* Update - Remove opinionated styles from buttons in block themes so they inherit theme styles more accurately [#36651](https://github.com/woocommerce/woocommerce/pull/36651) +* Update - Replace $.ajax() calls with browser-native window.fetch() calls. [#36275](https://github.com/woocommerce/woocommerce/pull/36275) +* Update - Update payment gateway list ordering priority and remove Klarna from North America [#36550](https://github.com/woocommerce/woocommerce/pull/36550) +* Update - Update Playwright version from 1.28.0 -> 1.30.0 [#36789](https://github.com/woocommerce/woocommerce/pull/36789) +* Update - Updates to product editor fill to support new prop API. [#36592](https://github.com/woocommerce/woocommerce/pull/36592) +* Update - Update WooCommerce Blocks 9.6.0 & 9.6.1 [#36852](https://github.com/woocommerce/woocommerce/pull/36852) +* Dev - Add attribute creation form when there are no attributes [#36606](https://github.com/woocommerce/woocommerce/pull/36606) +* Dev - Add a unit test for woocommerce_admin_experimental_onboarding_tasklists filter [#36827](https://github.com/woocommerce/woocommerce/pull/36827) +* Dev - Code refactor on marketing components. [#36540](https://github.com/woocommerce/woocommerce/pull/36540) +* Dev - Made e2e selectors more robust [#36499](https://github.com/woocommerce/woocommerce/pull/36499) +* Dev - Remove attribute type logic from attribute component [#36563](https://github.com/woocommerce/woocommerce/pull/36563) +* Dev - Update eslint to 8.32.0 across the monorepo. [#36700](https://github.com/woocommerce/woocommerce/pull/36700) +* Dev - Update pnpm command to run e2e tests for consistency. Also update docs with new command. [#35287](https://github.com/woocommerce/woocommerce/pull/35287) +* Tweak - Add IR and fields priorities to list of get_country_locale() method to follow conventional way of addressing in Iran. [#36491](https://github.com/woocommerce/woocommerce/pull/36491) +* Tweak - Add missing deprecation notice for filter hook woocommerce_my_account_my_orders_columns. [#36356](https://github.com/woocommerce/woocommerce/pull/36356) +* Tweak - Adjust default sizes for the quantity and coupon input fields within the cart page. [#29122](https://github.com/woocommerce/woocommerce/pull/29122) +* Tweak - Do not display low/out-of-stock information in the dashboard status widget when stock management is disabled. [#36703](https://github.com/woocommerce/woocommerce/pull/36703) +* Tweak - Remove free trial terms from Avalara tax task [#36888](https://github.com/woocommerce/woocommerce/pull/36888) +* Tweak - Tweak product link description and display in the new product management experience [#36591](https://github.com/woocommerce/woocommerce/pull/36591) +* Enhancement - Change the sass variable names to more predictable ones. [#28908](https://github.com/woocommerce/woocommerce/pull/28908) + + = 7.4.1 2023-03-01 = **WooCommerce** From b65376025baf815d0eb1708190ef39d9e1d7c752 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:27:23 -0500 Subject: [PATCH 1137/1680] Delete changelog files based on PR 36919 (#36942) Delete changelog files for 36919 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.2 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.2 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.2 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.2 deleted file mode 100644 index 70c4f39490e..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.2 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 9.6.2 From 591921cd30ebcb5a21ef4006f5db8da3b96ab123 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 20 Mar 2023 10:29:03 -0500 Subject: [PATCH 1138/1680] Delete changelog files based on PR 36992 (#36996) Delete changelog files for 36992 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.3 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.3 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.3 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.3 deleted file mode 100644 index 2d8f61daef0..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.6.3 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 9.6.3 From 1f177d23c0164d323789f5d80ba70f5a9ae98428 Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Mon, 20 Mar 2023 11:00:58 -0500 Subject: [PATCH 1139/1680] Update stable tag to 7.5.0 (#37311) * Update stable tag to 7.5.0 * Changelog --- plugins/woocommerce/changelog/update-stable-tag-7-5-0 | 4 ++++ plugins/woocommerce/readme.txt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/update-stable-tag-7-5-0 diff --git a/plugins/woocommerce/changelog/update-stable-tag-7-5-0 b/plugins/woocommerce/changelog/update-stable-tag-7-5-0 new file mode 100644 index 00000000000..6828901deb3 --- /dev/null +++ b/plugins/woocommerce/changelog/update-stable-tag-7-5-0 @@ -0,0 +1,4 @@ +Significance: patch +Type: dev +Comment: This PR updates the stable tag. No changelog entry required. + diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index 7614651e0b0..7017475de7e 100644 --- a/plugins/woocommerce/readme.txt +++ b/plugins/woocommerce/readme.txt @@ -4,7 +4,7 @@ Tags: online store, ecommerce, shop, shopping cart, sell online, storefront, che Requires at least: 5.9 Tested up to: 6.1 Requires PHP: 7.2 -Stable tag: 7.4.1 +Stable tag: 7.5.0 License: GPLv3 License URI: https://www.gnu.org/licenses/gpl-3.0.html From 679339ec9547394c5511da498845b37f9b820724 Mon Sep 17 00:00:00 2001 From: Moon Date: Mon, 20 Mar 2023 11:30:48 -0700 Subject: [PATCH 1140/1680] Refresh data source poller transients on wc_admin_daily (#37027) * Refresh data source poller transients on wc_admin_daily * Add changelog * Conditionally refresh data source pollers * Fix style * Check woocommerce-pyaments -- woocommerce-payments can override payments task * Add marketing task check for RemoteFreeExtensionsDataSourcePoller --- ...7025-refresh-datasources-on-wc_admin_daily | 4 ++++ .../woocommerce/src/Internal/Admin/Events.php | 20 +++++++++++++++++++ 2 files changed, 24 insertions(+) create mode 100644 plugins/woocommerce/changelog/update-37025-refresh-datasources-on-wc_admin_daily diff --git a/plugins/woocommerce/changelog/update-37025-refresh-datasources-on-wc_admin_daily b/plugins/woocommerce/changelog/update-37025-refresh-datasources-on-wc_admin_daily new file mode 100644 index 00000000000..6eecdbe0bbe --- /dev/null +++ b/plugins/woocommerce/changelog/update-37025-refresh-datasources-on-wc_admin_daily @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Refresh data source poller transients on wc_admin_daily diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index edb5e13a7b7..e745fe7c86d 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -44,6 +44,8 @@ use Automattic\WooCommerce\Internal\Admin\Notes\WooCommerceSubscriptions; use Automattic\WooCommerce\Internal\Admin\Notes\WooSubscriptionsNotes; use Automattic\WooCommerce\Internal\Admin\Schedulers\MailchimpScheduler; use Automattic\WooCommerce\Admin\Notes\Note; +use Automattic\WooCommerce\Admin\Features\PaymentGatewaySuggestions\PaymentGatewaySuggestionsDataSourcePoller; +use Automattic\WooCommerce\Internal\Admin\RemoteFreeExtensions\RemoteFreeExtensionsDataSourcePoller; /** * Events Class. @@ -143,6 +145,7 @@ class Events { $this->possibly_add_notes(); $this->possibly_delete_notes(); $this->possibly_update_notes(); + $this->possibly_refresh_data_source_pollers(); if ( $this->is_remote_inbox_notifications_enabled() ) { DataSourcePoller::get_instance()->read_specs_from_data_sources(); @@ -250,4 +253,21 @@ class Events { // All checks have passed. return true; } + + /** + * Refresh transient for the following DataSourcePollers on wc_admin_daily cron job. + * - PaymentGatewaySuggestionsDataSourcePoller + * - RemoteFreeExtensionsDataSourcePoller + */ + protected function possibly_refresh_data_source_pollers() { + $completed_tasks = get_option( 'woocommerce_task_list_tracked_completed_tasks' ); + + if ( ! in_array( 'payments', $completed_tasks, true ) && ! in_array( 'woocommerce-payments', $completed_tasks, true ) ) { + PaymentGatewaySuggestionsDataSourcePoller::get_instance()->read_specs_from_data_sources(); + } + + if ( ! in_array( 'store_details', $completed_tasks, true ) && ! in_array( 'marketing', $completed_tasks, true ) ) { + RemoteFreeExtensionsDataSourcePoller::get_instance()->read_specs_from_data_sources(); + } + } } From a51f26d2c1b57a74232522c6ec0c369955308965 Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Mon, 20 Mar 2023 15:41:51 -0300 Subject: [PATCH 1141/1680] Convert "Allow backorders?" into radio buttons (#37282) * Add check to show `Allow backorders as radio buttons * Add changelog * Rename hook * Fix lint * Fix hook default value * Add tip to radio buttons --------- Co-authored-by: Fernando Marichal --- ...onvert_allow_backorders_into_radio_buttons | 4 ++ .../views/html-product-data-inventory.php | 45 +++++++++++-------- 2 files changed, 31 insertions(+), 18 deletions(-) create mode 100644 plugins/woocommerce/changelog/dev-37118_convert_allow_backorders_into_radio_buttons diff --git a/plugins/woocommerce/changelog/dev-37118_convert_allow_backorders_into_radio_buttons b/plugins/woocommerce/changelog/dev-37118_convert_allow_backorders_into_radio_buttons new file mode 100644 index 00000000000..07aaf1b29ad --- /dev/null +++ b/plugins/woocommerce/changelog/dev-37118_convert_allow_backorders_into_radio_buttons @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Convert "Allow backorders?" into radio buttons diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php index 1e0b358ad7d..ac2c944da2c 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-inventory.php @@ -64,17 +64,28 @@ if ( ! defined( 'ABSPATH' ) ) { echo ''; - woocommerce_wp_select( - array( - 'id' => '_backorders', - 'value' => $product_object->get_backorders( 'edit' ), - 'label' => __( 'Allow backorders?', 'woocommerce' ), - 'options' => wc_get_product_backorder_options(), - 'desc_tip' => true, - 'description' => __( 'If managing stock, this controls whether or not backorders are allowed. If enabled, stock quantity can go below 0.', 'woocommerce' ), - ) + $backorder_args = array( + 'id' => '_backorders', + 'value' => $product_object->get_backorders( 'edit' ), + 'label' => __( 'Allow backorders?', 'woocommerce' ), + 'options' => wc_get_product_backorder_options(), + 'desc_tip' => true, + 'description' => __( 'If managing stock, this controls whether or not backorders are allowed. If enabled, stock quantity can go below 0.', 'woocommerce' ), ); + /** + * Allow 3rd parties to control whether "Allow backorder?" option will use radio buttons or a select. + * + * @since 7.6.0 + * + * @param bool If false, "Allow backorders?" will be shown as a select. Default: it will use radio buttons. + */ + if ( apply_filters( 'woocommerce_product_allow_backorder_use_radio', true ) ) { + woocommerce_wp_radio( $backorder_args ); + } else { + woocommerce_wp_select( $backorder_args ); + } + woocommerce_wp_text_input( array( 'id' => '_low_stock_amount', @@ -115,14 +126,16 @@ if ( ! defined( 'ABSPATH' ) ) { } - $stock_status_options = wc_get_product_stock_status_options(); - $stock_status_count = count( $stock_status_options ); - $common_stock_status_args = array( + $stock_status_options = wc_get_product_stock_status_options(); + $stock_status_count = count( $stock_status_options ); + $stock_status_args = array( 'id' => '_stock_status', 'value' => $product_object->get_stock_status( 'edit' ), 'wrapper_class' => 'stock_status_field hide_if_variable hide_if_external hide_if_grouped', 'label' => __( 'Stock status', 'woocommerce' ), 'options' => $stock_status_options, + 'desc_tip' => true, + 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), ); /** @@ -133,13 +146,9 @@ if ( ! defined( 'ABSPATH' ) ) { * @param bool If false, the "Stock status" will be shown as a select. Default: it will use radio buttons. */ if ( apply_filters( 'woocommerce_product_stock_status_use_radio', $stock_status_count <= 3 && $stock_status_count >= 1 ) ) { - woocommerce_wp_radio( $common_stock_status_args ); + woocommerce_wp_radio( $stock_status_args ); } else { - $select_input_args = array( - 'desc_tip' => true, - 'description' => __( 'Controls whether or not the product is listed as "in stock" or "out of stock" on the frontend.', 'woocommerce' ), - ); - woocommerce_wp_select( array_merge( $common_stock_status_args, $select_input_args ) ); + woocommerce_wp_select( $stock_status_args ); } do_action( 'woocommerce_product_options_stock_status' ); From ae92dafea3d8cce0539bce71dec5de792e16db67 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 20 Mar 2023 20:50:55 +0100 Subject: [PATCH 1142/1680] Allow for passing context into the get_image for product variation. (#28498) * Allow for passing context into the get_image for product variation. Since get_image behaves differently in edit and view contexts, it is important to pass the context down. In view context, if there is no image set for variation, it returns parent's image. However, this is wrong for WP admin or mobile app running from pov of admin user. * Added changelog. * Address PHPCS issue --------- Co-authored-by: Jorge A. Torres --- .../woocommerce/changelog/fix-variation-image-empty | 4 ++++ .../class-wc-rest-product-variations-controller.php | 11 ++++++----- 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-variation-image-empty diff --git a/plugins/woocommerce/changelog/fix-variation-image-empty b/plugins/woocommerce/changelog/fix-variation-image-empty new file mode 100644 index 00000000000..106079bb343 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-variation-image-empty @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Fixed image array in edit context for product/variations endpoint. diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php index 4c332f2cc11..184e9888dbb 100644 --- a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php +++ b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-product-variations-controller.php @@ -64,7 +64,8 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V * @return WP_REST_Response */ public function prepare_object_for_response( $object, $request ) { - $data = array( + $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; + $data = array( 'id' => $object->get_id(), 'date_created' => wc_rest_prepare_date_response( $object->get_date_created(), false ), 'date_created_gmt' => wc_rest_prepare_date_response( $object->get_date_created() ), @@ -105,13 +106,12 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V ), 'shipping_class' => $object->get_shipping_class(), 'shipping_class_id' => $object->get_shipping_class_id(), - 'image' => $this->get_image( $object ), + 'image' => $this->get_image( $object, $context ), 'attributes' => $this->get_attributes( $object ), 'menu_order' => $object->get_menu_order(), 'meta_data' => $object->get_meta_data(), ); - $context = ! empty( $request['context'] ) ? $request['context'] : 'view'; $data = $this->add_additional_fields_to_object( $data, $request ); $data = $this->filter_response_by_context( $data, $context ); $response = rest_ensure_response( $data ); @@ -352,10 +352,11 @@ class WC_REST_Product_Variations_Controller extends WC_REST_Product_Variations_V * Get the image for a product variation. * * @param WC_Product_Variation $variation Variation data. + * @param string $context Context of the request: 'view' or 'edit'. * @return array */ - protected function get_image( $variation ) { - if ( ! $variation->get_image_id() ) { + protected function get_image( $variation, $context = 'view' ) { + if ( ! $variation->get_image_id( $context ) ) { return; } From 185cd3dcaaa0854552f8c4b90b454b5ace237d26 Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Mon, 20 Mar 2023 20:23:23 +0000 Subject: [PATCH 1143/1680] Update playwright api-core-tests to associate orders with real products to prevent extension issues for those that validate product ids (#37243) * Update playwright api-core-tests to associate orders with real products to prevent extension issues for those that validate product ids * add newline at end of file * add comment --- ...-core-tests-to-associate-products-with-orders | 4 ++++ .../tests/orders/order-search.test.js | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) create mode 100644 plugins/woocommerce/changelog/update-api-core-tests-to-associate-products-with-orders diff --git a/plugins/woocommerce/changelog/update-api-core-tests-to-associate-products-with-orders b/plugins/woocommerce/changelog/update-api-core-tests-to-associate-products-with-orders new file mode 100644 index 00000000000..0a21ebfc233 --- /dev/null +++ b/plugins/woocommerce/changelog/update-api-core-tests-to-associate-products-with-orders @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update playwright api-core-tests to associate orders with real products to prevent extension issues for those that validate product ids diff --git a/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js b/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js index 03ae15d9253..e7d1f400a58 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/orders/order-search.test.js @@ -2,6 +2,9 @@ const { test, expect } = require( '@playwright/test' ); const { getOrderExampleSearchTest } = require( '../../data/order' ); const { customerShippingSearchTest } = require( '../../data/shared/customer' ); +const { + simpleProduct, +} = require('../../data/products-crud'); /** * Order to be searched @@ -55,6 +58,15 @@ const searchParams = [ */ test.describe( 'Order Search API tests', () => { test.beforeAll( async ( { request } ) => { + // Create a product to be associated with the order + const productResponse = await request.post('wp-json/wc/v3/products', { + data: simpleProduct, + }); + const productResponseJSON = await productResponse.json(); + + // Save the created product id against the order line_items + order.line_items[0].product_id = productResponseJSON.id; + // Create an order and save its ID const response = await request.post( '/wp-json/wc/v3/orders', { data: order, @@ -64,6 +76,10 @@ test.describe( 'Order Search API tests', () => { } ); test.afterAll( async ( { request } ) => { + // Cleanup: Delete the product + await request.delete( `/wp-json/wc/v3/products/${ order.line_items[0].product_id }`, { + data: { force: true }, + } ); // Cleanup: Delete the order await request.delete( `/wp-json/wc/v3/orders/${ order.id }`, { data: { force: true }, From e74abeffe49cdfcedf36bff74e455ae6804a12e5 Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson <105309450+nigeljamesstevenson@users.noreply.github.com> Date: Mon, 20 Mar 2023 20:24:36 +0000 Subject: [PATCH 1144/1680] update api-core-tests to handle extenstions that add shipping (#37239) --- .../update-api-core-tests-to-better-handle-shipping-types | 4 ++++ .../tests/payment-gateways/payment-gateways-crud.test.js | 4 ++-- .../api-core-tests/tests/shipping/shipping-method.test.js | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-api-core-tests-to-better-handle-shipping-types diff --git a/plugins/woocommerce/changelog/update-api-core-tests-to-better-handle-shipping-types b/plugins/woocommerce/changelog/update-api-core-tests-to-better-handle-shipping-types new file mode 100644 index 00000000000..bd3c4710274 --- /dev/null +++ b/plugins/woocommerce/changelog/update-api-core-tests-to-better-handle-shipping-types @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update playwright api-core-tests to handle cases where extensions add to shipping methods diff --git a/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js index f1e83fe7dba..cdc7509c080 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/payment-gateways/payment-gateways-crud.test.js @@ -135,7 +135,7 @@ test.describe('Payment Gateways API tests', () => { "default": "", "tip": "If COD is only available for certain methods, set it up here. Leave blank to enable for all methods.", "placeholder": "", - "options": { + "options": expect.objectContaining({ "Flat rate": { "flat_rate": "Any "Flat rate" method" }, @@ -145,7 +145,7 @@ test.describe('Payment Gateways API tests', () => { "Local pickup": { "local_pickup": "Any "Local pickup" method" } - } + }) }, "enable_for_virtual": { "id": "enable_for_virtual", diff --git a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js index 51f52e70144..72ac2b705f7 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/shipping/shipping-method.test.js @@ -66,7 +66,7 @@ test.describe('Shipping methods API tests', () => { const responseJSON = await response.json(); expect(response.status()).toEqual(200); expect(Array.isArray(responseJSON)).toBe(true); - expect(responseJSON.length).toEqual(3); + expect(responseJSON.length).toBeGreaterThanOrEqual(3); expect(responseJSON[0].id).toEqual("flat_rate"); expect(responseJSON[1].id).toEqual("free_shipping"); expect(responseJSON[2].id).toEqual("local_pickup"); From 32fd0a41eddd61abcf998eac314333682802d399 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=BCleyman=20KENAR?= Date: Mon, 20 Mar 2023 23:42:26 +0100 Subject: [PATCH 1145/1680] Add support for Loco Translate translations in WooCommerce Admin (#36739) * Update Translations.php * fix formatting issues * added changelog * Update Translations.php Added seperate parsers for chunk files --- plugins/woocommerce/changelog/fix-35500 | 4 + .../src/Internal/Admin/Translations.php | 121 +++++++++++++++--- 2 files changed, 105 insertions(+), 20 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-35500 diff --git a/plugins/woocommerce/changelog/fix-35500 b/plugins/woocommerce/changelog/fix-35500 new file mode 100644 index 00000000000..86e1475064b --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35500 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Loco Translate and wp-cli compatibility for woocommerce-admin translation files diff --git a/plugins/woocommerce/src/Internal/Admin/Translations.php b/plugins/woocommerce/src/Internal/Admin/Translations.php index cbbde4d5597..cbd6004f3a7 100644 --- a/plugins/woocommerce/src/Internal/Admin/Translations.php +++ b/plugins/woocommerce/src/Internal/Admin/Translations.php @@ -59,28 +59,16 @@ class Translations { } /** - * Find and combine translation chunk files. + * Combines data from translation chunk files based on officially downloaded file format. * - * Only targets files that aren't represented by a registered script (e.g. not passed to wp_register_script()). - * - * @param string $lang_dir Path to language files. - * @param string $domain Text domain. - * @param string $locale Locale being retrieved. + * @param array $json_i18n_filenames List of JSON chunk files. * @return array Combined translation chunk data. */ - private function get_translation_chunk_data( $lang_dir, $domain, $locale ) { - // So long as this function is called during the 'upgrader_process_complete' action, + private function combine_official_translation_chunks( $json_i18n_filenames ) { // the filesystem object should be hooked up. global $wp_filesystem; - - // Grab all JSON files in the current language pack. - $json_i18n_filenames = glob( $lang_dir . $domain . '-' . $locale . '-*.json' ); $combined_translation_data = array(); - if ( false === $json_i18n_filenames ) { - return $combined_translation_data; - } - foreach ( $json_i18n_filenames as $json_filename ) { if ( ! $wp_filesystem->is_readable( $json_filename ) ) { continue; @@ -93,10 +81,6 @@ class Translations { continue; } - if ( ! isset( $chunk_data['comment']['reference'] ) ) { - continue; - } - $reference_file = $chunk_data['comment']['reference']; // Only combine "app" files (not scripts registered with WP). @@ -121,10 +105,107 @@ class Translations { // Remove inaccurate reference comment. unset( $combined_translation_data['comment'] ); - return $combined_translation_data; } + /** + * Combines data from translation chunk files based on user-generated file formats, + * such as wp-cli tool or Loco Translate plugin. + * + * @param array $json_i18n_filenames List of JSON chunk files. + * @return array Combined translation chunk data. + */ + private function combine_user_translation_chunks( $json_i18n_filenames ) { + // the filesystem object should be hooked up. + global $wp_filesystem; + $combined_translation_data = array(); + + foreach ( $json_i18n_filenames as $json_filename ) { + if ( ! $wp_filesystem->is_readable( $json_filename ) ) { + continue; + } + + $file_contents = $wp_filesystem->get_contents( $json_filename ); + $chunk_data = \json_decode( $file_contents, true ); + + if ( empty( $chunk_data ) ) { + continue; + } + + $reference_file = $chunk_data['source']; + + // Only combine "app" files (not scripts registered with WP). + if ( + false === strpos( $reference_file, WC_ADMIN_DIST_JS_FOLDER . 'app/index.js' ) && + false === strpos( $reference_file, WC_ADMIN_DIST_JS_FOLDER . 'chunks/' ) + ) { + continue; + } + + if ( empty( $combined_translation_data ) ) { + // Use the first translation file as the base structure. + $combined_translation_data = $chunk_data; + } else { + // Combine all messages from all chunk files. + $combined_translation_data['locale_data']['woocommerce'] = array_merge( + $combined_translation_data['locale_data']['woocommerce'], + $chunk_data['locale_data']['woocommerce'] + ); + } + } + + // Remove inaccurate reference comment. + unset( $combined_translation_data['source'] ); + return $combined_translation_data; + } + + /** + * Find and combine translation chunk files. + * + * Only targets files that aren't represented by a registered script (e.g. not passed to wp_register_script()). + * + * @param string $lang_dir Path to language files. + * @param string $domain Text domain. + * @param string $locale Locale being retrieved. + * @return array Combined translation chunk data. + */ + private function get_translation_chunk_data( $lang_dir, $domain, $locale ) { + // So long as this function is called during the 'upgrader_process_complete' action, + // the filesystem object should be hooked up. + global $wp_filesystem; + + // Grab all JSON files in the current language pack. + $json_i18n_filenames = glob( $lang_dir . $domain . '-' . $locale . '-*.json' ); + $combined_translation_data = array(); + + if ( false === $json_i18n_filenames ) { + return $combined_translation_data; + } + + // Use first JSON file to determine file format. This check is required due to + // file format difference between official language files and user translated files. + $format_determine_file = reset( $json_i18n_filenames ); + + if ( ! $wp_filesystem->is_readable( $format_determine_file ) ) { + return $combined_translation_data; + } + + $file_contents = $wp_filesystem->get_contents( $format_determine_file ); + $format_determine_data = \json_decode( $file_contents, true ); + + if ( empty( $format_determine_data ) ) { + return $combined_translation_data; + } + + if ( isset( $format_determine_data['comment'] ) ) { + return $this->combine_official_translation_chunks( $json_i18n_filenames ); + } elseif ( isset( $format_determine_data['source'] ) ) { + return $this->combine_user_translation_chunks( $json_i18n_filenames ); + } else { + return $combined_translation_data; + } + } + /** * Combine and save translations for a specific locale. * From b114426042a22ed3cd1789efbe6278ec515d12ca Mon Sep 17 00:00:00 2001 From: Moon Date: Mon, 20 Mar 2023 15:46:21 -0700 Subject: [PATCH 1146/1680] Add missing woocommerce_run_on_woocommerce_admin_updated hook for RemoteInboxNotificationsEngine scheduled action (#36768) * Add woocommerce_run_on_woocommerce_admin_updated hook * Add changelog * Simplify schedule call * Lint fix --- ...erce_run_on_woocommerce_admin_updated-hook | 4 ++++ .../RemoteInboxNotificationsEngine.php | 20 ++++--------------- 2 files changed, 8 insertions(+), 16 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-36767-add-woocommerce_run_on_woocommerce_admin_updated-hook diff --git a/plugins/woocommerce/changelog/fix-36767-add-woocommerce_run_on_woocommerce_admin_updated-hook b/plugins/woocommerce/changelog/fix-36767-add-woocommerce_run_on_woocommerce_admin_updated-hook new file mode 100644 index 00000000000..3b50bb74c0c --- /dev/null +++ b/plugins/woocommerce/changelog/fix-36767-add-woocommerce_run_on_woocommerce_admin_updated-hook @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Add missing woocommerce_run_on_woocommerce_admin_updated hook for the scheduled action registered in RemoteInboxNotificationsEngine diff --git a/plugins/woocommerce/src/Admin/RemoteInboxNotifications/RemoteInboxNotificationsEngine.php b/plugins/woocommerce/src/Admin/RemoteInboxNotifications/RemoteInboxNotificationsEngine.php index aa9c4aa4284..49476835478 100644 --- a/plugins/woocommerce/src/Admin/RemoteInboxNotifications/RemoteInboxNotificationsEngine.php +++ b/plugins/woocommerce/src/Admin/RemoteInboxNotifications/RemoteInboxNotificationsEngine.php @@ -40,23 +40,11 @@ class RemoteInboxNotificationsEngine { // Hook into WCA updated. This is hooked up here rather than in // on_admin_init because that runs too late to hook into the action. - add_action( + WC()->queue()->schedule_single( + time(), 'woocommerce_updated', - function() { - $next_hook = WC()->queue()->get_next( - 'woocommerce_run_on_woocommerce_admin_updated', - array( __CLASS__, 'run_on_woocommerce_admin_updated' ), - 'woocommerce-remote-inbox-engine' - ); - if ( $next_hook === null ) { - WC()->queue()->schedule_single( - time(), - 'woocommerce_run_on_woocommerce_admin_updated', - array( __CLASS__, 'run_on_woocommerce_admin_updated' ), - 'woocommerce-remote-inbox-engine' - ); - } - } + array( __CLASS__, 'run_on_woocommerce_admin_updated' ), + 'woocommerce-remote-inbox-engine' ); add_filter( 'woocommerce_get_note_from_db', array( __CLASS__, 'get_note_from_db' ), 10, 1 ); From c4f0170c1ea231a7d31cb899a17eb58732137365 Mon Sep 17 00:00:00 2001 From: Jon Lane Date: Mon, 20 Mar 2023 16:07:03 -0700 Subject: [PATCH 1147/1680] Add Liberia as store location --- .../changelog/e2e-fix-failing-malta-test | 4 ++++ .../woocommerce/tests/e2e-pw/test-data/data.js | 18 ++++++++++++++++++ .../complete-onboarding-wizard.spec.js | 16 ++++++++-------- 3 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/e2e-fix-failing-malta-test diff --git a/plugins/woocommerce/changelog/e2e-fix-failing-malta-test b/plugins/woocommerce/changelog/e2e-fix-failing-malta-test new file mode 100644 index 00000000000..cc9f444a669 --- /dev/null +++ b/plugins/woocommerce/changelog/e2e-fix-failing-malta-test @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update OBW end to end test as WC Pay supports Malta now diff --git a/plugins/woocommerce/tests/e2e-pw/test-data/data.js b/plugins/woocommerce/tests/e2e-pw/test-data/data.js index c4423c86be4..4a2868141e0 100644 --- a/plugins/woocommerce/tests/e2e-pw/test-data/data.js +++ b/plugins/woocommerce/tests/e2e-pw/test-data/data.js @@ -95,6 +95,24 @@ const storeDetails = { downloadable: 'Downloads', }, }, + liberia: { + store: { + address: 'addr1', + city: 'Kakata', + zip: 'Division 1', + email: admin.email, + country: 'Liberia — Margibi', // corresponding to the text value of the option, + countryCode: 'LR', + }, + expectedIndustries: 8, // There are 8 checkboxes on the page (in Liberia), adjust this constant if we change that + industries: { + other: 'Other', + }, + products: { + physical: 'Physical products', + downloadable: 'Downloads', + }, + }, }; module.exports = { diff --git a/plugins/woocommerce/tests/e2e-pw/tests/activate-and-setup/complete-onboarding-wizard.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/activate-and-setup/complete-onboarding-wizard.spec.js index 6fe61713ae1..a4ecc40164d 100644 --- a/plugins/woocommerce/tests/e2e-pw/tests/activate-and-setup/complete-onboarding-wizard.spec.js +++ b/plugins/woocommerce/tests/e2e-pw/tests/activate-and-setup/complete-onboarding-wizard.spec.js @@ -145,23 +145,23 @@ test.describe( 'Store owner can complete onboarding wizard', () => { } ); } ); -// !Changed from Japanese to Malta store, as Japanese Yen does not use decimals +// !Changed from Japanese to Liberian store, as Japanese Yen does not use decimals test.describe( - 'A Malta store can complete the selective bundle install but does not include WCPay.', + 'A Liberian store can complete the selective bundle install but does not include WCPay.', () => { test.use( { storageState: process.env.ADMINSTATE } ); test.beforeEach( async () => { // Complete "Store Details" step through the API to prevent flakiness when run on external sites. - await api.update.storeDetails( storeDetails.malta.store ); + await api.update.storeDetails( storeDetails.liberia.store ); } ); // eslint-disable-next-line jest/expect-expect test( 'can choose the "Other" industry', async ( { page } ) => { await onboarding.completeIndustrySection( page, - storeDetails.malta.industries, - storeDetails.malta.expectedIndustries + storeDetails.liberia.industries, + storeDetails.liberia.expectedIndustries ); await page.click( 'button >> text=Continue' ); } ); @@ -174,14 +174,14 @@ test.describe( await onboarding.completeIndustrySection( page, - storeDetails.malta.industries, - storeDetails.malta.expectedIndustries + storeDetails.liberia.industries, + storeDetails.liberia.expectedIndustries ); await page.click( 'button >> text=Continue' ); await onboarding.completeProductTypesSection( page, - storeDetails.malta.products + storeDetails.liberia.products ); // Make sure WC Payments is NOT present await expect( From edbe36d7ad16348c8227f2d14feb316fb0d2f6b3 Mon Sep 17 00:00:00 2001 From: Joel Thiessen <444632+joelclimbsthings@users.noreply.github.com> Date: Mon, 20 Mar 2023 18:18:44 -0700 Subject: [PATCH 1148/1680] Adding collapsible content block with flexible rendering (#37305) * Adding collapsible content block with flexible rendering * Adding changelogs * Move content inside display state to avoid backwards compat issues --------- Co-authored-by: Lourens Schep --- .../changelog/add-toggle-content-block-37253 | 4 +++ .../collapsible-content.tsx | 16 +++++++++-- .../src/display-state/display-state.tsx | 28 +++++++++++++++++++ .../js/components/src/display-state/index.ts | 1 + packages/js/components/src/index.ts | 1 + .../changelog/add-toggle-content-block-37253 | 4 +++ .../components/collapsible-block/block.json | 28 +++++++++++++++++++ .../src/components/collapsible-block/edit.tsx | 24 ++++++++++++++++ .../src/components/collapsible-block/index.ts | 17 +++++++++++ .../src/components/editor/init-blocks.ts | 2 ++ 10 files changed, 123 insertions(+), 2 deletions(-) create mode 100644 packages/js/components/changelog/add-toggle-content-block-37253 create mode 100644 packages/js/components/src/display-state/display-state.tsx create mode 100644 packages/js/components/src/display-state/index.ts create mode 100644 packages/js/product-editor/changelog/add-toggle-content-block-37253 create mode 100644 packages/js/product-editor/src/components/collapsible-block/block.json create mode 100644 packages/js/product-editor/src/components/collapsible-block/edit.tsx create mode 100644 packages/js/product-editor/src/components/collapsible-block/index.ts diff --git a/packages/js/components/changelog/add-toggle-content-block-37253 b/packages/js/components/changelog/add-toggle-content-block-37253 new file mode 100644 index 00000000000..38395751212 --- /dev/null +++ b/packages/js/components/changelog/add-toggle-content-block-37253 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Adding simple DisplayState wrapper and modifying Collapsible component to allow rendering hidden content. diff --git a/packages/js/components/src/collapsible-content/collapsible-content.tsx b/packages/js/components/src/collapsible-content/collapsible-content.tsx index 0bacc92dbe5..e839de2b450 100644 --- a/packages/js/components/src/collapsible-content/collapsible-content.tsx +++ b/packages/js/components/src/collapsible-content/collapsible-content.tsx @@ -7,10 +7,12 @@ import { Icon, chevronDown, chevronUp } from '@wordpress/icons'; /** * Internal dependencies */ +import { DisplayState } from '../display-state'; export type CollapsedProps = { initialCollapsed?: boolean; toggleText: string; + persistRender?: boolean; children: React.ReactNode; } & React.HTMLAttributes< HTMLDivElement >; @@ -18,9 +20,19 @@ export const CollapsibleContent: React.FC< CollapsedProps > = ( { initialCollapsed = true, toggleText, children, + persistRender = false, ...props }: CollapsedProps ) => { const [ collapsed, setCollapsed ] = useState( initialCollapsed ); + + const getState = () => { + if ( ! collapsed ) { + return 'visible'; + } + + return persistRender ? 'visually-hidden' : 'hidden'; + }; + return (
    = ( { />
    - { ! collapsed && ( +
    { children }
    - ) } +
    ); }; diff --git a/packages/js/components/src/display-state/display-state.tsx b/packages/js/components/src/display-state/display-state.tsx new file mode 100644 index 00000000000..a6f88084c3e --- /dev/null +++ b/packages/js/components/src/display-state/display-state.tsx @@ -0,0 +1,28 @@ +/** + * External dependencies + */ +import { createElement, Fragment } from '@wordpress/element'; + +/** + * Internal dependencies + */ + +export type DisplayStateProps = { + state?: 'visible' | 'visually-hidden' | 'hidden'; + children: React.ReactNode; +} & React.HTMLAttributes< HTMLDivElement >; + +export const DisplayState: React.FC< DisplayStateProps > = ( { + state = 'visible', + children, +} ) => { + if ( state === 'visible' ) { + return <>{ children }; + } + + if ( state === 'visually-hidden' ) { + return
    { children }
    ; + } + + return null; +}; diff --git a/packages/js/components/src/display-state/index.ts b/packages/js/components/src/display-state/index.ts new file mode 100644 index 00000000000..16d59fea698 --- /dev/null +++ b/packages/js/components/src/display-state/index.ts @@ -0,0 +1 @@ +export * from './display-state'; diff --git a/packages/js/components/src/index.ts b/packages/js/components/src/index.ts index c0dc21b62b1..95a5c069817 100644 --- a/packages/js/components/src/index.ts +++ b/packages/js/components/src/index.ts @@ -103,3 +103,4 @@ export { ProductSectionLayout as __experimentalProductSectionLayout, ProductFieldSection as __experimentalProductFieldSection, } from './product-section-layout'; +export { DisplayState } from './display-state'; diff --git a/packages/js/product-editor/changelog/add-toggle-content-block-37253 b/packages/js/product-editor/changelog/add-toggle-content-block-37253 new file mode 100644 index 00000000000..f39042fffd4 --- /dev/null +++ b/packages/js/product-editor/changelog/add-toggle-content-block-37253 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Adding Collapsible block with support for flexible rendering. diff --git a/packages/js/product-editor/src/components/collapsible-block/block.json b/packages/js/product-editor/src/components/collapsible-block/block.json new file mode 100644 index 00000000000..d0a6e6deac5 --- /dev/null +++ b/packages/js/product-editor/src/components/collapsible-block/block.json @@ -0,0 +1,28 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/collapsible", + "title": "Collapsible", + "category": "widgets", + "description": "Container with collapsible inner blocks.", + "textdomain": "default", + "attributes": { + "toggleText": { + "type": "string" + }, + "initialCollapsed": { + "type": "boolean" + }, + "persistRender": { + "type": "boolean" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": true, + "reusable": false, + "inserter": false, + "lock": false + } +} diff --git a/packages/js/product-editor/src/components/collapsible-block/edit.tsx b/packages/js/product-editor/src/components/collapsible-block/edit.tsx new file mode 100644 index 00000000000..d4d0f743bf1 --- /dev/null +++ b/packages/js/product-editor/src/components/collapsible-block/edit.tsx @@ -0,0 +1,24 @@ +/** + * External dependencies + */ +import { CollapsibleContent } from '@woocommerce/components'; +import type { BlockAttributes } from '@wordpress/blocks'; +import { createElement } from '@wordpress/element'; +import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; + +export function Edit( { attributes }: { attributes: BlockAttributes } ) { + const blockProps = useBlockProps(); + const { toggleText, initialCollapsed, persistRender = true } = attributes; + + return ( +
    + + + +
    + ); +} diff --git a/packages/js/product-editor/src/components/collapsible-block/index.ts b/packages/js/product-editor/src/components/collapsible-block/index.ts new file mode 100644 index 00000000000..f0c73e48b2b --- /dev/null +++ b/packages/js/product-editor/src/components/collapsible-block/index.ts @@ -0,0 +1,17 @@ +/** + * Internal dependencies + */ +import { initBlock } from '../../utils'; +import metadata from './block.json'; +import { Edit } from './edit'; + +const { name } = metadata; + +export { metadata, name }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export const init = () => initBlock( { name, metadata, settings } ); diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index 3072621d8ce..ee8270acead 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -10,6 +10,7 @@ import { init as initName } from '../details-name-block'; import { init as initSection } from '../section'; import { init as initTab } from '../tab'; import { init as initPricing } from '../pricing-block'; +import { init as initCollapsible } from '../collapsible-block'; export const initBlocks = () => { registerCoreBlocks(); @@ -17,4 +18,5 @@ export const initBlocks = () => { initSection(); initTab(); initPricing(); + initCollapsible(); }; From b9df0e09f01a55effc48d23aa79d8ae33396cc10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Mon, 20 Mar 2023 23:12:09 -0300 Subject: [PATCH 1149/1680] Create a helper hook for field validation (#37196) * Add custom hook to validate product fields within blocks * Add changelog file * Add unit tests * Fix non working tests * Fix linter errors * Add changelog file * Fix async validation rejection * Solve conflicts after rebasing * Revert false negative lint errors * Move the hook to its own folder and add the readme.md file --- packages/js/data/changelog/add-37004 | 4 + packages/js/product-editor/babel.config.js | 3 + .../js/product-editor/changelog/add-37004 | 4 + packages/js/product-editor/jest.config.json | 4 + packages/js/product-editor/package.json | 9 + .../test/edit-product-link-modal.test.tsx | 4 +- .../src/hooks/use-validation/README.md | 41 + .../src/hooks/use-validation/index.ts | 1 + .../test/use-validation.test.ts | 95 + .../hooks/use-validation/use-validation.ts | 43 + pnpm-lock.yaml | 4482 +++++++++++++---- 11 files changed, 3832 insertions(+), 858 deletions(-) create mode 100644 packages/js/data/changelog/add-37004 create mode 100644 packages/js/product-editor/babel.config.js create mode 100644 packages/js/product-editor/changelog/add-37004 create mode 100644 packages/js/product-editor/jest.config.json create mode 100644 packages/js/product-editor/src/hooks/use-validation/README.md create mode 100644 packages/js/product-editor/src/hooks/use-validation/index.ts create mode 100644 packages/js/product-editor/src/hooks/use-validation/test/use-validation.test.ts create mode 100644 packages/js/product-editor/src/hooks/use-validation/use-validation.ts diff --git a/packages/js/data/changelog/add-37004 b/packages/js/data/changelog/add-37004 new file mode 100644 index 00000000000..78dee2bbd8a --- /dev/null +++ b/packages/js/data/changelog/add-37004 @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Fix linter errors diff --git a/packages/js/product-editor/babel.config.js b/packages/js/product-editor/babel.config.js new file mode 100644 index 00000000000..f73e04467aa --- /dev/null +++ b/packages/js/product-editor/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + extends: '../internal-js-tests/babel.config.js', +}; diff --git a/packages/js/product-editor/changelog/add-37004 b/packages/js/product-editor/changelog/add-37004 new file mode 100644 index 00000000000..f2086db98d3 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37004 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add custom validation hook diff --git a/packages/js/product-editor/jest.config.json b/packages/js/product-editor/jest.config.json new file mode 100644 index 00000000000..91c0faef97f --- /dev/null +++ b/packages/js/product-editor/jest.config.json @@ -0,0 +1,4 @@ +{ + "rootDir": "./src", + "preset": "../../internal-js-tests/jest.config.js" +} diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index ee99b501d5b..cf58e1f8a63 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -58,8 +58,15 @@ "react-router-dom": "^6.3.0" }, "devDependencies": { + "@babel/core": "^7.21.3", + "@babel/runtime": "^7.17.2", + "@testing-library/jest-dom": "^5.16.2", "@testing-library/react": "^12.1.3", + "@testing-library/react-hooks": "^8.0.1", + "@testing-library/user-event": "^13.5.0", + "@types/jest": "^27.4.1", "@types/react": "^17.0.2", + "@types/testing-library__jest-dom": "^5.14.3", "@types/wordpress__block-editor": "^7.0.0", "@types/wordpress__block-library": "^2.6.1", "@types/wordpress__blocks": "^11.0.7", @@ -91,10 +98,12 @@ }, "scripts": { "turbo:build": "pnpm run build:js && pnpm run build:css", + "turbo:test": "jest --config ./jest.config.json", "prepare": "composer install", "changelog": "composer exec -- changelogger", "clean": "pnpm exec rimraf tsconfig.tsbuildinfo build build-*", "build": "pnpm -w exec turbo run turbo:build --filter=$npm_package_name", + "test": "pnpm -w exec turbo run turbo:test --filter=$npm_package_name", "lint": "eslint src", "build:js": "tsc --build ./tsconfig.json ./tsconfig-cjs.json", "build:css": "webpack", diff --git a/packages/js/product-editor/src/components/edit-product-link-modal/test/edit-product-link-modal.test.tsx b/packages/js/product-editor/src/components/edit-product-link-modal/test/edit-product-link-modal.test.tsx index d9b181ce7ad..d134dfddf8b 100644 --- a/packages/js/product-editor/src/components/edit-product-link-modal/test/edit-product-link-modal.test.tsx +++ b/packages/js/product-editor/src/components/edit-product-link-modal/test/edit-product-link-modal.test.tsx @@ -11,8 +11,8 @@ import { createElement } from '@wordpress/element'; */ import { EditProductLinkModal } from '../'; -jest.mock( '@woocommerce/product-editor', () => ( { - __experimentalUseProductHelper: jest.fn().mockReturnValue( { +jest.mock( '../../../hooks/use-product-helper', () => ( { + useProductHelper: jest.fn().mockReturnValue( { updateProductWithStatus: jest.fn(), isUpdatingDraft: jest.fn(), isUpdatingPublished: jest.fn(), diff --git a/packages/js/product-editor/src/hooks/use-validation/README.md b/packages/js/product-editor/src/hooks/use-validation/README.md new file mode 100644 index 00000000000..2c8b83977db --- /dev/null +++ b/packages/js/product-editor/src/hooks/use-validation/README.md @@ -0,0 +1,41 @@ +# useValidation + +This custom hook uses the helper functions `const { lockPostSaving, unlockPostSaving } = useDispatch( 'core/editor' );` to lock/unlock the current editing product before saving it. + +## Usage + +Syncronous validation + +```typescript +import { useCallback } from '@wordpress/element'; +import { useValidation } from '@woocommerce/product-editor'; + +const product = ...; + +const validateTitle = useCallback( (): boolean => { + if ( product.title.length < 2 ) { + return false; + } + return true; +}, [ product.title ] ); + +const isTitleValid = useValidation( 'product/title', validateTitle ); +``` + +Asyncronous validation + +```typescript +import { useCallback } from '@wordpress/element'; +import { useValidation } from '@woocommerce/product-editor'; + +const product = ...; + +const validateSlug = useCallback( async (): Promise< boolean > => { + return fetch( `.../validate-slug?slug=${ product.slug }` ) + .then( ( response ) => response.json() ) + .then( ( { isValid } ) => isValid ) + .catch( () => false ); +}, [ product.slug ] ); + +const isSlugValid = useValidation( 'product/slug', validateSlug ); +``` diff --git a/packages/js/product-editor/src/hooks/use-validation/index.ts b/packages/js/product-editor/src/hooks/use-validation/index.ts new file mode 100644 index 00000000000..a6a64cadb31 --- /dev/null +++ b/packages/js/product-editor/src/hooks/use-validation/index.ts @@ -0,0 +1 @@ +export * from './use-validation'; diff --git a/packages/js/product-editor/src/hooks/use-validation/test/use-validation.test.ts b/packages/js/product-editor/src/hooks/use-validation/test/use-validation.test.ts new file mode 100644 index 00000000000..1ea6903fea7 --- /dev/null +++ b/packages/js/product-editor/src/hooks/use-validation/test/use-validation.test.ts @@ -0,0 +1,95 @@ +/** + * External dependencies + */ +import { renderHook } from '@testing-library/react-hooks'; +import { useDispatch } from '@wordpress/data'; + +/** + * Internal dependencies + */ +import { useValidation } from '../use-validation'; + +jest.mock( '@wordpress/data', () => ( { + useDispatch: jest.fn(), +} ) ); + +describe( 'useValidation', () => { + const useDispatchMock = useDispatch as jest.Mock; + const lockPostSaving = jest.fn(); + const unlockPostSaving = jest.fn(); + + beforeEach( () => { + useDispatchMock.mockReturnValue( { + lockPostSaving, + unlockPostSaving, + } ); + } ); + + afterEach( () => { + jest.clearAllMocks(); + } ); + + describe( 'sync', () => { + it( 'should lock the editor if validate returns false', async () => { + const { result, waitForNextUpdate } = renderHook( () => + useValidation( 'product/name', () => false ) + ); + + await waitForNextUpdate(); + + expect( result.current ).toBeFalsy(); + expect( lockPostSaving ).toHaveBeenCalled(); + expect( unlockPostSaving ).not.toHaveBeenCalled(); + } ); + + it( 'should unlock the editor if validate returns true', async () => { + const { result, waitForNextUpdate } = renderHook( () => + useValidation( 'product/name', () => true ) + ); + + await waitForNextUpdate(); + + expect( result.current ).toBeTruthy(); + expect( lockPostSaving ).not.toHaveBeenCalled(); + expect( unlockPostSaving ).toHaveBeenCalled(); + } ); + } ); + + describe( 'async', () => { + it( 'should lock the editor if validate resolves false', async () => { + const { result, waitForNextUpdate } = renderHook( () => + useValidation( 'product/name', () => Promise.resolve( false ) ) + ); + + await waitForNextUpdate(); + + expect( result.current ).toBeFalsy(); + expect( lockPostSaving ).toHaveBeenCalled(); + expect( unlockPostSaving ).not.toHaveBeenCalled(); + } ); + + it( 'should lock the editor if validate rejects', async () => { + const { result, waitForNextUpdate } = renderHook( () => + useValidation( 'product/name', () => Promise.reject() ) + ); + + await waitForNextUpdate(); + + expect( result.current ).toBeFalsy(); + expect( lockPostSaving ).toHaveBeenCalled(); + expect( unlockPostSaving ).not.toHaveBeenCalled(); + } ); + + it( 'should unlock the editor if validate resolves true', async () => { + const { result, waitForNextUpdate } = renderHook( () => + useValidation( 'product/name', () => Promise.resolve( true ) ) + ); + + await waitForNextUpdate(); + + expect( result.current ).toBeTruthy(); + expect( lockPostSaving ).not.toHaveBeenCalled(); + expect( unlockPostSaving ).toHaveBeenCalled(); + } ); + } ); +} ); diff --git a/packages/js/product-editor/src/hooks/use-validation/use-validation.ts b/packages/js/product-editor/src/hooks/use-validation/use-validation.ts new file mode 100644 index 00000000000..76478ff8e5d --- /dev/null +++ b/packages/js/product-editor/src/hooks/use-validation/use-validation.ts @@ -0,0 +1,43 @@ +/** + * External dependencies + */ +import { useDispatch } from '@wordpress/data'; +import { useEffect, useState } from '@wordpress/element'; + +/** + * Signals that product saving is locked. + * + * @param lockName The namespace used to lock the product saving if validation fails. + * @param validate The validator function. + */ +export function useValidation( + lockName: string, + validate: () => boolean | Promise< boolean > +): boolean | undefined { + const [ isValid, setIsValid ] = useState< boolean | undefined >(); + const { lockPostSaving, unlockPostSaving } = useDispatch( 'core/editor' ); + + useEffect( () => { + let validationResponse = validate(); + + if ( typeof validationResponse === 'boolean' ) { + validationResponse = Promise.resolve( validationResponse ); + } + + validationResponse + .then( ( isValidationValid ) => { + if ( isValidationValid ) { + unlockPostSaving( lockName ); + } else { + lockPostSaving( lockName ); + } + setIsValid( isValidationValid ); + } ) + .catch( () => { + lockPostSaving( lockName ); + setIsValid( false ); + } ); + }, [ lockName, validate, lockPostSaving, unlockPostSaving ] ); + + return isValid; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index efd192efeec..13035b4b4f8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -150,7 +150,7 @@ importers: webpack-cli: ^3.3.12 dependencies: '@woocommerce/components': link:../components - '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/element': 4.4.1 devDependencies: '@types/react': 17.0.50 @@ -166,7 +166,7 @@ importers: react: 17.0.2 react-dom: 17.0.2_react@17.0.2 sass-loader: 10.2.1_webpack@5.70.0 - ts-jest: 27.1.3_77oryishcckaigojnzbhxsiona + ts-jest: 27.1.3_hszvtzkxfg7axc55y33g3o6iwa typescript: 4.8.4 webpack: 5.70.0_webpack-cli@3.3.12 webpack-cli: 3.3.12_webpack@5.70.0 @@ -201,7 +201,7 @@ importers: axios-mock-adapter: 1.20.0_axios@0.24.0 eslint: 8.32.0 jest: 27.5.1 - ts-jest: 27.1.3_wfmhell6c5i72vvtgtvpmkkb6i + ts-jest: 27.1.3_n6jwe674nt3ravnkwja2moplpy typescript: 4.8.4 packages/js/api-core-tests: @@ -1119,7 +1119,7 @@ importers: typescript: ^4.8.3 dependencies: '@testing-library/jest-dom': 5.16.2 - '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m + '@testing-library/react': 12.1.4_6l5554ty5ajsajah6yazvrjhoe '@wordpress/data': 6.6.1_react@17.0.2 '@wordpress/i18n': 4.6.1 '@wordpress/jest-console': 5.0.2_jest@27.5.1 @@ -1363,9 +1363,16 @@ importers: packages/js/product-editor: specifiers: '@automattic/interpolate-components': ^1.2.0 + '@babel/core': ^7.21.3 + '@babel/runtime': ^7.17.2 + '@testing-library/jest-dom': ^5.16.2 '@testing-library/react': ^12.1.3 + '@testing-library/react-hooks': ^8.0.1 + '@testing-library/user-event': ^13.5.0 + '@types/jest': ^27.4.1 '@types/lodash': ^4.14.179 '@types/react': ^17.0.2 + '@types/testing-library__jest-dom': ^5.14.3 '@types/wordpress__block-editor': ^7.0.0 '@types/wordpress__block-library': ^2.6.1 '@types/wordpress__blocks': ^11.0.7 @@ -1429,18 +1436,18 @@ importers: '@woocommerce/number': link:../number '@woocommerce/settings': 1.0.0 '@woocommerce/tracks': link:../tracks - '@wordpress/block-editor': 9.8.0_vcke6catv4iqpjdw24uwvlzyyi + '@wordpress/block-editor': 9.8.0_mtk4wljkd5jimhszw4p7nnxuzm '@wordpress/blocks': 12.5.0_react@17.0.2 - '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/core-data': 4.4.5_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/editor': 12.5.10_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/editor': 12.5.10_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/element': 4.4.1 '@wordpress/html-entities': 3.6.1 '@wordpress/i18n': 4.6.1 '@wordpress/icons': 8.2.3 - '@wordpress/interface': 4.5.6_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/interface': 4.5.6_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/keyboard-shortcuts': 3.4.1_react@17.0.2 '@wordpress/media-utils': 3.4.1 '@wordpress/url': 3.7.1 @@ -1448,8 +1455,15 @@ importers: lodash: 4.17.21 react-router-dom: 6.3.0_sfoxds7t5ydpegc3knd667wn6m devDependencies: + '@babel/core': 7.21.3 + '@babel/runtime': 7.19.0 + '@testing-library/jest-dom': 5.16.2 '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m + '@testing-library/react-hooks': 8.0.1_hiunvzosbwliizyirxfy6hjyim + '@testing-library/user-event': 13.5.0_gzufz4q333be4gqfrvipwvqt6a + '@types/jest': 27.4.1 '@types/react': 17.0.50 + '@types/testing-library__jest-dom': 5.14.3 '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__block-library': 2.6.1 '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m @@ -1472,7 +1486,7 @@ importers: react-hooks^8.0.1: link:@testing-library/react-hooks^8.0.1 rimraf: 3.0.2 sass-loader: 10.2.1_webpack@5.70.0 - ts-jest: 27.1.3_77oryishcckaigojnzbhxsiona + ts-jest: 27.1.3_n6jwe674nt3ravnkwja2moplpy typescript: 4.8.4 webpack: 5.70.0_webpack-cli@3.3.12 webpack-cli: 3.3.12_webpack@5.70.0 @@ -1984,12 +1998,12 @@ importers: typescript: ^4.8.3 uglify-js: ^3.5.3 dependencies: - '@emotion/react': 11.10.5_lvgioobbs7lf3pr6y4xfpughau + '@emotion/react': 11.10.5_zg7wlf5auq2m3ro2gp4uufjvme '@types/prop-types': 15.7.4 '@woocommerce/components': link:../../packages/js/components '@woocommerce/data': link:../../packages/js/data '@wordpress/api-fetch': 6.3.1 - '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 '@wordpress/data-controls': 2.6.1_react@17.0.2 @@ -2006,7 +2020,7 @@ importers: '@woocommerce/eslint-plugin': link:../../packages/js/eslint-plugin '@wordpress/env': 4.9.0 '@wordpress/prettier-config': 2.5.0_wp-prettier@2.6.2 - '@wordpress/scripts': 19.2.4_f7x7zdz3ccrnqxb4utvdtwqz4e + '@wordpress/scripts': 19.2.4_ew4zquq24ctm7afg5tumlrriou eslint: 8.32.0 prettier: /wp-prettier/2.6.2 ts-loader: 9.4.1_27qmdvvfdw5s3nqwnln6yerdsa @@ -2275,10 +2289,10 @@ importers: typescript: ^4.8.3 webpack: ^5.70.0 dependencies: - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 + '@babel/preset-typescript': 7.16.7_@babel+core@7.21.3 devDependencies: - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/preset-env': 7.16.11_@babel+core@7.17.8 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/preset-env': 7.16.11_@babel+core@7.21.3 '@babel/runtime': 7.17.7 '@storybook/addon-a11y': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/addon-actions': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -2295,7 +2309,7 @@ importers: '@storybook/components': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-events': 6.4.19 '@storybook/manager-webpack5': 6.4.19_3n4gsnmxucj3bywv6syggoiztm - '@storybook/react': 6.4.19_a55upwwpdj22rf6pemjk4qxjbi + '@storybook/react': 6.4.19_eyy24cwvfyikqccjc6kc5n6u7q '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@woocommerce/eslint-plugin': link:../../packages/js/eslint-plugin react: 17.0.2 @@ -2349,7 +2363,14 @@ packages: resolution: {integrity: sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==} engines: {node: '>=6.0.0'} dependencies: - '@jridgewell/trace-mapping': 0.3.16 + '@jridgewell/trace-mapping': 0.3.17 + + /@ampproject/remapping/2.2.0: + resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.1.1 + '@jridgewell/trace-mapping': 0.3.17 /@automattic/calypso-color-schemes/2.1.1: resolution: {integrity: sha512-X5gmQEDJVtw8N9NARgZGM/pmalfapV8ZyRzEn2o0sCLmTAXGYg6A28ucLCQdBIn1l9t2rghBDFkY71vyqjyyFQ==} @@ -2683,6 +2704,10 @@ packages: resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} engines: {node: '>=6.9.0'} + /@babel/compat-data/7.21.0: + resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} + engines: {node: '>=6.9.0'} + /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} @@ -2711,18 +2736,18 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.3 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-module-transforms': 7.19.0 - '@babel/helpers': 7.17.8 - '@babel/parser': 7.19.3 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/generator': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 convert-source-map: 1.8.0 debug: 4.3.4 gensync: 1.0.0-beta.2 - json5: 2.2.0 + json5: 2.2.3 semver: 6.3.0 source-map: 0.5.7 transitivePeerDependencies: @@ -2751,6 +2776,28 @@ packages: transitivePeerDependencies: - supports-color + /@babel/core/7.21.3: + resolution: {integrity: sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.0 + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helpers': 7.21.0 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + /@babel/eslint-parser/7.17.0_45t77ya3ofqya5ogk4q6xdzcpq: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -2779,14 +2826,14 @@ packages: semver: 6.3.0 dev: true - /@babel/eslint-parser/7.17.0_xujkgafwcpm5gwokncqwvv5ure: + /@babel/eslint-parser/7.17.0_xrfyhdkbwxl52yb52lr5ltkqvm: resolution: {integrity: sha512-PUEJ7ZBXbRkbq3qqM/jZ2nIuakUBqCYc7Qf52Lj7dlZ6zERnqisdHioL0l4wwQZnmskMeasqUNzLBFKs3nylXA==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} peerDependencies: '@babel/core': '>=7.11.0' eslint: ^7.5.0 || ^8.0.0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 eslint: 7.32.0 eslint-scope: 5.1.1 eslint-visitor-keys: 2.1.0 @@ -2805,34 +2852,43 @@ packages: resolution: {integrity: sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 + /@babel/generator/7.21.3: + resolution: {integrity: sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + /@babel/helper-annotate-as-pure/7.16.0: resolution: {integrity: sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-annotate-as-pure/7.16.7: resolution: {integrity: sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-explode-assignable-expression': 7.18.6 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-compilation-targets/7.16.3_@babel+core@7.12.9: resolution: {integrity: sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==} @@ -2885,17 +2941,31 @@ packages: semver: 6.3.0 dev: true + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.21.3: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: true + /@babel/helper-compilation-targets/7.19.3_@babel+core@7.12.9: resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.12.9 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 semver: 6.3.0 + dev: true /@babel/helper-compilation-targets/7.19.3_@babel+core@7.16.12: resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} @@ -2903,7 +2973,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.16.12 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 @@ -2922,6 +2992,72 @@ packages: browserslist: 4.21.4 semver: 6.3.0 + /@babel/helper-compilation-targets/7.19.3_@babel+core@7.21.3: + resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.12.9: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + lru-cache: 5.1.1 + semver: 6.3.0 + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.16.12: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.16.12 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + lru-cache: 5.1.1 + semver: 6.3.0 + dev: false + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.17.8: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.17.8 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + lru-cache: 5.1.1 + semver: 6.3.0 + + /@babel/helper-compilation-targets/7.20.7_@babel+core@7.21.3: + resolution: {integrity: sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + lru-cache: 5.1.1 + semver: 6.3.0 + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -2975,6 +3111,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.21.3: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.19.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.12.9: resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==} engines: {node: '>=6.9.0'} @@ -2984,7 +3138,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.19.1 @@ -3001,7 +3155,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.19.1 @@ -3019,6 +3173,23 @@ packages: '@babel/core': 7.17.8 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + + /@babel/helper-create-class-features-plugin/7.19.0_@babel+core@7.21.3: + resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 @@ -3058,16 +3229,44 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.2.1 + /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.21.3: + resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + regexpu-core: 5.2.1 + /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.17.8: resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} peerDependencies: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 - '@babel/traverse': 7.19.3 + '@babel/traverse': 7.21.3 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-define-polyfill-provider/0.1.5_@babel+core@7.21.3: + resolution: {integrity: sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/traverse': 7.21.3 debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.1 @@ -3082,7 +3281,7 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -3097,7 +3296,7 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 '@babel/helper-plugin-utils': 7.19.0 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -3113,7 +3312,22 @@ packages: '@babel/core': ^7.4.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + debug: 4.3.4 + lodash.debounce: 4.0.8 + resolve: 1.22.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + + /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.21.3: + resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==} + peerDependencies: + '@babel/core': ^7.4.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 '@babel/helper-plugin-utils': 7.19.0 debug: 4.3.4 lodash.debounce: 4.0.8 @@ -3130,44 +3344,52 @@ packages: resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-function-name/7.19.0: resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 + + /@babel/helper-function-name/7.21.0: + resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-member-expression-to-functions/7.18.9: resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-module-imports/7.16.0: resolution: {integrity: sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-module-imports/7.16.7: resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 + dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-module-transforms/7.17.7: resolution: {integrity: sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==} @@ -3178,9 +3400,9 @@ packages: '@babel/helper-simple-access': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3193,9 +3415,24 @@ packages: '@babel/helper-simple-access': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + + /@babel/helper-module-transforms/7.21.2: + resolution: {integrity: sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/helper-validator-identifier': 7.19.1 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3203,7 +3440,7 @@ packages: resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-plugin-utils/7.10.4: resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==} @@ -3227,7 +3464,7 @@ packages: dependencies: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3237,7 +3474,7 @@ packages: dependencies: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3251,7 +3488,7 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3265,7 +3502,7 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color dev: false @@ -3280,7 +3517,21 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-wrap-function': 7.19.0 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + + /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-wrap-function': 7.19.0 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3291,8 +3542,8 @@ packages: '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3300,24 +3551,34 @@ packages: resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 + + /@babel/helper-simple-access/7.20.2: + resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 /@babel/helper-skip-transparent-expression-wrappers/7.18.9: resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/helper-string-parser/7.18.10: resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} engines: {node: '>=6.9.0'} + /@babel/helper-string-parser/7.19.4: + resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier/7.19.1: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} @@ -3338,10 +3599,10 @@ packages: resolution: {integrity: sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-function-name': 7.19.0 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/helper-function-name': 7.21.0 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3349,9 +3610,19 @@ packages: resolution: {integrity: sha512-QcL86FGxpfSJwGtAvv4iG93UL6bmqBdmoVY0CMCU2g+oD2ezQse3PT5Pa+jiD6LJndBQi0EDlpzOWNlLuhz5gw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + transitivePeerDependencies: + - supports-color + + /@babel/helpers/7.21.0: + resolution: {integrity: sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color @@ -3375,7 +3646,14 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 + + /@babel/parser/7.21.3: + resolution: {integrity: sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.21.3 /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} @@ -3407,6 +3685,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3415,6 +3703,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} @@ -3452,6 +3750,18 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -3462,6 +3772,18 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 + dev: false + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 /@babel/plugin-proposal-async-generator-functions/7.16.4_@babel+core@7.12.9: resolution: {integrity: sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==} @@ -3518,6 +3840,20 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.21.3: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.12.9: resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} engines: {node: '>=6.9.0'} @@ -3545,6 +3881,21 @@ packages: '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.21.3: + resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-class-properties/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-mCF3HcuZSY9Fcx56Lbn+CGdT44ioBMMvjNVldpKtj8tpniETdLjnxdHI1+sDWXIM1nNt+EanJOZ3IG9lzVjs7A==} @@ -3596,6 +3947,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.18.9 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -3619,6 +3983,19 @@ packages: '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} @@ -3662,6 +4039,20 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.21.3: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -3674,6 +4065,20 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.8 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-decorators/7.16.4_@babel+core@7.17.8: resolution: {integrity: sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==} @@ -3689,6 +4094,20 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-decorators/7.16.4_@babel+core@7.21.3: + resolution: {integrity: sha512-RESBNX16eNqnBeEVR5sCJpnW0mHiNLNNvGA8PrRuK/4ZJ4TO+6bHleRUuGQYDERVySOKtOhSya/C4MIhwAMAgg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-decorators': 7.16.0_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-dynamic-import/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-QGSA6ExWk95jFQgwz5GQ2Dr95cf7eI7TKutIXXTb7B1gCLTCz5hTjFTQGfLFBBiC5WSNi7udNwWsqbbMh1c4yQ==} engines: {node: '>=6.9.0'} @@ -3732,6 +4151,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -3741,6 +4171,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 /@babel/plugin-proposal-export-default-from/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} @@ -3761,6 +4202,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-default-from': 7.16.7_@babel+core@7.17.8 + dev: true + + /@babel/plugin-proposal-export-default-from/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-+cENpW1rgIjExn+o5c8Jw/4BuH4eGKKYvkMB8/0ZxFQ9mC0t4z09VsPIwNg6waF69QYC81zxGeAsREGuqQoKeg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-default-from': 7.16.7_@babel+core@7.21.3 /@babel/plugin-proposal-export-namespace-from/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-CjI4nxM/D+5wCnhD11MHB1AwRSAYeDT+h8gCdcVJZ/OK7+wRzFsf7PFPWVpVpNRkHMmMkQWAHpTq+15IXQ1diA==} @@ -3805,6 +4257,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -3814,6 +4277,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 /@babel/plugin-proposal-json-strings/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-kouIPuiv8mSi5JkEhzApg5Gn6hFyKPnlkO0a9YSzqRurH8wYzSlf6RJdzluAsbqecdW5pBvDJDfyDIUR/vLxvg==} @@ -3858,6 +4332,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -3867,6 +4352,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 /@babel/plugin-proposal-logical-assignment-operators/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-pbW0fE30sVTYXXm9lpVQQ/Vc+iTeQKiXlaNRZPPN2A2VdlWyAtsUrsQ3xydSlDW00TFMK7a8m3cDTkBF5WnV3Q==} @@ -3911,6 +4407,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -3920,6 +4427,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 /@babel/plugin-proposal-nullish-coalescing-operator/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-3bnHA8CAFm7cG93v8loghDYyQ8r97Qydf63BeYiGgYbjKKB/XP53W15wfRC7dvKfoiJ34f6Rbyyx2btExc8XsQ==} @@ -3963,6 +4481,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -3982,6 +4511,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 /@babel/plugin-proposal-numeric-separator/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-FAhE2I6mjispy+vwwd6xWPyEx3NYFS13pikDBWUAFGZvq6POGs5eNchw8+1CYoEgBl9n11I3NkzD7ghn25PQ9Q==} @@ -4026,6 +4566,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -4035,6 +4586,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==} @@ -4102,15 +4664,29 @@ packages: '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.21.3: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 @@ -4121,12 +4697,26 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 /@babel/plugin-proposal-optional-catch-binding/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-kicDo0A/5J0nrsCPbn89mTG3Bm4XgYi0CZtvex9Oyw7gGZE3HXGD0zpQNH+mo+tEfbo8wbmMvJftOwpmPy7aVw==} @@ -4171,6 +4761,17 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -4190,6 +4791,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 + dev: false + + /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 /@babel/plugin-proposal-optional-chaining/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-Y4rFpkZODfHrVo70Uaj6cC1JJOt3Pp0MdWSwIKtb8z1/lsjl9AmnB7ErRFV+QNGIfcY1Eruc2UMx5KaRnXjMyg==} @@ -4237,6 +4849,18 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} engines: {node: '>=6.9.0'} @@ -4271,6 +4895,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 + /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + /@babel/plugin-proposal-private-methods/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-IvHmcTHDFztQGnn6aWq4t12QaBXTKr1whF/dgp9kz84X6GUcwq9utj7z2wFCUfeOup/QKnOlt2k0zxkGFx9ubg==} engines: {node: '>=6.9.0'} @@ -4291,7 +4926,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color dev: true @@ -4304,7 +4939,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color dev: false @@ -4322,6 +4957,19 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.21.3: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4333,6 +4981,19 @@ packages: '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} @@ -4343,7 +5004,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 transitivePeerDependencies: - supports-color @@ -4358,7 +5019,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-annotate-as-pure': 7.16.7 '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 transitivePeerDependencies: - supports-color @@ -4379,6 +5040,21 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4392,6 +5068,21 @@ packages: '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.8 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-proposal-unicode-property-regex/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-ti7IdM54NXv29cA4+bNNKEMS4jLMCbJgl+Drv+FgYy0erJLAxNAIXcNjNjrRZEcWq0xJHsNVwQezskMFpF8N9g==} @@ -4436,6 +5127,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} engines: {node: '>=4'} @@ -4467,6 +5169,16 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.12.9: resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: @@ -4492,6 +5204,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.21.3: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: @@ -4508,6 +5228,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.12.9: resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} @@ -4534,6 +5263,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.21.3: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -4563,6 +5300,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.21.3: + resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-decorators/7.16.0_@babel+core@7.17.8: resolution: {integrity: sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==} engines: {node: '>=6.9.0'} @@ -4573,6 +5319,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-syntax-decorators/7.16.0_@babel+core@7.21.3: + resolution: {integrity: sha512-nxnnngZClvlY13nHJAIDow0S7Qzhq64fQ/NlqS+VER3kjW/4F0jLhXjeL8jcwSwz6Ca3rotT5NJD2T9I7lcv7g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: @@ -4598,6 +5354,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-export-default-from/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} engines: {node: '>=6.9.0'} @@ -4615,6 +5379,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-export-default-from/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-4C3E4NsrLOgftKaTYTULhHsuQrGv3FHrBzOMDiS7UYKIpgGBkAdawg4h+EI8zPeK9M0fiIIh72hIwsI24K7MbA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} @@ -4641,6 +5415,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-flow/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} engines: {node: '>=6.9.0'} @@ -4659,6 +5441,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-flow/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-UDo3YGQO0jH6ytzVwgSLv9i/CzMcUjbKenL67dTrAZPPv6GFAtDhe6jqnvmoKzC/7htNTohhos+onPtDMqJwaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} engines: {node: '>=6.9.0'} @@ -4667,6 +5458,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.12.9: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} @@ -4684,6 +5485,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.3: + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} @@ -4710,6 +5520,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} peerDependencies: @@ -4749,6 +5567,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-syntax-jsx/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} engines: {node: '>=6.9.0'} @@ -4767,6 +5595,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.12.9: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -4792,6 +5629,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.21.3: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -4817,6 +5662,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.12.9: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -4842,6 +5695,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.21.3: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -4867,6 +5728,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -4892,6 +5761,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -4917,6 +5794,14 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.21.3: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -4946,6 +5831,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.21.3: + resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.12.9: resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} @@ -4974,6 +5868,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.21.3: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.16.12: resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} engines: {node: '>=6.9.0'} @@ -4993,6 +5896,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-typescript/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-YhUIJHHGkqPgEcMYkPCKTyGUdoGKWtopIycQyjJH8OjvRgOYsXsaKehLVPScKJWAULPxMa4N1vCe6szREFlZ7A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} engines: {node: '>=6.9.0'} @@ -5002,13 +5914,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.17.8: + /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-arrow-functions/7.16.0_@babel+core@7.12.9: @@ -5050,6 +5962,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -5067,6 +5989,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-async-to-generator/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==} @@ -5088,8 +6020,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-remap-async-to-generator': 7.16.8 transitivePeerDependencies: - supports-color @@ -5102,8 +6034,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.16.7 - '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-remap-async-to-generator': 7.16.8 transitivePeerDependencies: - supports-color @@ -5123,6 +6055,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.21.3: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -5148,6 +6094,20 @@ packages: '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.17.8 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-block-scoped-functions/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-V14As3haUOP4ZWrLJ3VVx5rCnrYhMSHN/jX7z6FAt5hjRkLsb0snPCmJwSOML5oxkKO4FNoNv7V5hw/y2bjuvg==} @@ -5188,6 +6148,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -5205,6 +6175,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-block-scoping/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-27n3l67/R3UrXfizlvHGuTwsRIFyce3D/6a37GRxn28iyTPvNXaW4XvznexRh1zUNLPjbLL22Id0XQElV94ruw==} @@ -5245,6 +6225,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -5262,6 +6252,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-classes/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-HUxMvy6GtAdd+GKBNYDWCIA776byUQH8zjnfjxwT1P1ARv/wFu8eBDpmXQcLS/IwRtrxIReGiplOwMeyO7nsDQ==} @@ -5289,7 +6289,7 @@ packages: '@babel/core': 7.12.9 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-replace-supers': 7.19.1 @@ -5308,7 +6308,7 @@ packages: '@babel/core': 7.16.12 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-replace-supers': 7.19.1 @@ -5327,7 +6327,26 @@ packages: '@babel/core': 7.17.8 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-replace-supers': 7.19.1 @@ -5345,7 +6364,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -5364,7 +6383,27 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-classes/7.19.0_@babel+core@7.21.3: + resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-optimise-call-expression': 7.18.6 @@ -5414,6 +6453,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -5431,6 +6480,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-destructuring/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-Q7tBUwjxLTsHEoqktemHBMtb3NYwyJPTJdM+wDwb0g8PZ3kQUIzNvwD5lPaqW/p54TXBc/MXZu9Jr7tbUEUM8Q==} @@ -5471,6 +6530,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.21.3: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.12.9: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -5488,6 +6557,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.21.3: + resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-dotall-regex/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-FXlDZfQeLILfJlC6I1qyEwcHK5UpRCFkaoVyA1nk9A1L1Yu583YO4un2KsLBsu3IJb4CUbctZks8tD9xPQubLw==} @@ -5532,6 +6611,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} engines: {node: '>=6.9.0'} @@ -5563,6 +6653,16 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-duplicate-keys/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-LIe2kcHKAZOJDNxujvmp6z3mfN6V9lJxubU4fJIGoQCkKe3Ec2OcbdlYP+vW++4MpxwG0d1wSDOJtQW5kLnkZQ==} engines: {node: '>=6.9.0'} @@ -5602,6 +6702,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -5610,6 +6720,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-exponentiation-operator/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-OwYEvzFI38hXklsrbNivzpO3fh87skzx8Pnqi4LoSYeav0xHlueSoCJrSgTPfnbyzopo5b3YVAJkFIcUpK2wsw==} @@ -5654,6 +6774,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -5673,6 +6804,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-flow-strip-types/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} @@ -5694,6 +6836,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.17.8 + /@babel/plugin-transform-flow-strip-types/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-mzmCq3cNsDpZZu9FADYYyfZJIOrSONmHcop2XEKPdBNMa4PDC4eEvcOvzZaCNcjKu72v0XQlA5y1g58aLRXdYg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.21.3 + /@babel/plugin-transform-for-of/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-5QKUw2kO+GVmKr2wMYSATCTTnHyscl6sxFRAY+rvN7h7WB0lcG0o4NoV6ZQU32OZGVsYUsfLGgPQpDFdkfjlJQ==} engines: {node: '>=6.9.0'} @@ -5733,6 +6885,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.12.9: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -5750,6 +6912,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.21.3: + resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-function-name/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-lBzMle9jcOXtSOXUpc7tvvTpENu/NuekNJVova5lCCWCV9/U1ho2HH2y0p6mBg8fPm/syEAbfaaemYGOHCY3mg==} @@ -5768,8 +6940,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5780,8 +6952,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.16.12 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.19.0 dev: false @@ -5792,8 +6964,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5804,8 +6988,8 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.12.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.17.8: @@ -5815,8 +6999,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-literals/7.16.0_@babel+core@7.12.9: @@ -5858,6 +7054,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -5875,6 +7081,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-member-expression-literals/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-WRpw5HL4Jhnxw8QARzRvwojp9MIE7Tdk3ez6vRyUk1MwgjJN0aNpRoXainLR5SgxmoXx/vsXGZ6OthP6t/RbUg==} @@ -5915,6 +7131,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -5932,6 +7158,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-modules-amd/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-rWFhWbCJ9Wdmzln1NmSCqn7P0RAD+ogXG/bd9Kg5c7PKWkJtkiXmYsMBeXjDlzHpVTJ4I/hnjs45zX4dEv81xw==} @@ -5940,7 +7176,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5988,6 +7224,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -5995,7 +7245,21 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -6008,7 +7272,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-simple-access': 7.18.6 babel-plugin-dynamic-import-node: 2.3.3 @@ -6059,6 +7323,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.21.3: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -6066,9 +7345,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 + '@babel/helper-simple-access': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -6080,9 +7359,24 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 + '@babel/helper-simple-access': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -6095,7 +7389,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -6110,7 +7404,7 @@ packages: dependencies: '@babel/core': 7.12.9 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -6126,7 +7420,7 @@ packages: dependencies: '@babel/core': 7.16.12 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -6142,7 +7436,23 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.21.3: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -6158,7 +7468,23 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.21.3: + resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-identifier': 7.19.1 babel-plugin-dynamic-import-node: 2.3.3 @@ -6172,7 +7498,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color @@ -6184,7 +7510,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color @@ -6197,7 +7523,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color @@ -6210,7 +7536,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color @@ -6223,7 +7562,20 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.19.0 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color @@ -6267,6 +7619,16 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 dev: true + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.21.3: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + dev: true + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.12.9: resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} @@ -6286,6 +7648,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.21.3: + resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-new-target/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-fhjrDEYv2DBsGN/P6rlqakwRwIp7rBGLPbrKxwh7oVt5NNkIhZVOY2GRV+ULLsQri1bDqwDWnU3vhlmx5B2aCw==} @@ -6326,6 +7699,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -6334,6 +7717,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-object-super/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-fds+puedQHn4cPLshoHcR1DTMN0q1V9ou0mUjm8whx9pGcNvDrVVrgw+KJzzCaiTdaYhldtrUps8DWVMgrSEyg==} @@ -6386,6 +7779,19 @@ packages: - supports-color dev: true + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -6409,6 +7815,19 @@ packages: '@babel/helper-replace-supers': 7.19.1 transitivePeerDependencies: - supports-color + dev: false + + /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color /@babel/plugin-transform-parameters/7.16.3_@babel+core@7.12.9: resolution: {integrity: sha512-3MaDpJrOXT1MZ/WCmkOFo7EtmVVC8H4EUZVrHvFOsmwkk4lOjQj8rzv8JKUZV4YoQKeoIgk07GO+acPU9IMu/w==} @@ -6449,6 +7868,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.12.9: resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} engines: {node: '>=6.9.0'} @@ -6477,6 +7906,15 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.21.3: + resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-XLldD4V8+pOqX2hwfWhgwXzGdnDOThxaNTgqagOcpBgIxbUvpgU2FMvo5E1RyHbk756WYgdbS0T8y0Cj9FKkWQ==} engines: {node: '>=6.9.0'} @@ -6516,6 +7954,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -6533,14 +7981,24 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false - /@babel/plugin-transform-react-constant-elements/7.17.6_@babel+core@7.17.8: + /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + + /@babel/plugin-transform-react-constant-elements/7.17.6_@babel+core@7.21.3: resolution: {integrity: sha512-OBv9VkyyKtsHZiHLoSfCn+h6yU7YKX8nrs32xUmOa1SRSk+t03FosB6fBZ0Yz4BpD1WV7l73Nsad+2Tz7APpqw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -6561,6 +8019,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-react-display-name/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} @@ -6572,6 +8040,16 @@ packages: '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.17.8 dev: true + /@babel/plugin-transform-react-jsx-development/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + dev: true + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} engines: {node: '>=6.9.0'} @@ -6581,13 +8059,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.17.8: + /@babel/plugin-transform-react-jsx-self/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.12.9: @@ -6599,13 +8077,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.17.8: + /@babel/plugin-transform-react-jsx-source/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-utZmlASneDfdaMh0m/WausbjUjEdGrQJz0vFK93d7wD3xf5wBtX219+q6IlCNZeguIcxS2f/CvLZrlLSvSHQXw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-react-jsx/7.16.0_@babel+core@7.12.9: @@ -6633,7 +8111,7 @@ packages: '@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.12 - '@babel/types': 7.16.0 + '@babel/types': 7.21.3 dev: false /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.17.8: @@ -6650,6 +8128,20 @@ packages: '@babel/types': 7.17.0 dev: true + /@babel/plugin-transform-react-jsx/7.17.3_@babel+core@7.21.3: + resolution: {integrity: sha512-9tjBm4O07f7mzKSIlEmPdiE6ub7kfIe6Cd+w+oQebpATfTQMAgW+YOuWxogbKVTulA+MEO7byMeIUtQ1z+z+ZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.16.7_@babel+core@7.21.3 + '@babel/types': 7.21.3 + dev: true + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.12.9: resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} engines: {node: '>=6.9.0'} @@ -6661,7 +8153,7 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.12.9 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.17.8: resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} @@ -6674,7 +8166,21 @@ packages: '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.17.8 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 + dev: true + + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.21.3: + resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.3 + '@babel/types': 7.21.3 /@babel/plugin-transform-react-pure-annotations/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} @@ -6687,6 +8193,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-react-pure-annotations/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-regenerator/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-JAvGxgKuwS2PihiSFaDrp94XOzzTUeDeOQlcKzVAyaPap7BnZXK/lvMDiubkPTdotPKOIZq9xWXWnggUMYiExg==} engines: {node: '>=6.9.0'} @@ -6726,6 +8243,16 @@ packages: regenerator-transform: 0.14.5 dev: true + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + regenerator-transform: 0.14.5 + dev: true + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -6735,6 +8262,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 regenerator-transform: 0.15.0 + dev: false + + /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + regenerator-transform: 0.15.0 /@babel/plugin-transform-reserved-words/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-Dgs8NNCehHSvXdhEhln8u/TtJxfVwGYCgP2OOr5Z3Ar+B+zXicEOKNTyc+eca2cuEOMtjW6m9P9ijOt8QdqWkg==} @@ -6775,6 +8313,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.17.8: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -6783,6 +8331,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-runtime/7.16.4_@babel+core@7.12.9: resolution: {integrity: sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==} @@ -6818,18 +8376,18 @@ packages: - supports-color dev: false - /@babel/plugin-transform-runtime/7.16.4_@babel+core@7.17.8: + /@babel/plugin-transform-runtime/7.16.4_@babel+core@7.21.3: 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.17.8 + '@babel/core': 7.21.3 '@babel/helper-module-imports': 7.16.0 '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 - babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.17.8 - babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.21.3 + babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.21.3 + babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.21.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -6851,18 +8409,18 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-runtime/7.19.1_@babel+core@7.17.8: + /@babel/plugin-transform-runtime/7.19.1_@babel+core@7.21.3: resolution: {integrity: sha512-2nJjTUFIzBMP/f/miLxEK9vxwW/KUXsdvN4sR//TmuDhe6yU2h57WmIOE12Gng3MDP/xpjUV/ToZRdcf8Yj4fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 - babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.17.8 - babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.17.8 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.3 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.3 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -6906,6 +8464,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -6923,6 +8491,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-spread/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-Ao4MSYRaLAQczZVp9/7E7QHsCuK92yHRrmVNRe/SlEJjhzivq0BSn8mEraimL8wizHZ3fuaHxKH0iwzI13GyGg==} @@ -6967,6 +8545,17 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 dev: true + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: true + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.12.9: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -6986,6 +8575,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + + /@babel/plugin-transform-spread/7.19.0_@babel+core@7.21.3: + resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 /@babel/plugin-transform-sticky-regex/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-/ntT2NljR9foobKk4E/YyOSwcGUXtYWv5tinMK/3RkypyNBNdhHUaq6Orw5DWq9ZcNlS03BIlEALFeQgeVAo4Q==} @@ -7026,6 +8626,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -7043,6 +8653,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-template-literals/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-Rd4Ic89hA/f7xUSJQk5PnC+4so50vBoBfxjdQAdvngwidM8jYIBVxBZ/sARxD4e0yMXRbJVDrYf7dyRtIIKT6Q==} @@ -7083,6 +8703,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -7100,6 +8730,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-typeof-symbol/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-++V2L8Bdf4vcaHi2raILnptTBjGEFxn5315YU+e8+EqXIucA+q349qWngCLpUYqqv233suJ6NOienIVUpS9cqg==} @@ -7140,6 +8780,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.17.8: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -7148,6 +8798,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.16.12: resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} @@ -7176,6 +8836,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-typescript/7.16.8_@babel+core@7.21.3: + resolution: {integrity: sha512-bHdQ9k7YpBDO2d0NVfkj51DpQcvwIzIusJ7mEUaMlbZq3Kt/U47j24inXZHQ5MDiYpCs+oZiwnXyKedE8+q7AQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-typescript': 7.16.7_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + /@babel/plugin-transform-typescript/7.19.3_@babel+core@7.12.9: resolution: {integrity: sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==} engines: {node: '>=6.9.0'} @@ -7189,16 +8862,16 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-typescript/7.19.3_@babel+core@7.17.8: + /@babel/plugin-transform-typescript/7.19.3_@babel+core@7.21.3: resolution: {integrity: sha512-z6fnuK9ve9u/0X0rRvI9MY0xg+DOUaABDYOe+/SQTxtlptaBB/V9JIUxJn6xp3lMBeb9qe8xSFmHU35oZDXD+w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.21.3 transitivePeerDependencies: - supports-color @@ -7241,6 +8914,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.17.8: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -7249,6 +8932,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.3: + resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-transform-unicode-regex/7.16.0_@babel+core@7.12.9: resolution: {integrity: sha512-jHLK4LxhHjvCeZDWyA9c+P9XH1sOxRd1RO9xMtDVRAOND/PczPqizEtVdx4TQF/wyPaewqpT+tgQFYMnN/P94A==} @@ -7293,6 +8986,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.12.9: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -7312,6 +9016,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.3: + resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 /@babel/polyfill/7.12.1: resolution: {integrity: sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==} @@ -7651,15 +9366,100 @@ packages: - supports-color dev: true + /@babel/preset-env/7.16.11_@babel+core@7.21.3: + resolution: {integrity: sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.17.7 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.21.3 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.21.3 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.21.3 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.21.3 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.21.3 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.21.3 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.21.3 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.21.3 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.3 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.21.3 + babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.21.3 + babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.21.3 + core-js-compat: 3.21.1 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/preset-env/7.19.3_@babel+core@7.17.8: resolution: {integrity: sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.17.8 @@ -7727,7 +9527,7 @@ packages: '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.17.8 '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.17.8 '@babel/preset-modules': 0.1.5_@babel+core@7.17.8 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.17.8 @@ -7735,6 +9535,92 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false + + /@babel/preset-env/7.19.3_@babel+core@7.21.3: + resolution: {integrity: sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.21.3 + '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.3 + '@babel/preset-modules': 0.1.5_@babel+core@7.21.3 + '@babel/types': 7.21.3 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.3 + babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.21.3 + babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.21.3 + core-js-compat: 3.25.5 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /@babel/preset-flow/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==} @@ -7747,6 +9633,18 @@ packages: '@babel/helper-validator-option': 7.18.6 '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.17.8 + /@babel/preset-flow/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-6ceP7IyZdUYQ3wUVqyRSQXztd1YmFHWI4Xv11MIqAlE4WqxBSd/FZ61V9k+TS5Gd4mkHOtQtPp9ymRpxH4y1Ug==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.21.3 + dev: true + /@babel/preset-modules/0.1.5_@babel+core@7.12.9: resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} peerDependencies: @@ -7756,7 +9654,7 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 esutils: 2.0.3 /@babel/preset-modules/0.1.5_@babel+core@7.16.12: @@ -7768,7 +9666,7 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.16.12 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.16.12 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 esutils: 2.0.3 dev: false @@ -7781,7 +9679,19 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.17.8 - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 + esutils: 2.0.3 + + /@babel/preset-modules/0.1.5_@babel+core@7.21.3: + resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.21.3 + '@babel/types': 7.21.3 esutils: 2.0.3 /@babel/preset-react/7.16.7_@babel+core@7.17.8: @@ -7799,6 +9709,21 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.17.8 dev: true + /@babel/preset-react/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-react-jsx-development': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-react-pure-annotations': 7.16.7_@babel+core@7.21.3 + dev: true + /@babel/preset-typescript/7.16.7_@babel+core@7.16.12: resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} engines: {node: '>=6.9.0'} @@ -7820,22 +9745,35 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.18.9 - '@babel/helper-validator-option': 7.16.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-option': 7.18.6 '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.17.8 transitivePeerDependencies: - supports-color - /@babel/preset-typescript/7.18.6_@babel+core@7.17.8: + /@babel/preset-typescript/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-WbVEmgXdIyvzB77AQjGBEyYPZx+8tTsO50XtfozQrkW8QB2rLJpH2lgx0TRw5EJrBxOZQ+wCcyPVQvS8tjEHpQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-transform-typescript': 7.16.8_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + + /@babel/preset-typescript/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.17.8 + '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.21.3 transitivePeerDependencies: - supports-color @@ -7865,6 +9803,20 @@ packages: pirates: 4.0.5 source-map-support: 0.5.20 + /@babel/register/7.18.9_@babel+core@7.21.3: + resolution: {integrity: sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + clone-deep: 4.0.1 + find-cache-dir: 2.1.0 + make-dir: 2.1.0 + pirates: 4.0.5 + source-map-support: 0.5.20 + dev: true + /@babel/runtime-corejs2/7.5.5: resolution: {integrity: sha512-FYATQVR00NSNi7mUfpPDp7E8RYMXDuO8gaix7u/w3GekfUinKgX1AcTxs7SoiEmoEW9mbpjrwqWSW6zCmw5h8A==} dependencies: @@ -7896,29 +9848,37 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 /@babel/template/7.18.10: resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + + /@babel/template/7.20.7: + resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 /@babel/traverse/7.17.3: resolution: {integrity: sha512-5irClVky7TxRWIRtxlh2WPUUOLhcPN06AGgaQSB8AEwuyEBgJVuJ5imdHm5zxk8w0QS5T+tDfnDxAlhWjpb7cw==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.3 + '@babel/generator': 7.21.3 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -7929,13 +9889,30 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.18.6 - '@babel/generator': 7.19.3 + '@babel/generator': 7.21.3 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.19.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse/7.21.3: + resolution: {integrity: sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.18.6 + '@babel/generator': 7.21.3 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-split-export-declaration': 7.18.6 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: @@ -7963,6 +9940,14 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + /@babel/types/7.21.3: + resolution: {integrity: sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.19.4 + '@babel/helper-validator-identifier': 7.19.1 + to-fast-properties: 2.0.0 + /@base2/pretty-print-object/1.0.1: resolution: {integrity: sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==} dev: true @@ -8023,6 +10008,26 @@ packages: source-map: 0.5.7 stylis: 4.1.3 + /@emotion/babel-plugin/11.10.5_@babel+core@7.21.3: + resolution: {integrity: sha512-xE7/hyLHJac7D2Ve9dKroBBZqBT7WuPQmWcq7HSGb84sUuP4mlOWoB8dvVfD9yk5DHkU1m6RW7xSoDtnQHNQeA==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.3 + '@babel/runtime': 7.19.0 + '@emotion/hash': 0.9.0 + '@emotion/memoize': 0.8.0 + '@emotion/serialize': 1.1.1 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.8.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.1.3 + dev: false + /@emotion/cache/10.0.29: resolution: {integrity: sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==} dependencies: @@ -8088,6 +10093,22 @@ packages: '@emotion/sheet': 1.2.1 '@emotion/utils': 1.2.0 + /@emotion/css/11.7.1_@babel+core@7.21.3: + resolution: {integrity: sha512-RUUgPlMZunlc7SE5A6Hg+VWRzb2cU6O9xlV78KCFgcnl25s7Qz/20oQg71iKudpLqk7xj0vhbJlwcJJMT0BOZg==} + peerDependencies: + '@babel/core': ^7.0.0 + peerDependenciesMeta: + '@babel/core': + optional: true + dependencies: + '@babel/core': 7.21.3 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.21.3 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 + '@emotion/sheet': 1.2.1 + '@emotion/utils': 1.2.0 + dev: false + /@emotion/hash/0.8.0: resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==} @@ -8162,6 +10183,31 @@ packages: react: 17.0.2 dev: false + /@emotion/react/11.10.5_zg7wlf5auq2m3ro2gp4uufjvme: + resolution: {integrity: sha512-TZs6235tCJ/7iF6/rvTaOH4oxQg2gMAcdHemjwLKIjKz4rRuYe1HJ2TQJKnAcRAfOUDdU8XoDadCe1rl72iv8A==} + peerDependencies: + '@babel/core': ^7.0.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/core': 7.21.3 + '@babel/runtime': 7.19.0 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.21.3 + '@emotion/cache': 11.10.5 + '@emotion/serialize': 1.1.1 + '@emotion/use-insertion-effect-with-fallbacks': 1.0.0_react@17.0.2 + '@emotion/utils': 1.2.0 + '@emotion/weak-memoize': 0.3.0 + '@types/react': 17.0.50 + hoist-non-react-statics: 3.3.2 + react: 17.0.2 + dev: false + /@emotion/serialize/0.11.16: resolution: {integrity: sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==} dependencies: @@ -8224,6 +10270,30 @@ packages: react: 17.0.2 dev: true + /@emotion/styled/11.8.1_6t3indjc5ssefvr44gr3wo2uqu: + resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} + peerDependencies: + '@babel/core': ^7.0.0 + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/react': + optional: true + dependencies: + '@babel/core': 7.21.3 + '@babel/runtime': 7.19.0 + '@emotion/babel-plugin': 11.10.5_@babel+core@7.21.3 + '@emotion/is-prop-valid': 1.1.2 + '@emotion/react': 11.10.5_zg7wlf5auq2m3ro2gp4uufjvme + '@emotion/serialize': 1.1.1 + '@emotion/utils': 1.2.0 + '@types/react': 17.0.50 + react: 17.0.2 + dev: false + /@emotion/styled/11.8.1_c2qm47vaialpqni522adyu6za4: resolution: {integrity: sha512-OghEVAYBZMpEquHZwuelXcRjRJQOVayvbmNR0zr174NHdmMgrNkLC6TljKC5h9lZLkN5WGrdUcrKlOJ4phhoTQ==} peerDependencies: @@ -9141,7 +11211,7 @@ packages: resolution: {integrity: sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==} engines: {node: '>= 6'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/types': 24.9.0 babel-plugin-istanbul: 5.2.0 chalk: 2.4.2 @@ -9165,7 +11235,7 @@ packages: resolution: {integrity: sha512-Y8CEoVwXb4QwA6Y/9uDkn0Xfz0finGkieuV0xkdF9UtZGJeLukD5nLkaVrVsODB1ojRWlaoD0AJZpVHCSnJEvg==} engines: {node: '>= 8.3'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/types': 25.5.0 babel-plugin-istanbul: 6.1.1 chalk: 3.0.0 @@ -9189,7 +11259,7 @@ packages: resolution: {integrity: sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/types': 26.6.2 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -9211,7 +11281,7 @@ packages: resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/types': 27.5.1 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 @@ -9268,13 +11338,20 @@ packages: '@types/yargs': 16.0.4 chalk: 4.1.2 + /@jridgewell/gen-mapping/0.1.1: + resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/gen-mapping/0.3.2: resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 '@jridgewell/sourcemap-codec': 1.4.14 - '@jridgewell/trace-mapping': 0.3.16 + '@jridgewell/trace-mapping': 0.3.17 /@jridgewell/resolve-uri/3.1.0: resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} @@ -9293,6 +11370,12 @@ packages: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/trace-mapping/0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + dependencies: + '@jridgewell/resolve-uri': 3.1.0 + '@jridgewell/sourcemap-codec': 1.4.14 + /@jridgewell/trace-mapping/0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -10665,7 +12748,7 @@ packages: '@storybook/node-logger': 6.4.19 '@storybook/postinstall': 6.4.19 '@storybook/preview-web': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/react': 6.4.19_a55upwwpdj22rf6pemjk4qxjbi + '@storybook/react': 6.4.19_eyy24cwvfyikqccjc6kc5n6u7q '@storybook/source-loader': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/theming': 6.4.19_sfoxds7t5ydpegc3knd667wn6m @@ -11004,27 +13087,27 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.4.19 @@ -11044,9 +13127,9 @@ packages: '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.25.5 css-loader: 3.6.0_webpack@4.46.0 @@ -11097,27 +13180,27 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.4.19 @@ -11137,9 +13220,9 @@ packages: '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.25.5 css-loader: 3.6.0_webpack@4.46.0 @@ -11190,27 +13273,27 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.4.19 @@ -11230,9 +13313,9 @@ packages: '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.25.5 css-loader: 3.6.0_webpack@4.46.0 @@ -11283,27 +13366,27 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.4.19 @@ -11323,9 +13406,9 @@ packages: '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.25.5 css-loader: 3.6.0_webpack@4.46.0 @@ -11376,27 +13459,27 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/api': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/channel-postmessage': 6.4.19 @@ -11416,9 +13499,9 @@ packages: '@types/node': 14.14.33 '@types/webpack': 4.41.32 autoprefixer: 9.8.6 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 2.8.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 case-sensitive-paths-webpack-plugin: 2.4.0 core-js: 3.25.5 css-loader: 3.6.0_webpack@4.46.0 @@ -11847,34 +13930,34 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 - '@babel/register': 7.18.9_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.16.7_@babel+core@7.21.3 + '@babel/register': 7.18.9_@babel+core@7.21.3 '@storybook/node-logger': 6.4.19 '@storybook/semver': 7.3.2 '@types/node': 14.14.33 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 chalk: 4.1.2 core-js: 3.21.1 express: 4.18.1 @@ -11917,34 +14000,34 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 - '@babel/register': 7.18.9_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-decorators': 7.16.4_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@babel/preset-typescript': 7.16.7_@babel+core@7.21.3 + '@babel/register': 7.18.9_@babel+core@7.21.3 '@storybook/node-logger': 6.4.19 '@storybook/semver': 7.3.2 '@types/node': 14.14.33 '@types/pretty-hrtime': 1.0.1 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa babel-plugin-macros: 3.1.0 - babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.17.8 + babel-plugin-polyfill-corejs3: 0.1.7_@babel+core@7.21.3 chalk: 4.1.2 core-js: 3.21.1 express: 4.18.1 @@ -12542,13 +14625,13 @@ packages: /@storybook/csf-tools/6.4.19: resolution: {integrity: sha512-gf/zRhGoAVsFwSyV2tc+jeJfZQkxF6QsaZgbUSe24/IUvGFCT/PS/jZq1qy7dECAwrTOfykgu8juyBtj6WhWyw==} dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.19.3 - '@babel/parser': 7.19.3 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 '@mdx-js/mdx': 1.6.22 '@storybook/csf': 0.0.2--canary.87bc651.0 core-js: 3.25.5 @@ -12579,9 +14662,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 '@storybook/core-common': 6.4.19_mqzgkamhc7bbbitv65cxtf4gfa @@ -12590,7 +14673,7 @@ packages: '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@types/node': 14.14.33 '@types/webpack': 4.41.32 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.25.5 @@ -12640,9 +14723,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-client': 6.4.19_lb6j7tllhltqtas2n635xqdotu '@storybook/core-common': 6.4.19_56jbash75ng5psbctf36wqywr4 @@ -12651,7 +14734,7 @@ packages: '@storybook/ui': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@types/node': 14.14.33 '@types/webpack': 4.41.32 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.25.5 @@ -12701,9 +14784,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-client': 6.4.19_lb6j7tllhltqtas2n635xqdotu '@storybook/core-common': 6.4.19_56jbash75ng5psbctf36wqywr4 @@ -12712,7 +14795,7 @@ packages: '@storybook/ui': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@types/node': 14.14.33 '@types/webpack': 4.41.32 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.25.5 @@ -12762,9 +14845,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-client': 6.4.19_lb6j7tllhltqtas2n635xqdotu '@storybook/core-common': 6.4.19_mqzgkamhc7bbbitv65cxtf4gfa @@ -12773,7 +14856,7 @@ packages: '@storybook/ui': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@types/node': 14.14.33 '@types/webpack': 4.41.32 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.25.5 @@ -12823,9 +14906,9 @@ packages: typescript: optional: true dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m '@storybook/core-client': 6.4.19_4khy3msxr4lnrhwh6cbg2lwt64 '@storybook/core-common': 6.4.19_mqzgkamhc7bbbitv65cxtf4gfa @@ -12834,7 +14917,7 @@ packages: '@storybook/ui': 6.4.19_hiunvzosbwliizyirxfy6hjyim '@types/node': 14.14.33 '@types/webpack': 4.41.32 - babel-loader: 8.2.3_w4x3pzrj2omidyjy5w3nzug7xy + babel-loader: 8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa case-sensitive-paths-webpack-plugin: 2.4.0 chalk: 4.1.2 core-js: 3.25.5 @@ -12995,71 +15078,6 @@ packages: - supports-color dev: true - /@storybook/react/6.4.19_a55upwwpdj22rf6pemjk4qxjbi: - resolution: {integrity: sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - '@babel/core': ^7.11.5 - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - typescript: '*' - peerDependenciesMeta: - '@babel/core': - optional: true - typescript: - optional: true - dependencies: - '@babel/core': 7.17.8 - '@babel/preset-flow': 7.16.7_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.1_a3gyllrqvxpec3fpybsrposvju - '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@storybook/core': 6.4.19_4cb7vxhorbasgfyagprjvpaxzu - '@storybook/core-common': 6.4.19_56jbash75ng5psbctf36wqywr4 - '@storybook/csf': 0.0.2--canary.87bc651.0 - '@storybook/node-logger': 6.4.19 - '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.253f8c1.0_lasgyenclx45ngbljrbo537mpe - '@storybook/semver': 7.3.2 - '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m - '@types/webpack-env': 1.16.3 - babel-plugin-add-react-displayname: 0.0.5 - babel-plugin-named-asset-import: 0.3.8_@babel+core@7.17.8 - babel-plugin-react-docgen: 4.2.1 - core-js: 3.21.1 - global: 4.4.0 - lodash: 4.17.21 - prop-types: 15.8.1 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-refresh: 0.11.0 - read-pkg-up: 7.0.1 - regenerator-runtime: 0.13.9 - ts-dedent: 2.2.0 - typescript: 4.8.4 - webpack: 4.46.0 - transitivePeerDependencies: - - '@storybook/builder-webpack5' - - '@storybook/manager-webpack5' - - '@types/react' - - '@types/webpack' - - acorn - - bluebird - - bufferutil - - encoding - - eslint - - sockjs-client - - supports-color - - type-fest - - utf-8-validate - - vue-template-compiler - - webpack-cli - - webpack-command - - webpack-dev-server - - webpack-hot-middleware - - webpack-plugin-serve - dev: true - /@storybook/react/6.4.19_cqdgeqmmrux6joug3kc73q4l6m: resolution: {integrity: sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA==} engines: {node: '>=10.13.0'} @@ -13125,6 +15143,71 @@ packages: - webpack-plugin-serve dev: true + /@storybook/react/6.4.19_eyy24cwvfyikqccjc6kc5n6u7q: + resolution: {integrity: sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.11.5 + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + peerDependenciesMeta: + '@babel/core': + optional: true + typescript: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@babel/preset-flow': 7.16.7_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.1_a3gyllrqvxpec3fpybsrposvju + '@storybook/addons': 6.4.19_sfoxds7t5ydpegc3knd667wn6m + '@storybook/core': 6.4.19_4cb7vxhorbasgfyagprjvpaxzu + '@storybook/core-common': 6.4.19_56jbash75ng5psbctf36wqywr4 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/node-logger': 6.4.19 + '@storybook/react-docgen-typescript-plugin': 1.0.2-canary.253f8c1.0_lasgyenclx45ngbljrbo537mpe + '@storybook/semver': 7.3.2 + '@storybook/store': 6.4.19_sfoxds7t5ydpegc3knd667wn6m + '@types/webpack-env': 1.16.3 + babel-plugin-add-react-displayname: 0.0.5 + babel-plugin-named-asset-import: 0.3.8_@babel+core@7.21.3 + babel-plugin-react-docgen: 4.2.1 + core-js: 3.21.1 + global: 4.4.0 + lodash: 4.17.21 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + react-refresh: 0.11.0 + read-pkg-up: 7.0.1 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + typescript: 4.8.4 + webpack: 4.46.0 + transitivePeerDependencies: + - '@storybook/builder-webpack5' + - '@storybook/manager-webpack5' + - '@types/react' + - '@types/webpack' + - acorn + - bluebird + - bufferutil + - encoding + - eslint + - sockjs-client + - supports-color + - type-fest + - utf-8-validate + - vue-template-compiler + - webpack-cli + - webpack-command + - webpack-dev-server + - webpack-hot-middleware + - webpack-plugin-serve + dev: true + /@storybook/react/6.4.19_pjugpuchrb7ea5kuxwnxihy6zq: resolution: {integrity: sha512-5b3i8jkVrjQGmcxxxXwCduHPIh+cluWkfeweKeQOe+lW4BR8fuUICo3AMLrYPAtB/UcaJyYkIYmTvF2mkfepFA==} engines: {node: '>=10.13.0'} @@ -13373,7 +15456,7 @@ packages: postcss: '>=7.0.0' postcss-syntax: '>=0.36.2' dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 postcss: 7.0.39 postcss-syntax: 0.36.2_postcss@7.0.39 transitivePeerDependencies: @@ -13464,14 +15547,14 @@ packages: resolution: {integrity: sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==} engines: {node: '>=10'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 dev: true /@svgr/plugin-jsx/5.5.0: resolution: {integrity: sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@svgr/babel-preset': 5.5.0 '@svgr/hast-util-to-babel-ast': 5.5.0 svg-parser: 2.0.4 @@ -13492,10 +15575,10 @@ packages: resolution: {integrity: sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-react-constant-elements': 7.17.6_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-react': 7.16.7_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-constant-elements': 7.17.6_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-react': 7.16.7_@babel+core@7.21.3 '@svgr/core': 5.5.0 '@svgr/plugin-jsx': 5.5.0 '@svgr/plugin-svgo': 5.5.0 @@ -13602,6 +15685,20 @@ packages: react-error-boundary: 3.1.4_react@17.0.2 dev: true + /@testing-library/react/12.1.4_6l5554ty5ajsajah6yazvrjhoe: + resolution: {integrity: sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==} + engines: {node: '>=12'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.19.0 + '@testing-library/dom': 8.11.3 + '@types/react-dom': 17.0.17 + react: 17.0.2 + react-dom: 18.2.0_react@17.0.2 + dev: false + /@testing-library/react/12.1.4_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==} engines: {node: '>=12'} @@ -13614,6 +15711,7 @@ packages: '@types/react-dom': 17.0.17 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: true /@testing-library/user-event/13.5.0_gzufz4q333be4gqfrvipwvqt6a: resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} @@ -13661,8 +15759,8 @@ packages: /@types/babel__core/7.1.16: resolution: {integrity: sha512-EAEHtisTMM+KaKwfWdC3oyllIqswlznXCIVCt7/oRNrh+DhgT4UEBNC/jlADNjvw7UnfbcdkGQcPVZ1xYiLcrQ==} dependencies: - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 '@types/babel__generator': 7.6.3 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.14.2 @@ -13670,18 +15768,18 @@ packages: /@types/babel__generator/7.6.3: resolution: {integrity: sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 /@types/babel__traverse/7.14.2: resolution: {integrity: sha512-K2waXdXBi2302XUdcHcR1jCeU0LL4TD9HRs/gk0N2Xvrht+G/BfJa4QObBQZfhMdxiCpV3COl5Nfq4uKTeTnJA==} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@types/body-parser/1.19.2: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} @@ -14245,7 +16343,7 @@ packages: '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__data': 6.0.2 '@types/wordpress__keycodes': 2.3.1 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react @@ -14259,7 +16357,7 @@ packages: dependencies: '@types/react': 17.0.50 '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -14271,7 +16369,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_prpqlkd37azqwypxturxi7uyci transitivePeerDependencies: @@ -14286,7 +16384,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: @@ -14349,7 +16447,7 @@ packages: dependencies: '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__core-data': 2.4.5 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -15128,8 +17226,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/dom-ready': 3.6.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/dom-ready': 3.28.0 + '@wordpress/i18n': 4.28.0 dev: false /@wordpress/api-fetch/3.23.1_react-native@0.70.0: @@ -15157,8 +17255,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 dev: true /@wordpress/api-fetch/6.25.0: @@ -15174,8 +17272,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 dev: false /@wordpress/autop/3.19.0: @@ -15200,13 +17298,13 @@ packages: '@babel/runtime': 7.17.7 dev: true - /@wordpress/babel-plugin-import-jsx-pragma/2.7.0_@babel+core@7.17.8: + /@wordpress/babel-plugin-import-jsx-pragma/2.7.0_@babel+core@7.21.3: resolution: {integrity: sha512-yR+rSyfHKfevW84vKBOERpjEslD/o00CaYMftywVYOjsOQ8GLS6xv/VgDcpQ8JomJ9eRRInLRpeGKTM3lOa4xQ==} engines: {node: '>=8'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 dev: true /@wordpress/babel-plugin-import-jsx-pragma/3.1.0_@babel+core@7.12.9: @@ -15227,31 +17325,31 @@ packages: '@babel/core': 7.16.12 dev: false - /@wordpress/babel-plugin-import-jsx-pragma/3.1.2_@babel+core@7.17.8: + /@wordpress/babel-plugin-import-jsx-pragma/3.1.2_@babel+core@7.21.3: resolution: {integrity: sha512-oMJnM3cJlu1hQMO4XmTFDhNPclj0cLRIeV5Y6uIF/9oNhhSfaMFu+ty0B4zBYodqwes/vbndwRg4j2q2bhG/Dg==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.12.9 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 dev: true - /@wordpress/babel-plugin-import-jsx-pragma/3.2.0_@babel+core@7.17.8: + /@wordpress/babel-plugin-import-jsx-pragma/3.2.0_@babel+core@7.21.3: resolution: {integrity: sha512-XK3Sdpi9MWoy5qPHnRroY/ypX0VtT5yI5809u5As1P/3k4vlXNw8USH4lJ+rkurAOVqqN5mFlf2XAL9AkpfXyg==} engines: {node: '>=12'} peerDependencies: '@babel/core': ^7.12.9 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 dev: true - /@wordpress/babel-plugin-import-jsx-pragma/4.11.0_@babel+core@7.17.8: + /@wordpress/babel-plugin-import-jsx-pragma/4.11.0_@babel+core@7.21.3: resolution: {integrity: sha512-yOK+vnuL9vm5GFwKyQ4SnMfcNBPHN21HeSPEFA7bB+pLT4xwgvdN7CVEYfvoRZbtZna/fMJgBqhhdEKXjlxViw==} engines: {node: '>=14'} peerDependencies: '@babel/core': ^7.12.9 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 dev: false /@wordpress/babel-preset-default/3.0.2_@babel+core@7.12.9: @@ -15277,12 +17375,12 @@ packages: resolution: {integrity: sha512-VKPoC5We2GNxon5umOeZ7NIP4CfP7X5gqslSnNrLW4kD1XgmbVaCs2ISFF8+mObVVb6KAzbaUjI6OWljcUb5UA==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.8 - '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.21.3 + '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 '@babel/runtime': 7.19.0 - '@wordpress/babel-plugin-import-jsx-pragma': 2.7.0_@babel+core@7.17.8 + '@wordpress/babel-plugin-import-jsx-pragma': 2.7.0_@babel+core@7.21.3 '@wordpress/browserslist-config': 2.7.0 '@wordpress/element': 2.20.3 '@wordpress/warning': 1.4.2 @@ -15295,13 +17393,13 @@ packages: resolution: {integrity: sha512-mBB1KHWT2vN+maKIPYLQSxhhAzW6CNwYiJNRSNaNBALie9TULe7etrnwoZ1eqPVsuYvBlXB4XKcPaSm3/FW+qQ==} engines: {node: '>=12'} dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-runtime': 7.19.1_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-runtime': 7.19.1_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@babel/runtime': 7.19.0 - '@wordpress/babel-plugin-import-jsx-pragma': 3.2.0_@babel+core@7.17.8 + '@wordpress/babel-plugin-import-jsx-pragma': 3.2.0_@babel+core@7.21.3 '@wordpress/browserslist-config': 4.1.3 '@wordpress/element': 4.20.0 '@wordpress/warning': 2.28.0 @@ -15323,7 +17421,7 @@ packages: '@babel/runtime': 7.17.7 '@wordpress/babel-plugin-import-jsx-pragma': 3.1.0_@babel+core@7.16.12 '@wordpress/browserslist-config': 4.1.3 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 '@wordpress/warning': 2.2.2 browserslist: 4.19.3 core-js: 3.21.1 @@ -15335,16 +17433,16 @@ packages: resolution: {integrity: sha512-eqw6u6ndjbseWOQju9TpnXho6eimtGMlfRwPv1kO3yHV7EXDRw0p5MRMmoN29+lSG1b3MtSj6k9XwYNW0YF/qw==} engines: {node: '>=12'} dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.17.8 - '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.17.8 - '@babel/preset-env': 7.16.11_@babel+core@7.17.8 - '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 - '@babel/runtime': 7.17.7 - '@wordpress/babel-plugin-import-jsx-pragma': 3.1.2_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.17.3_@babel+core@7.21.3 + '@babel/plugin-transform-runtime': 7.16.4_@babel+core@7.21.3 + '@babel/preset-env': 7.16.11_@babel+core@7.21.3 + '@babel/preset-typescript': 7.16.7_@babel+core@7.21.3 + '@babel/runtime': 7.19.0 + '@wordpress/babel-plugin-import-jsx-pragma': 3.1.2_@babel+core@7.21.3 '@wordpress/browserslist-config': 4.1.3 - '@wordpress/element': 4.4.1 - '@wordpress/warning': 2.6.1 + '@wordpress/element': 4.20.0 + '@wordpress/warning': 2.28.0 browserslist: 4.20.2 core-js: 3.21.1 transitivePeerDependencies: @@ -15355,13 +17453,13 @@ packages: resolution: {integrity: sha512-nMTVxJAfNTT8fOJfmcFgM1424wyzj/B00J1ulQG3QGYCLCqmXFmfevYepoElEDQrafFNTgvWfUYZs6oTVMrAZQ==} engines: {node: '>=14'} dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-runtime': 7.19.1_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 - '@babel/preset-typescript': 7.18.6_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-runtime': 7.19.1_@babel+core@7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 + '@babel/preset-typescript': 7.18.6_@babel+core@7.21.3 '@babel/runtime': 7.19.0 - '@wordpress/babel-plugin-import-jsx-pragma': 4.11.0_@babel+core@7.17.8 + '@wordpress/babel-plugin-import-jsx-pragma': 4.11.0_@babel+core@7.21.3 '@wordpress/browserslist-config': 5.11.0 '@wordpress/element': 5.5.0 '@wordpress/warning': 2.28.0 @@ -15394,6 +17492,64 @@ packages: dependencies: '@babel/runtime': 7.19.0 + /@wordpress/block-editor/10.2.0_mtk4wljkd5jimhszw4p7nnxuzm: + resolution: {integrity: sha512-9Bxq9hY3WEqodn/K/WSE+PoIwv6jKkKBP0pxXFJTWV1yc8/Np9QHV/7wG7qjztxxgu00FrYF7u8OZyvjPrSNYw==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@react-spring/web': 9.5.5_sfoxds7t5ydpegc3knd667wn6m + '@wordpress/a11y': 3.28.0 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/blob': 3.28.0 + '@wordpress/blocks': 11.18.0_react@17.0.2 + '@wordpress/components': 21.2.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 7.3.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 9.19.0 + '@wordpress/is-shallow-equal': 4.28.0 + '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 + '@wordpress/keycodes': 3.28.0 + '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/shortcode': 3.28.0 + '@wordpress/style-engine': 1.2.0 + '@wordpress/token-list': 2.28.0 + '@wordpress/url': 3.29.0 + '@wordpress/warning': 2.28.0 + '@wordpress/wordcount': 3.28.0 + classnames: 2.3.1 + colord: 2.9.2 + diff: 4.0.2 + dom-scroll-into-view: 1.2.1 + inherits: 2.0.4 + lodash: 4.17.21 + react: 17.0.2 + react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + react-easy-crop: 4.5.1_sfoxds7t5ydpegc3knd667wn6m + rememo: 4.0.0 + remove-accents: 0.4.2 + traverse: 0.6.6 + transitivePeerDependencies: + - '@babel/core' + - '@babel/helper-module-imports' + - '@babel/types' + - '@types/react' + - aslemammad-vite-plugin-macro + - babel-plugin-macros + - vite + dev: false + /@wordpress/block-editor/10.2.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-9Bxq9hY3WEqodn/K/WSE+PoIwv6jKkKBP0pxXFJTWV1yc8/Np9QHV/7wG7qjztxxgu00FrYF7u8OZyvjPrSNYw==} engines: {node: '>=12'} @@ -15452,7 +17608,7 @@ packages: - vite dev: false - /@wordpress/block-editor/8.6.0_tufdcic6wklrwyy3rhbsbktylu: + /@wordpress/block-editor/8.6.0_eqi5qhcxfphl6j3pngzexvnehi: resolution: {integrity: sha512-Low88BcV7pUSULNytPbO8KWrrMnQA7FnbYW1UOj+GJt+zsYqIleYZccjI5DoFTsXAAKn8RYPytX0i6F6jDM6XQ==} engines: {node: '>=12'} peerDependencies: @@ -15465,7 +17621,7 @@ packages: '@wordpress/api-fetch': 6.25.0 '@wordpress/blob': 3.28.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/components': 19.12.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/date': 4.28.0 @@ -15505,6 +17661,60 @@ packages: - react-with-direction dev: false + /@wordpress/block-editor/9.8.0_mtk4wljkd5jimhszw4p7nnxuzm: + resolution: {integrity: sha512-zIPqEysaLFJMnVKU/yCoCEBT3Co9xsa4Ow91T/LI94ll3LeWG/pyiX4PSSQNTx74AqbcNO2p79LVON4FLdu+mQ==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@react-spring/web': 9.5.5_sfoxds7t5ydpegc3knd667wn6m + '@wordpress/a11y': 3.28.0 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/blob': 3.19.0 + '@wordpress/blocks': 11.18.0_react@17.0.2 + '@wordpress/components': 20.0.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 7.3.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 9.19.0 + '@wordpress/is-shallow-equal': 4.19.0 + '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 + '@wordpress/keycodes': 3.28.0 + '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/shortcode': 3.19.0 + '@wordpress/style-engine': 0.15.0 + '@wordpress/token-list': 2.19.0 + '@wordpress/url': 3.29.0 + '@wordpress/warning': 2.28.0 + '@wordpress/wordcount': 3.19.0 + change-case: 4.1.2 + classnames: 2.3.1 + colord: 2.9.2 + diff: 4.0.2 + dom-scroll-into-view: 1.2.1 + inherits: 2.0.4 + lodash: 4.17.21 + react: 17.0.2 + react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + react-easy-crop: 3.5.3_sfoxds7t5ydpegc3knd667wn6m + rememo: 4.0.0 + remove-accents: 0.4.2 + traverse: 0.6.6 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + dev: false + /@wordpress/block-editor/9.8.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-zIPqEysaLFJMnVKU/yCoCEBT3Co9xsa4Ow91T/LI94ll3LeWG/pyiX4PSSQNTx74AqbcNO2p79LVON4FLdu+mQ==} engines: {node: '>=12'} @@ -15532,7 +17742,7 @@ packages: '@wordpress/is-shallow-equal': 4.19.0 '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 '@wordpress/keycodes': 3.28.0 - '@wordpress/notices': 3.19.0_react@17.0.2 + '@wordpress/notices': 3.28.0_react@17.0.2 '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/shortcode': 3.19.0 '@wordpress/style-engine': 0.15.0 @@ -15585,7 +17795,7 @@ packages: '@wordpress/i18n': 4.28.0 '@wordpress/icons': 9.19.0 '@wordpress/keycodes': 3.28.0 - '@wordpress/notices': 3.19.0_react@17.0.2 + '@wordpress/notices': 3.28.0_react@17.0.2 '@wordpress/primitives': 3.17.0 '@wordpress/reusable-blocks': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi '@wordpress/rich-text': 5.17.0_react@17.0.2 @@ -15701,6 +17911,60 @@ packages: engines: {node: '>=14'} dev: false + /@wordpress/components/19.12.0_eqi5qhcxfphl6j3pngzexvnehi: + resolution: {integrity: sha512-Ac1+aIMM7NDgN3G7i5kcaETSvZfeqB4U6PubApPmM6FdBF5VfkYUZeqNcC7cuJdveyokRrqHg11/l+DcJGA7/g==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@emotion/cache': 11.10.5 + '@emotion/css': 11.7.1_@babel+core@7.21.3 + '@emotion/react': 11.10.5_zg7wlf5auq2m3ro2gp4uufjvme + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_6t3indjc5ssefvr44gr3wo2uqu + '@emotion/utils': 1.0.0 + '@floating-ui/react-dom': 0.6.3_hiunvzosbwliizyirxfy6hjyim + '@use-gesture/react': 10.2.10_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/escape-html': 2.28.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 9.19.0 + '@wordpress/is-shallow-equal': 4.28.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 + classnames: 2.3.1 + colord: 2.9.2 + dom-scroll-into-view: 1.2.1 + downshift: 6.1.12_react@17.0.2 + framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m + gradient-parser: 0.1.5 + highlight-words-core: 1.2.2 + lodash: 4.17.21 + memize: 1.1.0 + moment: 2.29.4 + re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m + react: 17.0.2 + react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m + react-dates: 21.8.0_nquzpvbbca3w4vywjbffgfreli + react-dom: 17.0.2_react@17.0.2 + reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m + uuid: 8.3.2 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - react-with-direction + dev: false + /@wordpress/components/19.12.0_tufdcic6wklrwyy3rhbsbktylu: resolution: {integrity: sha512-Ac1+aIMM7NDgN3G7i5kcaETSvZfeqB4U6PubApPmM6FdBF5VfkYUZeqNcC7cuJdveyokRrqHg11/l+DcJGA7/g==} engines: {node: '>=12'} @@ -15770,20 +18034,20 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.4.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/keycodes': 3.28.0 '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/warning': 2.6.1 classnames: 2.3.1 colord: 2.9.2 @@ -15809,6 +18073,60 @@ packages: - react-with-direction dev: false + /@wordpress/components/19.8.5_eqi5qhcxfphl6j3pngzexvnehi: + resolution: {integrity: sha512-36d8fSk/nWfNv2nEZrC2gLx1rN9rGWFt425yXoH6JiakDvdXacN/04xcxZGBRkS+JDz6v22uyPMEol9TzwXOLg==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@emotion/cache': 11.10.5 + '@emotion/css': 11.7.1_@babel+core@7.21.3 + '@emotion/react': 11.10.5_zg7wlf5auq2m3ro2gp4uufjvme + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_6t3indjc5ssefvr44gr3wo2uqu + '@emotion/utils': 1.0.0 + '@use-gesture/react': 10.2.10_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/escape-html': 2.28.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 + '@wordpress/is-shallow-equal': 4.28.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 + classnames: 2.3.1 + colord: 2.9.2 + dom-scroll-into-view: 1.2.1 + downshift: 6.1.12_react@17.0.2 + framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m + gradient-parser: 0.1.5 + highlight-words-core: 1.2.2 + lodash: 4.17.21 + memize: 1.1.0 + moment: 2.29.4 + re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m + react: 17.0.2 + react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m + react-dates: 17.2.0_mbqv3i57zshgl3mhyvv367ttdu + react-dom: 17.0.2_react@17.0.2 + react-resize-aware: 3.1.1_react@17.0.2 + reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m + uuid: 8.3.2 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + - react-with-direction + dev: false + /@wordpress/components/19.8.5_ivjkhzvx5dt6opkkf6frl2zoam: resolution: {integrity: sha512-36d8fSk/nWfNv2nEZrC2gLx1rN9rGWFt425yXoH6JiakDvdXacN/04xcxZGBRkS+JDz6v22uyPMEol9TzwXOLg==} engines: {node: '>=12'} @@ -15824,21 +18142,21 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -15878,21 +18196,21 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -15932,21 +18250,21 @@ packages: '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -15971,6 +18289,61 @@ packages: - react-with-direction dev: false + /@wordpress/components/20.0.0_mtk4wljkd5jimhszw4p7nnxuzm: + resolution: {integrity: sha512-RBPjtGLSoiV5YKhrBYh+/X8LbzbA99BJaB4Q+P0e1rVOwGzeBF3M7YEjmg1PrrzWaItqJZTvDoyZo+ql7c0KfA==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@emotion/cache': 11.10.5 + '@emotion/css': 11.7.1_@babel+core@7.21.3 + '@emotion/react': 11.10.5_zg7wlf5auq2m3ro2gp4uufjvme + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_6t3indjc5ssefvr44gr3wo2uqu + '@emotion/utils': 1.2.0 + '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m + '@use-gesture/react': 10.2.10_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/escape-html': 2.28.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 9.19.0 + '@wordpress/is-shallow-equal': 4.28.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 + change-case: 4.1.2 + classnames: 2.3.1 + colord: 2.9.2 + date-fns: 2.29.3 + dom-scroll-into-view: 1.2.1 + downshift: 6.1.12_react@17.0.2 + framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m + gradient-parser: 0.1.5 + highlight-words-core: 1.2.2 + lodash: 4.17.21 + memize: 1.1.0 + re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m + react: 17.0.2 + react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m + remove-accents: 0.4.2 + use-lilius: 2.0.3_sfoxds7t5ydpegc3knd667wn6m + uuid: 8.3.2 + transitivePeerDependencies: + - '@babel/core' + - '@types/react' + dev: false + /@wordpress/components/20.0.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-RBPjtGLSoiV5YKhrBYh+/X8LbzbA99BJaB4Q+P0e1rVOwGzeBF3M7YEjmg1PrrzWaItqJZTvDoyZo+ql7c0KfA==} engines: {node: '>=12'} @@ -16025,6 +18398,67 @@ packages: - '@babel/core' - '@types/react' + /@wordpress/components/21.2.0_mtk4wljkd5jimhszw4p7nnxuzm: + resolution: {integrity: sha512-pYz+EY+Tv/O2JuDBXpaFH/zv9Evty/e6NOGjOzddSeaShZ/mCq2DpUSWPuTFBEAjtv6h9HnpkakbNnEeio5yNA==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@emotion/cache': 11.10.5 + '@emotion/css': 11.7.1_@babel+core@7.21.3 + '@emotion/react': 11.10.5_zg7wlf5auq2m3ro2gp4uufjvme + '@emotion/serialize': 1.1.1 + '@emotion/styled': 11.8.1_6t3indjc5ssefvr44gr3wo2uqu + '@emotion/utils': 1.2.0 + '@floating-ui/react-dom': 1.0.0_sfoxds7t5ydpegc3knd667wn6m + '@use-gesture/react': 10.2.10_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/escape-html': 2.28.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 9.19.0 + '@wordpress/is-shallow-equal': 4.28.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 + change-case: 4.1.2 + classnames: 2.3.1 + colord: 2.9.2 + date-fns: 2.29.3 + dom-scroll-into-view: 1.2.1 + downshift: 6.1.12_react@17.0.2 + framer-motion: 6.2.8_sfoxds7t5ydpegc3knd667wn6m + gradient-parser: 0.1.5 + highlight-words-core: 1.2.2 + lodash: 4.17.21 + memize: 1.1.0 + re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m + react: 17.0.2 + react-colorful: 5.5.1_sfoxds7t5ydpegc3knd667wn6m + react-dom: 17.0.2_react@17.0.2 + reakit: 1.3.11_sfoxds7t5ydpegc3knd667wn6m + remove-accents: 0.4.2 + use-lilius: 2.0.3_sfoxds7t5ydpegc3knd667wn6m + uuid: 8.3.2 + valtio: 1.7.2_react@17.0.2 + transitivePeerDependencies: + - '@babel/core' + - '@babel/helper-module-imports' + - '@babel/types' + - '@types/react' + - aslemammad-vite-plugin-macro + - babel-plugin-macros + - vite + dev: false + /@wordpress/components/21.2.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-pYz+EY+Tv/O2JuDBXpaFH/zv9Evty/e6NOGjOzddSeaShZ/mCq2DpUSWPuTFBEAjtv6h9HnpkakbNnEeio5yNA==} engines: {node: '>=12'} @@ -16134,11 +18568,11 @@ packages: '@babel/runtime': 7.19.0 '@types/lodash': 4.14.184 '@types/mousetrap': 1.6.9 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 + '@wordpress/keycodes': 3.28.0 '@wordpress/priority-queue': 2.28.0 clipboard: 2.0.10 lodash: 4.17.21 @@ -16146,6 +18580,7 @@ packages: react: 17.0.2 react-resize-aware: 3.1.1_react@17.0.2 use-memo-one: 1.1.2_react@17.0.2 + dev: false /@wordpress/compose/6.5.0_react@17.0.2: resolution: {integrity: sha512-gtZwEeFFHGltsr0vqwyrxPbAcA6lVfE36s59mZBh9KHeC/s590q2FPQz+9jSE5Y+uQmnXZCtahCrjvnpnaBIUg==} @@ -16166,7 +18601,6 @@ packages: mousetrap: 1.6.5 react: 17.0.2 use-memo-one: 1.1.2_react@17.0.2 - dev: false /@wordpress/core-data/4.4.5_react@17.0.2: resolution: {integrity: sha512-vhMbz/Q3xEMWTSFMs0D6n93qFSOhUZr/EgtRhLGRHdjskfgegFTlx13HrhDZ+U3xzkv1b8mH1klk4aZX+f0B8Q==} @@ -16175,15 +18609,15 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/api-fetch': 6.25.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/html-entities': 3.6.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/url': 3.7.1 + '@wordpress/url': 3.29.0 equivalent-key-map: 0.2.2 lodash: 4.17.21 memize: 1.1.0 @@ -16260,9 +18694,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 react: 17.0.2 dev: false @@ -16317,9 +18751,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.28.0 '@wordpress/priority-queue': 2.28.0 '@wordpress/redux-routine': 4.28.0_redux@4.2.0 @@ -16375,7 +18809,6 @@ packages: redux: 4.2.0 turbo-combine-reducers: 1.0.2 use-memo-one: 1.1.2_react@17.0.2 - dev: false /@wordpress/date/4.28.0: resolution: {integrity: sha512-NtKVryepjrYIKS1gRubCtJhcT++3KtiHuf9w1nNWnbY0Onk0pMQUXkZyVL2Bk1EZ3ylUx6S6k/TLOv0QVPxgzA==} @@ -16433,7 +18866,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 + dev: false /@wordpress/dom-ready/3.28.0: resolution: {integrity: sha512-PFFAnuPUouV0uSDZN6G/B8yksybtxzS/6H53OZJEA3h3EsNCicKRMGSowkumvLwXA23HV0K2Kht6JuS+bDECzA==} @@ -16467,6 +18901,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 lodash: 4.17.21 + dev: false /@wordpress/e2e-test-utils/3.0.0_ddjhsfu4aotkh3cuzmpsln6ywq: resolution: {integrity: sha512-XMdR8DeKyDQRF5jKeUlOzP4pTRtoJuOLsNZRLUFUvnrs9y/7/hH17VmPbWp3TJGvV/eGKzO4+D+wJTsP9nJmIw==} @@ -16513,9 +18948,9 @@ packages: puppeteer-core: '>=11' dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/keycodes': 3.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/url': 3.29.0 form-data: 4.0.0 jest: 27.5.1 lodash: 4.17.21 @@ -16525,7 +18960,7 @@ packages: - encoding dev: false - /@wordpress/editor/12.5.10_tufdcic6wklrwyy3rhbsbktylu: + /@wordpress/editor/12.5.10_eqi5qhcxfphl6j3pngzexvnehi: resolution: {integrity: sha512-FEgNLDRAtOjGrXXNUXWucf3zMfM1rWCgc/eQrJFwj0atWGJmqQERvmF4H4jeUO6gqetOHmnko38fLVAnE7QWYw==} engines: {node: '>=12'} peerDependencies: @@ -16533,30 +18968,30 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/block-editor': 8.6.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/a11y': 3.28.0 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/block-editor': 8.6.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu - '@wordpress/compose': 5.4.1_react@17.0.2 + '@wordpress/components': 19.12.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/core-data': 4.4.5_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/html-entities': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 - '@wordpress/keyboard-shortcuts': 3.4.1_react@17.0.2 - '@wordpress/keycodes': 3.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 + '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 + '@wordpress/keycodes': 3.28.0 '@wordpress/media-utils': 3.4.1 - '@wordpress/notices': 3.6.1_react@17.0.2 - '@wordpress/preferences': 1.3.0_tufdcic6wklrwyy3rhbsbktylu - '@wordpress/reusable-blocks': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/server-side-render': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi - '@wordpress/url': 3.7.1 + '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/reusable-blocks': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/server-side-render': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/url': 3.29.0 '@wordpress/wordcount': 3.28.0 classnames: 2.3.1 lodash: 4.17.21 @@ -16624,6 +19059,7 @@ packages: lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: false /@wordpress/element/4.8.0: resolution: {integrity: sha512-f2Mb70xvGxZWNWh5pFhOoRgrd+tKs9Xk9hpDgRB7iPel/zbAIxNebr0Jqm5Nt+MDiDl/dogTPc9GyrkYCm9u0g==} @@ -16804,7 +19240,7 @@ packages: - typescript dev: true - /@wordpress/eslint-plugin/9.3.0_gvdiv7jt74qfcmw4bmvrh4kane: + /@wordpress/eslint-plugin/9.3.0_3xe5tjvuvwwvrozjb6pk7ussfi: resolution: {integrity: sha512-9F7B60gHAjiTIi9vBw5ZoH0MZW3UnmbuKols4kWpJVdgsvG4X1Wj6XXTLmQKrzh/Em7mD1CCIbCSyWknEzIOLw==} engines: {node: '>=12', npm: '>=6.9'} peerDependencies: @@ -16814,7 +19250,7 @@ packages: typescript: optional: true dependencies: - '@babel/eslint-parser': 7.17.0_xujkgafwcpm5gwokncqwvv5ure + '@babel/eslint-parser': 7.17.0_xrfyhdkbwxl52yb52lr5ltkqvm '@typescript-eslint/eslint-plugin': 4.33.0_k4l66av2tbo6kxzw52jzgbfzii '@typescript-eslint/parser': 4.33.0_yygwinqv3a2io74xmwofqb7uka '@wordpress/prettier-config': 1.1.3 @@ -16855,6 +19291,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 + dev: false /@wordpress/html-entities/3.28.0: resolution: {integrity: sha512-UAaU6au8UTrSkowkV33pE/EvdPov2mA9W51vh6t88KsJPzt4171EzIchGnQuzt04HuZLdLyWy2A+7JCOSbfhBA==} @@ -16899,7 +19336,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.17.7 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 @@ -16913,19 +19350,20 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.19.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 sprintf-js: 1.1.2 tannin: 1.2.0 + dev: false /@wordpress/icons/8.1.0: resolution: {integrity: sha512-fNq0Mnzzf03uxIwKqQeU/G48wElyypwkhcBZWYQRpmwLZrOR231dxUeK9mzPOSGlYbgM+YKK+k3lzysGmrJU0A==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.4.1 dev: false @@ -16934,8 +19372,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.4.1 - '@wordpress/primitives': 3.4.1 + '@wordpress/element': 4.20.0 + '@wordpress/primitives': 3.26.0 dev: false /@wordpress/icons/8.4.0: @@ -16955,7 +19393,7 @@ packages: '@wordpress/element': 5.5.0 '@wordpress/primitives': 3.26.0 - /@wordpress/interface/4.5.6_tufdcic6wklrwyy3rhbsbktylu: + /@wordpress/interface/4.5.6_eqi5qhcxfphl6j3pngzexvnehi: resolution: {integrity: sha512-Sige1gYGJOvD7UvKIUA4VCezFOxr157NCSQXn8/x2krjKybJzemI07ZJcTApawEYW0gutZbBizoUzaR8YLiiVA==} engines: {node: '>=12'} peerDependencies: @@ -16963,17 +19401,17 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/components': 19.8.5_tufdcic6wklrwyy3rhbsbktylu - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/a11y': 3.28.0 + '@wordpress/components': 19.12.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/plugins': 4.4.3_react@17.0.2 - '@wordpress/preferences': 1.3.0_tufdcic6wklrwyy3rhbsbktylu - '@wordpress/viewport': 4.4.1_react@17.0.2 + '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/viewport': 4.17.0_react@17.0.2 classnames: 2.3.1 lodash: 4.17.21 react: 17.0.2 @@ -17075,7 +19513,7 @@ packages: - supports-color dev: true - /@wordpress/jest-preset-default/7.1.3_3kt4xu3sgkhoqdvxwcvxppk7nm: + /@wordpress/jest-preset-default/7.1.3_32bilwwi7li3aoepmefcbmhmcy: resolution: {integrity: sha512-rz9V/YRr3TjLdZJQu7DAZHo848PpZ4N5ThtP4Lujy1O/UtcvtKF0r34SZTNDlFQO/G1USZQX/WL6HRhgl57iHA==} engines: {node: '>=12'} peerDependencies: @@ -17083,7 +19521,7 @@ packages: dependencies: '@wojtekmaj/enzyme-adapter-react-17': 0.6.6_7ltvq4e2railvf5uya4ffxpe2a '@wordpress/jest-console': 4.1.1_jest@26.6.3 - babel-jest: 26.6.3_@babel+core@7.17.8 + babel-jest: 26.6.3_@babel+core@7.21.3 enzyme: 3.11.0 enzyme-to-json: 3.6.2_enzyme@3.11.0 jest: 26.6.3 @@ -17155,9 +19593,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/element': 4.4.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/keycodes': 3.28.0 lodash: 4.17.21 react: 17.0.2 rememo: 3.0.0 @@ -17183,7 +19621,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.17.7 - '@wordpress/i18n': 4.6.1 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 dev: false @@ -17192,32 +19630,22 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/i18n': 4.6.1 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 + dev: false /@wordpress/media-utils/3.4.1: resolution: {integrity: sha512-WNAaMqqw6Eqy61KTWBy1NlgXSZH82Cm2SPVbz0v6yhJ4ktJmSRFm7Fd4mTMFS/L7NKTxwo+DFqEHlTGKj3lyzQ==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/api-fetch': 6.25.0 '@wordpress/blob': 3.28.0 - '@wordpress/element': 4.4.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 dev: false - /@wordpress/notices/3.19.0_react@17.0.2: - resolution: {integrity: sha512-NXL5fpfUHPYd1AA9mq0e5xubBzRg1KblR0hXpzV7GBWf2ohM/417HJkBfbzC3HLONMkmuoWR0T9WexYP26qQqw==} - engines: {node: '>=12'} - peerDependencies: - react: ^17.0.0 - dependencies: - '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.28.0 - '@wordpress/data': 7.3.0_react@17.0.2 - react: 17.0.2 - /@wordpress/notices/3.28.0_react@17.0.2: resolution: {integrity: sha512-XftApWHyLlf2vq6FLYiqACoG4CxDsRqc6zQSjOA5UHQooVPbSsbYXl4eadloPtMnJohlzjzvb0SEIafjMyxjCA==} engines: {node: '>=12'} @@ -17227,7 +19655,6 @@ packages: '@wordpress/data': 8.5.0_react@17.0.2 transitivePeerDependencies: - react - dev: false /@wordpress/notices/3.6.1_react@17.0.2: resolution: {integrity: sha512-S+hOO+4NJJzaqcqm+XPa6uuvt/pkYjRz20HK3xt8Srb+HjO87D3X5feYGQMxEx5ueJl72+5/uOZwmXKJR4pzog==} @@ -17236,8 +19663,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -17267,10 +19694,10 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/icons': 8.4.0 lodash: 4.17.21 memize: 1.1.0 react: 17.0.2 @@ -17303,7 +19730,7 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - '@wordpress/base-styles': 4.3.1 + '@wordpress/base-styles': 4.8.0 autoprefixer: 10.4.4_postcss@8.4.12 postcss: 8.4.12 dev: false @@ -17311,7 +19738,7 @@ packages: /@wordpress/postcss-themes/1.0.5: resolution: {integrity: sha512-Oig71+VQG3UxLadd98oWMQfIqWrVY+G375/yKCHRklwEIZhKtAeK7qZlL1dEjdGPGvPXFeggB7KG5SGyrmdOZA==} dependencies: - '@babel/runtime': 7.17.7 + '@babel/runtime': 7.19.0 autoprefixer: 8.6.5 postcss: 6.0.23 postcss-color-function: 4.1.0 @@ -17326,7 +19753,7 @@ packages: postcss: 7.0.39 dev: true - /@wordpress/preferences/1.3.0_tufdcic6wklrwyy3rhbsbktylu: + /@wordpress/preferences/1.3.0_eqi5qhcxfphl6j3pngzexvnehi: resolution: {integrity: sha512-2ACfz6LkQY2oAcEgTVpkfpasywo/nSmN5jbpT2gNoF/W/RCFBso+VDyuLsfpJ1INbbq+6pPKLccLBWYAvwuFdA==} engines: {node: '>=12'} peerDependencies: @@ -17335,7 +19762,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 '@wordpress/a11y': 3.28.0 - '@wordpress/components': 19.12.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/components': 19.12.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/data': 6.15.0_react@17.0.2 '@wordpress/i18n': 4.28.0 '@wordpress/icons': 8.4.0 @@ -17403,7 +19830,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 classnames: 2.3.1 dev: false @@ -17433,7 +19860,6 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.19.0 - dev: false /@wordpress/react-i18n/3.8.0: resolution: {integrity: sha512-5jg7DY05jCWfzCZRt+VCT4cKn6mCZwQhQlJIApcuzUGT51tlLk/BwyxBMfnn5ZT5IVSp9YxedExycohNPXEPjg==} @@ -17466,6 +19892,35 @@ packages: redux: 4.2.0 rungen: 0.3.2 + /@wordpress/reusable-blocks/3.17.0_mtk4wljkd5jimhszw4p7nnxuzm: + resolution: {integrity: sha512-7ZfhtpWGvtT7xWqY/mCwC93zFHTVPQf8SZRjy2jAhcl7RNY6KZpW82rMRKNROEKJ4cYbTOMMf7WL2ulYi6cNFw==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@wordpress/block-editor': 10.2.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/blocks': 11.18.0_react@17.0.2 + '@wordpress/components': 21.2.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/core-data': 5.2.0_react@17.0.2 + '@wordpress/data': 7.3.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 9.19.0 + '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/url': 3.29.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + transitivePeerDependencies: + - '@babel/core' + - '@babel/helper-module-imports' + - '@babel/types' + - '@types/react' + - aslemammad-vite-plugin-macro + - babel-plugin-macros + - vite + dev: false + /@wordpress/reusable-blocks/3.17.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-7ZfhtpWGvtT7xWqY/mCwC93zFHTVPQf8SZRjy2jAhcl7RNY6KZpW82rMRKNROEKJ4cYbTOMMf7WL2ulYi6cNFw==} engines: {node: '>=12'} @@ -17521,13 +19976,13 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/keycodes': 3.28.0 lodash: 4.17.21 memize: 1.1.0 react: 17.0.2 @@ -17600,7 +20055,7 @@ packages: - webpack-command dev: true - /@wordpress/scripts/19.2.4_f7x7zdz3ccrnqxb4utvdtwqz4e: + /@wordpress/scripts/19.2.4_ew4zquq24ctm7afg5tumlrriou: resolution: {integrity: sha512-klkfjBOPfr/RT/3Tvmx+gLbZ+dxq5L0dJQHCHxEURMRW/A8SfJJPtmC29L9sE1KhO3zUMWxrkn2L6HhSzbvQbA==} engines: {node: '>=12.13', npm: '>=6.9'} hasBin: true @@ -17609,14 +20064,14 @@ packages: '@wordpress/babel-preset-default': 6.6.1 '@wordpress/browserslist-config': 4.1.3 '@wordpress/dependency-extraction-webpack-plugin': 3.4.1_webpack@5.70.0 - '@wordpress/eslint-plugin': 9.3.0_gvdiv7jt74qfcmw4bmvrh4kane - '@wordpress/jest-preset-default': 7.1.3_3kt4xu3sgkhoqdvxwcvxppk7nm + '@wordpress/eslint-plugin': 9.3.0_3xe5tjvuvwwvrozjb6pk7ussfi + '@wordpress/jest-preset-default': 7.1.3_32bilwwi7li3aoepmefcbmhmcy '@wordpress/npm-package-json-lint-config': 4.2.0_ngbyqqcq5j4itme2ewj5k5pf2y '@wordpress/postcss-plugins-preset': 3.10.0_postcss@8.4.12 '@wordpress/prettier-config': 1.1.3 '@wordpress/stylelint-config': 19.1.0_stylelint@13.13.1 - babel-jest: 26.6.3_@babel+core@7.17.8 - babel-loader: 8.2.3_7kihywspc3gmje7ccze4zrmvoq + babel-jest: 26.6.3_@babel+core@7.21.3 + babel-loader: 8.2.3_wxlqalhv5b6426466bgbroq3uq browserslist: 4.20.4 chalk: 4.1.2 check-node-version: 4.2.1 @@ -17684,6 +20139,36 @@ packages: - webpack-dev-server dev: true + /@wordpress/server-side-render/3.17.0_mtk4wljkd5jimhszw4p7nnxuzm: + resolution: {integrity: sha512-yJBM1hLl6n9w9X17deSsUc2Fbt/eBKDw2pzwbiPalKUGjP5RSKflzVb1uOwSr+KDUPo4vHj1hwkqO+RHssHHRg==} + engines: {node: '>=12'} + peerDependencies: + react: ^17.0.0 + react-dom: ^17.0.0 + dependencies: + '@babel/runtime': 7.19.0 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/blocks': 11.18.0_react@17.0.2 + '@wordpress/components': 21.2.0_mtk4wljkd5jimhszw4p7nnxuzm + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 7.3.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 + lodash: 4.17.21 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + transitivePeerDependencies: + - '@babel/core' + - '@babel/helper-module-imports' + - '@babel/types' + - '@types/react' + - aslemammad-vite-plugin-macro + - babel-plugin-macros + - vite + dev: false + /@wordpress/server-side-render/3.17.0_vcke6catv4iqpjdw24uwvlzyyi: resolution: {integrity: sha512-yJBM1hLl6n9w9X17deSsUc2Fbt/eBKDw2pzwbiPalKUGjP5RSKflzVb1uOwSr+KDUPo4vHj1hwkqO+RHssHHRg==} engines: {node: '>=12'} @@ -17823,6 +20308,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 lodash: 4.17.21 + dev: false /@wordpress/viewport/4.17.0_react@17.0.2: resolution: {integrity: sha512-5FZCqXjsZjONoyCfjalRgdme//j4XJYHRXYh7ynoJW/qULq3YqZhyLtjFsEM4V+uuuURFSYnGnOD7V+K9wooPA==} @@ -17844,8 +20330,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.17.7 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -17857,8 +20343,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.19.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -17883,6 +20369,7 @@ packages: /@wordpress/warning/2.6.1: resolution: {integrity: sha512-Xs37x0IkvNewPNKs1A8cnw5xLb+AqwUqqCsH4+5Sjat5GDqP86mHgLfRIlE4d6fBYg+q6tO7DVPG49TT3/wzgA==} engines: {node: '>=12'} + dev: false /@wordpress/wordcount/3.19.0: resolution: {integrity: sha512-x5M997RMrglq/XiGi55sO4fIPrGu20bob6h5goc9NKbbq68NTTDPrznfRbhQ+gTLLEV79AtUO/RPK3y9V9Pvkw==} @@ -18695,7 +21182,7 @@ packages: /axios/0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.14.7 + follow-redirects: 1.14.7_debug@4.3.3 transitivePeerDependencies: - debug @@ -18740,9 +21227,9 @@ packages: eslint: '>= 4.12.1' dependencies: '@babel/code-frame': 7.18.6 - '@babel/parser': 7.19.3 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/parser': 7.21.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 eslint: 7.32.0 eslint-visitor-keys: 1.3.0 resolve: 1.22.1 @@ -18800,18 +21287,18 @@ packages: babel-types: 6.26.0 dev: true - /babel-jest/24.9.0_@babel+core@7.17.8: + /babel-jest/24.9.0_@babel+core@7.21.3: resolution: {integrity: sha512-ntuddfyiN+EhMw58PTNL1ph4C9rECiQXjI4nMMBKBaNjXvqLdkXpPRcMSr4iyBrJg/+wz9brFUD6RhOAT6r4Iw==} engines: {node: '>= 6'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@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.17.8 + babel-preset-jest: 24.9.0_@babel+core@7.21.3 chalk: 2.4.2 slash: 2.0.0 transitivePeerDependencies: @@ -18837,6 +21324,25 @@ packages: - supports-color dev: true + /babel-jest/25.5.1_@babel+core@7.21.3: + resolution: {integrity: sha512-9dA9+GmMjIzgPnYtkhBg73gOo/RHqPmLruP3BaGL4KEX3Dwz6pI8auSN8G8+iuEG90+GSswyKvslN+JYSaacaQ==} + engines: {node: '>= 8.3'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@jest/transform': 25.5.1 + '@jest/types': 25.5.0 + '@types/babel__core': 7.1.16 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 25.5.0_@babel+core@7.21.3 + chalk: 3.0.0 + graceful-fs: 4.2.9 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-jest/26.6.3_@babel+core@7.12.9: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} engines: {node: '>= 10.14.2'} @@ -18856,18 +21362,18 @@ packages: - supports-color dev: false - /babel-jest/26.6.3_@babel+core@7.17.8: + /babel-jest/26.6.3_@babel+core@7.21.3: resolution: {integrity: sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 '@types/babel__core': 7.1.16 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 26.6.2_@babel+core@7.17.8 + babel-preset-jest: 26.6.2_@babel+core@7.21.3 chalk: 4.1.2 graceful-fs: 4.2.9 slash: 3.0.0 @@ -18892,6 +21398,25 @@ packages: slash: 3.0.0 transitivePeerDependencies: - supports-color + dev: true + + /babel-jest/27.5.1_@babel+core@7.21.3: + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.21.3 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.1.16 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1_@babel+core@7.21.3 + chalk: 4.1.2 + graceful-fs: 4.2.9 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color /babel-loader/8.2.3_2p3p4wasefxeg63hu27rmsqfnq: resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} @@ -18938,6 +21463,36 @@ packages: webpack: 4.46.0_webpack-cli@3.3.12 dev: true + /babel-loader/8.2.3_wxlqalhv5b6426466bgbroq3uq: + resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.21.3 + find-cache-dir: 3.3.2 + loader-utils: 1.4.0 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.70.0_bgqcrdgdviybk52kjcpjat65sa + dev: true + + /babel-loader/8.2.3_y3c3uzyfhmxjbwhc6k6hyxg3aa: + resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.21.3 + find-cache-dir: 3.3.2 + loader-utils: 1.4.0 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 4.46.0 + dev: true + /babel-messages/6.23.0: resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} dependencies: @@ -19019,8 +21574,8 @@ packages: resolution: {integrity: sha512-u+/W+WAjMlvoocYGTwthAiQSxDcJAyHpQ6oWlHdFZaaN+Rlk8Q7iiwDPg2lN/FyJtAYnKjFxbn7xus4HCFkg5g==} engines: {node: '>= 8.3'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 '@types/babel__traverse': 7.14.2 dev: true @@ -19028,8 +21583,8 @@ packages: resolution: {integrity: sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 '@types/babel__core': 7.1.16 '@types/babel__traverse': 7.14.2 @@ -19037,8 +21592,8 @@ packages: resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/template': 7.18.10 - '@babel/types': 7.19.3 + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 '@types/babel__core': 7.1.16 '@types/babel__traverse': 7.14.2 @@ -19066,12 +21621,20 @@ packages: '@babel/core': 7.17.8 dev: true + /babel-plugin-named-asset-import/0.3.8_@babel+core@7.21.3: + resolution: {integrity: sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==} + peerDependencies: + '@babel/core': ^7.1.0 + dependencies: + '@babel/core': 7.21.3 + dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.12.9: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.12.9 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.12.9 semver: 6.3.0 @@ -19084,7 +21647,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.16.12 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.16.12 semver: 6.3.0 @@ -19097,7 +21660,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.17.8 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 semver: 6.3.0 @@ -19105,12 +21668,25 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.21.3: + resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.19.3 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.12.9: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.12.9 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.12.9 semver: 6.3.0 @@ -19122,12 +21698,25 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.19.3 + '@babel/compat-data': 7.21.0 '@babel/core': 7.17.8 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: false + + /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.3: + resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.17.8: resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} @@ -19141,6 +21730,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3/0.1.7_@babel+core@7.21.3: + resolution: {integrity: sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.1.5_@babel+core@7.21.3 + core-js-compat: 3.25.5 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3/0.4.0_@babel+core@7.12.9: resolution: {integrity: sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==} peerDependencies: @@ -19165,13 +21766,13 @@ packages: - supports-color dev: false - /babel-plugin-polyfill-corejs3/0.4.0_@babel+core@7.17.8: + /babel-plugin-polyfill-corejs3/0.4.0_@babel+core@7.21.3: resolution: {integrity: sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.17.8 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 core-js-compat: 3.25.5 transitivePeerDependencies: - supports-color @@ -19213,6 +21814,18 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs3/0.5.2_@babel+core@7.21.3: + resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + core-js-compat: 3.25.5 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.12.9: resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} peerDependencies: @@ -19234,6 +21847,18 @@ packages: core-js-compat: 3.25.5 transitivePeerDependencies: - supports-color + dev: false + + /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.21.3: + resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + core-js-compat: 3.25.5 + transitivePeerDependencies: + - supports-color /babel-plugin-polyfill-regenerator/0.3.0_@babel+core@7.12.9: resolution: {integrity: sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==} @@ -19268,6 +21893,17 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-regenerator/0.3.0_@babel+core@7.21.3: + resolution: {integrity: sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.12.9: resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} peerDependencies: @@ -19287,6 +21923,17 @@ packages: '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 transitivePeerDependencies: - supports-color + dev: false + + /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.21.3: + resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color /babel-plugin-react-docgen/4.2.1: resolution: {integrity: sha512-UQ0NmGHj/HAqi5Bew8WvNfCk8wSsmdgNd8ZdMjBCICtyCJCq9LiqgqvjCYe570/Wg7AQArSq1VQ60Dd/CHN7mQ==} @@ -19345,6 +21992,25 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 dev: true + /babel-preset-current-node-syntax/0.1.4_@babel+core@7.21.3: + resolution: {integrity: sha512-5/INNCYhUGqw7VbVjT/hb3ucjgkVHKXY7lX3ZjlN4gm565VyFmJUrJ/h+h16ECVB38R/9SF6aACydpKMLZ/c9w==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + dev: true + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.12.9: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: @@ -19383,6 +22049,26 @@ packages: '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.8 + dev: true + + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.3: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.3 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.3 /babel-preset-fbjs/3.4.0_@babel+core@7.12.9: resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} @@ -19420,50 +22106,50 @@ packages: transitivePeerDependencies: - supports-color - /babel-preset-fbjs/3.4.0_@babel+core@7.17.8: + /babel-preset-fbjs/3.4.0_@babel+core@7.21.3: resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.8 - '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.3 + '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color - /babel-preset-jest/24.9.0_@babel+core@7.17.8: + /babel-preset-jest/24.9.0_@babel+core@7.21.3: resolution: {integrity: sha512-izTUuhE4TMfTRPF92fFwD2QfdXaZW08qvWTFCI51V8rW5x00UuPgc3ajRoWofXOuxjfcOM5zzSYsQS3H8KGCAg==} engines: {node: '>= 6'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.3 babel-plugin-jest-hoist: 24.9.0 dev: false @@ -19478,6 +22164,17 @@ packages: babel-preset-current-node-syntax: 0.1.4_@babel+core@7.17.8 dev: true + /babel-preset-jest/25.5.0_@babel+core@7.21.3: + resolution: {integrity: sha512-8ZczygctQkBU+63DtSOKGh7tFL0CeCuz+1ieud9lJ1WPQ9O6A1a/r+LGn6Y705PA6whHQ3T1XuB/PmpfNYf8Fw==} + engines: {node: '>= 8.3'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + babel-plugin-jest-hoist: 25.5.0 + babel-preset-current-node-syntax: 0.1.4_@babel+core@7.21.3 + dev: true + /babel-preset-jest/26.6.2_@babel+core@7.12.9: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} engines: {node: '>= 10.14.2'} @@ -19489,15 +22186,15 @@ packages: babel-preset-current-node-syntax: 1.0.1_@babel+core@7.12.9 dev: false - /babel-preset-jest/26.6.2_@babel+core@7.17.8: + /babel-preset-jest/26.6.2_@babel+core@7.21.3: resolution: {integrity: sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==} engines: {node: '>= 10.14.2'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 babel-plugin-jest-hoist: 26.6.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 dev: true /babel-preset-jest/27.5.1_@babel+core@7.17.8: @@ -19509,6 +22206,17 @@ packages: '@babel/core': 7.17.8 babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 + dev: true + + /babel-preset-jest/27.5.1_@babel+core@7.21.3: + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 /babel-runtime/6.26.0: resolution: {integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4=} @@ -19921,7 +22629,7 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001146 + caniuse-lite: 1.0.30001418 electron-to-chromium: 1.4.276 dev: true @@ -20261,13 +22969,14 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.19.3 - caniuse-lite: 1.0.30001146 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001418 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 /caniuse-lite/1.0.30001146: resolution: {integrity: sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==} + dev: true /caniuse-lite/1.0.30001352: resolution: {integrity: sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==} @@ -21138,7 +23847,7 @@ packages: resolution: {integrity: sha512-T3RmZQEAji5KYqUQpziWtyGJFli6Khz7h0rpxDwYNjSkr5ynyTWwO7WpfjHzTXclNCDfSWQRcwMb+NwxJesCKw==} engines: {node: '>= 6.0.0'} dependencies: - json5: 2.2.0 + json5: 2.2.3 dev: false /config/3.3.7: @@ -21300,7 +24009,6 @@ packages: /core-js-pure/3.29.1: resolution: {integrity: sha512-4En6zYVi0i0XlXHVz/bi6l1XDjCqkKRq765NXuX+SnaIatlE96Odt5lMLjdxUiNI1v9OXI5DSLWYPlmTfkTktg==} requiresBuild: true - dev: true /core-js/1.2.7: resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} @@ -21585,7 +24293,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 2.7.1 semver: 6.3.0 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /css-loader/5.2.7_webpack@5.70.0: resolution: {integrity: sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==} @@ -21666,7 +24374,7 @@ packages: engines: {node: '>= 6'} /css.escape/1.5.1: - resolution: {integrity: sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=} + resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} /css/3.0.0: resolution: {integrity: sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==} @@ -24062,8 +26770,8 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 c8: 7.11.0 transitivePeerDependencies: - supports-color @@ -24919,15 +27627,6 @@ packages: debug: optional: true - /follow-redirects/1.14.7: - resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - /follow-redirects/1.14.7_debug@4.3.3: resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==} engines: {node: '>=4.0'} @@ -24938,7 +27637,6 @@ packages: optional: true dependencies: debug: 4.3.3 - dev: true /follow-redirects/1.5.10: resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} @@ -25055,18 +27753,18 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 fs-extra: 9.1.0 glob: 7.2.0 - memfs: 3.4.13 + memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.8.4 webpack: 5.70.0 @@ -25118,19 +27816,19 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 eslint: 8.32.0 fs-extra: 9.1.0 glob: 7.2.0 - memfs: 3.4.13 + memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0_webpack-cli@3.3.12 @@ -25150,18 +27848,18 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 fs-extra: 9.1.0 glob: 7.2.0 - memfs: 3.4.13 + memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.8.4 webpack: 4.46.0 @@ -26860,7 +29558,7 @@ packages: '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym '@babel/runtime': 7.19.0 '@tannin/sprintf': 1.2.0 - '@wordpress/compose': 5.4.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 debug: 4.3.4 events: 3.3.0 hash.js: 1.1.7 @@ -27814,11 +30512,11 @@ packages: resolution: {integrity: sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==} engines: {node: '>=6'} dependencies: - '@babel/generator': 7.19.3 - '@babel/parser': 7.19.3 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 istanbul-lib-coverage: 2.0.5 semver: 6.3.0 transitivePeerDependencies: @@ -27829,7 +30527,7 @@ packages: resolution: {integrity: sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -27841,8 +30539,8 @@ packages: resolution: {integrity: sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.17.8 - '@babel/parser': 7.19.3 + '@babel/core': 7.21.3 + '@babel/parser': 7.21.3 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 semver: 6.3.0 @@ -28017,7 +30715,7 @@ packages: resolution: {integrity: sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/traverse': 7.19.3 + '@babel/traverse': 7.21.3 '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 @@ -28211,10 +30909,10 @@ packages: resolution: {integrity: sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==} engines: {node: '>= 6'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/test-sequencer': 24.9.0 '@jest/types': 24.9.0 - babel-jest: 24.9.0_@babel+core@7.17.8 + babel-jest: 24.9.0_@babel+core@7.21.3 chalk: 2.4.2 glob: 7.2.0 jest-environment-jsdom: 24.9.0 @@ -28238,10 +30936,10 @@ packages: resolution: {integrity: sha512-SZwR91SwcdK6bz7Gco8qL7YY2sx8tFJYzvg216DLihTWf+LKY/DoJXpM9nTzYakSyfblbqeU48p/p7Jzy05Atg==} engines: {node: '>= 8.3'} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/test-sequencer': 25.5.4 '@jest/types': 25.5.0 - babel-jest: 25.5.1_@babel+core@7.17.8 + babel-jest: 25.5.1_@babel+core@7.21.3 chalk: 3.0.0 deepmerge: 4.3.0 glob: 7.2.0 @@ -28273,10 +30971,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/test-sequencer': 26.6.3 '@jest/types': 26.6.2 - babel-jest: 26.6.3_@babel+core@7.17.8 + babel-jest: 26.6.3_@babel+core@7.21.3 chalk: 4.1.2 deepmerge: 4.3.0 glob: 7.2.0 @@ -28307,10 +31005,10 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 '@jest/test-sequencer': 27.5.1 '@jest/types': 27.5.1 - babel-jest: 27.5.1_@babel+core@7.17.8 + babel-jest: 27.5.1_@babel+core@7.21.3 chalk: 4.1.2 ci-info: 3.2.0 deepmerge: 4.3.0 @@ -28720,7 +31418,7 @@ packages: resolution: {integrity: sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==} engines: {node: '>= 6'} dependencies: - '@babel/traverse': 7.19.3 + '@babel/traverse': 7.21.3 '@jest/environment': 24.9.0 '@jest/test-result': 24.9.0 '@jest/types': 24.9.0 @@ -28744,7 +31442,7 @@ packages: resolution: {integrity: sha512-9acbWEfbmS8UpdcfqnDO+uBUgKa/9hcRh983IHdM+pKmJPL77G0sWAAK0V0kr5LK3a8cSBfkFSoncXwQlRZfkQ==} engines: {node: '>= 8.3'} dependencies: - '@babel/traverse': 7.19.3 + '@babel/traverse': 7.21.3 '@jest/environment': 25.5.0 '@jest/source-map': 25.5.0 '@jest/test-result': 25.5.0 @@ -28772,7 +31470,7 @@ packages: resolution: {integrity: sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/traverse': 7.19.3 + '@babel/traverse': 7.21.3 '@jest/environment': 26.6.2 '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 @@ -29480,7 +32178,7 @@ packages: resolution: {integrity: sha512-uI/rszGSs73xCM0l+up7O7a40o90cnrk429LOiK3aeTvfC0HHmldbd81/B7Ix81KSFe1lwkbl7GnBGG4UfuDew==} engines: {node: '>= 6'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 '@jest/types': 24.9.0 chalk: 2.4.2 expect: 24.9.0 @@ -29501,7 +32199,7 @@ packages: resolution: {integrity: sha512-C02JE1TUe64p2v1auUJ2ze5vcuv32tkv9PyhEb318e8XOKF7MOyXdJ7kdjbvrp3ChPLU2usI7Rjxs97Dj5P0uQ==} engines: {node: '>= 8.3'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 '@jest/types': 25.5.0 '@types/prettier': 1.19.1 chalk: 3.0.0 @@ -29522,7 +32220,7 @@ packages: resolution: {integrity: sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==} engines: {node: '>= 10.14.2'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 '@jest/types': 26.6.2 '@types/babel__traverse': 7.14.2 '@types/prettier': 2.4.2 @@ -29546,16 +32244,16 @@ packages: resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.19.3 - '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.17.8 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.21.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 '@types/babel__traverse': 7.14.2 '@types/prettier': 2.4.2 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.17.8 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 chalk: 4.1.2 expect: 27.5.1 graceful-fs: 4.2.9 @@ -29957,7 +32655,7 @@ packages: '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.8 '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.8 '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 '@babel/preset-flow': 7.16.7_@babel+core@7.17.8 '@babel/preset-typescript': 7.16.7_@babel+core@7.17.8 '@babel/register': 7.18.9_@babel+core@7.17.8 @@ -30180,6 +32878,11 @@ packages: dependencies: minimist: 1.2.5 + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + /jsonc-parser/2.2.1: resolution: {integrity: sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==} dev: true @@ -30534,7 +33237,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.0 + json5: 2.2.3 dev: true /loader-utils/2.0.2: @@ -30551,7 +33254,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.0 + json5: 2.2.3 dev: true /locate-path/2.0.0: @@ -30805,7 +33508,6 @@ packages: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: yallist: 3.1.1 - dev: true /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} @@ -31329,7 +34031,7 @@ packages: /metro-babel-transformer/0.72.1: resolution: {integrity: sha512-VK7A9gepnhrKC0DMoxtPjYYHjkkfNwzLMYJgeL6Il6IaX/K/VHTILSEqgpxfNDos2jrXazuR5+rXDLE/RCzqmw==} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 hermes-parser: 0.8.0 metro-source-map: 0.72.1 nullthrows: 1.1.1 @@ -31339,7 +34041,7 @@ packages: /metro-babel-transformer/0.72.2: resolution: {integrity: sha512-3Bxk/MoXHn/ysmsH7ov6inDHrSWz5eowYRGzilOSSXe9y3DJ/ceTHfT+DWsPr9IgTJLQfKVN/F0pZ+1Ndqh52A==} dependencies: - '@babel/core': 7.17.8 + '@babel/core': 7.21.3 hermes-parser: 0.8.0 metro-source-map: 0.72.2 nullthrows: 1.1.1 @@ -31459,54 +34161,54 @@ packages: '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.12.9 '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 - '@babel/template': 7.18.10 + '@babel/template': 7.20.7 react-refresh: 0.4.3 transitivePeerDependencies: - supports-color - /metro-react-native-babel-preset/0.72.2_@babel+core@7.17.8: + /metro-react-native-babel-preset/0.72.2_@babel+core@7.21.3: resolution: {integrity: sha512-OMp77TUUZAoiuUv5uKNc08AnJNQxD28k92eQvo8tPcA8Wx6OZlEUvL7M7SFkef2mEYJ0vnrRjOamSnbBuq/+1w==} peerDependencies: '@babel/core': '*' dependencies: - '@babel/core': 7.17.8 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-export-default-from': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.17.8 - '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-runtime': 7.19.1_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.17.8 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.17.8 - '@babel/template': 7.18.10 + '@babel/core': 7.21.3 + '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.21.3 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-export-default-from': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-syntax-flow': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.3 + '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.21.3 + '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-flow-strip-types': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.21.3 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.21.3 + '@babel/plugin-transform-react-display-name': 7.16.7_@babel+core@7.21.3 + '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-react-jsx-self': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-react-jsx-source': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-runtime': 7.19.1_@babel+core@7.21.3 + '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.21.3 + '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.21.3 + '@babel/plugin-transform-typescript': 7.19.3_@babel+core@7.21.3 + '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.21.3 + '@babel/template': 7.20.7 react-refresh: 0.4.3 transitivePeerDependencies: - supports-color @@ -31546,8 +34248,8 @@ packages: /metro-source-map/0.72.1: resolution: {integrity: sha512-77TZuf10Ru+USo97HwDT8UceSzOGBZB8EYTObOsR0n1sjQHjvKsMflLA9Pco13o9NsIYAG6c6P/0vIpiHKqaKA==} dependencies: - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 invariant: 2.2.4 metro-symbolicate: 0.72.1 nullthrows: 1.1.1 @@ -31560,8 +34262,8 @@ packages: /metro-source-map/0.72.2: resolution: {integrity: sha512-dqYK8DZ4NzGkhik0IkKRBLuPplXqF6GoKrFQ/XMw0FYGy3+dFJ9nIDxsCyg3GcjCt6Mg8FEqGrXlpMG7MrtC9Q==} dependencies: - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 invariant: 2.2.4 metro-symbolicate: 0.72.2 nullthrows: 1.1.1 @@ -31602,10 +34304,10 @@ packages: /metro-transform-plugins/0.72.2: resolution: {integrity: sha512-f2Zt6ti156TWFrnCRg7vxBIHBJcERBX8nwKmRKGFCbU+rk4YOxwONY4Y0Gn9Kocfu313P1xNqWYH5rCqvEWMaQ==} dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.19.3 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 nullthrows: 1.1.1 transitivePeerDependencies: - supports-color @@ -31613,11 +34315,11 @@ packages: /metro-transform-worker/0.72.2: resolution: {integrity: sha512-z5OOnEO3NV6PgI8ORIBvJ5m+u9THFpy+6WIg/MUjP9k1oqasWaP1Rfhv7K/a+MD6uho1rgXj6nwWDqybsqHY/w==} dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.19.3 - '@babel/parser': 7.19.3 - '@babel/types': 7.19.3 - babel-preset-fbjs: 3.4.0_@babel+core@7.17.8 + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/types': 7.21.3 + babel-preset-fbjs: 3.4.0_@babel+core@7.21.3 metro: 0.72.2 metro-babel-transformer: 0.72.2 metro-cache: 0.72.2 @@ -31637,12 +34339,12 @@ packages: hasBin: true dependencies: '@babel/code-frame': 7.18.6 - '@babel/core': 7.17.8 - '@babel/generator': 7.19.3 - '@babel/parser': 7.19.3 - '@babel/template': 7.18.10 - '@babel/traverse': 7.19.3 - '@babel/types': 7.19.3 + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/parser': 7.21.3 + '@babel/template': 7.20.7 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 absolute-path: 0.0.0 accepts: 1.3.8 async: 3.2.4 @@ -31668,7 +34370,7 @@ packages: metro-hermes-compiler: 0.72.2 metro-inspector-proxy: 0.72.2 metro-minify-uglify: 0.72.2 - metro-react-native-babel-preset: 0.72.2_@babel+core@7.17.8 + metro-react-native-babel-preset: 0.72.2_@babel+core@7.21.3 metro-resolver: 0.72.2 metro-runtime: 0.72.2 metro-source-map: 0.72.2 @@ -33666,7 +36368,7 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 color: 3.2.1 has: 1.0.3 postcss: 7.0.39 @@ -33678,7 +36380,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 colord: 2.9.2 postcss: 8.4.12 @@ -33822,7 +36524,7 @@ packages: dependencies: cosmiconfig: 7.0.1 klona: 2.0.5 - loader-utils: 2.0.4 + loader-utils: 2.0.2 postcss: 7.0.39 schema-utils: 3.1.1 semver: 7.3.8 @@ -33886,7 +36588,7 @@ packages: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -33899,7 +36601,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 @@ -33953,7 +36655,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.19.3 + browserslist: 4.21.4 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -33965,7 +36667,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 postcss-value-parser: 4.2.0 @@ -34170,7 +36872,7 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -34180,7 +36882,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 8.4.12 postcss-value-parser: 4.2.0 dev: true @@ -34245,7 +36947,7 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 @@ -34256,7 +36958,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 postcss: 8.4.12 dev: true @@ -35294,8 +37996,8 @@ packages: engines: {node: '>=8.10.0'} hasBin: true dependencies: - '@babel/core': 7.17.8 - '@babel/generator': 7.19.3 + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 '@babel/runtime': 7.19.0 ast-types: 0.14.2 commander: 2.20.3 @@ -35477,7 +38179,7 @@ packages: /react-native-codegen/0.70.4_@babel+preset-env@7.12.7: resolution: {integrity: sha512-bPyd5jm840omfx24VRyMP+KPzAefpRDwE18w5ywMWHCWZBSqLn1qI9WgBPnavlIrjTEuzxznWQNcaA26lw8AMQ==} dependencies: - '@babel/parser': 7.19.3 + '@babel/parser': 7.21.3 flow-parser: 0.121.0 jscodeshift: 0.13.1_@babel+preset-env@7.12.7 nullthrows: 1.1.1 @@ -36917,7 +39619,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.1.1 semver: 7.3.5 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /sass-loader/12.6.0_sass@1.49.9+webpack@5.70.0: resolution: {integrity: sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==} @@ -38118,7 +40820,7 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 7.0.39 postcss-selector-parser: 3.1.2 @@ -38128,7 +40830,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 8.4.12 postcss-selector-parser: 6.0.9 dev: true @@ -38879,7 +41581,7 @@ packages: serialize-javascript: 6.0.0 source-map: 0.6.1 terser: 5.10.0_acorn@8.8.1 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 transitivePeerDependencies: - acorn @@ -39242,6 +41944,75 @@ packages: yargs-parser: 20.2.9 dev: true + /ts-jest/27.1.3_hszvtzkxfg7axc55y33g3o6iwa: + resolution: {integrity: sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: ~0.14.0 + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.3 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1 + jest-util: 27.5.1 + json5: 2.2.0 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.8.4 + yargs-parser: 20.2.9 + dev: true + + /ts-jest/27.1.3_n6jwe674nt3ravnkwja2moplpy: + resolution: {integrity: sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: ~0.14.0 + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@types/jest': 27.4.1 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1 + jest-util: 27.5.1 + json5: 2.2.0 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.8.4 + yargs-parser: 20.2.9 + dev: true + /ts-jest/27.1.3_wfmhell6c5i72vvtgtvpmkkb6i: resolution: {integrity: sha512-6Nlura7s6uM9BVUAoqLH7JHyMXjz8gluryjpPXxr3IxZdAXnU6FhjvVLHFtfd1vsE1p8zD1OJfskkc0jhTSnkA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -41000,7 +43771,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.19.3 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41039,7 +43810,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.19.3 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41120,7 +43891,7 @@ packages: '@webassemblyjs/wasm-parser': 1.11.1 acorn: 8.8.1 acorn-import-assertions: 1.8.0_acorn@8.8.1 - browserslist: 4.19.3 + browserslist: 4.21.4 chrome-trace-event: 1.0.3 enhanced-resolve: 5.9.2 es-module-lexer: 0.9.3 @@ -41590,7 +44361,6 @@ packages: /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} From 79023a4a10259ee3a63d81ba40359a92d013c33f Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Tue, 21 Mar 2023 18:33:57 +0800 Subject: [PATCH 1150/1680] Fix incorrect data while loading in useInstalledPlugins. --- .../marketing/hooks/useInstalledPlugins.ts | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts index ab2a2c97a7a..32099be7524 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts @@ -25,8 +25,14 @@ export type UseInstalledPlugins = { * The list of installed plugins will not include registered and recommended marketing channels. */ export const useInstalledPlugins = (): UseInstalledPlugins => { - const { data: dataRegisteredChannels = [] } = useRegisteredChannels(); - const { data: dataRecommendedChannels = [] } = useRecommendedChannels(); + const { + loading: loadingRegisteredChannels, + data: dataRegisteredChannels = [], + } = useRegisteredChannels(); + const { + loading: loadingRecommendedChannels, + data: dataRecommendedChannels = [], + } = useRecommendedChannels(); const { installedPlugins, activatingPlugins } = useSelect( ( select ) => { const { getInstalledPlugins, getActivatingPlugins } = @@ -38,6 +44,10 @@ export const useInstalledPlugins = (): UseInstalledPlugins => { }; }, [] ); + const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } = + useDispatch( STORE_KEY ); + + const loading = loadingRegisteredChannels || loadingRecommendedChannels; const installedPluginsWithoutChannels = chain( installedPlugins ) .differenceWith( dataRegisteredChannels, ( a, b ) => a.slug === b.slug ) .differenceWith( @@ -46,11 +56,8 @@ export const useInstalledPlugins = (): UseInstalledPlugins => { ) .value(); - const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } = - useDispatch( STORE_KEY ); - return { - installedPlugins: installedPluginsWithoutChannels, + installedPlugins: loading ? [] : installedPluginsWithoutChannels, activatingPlugins, activateInstalledPlugin, loadInstalledPluginsAfterActivation, From 50c391cee00889741f03c12851b011177db9476e Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Tue, 21 Mar 2023 18:35:38 +0800 Subject: [PATCH 1151/1680] Use fallback value instead of default value in useInstalledPlugins. --- .../client/marketing/hooks/useInstalledPlugins.ts | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts index 32099be7524..de5d3a7dabe 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts @@ -25,13 +25,11 @@ export type UseInstalledPlugins = { * The list of installed plugins will not include registered and recommended marketing channels. */ export const useInstalledPlugins = (): UseInstalledPlugins => { - const { - loading: loadingRegisteredChannels, - data: dataRegisteredChannels = [], - } = useRegisteredChannels(); + const { loading: loadingRegisteredChannels, data: dataRegisteredChannels } = + useRegisteredChannels(); const { loading: loadingRecommendedChannels, - data: dataRecommendedChannels = [], + data: dataRecommendedChannels, } = useRecommendedChannels(); const { installedPlugins, activatingPlugins } = useSelect( ( select ) => { @@ -49,9 +47,12 @@ export const useInstalledPlugins = (): UseInstalledPlugins => { const loading = loadingRegisteredChannels || loadingRecommendedChannels; const installedPluginsWithoutChannels = chain( installedPlugins ) - .differenceWith( dataRegisteredChannels, ( a, b ) => a.slug === b.slug ) .differenceWith( - dataRecommendedChannels, + dataRegisteredChannels || [], + ( a, b ) => a.slug === b.slug + ) + .differenceWith( + dataRecommendedChannels || [], ( a, b ) => a.slug === b.product ) .value(); From fe4e28d5116641fc87c9b4f4fa3de97397c4788e Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Tue, 21 Mar 2023 19:08:13 +0800 Subject: [PATCH 1152/1680] Rename UseInstalledPlugins to UseInstalledExtensions. Also change related names from "plugin" to "extension". --- .../client/marketing/hooks/index.ts | 2 +- ...edPlugins.ts => useInstalledExtensions.ts} | 27 +++++++++++-------- .../DiscoverTools/DiscoverTools.test.tsx | 22 +++++++-------- .../DiscoverTools/PluginsTabPanel.tsx | 6 ++--- .../InstalledExtensions.tsx | 22 ++++++++------- 5 files changed, 44 insertions(+), 35 deletions(-) rename plugins/woocommerce-admin/client/marketing/hooks/{useInstalledPlugins.ts => useInstalledExtensions.ts} (67%) diff --git a/plugins/woocommerce-admin/client/marketing/hooks/index.ts b/plugins/woocommerce-admin/client/marketing/hooks/index.ts index a61a1a28ec7..17fbb4e6931 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/index.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/index.ts @@ -1,4 +1,4 @@ -export { useInstalledPlugins } from './useInstalledPlugins'; +export { useInstalledExtensions } from './useInstalledExtensions'; export { useRegisteredChannels } from './useRegisteredChannels'; export { useRecommendedChannels } from './useRecommendedChannels'; export { useCampaignTypes } from './useCampaignTypes'; diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledExtensions.ts similarity index 67% rename from plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts rename to plugins/woocommerce-admin/client/marketing/hooks/useInstalledExtensions.ts index de5d3a7dabe..4f28d88b372 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledExtensions.ts @@ -12,11 +12,13 @@ import { InstalledPlugin } from '~/marketing/types'; import { useRecommendedChannels } from './useRecommendedChannels'; import { useRegisteredChannels } from './useRegisteredChannels'; -export type UseInstalledPlugins = { - installedPlugins: InstalledPlugin[]; - activatingPlugins: string[]; - activateInstalledPlugin: ( slug: string ) => void; - loadInstalledPluginsAfterActivation: ( slug: string ) => void; +type InstalledExtension = InstalledPlugin; + +export type UseInstalledExtensions = { + installedExtensionsWithoutChannels: InstalledExtension[]; + activatingExtensions: string[]; + activateInstalledExtension: ( slug: string ) => void; + loadInstalledExtensionsAfterActivation: ( slug: string ) => void; }; /** @@ -24,7 +26,7 @@ export type UseInstalledPlugins = { * * The list of installed plugins will not include registered and recommended marketing channels. */ -export const useInstalledPlugins = (): UseInstalledPlugins => { +export const useInstalledExtensions = (): UseInstalledExtensions => { const { loading: loadingRegisteredChannels, data: dataRegisteredChannels } = useRegisteredChannels(); const { @@ -37,7 +39,7 @@ export const useInstalledPlugins = (): UseInstalledPlugins => { select( STORE_KEY ); return { - installedPlugins: getInstalledPlugins< InstalledPlugin[] >(), + installedPlugins: getInstalledPlugins< InstalledExtension[] >(), activatingPlugins: getActivatingPlugins(), }; }, [] ); @@ -58,9 +60,12 @@ export const useInstalledPlugins = (): UseInstalledPlugins => { .value(); return { - installedPlugins: loading ? [] : installedPluginsWithoutChannels, - activatingPlugins, - activateInstalledPlugin, - loadInstalledPluginsAfterActivation, + installedExtensionsWithoutChannels: loading + ? [] + : installedPluginsWithoutChannels, + activatingExtensions: activatingPlugins, + activateInstalledExtension: activateInstalledPlugin, + loadInstalledExtensionsAfterActivation: + loadInstalledPluginsAfterActivation, }; }; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx index 568b353147f..f1c71d5ba1c 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx @@ -6,7 +6,7 @@ import { render, screen } from '@testing-library/react'; /** * Internal dependencies */ -import { useInstalledPlugins } from '../../hooks'; +import { useInstalledExtensions } from '~/marketing/hooks'; import { useRecommendedPlugins } from './useRecommendedPlugins'; import { DiscoverTools } from './DiscoverTools'; @@ -24,8 +24,8 @@ jest.mock( './useRecommendedPlugins', () => ( { useRecommendedPlugins: jest.fn(), } ) ); -jest.mock( '../../hooks', () => ( { - useInstalledPlugins: jest.fn(), +jest.mock( '~/marketing/hooks', () => ( { + useInstalledExtensions: jest.fn(), } ) ); describe( 'DiscoverTools component', () => { @@ -35,8 +35,8 @@ describe( 'DiscoverTools component', () => { isLoading: true, plugins: [], } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), + ( useInstalledExtensions as jest.Mock ).mockReturnValue( { + loadInstalledExtensionsAfterActivation: jest.fn(), } ); render( ); @@ -49,8 +49,8 @@ describe( 'DiscoverTools component', () => { isLoading: false, plugins: [], } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), + ( useInstalledExtensions as jest.Mock ).mockReturnValue( { + loadInstalledExtensionsAfterActivation: jest.fn(), } ); render( ); @@ -95,8 +95,8 @@ describe( 'DiscoverTools component', () => { }, ], } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), + ( useInstalledExtensions as jest.Mock ).mockReturnValue( { + loadInstalledExtensionsAfterActivation: jest.fn(), } ); render( ); @@ -136,8 +136,8 @@ describe( 'DiscoverTools component', () => { }, ], } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), + ( useInstalledExtensions as jest.Mock ).mockReturnValue( { + loadInstalledExtensionsAfterActivation: jest.fn(), } ); render( ); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx index 8a689f4f2c7..03a927b241c 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/PluginsTabPanel.tsx @@ -14,7 +14,7 @@ import { flatMapDeep, uniqBy } from 'lodash'; * Internal dependencies */ import { CardDivider, PluginCardBody } from '~/marketing/components'; -import { useInstalledPlugins } from '~/marketing/hooks'; +import { useInstalledExtensions } from '~/marketing/hooks'; import { RecommendedPlugin } from '~/marketing/types'; import { getInAppPurchaseUrl } from '~/lib/in-app-purchase'; import { createNoticesFromResponse } from '~/lib/notices'; @@ -60,7 +60,7 @@ export const PluginsTabPanel = ( { null ); const { installAndActivatePlugins } = useDispatch( PLUGINS_STORE_NAME ); - const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); + const { loadInstalledExtensionsAfterActivation } = useInstalledExtensions(); /** * Install and activate a plugin. @@ -85,7 +85,7 @@ export const PluginsTabPanel = ( { ] ); onInstallAndActivate( plugin.product ); - loadInstalledPluginsAfterActivation( plugin.product ); + loadInstalledExtensionsAfterActivation( plugin.product ); createNoticesFromResponse( response ); } catch ( error ) { createNoticesFromResponse( error ); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx index f445fa7a69b..17bcadeb47f 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/InstalledExtensions/InstalledExtensions.tsx @@ -16,13 +16,16 @@ import { PluginCardBody, } from '~/marketing/components'; import { InstalledPlugin } from '~/marketing/types'; -import { useInstalledPlugins } from '~/marketing/hooks'; +import { useInstalledExtensions } from '~/marketing/hooks'; export const InstalledExtensions = () => { - const { installedPlugins, activatingPlugins, activateInstalledPlugin } = - useInstalledPlugins(); + const { + installedExtensionsWithoutChannels, + activatingExtensions, + activateInstalledExtension, + } = useInstalledExtensions(); - if ( installedPlugins.length === 0 ) { + if ( installedExtensionsWithoutChannels.length === 0 ) { return null; } @@ -31,13 +34,13 @@ export const InstalledExtensions = () => { return ( + + ); diff --git a/packages/js/product-editor/src/components/header/index.ts b/packages/js/product-editor/src/components/header/index.ts index 677ca79d479..90d2fa76cfc 100644 --- a/packages/js/product-editor/src/components/header/index.ts +++ b/packages/js/product-editor/src/components/header/index.ts @@ -1 +1,2 @@ export * from './header'; +export * from './woo-more-menu-item'; diff --git a/packages/js/product-editor/src/components/header/more-menu/index.ts b/packages/js/product-editor/src/components/header/more-menu/index.ts new file mode 100644 index 00000000000..48b036d2304 --- /dev/null +++ b/packages/js/product-editor/src/components/header/more-menu/index.ts @@ -0,0 +1 @@ +export * from './more-menu'; diff --git a/packages/js/product-editor/src/components/header/more-menu/more-menu.tsx b/packages/js/product-editor/src/components/header/more-menu/more-menu.tsx new file mode 100644 index 00000000000..f86a7761b4a --- /dev/null +++ b/packages/js/product-editor/src/components/header/more-menu/more-menu.tsx @@ -0,0 +1,30 @@ +/** + * External dependencies + */ +import { createElement, Fragment } from '@wordpress/element'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore No types for this exist yet. +// eslint-disable-next-line @woocommerce/dependency-group +import { MoreMenuDropdown } from '@wordpress/interface'; +//import { displayShortcut } from '@wordpress/keycodes'; + +/** + * Internal dependencies + */ +import { WooProductMoreMenuItem } from '../woo-more-menu-item'; + +export const MoreMenu = () => { + return ( + <> + + { ( { onClose }: { onClose: () => void } ) => ( + <> + + + ) } + + + ); +}; diff --git a/packages/js/product-editor/src/components/header/style.scss b/packages/js/product-editor/src/components/header/style.scss index a91b0280e7c..fb60f0f9d4d 100644 --- a/packages/js/product-editor/src/components/header/style.scss +++ b/packages/js/product-editor/src/components/header/style.scss @@ -7,4 +7,25 @@ &__actions { margin-left: auto; } + + .components-popover__content { + min-width: auto; + width: min-content; + } + + .woocommerce-product-header__actions { + display: flex; + + > * + * { + margin-left: $gap; + } + } + + .components-dropdown-menu__toggle { + &.is-opened { + + background-color: #1E1E1E; + color: #fff; + } + } } diff --git a/packages/js/product-editor/src/components/header/woo-more-menu-item/index.ts b/packages/js/product-editor/src/components/header/woo-more-menu-item/index.ts new file mode 100644 index 00000000000..c501b7d92a1 --- /dev/null +++ b/packages/js/product-editor/src/components/header/woo-more-menu-item/index.ts @@ -0,0 +1 @@ +export * from './woo-more-menu-item'; diff --git a/packages/js/product-editor/src/components/header/woo-more-menu-item/woo-more-menu-item.tsx b/packages/js/product-editor/src/components/header/woo-more-menu-item/woo-more-menu-item.tsx new file mode 100644 index 00000000000..67fd4a4ef1e --- /dev/null +++ b/packages/js/product-editor/src/components/header/woo-more-menu-item/woo-more-menu-item.tsx @@ -0,0 +1,37 @@ +/** + * External dependencies + */ +import { isEmpty } from 'lodash'; +import { + createSlotFill, + Slot as BaseSlot, + Fill as BaseFill, +} from '@wordpress/components'; +import { createElement, Fragment } from '@wordpress/element'; + +type WooProductMoreMenuSlot = React.FC< BaseSlot.Props >; + +type WooProductMoreMenuFill = React.FC< BaseFill.Props > & { + Slot?: WooProductMoreMenuSlot; +}; + +type CreateSlotFillReturn = { + Fill: WooProductMoreMenuFill; + Slot: WooProductMoreMenuSlot; +}; + +const { Fill, Slot }: CreateSlotFillReturn = createSlotFill( + 'WooProductMoreMenuItem' +); + +Fill.Slot = ( { fillProps } ) => ( + + { ( fills ) => { + return isEmpty( fills ) ? null : <>{ fills }; + } } + +); + +export const WooProductMoreMenuItem = Fill as WooProductMoreMenuFill & { + Slot: WooProductMoreMenuSlot; +}; diff --git a/packages/js/product-editor/src/components/index.ts b/packages/js/product-editor/src/components/index.ts index 9c70b568fe7..8a1005c6a43 100644 --- a/packages/js/product-editor/src/components/index.ts +++ b/packages/js/product-editor/src/components/index.ts @@ -10,6 +10,7 @@ export { DetailsFeatureField as __experimentalDetailsFeatureField } from './deta export { DetailsCategoriesField as __experimentalDetailsCategoriesField } from './details-categories-field'; export { DetailsSummaryField as __experimentalDetailsSummaryField } from './details-summary-field'; export { DetailsDescriptionField as __experimentalDetailsDescriptionField } from './details-description-field'; +export { WooProductMoreMenuItem as __experimentalWooProductMoreMenuItem } from './header'; export { Editor as __experimentalEditor, ProductEditorSettings, diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-feedback-modal-container.tsx b/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-feedback-modal-container.tsx index 27b8d0f9f0a..41505f2f8b1 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-feedback-modal-container.tsx +++ b/plugins/woocommerce-admin/client/customer-effort-score-tracks/product-mvp-feedback-modal-container.tsx @@ -11,7 +11,9 @@ import { getAdminLink } from '@woocommerce/settings'; import { useFormContext } from '@woocommerce/components'; import { Product } from '@woocommerce/data'; -export const ProductMVPFeedbackModalContainer: React.FC = () => { +export const ProductMVPFeedbackModalContainer: React.FC< { + productId?: number; +} > = ( { productId: _productId } ) => { const { values } = useFormContext< Product >(); const { hideProductMVPFeedbackModal } = useDispatch( STORE_KEY ); const { isProductMVPModalVisible } = useSelect( ( select ) => { @@ -21,8 +23,10 @@ export const ProductMVPFeedbackModalContainer: React.FC = () => { }; } ); - const classicEditorUrl = values.id - ? getAdminLink( `post.php?post=${ values.id }&action=edit` ) + const productId = _productId ?? values.id; + + const classicEditorUrl = productId + ? getAdminLink( `post.php?post=${ productId }&action=edit` ) : getAdminLink( 'post-new.php?post_type=product' ); const recordScore = ( checked: string[], comments: string ) => { diff --git a/plugins/woocommerce-admin/client/products/fills/more-menu-items/classic-editor-menu-item.tsx b/plugins/woocommerce-admin/client/products/fills/more-menu-items/classic-editor-menu-item.tsx new file mode 100644 index 00000000000..61bd566ec27 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fills/more-menu-items/classic-editor-menu-item.tsx @@ -0,0 +1,75 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { getAdminLink } from '@woocommerce/settings'; +import { OPTIONS_STORE_NAME } from '@woocommerce/data'; +import { MenuItem } from '@wordpress/components'; +import { + ALLOW_TRACKING_OPTION_NAME, + STORE_KEY as CES_STORE_KEY, +} from '@woocommerce/customer-effort-score'; + +/** + * Internal dependencies + */ +import { ClassicEditorIcon } from '../../images/classic-editor-icon'; +import { NEW_PRODUCT_MANAGEMENT } from '~/customer-effort-score-tracks/product-mvp-ces-footer'; + +export const ClassicEditorMenuItem = ( { + onClose, + productId, +}: { + productId: number; + onClose: () => void; +} ) => { + const { showProductMVPFeedbackModal } = useDispatch( CES_STORE_KEY ); + const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); + + const { allowTracking, resolving: isLoading } = useSelect( ( select ) => { + const { getOption, hasFinishedResolution } = + select( OPTIONS_STORE_NAME ); + + const allowTrackingOption = + getOption( ALLOW_TRACKING_OPTION_NAME ) || 'no'; + + const resolving = ! hasFinishedResolution( 'getOption', [ + ALLOW_TRACKING_OPTION_NAME, + ] ); + + return { + allowTracking: allowTrackingOption === 'yes', + resolving, + }; + } ); + + const classicEditorUrl = productId + ? getAdminLink( `post.php?post=${ productId }&action=edit` ) + : getAdminLink( 'post-new.php?post_type=product' ); + + if ( isLoading ) { + return null; + } + + return ( + { + if ( allowTracking ) { + updateOptions( { + [ NEW_PRODUCT_MANAGEMENT ]: 'no', + } ); + showProductMVPFeedbackModal(); + onClose(); + } else { + window.location.href = classicEditorUrl; + onClose(); + } + } } + icon={ } + iconPosition="right" + > + { __( 'Use the classic editor', 'woocommerce' ) } + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/fills/more-menu-items/feedback-menu-item.tsx b/plugins/woocommerce-admin/client/products/fills/more-menu-items/feedback-menu-item.tsx new file mode 100644 index 00000000000..2cf6730a914 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fills/more-menu-items/feedback-menu-item.tsx @@ -0,0 +1,50 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { MenuItem } from '@wordpress/components'; +import { useDispatch } from '@wordpress/data'; +import { STORE_KEY as CES_STORE_KEY } from '@woocommerce/customer-effort-score'; + +/** + * Internal dependencies + */ +import { FeedbackIcon } from '../../images/feedback-icon'; + +export const FeedbackMenuItem = ( { onClose }: { onClose: () => void } ) => { + const { showCesModal } = useDispatch( CES_STORE_KEY ); + + return ( + { + showCesModal( + { + action: 'new_product', + title: __( + "How's your experience with the product editor?", + 'woocommerce' + ), + firstQuestion: __( + 'The product editing screen is easy to use', + 'woocommerce' + ), + secondQuestion: __( + "The product editing screen's functionality meets my needs", + 'woocommerce' + ), + }, + { shouldShowComments: () => true }, + { + type: 'snackbar', + icon: 🌟, + } + ); + onClose(); + } } + icon={ } + iconPosition="right" + > + { __( 'Share feedback', 'woocommerce' ) } + + ); +}; diff --git a/plugins/woocommerce-admin/client/products/fills/more-menu-items/index.ts b/plugins/woocommerce-admin/client/products/fills/more-menu-items/index.ts new file mode 100644 index 00000000000..c180f511b00 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fills/more-menu-items/index.ts @@ -0,0 +1,2 @@ +export * from './feedback-menu-item'; +export * from './classic-editor-menu-item'; diff --git a/plugins/woocommerce-admin/client/products/fills/product-block-editor-fills.tsx b/plugins/woocommerce-admin/client/products/fills/product-block-editor-fills.tsx new file mode 100644 index 00000000000..e6fad9f2587 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/fills/product-block-editor-fills.tsx @@ -0,0 +1,54 @@ +/** + * External dependencies + */ +import { __experimentalWooProductMoreMenuItem as WooProductMoreMenuItem } from '@woocommerce/product-editor'; +import { registerPlugin } from '@wordpress/plugins'; +import { WooHeaderItem } from '@woocommerce/admin-layout'; + +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore No types for this exist yet. +// eslint-disable-next-line @woocommerce/dependency-group +import { useEntityProp } from '@wordpress/core-data'; + +/** + * Internal dependencies + */ +import { ProductMVPFeedbackModalContainer } from '~/customer-effort-score-tracks/product-mvp-feedback-modal-container'; +import { + FeedbackMenuItem, + ClassicEditorMenuItem, +} from '../fills/more-menu-items'; + +const MoreMenuFill = ( { onClose }: { onClose: () => void } ) => { + const [ id ] = useEntityProp( 'postType', 'product', 'id' ); + + return ( + <> + + + + ); +}; + +const ProductHeaderFill = () => { + const [ id ] = useEntityProp( 'postType', 'product', 'id' ); + + return ; +}; + +registerPlugin( 'wc-admin-more-menu', { + // @ts-expect-error 'scope' does exist. @types/wordpress__plugins is outdated. + scope: 'woocommerce-product-block-editor', + render: () => ( + <> + + { ( { onClose }: { onClose: () => void } ) => ( + + ) } + + + + + + ), +} ); diff --git a/plugins/woocommerce-admin/client/products/product-more-menu.tsx b/plugins/woocommerce-admin/client/products/product-more-menu.tsx index a5e38a85718..887a77138da 100644 --- a/plugins/woocommerce-admin/client/products/product-more-menu.tsx +++ b/plugins/woocommerce-admin/client/products/product-more-menu.tsx @@ -2,53 +2,39 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; -import { DropdownMenu, MenuItem } from '@wordpress/components'; -import { useDispatch, useSelect } from '@wordpress/data'; +import { DropdownMenu } from '@wordpress/components'; +import { useFormContext } from '@woocommerce/components'; +import { useSelect } from '@wordpress/data'; import { WooHeaderItem } from '@woocommerce/admin-layout'; -import { getAdminLink } from '@woocommerce/settings'; import { moreVertical } from '@wordpress/icons'; import { OPTIONS_STORE_NAME, Product } from '@woocommerce/data'; -import { useFormContext } from '@woocommerce/components'; -import { - ALLOW_TRACKING_OPTION_NAME, - STORE_KEY as CES_STORE_KEY, -} from '@woocommerce/customer-effort-score'; +import { ALLOW_TRACKING_OPTION_NAME } from '@woocommerce/customer-effort-score'; /** * Internal dependencies */ -import { ClassicEditorIcon } from './images/classic-editor-icon'; -import { FeedbackIcon } from './images/feedback-icon'; -import { NEW_PRODUCT_MANAGEMENT } from '~/customer-effort-score-tracks/product-mvp-ces-footer'; + +import { + FeedbackMenuItem, + ClassicEditorMenuItem, +} from './fills/more-menu-items'; + import './product-more-menu.scss'; export const ProductMoreMenu = () => { const { values } = useFormContext< Product >(); - const { showCesModal, showProductMVPFeedbackModal } = - useDispatch( CES_STORE_KEY ); - const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); - - const { allowTracking, resolving: isLoading } = useSelect( ( select ) => { - const { getOption, hasFinishedResolution } = - select( OPTIONS_STORE_NAME ); - - const allowTrackingOption = - getOption( ALLOW_TRACKING_OPTION_NAME ) || 'no'; + const { resolving: isLoading } = useSelect( ( select ) => { + const { hasFinishedResolution } = select( OPTIONS_STORE_NAME ); const resolving = ! hasFinishedResolution( 'getOption', [ ALLOW_TRACKING_OPTION_NAME, ] ); return { - allowTracking: allowTrackingOption === 'yes', resolving, }; } ); - const classEditorUrl = values.id - ? getAdminLink( `post.php?post=${ values.id }&action=edit` ) - : getAdminLink( 'post-new.php?post_type=product' ); - if ( isLoading ) { return null; } @@ -63,55 +49,11 @@ export const ProductMoreMenu = () => { > { ( { onClose } ) => ( <> - { - showCesModal( - { - action: 'new_product', - title: __( - "How's your experience with the product editor?", - 'woocommerce' - ), - firstQuestion: __( - 'The product editing screen is easy to use', - 'woocommerce' - ), - secondQuestion: __( - "The product editing screen's functionality meets my needs", - 'woocommerce' - ), - }, - { shouldShowComments: () => true }, - { - type: 'snackbar', - icon: 🌟, - } - ); - onClose(); - } } - icon={ } - iconPosition="right" - > - { __( 'Share feedback', 'woocommerce' ) } - - { - if ( allowTracking ) { - updateOptions( { - [ NEW_PRODUCT_MANAGEMENT ]: 'no', - } ); - showProductMVPFeedbackModal(); - onClose(); - } else { - window.location.href = classEditorUrl; - onClose(); - } - } } - icon={ } - iconPosition="right" - > - { __( 'Use the classic editor', 'woocommerce' ) } - + + ) } diff --git a/plugins/woocommerce-admin/client/products/product-page.tsx b/plugins/woocommerce-admin/client/products/product-page.tsx index ed004455594..6b414978f5a 100644 --- a/plugins/woocommerce-admin/client/products/product-page.tsx +++ b/plugins/woocommerce-admin/client/products/product-page.tsx @@ -16,6 +16,7 @@ import { useProductEntityRecord } from './hooks/use-product-entity-record'; import './product-page.scss'; import './product-block-page.scss'; +import './fills/product-block-editor-fills'; declare const productBlockEditorSettings: ProductEditorSettings; diff --git a/plugins/woocommerce/changelog/add-migrate-more-menu-37097 b/plugins/woocommerce/changelog/add-migrate-more-menu-37097 new file mode 100644 index 00000000000..66bbc13845c --- /dev/null +++ b/plugins/woocommerce/changelog/add-migrate-more-menu-37097 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Refactoring product editor more menu items, and using in block editor slot fills. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18ea03d060e..1019537f1c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1383,6 +1383,8 @@ importers: '@types/wordpress__data': ^6.0.2 '@types/wordpress__editor': ^13.0.0 '@types/wordpress__media-utils': ^3.0.0 + '@types/wordpress__plugins': ^3.0.0 + '@woocommerce/admin-layout': workspace:* '@woocommerce/components': workspace:* '@woocommerce/currency': workspace:* '@woocommerce/data': workspace:^4.1.0 @@ -1407,6 +1409,7 @@ importers: '@wordpress/interface': wp-6.0 '@wordpress/keyboard-shortcuts': wp-6.0 '@wordpress/media-utils': wp-6.0 + '@wordpress/plugins': wp-6.0 '@wordpress/url': wp-6.0 classnames: ^2.3.1 concurrently: ^7.0.0 @@ -1431,6 +1434,7 @@ importers: '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym '@types/lodash': 4.14.184 '@types/wordpress__blocks': 11.0.7_sfoxds7t5ydpegc3knd667wn6m + '@woocommerce/admin-layout': link:../admin-layout '@woocommerce/components': link:../components '@woocommerce/currency': link:../currency '@woocommerce/data': link:../data @@ -1452,6 +1456,7 @@ importers: '@wordpress/interface': 4.5.6_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/keyboard-shortcuts': 3.4.1_react@17.0.2 '@wordpress/media-utils': 3.4.1 + '@wordpress/plugins': 4.4.3_react@17.0.2 '@wordpress/url': 3.7.1 classnames: 2.3.1 lodash: 4.17.21 @@ -1473,6 +1478,7 @@ importers: '@types/wordpress__data': 6.0.2 '@types/wordpress__editor': 13.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__media-utils': 3.0.0_sfoxds7t5ydpegc3knd667wn6m + '@types/wordpress__plugins': 3.0.0_sfoxds7t5ydpegc3knd667wn6m '@woocommerce/eslint-plugin': link:../eslint-plugin '@woocommerce/internal-style-build': link:../internal-style-build '@wordpress/browserslist-config': 4.1.3 @@ -2723,7 +2729,6 @@ packages: /@babel/compat-data/7.17.7: resolution: {integrity: sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==} engines: {node: '>=6.9.0'} - dev: true /@babel/compat-data/7.19.3: resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} @@ -2869,7 +2874,7 @@ packages: resolution: {integrity: sha512-oLcVCTeIFadUoArDTwpluncplrYBmTCCZZgXCbgNGvOBBiSDDK3eWO4b/+eOTli5tKv1lg+a5/NAXg+nTcei1w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 jsesc: 2.5.2 source-map: 0.5.7 @@ -2901,7 +2906,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.3 - dev: true /@babel/helper-annotate-as-pure/7.18.6: resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==} @@ -2928,6 +2932,45 @@ packages: browserslist: 4.19.3 semver: 6.3.0 + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.16.12 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: false + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.17.8 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.19.3 + semver: 6.3.0 + dev: true + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.21.3: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -3007,6 +3050,42 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.16.12: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.18.9 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -3103,7 +3182,7 @@ packages: '@babel/core': 7.21.3 '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.19.1 @@ -3298,7 +3377,6 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.21.3 - dev: true /@babel/helper-module-imports/7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} @@ -3327,7 +3405,7 @@ packages: dependencies: '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-module-imports': 7.18.6 - '@babel/helper-simple-access': 7.18.6 + '@babel/helper-simple-access': 7.20.2 '@babel/helper-split-export-declaration': 7.18.6 '@babel/helper-validator-identifier': 7.19.1 '@babel/template': 7.20.7 @@ -3392,7 +3470,6 @@ packages: '@babel/types': 7.21.3 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.12.9: resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==} @@ -3488,10 +3565,6 @@ packages: dependencies: '@babel/types': 7.21.3 - /@babel/helper-string-parser/7.18.10: - resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==} - engines: {node: '>=6.9.0'} - /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} @@ -3556,7 +3629,7 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 /@babel/parser/7.19.3: resolution: {integrity: sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==} @@ -3572,19 +3645,9 @@ packages: dependencies: '@babel/types': 7.21.3 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.21.3: + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: @@ -3592,8 +3655,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -3602,8 +3665,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 @@ -3612,6 +3675,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==} engines: {node: '>=6.9.0'} @@ -3621,21 +3694,9 @@ packages: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.21.3: + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 - dev: true - - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: @@ -3645,8 +3706,8 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 @@ -3657,8 +3718,8 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 dev: false - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 @@ -3669,6 +3730,18 @@ packages: '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.21.3 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==} engines: {node: '>=6.9.0'} @@ -3693,6 +3766,48 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.17.8 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.21.3: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} engines: {node: '>=6.9.0'} @@ -3721,36 +3836,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.16.12: - resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.17.8: - resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.21.3: resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} engines: {node: '>=6.9.0'} @@ -3777,6 +3862,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} engines: {node: '>=6.9.0'} @@ -3814,32 +3925,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} @@ -3852,23 +3937,9 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.21.3: + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: @@ -3880,8 +3951,8 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.16.12: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 @@ -3894,8 +3965,8 @@ packages: - supports-color dev: false - /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 @@ -3908,6 +3979,20 @@ packages: - supports-color dev: true + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.21.3: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==} engines: {node: '>=6.9.0'} @@ -3959,20 +4044,9 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.21.3: + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 - dev: true - - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -3981,8 +4055,8 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 dev: true - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -3992,8 +4066,8 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.16.12 dev: false - /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4003,6 +4077,17 @@ packages: '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==} engines: {node: '>=6.9.0'} @@ -4054,20 +4139,9 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.21.3: + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 - dev: true - - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -4076,8 +4150,8 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 dev: true - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4087,8 +4161,8 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.16.12 dev: false - /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4098,6 +4172,17 @@ packages: '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==} engines: {node: '>=6.9.0'} @@ -4118,20 +4203,9 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.21.3: + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 - dev: true - - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -4140,8 +4214,8 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 dev: true - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4151,8 +4225,8 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.16.12 dev: false - /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4162,6 +4236,17 @@ packages: '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==} engines: {node: '>=6.9.0'} @@ -4182,20 +4267,9 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 - /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.21.3: + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 - dev: true - - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -4204,8 +4278,8 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 dev: true - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4215,8 +4289,8 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.16.12 dev: false - /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4226,6 +4300,17 @@ packages: '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==} engines: {node: '>=6.9.0'} @@ -4246,6 +4331,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} engines: {node: '>=6.9.0'} @@ -4277,28 +4384,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.16.12 - dev: false - - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 - dev: true - /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==} engines: {node: '>=6.9.0'} @@ -4319,20 +4404,9 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 - /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.21.3: + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 - dev: true - - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -4341,8 +4415,8 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 dev: true - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4352,8 +4426,8 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.16.12 dev: false - /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -4363,6 +4437,17 @@ packages: '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 dev: true + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.3 + dev: true + /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==} engines: {node: '>=6.9.0'} @@ -4397,6 +4482,34 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.12.9 + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.12.9: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.16.12: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} engines: {node: '>=6.9.0'} @@ -4438,34 +4551,6 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - dev: false - - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - dev: true - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} engines: {node: '>=6.9.0'} @@ -4489,6 +4574,39 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 + dev: false + + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -4510,28 +4628,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.16.12 - dev: false - - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 - dev: true - /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==} engines: {node: '>=6.9.0'} @@ -4553,6 +4649,30 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 + dev: false + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} engines: {node: '>=6.9.0'} @@ -4634,6 +4754,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.12.9: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.16.12: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.8: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} engines: {node: '>=6.9.0'} @@ -4660,45 +4806,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4711,6 +4818,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} engines: {node: '>=6.9.0'} @@ -4741,51 +4878,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4810,6 +4902,39 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -5608,6 +5733,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} engines: {node: '>=6.9.0'} @@ -5637,26 +5782,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -5679,6 +5804,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} engines: {node: '>=6.9.0'} @@ -5700,7 +5853,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-module-imports': 7.18.6 + '@babel/helper-module-imports': 7.16.7 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-remap-async-to-generator': 7.16.8 transitivePeerDependencies: @@ -5720,34 +5873,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.16.12 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-module-imports': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.17.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==} engines: {node: '>=6.9.0'} @@ -5770,6 +5895,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -5789,26 +5944,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==} engines: {node: '>=6.9.0'} @@ -5827,6 +5962,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} engines: {node: '>=6.9.0'} @@ -5856,26 +6011,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} engines: {node: '>=6.9.0'} @@ -5902,6 +6037,44 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} engines: {node: '>=6.9.0'} @@ -5959,46 +6132,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.17.8: - resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.21.3: resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} engines: {node: '>=6.9.0'} @@ -6027,6 +6160,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} engines: {node: '>=6.9.0'} @@ -6046,26 +6209,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==} engines: {node: '>=6.9.0'} @@ -6084,6 +6227,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} @@ -6113,26 +6276,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.16.12: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.17.8: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.21.3: resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} engines: {node: '>=6.9.0'} @@ -6152,6 +6295,39 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -6214,19 +6390,9 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -6234,8 +6400,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6244,8 +6410,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6254,6 +6420,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==} engines: {node: '>=6.9.0'} @@ -6273,6 +6449,39 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -6294,28 +6503,6 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==} engines: {node: '>=6.9.0'} @@ -6365,6 +6552,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} engines: {node: '>=6.9.0'} @@ -6394,26 +6601,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.16.12: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.17.8: - resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.21.3: resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==} engines: {node: '>=6.9.0'} @@ -6433,6 +6620,42 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -6456,30 +6679,6 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==} engines: {node: '>=6.9.0'} @@ -6500,6 +6699,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} engines: {node: '>=6.9.0'} @@ -6519,26 +6748,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-literals/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==} engines: {node: '>=6.9.0'} @@ -6557,6 +6766,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -6576,26 +6815,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==} engines: {node: '>=6.9.0'} @@ -6618,23 +6837,9 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.19.0 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -6646,8 +6851,8 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6660,8 +6865,8 @@ packages: - supports-color dev: false - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6674,6 +6879,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} engines: {node: '>=6.9.0'} @@ -6701,6 +6920,36 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.16.12: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: false + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} @@ -6739,41 +6988,11 @@ packages: '@babel/core': 7.12.9 '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 + '@babel/helper-simple-access': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -6783,7 +7002,7 @@ packages: '@babel/core': 7.21.3 '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-simple-access': 7.18.6 + '@babel/helper-simple-access': 7.20.2 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -6803,25 +7022,9 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.21.3: + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.12.9: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.12.9: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -6835,8 +7038,8 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.16.12: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6851,8 +7054,8 @@ packages: - supports-color dev: false - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.17.8: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6867,6 +7070,22 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.21.3: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.21.3: resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} engines: {node: '>=6.9.0'} @@ -6894,22 +7113,9 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.19.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -6920,8 +7126,8 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6933,8 +7139,8 @@ packages: - supports-color dev: false - /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6946,6 +7152,19 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.19.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==} engines: {node: '>=6.9.0'} @@ -6967,6 +7186,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.16.12: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + dev: false + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.8: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + dev: true + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.21.3: resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} engines: {node: '>=6.9.0'} @@ -6987,28 +7236,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.16.12: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.17.8: - resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.21.3: resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==} engines: {node: '>=6.9.0'} @@ -7028,19 +7255,9 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -7048,8 +7265,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -7058,8 +7275,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -7068,6 +7285,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==} engines: {node: '>=6.9.0'} @@ -7089,6 +7316,45 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -7114,32 +7380,6 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: false - - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-replace-supers': 7.19.1 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==} engines: {node: '>=6.9.0'} @@ -7161,6 +7401,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} engines: {node: '>=6.9.0'} @@ -7228,6 +7488,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -7247,26 +7537,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==} engines: {node: '>=6.9.0'} @@ -7419,7 +7689,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-module-imports': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.3 @@ -7497,6 +7767,36 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + regenerator-transform: 0.14.5 + dev: false + + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + regenerator-transform: 0.14.5 + dev: true + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} engines: {node: '>=6.9.0'} @@ -7507,39 +7807,6 @@ packages: regenerator-transform: 0.14.5 dev: true - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: true - - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: false - - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - regenerator-transform: 0.15.0 - dev: true - /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==} engines: {node: '>=6.9.0'} @@ -7559,19 +7826,9 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -7579,8 +7836,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -7589,8 +7846,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -7599,6 +7856,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==} engines: {node: '>=6.9.0'} @@ -7632,9 +7899,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.16.12 - '@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.12 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 semver: 6.3.0 @@ -7649,9 +7916,9 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.21.3 + '@babel/helper-module-imports': 7.18.6 + '@babel/helper-plugin-utils': 7.19.0 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.3 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.21.3 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.21.3 semver: 6.3.0 @@ -7700,6 +7967,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} engines: {node: '>=6.9.0'} @@ -7729,26 +8016,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==} engines: {node: '>=6.9.0'} @@ -7768,6 +8035,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: true + + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: false + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} engines: {node: '>=6.9.0'} @@ -7800,28 +8089,6 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.16.12: - resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: false - - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.17.8: - resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 - dev: true - /@babel/plugin-transform-spread/7.19.0_@babel+core@7.21.3: resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==} engines: {node: '>=6.9.0'} @@ -7841,6 +8108,36 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -7860,26 +8157,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==} engines: {node: '>=6.9.0'} @@ -7898,6 +8175,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} engines: {node: '>=6.9.0'} @@ -7927,26 +8224,6 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==} engines: {node: '>=6.9.0'} @@ -7965,19 +8242,9 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -7985,8 +8252,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.16.12: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -7995,8 +8262,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -8005,6 +8272,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.21.3: resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==} engines: {node: '>=6.9.0'} @@ -8089,19 +8366,9 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.21.3: + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.12.9: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.12.9: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} - engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: @@ -8109,8 +8376,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.16.12: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -8119,8 +8386,8 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: false - /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.17.8: - resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -8129,6 +8396,16 @@ packages: '@babel/helper-plugin-utils': 7.19.0 dev: true + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.21.3: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.21.3: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -8148,6 +8425,39 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.16.12: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.16.12 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.19.0 + dev: false + + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.19.0 + dev: true + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -8169,28 +8479,6 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.16.12: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.16.12 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - dev: false - - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - dev: true - /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.21.3: resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==} engines: {node: '>=6.9.0'} @@ -8290,28 +8578,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.12.9 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.12.9 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.12.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 @@ -8326,44 +8614,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.9 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.12.9 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.12.9 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.21.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.12.9 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -8375,28 +8663,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.17.7 '@babel/core': 7.16.12 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.16.12 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.16.12 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.16.12 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.16.12 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.16.12 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.16.12 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.16.12 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.16.12 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.16.12 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.16.12 @@ -8411,44 +8699,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.16.12 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.16.12 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.16.12 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.16.12 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.16.12 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.16.12 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.16.12 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.16.12 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.16.12 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.16.12 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.16.12 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.16.12 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.16.12 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.16.12 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.16.12 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.16.12 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.16.12 '@babel/preset-modules': 0.1.5_@babel+core@7.16.12 - '@babel/types': 7.21.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.16.12 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.16.12 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.16.12 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.16.12 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -8460,28 +8748,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.17.7 '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.17.8 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.17.8 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.8 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.8 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.17.8 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.8 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.8 @@ -8496,44 +8784,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.8 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.17.8 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.17.8 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.17.8 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.17.8 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.8 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.17.8 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.17.8 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.17.8 '@babel/preset-modules': 0.1.5_@babel+core@7.17.8 - '@babel/types': 7.21.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -8979,7 +9267,7 @@ packages: '@babel/code-frame': 7.18.6 '@babel/generator': 7.21.3 '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.19.0 + '@babel/helper-function-name': 7.21.0 '@babel/helper-hoist-variables': 7.18.6 '@babel/helper-split-export-declaration': 7.18.6 '@babel/parser': 7.21.3 @@ -9024,7 +9312,7 @@ packages: resolution: {integrity: sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.18.10 + '@babel/helper-string-parser': 7.19.4 '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 @@ -20719,6 +21007,19 @@ packages: - supports-color dev: false + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: + resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.17.8 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.21.3: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: @@ -20757,19 +21058,6 @@ packages: - supports-color dev: false - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.17.8: - resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.17.8 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 - semver: 6.3.0 - transitivePeerDependencies: - - supports-color - dev: true - /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.21.3: resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==} peerDependencies: @@ -23040,7 +23328,6 @@ packages: dependencies: browserslist: 4.19.3 semver: 7.0.0 - dev: true /core-js-compat/3.25.5: resolution: {integrity: sha512-ovcyhs2DEBUIE0MGEKHP4olCUW/XYte3Vroyxuh38rD1wAO4dHohsovUC4eAOuzFxE6b+RXvBU3UZ9o0YhUTkA==} @@ -25018,11 +25305,11 @@ packages: eslint-import-resolver-node: 0.3.6 eslint-module-utils: 2.7.3_lkzaig2qiyp6elizstfbgvzhie has: 1.0.3 - is-core-module: 2.8.0 + is-core-module: 2.10.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -25049,11 +25336,11 @@ packages: eslint-import-resolver-node: 0.3.6 eslint-module-utils: 2.7.3_e3tsxhaih3omednm7ewu7jlg54 has: 1.0.3 - is-core-module: 2.8.0 + is-core-module: 2.10.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -33625,6 +33912,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} From 59c94ce24af2cb36df25a62553b1f11f09d34f81 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 22 Mar 2023 18:35:06 +0800 Subject: [PATCH 1187/1680] Fix build errors after merging from trunk. --- .../CreateNewCampaignModal/CreateNewCampaignModal.test.tsx | 6 +++--- .../CreateNewCampaignModal/CreateNewCampaignModal.tsx | 5 +++-- .../overview-multichannel/MarketingOverviewMultichannel.tsx | 5 +++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx index 1f1e754ec4d..e2639d7b2ad 100644 --- a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx +++ b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx @@ -11,7 +11,7 @@ import { useCampaignTypes, useRecommendedChannels, useRegisteredChannels, - useInstalledPlugins, + useInstalledPluginsWithoutChannels, } from '~/marketing/hooks'; import { CreateNewCampaignModal } from './CreateNewCampaignModal'; @@ -29,7 +29,7 @@ jest.mock( '~/marketing/hooks', () => ( { useCampaignTypes: jest.fn(), useRecommendedChannels: jest.fn(), useRegisteredChannels: jest.fn(), - useInstalledPlugins: jest.fn(), + useInstalledPluginsWithoutChannels: jest.fn(), } ) ); const google = { @@ -83,7 +83,7 @@ describe( 'CreateNewCampaignModal component', () => { ( useRegisteredChannels as jest.Mock ).mockReturnValue( { refetch: jest.fn(), } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { + ( useInstalledPluginsWithoutChannels as jest.Mock ).mockReturnValue( { loadInstalledPluginsAfterActivation: jest.fn(), } ); } ); diff --git a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx index 3a3b5c20a9e..09ebf5aa7a5 100644 --- a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx +++ b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx @@ -21,7 +21,7 @@ import { useRecommendedChannels, useCampaignTypes, useRegisteredChannels, - useInstalledPlugins, + useInstalledPluginsWithoutChannels, } from '~/marketing/hooks'; import { SmartPluginCardBody } from '~/marketing/components'; import './CreateNewCampaignModal.scss'; @@ -44,7 +44,8 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { useCampaignTypes(); const { refetch: refetchRegisteredChannels } = useRegisteredChannels(); const { data: recommendedChannels } = useRecommendedChannels(); - const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); + const { loadInstalledPluginsAfterActivation } = + useInstalledPluginsWithoutChannels(); const onInstalledAndActivated = ( pluginSlug: string ) => { refetchCampaignTypes(); diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index da01976d796..3f202877447 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -16,7 +16,7 @@ import { useRegisteredChannels, useRecommendedChannels, useCampaignTypes, - useInstalledPlugins, + useInstalledPluginsWithoutChannels, } from '~/marketing/hooks'; import { getAdminSetting } from '~/utils/admin-settings'; import { IntroductionBanner } from './IntroductionBanner'; @@ -46,7 +46,8 @@ export const MarketingOverviewMultichannel: React.FC = () => { } = useRegisteredChannels(); const { loading: loadingRecommended, data: dataRecommended } = useRecommendedChannels(); - const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); + const { loadInstalledPluginsAfterActivation } = + useInstalledPluginsWithoutChannels(); const { currentUserCan } = useUser(); const channelsRef = useRef< ChannelsRef >( null ); From 14533515216dbbbc3f0cba253f7780086cad2e46 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 22 Mar 2023 18:38:43 +0800 Subject: [PATCH 1188/1680] Simplify tests for CreateNewCampaignModal. --- .../CreateNewCampaignModal.test.tsx | 20 +++---------------- 1 file changed, 3 insertions(+), 17 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx index e2639d7b2ad..54a389a93ed 100644 --- a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx +++ b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx @@ -7,12 +7,7 @@ import userEvent from '@testing-library/user-event'; /** * Internal dependencies */ -import { - useCampaignTypes, - useRecommendedChannels, - useRegisteredChannels, - useInstalledPluginsWithoutChannels, -} from '~/marketing/hooks'; +import { useCampaignTypes, useRecommendedChannels } from '~/marketing/hooks'; import { CreateNewCampaignModal } from './CreateNewCampaignModal'; jest.mock( '@woocommerce/components', () => { @@ -28,8 +23,8 @@ jest.mock( '@woocommerce/components', () => { jest.mock( '~/marketing/hooks', () => ( { useCampaignTypes: jest.fn(), useRecommendedChannels: jest.fn(), - useRegisteredChannels: jest.fn(), - useInstalledPluginsWithoutChannels: jest.fn(), + useRegisteredChannels: jest.fn( () => ( {} ) ), + useInstalledPluginsWithoutChannels: jest.fn( () => ( {} ) ), } ) ); const google = { @@ -79,15 +74,6 @@ const amazon = { }; describe( 'CreateNewCampaignModal component', () => { - beforeEach( () => { - ( useRegisteredChannels as jest.Mock ).mockReturnValue( { - refetch: jest.fn(), - } ); - ( useInstalledPluginsWithoutChannels as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), - } ); - } ); - it( 'renders new campaign types with recommended channels', async () => { ( useCampaignTypes as jest.Mock ).mockReturnValue( { data: [ google ], From 524ad3db3ee3746ad8d34a07612265d680d13e1c Mon Sep 17 00:00:00 2001 From: rodelgc Date: Wed, 22 Mar 2023 19:12:23 +0800 Subject: [PATCH 1189/1680] Test artifact upload --- .../scripts/upload-allure-artifact.sh | 7 +++---- .github/workflows/smoke-test-release.yml | 4 ++++ 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh index 19308d7845a..bc3a2cd810b 100644 --- a/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh +++ b/.github/actions/tests/upload-allure-files-to-bucket/scripts/upload-allure-artifact.sh @@ -2,8 +2,7 @@ s3_upload () { aws s3 cp "$1" "$2" \ - --recursive \ - --only-show-errors + --recursive } upload_allure_results () { @@ -14,14 +13,14 @@ upload_allure_results () { SOURCE="$ALLURE_RESULTS_DIR" DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$ARTIFACT_NAME/allure-results" - s3_upload $SOURCE $DESTINATION + s3_upload "$SOURCE" "$DESTINATION" } upload_allure_report () { SOURCE="$ALLURE_REPORT_DIR" DESTINATION="$S3_BUCKET/artifacts/$GITHUB_RUN_ID/$ARTIFACT_NAME/allure-report" - s3_upload $SOURCE $DESTINATION + s3_upload "$SOURCE" "$DESTINATION" } upload_allure_results diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index bc07de36ba7..7378f24dea5 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -203,6 +203,7 @@ jobs: with: report-name: e2e-wp-latest--partial--run-${{ github.run_number }} playwright-config: ignore-plugin-tests.playwright.config.js + tests: basic.spec.js # mytodo remove this env: ADMIN_PASSWORD: ${{ secrets.RELEASE_TEST_ADMIN_PASSWORD }} ADMIN_USER: ${{ secrets.RELEASE_TEST_ADMIN_USER }} @@ -405,6 +406,7 @@ jobs: DEFAULT_TIMEOUT_OVERRIDE: 120000 with: report-name: ${{ env.E2E_WP_LATEST_X_ARTIFACT }} + tests: basic.spec.js # mytodo remove this - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) @@ -527,6 +529,7 @@ jobs: E2E_MAX_FAILURES: 15 with: report-name: ${{ env.E2E_ARTIFACT }} + tests: basic.spec.js # mytodo remove this - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) @@ -626,6 +629,7 @@ jobs: with: playwright-config: ignore-plugin-tests.playwright.config.js report-name: ${{ env.ARTIFACT_NAME }} + tests: basic.spec.js # mytodo remove this env: E2E_MAX_FAILURES: 15 From ef1f1c37573a9797a9ef6fb74ad69699d7988fa6 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Wed, 22 Mar 2023 19:38:01 +0800 Subject: [PATCH 1190/1680] Re-enable all tests --- .github/workflows/smoke-test-release.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/workflows/smoke-test-release.yml b/.github/workflows/smoke-test-release.yml index 7378f24dea5..bc07de36ba7 100644 --- a/.github/workflows/smoke-test-release.yml +++ b/.github/workflows/smoke-test-release.yml @@ -203,7 +203,6 @@ jobs: with: report-name: e2e-wp-latest--partial--run-${{ github.run_number }} playwright-config: ignore-plugin-tests.playwright.config.js - tests: basic.spec.js # mytodo remove this env: ADMIN_PASSWORD: ${{ secrets.RELEASE_TEST_ADMIN_PASSWORD }} ADMIN_USER: ${{ secrets.RELEASE_TEST_ADMIN_USER }} @@ -406,7 +405,6 @@ jobs: DEFAULT_TIMEOUT_OVERRIDE: 120000 with: report-name: ${{ env.E2E_WP_LATEST_X_ARTIFACT }} - tests: basic.spec.js # mytodo remove this - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) @@ -529,7 +527,6 @@ jobs: E2E_MAX_FAILURES: 15 with: report-name: ${{ env.E2E_ARTIFACT }} - tests: basic.spec.js # mytodo remove this - name: Upload Allure artifacts to bucket if: success() || ( failure() && steps.run-e2e-composite-action.conclusion == 'failure' ) @@ -629,7 +626,6 @@ jobs: with: playwright-config: ignore-plugin-tests.playwright.config.js report-name: ${{ env.ARTIFACT_NAME }} - tests: basic.spec.js # mytodo remove this env: E2E_MAX_FAILURES: 15 From 9bc58b8773cdf1fd39472b24d03d33556eeb717b Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Wed, 22 Mar 2023 12:42:43 +0100 Subject: [PATCH 1191/1680] Upgrade PHPUnit to v9, and fix errors in tests. These errors are due to deprecations in PHPUnit 9, mostly due to the fact that comparions are now string on assertions: - Use assertArraySubset instead of arrayContains for checking subsets of associative arrays. - Use assertEqualsWithDelta for comparing floats (thorugh a new method in the base tests class, assertFloatEquals) - Convert ints to strings and viceversa before comparing. - Use assertArrayHasKey instead of assertContains for checking key existence in associative arrays. - Use assertStringContainsString instead of assertContains for checking substrings. --- plugins/woocommerce/composer.json | 4 +- plugins/woocommerce/composer.lock | 827 ++++++++++++------ .../framework/class-wc-unit-test-case.php | 14 + .../unit-tests/formatting/functions.php | 4 +- .../tests/legacy/unit-tests/order/coupons.php | 2 +- .../legacy/unit-tests/product/data-store.php | 1 + .../tests/legacy/unit-tests/product/data.php | 21 +- .../tests/legacy/unit-tests/queue/queue.php | 39 +- .../rest-api/Tests/Version2/coupons.php | 29 +- .../rest-api/Tests/Version2/customers.php | 17 +- .../Tests/Version2/payment-gateways.php | 18 +- .../rest-api/Tests/Version2/products.php | 13 +- .../rest-api/Tests/Version2/settings.php | 32 +- .../rest-api/Tests/Version2/system-status.php | 18 +- .../rest-api/Tests/Version3/coupons.php | 18 +- .../rest-api/Tests/Version3/customers.php | 32 +- .../Tests/Version3/payment-gateways.php | 18 +- .../rest-api/Tests/Version3/products.php | 11 +- .../rest-api/Tests/Version3/settings.php | 30 +- .../rest-api/Tests/Version3/system-status.php | 40 +- .../util/class-wc-tests-wc-query.php | 16 +- .../features/onboarding-tasks/task-list.php | 14 +- .../product-form/form-factory.php | 4 +- .../php/includes/wc-core-functions-test.php | 2 +- 24 files changed, 890 insertions(+), 334 deletions(-) diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 95c7323e2cc..225742532c5 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -27,8 +27,8 @@ "automattic/jetpack-changelogger": "^3.3.0", "bamarni/composer-bin-plugin": "^1.4", "dms/phpunit-arraysubset-asserts": "^0.4.0", - "phpunit/phpunit": "^8.0", - "sebastian/comparator": "3.0.3", + "phpunit/phpunit": "^9.0", + "sebastian/comparator": "^4.0", "yoast/phpunit-polyfills": "^1.0" }, "config": { diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index acfb3610f9e..9a3f0132464 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": "016052bc694d31115c569ed8a693f168", + "content-hash": "e0c3336f31efd98c606f8527c38e35d9", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -977,6 +977,62 @@ ], "time": "2023-03-08T13:26:56+00:00" }, + { + "name": "nikic/php-parser", + "version": "v4.15.4", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "reference": "6bb5176bc4af8bcb7d926f88718db9b96a2d4290", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.15.4" + }, + "time": "2023-03-05T19:49:14+00:00" + }, { "name": "phar-io/manifest", "version": "2.0.3", @@ -1090,40 +1146,44 @@ }, { "name": "phpunit/php-code-coverage", - "version": "7.0.15", + "version": "9.2.26", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "819f92bba8b001d4363065928088de22f25a3a48" + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", - "reference": "819f92bba8b001d4363065928088de22f25a3a48", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", + "reference": "443bc6912c9bd5b409254a40f4b0f4ced7c80ea1", "shasum": "" }, "require": { "ext-dom": "*", + "ext-libxml": "*", "ext-xmlwriter": "*", - "php": ">=7.2", - "phpunit/php-file-iterator": "^2.0.2", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-token-stream": "^3.1.3 || ^4.0", - "sebastian/code-unit-reverse-lookup": "^1.0.1", - "sebastian/environment": "^4.2.2", - "sebastian/version": "^2.0.1", - "theseer/tokenizer": "^1.1.3" + "nikic/php-parser": "^4.15", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" }, "require-dev": { - "phpunit/phpunit": "^8.2.2" + "phpunit/phpunit": "^9.3" }, "suggest": { - "ext-xdebug": "^2.7.2" + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "7.0-dev" + "dev-master": "9.2-dev" } }, "autoload": { @@ -1151,7 +1211,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.26" }, "funding": [ { @@ -1159,32 +1219,32 @@ "type": "github" } ], - "time": "2021-07-26T12:20:09+00:00" + "time": "2023-03-06T12:58:08+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -1211,7 +1271,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -1219,26 +1279,97 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { - "name": "phpunit/php-text-template", - "version": "1.2.1", + "name": "phpunit/php-invoker", + "version": "3.1.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", "shasum": "" }, "require": { - "php": ">=5.3.3" + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" }, "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, "autoload": { "classmap": [ "src/" @@ -1262,34 +1393,40 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1" + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" }, - "time": "2015-06-21T13:50:34+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" }, { "name": "phpunit/php-timer", - "version": "2.1.3", + "version": "5.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.1-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1315,7 +1452,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" }, "funding": [ { @@ -1323,112 +1460,54 @@ "type": "github" } ], - "time": "2020-11-30T08:20:02+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "4.0.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "reference": "a853a0e183b9db7eed023d7933a858fa1c8d25a3", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.3 || ^8.0" - }, - "require-dev": { - "phpunit/phpunit": "^9.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-token-stream/issues", - "source": "https://github.com/sebastianbergmann/php-token-stream/tree/master" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "abandoned": true, - "time": "2020-08-04T08:28:15+00:00" + "time": "2020-10-26T13:16:10+00:00" }, { "name": "phpunit/phpunit", - "version": "8.5.29", + "version": "9.6.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "e8c563c47a9a303662955518ca532b022b337f4d" + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/e8c563c47a9a303662955518ca532b022b337f4d", - "reference": "e8c563c47a9a303662955518ca532b022b337f4d", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86e761949019ae83f49240b2f2123fb5ab3b2fc5", + "reference": "86e761949019ae83f49240b2f2123fb5ab3b2fc5", "shasum": "" }, "require": { - "doctrine/instantiator": "^1.3.1", + "doctrine/instantiator": "^1.3.1 || ^2", "ext-dom": "*", "ext-json": "*", "ext-libxml": "*", "ext-mbstring": "*", "ext-xml": "*", "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.10.0", + "myclabs/deep-copy": "^1.10.1", "phar-io/manifest": "^2.0.3", "phar-io/version": "^3.0.2", - "php": ">=7.2", - "phpunit/php-code-coverage": "^7.0.12", - "phpunit/php-file-iterator": "^2.0.4", - "phpunit/php-text-template": "^1.2.1", - "phpunit/php-timer": "^2.1.2", - "sebastian/comparator": "^3.0.2", - "sebastian/diff": "^3.0.2", - "sebastian/environment": "^4.2.3", - "sebastian/exporter": "^3.1.2", - "sebastian/global-state": "^3.0.0", - "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^2.0.1", - "sebastian/type": "^1.1.3", - "sebastian/version": "^2.0.1" + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.5", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.2", + "sebastian/version": "^3.0.2" }, "suggest": { - "ext-soap": "*", - "ext-xdebug": "*", - "phpunit/php-invoker": "^2.0.0" + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" }, "bin": [ "phpunit" @@ -1436,10 +1515,13 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "8.5-dev" + "dev-master": "9.6-dev" } }, "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], "classmap": [ "src/" ] @@ -1464,7 +1546,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.29" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.5" }, "funding": [ { @@ -1474,9 +1556,13 @@ { "url": "https://github.com/sebastianbergmann", "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" } ], - "time": "2022-08-22T13:59:39+00:00" + "time": "2023-03-09T06:34:10+00:00" }, { "name": "psr/container", @@ -1527,29 +1613,141 @@ "time": "2021-03-05T17:36:06+00:00" }, { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "name": "sebastian/cli-parser", + "version": "1.0.1", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" } }, "autoload": { @@ -1571,7 +1769,7 @@ "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" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" }, "funding": [ { @@ -1579,34 +1777,34 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2020-09-28T05:30:19+00:00" }, { "name": "sebastian/comparator", - "version": "3.0.3", + "version": "4.0.8", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758" + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1071dfcef776a57013124ff35e1fc41ccd294758", - "reference": "1071dfcef776a57013124ff35e1fc41ccd294758", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", "shasum": "" }, "require": { - "php": ">=7.1", - "sebastian/diff": "^3.0", - "sebastian/exporter": "^3.1" + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" }, "require-dev": { - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1645,7 +1843,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/comparator/issues", - "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" }, "funding": [ { @@ -1653,33 +1851,90 @@ "type": "github" } ], - "time": "2020-11-30T08:04:30+00:00" + "time": "2022-09-14T12:41:17+00:00" }, { - "name": "sebastian/diff", - "version": "3.0.3", + "name": "sebastian/complexity", + "version": "2.0.2", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211" + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/14f72dd46eaf2f2293cbe79c93cc0bc43161a211", - "reference": "14f72dd46eaf2f2293cbe79c93cc0bc43161a211", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", "shasum": "" }, "require": { - "php": ">=7.1" + "nikic/php-parser": "^4.7", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5 || ^8.0", - "symfony/process": "^2 || ^3.3 || ^4" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" } }, "autoload": { @@ -1711,7 +1966,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" }, "funding": [ { @@ -1719,27 +1974,27 @@ "type": "github" } ], - "time": "2020-11-30T07:59:04+00:00" + "time": "2020-10-26T13:10:38+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "5.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^7.5" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-posix": "*" @@ -1747,7 +2002,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "4.2-dev" + "dev-master": "5.1-dev" } }, "autoload": { @@ -1774,7 +2029,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" }, "funding": [ { @@ -1782,34 +2037,34 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2023-02-03T06:03:51+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.5", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", + "reference": "ac230ed27f0f98f597c8a2b6eb7ac563af5e5b9d", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-mbstring": "*", - "phpunit/phpunit": "^8.5" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.1.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -1844,14 +2099,14 @@ } ], "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", + "homepage": "https://www.github.com/sebastianbergmann/exporter", "keywords": [ "export", "exporter" ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.5" }, "funding": [ { @@ -1859,30 +2114,30 @@ "type": "github" } ], - "time": "2022-09-14T06:00:17+00:00" + "time": "2022-09-14T06:03:37+00:00" }, { "name": "sebastian/global-state", - "version": "3.0.2", + "version": "5.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921" + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/de036ec91d55d2a9e0db2ba975b512cdb1c23921", - "reference": "de036ec91d55d2a9e0db2ba975b512cdb1c23921", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", "shasum": "" }, "require": { - "php": ">=7.2", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" }, "require-dev": { "ext-dom": "*", - "phpunit/phpunit": "^8.0" + "phpunit/phpunit": "^9.3" }, "suggest": { "ext-uopz": "*" @@ -1890,7 +2145,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0-dev" + "dev-master": "5.0-dev" } }, "autoload": { @@ -1915,7 +2170,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.2" + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" }, "funding": [ { @@ -1923,34 +2178,91 @@ "type": "github" } ], - "time": "2022-02-10T06:55:38+00:00" + "time": "2022-02-14T08:28:10+00:00" }, { - "name": "sebastian/object-enumerator", - "version": "3.0.4", + "name": "sebastian/lines-of-code", + "version": "1.0.3", "source": { "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", "shasum": "" }, "require": { - "php": ">=7.0", - "sebastian/object-reflector": "^1.1.1", - "sebastian/recursion-context": "^3.0" + "nikic/php-parser": "^4.6", + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" } }, "autoload": { @@ -1972,7 +2284,7 @@ "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" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" }, "funding": [ { @@ -1980,32 +2292,32 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2020-10-26T13:12:34+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -2027,7 +2339,7 @@ "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" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" }, "funding": [ { @@ -2035,32 +2347,32 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2020-10-26T13:14:26+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "4.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", "shasum": "" }, "require": { - "php": ">=7.0" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^6.0" + "phpunit/phpunit": "^9.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "3.0.x-dev" + "dev-master": "4.0-dev" } }, "autoload": { @@ -2087,10 +2399,10 @@ } ], "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "homepage": "https://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" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" }, "funding": [ { @@ -2098,29 +2410,32 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2023-02-03T06:07:39+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "3.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2142,7 +2457,7 @@ "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/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" }, "funding": [ { @@ -2150,32 +2465,32 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2020-09-28T06:45:17+00:00" }, { "name": "sebastian/type", - "version": "1.1.4", + "version": "3.2.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", "shasum": "" }, "require": { - "php": ">=7.2" + "php": ">=7.3" }, "require-dev": { - "phpunit/phpunit": "^8.2" + "phpunit/phpunit": "^9.5" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.1-dev" + "dev-master": "3.2-dev" } }, "autoload": { @@ -2198,7 +2513,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" }, "funding": [ { @@ -2206,29 +2521,29 @@ "type": "github" } ], - "time": "2020-11-30T07:25:11+00:00" + "time": "2023-02-03T06:13:03+00:00" }, { "name": "sebastian/version", - "version": "2.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" + "reference": "c6c1022351a901512170118436c764e473f6de8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", "shasum": "" }, "require": { - "php": ">=5.6" + "php": ">=7.3" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "2.0.x-dev" + "dev-master": "3.0-dev" } }, "autoload": { @@ -2251,9 +2566,15 @@ "homepage": "https://github.com/sebastianbergmann/version", "support": { "issues": "https://github.com/sebastianbergmann/version/issues", - "source": "https://github.com/sebastianbergmann/version/tree/master" + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" }, - "time": "2016-10-03T07:35:21+00:00" + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" }, { "name": "symfony/console", diff --git a/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php b/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php index 488cea9e120..8760170c266 100644 --- a/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php +++ b/plugins/woocommerce/tests/legacy/framework/class-wc-unit-test-case.php @@ -20,6 +20,8 @@ use PHPUnit\Framework\Constraint\IsType; */ class WC_Unit_Test_Case extends WP_HTTP_TestCase { + public const DEFAULT_FLOAT_COMPARISON_DELTA = 1e-10; + /** * Holds the WC_Unit_Test_Factory instance. * @@ -390,6 +392,18 @@ class WC_Unit_Test_Case extends WP_HTTP_TestCase { $this->assertEmpty( $events ); } + /** + * Assert that the difference between two floats is smaller than a given delta. + * + * @param float $expected The expected value. + * @param float $actual The actual value. + * @param float|null $delta The maximum allowed difference, defaults to DEFAULT_FLOAT_COMPARISON_DELTA. + * @param string $message An optional error message to use if the assertion fails. + */ + public function assertFloatEquals( $expected, $actual, ?float $delta = null, string $message = '' ) { + $this->assertEqualsWithDelta( $expected, $actual, $delta ?? self::DEFAULT_FLOAT_COMPARISON_DELTA, $message ); + } + /** * Mark test skipped when HPOS is enabled. * diff --git a/plugins/woocommerce/tests/legacy/unit-tests/formatting/functions.php b/plugins/woocommerce/tests/legacy/unit-tests/formatting/functions.php index 6496a0f903c..d309bacb331 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/formatting/functions.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/formatting/functions.php @@ -219,13 +219,13 @@ class WC_Tests_Formatting_Functions extends WC_Unit_Test_Case { $this->assertEquals( 4.53592, wc_get_weight( 10, 'kg' ) ); $this->assertEquals( 4535.92, wc_get_weight( 10, 'g' ) ); $this->assertEquals( 10, wc_get_weight( 10, 'lbs' ) ); - $this->assertEquals( 160.00004208, wc_get_weight( 10, 'oz' ) ); + $this->assertFloatEquals( 160.00004208, wc_get_weight( 10, 'oz' ) ); // oz. update_option( 'woocommerce_weight_unit', 'oz' ); $this->assertEquals( 0.283495, wc_get_weight( 10, 'kg' ) ); $this->assertEquals( 283.495, wc_get_weight( 10, 'g' ) ); - $this->assertEquals( 0.6249987469, wc_get_weight( 10, 'lbs' ) ); + $this->assertFloatEquals( 0.6249987469, wc_get_weight( 10, 'lbs' ) ); $this->assertEquals( 10, wc_get_weight( 10, 'oz' ) ); // Custom from unit. diff --git a/plugins/woocommerce/tests/legacy/unit-tests/order/coupons.php b/plugins/woocommerce/tests/legacy/unit-tests/order/coupons.php index 4402fed16c4..a5306b1544e 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/order/coupons.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/order/coupons.php @@ -253,7 +253,7 @@ class WC_Tests_Order_Coupons extends WC_Unit_Test_Case { $order->apply_coupon( 'test-coupon-2' ); $this->assertEquals( 401, $order->get_discount_total(), $order->get_discount_total() ); - $this->assertEquals( ( 1000 - 401 ) * 1.1, $order->get_total(), $order->get_total() ); + $this->assertFloatEquals( ( 1000 - 401 ) * 1.1, $order->get_total(), $order->get_total() ); } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/product/data-store.php b/plugins/woocommerce/tests/legacy/unit-tests/product/data-store.php index 444ae97fc1a..586392ac3a8 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/product/data-store.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/product/data-store.php @@ -545,6 +545,7 @@ class WC_Tests_Product_Data_Store extends WC_Unit_Test_Case { $sale_products = $product_store->get_on_sale_products(); $sale_product_ids = wp_list_pluck( $sale_products, 'id' ); + $sale_product_ids = array_map( 'absint', $sale_product_ids ); $this->assertContains( $sale_product->get_id(), $sale_product_ids ); $this->assertNotContains( $not_sale_product->get_id(), $sale_product_ids ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/product/data.php b/plugins/woocommerce/tests/legacy/unit-tests/product/data.php index 10590f71414..ae732e1a3f5 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/product/data.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/product/data.php @@ -5,6 +5,8 @@ * @package WooCommerce\Tests\Product */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Data Functions. * @@ -13,6 +15,8 @@ */ class WC_Tests_Product_Data extends WC_Unit_Test_Case { + use ArraySubsetAsserts; + /** * Test product setters and getters * @@ -79,16 +83,15 @@ class WC_Tests_Product_Data extends WC_Unit_Test_Case { $this->assertEquals( $value, $product->{"get_{$function}"}(), $function ); } $this->assertCount( 1, $product->get_attributes() ); - $this->assertContains( - current( $product->get_attributes() )->get_data(), + $this->assertArraySubset( array( - 'attribute_id' => 0, - 'name' => 'Test Attribute', - 'options' => array( 'Fish', 'Fingers' ), - 'position' => 0, - 'visible' => true, - 'variation' => false, - ) + 'name' => 'Test Attribute', + 'options' => array( 'Fish', 'Fingers' ), + 'position' => 0, + 'visible' => true, + 'variation' => false, + ), + current( $product->get_attributes() )->get_data() ); $this->assertEquals( $product->get_date_on_sale_from()->getTimestamp(), 1475798400 ); $this->assertEquals( $product->get_date_on_sale_to()->getTimestamp(), 1477267200 ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/queue/queue.php b/plugins/woocommerce/tests/legacy/unit-tests/queue/queue.php index e3f6d7657b8..f4f8db05040 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/queue/queue.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/queue/queue.php @@ -4,9 +4,9 @@ * @package WooCommerce\Tests\Queue */ - /** - * WC_Tests_Discounts. - */ +/** + * WC_Tests_Discounts. + */ class WC_Tests_Queue extends WC_Unit_Test_Case { /** @@ -35,21 +35,24 @@ class WC_Tests_Queue extends WC_Unit_Test_Case { // Test that the action can be found. $action_ids = $queue->search( array( - 'hook' => $hook, - 'args' => $args, + 'hook' => $hook, + 'args' => $args, 'group' => $group, ), 'ids' ); + $action_ids = array_map( 'absint', $action_ids ); $this->assertContains( $single, $action_ids ); + $action_ids = $queue->search( array( - 'hook' => $hook, + 'hook' => $hook, 'search' => $unique_hash, - 'group' => $group, + 'group' => $group, ), 'ids' ); + $action_ids = array_map( 'absint', $action_ids ); $this->assertContains( $single, $action_ids ); // Schedule a recurring action. @@ -63,21 +66,24 @@ class WC_Tests_Queue extends WC_Unit_Test_Case { // Test that the action can be found. $action_ids = $queue->search( array( - 'hook' => $hook, - 'args' => $args, + 'hook' => $hook, + 'args' => $args, 'group' => $group, ), 'ids' ); + $action_ids = array_map( 'absint', $action_ids ); $this->assertContains( $recurring, $action_ids ); + $action_ids = $queue->search( array( - 'hook' => $hook, + 'hook' => $hook, 'search' => $unique_hash, - 'group' => $group, + 'group' => $group, ), 'ids' ); + $action_ids = array_map( 'absint', $action_ids ); $this->assertContains( $recurring, $action_ids ); // Schedule a cron action on a daily midnight schedule starting at the next midnight. @@ -93,21 +99,24 @@ class WC_Tests_Queue extends WC_Unit_Test_Case { // Test that the action can be found. $action_ids = $queue->search( array( - 'hook' => $hook, - 'args' => $args, + 'hook' => $hook, + 'args' => $args, 'group' => $group, ), 'ids' ); + $action_ids = array_map( 'absint', $action_ids ); $this->assertContains( $cron_action, $action_ids ); + $action_ids = $queue->search( array( - 'hook' => $hook, + 'hook' => $hook, 'search' => $unique_hash, - 'group' => $group, + 'group' => $group, ), 'ids' ); + $action_ids = array_map( 'absint', $action_ids ); $this->assertContains( $cron_action, $action_ids ); // Test wildcard search. diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/coupons.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/coupons.php index 8c1c1d50297..02fa3b35a00 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/coupons.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/coupons.php @@ -1,11 +1,25 @@ assertEquals( 200, $response->get_status() ); $this->assertEquals( 2, count( $coupons ) ); - $this->assertContains( + + $matching_coupon_data = current( + array_filter( + $coupons, + function( $coupon ) use ( $coupon_1 ) { + return $coupon['id'] === $coupon_1->get_id(); + } + ) + ); + $this->assertIsArray( $matching_coupon_data ); + + $this->assertArraySubset( array( 'id' => $coupon_1->get_id(), 'code' => 'dummycoupon-1', @@ -92,7 +117,7 @@ class WC_Tests_API_Coupons_V2 extends WC_REST_Unit_Test_Case { ), ), ), - $coupons + $matching_coupon_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/customers.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/customers.php index 97a8d7d6773..af02cd77b67 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/customers.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/customers.php @@ -6,6 +6,8 @@ * @since 3.0.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Tests for the Customers REST API. * @@ -13,6 +15,7 @@ * @extends WC_REST_Unit_Test_Case */ class Customers_V2 extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -58,7 +61,17 @@ class Customers_V2 extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( 2, count( $customers ) ); - $this->assertContains( + $matching_customer_data = current( + array_filter( + $customers, + function( $customer ) use ( $customer_1 ) { + return $customer['id'] === $customer_1->get_id(); + } + ) + ); + $this->assertIsArray( $matching_customer_data ); + + $this->assertArraySubset( array( 'id' => $customer_1->get_id(), 'date_created' => wc_rest_prepare_date_response( $customer_1->get_date_created(), false ), @@ -113,7 +126,7 @@ class Customers_V2 extends WC_REST_Unit_Test_Case { ), ), ), - $customers + $matching_customer_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/payment-gateways.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/payment-gateways.php index be3a8b09dfc..61d4882c0c6 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/payment-gateways.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/payment-gateways.php @@ -6,10 +6,13 @@ * @since 3.0.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Payment gateway test class. */ class Payment_Gateways_V2 extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -47,7 +50,18 @@ class Payment_Gateways_V2 extends WC_REST_Unit_Test_Case { $gateways = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); - $this->assertContains( + + $matching_gateway_data = current( + array_filter( + $gateways, + function( $gateway ) { + return 'cheque' === $gateway['id']; + } + ) + ); + $this->assertIsArray( $matching_gateway_data ); + + $this->assertArraySubset( array( 'id' => 'cheque', 'title' => 'Check payments', @@ -82,7 +96,7 @@ class Payment_Gateways_V2 extends WC_REST_Unit_Test_Case { ), ), ), - $gateways + $matching_gateway_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/products.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/products.php index dfe3fbb54b6..36b350538b4 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/products.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/products.php @@ -6,10 +6,14 @@ * @since 3.0.0 */ +use Automattic\WooCommerce\RestApi\UnitTests\Helpers\ProductHelper; +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Products_API_V2 class. */ class Products_API_V2 extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -77,19 +81,20 @@ class Products_API_V2 extends WC_REST_Unit_Test_Case { */ public function test_get_product() { wp_set_current_user( $this->user ); - $simple = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\ProductHelper::create_external_product(); + $simple = ProductHelper::create_external_product(); $response = $this->server->dispatch( new WP_REST_Request( 'GET', '/wc/v2/products/' . $simple->get_id() ) ); $product = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); - $this->assertContains( + + $this->assertArraySubset( array( 'id' => $simple->get_id(), 'name' => 'Dummy External Product', - 'type' => 'simple', + 'type' => 'external', 'status' => 'publish', 'sku' => 'DUMMY EXTERNAL SKU', - 'regular_price' => 10, + 'regular_price' => '10', ), $product ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/settings.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/settings.php index 9c6950ac1d6..32a96fb95dc 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/settings.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/settings.php @@ -6,10 +6,13 @@ * @since 3.0.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Class Settings_V2. */ class Settings_V2 extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -50,7 +53,18 @@ class Settings_V2 extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); - $this->assertContains( + $this->assertEquals( 200, $response->get_status() ); + $matching_settings_data = current( + array_filter( + $data, + function( $settings ) { + return 'test' === $settings['id']; + } + ) + ); + $this->assertIsArray( $matching_settings_data ); + + $this->assertArraySubset( array( 'id' => 'test', 'label' => 'Test extension', @@ -65,10 +79,20 @@ class Settings_V2 extends WC_REST_Unit_Test_Case { ), ), ), - $data + $matching_settings_data ); - $this->assertContains( + $matching_settings_data = current( + array_filter( + $data, + function( $settings ) { + return 'sub-test' === $settings['id']; + } + ) + ); + $this->assertIsArray( $matching_settings_data ); + + $this->assertArraySubset( array( 'id' => 'sub-test', 'label' => 'Sub test', @@ -83,7 +107,7 @@ class Settings_V2 extends WC_REST_Unit_Test_Case { ), ), ), - $data + $matching_settings_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php index 6592f1c38f0..4fe9ef49a99 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php @@ -5,6 +5,8 @@ * @package Automattic/WooCommerce/Tests */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * System Status REST Tests. * @@ -12,6 +14,7 @@ * @since 3.0 */ class WC_Tests_REST_System_Status_V2 extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server. @@ -251,7 +254,18 @@ class WC_Tests_REST_System_Status_V2 extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( count( $raw_tools ), count( $data ) ); - $this->assertContains( + + $matching_tool_data = current( + array_filter( + $data, + function( $tool ) { + return 'regenerate_thumbnails' === $tool['id']; + } + ) + ); + $this->assertIsArray( $matching_tool_data ); + + $this->assertArraySubset( array( 'id' => 'regenerate_thumbnails', 'name' => 'Regenerate shop thumbnails', @@ -266,7 +280,7 @@ class WC_Tests_REST_System_Status_V2 extends WC_REST_Unit_Test_Case { ), ), ), - $data + $matching_tool_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/coupons.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/coupons.php index 03a41651159..5690e1dda12 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/coupons.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/coupons.php @@ -5,6 +5,8 @@ * @package WooCommerce\Tests\API */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + // phpcs:ignore Squiz.Commenting.FileComment.Missing require_once __DIR__ . '/date-filtering.php'; @@ -14,6 +16,7 @@ require_once __DIR__ . '/date-filtering.php'; * @since 3.5.0 */ class WC_Tests_API_Coupons extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; use DateFilteringForCrudControllers; /** @@ -62,7 +65,18 @@ class WC_Tests_API_Coupons extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( 2, count( $coupons ) ); - $this->assertContains( + + $matching_coupon_data = current( + array_filter( + $coupons, + function( $coupon ) use ( $coupon_1 ) { + return $coupon['id'] === $coupon_1->get_id(); + } + ) + ); + $this->assertIsArray( $matching_coupon_data ); + + $this->assertArraySubset( array( 'id' => $coupon_1->get_id(), 'code' => 'dummycoupon-1', @@ -105,7 +119,7 @@ class WC_Tests_API_Coupons extends WC_REST_Unit_Test_Case { ), ), ), - $coupons + $matching_coupon_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/customers.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/customers.php index 945128c18b3..442bb3ccecb 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/customers.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/customers.php @@ -6,6 +6,8 @@ * @since 3.5.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Tests for the Customers REST API. * @@ -13,6 +15,7 @@ * @extends WC_REST_Unit_Test_Case */ class Customers extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -59,7 +62,17 @@ class Customers extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( 2, count( $customers ) ); - $this->assertContains( + $matching_customer_data = current( + array_filter( + $customers, + function( $customer ) use ( $customer_1 ) { + return $customer['id'] === $customer_1->get_id(); + } + ) + ); + $this->assertIsArray( $matching_customer_data ); + + $this->assertArraySubset( array( 'id' => $customer_1->get_id(), 'date_created' => wc_rest_prepare_date_response( $date_created, false ), @@ -112,7 +125,7 @@ class Customers extends WC_REST_Unit_Test_Case { ), ), ), - $customers + $matching_customer_data ); update_option( 'timezone_tring', 'America/New York' ); @@ -130,7 +143,17 @@ class Customers extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); - $this->assertContains( + $matching_customer_data = current( + array_filter( + $customers, + function( $customer ) use ( $customer_3 ) { + return $customer['id'] === $customer_3->get_id(); + } + ) + ); + $this->assertIsArray( $matching_customer_data ); + + $this->assertArraySubset( array( 'id' => $customer_3->get_id(), 'date_created' => wc_rest_prepare_date_response( $date_created, false ), @@ -183,9 +206,8 @@ class Customers extends WC_REST_Unit_Test_Case { ), ), ), - $customers + $matching_customer_data ); - } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/payment-gateways.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/payment-gateways.php index 4bddc3f5a0e..8456ad81911 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/payment-gateways.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/payment-gateways.php @@ -6,10 +6,13 @@ * @since 3.5.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Payment gateway test class. */ class Payment_Gateways extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -47,7 +50,18 @@ class Payment_Gateways extends WC_REST_Unit_Test_Case { $gateways = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); - $this->assertContains( + + $matching_gateway_data = current( + array_filter( + $gateways, + function( $gateway ) { + return 'cheque' === $gateway['id']; + } + ) + ); + $this->assertIsArray( $matching_gateway_data ); + + $this->assertArraySubset( array( 'id' => 'cheque', 'title' => 'Check payments', @@ -85,7 +99,7 @@ class Payment_Gateways extends WC_REST_Unit_Test_Case { ), ), ), - $gateways + $matching_gateway_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/products.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/products.php index 552a54c4f75..8806ea422c7 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/products.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/products.php @@ -6,6 +6,8 @@ * @since 3.5.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + // phpcs:ignore Squiz.Commenting.FileComment.Missing require_once __DIR__ . '/date-filtering.php'; @@ -13,8 +15,9 @@ require_once __DIR__ . '/date-filtering.php'; * WC_Tests_API_Product class. */ class WC_Tests_API_Product extends WC_REST_Unit_Test_Case { - use WC_REST_API_Complex_Meta; + use ArraySubsetAsserts; use DateFilteringForCrudControllers; + use WC_REST_API_Complex_Meta; /** * Setup our test server, endpoints, and user info. @@ -140,14 +143,14 @@ class WC_Tests_API_Product extends WC_REST_Unit_Test_Case { $product = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); - $this->assertContains( + $this->assertArraySubset( array( 'id' => $simple->get_id(), 'name' => 'Dummy External Product', - 'type' => 'simple', + 'type' => 'external', 'status' => 'publish', 'sku' => 'DUMMY EXTERNAL SKU', - 'regular_price' => 10, + 'regular_price' => '10', ), $product ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/settings.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/settings.php index d82cc9b5ad8..d8890569eff 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/settings.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/settings.php @@ -6,10 +6,13 @@ * @since 3.5.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * Class Settings. */ class Settings extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * Setup our test server, endpoints, and user info. @@ -49,8 +52,17 @@ class Settings extends WC_REST_Unit_Test_Case { $data = $response->get_data(); $this->assertEquals( 200, $response->get_status() ); + $matching_settings_data = current( + array_filter( + $data, + function( $settings ) { + return 'test' === $settings['id']; + } + ) + ); + $this->assertIsArray( $matching_settings_data ); - $this->assertContains( + $this->assertArraySubset( array( 'id' => 'test', 'label' => 'Test extension', @@ -65,10 +77,20 @@ class Settings extends WC_REST_Unit_Test_Case { ), ), ), - $data + $matching_settings_data ); - $this->assertContains( + $matching_settings_data = current( + array_filter( + $data, + function( $settings ) { + return 'sub-test' === $settings['id']; + } + ) + ); + $this->assertIsArray( $matching_settings_data ); + + $this->assertArraySubset( array( 'id' => 'sub-test', 'label' => 'Sub test', @@ -83,7 +105,7 @@ class Settings extends WC_REST_Unit_Test_Case { ), ), ), - $data + $matching_settings_data ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php index 8d8333a5b52..4fe8ef29055 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php @@ -5,6 +5,8 @@ * @package Automattic/WooCommerce/Tests */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * System Status REST Tests. * @@ -12,6 +14,7 @@ * @since 3.5.0 */ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { + use ArraySubsetAsserts; /** * User variable. @@ -117,8 +120,8 @@ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { } $expected_data = array( 'environment' => array( - 'version' => WC()->version - ) + 'version' => WC()->version, + ), ); $request = new WP_REST_Request( 'GET', '/wc/v3/system_status' ); @@ -178,7 +181,8 @@ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { $theme = (array) $data['theme']; $this->assertEquals( 13, count( $theme ) ); - $this->assertEquals( $active_theme->Name, $theme['name'] ); // phpcs:ignore WordPress.NamingConventions.ValidVariableName.NotSnakeCaseMemberVar + // phpcs:ignore WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase + $this->assertEquals( $active_theme->Name, $theme['name'] ); } /** @@ -264,7 +268,18 @@ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( count( $raw_tools ), count( $data ) ); - $this->assertContains( + + $matching_tool_data = current( + array_filter( + $data, + function( $tool ) { + return 'regenerate_thumbnails' === $tool['id']; + } + ) + ); + $this->assertIsArray( $matching_tool_data ); + + $this->assertArraySubset( array( 'id' => 'regenerate_thumbnails', 'name' => 'Regenerate shop thumbnails', @@ -279,7 +294,7 @@ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { ), ), ), - $data + $matching_tool_data ); $query_params = array( @@ -292,12 +307,23 @@ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( count( $raw_tools ), count( $data ) ); - $this->assertContains( + + $matching_tool_data = current( + array_filter( + $data, + function( $tool ) { + return 'regenerate_thumbnails' === $tool['id']; + } + ) + ); + $this->assertIsArray( $matching_tool_data ); + + $this->assertArraySubset( array( 'id' => 'regenerate_thumbnails', 'name' => 'Regenerate shop thumbnails', ), - $data + $matching_tool_data ); foreach ( $data as $item ) { // Fields that are not requested are not returned in response. diff --git a/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-tests-wc-query.php b/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-tests-wc-query.php index da9b8e751c2..a324a548e27 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-tests-wc-query.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/util/class-wc-tests-wc-query.php @@ -6,10 +6,13 @@ * @since 3.3.0 */ +use DMS\PHPUnitExtensions\ArraySubset\ArraySubsetAsserts; + /** * WC_Query tests. */ class WC_Tests_WC_Query extends WC_Unit_Test_Case { + use ArraySubsetAsserts; /** * Test WC_Query gets initialized properly. @@ -353,8 +356,17 @@ class WC_Tests_WC_Query extends WC_Unit_Test_Case { // phpcs:enable WordPress.DB.SlowDBQuery WC()->query->product_query( new WP_Query( $query_args ) ); - $tax_queries = WC_Query::get_main_tax_query(); - $this->assertContains( $tax_query, $tax_queries ); + $tax_queries = WC_Query::get_main_tax_query(); + $matching_tax_data = current( + array_filter( + $tax_queries, + function( $tax ) { + return 'product_tag' === $tax['taxonomy']; + } + ) + ); + $this->assertIsArray( $matching_tax_data ); + $this->assertArraySubset( $tax_query, $matching_tax_data ); } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php index 6aabe4b0cdf..0d57109a7b8 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/features/onboarding-tasks/task-list.php @@ -260,13 +260,13 @@ class WC_Admin_Tests_OnboardingTasks_TaskList extends WC_Unit_Test_Case { ) ); $json = $this->list->get_json(); - $this->assertContains( 'id', $json ); - $this->assertContains( 'title', $json ); - $this->assertContains( 'isHidden', $json ); - $this->assertContains( 'isVisible', $json ); - $this->assertContains( 'isComplete', $json ); - $this->assertContains( 'tasks', $json ); - $this->assertContains( 'isComplete', $json['tasks'][0] ); + $this->assertArrayHasKey( 'id', $json ); + $this->assertArrayHasKey( 'title', $json ); + $this->assertArrayHasKey( 'isHidden', $json ); + $this->assertArrayHasKey( 'isVisible', $json ); + $this->assertArrayHasKey( 'isComplete', $json ); + $this->assertArrayHasKey( 'tasks', $json ); + $this->assertArrayHasKey( 'isComplete', $json['tasks'][0] ); } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/form-factory.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/form-factory.php index 148ac5c4c3e..403aaa46e96 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/form-factory.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/form-factory.php @@ -18,7 +18,7 @@ class WC_Admin_Tests_ProductForm_Form_Factory extends WC_Unit_Test_Case { $field = Form::add_field( 'id', 'woocommerce', array() ); $this->assertInstanceOf( 'WP_Error', $field ); - $this->assertContains( 'You are missing required arguments of WooCommerce ProductForm Field: type, section, properties.name, properties.label', $field->get_error_message() ); + $this->assertStringContainsString( 'You are missing required arguments of WooCommerce ProductForm Field: type, section, properties.name, properties.label', $field->get_error_message() ); } /** @@ -51,7 +51,7 @@ class WC_Admin_Tests_ProductForm_Form_Factory extends WC_Unit_Test_Case { ) ); $this->assertInstanceOf( 'WP_Error', $field_duplicate ); - $this->assertContains( 'You have attempted to register a duplicate form field with WooCommerce Form: `id`', $field_duplicate->get_error_message() ); + $this->assertStringContainsString( 'You have attempted to register a duplicate form field with WooCommerce Form: `id`', $field_duplicate->get_error_message() ); } /** diff --git a/plugins/woocommerce/tests/php/includes/wc-core-functions-test.php b/plugins/woocommerce/tests/php/includes/wc-core-functions-test.php index ae8d36ed897..2b08dd3917f 100644 --- a/plugins/woocommerce/tests/php/includes/wc-core-functions-test.php +++ b/plugins/woocommerce/tests/php/includes/wc-core-functions-test.php @@ -97,7 +97,7 @@ class WC_Core_Functions_Test extends \WC_Unit_Test_Case { ); $actual = wc_add_number_precision( $value, $round ); - $this->assertEquals( $expected, $actual ); + $this->assertFloatEquals( $expected, $actual ); remove_all_filters( 'wc_get_price_decimals' ); } From c3994e6f9d5a30ed8b65738dcae80af3d1a773b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20L=C3=B3pez=20Ariza?= <45979455+alopezari@users.noreply.github.com> Date: Wed, 22 Mar 2023 12:50:36 +0100 Subject: [PATCH 1192/1680] Add workflow to remind PR reviewers to also review the testing instructions. (#36918) * Add workflow to remind PR reviewers to also review the testing instructions. * Update review-testing-instructions GitHub Actions workflow to also mentioning teams in the comment. * Update review-testing-instructions GitHub Actions workflow to find if the comment it posts was already posted and - in that case - update it instead of creating a new one. * Pin find-comment and create-or-update-comment thirdparty GitHub Actions to full length commit SHA instead of tag for better security. --- .../cot-build-and-e2e-tests-daily.yml | 4 +- .github/workflows/pr-build-and-e2e-tests.yml | 4 +- .../workflows/review-testing-instructions.yml | 48 +++++++++++++++++++ 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/review-testing-instructions.yml diff --git a/.github/workflows/cot-build-and-e2e-tests-daily.yml b/.github/workflows/cot-build-and-e2e-tests-daily.yml index a38d042cc1e..7ef685e22fe 100644 --- a/.github/workflows/cot-build-and-e2e-tests-daily.yml +++ b/.github/workflows/cot-build-and-e2e-tests-daily.yml @@ -173,7 +173,7 @@ jobs: return await script( { core } ) - name: Find PR comment by github-actions[bot] - uses: peter-evans/find-comment@v2 + uses: peter-evans/find-comment@034abe94d3191f9c89d870519735beae326f2bdb id: find-comment with: issue-number: ${{ github.event.pull_request.number }} @@ -181,7 +181,7 @@ jobs: body-includes: Test Results Summary - name: Create or update PR comment - uses: peter-evans/create-or-update-comment@v2 + uses: peter-evans/create-or-update-comment@67dcc547d311b736a8e6c5c236542148a47adc3d with: comment-id: ${{ steps.find-comment.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/pr-build-and-e2e-tests.yml b/.github/workflows/pr-build-and-e2e-tests.yml index ed1eec649de..e267c3502b2 100644 --- a/.github/workflows/pr-build-and-e2e-tests.yml +++ b/.github/workflows/pr-build-and-e2e-tests.yml @@ -219,7 +219,7 @@ jobs: return await script( { core } ) - name: Find PR comment by github-actions[bot] - uses: peter-evans/find-comment@v2 + uses: peter-evans/find-comment@034abe94d3191f9c89d870519735beae326f2bdb id: find-comment with: issue-number: ${{ github.event.pull_request.number }} @@ -227,7 +227,7 @@ jobs: body-includes: Test Results Summary - name: Create or update PR comment - uses: peter-evans/create-or-update-comment@v2 + uses: peter-evans/create-or-update-comment@67dcc547d311b736a8e6c5c236542148a47adc3d with: comment-id: ${{ steps.find-comment.outputs.comment-id }} issue-number: ${{ github.event.pull_request.number }} diff --git a/.github/workflows/review-testing-instructions.yml b/.github/workflows/review-testing-instructions.yml new file mode 100644 index 00000000000..066c502a1fb --- /dev/null +++ b/.github/workflows/review-testing-instructions.yml @@ -0,0 +1,48 @@ +name: Remind reviewers to also review the testing instructions. +on: + pull_request: + types: [review_requested] + +permissions: {} + +jobs: + add-testing-instructions-review-comment: + runs-on: ubuntu-20.04 + permissions: + pull-requests: write + steps: + - name: Get the username of requested reviewers + id: get_reviewer_username + run: | + # Retrieves the username of all reviewers and stores them in a comma-separated list + reviewers=$(echo '${{ toJson(github.event.pull_request.requested_reviewers[*].login) }}' | jq -r 'map("@\(.)") | join(", ")') + echo "REVIEWERS=$reviewers" >> $GITHUB_ENV + + - name: Get the name of requested teams + id: get_team_name + run: | + # Retrieves the name of all teams asked for review and stores them in a comma-separated list + teams=$(echo '${{ toJson(github.event.pull_request.requested_teams[*].slug) }}' | jq -r 'map("@woocommerce/\(.)") | join(", ")') + echo "TEAMS=$teams" >> $GITHUB_ENV + + - name: Find the comment by github-actions[bot] asking for reviewing the testing instructions + uses: peter-evans/find-comment@034abe94d3191f9c89d870519735beae326f2bdb + id: find-comment + with: + issue-number: ${{ github.event.pull_request.number }} + comment-author: 'github-actions[bot]' + body-includes: please make sure to review the testing instructions + + - name: Create or update PR comment asking for reviewers to review the testing instructions + uses: peter-evans/create-or-update-comment@67dcc547d311b736a8e6c5c236542148a47adc3d + with: + comment-id: ${{ steps.find-comment.outputs.comment-id }} + issue-number: ${{ github.event.pull_request.number }} + body: | + Hi ${{ env.REVIEWERS }}, ${{ env.TEAMS }} + + Apart from reviewing the code changes, please make sure to review the testing instructions as well. + + You can follow this guide to find out what good testing instructions should look like: + https://github.com/woocommerce/woocommerce/wiki/Writing-high-quality-testing-instructions + edit-mode: replace From 9137eff39bcdf303d05f6813e7187e1605fe8dda Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Wed, 22 Mar 2023 13:23:58 +0100 Subject: [PATCH 1193/1680] Fix tests that throw deprecation warnings in PHPUnit 9. These fixes include: - Replace assertRegExp with assertMatchesRegularExpression - Replace assertObjectHasAttribute and assertClassHasStaticAttribute with assertTrue(property_exists) - Replace assertFileNotExists with assertFileDoesNotExist - Replace expects(at()) with withConsecutive --- .../admin/class-wc-tests-admin-dashboard.php | 16 +- .../legacy/unit-tests/core/main-class.php | 2 +- .../unit-tests/log/log-handler-email.php | 5 +- .../unit-tests/log/log-handler-file.php | 34 +++- .../tests/legacy/unit-tests/log/logger.php | 163 ++++++++---------- .../class-wc-tests-order-item-product.php | 2 +- .../class-wc-admin-dashboard-setup-test.php | 4 +- .../tests/php/includes/class-wc-cart-test.php | 2 +- 8 files changed, 119 insertions(+), 109 deletions(-) diff --git a/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php b/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php index 535869c41b0..73069b34ec5 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/admin/class-wc-tests-admin-dashboard.php @@ -49,10 +49,10 @@ class WC_Tests_Admin_Dashboard extends WC_Unit_Test_Case { $widget_output = $this->getActualOutput(); - $this->assertRegExp( '/page\=wc-admin\&\#038\;path\=\%2Fanalytics\%2Frevenue/', $widget_output ); - $this->assertRegExp( '/page\=wc-admin\&\#038\;filter\=single_product/', $widget_output ); - $this->assertRegExp( '/page\=wc-admin\&\#038\;type\=lowstock/', $widget_output ); - $this->assertRegExp( '/page\=wc-admin\&\#038\;type\=outofstock/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-admin\&\#038\;path\=\%2Fanalytics\%2Frevenue/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-admin\&\#038\;filter\=single_product/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-admin\&\#038\;type\=lowstock/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-admin\&\#038\;type\=outofstock/', $widget_output ); } /** @@ -72,10 +72,10 @@ class WC_Tests_Admin_Dashboard extends WC_Unit_Test_Case { ( new WC_Admin_Dashboard() )->status_widget(); $widget_output = $this->getActualOutput(); - $this->assertRegExp( '/page\=wc-reports\&\#038\;tab\=orders\&\#038\;range\=month/', $widget_output ); - $this->assertRegExp( '/page\=wc-reports\&\#038\;tab\=orders\&\#038\;report\=sales_by_product/', $widget_output ); - $this->assertRegExp( '/page\=wc-reports\&\#038\;tab\=stock\&\#038\;report\=low_in_stock/', $widget_output ); - $this->assertRegExp( '/page\=wc-reports\&\#038\;tab\=stock\&\#038\;report\=out_of_stock/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-reports\&\#038\;tab\=orders\&\#038\;range\=month/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-reports\&\#038\;tab\=orders\&\#038\;report\=sales_by_product/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-reports\&\#038\;tab\=stock\&\#038\;report\=low_in_stock/', $widget_output ); + $this->assertMatchesRegularExpression( '/page\=wc-reports\&\#038\;tab\=stock\&\#038\;report\=out_of_stock/', $widget_output ); remove_filter( 'woocommerce_admin_disabled', '__return_true' ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/core/main-class.php b/plugins/woocommerce/tests/legacy/unit-tests/core/main-class.php index bc90cbf5fce..0ebe5e3bcec 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/core/main-class.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/core/main-class.php @@ -37,7 +37,7 @@ class WC_Test_WooCommerce extends WC_Unit_Test_Case { * @since 2.2 */ public function test_wc_instance() { - $this->assertClassHasStaticAttribute( '_instance', 'WooCommerce' ); + $this->assertTrue( property_exists( WooCommerce::class, '_instance' ) ); } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-email.php b/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-email.php index f463d3ed211..26b4dee49b4 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-email.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-email.php @@ -184,7 +184,8 @@ class WC_Tests_Log_Handler_Email extends WC_Unit_Test_Case { $handler->handle( time(), 'notice', '', array() ); $handler->send_log_email(); - $this->assertObjectHasAttribute( 'body', $mailer->get_sent( 0 ) ); + + $this->assertTrue( property_exists( $mailer->get_sent( 0 ), 'body' ) ); } /** @@ -206,7 +207,7 @@ class WC_Tests_Log_Handler_Email extends WC_Unit_Test_Case { $handler->handle( time(), 'info', '', array() ); $handler->send_log_email(); - $this->assertObjectHasAttribute( 'body', $mailer->get_sent( 0 ) ); + $this->assertTrue( property_exists( $mailer->get_sent( 0 ), 'body' ) ); } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-file.php b/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-file.php index 062427d815a..43a835283c7 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-file.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/log/log-handler-file.php @@ -1,4 +1,9 @@ handle( time(), 'debug', 'debug', array( 'source' => $log_name ) ); $handler->remove( wc_get_log_file_name( $log_name ) ); - $this->assertFileNotExists( WC_Log_Handler_File::get_log_file_path( $log_name ) ); + $this->assertFileDoesNotExist( WC_Log_Handler_File::get_log_file_path( $log_name ) ); } /** @@ -165,20 +182,21 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { * @since 3.0.0 */ public function test_log_rotate() { + // phpcs:disable WordPress.WP.AlternativeFunctions - // Handler with log size limit of 5mb + // Handler with log size limit of 5mb. $handler = new WC_Log_Handler_File( 5 * 1024 * 1024 ); $time = time(); $log_name = '_test_log_rotate'; $base_log_file = WC_Log_Handler_File::get_log_file_path( $log_name ); - // Create log file larger than 5mb to ensure log is rotated + // Create log file larger than 5mb to ensure log is rotated. $handle = fopen( $base_log_file, 'w' ); fseek( $handle, 5 * 1024 * 1024 ); fwrite( $handle, '_base_log_file_contents_' ); fclose( $handle ); - // Write some files to ensure they've rotated correctly + // Write some files to ensure they've rotated correctly. for ( $i = 0; $i < 10; $i++ ) { file_put_contents( WC_Log_Handler_File::get_log_file_path( $log_name . ".{$i}" ), $i ); // phpcs:ignore WordPress.VIP.FileSystemWritesDisallow.file_ops_file_put_contents } @@ -188,14 +206,16 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { $this->assertFileExists( WC_Log_Handler_File::get_log_file_path( $log_name ) ); - // Ensure the handled log is correct + // Ensure the handled log is correct. $this->assertStringEndsWith( 'EMERGENCY emergency' . PHP_EOL, $this->read_content( $log_name ) ); - // Ensure other logs have rotated correctly + // Ensure other logs have rotated correctly. $this->assertEquals( '_base_log_file_contents_', trim( $this->read_content( $log_name . '.0' ) ) ); for ( $i = 1; $i < 10; $i++ ) { $this->assertEquals( $i - 1, $this->read_content( $log_name . ".{$i}" ) ); } + + // phpcs:enable WordPress.WP.AlternativeFunctions } /** @@ -205,7 +225,7 @@ class WC_Tests_Log_Handler_File extends WC_Unit_Test_Case { */ public function test_get_log_file_path() { $log_dir = trailingslashit( WC_LOG_DIR ); - $date_suffix = date( 'Y-m-d', time() ); + $date_suffix = gmdate( 'Y-m-d', time() ); $hash_name = sanitize_file_name( wp_hash( 'unit-tests' ) ); $this->assertEquals( $log_dir . 'unit-tests-' . $date_suffix . '-' . $hash_name . '.log', WC_Log_Handler_File::get_log_file_path( 'unit-tests' ) ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/log/logger.php b/plugins/woocommerce/tests/legacy/unit-tests/log/logger.php index ac6930da466..b21c98f1b1e 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/log/logger.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/log/logger.php @@ -1,4 +1,9 @@ clear( 'unit-tests' ); $this->assertEquals( '', file_get_contents( $file ) ); + // phpcs:enable WordPress.WP.AlternativeFunctions } /** @@ -67,6 +74,8 @@ class WC_Tests_Logger extends WC_Unit_Test_Case { * @since 3.0.0 */ public function test_log() { + $this->expectNotToPerformAssertions(); + $handler = $this->create_mock_handler(); $log = new WC_Logger( array( $handler ), 'debug' ); $log->log( 'debug', 'debug message' ); @@ -121,6 +130,8 @@ class WC_Tests_Logger extends WC_Unit_Test_Case { * @since 3.0.0 */ public function test_level_methods() { + $this->expectNotToPerformAssertions(); + $handler = $this->create_mock_handler(); $log = new WC_Logger( array( $handler ), 'debug' ); $log->debug( 'debug message' ); @@ -160,29 +171,27 @@ class WC_Tests_Logger extends WC_Unit_Test_Case { public function test_threshold_defaults() { $time = time(); - // Test no filtering by default + // Test no filtering by default. delete_option( 'woocommerce_log_threshold' ); $handler = $this ->getMockBuilder( 'WC_Log_Handler_Interface' ) ->setMethods( array( 'handle' ) ) ->getMock(); $handler - ->expects( $this->at( 0 ) ) ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'bad-level' ), - $this->equalTo( 'bad-level message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 1 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'debug' ), - $this->equalTo( 'debug message' ), - $this->equalTo( array() ) + ->withConsecutive( + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'bad-level' ), + $this->equalTo( 'bad-level message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'debug' ), + $this->equalTo( 'debug message' ), + $this->equalTo( array() ), + ) ); $log = new WC_Logger( array( $handler ) ); @@ -192,7 +201,7 @@ class WC_Tests_Logger extends WC_Unit_Test_Case { // Bad level also complains. $this->setExpectedIncorrectUsage( 'WC_Logger::log' ); - // Debug is lowest recognized level + // Debug is lowest recognized level. $log->debug( 'debug message' ); } @@ -251,76 +260,56 @@ class WC_Tests_Logger extends WC_Unit_Test_Case { ->getMock(); $handler - ->expects( $this->at( 0 ) ) ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'debug' ), - $this->equalTo( 'debug message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 1 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'info' ), - $this->equalTo( 'info message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 2 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'notice' ), - $this->equalTo( 'notice message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 3 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'warning' ), - $this->equalTo( 'warning message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 4 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'error' ), - $this->equalTo( 'error message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 5 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'critical' ), - $this->equalTo( 'critical message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 6 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'alert' ), - $this->equalTo( 'alert message' ), - $this->equalTo( array() ) - ); - $handler - ->expects( $this->at( 7 ) ) - ->method( 'handle' ) - ->with( - $this->greaterThanOrEqual( $time ), - $this->equalTo( 'emergency' ), - $this->equalTo( 'emergency message' ), - $this->equalTo( array() ) + ->withConsecutive( + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'debug' ), + $this->equalTo( 'debug message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'info' ), + $this->equalTo( 'info message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'notice' ), + $this->equalTo( 'notice message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'warning' ), + $this->equalTo( 'warning message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'error' ), + $this->equalTo( 'error message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'critical' ), + $this->equalTo( 'critical message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'alert' ), + $this->equalTo( 'alert message' ), + $this->equalTo( array() ), + ), + array( + $this->greaterThanOrEqual( $time ), + $this->equalTo( 'emergency' ), + $this->equalTo( 'emergency message' ), + $this->equalTo( array() ), + ) ); return $handler; diff --git a/plugins/woocommerce/tests/legacy/unit-tests/order-items/class-wc-tests-order-item-product.php b/plugins/woocommerce/tests/legacy/unit-tests/order-items/class-wc-tests-order-item-product.php index 669231741c0..3225cb3ab94 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/order-items/class-wc-tests-order-item-product.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/order-items/class-wc-tests-order-item-product.php @@ -130,7 +130,7 @@ class WC_Tests_Order_Item_Product extends WC_Unit_Test_Case { $product_item->set_order_id( $order->get_id() ); $expected_regex = '/download_file=.*&order=wc_order_.*&email=test%40woocommerce.com&key=100/'; - $this->assertRegexp( $expected_regex, $product_item->get_item_download_url( 100 ) ); + $this->assertMatchesRegularExpression( $expected_regex, $product_item->get_item_download_url( 100 ) ); } /** diff --git a/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-dashboard-setup-test.php b/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-dashboard-setup-test.php index 637f4cdeaf5..f08e55c233d 100644 --- a/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-dashboard-setup-test.php +++ b/plugins/woocommerce/tests/php/includes/admin/class-wc-admin-dashboard-setup-test.php @@ -165,7 +165,7 @@ class WC_Admin_Dashboard_Setup_Test extends WC_Unit_Test_Case { ); foreach ( $required_strings as $required_string ) { - $this->assertRegexp( "/{$required_string}/", $html ); + $this->assertMatchesRegularExpression( "/{$required_string}/", $html ); } } @@ -191,7 +191,7 @@ class WC_Admin_Dashboard_Setup_Test extends WC_Unit_Test_Case { if ( $completed_tasks_count === $tasks_count ) { $this->assertEmpty( $this->get_widget_output() ); } else { - $this->assertRegexp( "/Step {$step_number} of 6/", $this->get_widget_output() ); + $this->assertMatchesRegularExpression( "/Step {$step_number} of 6/", $this->get_widget_output() ); } } } diff --git a/plugins/woocommerce/tests/php/includes/class-wc-cart-test.php b/plugins/woocommerce/tests/php/includes/class-wc-cart-test.php index 84ea12c767b..bf6a85bbd9c 100644 --- a/plugins/woocommerce/tests/php/includes/class-wc-cart-test.php +++ b/plugins/woocommerce/tests/php/includes/class-wc-cart-test.php @@ -187,6 +187,6 @@ class WC_Cart_Test extends \WC_Unit_Test_Case { $this->assertArrayHasKey( 'error', $notices ); $this->assertCount( 1, $notices['error'] ); - $this->assertRegExp( '/Please choose product options by visiting/', $notices['error'][0]['notice'] ); + $this->assertMatchesRegularExpression( '/Please choose product options by visiting/', $notices['error'][0]['notice'] ); } } From 15c7a18c98f4482831921365c64db60dc77b6312 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Wed, 22 Mar 2023 13:32:42 +0100 Subject: [PATCH 1194/1680] Add changelog file --- plugins/woocommerce/changelog/bump-required-php-to-7.3 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/bump-required-php-to-7.3 diff --git a/plugins/woocommerce/changelog/bump-required-php-to-7.3 b/plugins/woocommerce/changelog/bump-required-php-to-7.3 new file mode 100644 index 00000000000..8da66073db3 --- /dev/null +++ b/plugins/woocommerce/changelog/bump-required-php-to-7.3 @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Bump required PHP version to 7.3 and PHPUnit version to 9 From b7cd5aa47d2c3f916c61f00850d1228dd76065a3 Mon Sep 17 00:00:00 2001 From: Nestor Soriano Date: Wed, 22 Mar 2023 16:15:36 +0100 Subject: [PATCH 1195/1680] phpunit.xml migrated to the new PHPUnit 9 schema --- plugins/woocommerce/phpunit.xml | 66 ++++++++++++++++----------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/plugins/woocommerce/phpunit.xml b/plugins/woocommerce/phpunit.xml index 79f1b3e3621..c9e675d826f 100644 --- a/plugins/woocommerce/phpunit.xml +++ b/plugins/woocommerce/phpunit.xml @@ -1,5 +1,5 @@ - + xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.3/phpunit.xsd"> ./tests/legacy/unit-tests ./tests/php - - + + ./includes - woocommerce.php - uninstall.php - - ./includes/admin/helper/views - ./includes/admin/importers/views - ./includes/admin/meta-boxes/views - ./includes/admin/plugin-updates/views - ./includes/admin/views - ./includes/api/legacy - ./includes/api/v1 - ./includes/legacy - ./includes/libraries - ./includes/shipping/legacy-flat-rate - ./includes/shipping/legacy-free-shipping - ./includes/shipping/legacy-international-delivery - ./includes/shipping/legacy-local-delivery - ./includes/shipping/legacy-local-pickup - ./includes/updates - ./includes/vendor - ./includes/widgets - ./packages - ./src - ./vendor - ./includes/wc-deprecated-functions.php - ./includes/wc-template-hooks.php - ./includes/wc-widget-functions.php - - - + woocommerce.php + uninstall.php + + + ./includes/admin/helper/views + ./includes/admin/importers/views + ./includes/admin/meta-boxes/views + ./includes/admin/plugin-updates/views + ./includes/admin/views + ./includes/api/legacy + ./includes/api/v1 + ./includes/legacy + ./includes/libraries + ./includes/shipping/legacy-flat-rate + ./includes/shipping/legacy-free-shipping + ./includes/shipping/legacy-international-delivery + ./includes/shipping/legacy-local-delivery + ./includes/shipping/legacy-local-pickup + ./includes/updates + ./includes/vendor + ./includes/widgets + ./packages + ./src + ./vendor + ./includes/wc-deprecated-functions.php + ./includes/wc-template-hooks.php + ./includes/wc-widget-functions.php + + From 5a21b3f218438c204dd97e855f1f1fb042cc2b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Juh=C3=A9=20Lluveras?= Date: Wed, 22 Mar 2023 16:56:41 +0100 Subject: [PATCH 1196/1680] Update WooCommerce Blocks package to 9.8.2 (#37373) --- .../changelog/update-woocommerce-blocks-9.8.2 | 4 ++++ plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/composer.lock | 14 +++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 new file mode 100644 index 00000000000..eeb9356bb51 --- /dev/null +++ b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update WooCommerce Blocks to 9.8.2 diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 2ed1a3bd2a8..54c8a2aace8 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -21,7 +21,7 @@ "maxmind-db/reader": "^1.11", "pelago/emogrifier": "^6.0", "woocommerce/action-scheduler": "3.5.4", - "woocommerce/woocommerce-blocks": "9.8.1" + "woocommerce/woocommerce-blocks": "9.8.2" }, "require-dev": { "automattic/jetpack-changelogger": "^3.3.0", diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index 819a8e90eae..e93c1bf9377 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": "5c0ebd9977d69b819fa45b7b463fb356", + "content-hash": "48377a0bfe2b30537b522f197ba28984", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -628,16 +628,16 @@ }, { "name": "woocommerce/woocommerce-blocks", - "version": "v9.8.1", + "version": "9.8.2", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-blocks.git", - "reference": "2c336eb8304ca59ae9b9169cc8cc58b9ca529e5b" + "reference": "61488a0f1d1afc8fd7484e1b277d40afd782e005" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/2c336eb8304ca59ae9b9169cc8cc58b9ca529e5b", - "reference": "2c336eb8304ca59ae9b9169cc8cc58b9ca529e5b", + "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/61488a0f1d1afc8fd7484e1b277d40afd782e005", + "reference": "61488a0f1d1afc8fd7484e1b277d40afd782e005", "shasum": "" }, "require": { @@ -683,9 +683,9 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-blocks/issues", - "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v9.8.1" + "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v9.8.2" }, - "time": "2023-03-15T13:26:05+00:00" + "time": "2023-03-22T14:39:35+00:00" } ], "packages-dev": [ From 50852ca9eaa7d0d00323bca47781da5c1a737f5c Mon Sep 17 00:00:00 2001 From: Jon Lane Date: Wed, 22 Mar 2023 10:09:27 -0700 Subject: [PATCH 1197/1680] Fixed variations test --- .../merchant/create-variable-product.spec.js | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js index f024ff663c6..719522b4d48 100644 --- a/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js +++ b/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js @@ -14,7 +14,7 @@ const defaultAttributes = [ 'val2', 'val1', 'val2' ]; const stockAmount = '100'; const lowStockAmount = '10'; -test.describe.serial( 'Add New Variable Product Page', () => { +test.describe( 'Add New Variable Product Page', () => { test.use( { storageState: process.env.ADMINSTATE } ); test.afterAll( async ( { baseURL } ) => { @@ -52,20 +52,15 @@ test.describe.serial( 'Add New Variable Product Page', () => { // add 3 attributes for ( let i = 0; i < 3; i++ ) { - await page.click( 'button.add_attribute' ); + if ( i > 0 ) { + await page.click( 'button.add_attribute' ); + } await page.waitForSelector( `input[name="attribute_names[${ i }]"]` ); - await page.fill( - `input[name="attribute_names[${ i }]"]`, - `attr #${ i + 1 }` - ); - await page.fill( - `textarea[name="attribute_values[${ i }]"]`, - 'val1 | val2' - ); - } - await page.click( 'text=Save attributes', { force: true } ); - await page.waitForLoadState( 'networkidle' ); + await page.locator( `input[name="attribute_names[${ i }]"]` ).first().type( `attr #${ i + 1 }` ); + await page.locator( `textarea[name="attribute_values[${ i }]"]` ).first().type( 'val1 | val2' ); + } + await page.click( 'text=Save attributes' ); // wait for the attributes to be saved await page.waitForResponse( ( response ) => @@ -81,24 +76,20 @@ test.describe.serial( 'Add New Variable Product Page', () => { // manually create variations from all attributes await page.click( 'a[href="#variable_product_options"]' ); - await page.selectOption( '#field_to_edit', 'link_all_variations', { - force: true, - } ); + await page.selectOption( '#field_to_edit', 'link_all_variations' ); page.on( 'dialog', ( dialog ) => dialog.accept() ); + await page.click( 'a.do_variation_action' ); - - await page.waitForLoadState( 'networkidle' ); - // add variation attributes - for ( let i = 0; i < 4; i++ ) { + for ( let i = 0; i < 8; i++ ) { const val1 = 'val1'; const val2 = 'val2'; const attr3 = !! ( i % 2 ); // 0-1,4-5 / 2-3,6-7 const attr2 = i % 4 > 1; // 0-3 / 4-7 - // const attr1 = i > 3; - // await expect( - // page.locator( `select[name="attribute_attr-1[${ i }]"]` ) - // ).toHaveValue( attr1 ? val2 : val1 ); + const attr1 = i > 3; + await expect( + page.locator( `select[name="attribute_attr-1[${ i }]"]` ) + ).toHaveValue( attr1 ? val2 : val1 ); await expect( page.locator( `select[name="attribute_attr-2[${ i }]"]` ) ).toHaveValue( attr2 ? val2 : val1 ); From 562749b60aacad29f9de93f5444b70573291f7aa Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Wed, 22 Mar 2023 16:56:35 -0700 Subject: [PATCH 1198/1680] Prevent duplicate registration of core blocks in client (#37350) * Prevent duplicate registration of core blocks * Add components changelog entry --- packages/js/components/changelog/fix-37348 | 4 ++++ .../rich-text-editor/utils/register-blocks.ts | 9 +++++---- packages/js/product-editor/changelog/fix-37348 | 4 ++++ .../src/components/editor/init-blocks.ts | 17 +++++++++++++++-- 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 packages/js/components/changelog/fix-37348 create mode 100644 packages/js/product-editor/changelog/fix-37348 diff --git a/packages/js/components/changelog/fix-37348 b/packages/js/components/changelog/fix-37348 new file mode 100644 index 00000000000..ae0096b28fc --- /dev/null +++ b/packages/js/components/changelog/fix-37348 @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Prevent duplicate registration of core blocks in client diff --git a/packages/js/components/src/rich-text-editor/utils/register-blocks.ts b/packages/js/components/src/rich-text-editor/utils/register-blocks.ts index 566ff239bef..905a89e4bdb 100644 --- a/packages/js/components/src/rich-text-editor/utils/register-blocks.ts +++ b/packages/js/components/src/rich-text-editor/utils/register-blocks.ts @@ -1,7 +1,7 @@ /** * External dependencies */ -import { BlockInstance } from '@wordpress/blocks'; +import { BlockInstance, getBlockType } from '@wordpress/blocks'; import { // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore We need this to import the block modules for registration. @@ -29,9 +29,10 @@ const ALLOWED_CORE_BLOCKS = [ const registerCoreBlocks = () => { const coreBlocks = __experimentalGetCoreBlocks(); - const blocks = coreBlocks.filter( ( block: BlockInstance ) => - ALLOWED_CORE_BLOCKS.includes( block.name ) - ); + const blocks = coreBlocks.filter( ( block: BlockInstance ) => { + const isRegistered = !! getBlockType( block.name ); + return ! isRegistered && ALLOWED_CORE_BLOCKS.includes( block.name ); + } ); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore An argument is allowed to specify which blocks to register. diff --git a/packages/js/product-editor/changelog/fix-37348 b/packages/js/product-editor/changelog/fix-37348 new file mode 100644 index 00000000000..ae0096b28fc --- /dev/null +++ b/packages/js/product-editor/changelog/fix-37348 @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Prevent duplicate registration of core blocks in client diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index f55760f5fce..8b0977991bf 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -1,7 +1,13 @@ /** * External dependencies */ -import { registerCoreBlocks } from '@wordpress/block-library'; +import { BlockInstance, getBlockType } from '@wordpress/blocks'; +import { + registerCoreBlocks, + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore We need this to import the block modules for registration. + __experimentalGetCoreBlocks, +} from '@wordpress/block-library'; /** * Internal dependencies @@ -14,7 +20,14 @@ import { init as initPricing } from '../pricing-block'; import { init as initCollapsible } from '../collapsible-block'; export const initBlocks = () => { - registerCoreBlocks(); + const coreBlocks = __experimentalGetCoreBlocks(); + const blocks = coreBlocks.filter( ( block: BlockInstance ) => { + return ! getBlockType( block.name ); + } ); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore An argument is allowed to specify which blocks to register. + registerCoreBlocks( blocks ); + initName(); initSummary(); initSection(); From ed511dbb76bd26527548b3a9fd504f3d2383facc Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Tue, 24 Jan 2023 17:34:13 -0800 Subject: [PATCH 1199/1680] Synchronize order meta data (between HPOS and CPT stores) upon a call to $order->save_meta_data. --- .../changelog/fix-35703-order-meta-backfill | 4 ++ .../DataStores/CustomMetaDataStore.php | 4 ++ .../Orders/OrdersTableDataStore.php | 32 ++++++++++-- .../Orders/DataSynchronizerTests.php | 50 +++++++++++++++++++ 4 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-35703-order-meta-backfill diff --git a/plugins/woocommerce/changelog/fix-35703-order-meta-backfill b/plugins/woocommerce/changelog/fix-35703-order-meta-backfill new file mode 100644 index 00000000000..d6b48db0887 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-35703-order-meta-backfill @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +When order meta data is saved via HPOS, it should be backfilled to the CPT data store. diff --git a/plugins/woocommerce/src/Internal/DataStores/CustomMetaDataStore.php b/plugins/woocommerce/src/Internal/DataStores/CustomMetaDataStore.php index 3a082eeb289..f9c13e2f9bc 100644 --- a/plugins/woocommerce/src/Internal/DataStores/CustomMetaDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/CustomMetaDataStore.php @@ -78,6 +78,8 @@ abstract class CustomMetaDataStore { * * @param WC_Data $object WC_Data object. * @param stdClass $meta (containing at least ->id). + * + * @return bool */ public function delete_meta( &$object, $meta ) { global $wpdb; @@ -127,6 +129,8 @@ abstract class CustomMetaDataStore { * * @param WC_Data $object WC_Data object. * @param stdClass $meta (containing ->id, ->key and ->value). + * + * @return bool */ public function update_meta( &$object, $meta ) { global $wpdb; diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 72dda5adbec..410b6faa6cd 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -11,6 +11,7 @@ use Automattic\WooCommerce\Internal\Utilities\DatabaseUtil; use Automattic\WooCommerce\Proxies\LegacyProxy; use Automattic\WooCommerce\Utilities\ArrayUtil; use Exception; +use WC_Abstract_Order; use WC_Data; use WC_Order; @@ -2457,9 +2458,17 @@ CREATE TABLE $meta_table ( * * @param WC_Data $object WC_Data object. * @param stdClass $meta (containing at least ->id). + * + * @return bool */ public function delete_meta( &$object, $meta ) { - return $this->data_store_meta->delete_meta( $object, $meta ); + $delete_meta = $this->data_store_meta->delete_meta( $object, $meta ); + + if ( $object instanceof WC_Abstract_Order ) { + $this->maybe_backfill_post_record( $object ); + } + + return $delete_meta; } /** @@ -2467,10 +2476,17 @@ CREATE TABLE $meta_table ( * * @param WC_Data $object WC_Data object. * @param stdClass $meta (containing ->key and ->value). - * @return int meta ID + * + * @return int|bool meta ID or false on failure */ public function add_meta( &$object, $meta ) { - return $this->data_store_meta->add_meta( $object, $meta ); + $add_meta = $this->data_store_meta->add_meta( $object, $meta ); + + if ( $object instanceof WC_Abstract_Order ) { + $this->maybe_backfill_post_record( $object ); + } + + return $add_meta; } /** @@ -2478,8 +2494,16 @@ CREATE TABLE $meta_table ( * * @param WC_Data $object WC_Data object. * @param stdClass $meta (containing ->id, ->key and ->value). + * + * @return bool */ public function update_meta( &$object, $meta ) { - return $this->data_store_meta->update_meta( $object, $meta ); + $update_meta = $this->data_store_meta->update_meta( $object, $meta ); + + if ( $object instanceof WC_Abstract_Order ) { + $this->maybe_backfill_post_record( $object ); + } + + return $update_meta; } } diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php index eb76417d9a0..be046c21c5f 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php @@ -223,4 +223,54 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { 'After the COT order record was deleted, the order was also deleted from the posts table.' ); } + + /** + * When sync is enabled, changes to meta data should propoagate from the Custom Orders Table to + * the post meta table whenever the order object's save_meta_data() method is called. + * + * @return void + */ + public function test_meta_data_changes_propagate_from_cot_to_cpt(): void { + // Sync enabled and COT authoritative. + update_option( $this->sut::ORDERS_DATA_SYNC_ENABLED_OPTION, 'yes' ); + update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'yes' ); + + $order = OrderHelper::create_order(); + $order->add_meta_data( 'foo', 'bar' ); + $order->save_meta_data(); + + update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'no' ); + $refreshed_order = wc_get_order( $order->get_id() ); + + $this->assertEquals( + $refreshed_order->get_meta( 'foo' ), + 'bar', + 'Meta data persisted via the HPOS datastore is accessible via the CPT datastore' + ); + } + + /** + * When sync is enabled, changes to meta data should propoagate from the post meta table to + * the Custom Orders Table whenever the order object's save_meta_data() method is called. + * + * @return void + */ + public function test_meta_data_changes_propagate_from_cpt_to_cot(): void { + // Sync enabled and COT authoritative. + update_option( $this->sut::ORDERS_DATA_SYNC_ENABLED_OPTION, 'yes' ); + update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'no' ); + + $order = OrderHelper::create_order(); + $order->add_meta_data( 'foo', 'bar' ); + $order->save_meta_data(); + + update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'yes' ); + $refreshed_order = wc_get_order( $order->get_id() ); + + $this->assertEquals( + $refreshed_order->get_meta( 'foo' ), + 'bar', + 'Meta data persisted via the CPT datastore is accessible via the HPOS datastore' + ); + } } From e15b942054fc8906bae07948f304c2b62d07e3c4 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Tue, 24 Jan 2023 20:52:16 -0800 Subject: [PATCH 1200/1680] Fix typos. --- .../Internal/DataStores/Orders/DataSynchronizerTests.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php index be046c21c5f..d7902685f21 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php @@ -225,7 +225,7 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { } /** - * When sync is enabled, changes to meta data should propoagate from the Custom Orders Table to + * When sync is enabled, changes to meta data should propagate from the Custom Orders Table to * the post meta table whenever the order object's save_meta_data() method is called. * * @return void @@ -250,13 +250,13 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { } /** - * When sync is enabled, changes to meta data should propoagate from the post meta table to + * When sync is enabled, changes to meta data should propagate from the post meta table to * the Custom Orders Table whenever the order object's save_meta_data() method is called. * * @return void */ public function test_meta_data_changes_propagate_from_cpt_to_cot(): void { - // Sync enabled and COT authoritative. + // Sync enabled and CPT authoritative. update_option( $this->sut::ORDERS_DATA_SYNC_ENABLED_OPTION, 'yes' ); update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'no' ); From fd3749d5c2a896c73b54d0080b5c53c6cb3de476 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Tue, 14 Mar 2023 00:12:20 +0000 Subject: [PATCH 1201/1680] Add assertions covering synchronization of order meta data deletions. --- .../Orders/DataSynchronizerTests.php | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php index d7902685f21..fbe5e011fa0 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php @@ -237,6 +237,10 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { $order = OrderHelper::create_order(); $order->add_meta_data( 'foo', 'bar' ); + $order->add_meta_data( 'bar', 'baz' ); + $order->save_meta_data(); + + $order->delete_meta_data( 'bar' ); $order->save_meta_data(); update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'no' ); @@ -245,7 +249,13 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { $this->assertEquals( $refreshed_order->get_meta( 'foo' ), 'bar', - 'Meta data persisted via the HPOS datastore is accessible via the CPT datastore' + 'Meta data persisted via the HPOS datastore is accessible via the CPT datastore.' + ); + + $this->assertEquals( + $refreshed_order->get_meta( 'bar' ), + '', + 'Meta data deleted from the HPOS datastore should also be deleted from the CPT datastore.' ); } @@ -262,6 +272,10 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { $order = OrderHelper::create_order(); $order->add_meta_data( 'foo', 'bar' ); + $order->add_meta_data( 'bar', 'baz' ); + $order->save_meta_data(); + + $order->delete_meta_data( 'bar' ); $order->save_meta_data(); update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'yes' ); @@ -270,7 +284,13 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { $this->assertEquals( $refreshed_order->get_meta( 'foo' ), 'bar', - 'Meta data persisted via the CPT datastore is accessible via the HPOS datastore' + 'Meta data persisted via the CPT datastore is accessible via the HPOS datastore.' + ); + + $this->assertEquals( + $refreshed_order->get_meta( 'bar' ), + '', + 'Meta data deleted from the CPT datastore should also be deleted from the HPOS datastore.' ); } } From c76a999ae979e957004b76cec15293eccfa2c188 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Wed, 22 Mar 2023 21:19:42 -0500 Subject: [PATCH 1202/1680] Propagate metadata deletion --- .../abstract-wc-order-data-store-cpt.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/data-stores/abstract-wc-order-data-store-cpt.php b/plugins/woocommerce/includes/data-stores/abstract-wc-order-data-store-cpt.php index b26a0875462..6d29543da62 100644 --- a/plugins/woocommerce/includes/data-stores/abstract-wc-order-data-store-cpt.php +++ b/plugins/woocommerce/includes/data-stores/abstract-wc-order-data-store-cpt.php @@ -613,14 +613,28 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme foreach ( $order->get_meta_data() as $meta_data ) { if ( isset( $existing_meta_data[ $meta_data->key ] ) ) { if ( $existing_meta_data[ $meta_data->key ] === $meta_data->value ) { + unset( $existing_meta_data[ $meta_data->key ] ); continue; } - delete_post_meta( $order->get_id(), $meta_data->key ); + unset( $existing_meta_data[ $meta_data->key ] ); + delete_post_meta( $order->get_id(), $meta_data->key ); } add_post_meta( $order->get_id(), $meta_data->key, $meta_data->value, false ); } + // Find remaining meta that was deleted from the order but still present in the associated post. + // Post meta corresponding to order props is excluded (as it shouldn't be deleted). + $keys_to_delete = array_diff( + array_keys( $existing_meta_data ), + $this->internal_meta_keys, + array_keys( $this->get_internal_data_store_key_getters() ) + ); + + foreach ( $keys_to_delete as $meta_key ) { + delete_post_meta( $order->get_id(), $meta_key ); + } + $this->update_post_meta( $order ); } } From 0e1f74ae5a93788c9d90f65102b9df29017e202a Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson Date: Thu, 23 Mar 2023 09:26:27 +0000 Subject: [PATCH 1203/1680] update incorrect variable name in api-core-test --- .../tests/api-core-tests/tests/products/products-crud.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js index 098f686712a..9ab7a6163e1 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/products/products-crud.test.js @@ -929,7 +929,7 @@ test.describe('Products API tests: CRUD', () => { productTagId = responseJSON.id; expect(response.status()).toEqual(201); - expect(typeof productId).toEqual('number'); + expect(typeof productTagId).toEqual('number'); expect(responseJSON.name).toEqual('Leather Shoes'); expect(responseJSON.slug).toEqual('leather-shoes'); }); From 8806f0d6eea46e91bd5554919c3abc6e4dce0160 Mon Sep 17 00:00:00 2001 From: nigeljamesstevenson Date: Thu, 23 Mar 2023 09:31:40 +0000 Subject: [PATCH 1204/1680] changelog entry --- .../changelog/fix-incorrect-variable-in-api-core-tests-37387 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-incorrect-variable-in-api-core-tests-37387 diff --git a/plugins/woocommerce/changelog/fix-incorrect-variable-in-api-core-tests-37387 b/plugins/woocommerce/changelog/fix-incorrect-variable-in-api-core-tests-37387 new file mode 100644 index 00000000000..bd976e51b5c --- /dev/null +++ b/plugins/woocommerce/changelog/fix-incorrect-variable-in-api-core-tests-37387 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix incorrect variable name in api-core-tests From 41c2549f2087032347beade453eb9b80951646ef Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 23 Mar 2023 16:06:16 +0530 Subject: [PATCH 1205/1680] Remove manual meta handling code since custom meta is synced now. --- .../DataStores/Orders/OrdersTableDataStore.php | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 410b6faa6cd..4050de796f1 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -1964,21 +1964,6 @@ FROM $order_meta_table $order->delete_meta_data( '_wp_trash_meta_comments_status' ); $order->save_meta_data(); - $data_synchronizer = wc_get_container()->get( DataSynchronizer::class ); - if ( $data_synchronizer->data_sync_is_enabled() ) { - // The previous $order->save() will have forced a sync to the posts table, - // this implies that the post status is not "trash" anymore, and thus - // wp_untrash_post would do nothing. - wp_update_post( - array( - 'ID' => $id, - 'post_status' => 'trash', - ) - ); - - wp_untrash_post( $id ); - } - return true; } From 4f7705f6913fb8180f1956ae6766acc976748e38 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Thu, 23 Mar 2023 23:19:34 +0800 Subject: [PATCH 1206/1680] Always use MarketingOverviewMultichannel for marketing page. --- plugins/woocommerce-admin/client/layout/controller.js | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/plugins/woocommerce-admin/client/layout/controller.js b/plugins/woocommerce-admin/client/layout/controller.js index 023b9af24c5..1863c17522e 100644 --- a/plugins/woocommerce-admin/client/layout/controller.js +++ b/plugins/woocommerce-admin/client/layout/controller.js @@ -51,11 +51,6 @@ const Dashboard = lazy( () => const Homescreen = lazy( () => import( /* webpackChunkName: "homescreen" */ '../homescreen' ) ); -const MarketingOverview = lazy( () => - import( - /* webpackChunkName: "marketing-overview" */ '../marketing/overview' - ) -); const MarketingOverviewMultichannel = lazy( () => import( /* webpackChunkName: "multichannel-marketing" */ '../marketing/overview-multichannel' @@ -157,9 +152,7 @@ export const getPages = () => { if ( window.wcAdminFeatures.marketing ) { pages.push( { - container: window.wcAdminFeatures[ 'multichannel-marketing' ] - ? MarketingOverviewMultichannel - : MarketingOverview, + container: MarketingOverviewMultichannel, path: '/marketing', breadcrumbs: [ ...initialBreadcrumbs, From 51a57c2808f01356ea7117ebb9ef0472bb60d692 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Thu, 23 Mar 2023 23:28:55 +0800 Subject: [PATCH 1207/1680] Remove unused Button component in marketing directory. --- .../marketing/components/button/README.md | 22 ------------------- .../marketing/components/button/index.js | 22 ------------------- .../marketing/components/button/style.scss | 6 ----- .../client/marketing/components/index.js | 1 - 4 files changed, 51 deletions(-) delete mode 100644 plugins/woocommerce-admin/client/marketing/components/button/README.md delete mode 100644 plugins/woocommerce-admin/client/marketing/components/button/index.js delete mode 100644 plugins/woocommerce-admin/client/marketing/components/button/style.scss diff --git a/plugins/woocommerce-admin/client/marketing/components/button/README.md b/plugins/woocommerce-admin/client/marketing/components/button/README.md deleted file mode 100644 index 5c0298a9428..00000000000 --- a/plugins/woocommerce-admin/client/marketing/components/button/README.md +++ /dev/null @@ -1,22 +0,0 @@ -Button -=== - -This component creates simple reusable html `` element. - -## Usage - -```jsx - -``` - -### Props - -Name | Type | Default | Description ---- | --- | --- | --- -`className` | String | `null` | Additional class name to style the component diff --git a/plugins/woocommerce-admin/client/marketing/components/button/index.js b/plugins/woocommerce-admin/client/marketing/components/button/index.js deleted file mode 100644 index 0542f4fc998..00000000000 --- a/plugins/woocommerce-admin/client/marketing/components/button/index.js +++ /dev/null @@ -1,22 +0,0 @@ -/** - * External dependencies - */ -import { Button } from '@wordpress/components'; -import classnames from 'classnames'; - -/** - * Internal dependencies - */ -import './style.scss'; - -export default ( props ) => { - return ( - ; } } @@ -71,7 +71,7 @@ describe( 'Form', () => { onChange={ mockOnChange } validate={ () => ( {} ) } > - { ( { setValue }: FormContext< Record< string, string > > ) => { + { ( { setValue }: FormContextType< Record< string, string > > ) => { return ( ; } } @@ -124,7 +124,7 @@ describe( 'Form', () => { const { queryByText } = render(
    ( {} ) }> - { ( { setValue }: FormContext< Record< string, string > > ) => { + { ( { setValue }: FormContextType< Record< string, string > > ) => { return ( - ); - } - - getFinishSetupButton() { - return ( - - ); - } - - render() { - const { name, description, status, slug } = this.props; - let actions = null; - - switch ( status ) { - case 'installed': - actions = this.getActivateButton(); - break; - case 'activated': - actions = this.getFinishSetupButton(); - break; - case 'configured': - actions = this.getLinks(); - break; - } - - return ( -
    - -
    -
    -

    { name }

    - { status === 'configured' || ( -

    - { description } -

    - ) } -
    -
    - { actions } -
    -
    -
    - ); - } -} - -InstalledExtensionRow.defaultProps = { - isLoading: false, -}; - -InstalledExtensionRow.propTypes = { - name: PropTypes.string.isRequired, - slug: PropTypes.string.isRequired, - description: PropTypes.string.isRequired, - status: PropTypes.string.isRequired, - settingsUrl: PropTypes.string, - docsUrl: PropTypes.string, - supportUrl: PropTypes.string, - dashboardUrl: PropTypes.string, - activatePlugin: PropTypes.func.isRequired, -}; - -export default InstalledExtensionRow; diff --git a/plugins/woocommerce-admin/client/marketing/overview/installed-extensions/style.scss b/plugins/woocommerce-admin/client/marketing/overview/installed-extensions/style.scss deleted file mode 100644 index 8968f5315fe..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/installed-extensions/style.scss +++ /dev/null @@ -1,91 +0,0 @@ -.woocommerce-marketing-installed-extensions-card { - &__item { - display: flex; - align-items: center; - padding: 18px 24px; - - h4 { - font-weight: 400; - font-size: 16px; - margin: 0 0 5px; - color: $gray-900; - } - - p { - color: $gray-700; - margin: 0; - } - } - - &__item:not(:last-child) { - border-bottom: 1px solid $gray-200; - } - - &__item-text-and-actions { - display: flex; - flex-wrap: wrap; - align-items: center; - flex-grow: 2; - min-width: 0; // Flexbox truncated text fix - - @include breakpoint( '>600px' ) { - flex-wrap: nowrap; - } - } - - &__item-actions { - @include breakpoint( '>600px' ) { - text-align: right; - white-space: nowrap; - padding-left: 25px; - } - } - - &__item-description { - @include breakpoint( '>960px' ) { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 550px; - } - } - - &__item-links { - margin: 0; - padding: 0; - - li { - display: inline-block; - margin: 0 25px 0 0; - - @include breakpoint( '>600px' ) { - margin: 0 0 0 30px; - } - } - - a { - font-weight: 600; - color: var(--wp-admin-theme-color) !important; - text-decoration: none; - font-size: 14px; - } - } - - .woocommerce-admin-marketing-product-icon { - align-self: flex-start; - margin-right: 14px; - margin-top: 2px; // Align top of image with text - } - - &__item-text { - min-width: 0; // Flexbox truncated text fix - flex-grow: 2; - margin: 0 0 10px; - width: 100%; - - @include breakpoint( '>600px' ) { - margin: 0; - width: auto; - } - } -} diff --git a/plugins/woocommerce-admin/client/marketing/overview/section-slot/index.ts b/plugins/woocommerce-admin/client/marketing/overview/section-slot/index.ts deleted file mode 100644 index 38d712f793e..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/section-slot/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './section-slot'; -export * from './utils'; diff --git a/plugins/woocommerce-admin/client/marketing/overview/section-slot/section-slot.tsx b/plugins/woocommerce-admin/client/marketing/overview/section-slot/section-slot.tsx deleted file mode 100644 index f06fc18292e..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/section-slot/section-slot.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/** - * External dependencies - */ -import { useSlot } from '@woocommerce/experimental'; -import classnames from 'classnames'; - -/** - * Internal dependencies - */ -import { - EXPERIMENTAL_WC_MARKETING_OVERVIEW_SECTION_SLOT_NAME, - WooMarketingOverviewSection, -} from './utils'; - -export const MarketingOverviewSectionSlot = ( { - className, -}: { - className: string; -} ) => { - const slot = useSlot( - EXPERIMENTAL_WC_MARKETING_OVERVIEW_SECTION_SLOT_NAME - ); - const hasFills = Boolean( slot?.fills?.length ); - - if ( ! hasFills ) { - return null; - } - return ( -
    - -
    - ); -}; diff --git a/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx b/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx deleted file mode 100644 index 5c9a9de9ea0..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/section-slot/utils.tsx +++ /dev/null @@ -1,63 +0,0 @@ -/** - * External dependencies - */ -import { Slot, Fill } from '@wordpress/components'; -import { - createOrderedChildren, - sortFillsByOrder, -} from '@woocommerce/components'; - -export const EXPERIMENTAL_WC_MARKETING_OVERVIEW_SECTION_SLOT_NAME = - 'experimental_woocommerce_marketing_overview_section'; -/** - * Create a Fill for extensions to add a section to the Marketing Overview page. - * - * @slotFill WooMarketingOverviewSection - * @scope woocommerce-admin - * @example - * const MySection = () => ( - * - *
    - *
    - * Slotfill goes in here! - *
    - *
    - *
    - * ); - * - * registerPlugin( 'my-extension', { - * render: MySection, - * scope: 'woocommerce-admin', - * } ); - * @param {Object} param0 - * @param {Array} param0.children - Node children. - * @param {Array} param0.order - Node order. - */ -export const WooMarketingOverviewSection = ( { - children, - order = 1, -}: { - children: React.ReactNode; - order?: number; -} ) => { - return ( - - { ( fillProps: Fill.Props ) => { - return createOrderedChildren( children, order, fillProps ); - } } - - ); -}; - -WooMarketingOverviewSection.Slot = ( { - fillProps, -}: { - fillProps?: Slot.Props; -} ) => ( - - { sortFillsByOrder } - -); diff --git a/plugins/woocommerce-admin/client/marketing/overview/style.scss b/plugins/woocommerce-admin/client/marketing/overview/style.scss deleted file mode 100644 index eaf6fdbbf4f..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/style.scss +++ /dev/null @@ -1,8 +0,0 @@ -.woocommerce-marketing-overview { - max-width: 1032px; - margin: 0 auto; - - .components-card { - margin-bottom: 24px; - } -} diff --git a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/images/welcome.svg b/plugins/woocommerce-admin/client/marketing/overview/welcome-card/images/welcome.svg deleted file mode 100644 index ae8d8a7a75f..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/images/welcome.svg +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/index.js b/plugins/woocommerce-admin/client/marketing/overview/welcome-card/index.js deleted file mode 100644 index 99ed62c0b46..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/index.js +++ /dev/null @@ -1,85 +0,0 @@ -/** - * External dependencies - */ -import { __ } from '@wordpress/i18n'; -import { Button, Card, CardBody } from '@wordpress/components'; -import CrossIcon from 'gridicons/dist/cross'; -import { compose } from '@wordpress/compose'; -import { withDispatch, withSelect } from '@wordpress/data'; -import PropTypes from 'prop-types'; -import { OPTIONS_STORE_NAME } from '@woocommerce/data'; -import { recordEvent } from '@woocommerce/tracks'; - -/** - * Internal dependencies - */ -import './style.scss'; -import WelcomeImage from './images/welcome.svg'; - -const WelcomeCard = ( { isHidden, updateOptions } ) => { - const hide = () => { - updateOptions( { - woocommerce_marketing_overview_welcome_hidden: 'yes', - } ); - recordEvent( 'marketing_intro_close', {} ); - }; - - if ( isHidden ) { - return null; - } - - return ( - - - - -

    - { __( - 'Grow your customer base and increase your sales with marketing tools built for WooCommerce', - 'woocommerce' - ) } -

    -
    -
    - ); -}; - -WelcomeCard.propTypes = { - /** - * Whether the card is hidden. - */ - isHidden: PropTypes.bool.isRequired, - /** - * updateOptions function. - */ - updateOptions: PropTypes.func.isRequired, -}; - -// named export -export { WelcomeCard }; - -// default export -export default compose( - withSelect( ( select ) => { - const { getOption, isOptionsUpdating } = select( OPTIONS_STORE_NAME ); - const isUpdateRequesting = isOptionsUpdating(); - - return { - isHidden: - getOption( 'woocommerce_marketing_overview_welcome_hidden' ) === - 'yes' || isUpdateRequesting, - }; - } ), - withDispatch( ( dispatch ) => { - const { updateOptions } = dispatch( OPTIONS_STORE_NAME ); - return { - updateOptions, - }; - } ) -)( WelcomeCard ); diff --git a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/style.scss b/plugins/woocommerce-admin/client/marketing/overview/welcome-card/style.scss deleted file mode 100644 index 3a6549a89ee..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/style.scss +++ /dev/null @@ -1,76 +0,0 @@ -.woocommerce-marketing-overview-welcome-card { - position: relative; - - .components-card__body { - display: flex; - justify-content: center; - align-items: center; - flex-wrap: wrap; - padding: 22px; - - @include breakpoint( '>600px' ) { - flex-wrap: nowrap; - } - - @include breakpoint( '>960px' ) { - padding: 32px 108px; - } - } - - &__hide-button { - display: flex; - align-items: center; - padding: 8px; - margin: 0; - border: none; - background: none; - color: $gray-700; - overflow: hidden; - border-radius: 4px; - position: absolute; - top: 10px; - right: 10px; - - // Ensure that even SVG icons that don't include the .dashicon class are colored. - svg { - fill: currentColor; - outline: none; - } - - &:not(:disabled):not([aria-disabled='true']):not(.is-default):hover { - @include button-style__hover; - } - - &:not(:disabled):not([aria-disabled='true']):not(.is-default):active { - @include button-style__active; - } - - &[aria-disabled='true']:focus, - &:disabled:focus { - box-shadow: none; - } - } - - h3 { - font-size: 20px; - line-height: 26px; - font-weight: normal; - text-align: center; - margin: 1em 0 0; - - @include breakpoint( '>600px' ) { - text-align: left; - margin: 0 0 0 20px; - } - - @include breakpoint( '>960px' ) { - font-size: 24px; - line-height: 32px; - } - } - - img { - width: 231px; - flex: none; - } -} diff --git a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/test/index.js b/plugins/woocommerce-admin/client/marketing/overview/welcome-card/test/index.js deleted file mode 100644 index b737ff6f204..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview/welcome-card/test/index.js +++ /dev/null @@ -1,68 +0,0 @@ -/** - * External dependencies - */ -import { recordEvent } from '@woocommerce/tracks'; -import { render, waitFor } from '@testing-library/react'; -import userEvent from '@testing-library/user-event'; -import { createElement } from '@wordpress/element'; - -/** - * Internal dependencies - */ -import { WelcomeCard } from '../index.js'; - -jest.mock( '@woocommerce/tracks' ); -jest.mock( '@woocommerce/settings' ); - -describe( 'WelcomeCard hide button', () => { - it( 'should record an event when clicked', () => { - const { getByRole } = render( - - ); - - userEvent.click( getByRole( 'button', { name: 'Hide' } ) ); - - expect( recordEvent ).toHaveBeenCalledTimes( 1 ); - expect( recordEvent ).toHaveBeenCalledWith( - 'marketing_intro_close', - {} - ); - } ); - - it( 'should update option when clicked', async () => { - const mockUpdateOptions = jest.fn(); - const { getByRole } = render( - - ); - - userEvent.click( getByRole( 'button' ) ); - - await waitFor( () => - expect( mockUpdateOptions ).toHaveBeenCalledTimes( 1 ) - ); - expect( mockUpdateOptions ).toHaveBeenCalledWith( { - woocommerce_marketing_overview_welcome_hidden: 'yes', - } ); - } ); -} ); - -describe( 'Component visibility can be toggled', () => { - it( 'WelcomeCard should be visible if isHidden is false', () => { - const { getByRole } = render( - - ); - - expect( getByRole( 'button' ) ).toBeInTheDocument(); - } ); - - it( 'WelcomeCard should be hidden if isHidden is true', () => { - const { queryByRole } = render( - - ); - - expect( queryByRole( 'button' ) ).toBeNull(); - } ); -} ); From ec2cc54c095bdfef98b7720ce87be7e7b5aeaa77 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Fri, 24 Mar 2023 20:01:44 +0800 Subject: [PATCH 1222/1680] Remove feature toggle in WC Settings page. --- .../woocommerce/client/admin/config/core.json | 1 - .../client/admin/config/development.json | 1 - .../src/Admin/Features/Features.php | 2 - .../Features/MultichannelMarketing/Init.php | 87 ------------------- 4 files changed, 91 deletions(-) delete mode 100644 plugins/woocommerce/src/Admin/Features/MultichannelMarketing/Init.php diff --git a/plugins/woocommerce/client/admin/config/core.json b/plugins/woocommerce/client/admin/config/core.json index 48e6fe51ff5..f796d84a040 100644 --- a/plugins/woocommerce/client/admin/config/core.json +++ b/plugins/woocommerce/client/admin/config/core.json @@ -11,7 +11,6 @@ "shipping-setting-tour": true, "homescreen": true, "marketing": true, - "multichannel-marketing": true, "minified-js": false, "mobile-app-banner": true, "navigation": true, diff --git a/plugins/woocommerce/client/admin/config/development.json b/plugins/woocommerce/client/admin/config/development.json index 39286384fb8..b2511893a64 100644 --- a/plugins/woocommerce/client/admin/config/development.json +++ b/plugins/woocommerce/client/admin/config/development.json @@ -11,7 +11,6 @@ "shipping-setting-tour": true, "homescreen": true, "marketing": true, - "multichannel-marketing": true, "minified-js": true, "mobile-app-banner": true, "navigation": true, diff --git a/plugins/woocommerce/src/Admin/Features/Features.php b/plugins/woocommerce/src/Admin/Features/Features.php index cca803dbca9..681b322bb6c 100644 --- a/plugins/woocommerce/src/Admin/Features/Features.php +++ b/plugins/woocommerce/src/Admin/Features/Features.php @@ -26,7 +26,6 @@ class Features { * @var array */ protected static $optional_features = array( - 'multichannel-marketing' => array( 'default' => 'no' ), 'navigation' => array( 'default' => 'no' ), 'settings' => array( 'default' => 'no' ), 'analytics' => array( 'default' => 'yes' ), @@ -39,7 +38,6 @@ class Features { * @var array */ protected static $beta_features = array( - 'multichannel-marketing', 'navigation', 'new-product-management-experience', 'block-editor-feature-enabled', diff --git a/plugins/woocommerce/src/Admin/Features/MultichannelMarketing/Init.php b/plugins/woocommerce/src/Admin/Features/MultichannelMarketing/Init.php deleted file mode 100644 index 1d9aa43c805..00000000000 --- a/plugins/woocommerce/src/Admin/Features/MultichannelMarketing/Init.php +++ /dev/null @@ -1,87 +0,0 @@ - __( 'Marketing', 'woocommerce' ), - 'desc' => $description, - 'id' => self::TOGGLE_OPTION_NAME, - 'type' => 'checkbox', - 'class' => '', - ); - - return $features; - } - - /** - * Reloads the page when the option is toggled to make sure all Multichannel Marketing features are loaded. - * - * @param string $old_value Old value. - * @param string $value New value. - */ - public static function reload_page_on_toggle( $old_value, $value ) { - if ( $old_value === $value ) { - return; - } - - self::$is_updated = true; - } - - /** - * Reload the page if the setting has been updated. - */ - public static function maybe_reload_page() { - if ( ! isset( $_SERVER['REQUEST_URI'] ) || ! self::$is_updated ) { - return; - } - - wp_safe_redirect( wp_unslash( $_SERVER['REQUEST_URI'] ) ); - exit(); - } -} From 2cd529bcdaac98dd1f385fb79b1dc88085db19bf Mon Sep 17 00:00:00 2001 From: Konstantinos Megas <44091936+nextdoorpanda@users.noreply.github.com> Date: Fri, 24 Mar 2023 15:05:34 +0200 Subject: [PATCH 1223/1680] fix typos (#37407) * fix typos fix typos * Add changelog --------- Co-authored-by: Ilyas Foo --- .../changelog/fix-typo-in-stats-controller | 4 ++++ .../Admin/API/Reports/Customers/Stats/Controller.php | 12 ++++++------ 2 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-typo-in-stats-controller diff --git a/plugins/woocommerce/changelog/fix-typo-in-stats-controller b/plugins/woocommerce/changelog/fix-typo-in-stats-controller new file mode 100644 index 00000000000..b2d5cc53fad --- /dev/null +++ b/plugins/woocommerce/changelog/fix-typo-in-stats-controller @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Fix typo in Stats controller diff --git a/plugins/woocommerce/src/Admin/API/Reports/Customers/Stats/Controller.php b/plugins/woocommerce/src/Admin/API/Reports/Customers/Stats/Controller.php index f6c214c96ba..0dcff06e2ab 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/Customers/Stats/Controller.php +++ b/plugins/woocommerce/src/Admin/API/Reports/Customers/Stats/Controller.php @@ -221,22 +221,22 @@ class Controller extends \WC_REST_Reports_Controller { ), ); $params['name_includes'] = array( - 'description' => __( 'Limit response to objects with specfic names.', 'woocommerce' ), + 'description' => __( 'Limit response to objects with specific names.', 'woocommerce' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); $params['name_excludes'] = array( - 'description' => __( 'Limit response to objects excluding specfic names.', 'woocommerce' ), + 'description' => __( 'Limit response to objects excluding specific names.', 'woocommerce' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); $params['username_includes'] = array( - 'description' => __( 'Limit response to objects with specfic usernames.', 'woocommerce' ), + 'description' => __( 'Limit response to objects with specific usernames.', 'woocommerce' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); $params['username_excludes'] = array( - 'description' => __( 'Limit response to objects excluding specfic usernames.', 'woocommerce' ), + 'description' => __( 'Limit response to objects excluding specific usernames.', 'woocommerce' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); @@ -251,12 +251,12 @@ class Controller extends \WC_REST_Reports_Controller { 'validate_callback' => 'rest_validate_request_arg', ); $params['country_includes'] = array( - 'description' => __( 'Limit response to objects with specfic countries.', 'woocommerce' ), + 'description' => __( 'Limit response to objects with specific countries.', 'woocommerce' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); $params['country_excludes'] = array( - 'description' => __( 'Limit response to objects excluding specfic countries.', 'woocommerce' ), + 'description' => __( 'Limit response to objects excluding specific countries.', 'woocommerce' ), 'type' => 'string', 'validate_callback' => 'rest_validate_request_arg', ); From 47587065c9850be128268803f805a167173b03f7 Mon Sep 17 00:00:00 2001 From: Ilyas Foo Date: Fri, 24 Mar 2023 16:07:10 +0300 Subject: [PATCH 1224/1680] Fix `possibly_refresh_data_source_pollers` function (#37397) * Add default value for get_option * Changelog --- plugins/woocommerce/changelog/fix-37389-error-option-not-set | 4 ++++ plugins/woocommerce/src/Internal/Admin/Events.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-37389-error-option-not-set diff --git a/plugins/woocommerce/changelog/fix-37389-error-option-not-set b/plugins/woocommerce/changelog/fix-37389-error-option-not-set new file mode 100644 index 00000000000..00bec2f5166 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-37389-error-option-not-set @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Add default value when calling get_option for woocommerce_task_list_tracked_completed_tasks. diff --git a/plugins/woocommerce/src/Internal/Admin/Events.php b/plugins/woocommerce/src/Internal/Admin/Events.php index e745fe7c86d..bf03ef7ba34 100644 --- a/plugins/woocommerce/src/Internal/Admin/Events.php +++ b/plugins/woocommerce/src/Internal/Admin/Events.php @@ -260,7 +260,7 @@ class Events { * - RemoteFreeExtensionsDataSourcePoller */ protected function possibly_refresh_data_source_pollers() { - $completed_tasks = get_option( 'woocommerce_task_list_tracked_completed_tasks' ); + $completed_tasks = get_option( 'woocommerce_task_list_tracked_completed_tasks', array() ); if ( ! in_array( 'payments', $completed_tasks, true ) && ! in_array( 'woocommerce-payments', $completed_tasks, true ) ) { PaymentGatewaySuggestionsDataSourcePoller::get_instance()->read_specs_from_data_sources(); From e1226eb9c37c478f62a4dbd56f287276dab8f9c4 Mon Sep 17 00:00:00 2001 From: John Greys Date: Fri, 24 Mar 2023 14:20:25 +0000 Subject: [PATCH 1225/1680] Dev - Add customer object parameter to taxable address filter --- plugins/woocommerce/includes/class-wc-customer.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/class-wc-customer.php b/plugins/woocommerce/includes/class-wc-customer.php index 43587c5d1e3..e967ce3b3e0 100644 --- a/plugins/woocommerce/includes/class-wc-customer.php +++ b/plugins/woocommerce/includes/class-wc-customer.php @@ -207,7 +207,15 @@ class WC_Customer extends WC_Legacy_Customer { $city = $this->get_shipping_city(); } - return apply_filters( 'woocommerce_customer_taxable_address', array( $country, $state, $postcode, $city ) ); + /** + * Filters the taxable address for a given customer. + * + * @param array $taxable_address An array of country, state, postcode, and city for the customer's taxable address. + * @param object $customer The customer object for which the taxable address is being requested. + * + * @return array The filtered taxable address for the customer. + */ + return apply_filters( 'woocommerce_customer_taxable_address', array( $country, $state, $postcode, $city ), $this ); } /** From c8d0ab3019d3b33379c821087829a1522efa94f5 Mon Sep 17 00:00:00 2001 From: John Greys Date: Fri, 24 Mar 2023 14:22:41 +0000 Subject: [PATCH 1226/1680] Add changelog file --- .../changelog/add-customer-object-taxable-address-filter | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-customer-object-taxable-address-filter diff --git a/plugins/woocommerce/changelog/add-customer-object-taxable-address-filter b/plugins/woocommerce/changelog/add-customer-object-taxable-address-filter new file mode 100644 index 00000000000..24dddd173b1 --- /dev/null +++ b/plugins/woocommerce/changelog/add-customer-object-taxable-address-filter @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Dev - Add customer object parameter to taxable address filter From 126187b79481783e3457a1173157fe94fa109e74 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 24 Mar 2023 21:20:53 +0530 Subject: [PATCH 1227/1680] Fix imported ContainerInterface (#37334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Viktor Szépe --- plugins/woocommerce/changelog/pr-37055 | 4 ++++ plugins/woocommerce/src/Proxies/LegacyProxy.php | 2 +- plugins/woocommerce/tests/php/src/Proxies/LegacyProxyTest.php | 2 +- 3 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/pr-37055 diff --git a/plugins/woocommerce/changelog/pr-37055 b/plugins/woocommerce/changelog/pr-37055 new file mode 100644 index 00000000000..ce0f7867340 --- /dev/null +++ b/plugins/woocommerce/changelog/pr-37055 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Corrects imported ContainerInterface. It was not replaced because of the leading backslash. diff --git a/plugins/woocommerce/src/Proxies/LegacyProxy.php b/plugins/woocommerce/src/Proxies/LegacyProxy.php index e968bdd423e..1ab50dea99c 100644 --- a/plugins/woocommerce/src/Proxies/LegacyProxy.php +++ b/plugins/woocommerce/src/Proxies/LegacyProxy.php @@ -6,7 +6,7 @@ namespace Automattic\WooCommerce\Proxies; use Automattic\WooCommerce\Internal\DependencyManagement\Definition; -use Psr\Container\ContainerInterface; +use Automattic\WooCommerce\Vendor\Psr\Container\ContainerInterface; /** * Proxy class to access legacy WooCommerce functionality. diff --git a/plugins/woocommerce/tests/php/src/Proxies/LegacyProxyTest.php b/plugins/woocommerce/tests/php/src/Proxies/LegacyProxyTest.php index 05f427bd640..1b05d059e1a 100644 --- a/plugins/woocommerce/tests/php/src/Proxies/LegacyProxyTest.php +++ b/plugins/woocommerce/tests/php/src/Proxies/LegacyProxyTest.php @@ -32,7 +32,7 @@ class LegacyProxyTest extends \WC_Unit_Test_Case { */ public function test_get_instance_of_throws_when_trying_to_get_a_namespaced_class() { $this->expectException( \Exception::class ); - $this->expectExceptionMessage( 'The LegacyProxy class is not intended for getting instances of classes in the src directory, please use ' . Definition::INJECTION_METHOD . ' method injection or the instance of Psr\Container\ContainerInterface for that.' ); + $this->expectExceptionMessage( 'The LegacyProxy class is not intended for getting instances of classes in the src directory, please use ' . Definition::INJECTION_METHOD . ' method injection or the instance of Automattic\WooCommerce\Vendor\Psr\Container\ContainerInterface for that.' ); $this->sut->get_instance_of( DependencyClass::class ); } From 49299de1fd6ce41e143246c5733ca99b59ca4dbd Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 25 Mar 2023 00:40:29 +0800 Subject: [PATCH 1228/1680] Add changelog. --- .../feature-37367-marketing-multichannel-remove-toggle | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle diff --git a/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle b/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle new file mode 100644 index 00000000000..54f79f3f168 --- /dev/null +++ b/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Make Multichannel Marketing the default new UI for Marketing page. From 6a6dd1a710af66d154e3d5328feac7034de33321 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 25 Mar 2023 01:22:14 +0800 Subject: [PATCH 1229/1680] Fix failed api-core-tests. --- .../api-core-tests/tests/settings/settings-crud.test.js | 9 --------- 1 file changed, 9 deletions(-) diff --git a/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js b/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js index b8d10686e3c..f5314972d76 100644 --- a/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js +++ b/plugins/woocommerce/tests/api-core-tests/tests/settings/settings-crud.test.js @@ -1693,15 +1693,6 @@ test.describe('Settings API tests: CRUD', () => { "value": "yes", }) ])); - expect(responseJSON).toEqual( - expect.arrayContaining([ - expect.objectContaining({ - "id": "woocommerce_multichannel_marketing_enabled", - "label": "Marketing", - "description": "Enables the new WooCommerce Multichannel Marketing experience in the Marketing page", - "type": "checkbox", - }) - ])); expect(responseJSON).toEqual( expect.arrayContaining([ expect.objectContaining({ From 046b0195ab6ba23733dc0e28ab9be047d496ea61 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Sat, 25 Mar 2023 01:32:14 +0800 Subject: [PATCH 1230/1680] Update e2e test for marketing page. --- .../tests/admin-marketing/overview.spec.js | 40 +------------------ 1 file changed, 1 insertion(+), 39 deletions(-) diff --git a/plugins/woocommerce/tests/e2e-pw/tests/admin-marketing/overview.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/admin-marketing/overview.spec.js index 5de02a455b0..42e19921939 100644 --- a/plugins/woocommerce/tests/e2e-pw/tests/admin-marketing/overview.spec.js +++ b/plugins/woocommerce/tests/e2e-pw/tests/admin-marketing/overview.spec.js @@ -3,47 +3,9 @@ const { test, expect } = require( '@playwright/test' ); test.describe( 'Marketing page', () => { test.use( { storageState: process.env.ADMINSTATE } ); - test( 'A user can disable the Multichannel Marketing feature in WC Settings and view the Marketing > Overview page without it crashing', async ( { + test( 'A user can view the Marketing > Overview page without it crashing', async ( { page, } ) => { - // Go to WC Settings > Advanced > Features page. - await page.goto( - 'wp-admin/admin.php?page=wc-settings&tab=advanced§ion=features' - ); - - // Disable multichannel marketing experience by unchecking the checkbox and clicking on "Save changes" button. - await page - .locator( - '"Enables the new WooCommerce Multichannel Marketing experience in the Marketing page"' - ) - .uncheck(); - await page.locator( '"Save changes"' ).click(); - - // Go to the Marketing page. - await page.goto( 'wp-admin/admin.php?page=wc-admin&path=%2Fmarketing' ); - - // Users should see the knowledge base card. - await expect( - page.locator( '"WooCommerce knowledge base"' ) - ).toBeVisible(); - } ); - - test( 'A user can enable the Multichannel Marketing feature in WC Settings and view the Marketing > Overview page without it crashing', async ( { - page, - } ) => { - // Go to WC Settings > Advanced > Features page. - await page.goto( - 'wp-admin/admin.php?page=wc-settings&tab=advanced§ion=features' - ); - - // Enable multichannel marketing experience by checking the checkbox and clicking on "Save changes" button. - await page - .locator( - '"Enables the new WooCommerce Multichannel Marketing experience in the Marketing page"' - ) - .check(); - await page.locator( '"Save changes"' ).click(); - // Go to the Marketing page. await page.goto( 'wp-admin/admin.php?page=wc-admin&path=%2Fmarketing' ); From 1f698d258384e1c4c525e63f73094c3fc0167979 Mon Sep 17 00:00:00 2001 From: Nathan Silveira Date: Fri, 24 Mar 2023 14:49:45 -0300 Subject: [PATCH 1231/1680] Create experimental SelectTree component (#37319) * Create a new experimental component TreeSelect Add functionality to TreeControl to support additional scenarios * Fix a bug where the shouldNotRecursivelySelect was not passed to Trees inside Tree Items * Do not collapse nodes inside useEffect if they are already expanded * Add storybook example for SelectTreeControl * Move component to its own directory * Remove wrong comment * Fix CSS import path * Remove getFilteredItems from select-tree * Stop using getFilteredItems inside select tree Create new shouldShowCreateButton prop to allow receiving only filtered items inside component Remove support to show custom getItemLabel and getItemValue * Change interface * Rename back Item type names * Rename back value * Fix lint error and remove passing ref to treeProps * Make id mandatory in SelectTree * Refactor * Improve selector to focus on create button --- .../js/components/changelog/add-tree-select | 4 + .../experimental-select-control/combo-box.tsx | 23 +- .../src/experimental-select-control/types.ts | 3 +- .../experimental-select-tree-control/index.ts | 1 + .../select-tree.scss | 15 ++ .../select-tree.tsx | 199 ++++++++++++++++++ .../stories/index.tsx | 101 +++++++++ .../hooks/use-expander.ts | 3 +- .../hooks/use-keyboard.ts | 7 +- .../hooks/use-selection.ts | 18 +- .../hooks/use-tree-item.ts | 9 + .../hooks/use-tree.ts | 7 +- .../src/experimental-tree-control/tree.scss | 9 + .../src/experimental-tree-control/tree.tsx | 104 +++++++-- .../src/experimental-tree-control/types.ts | 26 ++- packages/js/components/src/index.ts | 6 +- packages/js/components/src/style.scss | 1 + 17 files changed, 494 insertions(+), 42 deletions(-) create mode 100644 packages/js/components/changelog/add-tree-select create mode 100644 packages/js/components/src/experimental-select-tree-control/index.ts create mode 100644 packages/js/components/src/experimental-select-tree-control/select-tree.scss create mode 100644 packages/js/components/src/experimental-select-tree-control/select-tree.tsx create mode 100644 packages/js/components/src/experimental-select-tree-control/stories/index.tsx diff --git a/packages/js/components/changelog/add-tree-select b/packages/js/components/changelog/add-tree-select new file mode 100644 index 00000000000..6bf7d04c3de --- /dev/null +++ b/packages/js/components/changelog/add-tree-select @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Create SelectTree component that uses TreeControl diff --git a/packages/js/components/src/experimental-select-control/combo-box.tsx b/packages/js/components/src/experimental-select-control/combo-box.tsx index 1589c09f13a..91cca1c1ecf 100644 --- a/packages/js/components/src/experimental-select-control/combo-box.tsx +++ b/packages/js/components/src/experimental-select-control/combo-box.tsx @@ -4,15 +4,10 @@ import { createElement, MouseEvent, useRef } from 'react'; import classNames from 'classnames'; -/** - * Internal dependencies - */ -import { Props } from './types'; - type ComboBoxProps = { children?: JSX.Element | JSX.Element[] | null; - comboBoxProps: Props; - inputProps: Props; + comboBoxProps: JSX.IntrinsicElements[ 'div' ]; + inputProps: JSX.IntrinsicElements[ 'input' ]; suffix?: JSX.Element | null; }; @@ -60,12 +55,14 @@ export const ComboBox = ( { { - inputRef.current = node; - ( - inputProps.ref as unknown as ( - node: HTMLInputElement | null - ) => void - )( node ); + if ( typeof inputProps.ref === 'function' ) { + inputRef.current = node; + ( + inputProps.ref as unknown as ( + node: HTMLInputElement | null + ) => void + )( node ); + } } } /> diff --git a/packages/js/components/src/experimental-select-control/types.ts b/packages/js/components/src/experimental-select-control/types.ts index 7d1a85f8cee..331b2d148b8 100644 --- a/packages/js/components/src/experimental-select-control/types.ts +++ b/packages/js/components/src/experimental-select-control/types.ts @@ -16,7 +16,8 @@ export type DefaultItemType = { export type SelectedType< ItemType > = ItemType | null; export type Props = { - [ key: string ]: string; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + [ key: string ]: any; }; export type getItemPropsType< ItemType > = ( diff --git a/packages/js/components/src/experimental-select-tree-control/index.ts b/packages/js/components/src/experimental-select-tree-control/index.ts new file mode 100644 index 00000000000..9ea352bc18b --- /dev/null +++ b/packages/js/components/src/experimental-select-tree-control/index.ts @@ -0,0 +1 @@ +export * from './select-tree'; diff --git a/packages/js/components/src/experimental-select-tree-control/select-tree.scss b/packages/js/components/src/experimental-select-tree-control/select-tree.scss new file mode 100644 index 00000000000..509dadf5d6c --- /dev/null +++ b/packages/js/components/src/experimental-select-tree-control/select-tree.scss @@ -0,0 +1,15 @@ +.woocommerce-experimental-select-control__combo-box-wrapper { + &:focus { + box-shadow: 0 0 0 1px var( --wp-admin-theme-color ); + border-color: var( --wp-admin-theme-color ); + } +} + +.woocommerce-experimental-select-tree-control__dropdown { + display: block; +} + +// That's the only way I could remove the padding from the @wordpress/components Dropdown. +.woocommerce-experimental-select-tree-control__dropdown-content .components-popover__content { + padding: 0; +} diff --git a/packages/js/components/src/experimental-select-tree-control/select-tree.tsx b/packages/js/components/src/experimental-select-tree-control/select-tree.tsx new file mode 100644 index 00000000000..7406ea9d0f7 --- /dev/null +++ b/packages/js/components/src/experimental-select-tree-control/select-tree.tsx @@ -0,0 +1,199 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/** + * External dependencies + */ +import { createElement, useRef, useState } from 'react'; +import classNames from 'classnames'; +import { search } from '@wordpress/icons'; +import { Dropdown, Spinner } from '@wordpress/components'; + +/** + * Internal dependencies + */ +import { useLinkedTree } from '../experimental-tree-control/hooks/use-linked-tree'; +import { Tree } from '../experimental-tree-control/tree'; +import { + Item, + LinkedTree, + TreeControlProps, +} from '../experimental-tree-control/types'; +import { SelectedItems } from '../experimental-select-control/selected-items'; +import { ComboBox } from '../experimental-select-control/combo-box'; +import { SuffixIcon } from '../experimental-select-control/suffix-icon'; + +interface SelectTreeProps extends TreeControlProps { + id: string; + selected?: Item[]; + getSelectedItemProps?: any; + treeRef?: React.ForwardedRef< HTMLOListElement >; + suffix?: JSX.Element | null; + isLoading?: boolean; + label: string | JSX.Element; + onInputChange?: ( value: string | undefined ) => void; +} + +export const SelectTree = function SelectTree( { + items, + getSelectedItemProps, + treeRef: ref, + suffix = , + placeholder, + isLoading, + onInputChange, + shouldShowCreateButton, + ...props +}: SelectTreeProps ) { + const linkedTree = useLinkedTree( items ); + + const [ isFocused, setIsFocused ] = useState( false ); + + const comboBoxRef = useRef< HTMLDivElement >( null ); + + // getting the parent's parent div width to set the width of the dropdown + const comboBoxWidth = + comboBoxRef.current?.parentElement?.parentElement?.getBoundingClientRect() + .width; + + const shouldItemBeExpanded = ( item: LinkedTree ): boolean => { + if ( ! props.createValue || ! item.children?.length ) return false; + return item.children.some( ( child ) => { + if ( + new RegExp( props.createValue || '', 'ig' ).test( + child.data.label + ) + ) { + return true; + } + return shouldItemBeExpanded( child ); + } ); + }; + + return ( + + isLoading ? ( +
    + +
    + ) : ( + + ) + } + renderToggle={ ( { isOpen, onToggle, onClose } ) => ( +
    + + { + if ( ! isOpen ) { + onToggle(); + } + setIsFocused( true ); + }, + onBlur: ( event ) => { + // if blurring to an element inside the dropdown, don't close it + if ( + isOpen && + ! document + .querySelector( + '.woocommerce-experimental-select-control ~ .components-popover' + ) + ?.contains( event.relatedTarget ) + ) { + onClose(); + } + setIsFocused( false ); + }, + onKeyDown: ( event ) => { + const baseQuery = + '.woocommerce-experimental-select-tree-control__dropdown > .components-popover'; + if ( event.key === 'ArrowDown' ) { + event.preventDefault(); + // focus on the first element from the Popover + ( + document.querySelector( + `${ baseQuery } input, ${ baseQuery } button` + ) as + | HTMLInputElement + | HTMLButtonElement + )?.focus(); + } + if ( event.key === 'Tab' ) { + onClose(); + } + }, + onChange: ( event ) => + onInputChange && + onInputChange( event.target.value ), + placeholder, + } } + suffix={ suffix } + > + item?.label || '' } + getItemValue={ ( item ) => item?.value || '' } + onRemove={ ( item ) => { + if ( + ! Array.isArray( item ) && + props.onRemove + ) { + props.onRemove( item ); + onClose(); + } + } } + getSelectedItemProps={ () => ( {} ) } + /> + +
    + ) } + /> + ); +}; diff --git a/packages/js/components/src/experimental-select-tree-control/stories/index.tsx b/packages/js/components/src/experimental-select-tree-control/stories/index.tsx new file mode 100644 index 00000000000..4034c571905 --- /dev/null +++ b/packages/js/components/src/experimental-select-tree-control/stories/index.tsx @@ -0,0 +1,101 @@ +/** + * External dependencies + */ + +import React, { createElement } from 'react'; + +/** + * Internal dependencies + */ +import { SelectTree } from '../select-tree'; +import { Item } from '../../experimental-tree-control/types'; + +const listItems: Item[] = [ + { value: '1', label: 'Technology' }, + { value: '1.1', label: 'Notebooks', parent: '1' }, + { value: '1.2', label: 'Phones', parent: '1' }, + { value: '1.2.1', label: 'iPhone', parent: '1.2' }, + { value: '1.2.1.1', label: 'iPhone 14 Pro', parent: '1.2.1' }, + { value: '1.2.1.2', label: 'iPhone 14 Pro Max', parent: '1.2.1' }, + { value: '1.2.2', label: 'Samsung', parent: '1.2' }, + { value: '1.2.2.1', label: 'Samsung Galaxy 22 Plus', parent: '1.2.2' }, + { value: '1.2.2.2', label: 'Samsung Galaxy 22 Ultra', parent: '1.2.2' }, + { value: '1.3', label: 'Wearables', parent: '1' }, + { value: '2', label: 'Hardware' }, + { value: '2.1', label: 'CPU', parent: '2' }, + { value: '2.2', label: 'GPU', parent: '2' }, + { value: '2.3', label: 'Memory RAM', parent: '2' }, + { value: '3', label: 'Other' }, +]; + +const filterItems = ( items: Item[], searchValue ) => { + const filteredItems = items.filter( ( e ) => + e.label.includes( searchValue ) + ); + const itemsToIterate = [ ...filteredItems ]; + while ( itemsToIterate.length > 0 ) { + // The filter should include the parents of the filtered items + const element = itemsToIterate.pop(); + if ( element ) { + const parent = listItems.find( + ( item ) => item.value === element.parent + ); + if ( parent && ! filteredItems.includes( parent ) ) { + filteredItems.push( parent ); + itemsToIterate.push( parent ); + } + } + } + return filteredItems; +}; + +export const MultipleSelectTree: React.FC = () => { + const [ value, setValue ] = React.useState( '' ); + const [ selected, setSelected ] = React.useState< Item[] >( [] ); + + const items = filterItems( listItems, value ); + + return ( + + ! value || + listItems.findIndex( ( item ) => item.label === typedValue ) === + -1 + } + createValue={ value } + // eslint-disable-next-line no-alert + onCreateNew={ () => alert( 'create new called' ) } + onInputChange={ ( a ) => setValue( a || '' ) } + onSelect={ ( selectedItems ) => { + if ( Array.isArray( selectedItems ) ) { + setSelected( [ ...selected, ...selectedItems ] ); + } + } } + onRemove={ ( removedItems ) => { + const newValues = Array.isArray( removedItems ) + ? selected.filter( + ( item ) => + ! removedItems.some( + ( { value: removedValue } ) => + item.value === removedValue + ) + ) + : selected.filter( + ( item ) => item.value !== removedItems.value + ); + setSelected( newValues ); + } } + /> + ); +}; + +export default { + title: 'WooCommerce Admin/experimental/SelectTreeControl', + component: SelectTree, +}; diff --git a/packages/js/components/src/experimental-tree-control/hooks/use-expander.ts b/packages/js/components/src/experimental-tree-control/hooks/use-expander.ts index e7cf63433eb..02a9e5e54d3 100644 --- a/packages/js/components/src/experimental-tree-control/hooks/use-expander.ts +++ b/packages/js/components/src/experimental-tree-control/hooks/use-expander.ts @@ -17,7 +17,8 @@ export function useExpander( { useEffect( () => { if ( item.children?.length && - typeof shouldItemBeExpanded === 'function' + typeof shouldItemBeExpanded === 'function' && + ! isExpanded ) { setExpanded( shouldItemBeExpanded( item ) ); } diff --git a/packages/js/components/src/experimental-tree-control/hooks/use-keyboard.ts b/packages/js/components/src/experimental-tree-control/hooks/use-keyboard.ts index e769975d85b..54db7555200 100644 --- a/packages/js/components/src/experimental-tree-control/hooks/use-keyboard.ts +++ b/packages/js/components/src/experimental-tree-control/hooks/use-keyboard.ts @@ -110,12 +110,14 @@ export function useKeyboard( { onExpand, onCollapse, onToggleExpand, + onLastItemLoop, }: { item: LinkedTree; isExpanded: boolean; onExpand(): void; onCollapse(): void; onToggleExpand(): void; + onLastItemLoop?( event: React.KeyboardEvent< HTMLDivElement > ): void; } ) { function onKeyDown( event: React.KeyboardEvent< HTMLDivElement > ) { if ( event.code === 'ArrowRight' ) { @@ -154,6 +156,9 @@ export function useKeyboard( { event.code ); element?.focus(); + if ( event.code === 'ArrowDown' && ! element && onLastItemLoop ) { + onLastItemLoop( event ); + } } if ( event.code === 'Home' ) { @@ -169,5 +174,5 @@ export function useKeyboard( { } } - return { onKeyDown }; + return { onKeyDown, onLastItemLoop }; } diff --git a/packages/js/components/src/experimental-tree-control/hooks/use-selection.ts b/packages/js/components/src/experimental-tree-control/hooks/use-selection.ts index 255799940cc..79e47bfc9ec 100644 --- a/packages/js/components/src/experimental-tree-control/hooks/use-selection.ts +++ b/packages/js/components/src/experimental-tree-control/hooks/use-selection.ts @@ -75,6 +75,7 @@ function hasSelectedSibblingChildren( export function useSelection( { item, multiple, + shouldNotRecursivelySelect, selected, level, index, @@ -89,6 +90,7 @@ export function useSelection( { | 'index' | 'onSelect' | 'onRemove' + | 'shouldNotRecursivelySelect' > ) { const selectedItems = useMemo( () => { if ( level === 1 && index === 0 ) { @@ -100,7 +102,11 @@ export function useSelection( { const checkedStatus: CheckedStatus = useMemo( () => { if ( item.data.value in selectedItems ) { - if ( multiple && isIndeterminate( selectedItems, item.children ) ) { + if ( + multiple && + ! shouldNotRecursivelySelect && + isIndeterminate( selectedItems, item.children ) + ) { return 'indeterminate'; } return 'checked'; @@ -113,7 +119,7 @@ export function useSelection( { if ( multiple ) { value = [ item.data ]; - if ( item.children.length ) { + if ( item.children.length && ! shouldNotRecursivelySelect ) { value.push( ...getDeepChildren( item ) ); } } else if ( item.children?.length ) { @@ -132,7 +138,7 @@ export function useSelection( { function onSelectChildren( value: Item | Item[] ) { if ( typeof onSelect !== 'function' ) return; - if ( multiple ) { + if ( multiple && ! shouldNotRecursivelySelect ) { value = [ item.data, ...( value as Item[] ) ]; } @@ -142,7 +148,11 @@ export function useSelection( { function onRemoveChildren( value: Item | Item[] ) { if ( typeof onRemove !== 'function' ) return; - if ( multiple && item.children?.length ) { + if ( + multiple && + item.children?.length && + ! shouldNotRecursivelySelect + ) { const hasSelectedSibbling = hasSelectedSibblingChildren( item.children, value as Item[], diff --git a/packages/js/components/src/experimental-tree-control/hooks/use-tree-item.ts b/packages/js/components/src/experimental-tree-control/hooks/use-tree-item.ts index 70f2a6d55db..35a08d19042 100644 --- a/packages/js/components/src/experimental-tree-control/hooks/use-tree-item.ts +++ b/packages/js/components/src/experimental-tree-control/hooks/use-tree-item.ts @@ -17,6 +17,7 @@ export function useTreeItem( { item, level, multiple, + shouldNotRecursivelySelect, selected, index, getLabel, @@ -24,6 +25,11 @@ export function useTreeItem( { shouldItemBeHighlighted, onSelect, onRemove, + isExpanded, + onCreateNew, + shouldShowCreateButton, + onLastItemLoop, + onTreeBlur, ...props }: TreeItemProps ) { const nextLevel = level + 1; @@ -41,6 +47,7 @@ export function useTreeItem( { index, onSelect, onRemove, + shouldNotRecursivelySelect, } ); const highlighter = useHighlighter( { @@ -56,6 +63,7 @@ export function useTreeItem( { const { onKeyDown } = useKeyboard( { ...expander, + onLastItemLoop, item, } ); @@ -96,6 +104,7 @@ export function useTreeItem( { getItemLabel: getLabel, shouldItemBeExpanded, shouldItemBeHighlighted, + shouldNotRecursivelySelect, onSelect: selection.onSelectChildren, onRemove: selection.onRemoveChildren, }, diff --git a/packages/js/components/src/experimental-tree-control/hooks/use-tree.ts b/packages/js/components/src/experimental-tree-control/hooks/use-tree.ts index abba8a76ccd..656473e9456 100644 --- a/packages/js/components/src/experimental-tree-control/hooks/use-tree.ts +++ b/packages/js/components/src/experimental-tree-control/hooks/use-tree.ts @@ -8,7 +8,6 @@ import { TreeProps } from '../types'; export function useTree( { - ref, items, level = 1, role = 'tree', @@ -19,6 +18,11 @@ export function useTree( { shouldItemBeHighlighted, onSelect, onRemove, + shouldNotRecursivelySelect, + createValue, + onTreeBlur, + onCreateNew, + shouldShowCreateButton, ...props }: TreeProps ) { return { @@ -35,6 +39,7 @@ export function useTree( { getLabel: getItemLabel, shouldItemBeExpanded, shouldItemBeHighlighted, + shouldNotRecursivelySelect, onSelect, onRemove, }, diff --git a/packages/js/components/src/experimental-tree-control/tree.scss b/packages/js/components/src/experimental-tree-control/tree.scss index 221208658d5..f33dfe422a2 100644 --- a/packages/js/components/src/experimental-tree-control/tree.scss +++ b/packages/js/components/src/experimental-tree-control/tree.scss @@ -12,4 +12,13 @@ border: 1px solid $gray-400; border-radius: 2px; } + &__button { + width: 100%; + &:hover, + &:focus-within { + outline: 1.5px solid var( --wp-admin-theme-color ); + outline-offset: -1.5px; + background-color: $gray-100; + } + } } diff --git a/packages/js/components/src/experimental-tree-control/tree.tsx b/packages/js/components/src/experimental-tree-control/tree.tsx index 64a975481ca..491c6c161bd 100644 --- a/packages/js/components/src/experimental-tree-control/tree.tsx +++ b/packages/js/components/src/experimental-tree-control/tree.tsx @@ -1,8 +1,12 @@ /** * External dependencies */ +import { Button, Icon } from '@wordpress/components'; +import { __, sprintf } from '@wordpress/i18n'; import classNames from 'classnames'; -import { createElement, forwardRef } from 'react'; +import { createElement, forwardRef, Fragment, useRef } from 'react'; +import { plus } from '@wordpress/icons'; +import { useMergeRefs } from '@wordpress/compose'; /** * Internal dependencies @@ -13,31 +17,93 @@ import { TreeProps } from './types'; export const Tree = forwardRef( function ForwardedTree( props: TreeProps, - ref: React.ForwardedRef< HTMLOListElement > + forwardedRef: React.ForwardedRef< HTMLOListElement > ) { + const rootListRef = useRef< HTMLOListElement >( null ); + const ref = useMergeRefs( [ rootListRef, forwardedRef ] ); + const { level, items, treeProps, treeItemProps } = useTree( { ...props, ref, } ); - if ( ! items.length ) return null; + const isCreateButtonVisible = + props.shouldShowCreateButton && + props.shouldShowCreateButton( props.createValue ); + return ( -
      +
        + { items.map( ( child, index ) => ( + { + ( + rootListRef.current + ?.closest( 'ol[role="tree"]' ) + ?.parentElement?.querySelector( + '.experimental-woocommerce-tree__button' + ) as HTMLButtonElement + )?.focus(); + } } + /> + ) ) } +
      + { isCreateButtonVisible && ( + ) } - > - { items.map( ( child, index ) => ( - - ) ) } -
    + ); } ); diff --git a/packages/js/components/src/experimental-tree-control/types.ts b/packages/js/components/src/experimental-tree-control/types.ts index bc25193e58e..8c60fd36194 100644 --- a/packages/js/components/src/experimental-tree-control/types.ts +++ b/packages/js/components/src/experimental-tree-control/types.ts @@ -14,7 +14,7 @@ export type CheckedStatus = 'checked' | 'unchecked' | 'indeterminate'; type BaseTreeProps = { /** - * It contians one item if `multiple` value is false or + * It contains one item if `multiple` value is false or * a list of items if it is true. */ selected?: Item | Item[]; @@ -22,6 +22,24 @@ type BaseTreeProps = { * Whether the tree items are single or multiple selected. */ multiple?: boolean; + /** + * In `multiple` mode, when this flag is also set, selecting children does + * not select their parents and selecting parents does not select their children. + */ + shouldNotRecursivelySelect?: boolean; + /** + * The value to be used for comparison to determine if 'create new' button should be shown. + */ + createValue?: string; + /** + * Called when the 'create new' button is clicked. + */ + onCreateNew?: () => void; + /** + * If passed, shows create button if return from callback is true + */ + shouldShowCreateButton?( value?: string ): boolean; + isExpanded?: boolean; /** * When `multiple` is true and a child item is selected, all its * ancestors and its descendants are also selected. If it's false @@ -54,6 +72,10 @@ type BaseTreeProps = { * @see {@link LinkedTree} */ shouldItemBeHighlighted?( item: LinkedTree ): boolean; + /** + * Called when the create button is clicked to help closing any related popover. + */ + onTreeBlur?(): void; }; export type TreeProps = BaseTreeProps & @@ -108,8 +130,10 @@ export type TreeItemProps = BaseTreeProps & level: number; item: LinkedTree; index: number; + isFocused?: boolean; getLabel?( item: LinkedTree ): JSX.Element; shouldItemBeExpanded?( item: LinkedTree ): boolean; + onLastItemLoop?( event: React.KeyboardEvent< HTMLDivElement > ): void; }; export type TreeControlProps = Omit< TreeProps, 'items' | 'level' > & { diff --git a/packages/js/components/src/index.ts b/packages/js/components/src/index.ts index eb0e63459ef..99d39bf3fa9 100644 --- a/packages/js/components/src/index.ts +++ b/packages/js/components/src/index.ts @@ -95,7 +95,11 @@ export { SlotContextType, SlotContextHelpersType, } from './slot-context'; -export { TreeControl as __experimentalTreeControl } from './experimental-tree-control'; +export { + TreeControl as __experimentalTreeControl, + Item as TreeItemType, +} from './experimental-tree-control'; +export { SelectTree as __experimentalSelectTreeControl } from './experimental-select-tree-control'; export { default as TreeSelectControl } from './tree-select-control'; // Exports below can be removed once the @woocommerce/product-editor package is released. diff --git a/packages/js/components/src/style.scss b/packages/js/components/src/style.scss index 613526c6549..d49f8b99b8a 100644 --- a/packages/js/components/src/style.scss +++ b/packages/js/components/src/style.scss @@ -56,5 +56,6 @@ @import 'collapsible-content/style.scss'; @import 'form/style.scss'; @import 'experimental-tree-control/tree.scss'; +@import 'experimental-select-tree-control/select-tree.scss'; @import 'product-section-layout/style.scss'; @import 'tree-select-control/index.scss'; From df52c85e92df2c2f0b7e2d01e239d1dff3b1bf91 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 19:16:51 +0100 Subject: [PATCH 1232/1680] Delete changelog files based on PR 37354 (#37356) Delete changelog files for 37354 Co-authored-by: WooCommerce Bot --- ...woocommerce_run_on_woocommerce_admin_updated-does-not-run | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run diff --git a/plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run b/plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run deleted file mode 100644 index c48f20c0c5b..00000000000 --- a/plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: fix -Comment: Revert #36768 - - From 0e1f974f49b0e4d731cb3b1fe9d3ebf86177b4a5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 19:17:54 +0100 Subject: [PATCH 1233/1680] Delete changelog files based on PR 37373 (#37380) Delete changelog files for 37373 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 deleted file mode 100644 index eeb9356bb51..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.2 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 9.8.2 From a7516cb2b07228081168f98a61e73ececd03b53a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 24 Mar 2023 19:18:43 +0100 Subject: [PATCH 1234/1680] Delete changelog files based on PR 36593 (#37420) Delete changelog files for 36593 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-35703-order-meta-backfill | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-35703-order-meta-backfill diff --git a/plugins/woocommerce/changelog/fix-35703-order-meta-backfill b/plugins/woocommerce/changelog/fix-35703-order-meta-backfill deleted file mode 100644 index d6b48db0887..00000000000 --- a/plugins/woocommerce/changelog/fix-35703-order-meta-backfill +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -When order meta data is saved via HPOS, it should be backfilled to the CPT data store. From a8fff3175ccbb460dd0d1be1aefccf4488498105 Mon Sep 17 00:00:00 2001 From: Christopher Allford <6451942+ObliviousHarmony@users.noreply.github.com> Date: Fri, 24 Mar 2023 12:07:49 -0700 Subject: [PATCH 1235/1680] Fix TypeScript Incremental Build Regression (#37432) --- .../changelog/fix-typescript-incremental-regression | 5 +++++ packages/js/components/tsconfig.json | 1 - .../changelog/fix-typescript-incremental-regression | 5 +++++ packages/js/csv-export/tsconfig.json | 1 - packages/js/internal-js-tests/tsconfig.json | 1 - packages/js/tsconfig.json | 1 - 6 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 packages/js/components/changelog/fix-typescript-incremental-regression create mode 100644 packages/js/csv-export/changelog/fix-typescript-incremental-regression diff --git a/packages/js/components/changelog/fix-typescript-incremental-regression b/packages/js/components/changelog/fix-typescript-incremental-regression new file mode 100644 index 00000000000..2d087939231 --- /dev/null +++ b/packages/js/components/changelog/fix-typescript-incremental-regression @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Configuration change only + + diff --git a/packages/js/components/tsconfig.json b/packages/js/components/tsconfig.json index a56e45f6af3..55b2cf3a463 100644 --- a/packages/js/components/tsconfig.json +++ b/packages/js/components/tsconfig.json @@ -6,7 +6,6 @@ "declaration": true, "declarationMap": true, "declarationDir": "./build-types", - "composite": true, "typeRoots": [ "./typings", "./node_modules/@types" diff --git a/packages/js/csv-export/changelog/fix-typescript-incremental-regression b/packages/js/csv-export/changelog/fix-typescript-incremental-regression new file mode 100644 index 00000000000..2d087939231 --- /dev/null +++ b/packages/js/csv-export/changelog/fix-typescript-incremental-regression @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Configuration change only + + diff --git a/packages/js/csv-export/tsconfig.json b/packages/js/csv-export/tsconfig.json index 6b4ebfddf82..c5f351a60cc 100644 --- a/packages/js/csv-export/tsconfig.json +++ b/packages/js/csv-export/tsconfig.json @@ -6,7 +6,6 @@ "declaration": true, "declarationMap": true, "declarationDir": "./build-types", - "composite": true, "typeRoots": [ "./typings", "./node_modules/@types" diff --git a/packages/js/internal-js-tests/tsconfig.json b/packages/js/internal-js-tests/tsconfig.json index e09ddc9d56e..37f13e9b816 100644 --- a/packages/js/internal-js-tests/tsconfig.json +++ b/packages/js/internal-js-tests/tsconfig.json @@ -3,7 +3,6 @@ "compilerOptions": { "rootDir": "src", "outDir": "build-module", - "composite": true, "typeRoots": [ "./typings", "./node_modules/@types" diff --git a/packages/js/tsconfig.json b/packages/js/tsconfig.json index b0bd9d3e2e4..6592fd74dc5 100644 --- a/packages/js/tsconfig.json +++ b/packages/js/tsconfig.json @@ -10,7 +10,6 @@ "jsx": "react", "jsxFactory": "createElement", "jsxFragmentFactory": "Fragment", - "incremental": true, "typeRoots": [] }, "exclude": [ From 62b275c41a86037ee8bf76f68fd6126176531340 Mon Sep 17 00:00:00 2001 From: Leif Singer Date: Sat, 25 Mar 2023 09:25:13 +0100 Subject: [PATCH 1236/1680] Update tested and required WordPress versions according to L-2 policy (#37434) --- .../changelog/dev-update-required-wordpress-version | 4 ++++ plugins/woocommerce/readme.txt | 4 ++-- plugins/woocommerce/woocommerce.php | 2 +- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/dev-update-required-wordpress-version diff --git a/plugins/woocommerce/changelog/dev-update-required-wordpress-version b/plugins/woocommerce/changelog/dev-update-required-wordpress-version new file mode 100644 index 00000000000..46d408dca99 --- /dev/null +++ b/plugins/woocommerce/changelog/dev-update-required-wordpress-version @@ -0,0 +1,4 @@ +Significance: major +Type: dev + +Update tested and required WordPress versions according to L-2 policy. diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index efff28109f1..7c6381b276a 100644 --- a/plugins/woocommerce/readme.txt +++ b/plugins/woocommerce/readme.txt @@ -1,8 +1,8 @@ === WooCommerce === Contributors: automattic, mikejolley, jameskoster, claudiosanches, rodrigosprimo, peterfabian1000, vedjain, jamosova, obliviousharmony, konamiman, sadowski, wpmuguru, royho, barryhughes-1 Tags: online store, ecommerce, shop, shopping cart, sell online, storefront, checkout, payments, woo, woo commerce, e-commerce, store -Requires at least: 5.9 -Tested up to: 6.1 +Requires at least: 6.0 +Tested up to: 6.2 Requires PHP: 7.2 Stable tag: 7.5.1 License: GPLv3 diff --git a/plugins/woocommerce/woocommerce.php b/plugins/woocommerce/woocommerce.php index d900b75b4ac..50ccf0749f3 100644 --- a/plugins/woocommerce/woocommerce.php +++ b/plugins/woocommerce/woocommerce.php @@ -8,7 +8,7 @@ * Author URI: https://woocommerce.com * Text Domain: woocommerce * Domain Path: /i18n/languages/ - * Requires at least: 5.9 + * Requires at least: 6.0 * Requires PHP: 7.3 * * @package WooCommerce From 51e04b9eba7aedb34725744f50542d0235aa72da Mon Sep 17 00:00:00 2001 From: Justin Palmer Date: Sat, 25 Mar 2023 16:51:20 +0100 Subject: [PATCH 1237/1680] Remove multichannel marketing info from WC Tracker --- .../woocommerce/changelog/update-remove-multichannel-tracker | 4 ++++ plugins/woocommerce/includes/class-wc-tracker.php | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/update-remove-multichannel-tracker diff --git a/plugins/woocommerce/changelog/update-remove-multichannel-tracker b/plugins/woocommerce/changelog/update-remove-multichannel-tracker new file mode 100644 index 00000000000..d429a94b9d5 --- /dev/null +++ b/plugins/woocommerce/changelog/update-remove-multichannel-tracker @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Remove multichannel marketing info from WC Tracker diff --git a/plugins/woocommerce/includes/class-wc-tracker.php b/plugins/woocommerce/includes/class-wc-tracker.php index ed20ab4fa71..85320deae96 100644 --- a/plugins/woocommerce/includes/class-wc-tracker.php +++ b/plugins/woocommerce/includes/class-wc-tracker.php @@ -696,7 +696,6 @@ class WC_Tracker { 'hpos_transactions_enabled' => get_option( 'woocommerce_use_db_transactions_for_custom_orders_table_data_sync' ), 'hpos_transactions_level' => get_option( 'woocommerce_db_transactions_isolation_level_for_custom_orders_table_data_sync' ), 'show_marketplace_suggestions' => get_option( 'woocommerce_show_marketplace_suggestions' ), - 'multichannel_marketing_enabled' => get_option( 'woocommerce_multichannel_marketing_enabled' ), ); } From a77e4abffeb4677d911f76a2a60ff4f7a35b59c2 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Sun, 26 Mar 2023 21:42:33 -0400 Subject: [PATCH 1238/1680] Emit error on webpack build when invalid export name used in import for JS (#37195) --- .../changelog/update-webpack-invalid-export-error | 4 ++++ packages/js/admin-layout/webpack.config.js | 1 + .../components/changelog/update-webpack-invalid-export-error | 4 ++++ packages/js/components/webpack.config.js | 1 + .../changelog/update-webpack-invalid-export-error | 4 ++++ packages/js/customer-effort-score/webpack.config.js | 1 + .../changelog/update-webpack-invalid-export-error | 4 ++++ packages/js/experimental/webpack.config.js | 1 + packages/js/internal-style-build/index.js | 5 +++++ .../onboarding/changelog/update-webpack-invalid-export-error | 4 ++++ packages/js/onboarding/webpack.config.js | 1 + .../changelog/update-webpack-invalid-export-error | 4 ++++ packages/js/product-editor/webpack.config.js | 1 + plugins/woocommerce-admin/webpack.config.js | 1 + .../changelog/update-webpack-invalid-export-error | 4 ++++ 15 files changed, 40 insertions(+) create mode 100644 packages/js/admin-layout/changelog/update-webpack-invalid-export-error create mode 100644 packages/js/components/changelog/update-webpack-invalid-export-error create mode 100644 packages/js/customer-effort-score/changelog/update-webpack-invalid-export-error create mode 100644 packages/js/experimental/changelog/update-webpack-invalid-export-error create mode 100644 packages/js/onboarding/changelog/update-webpack-invalid-export-error create mode 100644 packages/js/product-editor/changelog/update-webpack-invalid-export-error create mode 100644 plugins/woocommerce/changelog/update-webpack-invalid-export-error diff --git a/packages/js/admin-layout/changelog/update-webpack-invalid-export-error b/packages/js/admin-layout/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/packages/js/admin-layout/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config diff --git a/packages/js/admin-layout/webpack.config.js b/packages/js/admin-layout/webpack.config.js index 46a04612713..9b42746f1dd 100644 --- a/packages/js/admin-layout/webpack.config.js +++ b/packages/js/admin-layout/webpack.config.js @@ -12,6 +12,7 @@ module.exports = { path: __dirname, }, module: { + parser: webpackConfig.parser, rules: webpackConfig.rules, }, plugins: webpackConfig.plugins, diff --git a/packages/js/components/changelog/update-webpack-invalid-export-error b/packages/js/components/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/packages/js/components/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config diff --git a/packages/js/components/webpack.config.js b/packages/js/components/webpack.config.js index 46a04612713..9b42746f1dd 100644 --- a/packages/js/components/webpack.config.js +++ b/packages/js/components/webpack.config.js @@ -12,6 +12,7 @@ module.exports = { path: __dirname, }, module: { + parser: webpackConfig.parser, rules: webpackConfig.rules, }, plugins: webpackConfig.plugins, diff --git a/packages/js/customer-effort-score/changelog/update-webpack-invalid-export-error b/packages/js/customer-effort-score/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/packages/js/customer-effort-score/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config diff --git a/packages/js/customer-effort-score/webpack.config.js b/packages/js/customer-effort-score/webpack.config.js index 46a04612713..9b42746f1dd 100644 --- a/packages/js/customer-effort-score/webpack.config.js +++ b/packages/js/customer-effort-score/webpack.config.js @@ -12,6 +12,7 @@ module.exports = { path: __dirname, }, module: { + parser: webpackConfig.parser, rules: webpackConfig.rules, }, plugins: webpackConfig.plugins, diff --git a/packages/js/experimental/changelog/update-webpack-invalid-export-error b/packages/js/experimental/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/packages/js/experimental/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config diff --git a/packages/js/experimental/webpack.config.js b/packages/js/experimental/webpack.config.js index 46a04612713..9b42746f1dd 100644 --- a/packages/js/experimental/webpack.config.js +++ b/packages/js/experimental/webpack.config.js @@ -12,6 +12,7 @@ module.exports = { path: __dirname, }, module: { + parser: webpackConfig.parser, rules: webpackConfig.rules, }, plugins: webpackConfig.plugins, diff --git a/packages/js/internal-style-build/index.js b/packages/js/internal-style-build/index.js index 5443e844a92..a3f03feb3e0 100644 --- a/packages/js/internal-style-build/index.js +++ b/packages/js/internal-style-build/index.js @@ -11,6 +11,11 @@ const NODE_ENV = process.env.NODE_ENV || 'development'; module.exports = { webpackConfig: { + parser: { + javascript: { + exportsPresence: 'error', + }, + }, rules: [ { test: /\.s?css$/, diff --git a/packages/js/onboarding/changelog/update-webpack-invalid-export-error b/packages/js/onboarding/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/packages/js/onboarding/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config diff --git a/packages/js/onboarding/webpack.config.js b/packages/js/onboarding/webpack.config.js index 46a04612713..9b42746f1dd 100644 --- a/packages/js/onboarding/webpack.config.js +++ b/packages/js/onboarding/webpack.config.js @@ -12,6 +12,7 @@ module.exports = { path: __dirname, }, module: { + parser: webpackConfig.parser, rules: webpackConfig.rules, }, plugins: webpackConfig.plugins, diff --git a/packages/js/product-editor/changelog/update-webpack-invalid-export-error b/packages/js/product-editor/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/packages/js/product-editor/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config diff --git a/packages/js/product-editor/webpack.config.js b/packages/js/product-editor/webpack.config.js index 46a04612713..9b42746f1dd 100644 --- a/packages/js/product-editor/webpack.config.js +++ b/packages/js/product-editor/webpack.config.js @@ -12,6 +12,7 @@ module.exports = { path: __dirname, }, module: { + parser: webpackConfig.parser, rules: webpackConfig.rules, }, plugins: webpackConfig.plugins, diff --git a/plugins/woocommerce-admin/webpack.config.js b/plugins/woocommerce-admin/webpack.config.js index 54a6afebd25..ab3ea444347 100644 --- a/plugins/woocommerce-admin/webpack.config.js +++ b/plugins/woocommerce-admin/webpack.config.js @@ -104,6 +104,7 @@ const webpackConfig = { uniqueName: '__wcAdmin_webpackJsonp', }, module: { + parser: styleConfig.parser, rules: [ { test: /\.(t|j)sx?$/, diff --git a/plugins/woocommerce/changelog/update-webpack-invalid-export-error b/plugins/woocommerce/changelog/update-webpack-invalid-export-error new file mode 100644 index 00000000000..d844dbd186f --- /dev/null +++ b/plugins/woocommerce/changelog/update-webpack-invalid-export-error @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update webpack config to use @woocommerce/internal-style-build's parser config From de111c1edb6bb1ca348526622a385bfae29b6f5d Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Mon, 27 Mar 2023 07:09:39 -0400 Subject: [PATCH 1239/1680] Update TourKit README to correct primaryButton example and formatting (#37427) --- .../changelog/fix-tour-kit-documentation | 4 + packages/js/components/src/tour-kit/README.md | 87 ++++++++++--------- 2 files changed, 49 insertions(+), 42 deletions(-) create mode 100644 packages/js/components/changelog/fix-tour-kit-documentation diff --git a/packages/js/components/changelog/fix-tour-kit-documentation b/packages/js/components/changelog/fix-tour-kit-documentation new file mode 100644 index 00000000000..d2df9ede44b --- /dev/null +++ b/packages/js/components/changelog/fix-tour-kit-documentation @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Update TourKit README to correct primaryButton example and formatting. diff --git a/packages/js/components/src/tour-kit/README.md b/packages/js/components/src/tour-kit/README.md index c1f52a2920f..a27d0172272 100644 --- a/packages/js/components/src/tour-kit/README.md +++ b/packages/js/components/src/tour-kit/README.md @@ -28,13 +28,15 @@ function Tour() { referenceElements: { desktop: '.render-step-near-me', }, - meta: { - heading: 'Lorem ipsum dolor sit amet.', - descriptions: { - desktop: 'Lorem ipsum dolor sit amet.', - }, - primaryButtonText: "Done" - }, + meta: { + heading: 'Lorem ipsum dolor sit amet.', + descriptions: { + desktop: 'Lorem ipsum dolor sit amet.', + }, + primaryButton: { + text: 'Done', + }, + }, }, ], closeHandler: () => setShowTour( false ), @@ -57,8 +59,8 @@ function Tour() { When a tour is rendered and focused, the following functionality exists: -- Close the tour on `ESC` key (in minimized view) -- Go to previous/next step on `left/right` arrow keys (in step view) +- Close the tour on `ESC` key (in minimized view) +- Go to previous/next step on `left/right` arrow keys (in step view) ## Configuration @@ -66,51 +68,52 @@ The main API for configuring a tour is the config object. See example usage and `config.steps`: An array of objects that define the content we wish to render on the page. Each step defined by: -- `referenceElements` (optional): A set of `desktop` & `mobile` selectors to render the step near. -- `focusElement` (optional): A set of `desktop` & `mobile` & `iframe` selectors to automatically focus. -- `meta`: Arbitrary object that encloses the content we want to render for each step. -- `classNames` (optional): An array or CSV of CSS classes applied to a step. +- `referenceElements` (optional): A set of `desktop` & `mobile` selectors to render the step near. +- `focusElement` (optional): A set of `desktop` & `mobile` & `iframe` selectors to automatically focus. +- `meta`: Arbitrary object that encloses the content we want to render for each step. +- `classNames` (optional): An array or CSV of CSS classes applied to a step. `config.closeHandler`: The callback responsible for closing the tour. -- `tourStep`: A React component that will be called to render each step. Receives the following properties: +- `tourStep`: A React component that will be called to render each step. Receives the following properties: - - `steps`: The steps defined for the tour. - - `currentStepIndex` - - `onDismiss`: Handler that dismissed/closes the tour. - - `onNext`: Handler that progresses the tour to the next step. - - `onPrevious`: Handler that takes the tour to the previous step. - - `onMinimize`: Handler that minimizes the tour (passes rendering to `tourMinimized`). - - `setInitialFocusedElement`: A dispatcher that assigns an element to be initially focused when a step renders (see examples). - - `onGoToStep`: Handler that progresses the tour to a given step index. + - `steps`: The steps defined for the tour. + - `currentStepIndex` + - `onDismiss`: Handler that dismissed/closes the tour. + - `onNext`: Handler that progresses the tour to the next step. + - `onPrevious`: Handler that takes the tour to the previous step. + - `onMinimize`: Handler that minimizes the tour (passes rendering to `tourMinimized`). + - `setInitialFocusedElement`: A dispatcher that assigns an element to be initially focused when a step renders (see examples). + - `onGoToStep`: Handler that progresses the tour to a given step index. -- `tourMinimized`: A React component that will be called to render a minimized view for the tour. Receives the following properties: - - `steps`: The steps defined for the tour. - - `currentStepIndex` - - `onDismiss`: Handler that dismissed/closes the tour. - - `onMaximize`: Handler that expands the tour (passes rendering to `tourStep`). +- `tourMinimized`: A React component that will be called to render a minimized view for the tour. Receives the following properties: + - `steps`: The steps defined for the tour. + - `currentStepIndex` + - `onDismiss`: Handler that dismissed/closes the tour. + - `onMaximize`: Handler that expands the tour (passes rendering to `tourStep`). `config.options` (optional): -- `classNames` (optional): An array or CSV of CSS classes to enclose the main tour frame with. +- `classNames` (optional): An array or CSV of CSS classes to enclose the main tour frame with. -- `effects`: An object to enable/disable/combine various tour effects: +- `effects`: An object to enable/disable/combine various tour effects: - - `spotlight`: Adds a semi-transparent overlay and highlights the reference element when provided with a transparent box over it. Expects an object with optional styles to override the default highlight/spotlight behavior when provided (default: spotlight wraps the entire reference element). - - `interactivity`: An object that configures whether the user is allowed to interact with the referenced element during the tour - - `styles`: CSS properties that configures the styles applied to the spotlight overlay - - `arrowIndicator`: Adds an arrow tip pointing at the reference element when provided. - - `overlay`: Includes the semi-transparent overlay for all the steps (also blocks interactions with the rest of the page) - - `autoScroll`: The page scrolls up and down automatically such that the step target element is visible to the user. + - `spotlight`: Adds a semi-transparent overlay and highlights the reference element when provided with a transparent box over it. Expects an object with optional styles to override the default highlight/spotlight behavior when provided (default: spotlight wraps the entire reference element). + - `interactivity`: An object that configures whether the user is allowed to interact with the referenced element during the tour + - `styles`: CSS properties that configures the styles applied to the spotlight overlay + - `arrowIndicator`: Adds an arrow tip pointing at the reference element when provided. + - `overlay`: Includes the semi-transparent overlay for all the steps (also blocks interactions with the rest of the page) + - `autoScroll`: The page scrolls up and down automatically such that the step target element is visible to the user. -- `callbacks`: An object of callbacks to handle side effects from various interactions (see [types.ts](./src/types.ts)). +- `callbacks`: An object of callbacks to handle side effects from various interactions (see [types.ts](./src/types.ts)). -- `popperModifiers`: The tour uses Popper to position steps near reference elements (and for other effects). An implementation can pass its own modifiers to tailor the functionality further e.g. more offset or padding from the reference element. -- `tourRating` (optional - only in WPCOM Tour Kit variant): - - `enabled`: Whether to show rating in last step. - - `useTourRating`: (optional) A hook to provide the rating from an external source/state (see [types.ts](./src/types.ts)). - - `onTourRate`: (optional) A callback to fire off when a rating is submitted. +- `popperModifiers`: The tour uses Popper to position steps near reference elements (and for other effects). An implementation can pass its own modifiers to tailor the functionality further e.g. more offset or padding from the reference element. +- `tourRating` (optional - only in WPCOM Tour Kit variant): -- `portalElementId`: A string that lets you customize under which DOM element the Tour will be appended. + - `enabled`: Whether to show rating in last step. + - `useTourRating`: (optional) A hook to provide the rating from an external source/state (see [types.ts](./src/types.ts)). + - `onTourRate`: (optional) A callback to fire off when a rating is submitted. + +- `portalElementId`: A string that lets you customize under which DOM element the Tour will be appended. `placement` (Optional) : Describes the preferred placement of the popper. Possible values are left-start, left, left-end, top-start, top, top-end, right-start, right, right-end, bottom-start, bottom, and bottom-end. From 48c50afcbf1dd16c5dff02bb35d5ef173d53ecce Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Fri, 24 Mar 2023 21:28:38 +0800 Subject: [PATCH 1240/1680] Move RecommendedExtensions and KnowledgeBase into coupons directory. --- plugins/woocommerce-admin/client/marketing/coupons/index.js | 4 ++-- .../marketing/{components => coupons}/knowledge-base/index.js | 0 .../{components => coupons}/knowledge-base/placeholder.js | 0 .../{components => coupons}/knowledge-base/style.scss | 0 .../{components => coupons}/knowledge-base/test/index.js | 0 .../{components => coupons}/recommended-extensions/index.js | 2 +- .../{components => coupons}/recommended-extensions/item.js | 2 +- .../recommended-extensions/placeholder.js | 0 .../{components => coupons}/recommended-extensions/style.scss | 0 .../test/__snapshots__/placeholder.js.snap | 0 .../recommended-extensions/test/index.js | 0 .../recommended-extensions/test/placeholder.js | 2 +- 12 files changed, 5 insertions(+), 5 deletions(-) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/knowledge-base/index.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/knowledge-base/placeholder.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/knowledge-base/style.scss (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/knowledge-base/test/index.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/index.js (98%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/item.js (96%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/placeholder.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/style.scss (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/test/__snapshots__/placeholder.js.snap (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/test/index.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/recommended-extensions/test/placeholder.js (87%) diff --git a/plugins/woocommerce-admin/client/marketing/coupons/index.js b/plugins/woocommerce-admin/client/marketing/coupons/index.js index ccce6d94d74..4b2b2cb8af8 100644 --- a/plugins/woocommerce-admin/client/marketing/coupons/index.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/index.js @@ -8,8 +8,8 @@ import { useUser } from '@woocommerce/data'; * Internal dependencies */ import './style.scss'; -import RecommendedExtensions from '../components/recommended-extensions'; -import KnowledgeBase from '../components/knowledge-base'; +import RecommendedExtensions from './recommended-extensions'; +import KnowledgeBase from './knowledge-base'; import { getAdminSetting } from '~/utils/admin-settings'; import '../data'; diff --git a/plugins/woocommerce-admin/client/marketing/components/knowledge-base/index.js b/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/index.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/knowledge-base/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/index.js diff --git a/plugins/woocommerce-admin/client/marketing/components/knowledge-base/placeholder.js b/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/placeholder.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/knowledge-base/placeholder.js rename to plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/placeholder.js diff --git a/plugins/woocommerce-admin/client/marketing/components/knowledge-base/style.scss b/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/knowledge-base/style.scss rename to plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/style.scss diff --git a/plugins/woocommerce-admin/client/marketing/components/knowledge-base/test/index.js b/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/test/index.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/knowledge-base/test/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/test/index.js diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/index.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js similarity index 98% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js index 0286256683e..6c0b78cb563 100644 --- a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/index.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js @@ -14,7 +14,7 @@ import './style.scss'; import RecommendedExtensionsItem from './item'; import RecommendedExtensionsPlaceholder from './placeholder'; import { STORE_KEY } from '../../data/constants'; -import Card from '../card'; +import Card from '../../components/card'; const RecommendedExtensions = ( { extensions, diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/item.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js similarity index 96% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/item.js rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js index 1a4d6cfeea5..02327d0fc5a 100644 --- a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/item.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js @@ -8,7 +8,7 @@ import { recordEvent } from '@woocommerce/tracks'; * Internal dependencies */ import './style.scss'; -import { ProductIcon } from '../../components/'; +import { ProductIcon } from '../../components'; import { getInAppPurchaseUrl } from '../../../lib/in-app-purchase'; const RecommendedExtensionsItem = ( { diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/placeholder.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/placeholder.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/placeholder.js rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/placeholder.js diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/style.scss b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/style.scss rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/style.scss diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/__snapshots__/placeholder.js.snap b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/__snapshots__/placeholder.js.snap similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/__snapshots__/placeholder.js.snap rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/__snapshots__/placeholder.js.snap diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/index.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/index.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/index.js diff --git a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/placeholder.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/placeholder.js similarity index 87% rename from plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/placeholder.js rename to plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/placeholder.js index df2cfe4612e..e6c464e2941 100644 --- a/plugins/woocommerce-admin/client/marketing/components/recommended-extensions/test/placeholder.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/test/placeholder.js @@ -7,7 +7,7 @@ import { createElement } from '@wordpress/element'; /** * Internal dependencies */ -import { RecommendedExtensionsPlaceholder } from '../'; +import { RecommendedExtensionsPlaceholder } from '..'; describe( 'RecommendedExtensionsPlaceholder', () => { test( 'should render a default placeholder', () => { From ab2d56d8b343cbda78632a164e5cb8113e41f095 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Fri, 24 Mar 2023 21:45:25 +0800 Subject: [PATCH 1241/1680] Move card and slider into coupons directory. --- .../woocommerce-admin/client/marketing/components/index.js | 2 -- .../client/marketing/{components => coupons}/card/README.md | 0 .../client/marketing/{components => coupons}/card/index.js | 0 .../marketing/{components => coupons}/card/style.scss | 0 .../marketing/{components => coupons}/card/test/index.js | 0 .../client/marketing/coupons/knowledge-base/index.js | 6 ++++-- .../marketing/coupons/recommended-extensions/index.js | 4 ++-- .../marketing/{components => coupons}/slider/index.js | 0 .../marketing/{components => coupons}/slider/style.scss | 0 9 files changed, 6 insertions(+), 6 deletions(-) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/card/README.md (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/card/index.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/card/style.scss (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/card/test/index.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/slider/index.js (100%) rename plugins/woocommerce-admin/client/marketing/{components => coupons}/slider/style.scss (100%) diff --git a/plugins/woocommerce-admin/client/marketing/components/index.js b/plugins/woocommerce-admin/client/marketing/components/index.js index c26b16cb695..69b332786f3 100644 --- a/plugins/woocommerce-admin/client/marketing/components/index.js +++ b/plugins/woocommerce-admin/client/marketing/components/index.js @@ -1,6 +1,4 @@ -export { default as Card } from './card'; export { default as ProductIcon } from './product-icon'; -export { default as Slider } from './slider'; export { default as ReadBlogMessage } from './ReadBlogMessage'; export { CollapsibleCard, CardBody, CardDivider } from './CollapsibleCard'; export { PluginCardBody, SmartPluginCardBody } from './PluginCardBody'; diff --git a/plugins/woocommerce-admin/client/marketing/components/card/README.md b/plugins/woocommerce-admin/client/marketing/coupons/card/README.md similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/card/README.md rename to plugins/woocommerce-admin/client/marketing/coupons/card/README.md diff --git a/plugins/woocommerce-admin/client/marketing/components/card/index.js b/plugins/woocommerce-admin/client/marketing/coupons/card/index.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/card/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/card/index.js diff --git a/plugins/woocommerce-admin/client/marketing/components/card/style.scss b/plugins/woocommerce-admin/client/marketing/coupons/card/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/card/style.scss rename to plugins/woocommerce-admin/client/marketing/coupons/card/style.scss diff --git a/plugins/woocommerce-admin/client/marketing/components/card/test/index.js b/plugins/woocommerce-admin/client/marketing/coupons/card/test/index.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/card/test/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/card/test/index.js diff --git a/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/index.js b/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/index.js index cb74eae7807..d48205df56f 100644 --- a/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/index.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/knowledge-base/index.js @@ -14,8 +14,10 @@ import { recordEvent } from '@woocommerce/tracks'; * Internal dependencies */ import './style.scss'; -import { Card, Slider, ReadBlogMessage } from '../../components'; -import { STORE_KEY } from '../../data/constants'; +import { STORE_KEY } from '~/marketing/data/constants'; +import { ReadBlogMessage } from '~/marketing/components'; +import Card from '../card'; +import Slider from '../slider'; import KnowledgebaseCardPostPlaceholder from './placeholder'; const KnowledgeBase = ( { diff --git a/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js index 6c0b78cb563..8f606448c95 100644 --- a/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/index.js @@ -13,8 +13,8 @@ import PropTypes from 'prop-types'; import './style.scss'; import RecommendedExtensionsItem from './item'; import RecommendedExtensionsPlaceholder from './placeholder'; -import { STORE_KEY } from '../../data/constants'; -import Card from '../../components/card'; +import { STORE_KEY } from '~/marketing/data/constants'; +import Card from '../card'; const RecommendedExtensions = ( { extensions, diff --git a/plugins/woocommerce-admin/client/marketing/components/slider/index.js b/plugins/woocommerce-admin/client/marketing/coupons/slider/index.js similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/slider/index.js rename to plugins/woocommerce-admin/client/marketing/coupons/slider/index.js diff --git a/plugins/woocommerce-admin/client/marketing/components/slider/style.scss b/plugins/woocommerce-admin/client/marketing/coupons/slider/style.scss similarity index 100% rename from plugins/woocommerce-admin/client/marketing/components/slider/style.scss rename to plugins/woocommerce-admin/client/marketing/coupons/slider/style.scss From dd2fe3869bc4d8563f1ad6d6cb128d27ec7f6620 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 27 Mar 2023 17:44:52 +0530 Subject: [PATCH 1242/1680] Add support for end_at ID to allow partial verification. --- .../Migrations/CustomOrderTable/CLIRunner.php | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index ccc17741a33..4e3cf52c14c 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -288,10 +288,16 @@ class CLIRunner { * default: 0 * --- * + * [--end-at=] + * : Order ID to end at. + * --- + * default: -1 + * --- + * * ## EXAMPLES * * # Verify migrated order data, 500 orders at a time. - * wp wc cot verify_cot_data --batch-size=500 --start-from=0 + * wp wc cot verify_cot_data --batch-size=500 --start-from=0 --end-at=10000 * * @param array $args Positional arguments passed to the command. * @param array $assoc_args Associative arguments (options) passed to the command. @@ -308,6 +314,7 @@ class CLIRunner { array( 'batch-size' => 500, 'start-from' => 0, + 'end-at' => -1, ) ); @@ -316,7 +323,9 @@ class CLIRunner { $failed_ids = array(); $processed = 0; $order_id_start = (int) $assoc_args['start-from']; - $order_count = $this->get_verify_order_count( $order_id_start ); + $order_id_end = (int) $assoc_args['end-at']; + $order_id_end = $order_id_end === - 1 ? PHP_INT_MAX : $order_id_end; + $order_count = $this->get_verify_order_count( $order_id_start, $order_id_end ); $batch_size = ( (int) $assoc_args['batch-size'] ) === 0 ? 500 : (int) $assoc_args['batch-size']; $progress = WP_CLI\Utils\make_progress_bar( 'Order Data Verification', $order_count / $batch_size ); @@ -337,8 +346,9 @@ class CLIRunner { $order_ids = $wpdb->get_col( $wpdb->prepare( - "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order' AND ID > %d ORDER BY ID ASC LIMIT %d", + "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order' AND ID > %d AND ID < %d ORDER BY ID ASC LIMIT %d", $order_id_start, + $order_id_end, $batch_size ) ); @@ -424,17 +434,19 @@ class CLIRunner { * Helper method to get count for orders needing verification. * * @param int $order_id_start Order ID to start from. + * @param int $order_id_end Order ID to end at. * @param bool $log Whether to also log an error message. * * @return int Order count. */ - private function get_verify_order_count( int $order_id_start, $log = true ) : int { + private function get_verify_order_count( int $order_id_start, int $order_id_end, $log = true ) : int { global $wpdb; $order_count = (int) $wpdb->get_var( $wpdb->prepare( - "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'shop_order' AND ID > %d", - $order_id_start + "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'shop_order' AND ID > %d AND ID < %d", + $order_id_start, + $order_id_end ) ); From bb0ca9184659b533d763ff92f0a1c4688ea4a4b2 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 27 Mar 2023 17:45:44 +0530 Subject: [PATCH 1243/1680] Add changelog. --- plugins/woocommerce/changelog/hpos-end_at_support | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/hpos-end_at_support diff --git a/plugins/woocommerce/changelog/hpos-end_at_support b/plugins/woocommerce/changelog/hpos-end_at_support new file mode 100644 index 00000000000..e73f5dd38f3 --- /dev/null +++ b/plugins/woocommerce/changelog/hpos-end_at_support @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Add support for end_at ID to allow partial verification. From 64bd683e0b335bb3dd714c49d002f5a86fee3907 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 27 Mar 2023 20:17:05 +0800 Subject: [PATCH 1244/1680] Simplify import. --- .../client/marketing/coupons/recommended-extensions/item.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js index 02327d0fc5a..395dfe5555c 100644 --- a/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/recommended-extensions/item.js @@ -8,8 +8,8 @@ import { recordEvent } from '@woocommerce/tracks'; * Internal dependencies */ import './style.scss'; -import { ProductIcon } from '../../components'; -import { getInAppPurchaseUrl } from '../../../lib/in-app-purchase'; +import { ProductIcon } from '~/marketing/components'; +import { getInAppPurchaseUrl } from '~/lib/in-app-purchase'; const RecommendedExtensionsItem = ( { title, From 07181dd1425f5a345a17d47cd4caf9d14aac545c Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 27 Mar 2023 20:27:32 +0800 Subject: [PATCH 1245/1680] Add changelog. --- .../changelog/feature-marketing-refactor-components | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-marketing-refactor-components diff --git a/plugins/woocommerce/changelog/feature-marketing-refactor-components b/plugins/woocommerce/changelog/feature-marketing-refactor-components new file mode 100644 index 00000000000..17d9307e65d --- /dev/null +++ b/plugins/woocommerce/changelog/feature-marketing-refactor-components @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Code refactor on marketing components. From cf9fbb22485c8d25a332b51dfbe7cfa20bda1f25 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 27 Mar 2023 15:39:49 +0200 Subject: [PATCH 1246/1680] Updated accessibility for product categories shortcode. --- plugins/woocommerce/includes/wc-template-functions.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/wc-template-functions.php b/plugins/woocommerce/includes/wc-template-functions.php index c376d601e47..a069ecc3c28 100644 --- a/plugins/woocommerce/includes/wc-template-functions.php +++ b/plugins/woocommerce/includes/wc-template-functions.php @@ -1223,7 +1223,10 @@ if ( ! function_exists( 'woocommerce_template_loop_category_link_open' ) ) { * @param int|object|string $category Category ID, Object or String. */ function woocommerce_template_loop_category_link_open( $category ) { - echo ''; + $category_term = get_term( $category, 'product_cat' ); + $category_name = ( ! $category_term || is_wp_error( $category_term ) ) ? '' : $category_term->name; + /* translators: %s: Category name */ + echo ''; } } From e8409660da6e06152d11f8ecbc3fd2916c6a1432 Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 27 Mar 2023 15:40:31 +0200 Subject: [PATCH 1247/1680] Changelog. --- plugins/woocommerce/changelog/fix-34109 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-34109 diff --git a/plugins/woocommerce/changelog/fix-34109 b/plugins/woocommerce/changelog/fix-34109 new file mode 100644 index 00000000000..36fe6df1707 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-34109 @@ -0,0 +1,4 @@ +Significance: minor +Type: fix + +Accessibility update for product_categories shortcode. From de2aa280ef94c5307d487dde3b4ac6d663257c3e Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 27 Mar 2023 21:55:42 +0800 Subject: [PATCH 1248/1680] Simplify boolean expression before && in Marketing page. --- .../CreateNewCampaignModal.tsx | 9 +++-- .../client/marketing/coupons/index.js | 7 ++-- .../Campaigns/Campaigns.tsx | 6 ++-- .../Channels/Channels.tsx | 4 +-- .../IntroductionBanner/IntroductionBanner.tsx | 5 +-- .../MarketingOverviewMultichannel.tsx | 34 +++++++++++-------- 6 files changed, 39 insertions(+), 26 deletions(-) diff --git a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx index 09ebf5aa7a5..2df5a402104 100644 --- a/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx +++ b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx @@ -47,6 +47,9 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { const { loadInstalledPluginsAfterActivation } = useInstalledPluginsWithoutChannels(); + const hasCampaignTypes = !! campaignTypes?.length; + const hasRecommendedChannels = !! recommendedChannels?.length; + const onInstalledAndActivated = ( pluginSlug: string ) => { refetchCampaignTypes(); refetchRegisteredChannels(); @@ -64,7 +67,7 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { >
    - { !! campaignTypes?.length + { hasCampaignTypes ? __( 'Where would you like to promote your products?', 'woocommerce' @@ -109,7 +112,7 @@ export const CreateNewCampaignModal = ( props: CreateCampaignModalProps ) => { { __( 'Create', 'woocommerce' ) } - { !! isExternalURL( el.createUrl ) && ( + { isExternalURL( el.createUrl ) && ( { ) ) }
    - { !! recommendedChannels?.length && ( + { hasRecommendedChannels && (
    diff --git a/plugins/woocommerce-admin/client/marketing/coupons/index.js b/plugins/woocommerce-admin/client/marketing/coupons/index.js index 4b2b2cb8af8..d817b832a2e 100644 --- a/plugins/woocommerce-admin/client/marketing/coupons/index.js +++ b/plugins/woocommerce-admin/client/marketing/coupons/index.js @@ -16,13 +16,14 @@ import '../data'; const CouponsOverview = () => { const { currentUserCan } = useUser(); - const shouldShowExtensions = + const showExtensions = !! ( getAdminSetting( 'allowMarketplaceSuggestions', false ) && - currentUserCan( 'install_plugins' ); + currentUserCan( 'install_plugins' ) + ); return (
    - { !! shouldShowExtensions && ( + { showExtensions && ( { ); }; + const showFooter = !! ( total && total > perPage ); + return ( @@ -170,14 +172,14 @@ export const Campaigns = () => { > { __( 'Create new campaign', 'woocommerce' ) } - { !! isModalOpen && ( + { isModalOpen && ( setModalOpen( false ) } /> ) } { getContent() } - { !! ( total && total > perPage ) && ( + { showFooter && ( ( { /* Recommended channels section. */ } { recommendedChannels.length >= 1 && (
    - { !! hasRegisteredChannels && ( + { hasRegisteredChannels && ( <> @@ -127,7 +127,7 @@ export const Channels = forwardRef< ChannelsRef, ChannelsProps >( ) } - { !! expanded && + { expanded && recommendedChannels.map( ( el, idx ) => ( diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index 3f202877447..4e7a817e8dd 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -61,14 +61,21 @@ export const MarketingOverviewMultichannel: React.FC = () => { return ; } - const shouldShowCampaigns = !! ( + const showCampaigns = !! ( dataRegistered?.length && ( isIntroductionBannerDismissed || metaCampaigns?.total ) ); - const shouldShowExtensions = + const showChannels = !! ( + dataRegistered && + dataRecommended && + ( dataRegistered.length || dataRecommended.length ) + ); + + const showExtensions = !! ( getAdminSetting( 'allowMarketplaceSuggestions', false ) && - currentUserCan( 'install_plugins' ); + currentUserCan( 'install_plugins' ) + ); const onInstalledAndActivated = ( pluginSlug: string ) => { refetchCampaignTypes(); @@ -86,18 +93,17 @@ export const MarketingOverviewMultichannel: React.FC = () => { } } /> ) } - { shouldShowCampaigns && } - { !! ( dataRegistered && dataRecommended ) && - !! ( dataRegistered.length || dataRecommended.length ) && ( - - ) } + { showCampaigns && } + { showChannels && ( + + ) } - { !! shouldShowExtensions && } + { showExtensions && }
    ); From 4245ec17b9463c226213b03421c7631b7d2b2455 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Mon, 27 Mar 2023 20:44:38 +0530 Subject: [PATCH 1249/1680] Yoda conditions, I have used. --- .../src/Database/Migrations/CustomOrderTable/CLIRunner.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index 4e3cf52c14c..005220121d9 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -324,7 +324,7 @@ class CLIRunner { $processed = 0; $order_id_start = (int) $assoc_args['start-from']; $order_id_end = (int) $assoc_args['end-at']; - $order_id_end = $order_id_end === - 1 ? PHP_INT_MAX : $order_id_end; + $order_id_end = -1 === $order_id_end ? PHP_INT_MAX : $order_id_end; $order_count = $this->get_verify_order_count( $order_id_start, $order_id_end ); $batch_size = ( (int) $assoc_args['batch-size'] ) === 0 ? 500 : (int) $assoc_args['batch-size']; From 69a00e8eaadcba91c549ed4797327ab1793fda20 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Mon, 27 Mar 2023 23:29:59 +0800 Subject: [PATCH 1250/1680] Add changelog. --- .../changelog/feature-marketing-boolean-expression | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-marketing-boolean-expression diff --git a/plugins/woocommerce/changelog/feature-marketing-boolean-expression b/plugins/woocommerce/changelog/feature-marketing-boolean-expression new file mode 100644 index 00000000000..88fadf329b4 --- /dev/null +++ b/plugins/woocommerce/changelog/feature-marketing-boolean-expression @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Simplify boolean expression before && in Marketing page. From a5b104eaed1348c7ef795ccf32897d01e7ce98e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Mon, 27 Mar 2023 12:52:03 -0300 Subject: [PATCH 1251/1680] Add icon support to product section block (#37340) * Add block icon component * Use the block icon component within the section block * Add changelog file * Fix rebase conflicts * Remove icon configuration from the client side * Change the BlockIcon component to get the icon from the attributes first and then from the metadata * Expose the BlockIcon to be used outside of the package * Add the BlockIcon documentation * Configure the block to support the new icon via attributes * Set the icon to the block section in the server template definition * Revert back index.tsx -> index.ts in the section block * Fix php linter errors * Add changelog file * Fix php linter error * Return null instead of a Fragment --- .../js/product-editor/changelog/add-37264 | 4 ++ .../src/components/block-icon/README.md | 72 +++++++++++++++++++ .../src/components/block-icon/block-icon.tsx | 67 +++++++++++++++++ .../src/components/block-icon/index.ts | 2 + .../src/components/block-icon/types.ts | 3 + .../js/product-editor/src/components/index.ts | 4 ++ .../src/components/section/block.json | 3 + .../src/components/section/edit.tsx | 16 ++++- .../src/components/section/index.ts | 27 ++++--- .../src/components/section/style.scss | 12 ++++ .../src/components/section/types.ts | 9 +++ plugins/woocommerce/changelog/add-37264 | 4 ++ .../includes/class-wc-post-types.php | 6 ++ 13 files changed, 218 insertions(+), 11 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37264 create mode 100644 packages/js/product-editor/src/components/block-icon/README.md create mode 100644 packages/js/product-editor/src/components/block-icon/block-icon.tsx create mode 100644 packages/js/product-editor/src/components/block-icon/index.ts create mode 100644 packages/js/product-editor/src/components/block-icon/types.ts create mode 100644 packages/js/product-editor/src/components/section/types.ts create mode 100644 plugins/woocommerce/changelog/add-37264 diff --git a/packages/js/product-editor/changelog/add-37264 b/packages/js/product-editor/changelog/add-37264 new file mode 100644 index 00000000000..cd3fe0ca148 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37264 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +The BlockIcon component diff --git a/packages/js/product-editor/src/components/block-icon/README.md b/packages/js/product-editor/src/components/block-icon/README.md new file mode 100644 index 00000000000..c224a38b0ba --- /dev/null +++ b/packages/js/product-editor/src/components/block-icon/README.md @@ -0,0 +1,72 @@ +# BlockIcon + +This component uses the icon defined as a block attribute or metadata and renders it. + +It looks first within the block's `attributes` and if there is no icon defined there, then looks at the block's `metadata`. + +## Usage + +### Icon configuration + +1. As a block attribute + + In the block configuration file `./block.json` + + ```json + "attributes": { + "icon": { + "type": "object" + } + } + ``` + + In the server during the template configuration + + ```php + array( + 'woocommerce/product-section', // Block name + array( + // Block attributes + 'icon' => array( + // It's possible to pass a valid html string + 'src' => '', + + // Or an absolute url + 'src' => 'https://...', + 'alt' => 'The alt name for the icon', + + // Or a Dashicon icon-key + 'src' => 'default-block', + ), + ), + array( + // Inner blocks + ), + ), + ``` + +2. As part of the block's metadata + + See [the official blocks icon documentation](https://developer.wordpress.org/block-editor/reference-guides/block-api/block-metadata/#icon). + +### Rendering the Icon + +```javascript +import { __experimentalBlockIcon as BlockIcon } from '@woocommerce/product-editor'; + +export function BlockEdit( { clientId } ) { + const blockProps = useBlockProps(); + + return ( +
    +

    + + + { title } +

    + + +
    + ); +} +``` diff --git a/packages/js/product-editor/src/components/block-icon/block-icon.tsx b/packages/js/product-editor/src/components/block-icon/block-icon.tsx new file mode 100644 index 00000000000..fda5b44a7b9 --- /dev/null +++ b/packages/js/product-editor/src/components/block-icon/block-icon.tsx @@ -0,0 +1,67 @@ +/** + * External dependencies + */ +import { BlockIcon as BaseBlockIcon } from '@wordpress/block-editor'; +import { Block } from '@wordpress/blocks'; +import { useSelect } from '@wordpress/data'; +import { createElement, RawHTML } from '@wordpress/element'; + +/** + * Internal dependencies + */ +import { BlockIconProps } from './types'; + +export function BlockIcon( { clientId }: BlockIconProps ) { + const icon = useSelect( + ( select ) => { + // Try to get the icon from the block's attributes + const { getBlockAttributes, getBlockName } = + select( 'core/block-editor' ); + const attributes = getBlockAttributes( clientId ); + if ( attributes?.icon ) { + return attributes.icon; + } + + // If there is no icon defined in attributes + // Then try to get icon from block's metadata + const { getBlockType } = select( 'core/blocks' ); + const blockName = getBlockName( clientId ); + const block = getBlockType< Block >( blockName ); + return block?.icon; + }, + [ clientId ] + ); + + if ( ! icon ) { + return null; + } + + if ( typeof icon === 'object' ) { + const { src, ...iconProps } = icon; + + if ( /^<(.)+>$/.test( src ) ) { + const iconComponent = ( + + ); + return ; + } + + if ( /^https?:\/\/(.)+/.test( src ) ) { + const iconImage = ( + + ); + return ; + } + } + + return ; +} diff --git a/packages/js/product-editor/src/components/block-icon/index.ts b/packages/js/product-editor/src/components/block-icon/index.ts new file mode 100644 index 00000000000..9e20e38d3cf --- /dev/null +++ b/packages/js/product-editor/src/components/block-icon/index.ts @@ -0,0 +1,2 @@ +export * from './block-icon'; +export * from './types'; diff --git a/packages/js/product-editor/src/components/block-icon/types.ts b/packages/js/product-editor/src/components/block-icon/types.ts new file mode 100644 index 00000000000..b1e47017faf --- /dev/null +++ b/packages/js/product-editor/src/components/block-icon/types.ts @@ -0,0 +1,3 @@ +export type BlockIconProps = { + clientId: string; +}; diff --git a/packages/js/product-editor/src/components/index.ts b/packages/js/product-editor/src/components/index.ts index 8a1005c6a43..23075d35584 100644 --- a/packages/js/product-editor/src/components/index.ts +++ b/packages/js/product-editor/src/components/index.ts @@ -15,3 +15,7 @@ export { Editor as __experimentalEditor, ProductEditorSettings, } from './editor'; +export { + BlockIcon as __experimentalBlockIcon, + BlockIconProps, +} from './block-icon'; diff --git a/packages/js/product-editor/src/components/section/block.json b/packages/js/product-editor/src/components/section/block.json index e1d8a35c111..89f8811fb0c 100644 --- a/packages/js/product-editor/src/components/section/block.json +++ b/packages/js/product-editor/src/components/section/block.json @@ -13,6 +13,9 @@ }, "description": { "type": "string" + }, + "icon": { + "type": "object" } }, "supports": { diff --git a/packages/js/product-editor/src/components/section/edit.tsx b/packages/js/product-editor/src/components/section/edit.tsx index 7a46d9ae566..369055d4a0d 100644 --- a/packages/js/product-editor/src/components/section/edit.tsx +++ b/packages/js/product-editor/src/components/section/edit.tsx @@ -3,16 +3,26 @@ */ import { createElement } from '@wordpress/element'; import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; -import type { BlockAttributes } from '@wordpress/blocks'; +import type { BlockEditProps } from '@wordpress/blocks'; -export function Edit( { attributes }: { attributes: BlockAttributes } ) { +/** + * Internal dependencies + */ +import { SectionBlockAttributes } from './types'; +import { BlockIcon } from '../block-icon'; + +export function Edit( { + attributes, + clientId, +}: BlockEditProps< SectionBlockAttributes > ) { const blockProps = useBlockProps(); const { description, title } = attributes; return (

    - { title } + + { title }

    { description } diff --git a/packages/js/product-editor/src/components/section/index.ts b/packages/js/product-editor/src/components/section/index.ts index 15144b2b28d..70224538e05 100644 --- a/packages/js/product-editor/src/components/section/index.ts +++ b/packages/js/product-editor/src/components/section/index.ts @@ -1,17 +1,28 @@ +/** + * External dependencies + */ +import { createElement } from '@wordpress/element'; +import { BlockConfiguration } from '@wordpress/blocks'; + /** * Internal dependencies */ -import initBlock from '../../utils/init-block'; -import metadata from './block.json'; +import { initBlock } from '../../utils/init-blocks'; +import blockConfiguration from './block.json'; import { Edit } from './edit'; +import { SectionBlockAttributes } from './types'; -const { name } = metadata; +const { name, ...metadata } = + blockConfiguration as BlockConfiguration< SectionBlockAttributes >; export { metadata, name }; -export const settings = { - example: {}, - edit: Edit, -}; +export const settings: Partial< BlockConfiguration< SectionBlockAttributes > > = + { + example: {}, + edit: Edit, + }; -export const init = () => initBlock( { name, metadata, settings } ); +export function init() { + return initBlock( { name, metadata, settings } ); +} diff --git a/packages/js/product-editor/src/components/section/style.scss b/packages/js/product-editor/src/components/section/style.scss index d3341c04f49..137bead30c2 100644 --- a/packages/js/product-editor/src/components/section/style.scss +++ b/packages/js/product-editor/src/components/section/style.scss @@ -7,6 +7,18 @@ font-size: 24px; font-weight: 500; color: $gray-900; + display: inline-flex; + align-items: center; + + .block-editor-block-icon { + margin-right: 14px; + + > div { + display: flex; + align-items: center; + justify-content: center; + } + } } &__description { diff --git a/packages/js/product-editor/src/components/section/types.ts b/packages/js/product-editor/src/components/section/types.ts new file mode 100644 index 00000000000..017ae754a7d --- /dev/null +++ b/packages/js/product-editor/src/components/section/types.ts @@ -0,0 +1,9 @@ +/** + * External dependencies + */ +import { BlockAttributes } from '@wordpress/blocks'; + +export interface SectionBlockAttributes extends BlockAttributes { + title: string; + description: string; +} diff --git a/plugins/woocommerce/changelog/add-37264 b/plugins/woocommerce/changelog/add-37264 new file mode 100644 index 00000000000..e340926e2e7 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37264 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add image configuration to the product block template diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 5fcb68552a5..3d630729817 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -379,6 +379,9 @@ class WC_Post_Types { array( 'title' => __( 'Basic details', 'woocommerce' ), 'description' => __( 'This info will be displayed on the product page, category pages, social media, and search results.', 'woocommerce' ), + 'icon' => array( + 'src' => '', + ), ), array( array( @@ -456,6 +459,9 @@ class WC_Post_Types { 'woocommerce/product-section', array( 'title' => __( 'Shipping section', 'woocommerce' ), + 'icon' => array( + 'src' => '', + ), ), array( array( From 7a68b6f16f7c5dc237be80e18fcbb7505acb88bc Mon Sep 17 00:00:00 2001 From: Leif Singer Date: Mon, 27 Mar 2023 18:13:26 +0200 Subject: [PATCH 1252/1680] Delete changelog files based on PR #37434 (#37449) --- .../changelog/dev-update-required-wordpress-version | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/dev-update-required-wordpress-version diff --git a/plugins/woocommerce/changelog/dev-update-required-wordpress-version b/plugins/woocommerce/changelog/dev-update-required-wordpress-version deleted file mode 100644 index 46d408dca99..00000000000 --- a/plugins/woocommerce/changelog/dev-update-required-wordpress-version +++ /dev/null @@ -1,4 +0,0 @@ -Significance: major -Type: dev - -Update tested and required WordPress versions according to L-2 policy. From 82a172cd066423601841cda945bbe48535552334 Mon Sep 17 00:00:00 2001 From: Leif Singer Date: Mon, 27 Mar 2023 20:57:05 +0200 Subject: [PATCH 1253/1680] Delete changelog files based on PR 37323 (#37456) --- plugins/woocommerce/changelog/e2e-fix-failing-malta-test | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/e2e-fix-failing-malta-test diff --git a/plugins/woocommerce/changelog/e2e-fix-failing-malta-test b/plugins/woocommerce/changelog/e2e-fix-failing-malta-test deleted file mode 100644 index cc9f444a669..00000000000 --- a/plugins/woocommerce/changelog/e2e-fix-failing-malta-test +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update OBW end to end test as WC Pay supports Malta now From 1bcc039bf51e6615b48b1befea7ab55442199a49 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 21:12:10 +0200 Subject: [PATCH 1254/1680] Delete changelog files based on PR 37313 (#37358) Delete changelog files for 37313 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-order-cache-duplicate | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-order-cache-duplicate diff --git a/plugins/woocommerce/changelog/fix-order-cache-duplicate b/plugins/woocommerce/changelog/fix-order-cache-duplicate deleted file mode 100644 index 1fb3ace0c40..00000000000 --- a/plugins/woocommerce/changelog/fix-order-cache-duplicate +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Overwrite clone method to prevent duplicate datq when saving a clone. From bfe49d9d834ba577ebda4ac50d0d871ec00994d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 27 Mar 2023 21:39:19 +0200 Subject: [PATCH 1255/1680] Delete changelog files based on PR 37397 (#37423) Delete changelog files for 37397 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-37389-error-option-not-set | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-37389-error-option-not-set diff --git a/plugins/woocommerce/changelog/fix-37389-error-option-not-set b/plugins/woocommerce/changelog/fix-37389-error-option-not-set deleted file mode 100644 index 00bec2f5166..00000000000 --- a/plugins/woocommerce/changelog/fix-37389-error-option-not-set +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Add default value when calling get_option for woocommerce_task_list_tracked_completed_tasks. From 4b64923747e071b00d7fb6ddf1fccaaf4b4010ab Mon Sep 17 00:00:00 2001 From: Peter Fabian Date: Mon, 27 Mar 2023 22:19:24 +0200 Subject: [PATCH 1256/1680] Synchronized SSR from template to REST API (#37425) * Synchronized SSR from template to REST API. * Changelog. * PHPCS * More PHPCS. * PHPCS fix * Fixed unit tests. --- .../changelog/fix-sync-ssr-REST-and-UI | 4 + .../views/html-admin-page-status-report.php | 22 +++-- ...ss-wc-rest-system-status-v2-controller.php | 97 ++++++++++++++----- .../rest-api/Tests/Version2/system-status.php | 2 +- .../rest-api/Tests/Version3/system-status.php | 2 +- 5 files changed, 95 insertions(+), 32 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-sync-ssr-REST-and-UI diff --git a/plugins/woocommerce/changelog/fix-sync-ssr-REST-and-UI b/plugins/woocommerce/changelog/fix-sync-ssr-REST-and-UI new file mode 100644 index 00000000000..6891ea83cbe --- /dev/null +++ b/plugins/woocommerce/changelog/fix-sync-ssr-REST-and-UI @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Synchronized SSR from template to REST API. diff --git a/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php b/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php index 1d9b77524dc..7c0f04f3b97 100644 --- a/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php +++ b/plugins/woocommerce/includes/admin/views/html-admin-page-status-report.php @@ -6,8 +6,6 @@ */ use Automattic\Jetpack\Constants; -use Automattic\WooCommerce\Internal\ProductDownloads\ApprovedDirectories\Register as Download_Directories; -use Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer as Order_DataSynchronizer; defined( 'ABSPATH' ) || exit; @@ -761,20 +759,30 @@ if ( 0 < count( $dropins_mu_plugins['mu_plugins'] ) ) : : - get( Download_Directories::class )->get_mode() === Download_Directories::MODE_ENABLED ? '' : ''; ?> + ' : ''; ?> + + + + + + ' : ''; ?> + + + + + ' : ''; ?> - get_current_class_name() ); ?> + - get( Automattic\WooCommerce\Internal\Features\FeaturesController::class )->feature_is_enabled( 'custom_order_tables' ) ) : ?> - get( Order_DataSynchronizer::class )->data_sync_is_enabled() ? '' : ''; ?> + ' : ''; ?> - + diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-system-status-v2-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-system-status-v2-controller.php index 18c6f8df46b..6b6192bd1ba 100644 --- a/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-system-status-v2-controller.php +++ b/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-system-status-v2-controller.php @@ -11,6 +11,9 @@ defined( 'ABSPATH' ) || exit; use Automattic\WooCommerce\Internal\WCCom\ConnectionHelper; +use Automattic\WooCommerce\Internal\ProductDownloads\ApprovedDirectories\Register as Download_Directories; +use Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer as Order_DataSynchronizer; +use Automattic\WooCommerce\Utilities\OrderUtil; /** * System status controller class. * @@ -475,61 +478,61 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller { 'context' => array( 'view' ), 'readonly' => true, 'properties' => array( - 'api_enabled' => array( + 'api_enabled' => array( 'description' => __( 'REST API enabled?', 'woocommerce' ), 'type' => 'boolean', 'context' => array( 'view' ), 'readonly' => true, ), - 'force_ssl' => array( + 'force_ssl' => array( 'description' => __( 'SSL forced?', 'woocommerce' ), 'type' => 'boolean', 'context' => array( 'view' ), 'readonly' => true, ), - 'currency' => array( + 'currency' => array( 'description' => __( 'Currency.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ), - 'currency_symbol' => array( + 'currency_symbol' => array( 'description' => __( 'Currency symbol.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ), - 'currency_position' => array( + 'currency_position' => array( 'description' => __( 'Currency position.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ), - 'thousand_separator' => array( + 'thousand_separator' => array( 'description' => __( 'Thousand separator.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ), - 'decimal_separator' => array( + 'decimal_separator' => array( 'description' => __( 'Decimal separator.', 'woocommerce' ), 'type' => 'string', 'context' => array( 'view' ), 'readonly' => true, ), - 'number_of_decimals' => array( + 'number_of_decimals' => array( 'description' => __( 'Number of decimals.', 'woocommerce' ), 'type' => 'integer', 'context' => array( 'view' ), 'readonly' => true, ), - 'geolocation_enabled' => array( + 'geolocation_enabled' => array( 'description' => __( 'Geolocation enabled?', 'woocommerce' ), 'type' => 'boolean', 'context' => array( 'view' ), 'readonly' => true, ), - 'taxonomies' => array( + 'taxonomies' => array( 'description' => __( 'Taxonomy terms for product/order statuses.', 'woocommerce' ), 'type' => 'array', 'context' => array( 'view' ), @@ -538,7 +541,7 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller { 'type' => 'string', ), ), - 'product_visibility_terms' => array( + 'product_visibility_terms' => array( 'description' => __( 'Terms in the product visibility taxonomy.', 'woocommerce' ), 'type' => 'array', 'context' => array( 'view' ), @@ -547,6 +550,42 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller { 'type' => 'string', ), ), + 'wccom_connected' => array( + 'description' => __( 'Is store connected to WooCommerce.com?', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'enforce_approved_download_dirs' => array( + 'description' => __( 'Enforce approved download directories?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'HPOS_feature_screen_enabled' => array( + 'description' => __( 'Is HPOS feature screen enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'HPOS_enabled' => array( + 'description' => __( 'Is HPOS enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'order_datastore' => array( + 'description' => __( 'Order datastore.', 'woocommerce' ), + 'type' => 'string', + 'context' => array( 'view' ), + 'readonly' => true, + ), + 'HPOS_sync_enabled' => array( + 'description' => __( 'Is HPOS sync enabled?', 'woocommerce' ), + 'type' => 'boolean', + 'context' => array( 'view' ), + 'readonly' => true, + ), ), ), 'security' => array( @@ -1238,18 +1277,30 @@ class WC_REST_System_Status_V2_Controller extends WC_REST_Controller { // Return array of useful settings for debugging. return array( - 'api_enabled' => 'yes' === get_option( 'woocommerce_api_enabled' ), - 'force_ssl' => 'yes' === get_option( 'woocommerce_force_ssl_checkout' ), - 'currency' => get_woocommerce_currency(), - 'currency_symbol' => get_woocommerce_currency_symbol(), - 'currency_position' => get_option( 'woocommerce_currency_pos' ), - 'thousand_separator' => wc_get_price_thousand_separator(), - 'decimal_separator' => wc_get_price_decimal_separator(), - 'number_of_decimals' => wc_get_price_decimals(), - 'geolocation_enabled' => in_array( get_option( 'woocommerce_default_customer_address' ), array( 'geolocation_ajax', 'geolocation' ), true ), - 'taxonomies' => $term_response, - 'product_visibility_terms' => $product_visibility_terms, - 'woocommerce_com_connected' => ConnectionHelper::is_connected() ? 'yes' : 'no', + 'api_enabled' => 'yes' === get_option( 'woocommerce_api_enabled' ), + 'force_ssl' => 'yes' === get_option( 'woocommerce_force_ssl_checkout' ), + 'currency' => get_woocommerce_currency(), + 'currency_symbol' => get_woocommerce_currency_symbol(), + 'currency_position' => get_option( 'woocommerce_currency_pos' ), + 'thousand_separator' => wc_get_price_thousand_separator(), + 'decimal_separator' => wc_get_price_decimal_separator(), + 'number_of_decimals' => wc_get_price_decimals(), + 'geolocation_enabled' => in_array( + get_option( 'woocommerce_default_customer_address' ), + array( + 'geolocation_ajax', + 'geolocation', + ), + true + ), + 'taxonomies' => $term_response, + 'product_visibility_terms' => $product_visibility_terms, + 'woocommerce_com_connected' => ConnectionHelper::is_connected() ? 'yes' : 'no', + 'enforce_approved_download_dirs' => wc_get_container()->get( Download_Directories::class )->get_mode() === Download_Directories::MODE_ENABLED, + 'order_datastore' => WC_Data_Store::load( 'order' )->get_current_class_name(), + 'HPOS_feature_screen_enabled' => wc_get_container()->get( Automattic\WooCommerce\Internal\Features\FeaturesController::class )->feature_is_enabled( 'custom_order_tables' ), + 'HPOS_enabled' => OrderUtil::custom_orders_table_usage_is_enabled(), + 'HPOS_sync_enabled' => wc_get_container()->get( Order_DataSynchronizer::class )->data_sync_is_enabled(), ); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php index 4fe9ef49a99..663bc662d48 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version2/system-status.php @@ -178,7 +178,7 @@ class WC_Tests_REST_System_Status_V2 extends WC_REST_Unit_Test_Case { $data = $response->get_data(); $settings = (array) $data['settings']; - $this->assertEquals( 12, count( $settings ) ); + $this->assertEquals( 17, count( $settings ) ); $this->assertEquals( ( 'yes' === get_option( 'woocommerce_api_enabled' ) ), $settings['api_enabled'] ); $this->assertEquals( get_woocommerce_currency(), $settings['currency'] ); $this->assertEquals( $term_response, $settings['taxonomies'] ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php index 4fe8ef29055..53ed089d103 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/system-status.php @@ -201,7 +201,7 @@ class WC_Tests_REST_System_Status extends WC_REST_Unit_Test_Case { $data = $response->get_data(); $settings = (array) $data['settings']; - $this->assertEquals( 12, count( $settings ) ); + $this->assertEquals( 17, count( $settings ) ); $this->assertEquals( ( 'yes' === get_option( 'woocommerce_api_enabled' ) ), $settings['api_enabled'] ); $this->assertEquals( get_woocommerce_currency(), $settings['currency'] ); $this->assertEquals( $term_response, $settings['taxonomies'] ); From 7918d0a3c2ab049d77d6e631e8213c6420447afc Mon Sep 17 00:00:00 2001 From: Sam Seay Date: Tue, 28 Mar 2023 10:58:17 +1300 Subject: [PATCH 1257/1680] Revert "Replace $.ajax() calls with browser-native window.fetch() calls. (#36275)" This reverts commit 6c053d3eeca2805658f45a15e57ddd96d78bc1ab. --- .../js/frontend/add-to-cart-variation.js | 28 +--- .../client/legacy/js/frontend/add-to-cart.js | 22 +--- .../legacy/js/frontend/cart-fragments.js | 24 +--- .../client/legacy/js/frontend/cart.js | 57 +++------ .../client/legacy/js/frontend/checkout.js | 120 +++++++----------- .../client/legacy/js/frontend/geolocation.js | 12 +- 6 files changed, 73 insertions(+), 190 deletions(-) diff --git a/plugins/woocommerce/client/legacy/js/frontend/add-to-cart-variation.js b/plugins/woocommerce/client/legacy/js/frontend/add-to-cart-variation.js index d5e6bfa26a6..ba2ba97eb25 100644 --- a/plugins/woocommerce/client/legacy/js/frontend/add-to-cart-variation.js +++ b/plugins/woocommerce/client/legacy/js/frontend/add-to-cart-variation.js @@ -167,16 +167,16 @@ if ( attributes.count && attributes.count === attributes.chosenCount ) { if ( form.useAjax ) { - if ( form.controller ) { - form.controller.abort(); + if ( form.xhr ) { + form.xhr.abort(); } form.$form.block( { message: null, overlayCSS: { background: '#fff', opacity: 0.6 } } ); currentAttributes.product_id = parseInt( form.$form.data( 'product_id' ), 10 ); currentAttributes.custom_data = form.$form.data( 'custom_data' ); - const options = { + form.xhr = $.ajax( { url: wc_add_to_cart_variation_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'get_variation' ), type: 'POST', - data: $.param( currentAttributes ), + data: currentAttributes, success: function( variation ) { if ( variation ) { form.$form.trigger( 'found_variation', [ variation ] ); @@ -199,25 +199,7 @@ complete: function() { form.$form.unblock(); } - }; - - const controller = new AbortController(); - form.controller = controller; - - window.fetch( options.url, { - method: options.type, - headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, - body: options.data, - signal: controller.signal - } ) - .then( response => { - if ( !response.ok ) { - throw new Error( response.statusText ); - } - return response.json(); - }) - .then( options.success ) - .finally( () => options.complete() ); + } ); } else { form.$form.trigger( 'update_variation_values' ); diff --git a/plugins/woocommerce/client/legacy/js/frontend/add-to-cart.js b/plugins/woocommerce/client/legacy/js/frontend/add-to-cart.js index dac6676e560..e27baf072a4 100644 --- a/plugins/woocommerce/client/legacy/js/frontend/add-to-cart.js +++ b/plugins/woocommerce/client/legacy/js/frontend/add-to-cart.js @@ -51,21 +51,7 @@ jQuery( function( $ ) { } }; - const options = this.requests[0]; - window.fetch( options.url, { - method: options.type, - headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, - body: options.data - } ) - .then( response => { - if ( !response.ok ) { - throw new Error( response.statusText ); - } - return response.json(); - } ) - .then( options.success ) - .catch( error => options.error && options.error() ) - .finally( () => options.complete && options.complete() ); + $.ajax( this.requests[0] ); }; /** @@ -109,7 +95,7 @@ jQuery( function( $ ) { e.data.addToCartHandler.addRequest({ type: 'POST', url: wc_add_to_cart_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'add_to_cart' ), - data: $.param( data ), + data: data, success: function( response ) { if ( ! response ) { return; @@ -153,9 +139,9 @@ jQuery( function( $ ) { e.data.addToCartHandler.addRequest({ type: 'POST', url: wc_add_to_cart_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'remove_from_cart' ), - data: new URLSearchParams( { + data: { cart_item_key : $thisbutton.data( 'cart_item_key' ) - } ).toString(), + }, success: function( response ) { if ( ! response || ! response.fragments ) { window.location = $thisbutton.attr( 'href' ); diff --git a/plugins/woocommerce/client/legacy/js/frontend/cart-fragments.js b/plugins/woocommerce/client/legacy/js/frontend/cart-fragments.js index b57b2618d84..c5eef7b4c72 100644 --- a/plugins/woocommerce/client/legacy/js/frontend/cart-fragments.js +++ b/plugins/woocommerce/client/legacy/js/frontend/cart-fragments.js @@ -38,9 +38,9 @@ jQuery( function( $ ) { var $fragment_refresh = { url: wc_cart_fragments_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'get_refreshed_fragments' ), type: 'POST', - data: new URLSearchParams( { + data: { time: new Date().getTime() - } ).toString(), + }, timeout: wc_cart_fragments_params.request_timeout, success: function( data ) { if ( data && data.fragments ) { @@ -68,25 +68,7 @@ jQuery( function( $ ) { /* Named callback for refreshing cart fragment */ function refresh_cart_fragment() { - const controller = new AbortController(); - const timeoutId = setTimeout( () => controller.abort(), $fragment_refresh.timeout ); - - window.fetch( $fragment_refresh.url, { - method: $fragment_refresh.type, - headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, - body: $fragment_refresh.data, - signal: controller.signal - } ) - .then( response => { - clearTimeout( timeoutId ); - - if ( !response.ok ) { - throw new Error( response.statusText ); - } - return response.json(); - } ) - .then( $fragment_refresh.success ) - .catch( error => $fragment_refresh.error() ); + $.ajax( $fragment_refresh ); } /* Cart Handling */ diff --git a/plugins/woocommerce/client/legacy/js/frontend/cart.js b/plugins/woocommerce/client/legacy/js/frontend/cart.js index 62524a6bd1e..cdee33f5d79 100644 --- a/plugins/woocommerce/client/legacy/js/frontend/cart.js +++ b/plugins/woocommerce/client/legacy/js/frontend/cart.js @@ -8,27 +8,6 @@ jQuery( function( $ ) { // Utility functions for the file. - /** - * Perform an AJAX request that expects an HTML response. - * - * @param {Object} options - */ - const ajax = options => { - window.fetch( options.url, { - method: options.type || 'GET', - headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, - body: options.data - } ) - .then( response => { - if ( !response.ok ) { - throw new Error( response.statusText ); - } - return response.text(); - } ) - .then( options.success ) - .finally( () => options.complete() ); - }; - /** * Gets a url for a given AJAX endpoint. * @@ -243,17 +222,13 @@ jQuery( function( $ ) { var data = { security: wc_cart_params.update_shipping_method_nonce, + shipping_method: shipping_methods }; - // Flatten shipping_methods for use in URLSearchParams() - for ( var k in shipping_methods ) { - data[ 'shipping_method[' + k + ']' ] = shipping_methods[ k ]; - } - - ajax( { + $.ajax( { type: 'post', url: get_url( 'update_shipping_method' ), - data: new URLSearchParams( data ).toString(), + data: data, dataType: 'html', success: function( response ) { update_cart_totals_div( response ); @@ -285,10 +260,10 @@ jQuery( function( $ ) { .appendTo( $form ); // Make call to actual form post URL. - ajax( { + $.ajax( { type: $form.attr( 'method' ), url: $form.attr( 'action' ), - data: new URLSearchParams( new FormData( $form[0] ) ).toString(), + data: $form.serialize(), dataType: 'html', success: function( response ) { update_wc_div( response ); @@ -372,10 +347,10 @@ jQuery( function( $ ) { block( $( 'div.cart_totals' ) ); // Make call to actual form post URL. - ajax( { + $.ajax( { type: $form.attr( 'method' ), url: $form.attr( 'action' ), - data: new URLSearchParams( new FormData( $form[0] ) ).toString(), + data: $form.serialize(), dataType: 'html', success: function( response ) { update_wc_div( response, preserve_notices ); @@ -394,7 +369,7 @@ jQuery( function( $ ) { update_cart_totals: function() { block( $( 'div.cart_totals' ) ); - ajax( { + $.ajax( { url: get_url( 'get_cart_totals' ), dataType: 'html', success: function( response ) { @@ -496,10 +471,10 @@ jQuery( function( $ ) { coupon_code: coupon_code }; - ajax( { + $.ajax( { type: 'POST', url: get_url( 'apply_coupon' ), - data: new URLSearchParams( data ).toString(), + data: data, dataType: 'html', success: function( response ) { $( '.woocommerce-error, .woocommerce-message, .woocommerce-info' ).remove(); @@ -533,10 +508,10 @@ jQuery( function( $ ) { coupon: coupon }; - ajax( { + $.ajax( { type: 'POST', url: get_url( 'remove_coupon' ), - data: new URLSearchParams( data ).toString(), + data: data, dataType: 'html', success: function( response ) { $( '.woocommerce-error, .woocommerce-message, .woocommerce-info' ).remove(); @@ -566,10 +541,10 @@ jQuery( function( $ ) { .appendTo( $form ); // Make call to actual form post URL. - ajax( { + $.ajax( { type: $form.attr( 'method' ), url: $form.attr( 'action' ), - data: new URLSearchParams( new FormData( $form[0] ) ).toString(), + data: $form.serialize(), dataType: 'html', success: function( response ) { update_wc_div( response ); @@ -596,7 +571,7 @@ jQuery( function( $ ) { block( $form ); block( $( 'div.cart_totals' ) ); - ajax( { + $.ajax( { type: 'GET', url: $a.attr( 'href' ), dataType: 'html', @@ -625,7 +600,7 @@ jQuery( function( $ ) { block( $form ); block( $( 'div.cart_totals' ) ); - ajax( { + $.ajax( { type: 'GET', url: $a.attr( 'href' ), dataType: 'html', diff --git a/plugins/woocommerce/client/legacy/js/frontend/checkout.js b/plugins/woocommerce/client/legacy/js/frontend/checkout.js index ff9044164c2..91a33b69329 100644 --- a/plugins/woocommerce/client/legacy/js/frontend/checkout.js +++ b/plugins/woocommerce/client/legacy/js/frontend/checkout.js @@ -8,38 +8,6 @@ jQuery( function( $ ) { $.blockUI.defaults.overlayCSS.cursor = 'default'; - const ajax = options => { - const controller = new AbortController(); - - window.fetch( options.url, { - method: options.type, - headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, - body: options.data, - signal: controller.signal - } ) - .then( response => { - response.text().then( text => { - if ( !response.ok ) { - const error = new Error( response.statusText ); - error.responseText = text; // Needed for when wc_checkout_params.debug_mode is enabled - throw error; - } - - if ( options.dataType === 'html' ) { - options.success( text ); - return; - } - - const json = JSON.parse( ajax.dataFilter( text, 'json' ) ); - options.success( json ); - } ); - } ) - .catch( error => options.error && options.error( error.responseText, 'error', error.message ) ); - - return controller; - }; - ajax.dataFilter = ( raw_response, dataType ) => raw_response; - var wc_checkout_form = { updateTimer: false, dirtyInput: false, @@ -288,12 +256,11 @@ jQuery( function( $ ) { wc_checkout_form.updateTimer = setTimeout( wc_checkout_form.update_checkout_action, '5', args ); }, update_checkout_action: function( args ) { - if ( wc_checkout_form.controller ) { - wc_checkout_form.controller.abort(); + if ( wc_checkout_form.xhr ) { + wc_checkout_form.xhr.abort(); } - var $form = $( 'form.checkout' ); - if ( $form.length === 0 ) { + if ( $( 'form.checkout' ).length === 0 ) { return; } @@ -349,7 +316,7 @@ jQuery( function( $ ) { s_address : s_address, s_address_2 : s_address_2, has_full_address: has_full_address, - post_data : new URLSearchParams( new FormData( $form[0] ) ).toString() + post_data : $( 'form.checkout' ).serialize() }; if ( false !== args.update_shipping_method ) { @@ -360,10 +327,7 @@ jQuery( function( $ ) { shipping_methods[ $( this ).data( 'index' ) ] = $( this ).val(); } ); - // Flatten shipping_methods for use in URLSearchParams() - for ( var k in shipping_methods ) { - data[ 'shipping_method[' + k + ']' ] = shipping_methods[ k ]; - } + data.shipping_method = shipping_methods; } $( '.woocommerce-checkout-payment, .woocommerce-checkout-review-order-table' ).block({ @@ -374,10 +338,10 @@ jQuery( function( $ ) { } }); - wc_checkout_form.controller = ajax({ + wc_checkout_form.xhr = $.ajax({ type: 'POST', url: wc_checkout_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'update_order_review' ), - data: new URLSearchParams( data ).toString(), + data: data, success: function( data ) { // Reload the page if requested @@ -440,6 +404,8 @@ jQuery( function( $ ) { // Check for error if ( data && 'failure' === data.result ) { + var $form = $( 'form.checkout' ); + // Remove notices from all sources $( '.woocommerce-error, .woocommerce-message' ).remove(); @@ -520,37 +486,39 @@ jQuery( function( $ ) { // Attach event to block reloading the page when the form has been submitted wc_checkout_form.attachUnloadEventsOnSubmit(); - // ajax.dataFilter affects all ajax() calls, but we use it to ensure JSON is valid once returned. - ajax.dataFilter = function( raw_response, dataType ) { - // We only want to work with JSON - if ( 'json' !== dataType ) { - return raw_response; - } - - if ( wc_checkout_form.is_valid_json( raw_response ) ) { - return raw_response; - } else { - // Attempt to fix the malformed JSON - var maybe_valid_json = raw_response.match( /{"result.*}/ ); - - if ( null === maybe_valid_json ) { - console.log( 'Unable to fix malformed JSON' ); - } else if ( wc_checkout_form.is_valid_json( maybe_valid_json[0] ) ) { - console.log( 'Fixed malformed JSON. Original:' ); - console.log( raw_response ); - raw_response = maybe_valid_json[0]; - } else { - console.log( 'Unable to fix malformed JSON' ); + // ajaxSetup is global, but we use it to ensure JSON is valid once returned. + $.ajaxSetup( { + dataFilter: function( raw_response, dataType ) { + // We only want to work with JSON + if ( 'json' !== dataType ) { + return raw_response; } + + if ( wc_checkout_form.is_valid_json( raw_response ) ) { + return raw_response; + } else { + // Attempt to fix the malformed JSON + var maybe_valid_json = raw_response.match( /{"result.*}/ ); + + if ( null === maybe_valid_json ) { + console.log( 'Unable to fix malformed JSON' ); + } else if ( wc_checkout_form.is_valid_json( maybe_valid_json[0] ) ) { + console.log( 'Fixed malformed JSON. Original:' ); + console.log( raw_response ); + raw_response = maybe_valid_json[0]; + } else { + console.log( 'Unable to fix malformed JSON' ); + } + } + + return raw_response; } + } ); - return raw_response; - }; - - ajax({ + $.ajax({ type: 'POST', url: wc_checkout_params.checkout_url, - data: new URLSearchParams( new FormData( $form[0] ) ).toString(), + data: $form.serialize(), dataType: 'json', success: function( result ) { // Detach the unload handler that prevents a reload / redirect @@ -588,7 +556,7 @@ jQuery( function( $ ) { } } }, - error: function( responseText, textStatus, errorThrown ) { + error: function( jqXHR, textStatus, errorThrown ) { // Detach the unload handler that prevents a reload / redirect wc_checkout_form.detachUnloadEventsOnSubmit(); @@ -653,10 +621,10 @@ jQuery( function( $ ) { coupon_code: $form.find( 'input[name="coupon_code"]' ).val() }; - ajax({ + $.ajax({ type: 'POST', url: wc_checkout_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'apply_coupon' ), - data: new URLSearchParams( data ).toString(), + data: data, success: function( code ) { $( '.woocommerce-error, .woocommerce-message' ).remove(); $form.removeClass( 'processing' ).unblock(); @@ -693,10 +661,10 @@ jQuery( function( $ ) { coupon: coupon }; - ajax({ + $.ajax({ type: 'POST', url: wc_checkout_params.wc_ajax_url.toString().replace( '%%endpoint%%', 'remove_coupon' ), - data: new URLSearchParams( data ).toString(), + data: data, success: function( code ) { $( '.woocommerce-error, .woocommerce-message' ).remove(); container.removeClass( 'processing' ).unblock(); @@ -711,10 +679,10 @@ jQuery( function( $ ) { $( 'form.checkout_coupon' ).find( 'input[name="coupon_code"]' ).val( '' ); } }, - error: function ( responseText ) { + error: function ( jqXHR ) { if ( wc_checkout_params.debug_mode ) { /* jshint devel: true */ - console.log( responseText ); + console.log( jqXHR.responseText ); } }, dataType: 'html' diff --git a/plugins/woocommerce/client/legacy/js/frontend/geolocation.js b/plugins/woocommerce/client/legacy/js/frontend/geolocation.js index 29f8435f9df..e7029a3539d 100644 --- a/plugins/woocommerce/client/legacy/js/frontend/geolocation.js +++ b/plugins/woocommerce/client/legacy/js/frontend/geolocation.js @@ -127,17 +127,7 @@ jQuery( function( $ ) { // Get the current geo hash. If it doesn't exist, or if it doesn't match the current // page URL, perform a geolocation request. if ( ! get_geo_hash() || needs_refresh() ) { - window.fetch( $geolocate_customer.url, { - method: $geolocate_customer.type, - headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' } - } ) - .then( response => { - if ( !response.ok ) { - throw new Error( response.statusText ); - } - return response.json(); - } ) - .then( $geolocate_customer.success ); + $.ajax( $geolocate_customer ); } // Page updates. From 6e8f08043822364f3db850c64a04325b00b97583 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:10:56 -0700 Subject: [PATCH 1258/1680] Restore reviews (comments) to the product editor. --- .../ReviewsCommentsOverrides.php | 7 ++++ .../ReviewsCommentsOverridesTest.php | 34 ++++++++++++++++--- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/plugins/woocommerce/src/Internal/Admin/ProductReviews/ReviewsCommentsOverrides.php b/plugins/woocommerce/src/Internal/Admin/ProductReviews/ReviewsCommentsOverrides.php index 99183f771ba..b54e9c10b3a 100644 --- a/plugins/woocommerce/src/Internal/Admin/ProductReviews/ReviewsCommentsOverrides.php +++ b/plugins/woocommerce/src/Internal/Admin/ProductReviews/ReviewsCommentsOverrides.php @@ -4,6 +4,7 @@ namespace Automattic\WooCommerce\Internal\Admin\ProductReviews; use Automattic\WooCommerce\Internal\Traits\AccessiblePrivateMethods; use WP_Comment_Query; +use WP_Screen; /** * Tweaks the WordPress comments page to exclude reviews. @@ -116,6 +117,12 @@ class ReviewsCommentsOverrides { * @return array */ protected function exclude_reviews_from_comments( $args ) : array { + $screen = get_current_screen(); + + // We only wish to intervene if the edit comments screen has been requested. + if ( ! $screen instanceof WP_Screen || 'edit-comments' !== $screen->id ) { + return $args; + } if ( ! empty( $args['post_type'] ) && $args['post_type'] !== 'any' ) { $post_types = (array) $args['post_type']; diff --git a/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php b/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php index 0eada0ee77c..e7635503797 100644 --- a/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php +++ b/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php @@ -7,6 +7,7 @@ use Generator; use ReflectionClass; use ReflectionException; use WC_Unit_Test_Case; +use WP_Screen; /** * Tests the product reviews overrides for the comments page. @@ -244,20 +245,43 @@ class ReviewsCommentsOverridesTest extends WC_Unit_Test_Case { * @throws ReflectionException If the method doesn't exist. */ public function test_exclude_reviews_from_comments() : void { + global $current_screen; + $original_screen_value = $current_screen; + $overrides = wc_get_container()->get( ReviewsCommentsOverrides::class ); + $method = ( new ReflectionClass( $overrides ) )->getMethod( 'exclude_reviews_from_comments' ); + $method->setAccessible( true ); $original_args = [ 'post_type' => [ 'product' ], ]; - $this->assertTrue( in_array( 'product', $original_args['post_type'] ) ); + $current_screen = WP_Screen::get( 'edit-comments' ); + $filtered_args = $method->invoke( $overrides, $original_args ); - $method = ( new ReflectionClass( $overrides ) )->getMethod( 'exclude_reviews_from_comments' ); - $method->setAccessible( true ); + $this->assertFalse( + in_array( 'product', $filtered_args['post_type'] ), + 'In the context of the edit-comments screen, the product post type will be removed from the comments query.' + ); - $new_args = $method->invoke( $overrides, $original_args ); + $current_screen = WP_Screen::get( 'arbitrary-admin-page' ); + $filtered_args = $method->invoke( $overrides, $original_args ); - $this->assertFalse( in_array( 'product', $new_args['post_type'] ) ); + $this->assertTrue( + in_array( 'product', $filtered_args['post_type'] ), + 'In the context of all other admin screens, the product post type will not be removed from the comments query.' + ); + + $current_screen = null; + $filtered_args = $method->invoke( $overrides, $original_args ); + + $this->assertTrue( + in_array( 'product', $filtered_args['post_type'] ), + 'If the $current_screen global is not set, the product post type will not be removed from the comments query.' + ); + + // Clean-up. + $current_screen = $original_screen_value; } } From d4738cd5f0807ab77d9adb00f17287e64c5aa331 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 27 Mar 2023 11:12:34 -0700 Subject: [PATCH 1259/1680] Changelog. --- .../woocommerce/changelog/fix-34594-product-editor-reviews | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-34594-product-editor-reviews diff --git a/plugins/woocommerce/changelog/fix-34594-product-editor-reviews b/plugins/woocommerce/changelog/fix-34594-product-editor-reviews new file mode 100644 index 00000000000..f3ffd7d5e56 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-34594-product-editor-reviews @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Restores comments (reviews) to the product editor. From 03ebff86b880fc84fc4281912adecc318863dd9c Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:15:42 -0700 Subject: [PATCH 1260/1680] Quick edit and reply customizations targeting the Product Review page should not impact the product editor. --- .../src/Internal/Admin/ProductReviews/Reviews.php | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php b/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php index 22109694091..55d9e77d2a6 100644 --- a/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php +++ b/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php @@ -168,6 +168,11 @@ class Reviews { * @return void */ private function handle_edit_review(): void { + // Don't interfere with comment functionality relating to the reviews meta box within the product editor. + if ( sanitize_text_field( wp_unslash( $_POST['mode'] ) ) === 'single' ) { + return; + } + check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ); $comment_id = isset( $_POST['comment_ID'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['comment_ID'] ) ) : 0; @@ -235,6 +240,11 @@ class Reviews { * @return void */ private function handle_reply_to_review() : void { + // Don't interfere with comment functionality relating to the reviews meta box within the product editor. + if ( sanitize_text_field( wp_unslash( $_POST['mode'] ) ) === 'single' ) { + return; + } + check_ajax_referer( 'replyto-comment', '_ajax_nonce-replyto-comment' ); $comment_post_ID = isset( $_POST['comment_post_ID'] ) ? (int) sanitize_text_field( wp_unslash( $_POST['comment_post_ID'] ) ) : 0; // phpcs:ignore WordPress.NamingConventions.ValidVariableName.VariableNotSnakeCase From c567a679b57a55ce0256f203bd82406b209a3c8a Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:21:25 -0700 Subject: [PATCH 1261/1680] Do not assume is set in the array. --- .../woocommerce/src/Internal/Admin/ProductReviews/Reviews.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php b/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php index 55d9e77d2a6..8246e4075b5 100644 --- a/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php +++ b/plugins/woocommerce/src/Internal/Admin/ProductReviews/Reviews.php @@ -169,7 +169,7 @@ class Reviews { */ private function handle_edit_review(): void { // Don't interfere with comment functionality relating to the reviews meta box within the product editor. - if ( sanitize_text_field( wp_unslash( $_POST['mode'] ) ) === 'single' ) { + if ( sanitize_text_field( wp_unslash( $_POST['mode'] ?? '' ) ) === 'single' ) { return; } @@ -241,7 +241,7 @@ class Reviews { */ private function handle_reply_to_review() : void { // Don't interfere with comment functionality relating to the reviews meta box within the product editor. - if ( sanitize_text_field( wp_unslash( $_POST['mode'] ) ) === 'single' ) { + if ( sanitize_text_field( wp_unslash( $_POST['mode'] ?? '' ) ) === 'single' ) { return; } From 44330f5ab8bbc2621747004d071dc874ad055d17 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:26:23 -0700 Subject: [PATCH 1262/1680] Tidy tests per coding standards. --- .../ProductReviews/ReviewsCommentsOverridesTest.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php b/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php index e7635503797..1f826c2e8e9 100644 --- a/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php +++ b/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php @@ -256,27 +256,30 @@ class ReviewsCommentsOverridesTest extends WC_Unit_Test_Case { 'post_type' => [ 'product' ], ]; + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited $current_screen = WP_Screen::get( 'edit-comments' ); $filtered_args = $method->invoke( $overrides, $original_args ); $this->assertFalse( - in_array( 'product', $filtered_args['post_type'] ), + in_array( 'product', $filtered_args['post_type'], true ), 'In the context of the edit-comments screen, the product post type will be removed from the comments query.' ); + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited $current_screen = WP_Screen::get( 'arbitrary-admin-page' ); $filtered_args = $method->invoke( $overrides, $original_args ); $this->assertTrue( - in_array( 'product', $filtered_args['post_type'] ), + in_array( 'product', $filtered_args['post_type'], true ), 'In the context of all other admin screens, the product post type will not be removed from the comments query.' ); + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited $current_screen = null; $filtered_args = $method->invoke( $overrides, $original_args ); $this->assertTrue( - in_array( 'product', $filtered_args['post_type'] ), + in_array( 'product', $filtered_args['post_type'], true ), 'If the $current_screen global is not set, the product post type will not be removed from the comments query.' ); From 7c0dfa309382c6849320a4c880307d173b026e29 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 27 Mar 2023 13:32:05 -0700 Subject: [PATCH 1263/1680] One more PHPCS override. We need to restore the current screen obj. --- .../Admin/ProductReviews/ReviewsCommentsOverridesTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php b/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php index 1f826c2e8e9..696e080caf6 100644 --- a/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php +++ b/plugins/woocommerce/tests/php/src/Internal/Admin/ProductReviews/ReviewsCommentsOverridesTest.php @@ -283,7 +283,7 @@ class ReviewsCommentsOverridesTest extends WC_Unit_Test_Case { 'If the $current_screen global is not set, the product post type will not be removed from the comments query.' ); - // Clean-up. + // phpcs:ignore WordPress.WP.GlobalVariablesOverride.Prohibited $current_screen = $original_screen_value; } From e18a531e85b2a8c5e667526844f14d388b0c649a Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Tue, 28 Mar 2023 11:43:33 +0800 Subject: [PATCH 1264/1680] Add Payoneer, zipco payment gateways and update Klarna available countries (#37329) * Update default payment gateways * Add changelog * Update payoneer image --- .../assets/images/onboarding/payoneer.png | Bin 0 -> 11080 bytes .../assets/images/onboarding/zipco.png | Bin 0 -> 7210 bytes .../images/payment_methods/72x72/payoneer.png | Bin 0 -> 8194 bytes .../images/payment_methods/72x72/zipco.png | Bin 0 -> 2730 bytes .../changelog/update-payment-partners | 4 ++ .../DefaultPaymentGateways.php | 54 ++++++++++++++++++ 6 files changed, 58 insertions(+) create mode 100644 plugins/woocommerce/assets/images/onboarding/payoneer.png create mode 100644 plugins/woocommerce/assets/images/onboarding/zipco.png create mode 100644 plugins/woocommerce/assets/images/payment_methods/72x72/payoneer.png create mode 100644 plugins/woocommerce/assets/images/payment_methods/72x72/zipco.png create mode 100644 plugins/woocommerce/changelog/update-payment-partners diff --git a/plugins/woocommerce/assets/images/onboarding/payoneer.png b/plugins/woocommerce/assets/images/onboarding/payoneer.png new file mode 100644 index 0000000000000000000000000000000000000000..4f109263dd37963788be24542985bc28004a20ac GIT binary patch literal 11080 zcmWk!XHZj(6212(A%zxts0oM^=}HG7^bP?*P*JLa3R0yAm>YU8VgU;VL~JNvL9B!h z7DTZSKnRHR4$?{9_jYz>clO`enVmU%cC#qXHoQ0q8~^~kcD9yo0091%f&d2bUpQOs z-g4iL=h(gNHut z+6l1juq!lR`vfrK61U-?zM23GyS?AER~S0fHgM?sob%}&JHmPdFz@95mjMdCd$HpM zYy|+jhXDMmH@BFs6-@iFHjw{C)3gh9xDR4G1Hw%;{~S$6dcn~TAj_>mtn&`KVvzgs zr_Eqs;w8A84v4fq5dTzmpJ{=*J&Jwsjkm5HacNchX92N4Yu!N`Dw$n$@}7DGeq#!( z#Q=yK6JdSneICqIX6R$)L8;!$*O;D9nR>Hy5L5N*S3mcfg8_r7IQb0JN}bPV`Y$`V zy2XStT;}4n zppnq1@jtG2Cn$LuikEdKx(L{x)ub}N}K_Kiqplz*EXebkFBwA^#cjmwmDOu&CzA_+J_>G3=xw%At3x@f~FF=KMrVPT%qhA`X99x(=G z&AK_E{P_6X90M1zL-u?rJ&KN0dyPZo*LcRLh))isR+QpF`#`5$FA;jNZGZL$J6Is# ze9S$&$V8deMx5ZW+)|TBLfBDh9o1(|QlHGFvhoRTQ3J&AX8)tlk~@wUb~rJDG3|G` z#*QK{k#oOT*;t&j8VE&IIoE3pWDYr=KmR#0=xxL+%aEwxUcHm`1$K8NU#GmW@R+tC zjpiZlT3%~TM=vA;*qlG#in)HYBl;gB)Dtod{+j_rw43uGOm8^f`N(ttP(s*Qnz_gI zR~~D05jG=u#IC2_Nonmaq4@gKc&~fq6D)AGJ%QyIx+t;wf^G$bn<4tI|V zzM2nCOZP^JvJuEThcB*tyml+>eW~pGfdS^)yZGUPQsz6$hRDq`n7gk(sJe^ne)hta z#Qf1dF72>u z4@fpqg2vul;)%u%Vo%Mcx|6)QsOjH$OJ~c0gPEGGDz@|^D^nV?7J||%*Q9&EBo|=I zsR;6XVh?%o_ozKKKdI4kO_-wVJO3-i0}^b=5{m}T9}J()ekU!I3i64yigT%PgTjK;%pn%Hqeh8^jPap(4qNJO8H1HG@q zYY+EzriS1?j9ekV8$_7*>|F}W*eAisyvSwBD{Lp?Es**2+8=5=S(vWf_?7^3gajQO zbQkx_&fbQ!l?d@k7Q&ifl_kh9Zp14Lz^8qH_25xr8YSx9u_urlGI-wiiw6l?iLV`- zqQRP(zktOFbH_Uve>+iRgQ=0U*RAsRYq%8{x$3o%4=9BI8BO@rR9lr14oph6+eF&3a2x%K@ZXipF1&^zyhYr5McTT58NtE;X zpkjFUN#U7V5T7v{*Fay=2&>2Cl z$6mscho7UTPaKfSw?<@q4b~31URA$R@R=l0JlVMuAelUE&kdia@NwLB$Asyn{5B~o zrt4UuiLqX{uGJ-H+$5|Mw2*>SWJx9EDAbw>UCVbsjKXL@1vBp452(fD%$`Ft}Q zSLr+$Mt#e7(md9XEoLZ_#`U?YUou(1cK`!$dv}5_wRPi^CO59(Xh%4hvu3dl@=ZI= zwP)10K3<5ct+$5oB=Sc{DdjD0h>yFrF5>&dnuh;gV0#p#3ki=8^PMzL#TDeUhni+| zP#8u4Y((+{n*VfUA|2npLLDHjrCJz`c7oMl^I@`~$l)PoZ3RaHdS1-&-%9l2|2el}zbu+KaZn46N%-kWZg@Tw& zS|Dan7!|(a0^xt!K^d#32zgSLLrMa}f_r)jGlsfmXH`9Y9dc>)zyk~n+QR?N+oSaP z3;9r+=D=Di@8jL+oMSLueBNpD~ntpfomvF*7=tZ`NykRdS z8EF1!@eJSN8EMnXg8@&Q0)l}Z)P)Y62v(Ul8?}30k zCa+LZm1C)X|HE-Bq9`kkGyvks+KjFJ8!A%mv1x6hfQtW8U}q~?kmw@g{R~Ioy@`sG z@OEWE`29#0NUt+|aQ7wRXos1!De&FO#h;H%sGQ}%NKL#d-X5yv!6}nY!asg^T;Vog zUHm6J4UR>D8>XSO-)LMdAPfWMf|`8#dv_xE8oH$Z1G=PWJSS!*6pTpy(%P3#Sq`Rz zHxHe!;K%YL;UEp(EoeuAC%vWW*ByjF!hW~)>!CTOI{`=}ag+Gu z!4O%;RL;MdN_YbF0_HURS&7=SKlDYLg?5Fnvx9fGkEer-+qFJ68;>OC`vkdl%)L;j zJWNN!_5w*5#wEt)i9!=>k@u$ z#eKh>w3d81$*7`K$_yaDXt;UcC5S5I=*K7J5c4nG0$L^(G@cxbI|8GdnDhs~ADMwz z!fcb*L4*AQBre9GkGB_tI~-tkU3f+i7;n+K8#w!(?i>}V!b15&HZKn0#O2+{e{H-#EdJN9w4zuf7=r-uIh0XqKZi&k&j90mxa zPL6;ujNI^*+sH0?uEr-V&vtO2Flvy&=&Xxs?}*@Z8FFWD9lK8)UQyI%Q-DIf)Bppz z@XJ&N5h6p4;%C0<%^JMEPt$}sUnvLj(TqKN7%e6r5zUh32OQzI571O|6^xf0GRZ%T z+I%*0CqP^bh>_Rs__&{1QL|~fDiSQTKQ}C`{0^a$nvtY$+a_OxeP1kAD!x@xZiSyQqG^Zei+lA`K`%(2 zEwOEsi~xd3SeT%Bmoec2eXjmA)O+!ws}`4lD1f4Ya`CAU?P zNZeuWNJ`0JEhFIuMT~3%^d`z4uw{t!J=V`%;pAa}?J!BYZKBHe#{~f^jp1Q_BPtG% zp|11zj&lGptE?V@Z6$7Fi7F!Efb+k5ioeR~pHET7!50;v))FGaL##ek(8< zZytYlPRI;zJ*uu>Xq$z1!|CDE6c&JJ0lCZC!abFvYH^4Yq)W#K#j`R;0|T>~g`bPM zDP<0}3cAT()>d+1u(wubXJ^lC%ttzJC+Qt9diLg7>@esDkEIfJM$O1)Ziw_-1@0iJ zYiu3S7bR#5@GG?M!RdMgm4Cl*bjp~up8-D~QZvl-ar3=vhXFQQ%{gUP7TRCFQ*sm;76>UQ_o{Z|@EHfX9Me{+O9$ith#`MTuS~ z42;wW4s<-mOr4_*oYZI6`*TF;jq7nW2~GPKc}3=#(Vts+ zSoMvT)dr|V_R^L}yjoMmsmdwM!b#~Tlix~W0e%h8m9bP)jLD!1C(m%c>OT=Cu{i`T zy4Fedmzc~f3ue&VBGz;*o?UkV0R%D8m@J`@E3?YZKeGo2^ zlU#gUDV!+ib${LG96+C^GE9B=89*+t>fEpaymm3KeCk0Z_@ zx%T{2k=1p^?eEhhEL?wgV;P!YFH$os(v&~QmJ2(6!41puu>chqQq$#`*gEO`(XoW5 zH(#rttf9we0hTmUITASme%6c{-j7-&)ifhB0QH49dsnLDGW6m$uBVXz72hTG{dp-H zMqK4}G?Z5>*wQ3n$lXqaxrGIYCK(+pXlo5Bku6C11!RevE~!_I#!ReEG`4;H>e^e( zl1R4{qyOj$^pVB0-XCJEGhXtHo0&6?KZNpVO1P+Z#b*zN0jcbwacXo~3Exb))YXjy z(E7URSK#7e0zroEhW*Z)V6w-*DFci%d*aG+UkR!i_P;(&ue%LfG^{=2d zcL#A*jhc44QtD}JjNA8PjPR#*AU0U_X3y0uM_Gb_wQ?=zpWAfwqs8w%o_c?4B2ENN zAR@N|Uh}4u2<*sIoCLB8-MQVy*%>#0o2G3yo_{JE-A#Glw%Yi*{p##vkPJ%TtW|an z!~<^SJ#1xL@o2pkDpN1vEkHHr=s1!-Ap^l$^(Vx+bTl_ADr`5JQ2kBO&I~$(m?gan zlna&#zFM+>>uO{3<>mGY{2FG-uycs39{}WFB3Pc1`)`sA8!N5Sod*|pkVP91j^X# z)bsgw14xq=&$s{^_Sr@1MVZ&8xX}|aZmWR_l7kPp_6!-8gs1dCET~e- zTm&Q5aAOf%<^46Gwe>~kx-H&OBiDByec)%Noo0cybJpPImS#0k9C!%N+GgS>Bi<~n zHl6Un-D}naK)JPrOQg0F6yHu~7u!5Q;(qETA9lY=t_}3oXZrHj_51OHseUA;$?!RZ zJB{ys!O8(a93183$QS^YXiu5Ib4TWIdk;FncOMTT6TECBp`gej+LC$57US~*4-ku( zUuifg#_v`nYg;Dlc4JaPR}`6b*nfZETWOd8c+wvp=pwBHi!WV1WsZ4-gLnn_CI1>1 zuPe!u+gG=8puc~p0vC>0tXjB;WNcXM0b=Pa;dgya;5`=qn#6(dj>M7@+?{~=3m@TQ zW@2Y=IcVVGc+JDt4Ca@Yv_79*UZ#CCym0BN63h)MUQcpQiJ0{|EuNSoRb^=~Iq=2O z;tXO!YmF#;T~p|if@Q6f+rc+`cge|iaTTw5fg`+evZ<$CrS|boeEF2K@_yvBEhnX- zMoUN+TXpo*cS5Zdz-wJ}sCC(uVQgk%d{l;W)fpSEcwhYmK(E<2=DqB0YiNz`^$Vcz z%M)N@d0UswYL;-j|I@fFOTPXy>CfCnedIRW9xU>S6?@9NiUQ++JLR(CCAga z@1RvTzqT*`mc#){2J(Tw?NaHw&VA&-mRA1lN>3w~!Y@U+mo1b~A9_icrU|VJ4!JeT`s@O%#-82wFF z;xx(^GM3eC_2Z=BVBP3o!nWSRaIiNCy&PK=^?U}6i^I0F=BIusWsGTKNLaJg896JJ zl<9E^Z-M3PcZg(oJpYGl{K?>eWVufyJ6x#M9Njpz3|00}{ay?YQLCoTh6WkdtsEl+7NQtEZ@%hf@{<=^jp6ws)?6gnPC#A(A(m>anX)}V-G4mb*A3Y% z>vUcA^50PZ>xS;O*DSV5hh;CBIRA4jLdUW`P&(|gORF9He3#qn(mJb1c>l^gL= z|5&Kx=a_e z*l*FRbX!>dE_vkF-u<`5L&#;mhii|^Oqy>wr|KGFuDYNjwx;bGf`q^lvQ!X@XJ=#S z&$Dv=37dUV1M&vLS$hN#e%n(~ZEY^xg_?kv(&kX0FdAGjrIwx9u@WsgUHX;!%ZUGz zh`&^1O}wD$J%}gQ==!~nr`iJKyamPqg%&*Ou5w)yB2Ak57^B7FqL7E#SP$R}`eRW0 z9cxWQRPuQu(Awr&otIApta0~RbyN^IU0V`@^|_@;iSpis!kD-hakI#yDH<=8((p!g z{9Dsj=`C>FQ#E5Fmofyh(5h1G>_TeAlNvA4t}89E&NAV%t;qX1r&`HnSIny;jB5br z;`|F{3r4|z+%}xQF~+|3iy-M6URtmz4zdGNp=#b*d@ynE-@@=Gi_A*~EF?p~JW?z0 z$JQZ9}pP%W&bPi3E|9b10~*Y3qV&^z6zG< z`Vz7nt>0+p#_kK=O@*MsNF}D>_SatiaKRTGM+{l^6SB5(^n|N{thd7zi)7%oop_G} zmzfICVK-ge+f@$lF(0aRQp~r%m<1=#NoXq>WG^_ zGG{I|ZjDc0NHx8T}$r93(qg#i)V2!AvGCnb0z?o3qOqO7?`ImY90 z#eS>fmujs9#OaAN^(zFHq_0uL#f8ZCL1OHMCAW6Y@Wit(Cb#!4yupN9d69dai(d7` zFOLlsrvg6Ri3`Rb{Tj?*M4&PNeppM_x!7{z2wA@DA&G``hP9sq<7t0lu(G$5&oarI zPvc$zHzn%*X$QE;>lzCPQlzL*Q^l39m5`GLV{PqDXn{?^P6uZz)-)ex22SPhI>6tn z;9GmK+H)H%d4FnS@1KVfg#?kH8wMf|+ZNwAhzW0L9O384qsS>C`CdC2Xvzp>H>^+O?!{PryKY2wvn+4KmwhwkAv`Co zY$cn*5BjT^fEF)|&KWgnl3V7@0qV^zs1t13R2(1BNtzq4X7jzAw8tqpPT&n{zh!08t0&b?BhQ)v4ZzpH<}d*>3e!(eZPI{W|5lIvGxR0Z)-^8B~Ri(k+wx>1@Za{7b~S5J-AQ6p1RcQe8gx|7;XvSBe*Bb{udp#>!@r&jGU z5tHZf^-IrfwxzWClo=k3#+DZ=pU)E0I1&BfkOhhV)6*^aj5=~zDK7GF_z&*2pGe(1 z%DG*944!B)Uqa99J<6Jo1kY`k&&jpW)s{Z#T0f(vKUZE{(OFl|u622u_&FIPBK$h} zO#rbDvA&@p$=763s=z&#?8{!QwT^l_S~pIl1@*u2U=fo0q)u0!vcB%G;1=mE8LFr>Y01|wo6vDGH$pRv9iy+E+9*5{m76;2 zS8FDswty1Z7VpO@7BZ#k=x$?+Nms>EFKoU3`+m>w*o1) zj2v96qKBFlk^NwE^M3v9@<-`S8{?v>LVDG}QPTt5a#C(BjER|KQ@LC#os+(*IT}7h;J#-}(cOwu9w4pAKdiuuwE>FX$u>T1}eB-lnnM_))FW_5W@J4%Jx0VO* z%K`^|vn}jQ>rEA4MCT9T4zNs20bi9WB{9+Jek#iNozmNcj*$!YDdqbrt{gO)?UC^~ zMpRWRkfYj9UmXBm32c2QxsBZmW_~!uj~d#2v5QuuiKDm- zHyk%VmlybGy2Ui_jxseAom97{qS^0J#d2E@n#9k!Yr0?RgN%snEkde+&UtD3g645)>fR(m#=#hlC;I^1WWsI7{ZK| z0zzE>VvVo6AfGI49`sgg(xfzy%&na2BOisC{2tMJX7v9hjPXfgFy^fZLTGt*!bHT~VPgHqXCFf!l7I$VAxlj&Tj zQ}+R7^m{LJ%a!)y(WAz0VLs(Td1YNxc0KAmDREJM(FWRTG8=6_9wn!Jr`xtiChI5q z(W6Jl8^k=Wm}q$4wwca0Fp_#r9w?R_8DfD%Q&B-W$W=HXwf9i{QO_9CQQ{iky-*KI zL-amJW2rL7tE!CcF56m;K7cCp-Cy(2kz9@Pm9SkeP=KMH+xCmx^Lww&cD9I3EAEQv?628C>tB3(eZa1w^=`-gD`K7A~KUW-3 zD(#kd7)fl{{&y8&O{!)A)6KlsTj(LX8;wPDPJQ!#g6pr0ypVI5d>I=Rz?B2t?oPUk zHH4$T~7)5HckIaLqlejs`8 ztSY%ZxrCw7mopw4_itJI+0I}n(v0^0eT3+DpEqydTZew^U|7PM zQ!CeS2xQU}I@^X8HN0TDTJp`a4B%G^q1QJU8ts7)*L@bLf0yPnUKxCl>9=7y1Ov@X=l#k$w7WG~Z=c9z&w0+PLO6H-tY|Eg()JgKjp5VFNC-8E$M zDUmV|#`L#=_hN!FgTRbKTZ{L0rA_GMi!!9*mdp%cd|s&x$zGtKVqlX z_&LP4PB*A54v1R*7yat&Pc!KfY!xob7pxnt;X8)Zc z`V0?zT-3a{^7&I%%^3W5yF2#QjLYf&1SfXefQ z4r%he;4q7ScMsbd?s#-QyKzuK-kfx<@Csuw7W0lJM`L+j+!25m3(&2L#}@S#cX$tr zjpf$<?=(hWr%*ER?C~J2|sMG)e4JK9kWce=3c8 z8J?p)5%)GvE(g4t+>F|98<%(yvNlY;C>y3RJG}ED!p>PyccWK4e?F|Co|9lVbEy~e z^k1R<*Zm<#J27hY??wVUcD|F$P|#u|Zcx&b_kvg3euhch)CL7GjzX$$fHibwzu&l} z8HHDVQ_}e8+@zSjgQl!^AD_qE<9jZyBnk9SwH4e}FqzL*#N1ADV{WsU1F^Xz&ui}J zCmX9Pmk~bt$4@Imt)aeM5xWW*R$}IWf8dm#K&P@iexuWV@w*p(})~)_6!astg#WWAq1$r<0JGQPOrV_ z0iNG^2YRg<)!lW?2FOy5rPMI0zkf3h7Q$nek{7O65s(i%zu6jMUf1O3uX8A{jc6H% z`7CJr7VB=?h{g!p4**7}1KTeZcp#xnCgYdvCI#pd)3$KTo*_(4t`z{zkSju|CZw{L z95&bf_}B^Bb~Bd3Sk!|PA7Z|H!`gIiUy<Ch;CeX_E7EZ_d%M%uoB*rRZzfD=W1w_TaC)OQ_cO? zwTA0Y*rW=VFG{md`ukM_ZiHYTJ25tNWo>S1YKjb$1CVM`2j>AY6)7&}8%8dLnl>ER z1i0;risu$OrC+cEQ;Yg()&K6r+<%;N&_t9$QU`D)TVJ4g_msQ=za!`=k2;nHF97m9 z@o6-9_D0|9fy;bxU`}gr&71mn>miYmf}o%REEMwDQzkr25Xszg)cj@?Bq;~9@&N3^ zaB1l^4b#NFgZf@l(Qkf>q&#UGU0WOKC)~JOh(45`0IKGr;!dMVZrw^+pYOf5zTorj!ar71%F8gH#M83x9Bp6S2kGzksL95_Cx? z$`@jcAj-V#qdV`2oz4P)@O5QHaPS!f-9vhAe#5Wzu>7X*<0@@WTxWX zRfvbGywfvL<6)Dw*tUD8ac3m{IAT9p4!TY)ZSzZtc>Z^wX_-(+yO+ned=gu*{4(ap z*}t0yZsPDZ9mNT0H%R^X(RH@i;J<64IkDWHfo3`a!FlwHR6w@Ym9O&`xb+OzjQJ2I zR4L`GLQ(!)hzEq%&35|!qnv&FO!kkdyYLzgrD=Sc{M2F>Aq5XFa)zbl2Foww0glV< zo8z67E{A}wrJ(a(?Twd#$L)ubR}ozI3zMR^a!0|z+lA!|J@>^d(=G9VtCFo?r((fp zYy5oSDshLr*JtUq^=m=P%#9|dR;YPpiD3)>>N%jn&vTiy^XwGwSl2TwCNqsVs{PCVNYbKf?k;OTHMPjET;6}nTf;qJedx}fzsh>ZEw5(Rdm)#BD^zSdDBrCa6}j9cG4qPU&TonCvN>;X07EEPj3eUVJg=H z4-kT-INqYcLwsM6%0>U_K|YmcuVpFGNtyics}}+WDvk&5J7wwoxoEtmjd&`;8Z3!S zC~UB-#2Chhq4H(`$nRO5BJbp97*HD-{_rFiMJ6Dpl_XXbJ12yk}!7xJOLWZ?2`GP%`@fKv#dK2 jzvpmEmmWWHvQ&RNI>jOWNWS#ncOYPA zN}|^po#-ZdnP=|z)B6WJ-=6!^IcKlm*=y~!ueGmrofB_lpvOqZO$PvAysm%E7yt<6 z76Q&tQ!X}spIrZadT6Yt4N7}>mjU3JyMFD8X|UZ|CjDz+osc$iz{aXn66eLo?yoOk zE=6%hxuc2WoQa=4$si=Wkmvu|&PtoV-N$BnZlVSzuFDjKhkiq}Y#Zgy94!gTdR%C| z*otmN-AcR@|LNS9)rro7vjM}7nd_&ac}G)fW@Od2**~Thgv0Pba%t&C(Pv)MYe=eB z!o*i=HL6n3e*i6-8gu62EhO|s+16kH^9$h4@C4aRbrI0=*xPbIXwj|c|IGgv(o(N* zDhI@YJlG`kLN<%QI?ZP8W`7mf*8+(8lY-hui4;)Omx~GPi=byAi6EFA9e55p_L#g2 zsKEpyu^z0$kg`OA>9y?h(DUdUGH*Q|pCwO$Qh>4yUOFJVuxb7cJ0h@^zCY)#Xhc^d z=0?e?f23C(1V0X`14yn@)~IgK1KmuSB#+iQCsK7X;5m;7Ynpr@8%}h2TDO%3O7Gs| zskNcHQIC1-xkWVuv#i{AbseTLpg{$|9~8ttrgf+8)0h>25uLyzGyg6h7$rv#rpPP7Tc#@_dvhZHkq0qdNh zhCl$inZWHG1VP{Qbho%Ifd*$xG7xtmr65b)XB?=rE27V+BksY)NH?qbQtvlQ(QInD zNSWF)r{1Kz^=%6u7I_2-K8x03P=S(+qqkB5{ooBk7uiF;25H#`J;$J_vT^2fFhfC3 zhJuD_ef@M96Pe`LZNg7-TQNRtUjUR*7}cUK&tsW8Z+-kqWSN-7ry($(DuaEbngR&Dd+DBWyvXYsk*dqhc5P8OwVd_ zR-S#f&v?6u+e zhU9s7-EV?hxh~nXUTICXN$QEYhL*G2Q{D{N21dL=UhHhqcV-<~Vl%4QGd%t)b6rWgmR;2g?J)b&(3I#qd2|E8WoFQY+YQO^_F6WB1q=o zOCJ*46#rn|Ab+T!zK<5~=U@418&T>=w+oz8h_MF!f~Z1D;(V)VL+xerZ{ZX7N46x`dr+lSalrFNX&_CSxgzl&{X94Tk`$IWr`qVZbHQ83bfx^+`Y3PN)E0kHN&j|gh zHhQ!CIjiA!W8q}$m@DjP1%and@dOCOzV^3xmL$!VaJ9uk0?no%=*3lL_)8j)Lu45H z+kF_>|9H`uOW>PZTa}u}XobobB-8Ik^l}kvU0I|pB+!h0PvHBto(?<2wC6mIUpl7* zH)A|y#ePslP@y5F=(tn{QzQ_hIdwjkc? zGL%Xd?^8!uy#RR4rmUdKvbuOa!P@5_gZwc1D)$Gc_ z#~St?kSB61*-icY7dJXnQUiiOq;jv8h`*3Rh!B=^FDTXfCVH>li>_)BvrqPfs7KFC zKL;}G#Mh`B&$gi>=)fwcZKI^#Ia|5O?UWFr{9;+I6T}O3Ri^K6-zR6?k9FI%IqtW{ z`4&rl^g6W;kOR6Mx79gjVjLxN5%iz?g~2+3zFIjOB<=En=^aDDw%IOMlXP?*ROh)jwCpu1#SNzc?9N1IsSq(n$8RsV) zXR^HCWw?)D$}Do$?c-`JQiI~jr;=dr@mf!qp-xhm{@+yPxF42tRhrCdG4{+ z&q`mN-1tRtcD(E1=n1giJdk{lfm*eC?p;*etR&KSAM5E^V=B2`L`Ew2)DOfwE&eGq z8%TpvK(}~UrZ_vCP#Bow$z#H! zm^OuO5xcwqFrF*RLr?T2B({xo-q9O2Gasb^O5bFzyAQ@-Ll|~v-0X1lZR$D>ENG5_ zO$JnM-}=d>!#t**3*@71KCGHe^JG0m`p`yWo@&SVoYZLT&RQI>XNTcnOLfnR^tLTO~`K2|Yo)N^8YCK2DE>I_NZajm>=wpK9}=H9Ne4T-9B zx$0?(jTZC6&9R8k^n~Y0(j*?P?}4UTbU@?$L^A%C+R@Woy|BxK(@^zLGD?Q&1q_;{LOY)8j5srK5klUvBp-Q?T!_-YtDm*zkKII?od+s_MP{E zxH_uv;RvNXs$|ty=)9amQ6DIX-^>~Cs#5E*Ua@cKB6>b`cP>xacG=HNfTN{r8S8`F zt74jbltsiH%ya5P{}M@E8R88-Ojk5){#yUFj`Y?OwLUeau_5wi2|~&=&I(H7^WHND znKrTczu9{7O|0>y8t&L`WIMcQ&0^TNhzUXrCJfw!WS1+?yPa#pX!u|8^N|lfOac4( zVuZtoam}%Bwd$5pRxOTNl&au=HChKAgazubwDI}Y<`Ptkc(r{zgE1rAxZ#-vF6yw7 za(mniE-b=uy88*CIr-BSCpR>vCEnRh%s74}E0QQCF0 ziE319{AGP&_s{_gfFDmq7ON9|4!8J!j19!N!B}Q z{tI;pu&8}nlnKraWXjLonm^_SYJ2XTy>XeMhZ(#~yPy1PwFvsv%XE#ifw1ZT3R}7h z_U#rwwnT3P#|1GYDYrhp_r@*u#UyU@u9WRc7f|k63Y;c2_c}>k+cv4`Y<43ic+-LK z1NGR%b&ZCdBLDlAO`BKpw}15`adi1XmGwKglRL>Q5iN2x(2}ZVF9|%0;yX@mUyena zcHG=`!Sa%tlk;qkrs-C%LASx(_5OlGD;Mn-$%WqXPcJJe$ULM^R#GpC?XmRgDBz`G z2}j(#Wf(lT`CjOl5I}g?0FhCfq*dFmE*#&9!)hgjK&ZKub+KUAP5wJ{ zLQ(!t!pzo+KU|JAWrhBu!Bpj*pXY7O{Z$&14pPnZ*T&Kv+1A?CJBuytOnoJ-gFANc z9n{MtlZaRrQi)-Z{TkuODi-T?@Rp?fLq%d^G|3YGX?0#$m0<*l(^qK>S*9wUr_10#{_!o@-MVu`leX}L#3m!X(kbKHTt9y$<4z|8R20^GuQ@9o zZ!c3wMvlM|Da}le*O@mQxqG{T-99nVQ@Q33O|r?`6A0?Zu9bp;{kDXD<$^VKG_(d2 z*I(5TJZ+G4Bs7Nq*e$YqM*_Vj$WRWj5v#t%s_R~DEZ$!_-#Z#1yv&8M;4J-oeyfHV zEf{yavBd+ayXdu0P`D=7I%iE5h51#y_rhaz-3Fs?6sf4wXAuT}$%` zZdeYnk&mR=Q{9^sQVd8V(2AEuWXBJC3YN8hFg(`aJ->}6RlB2p`ntKAJL(qU;-c?* zJ=smJxE* z4lSVOutxm!O@7hCThPtH!Y-REyi$~Sjr;>d8YzX7KOjXNQh zFdoM;ZRx2)zH!ua9GA5iq23~8i*hI~xU#hUVZj?z8`@xY1tzcxYVpV#eM1hS*JaY? z@A|gC*Rb?k9SnCbJq+iw44#nXIC^_)RC#?^ftRyl>S^UG;gX%}MUmUSL2Mot|tzTC$%X5F?q~3vK?q%fF}^ zXUj(KfCx&3OlX>h>EZ?A>OfU&f5DG3!XC=-N7b)H9Vnj0lLPbvrZdy=I>Y`f;wNb* z+mpRYs(T+EGK(RSPUh}Le(;>JWsF-CW5+9+x>ELh^Kx)8FZaW<^ENw9QWaqTwsqI_ z0VgVq1!S01# zmdoFvVQ_@9%aTOfWiRuCN#ab-xes>x-Mzt)4X>p-JMX6o1NEFI4cfZ>J088K#_|`G zxKFMtM~6=lB9D$vq^$Ydp22SOmc}5{1z4l?Ux4t8!=coFi(1~ZS2wL}Z362qf&*S9l@4!$_) zF4s*!=Di!fdXSpjZ23gI=W71qs^e|xVwuQ zRqO;=71`l!=O1QFQlUP&#}<*dJ<(dXdSy3VD)U{~CKpRf7{{%^7Q;KbE$r)hQ%+-gSc%8-qaje6E4$qON>G{2;(~y8Xol*drHmsT zOA6{&Z`i5nTOji#$;zn4Z=}e%W;Hjr(L*j|F18LUKe(;#`}T6N{5QF=((k_0vb9h( zQ8QoF-fSgy%_ViFXKe!{%pyZJNl9pM70F-w)jT%$Wm>H@ManS0vO&(XdQHjI3}IKe zmB&?9b1VVR$TLB<72%ZvjF=uD z5y}7T$8C18K&a`xb;Dqpl~)C{S`0}yxf#{1DT<}+m}*2W`WtRMu}P>WpmDA@tDg>+ zOVVGneIS`q_`_YbA)schI=w8 zjum%%KY9#*t$*5qLdCjWUJ~fG6dwF_y=Th0k*;j5wIp|(>hr$~U(+LY>SFY*;|@QV zXMsMpb{yv{*=&{S(mNko@p6(~z{=yuF@QQj!afgbXESHLAuu6i z_}A|SI1XIy{e17;`lTB$fy{?D@9~uNWt7UYqc3M7x(2EnT^!P?;MV0m{A}x6u;JGE zt3{K+JpsI*-5$?f7+UBWaK1Q0-(}O+8}L*c6T&~rA6~Zd8OznPH||x67csv~>45Jt znHu6!S}Ly!t^ds^TB^zuU7)t^`sg{y)AL0l+)>N!g(&bR|H7VlJg}8~pz10*qiyP% z#=EzYBAE3bB;BKx*=2m^O?xZK&~RF4o57n?QSKy!*J^KGX` zE%tqy6{)QA<3t;d-IcUm`Gzk>k*+NZ+iz2$BYL8n9qB1d<>pcQeu@$O4YnxBV|{8# zQ&%yHxBFLP&Wj=+QDZmx^_ZTic!zd~Ni*_%No^?o(_BGYJ^G}{?q&n4@E&o!kYnm*0R|PjZ5^ml5-r!4>xOte(mM*VTc<2nqblIqcIXW?;_s$A zIH^VLtUFEaKS|xsQi?clQ+hSvzYUd<)xR_8cV@P~mHq! literal 0 HcmV?d00001 diff --git a/plugins/woocommerce/assets/images/payment_methods/72x72/payoneer.png b/plugins/woocommerce/assets/images/payment_methods/72x72/payoneer.png new file mode 100644 index 0000000000000000000000000000000000000000..49df118b1c8db6e5e294cbcc757a6e6061f0d1b5 GIT binary patch literal 8194 zcmY*;1yEc~6YVZ8L4wQT1h?QUi@Qq*u0c200!zXsxVyUtcb5<}xCU7uK!Q622oeGW zdF21U_xAw0{{*z0RV7106-4Q{-gtW z+z7TcRI$_00B}5FEC4!?2!Q&CfR7IVNCo(-_J{zgKJ>*qUHntrnn3wnM+qXP#1$bQD z?RlSziHY&@@$>TYb3Zb;JrFK%D=%&r52pW${9he;TMuh@C=3pDb)o;OYxT<26E4BX z_&3qNU2# zPaX*G-{k*KG5_uKKiq@{~AnJ%9KS zWv581(lSrU-NN;Xya-^8MS;caZv;x>$7YY@K#5>a1fU1wsBxf+GNhn|%dw#>NJo;e zI6W5@Ci&>Jxwf1d%r#=Ik}6o}Y$rIjx;iGdd~(-%D%SAS9SVVJQ6H-5X;qR>zDQ$J;J5qm*-83-t%&? zuFX17z)MM7q5OFgB~0{G@A}pA_2a}NKTE3jRSo8yO;yE z#l`nl-8*oorQNyGUYawhWYqo_VcNiql4tlJs*9C5Zhrn=TbCR$fg=WDIkY{D)t-%+ z6a(mWm!e^c(4a9HJfNVgvU11|h<$~+C`+uF+nMP(wUzD&>v&0Jl$|rVKI=q_8Mk%% zvkP>8ID}#l7j{HUE2x*2n$CZ&R%S>)aX^!YVX2+9Txi6lteC+q(qAB0{wsY^E(#id zc+cdN-M8UvFy}T=gTvGA^|Ua^HW_S&B3tb6Qsdy@tlI0Rbk9v3Q{}5{r#ih!%LAvU zfACXazbC;zt6j5bds4Y+8=O3>0&r9;Li3ZHI*JR}t;-P>;j!HQiIHJ=!Q)8EhU|wC zAGjTagl)~5^*RjTeO7^E-sVATGXJGe@0BZYFgPl6wzoKif*{@6_5j*5Z33pQQzrH= zfk_uD^cqV-(8A@ICuP|avUlbm9x`8ImP?0IW}YO@1s z5tF8*GcURn=wUV2|J7%iSU}P0+A^Z(|CO@E8 zKlZ`7p)PL?V(eMhzPFKOkkcD0glkyfeukHiB;})p=6~pc7=`<rA{+EX(J{-nTlUfDL?Md2`+dHz57SlFG-gFC_Q6eBSCdZfvD4mAMBC zG*PE=K9P1N>ODL#v?3P8l*A((XJ03HXrkLsfkJQ0P0ge|s;CR(A1LWia6WLHU>HM0 zr=BN%VR1pMV>|6t5@tVnKh)ea{FInv)8Oiu?Ohq)VFc3WYWl_U)wmpDR*R551V}*r zNdk@pH*8h1gB|Ks1afwrE`DIojM(7$^Q@fLfX#2tI0oMeYwwM^33C!AXP+vdsHSe6 zm3ye~d_037diyj^Bw|=;tE`bNT%)^YqE0JR0aqMo)fm@SH-SLi6e3bl`O;RQ-Hl6f z+M!U|K)IwzzKJxTVwaL6lh&%N*y%!sr1y5c`S)9a%%@|*uJrU5OfyEDj?N63%rV$M zSOs718kS1maILD5TDm8aQkwt9Apg2N)zg3cM4TngJ*H>^k^cYQyyM%^pAK|XO)l0Vrs1~qnNV5^| z<^lPA9N2^Mq)xbMs3f9rd^8pB6;qj#YzZ6^8b64*}&+>d?@Ft$7>vT~1Lh9SGX6HnDZE-3pE7TH6r zHB$Z>#0tr~;~$+ztf+*YImvJ`X{e0P>m5QP3uT-_v3lgTpWJ(%GuF^#?bKwgIXHi| z~$m>BM+>+au ztbcuCQDe0!k3l`yzL1+O6qXHSA2QBn5R-diF%#64z~y^W{eogeTiPe$o~>7M<*7aj zYJ6-^L2%3PeDW$H+P|Z?Js{5IU8+Vorpk$9e(Q_^cvn2O_H*SiRZpxhK@cd(gCv`& zM&Z!FXq^;>r&5rby~UhSd7*}Gj2u?Lclq<0^03ve-s*jv+svR9E;Ak5go|VA<@)Rv z1pn?8wnU%N$K>Z&M-=Iw8PJpLxOCEoGP5lg%zBjO^W;i53uK~(ha>nV*Efke@QsmL zT2I#JeqU@hFwE59h!6P}9!zrg%NSpBP1@3Xyo$@M?P*{>?sotJ z4=iO%A-h->Q3Q^V!Iur6KlABOO##`znT#Ghj(@)G z%_j$ES_`isX3ZQY7^j>?A8CsbXT}kBb)=ljZ%5$-%&_!%3bz204pNn7dYPp@RW0`` z?~2+;jSvN|2HNL^gblQ)6k*d}<6<_xTyxcox2Id!8itG(sga~A**al9Gk(1(Db+jyT=$a*}@Rd+hMyrJF>)vf+y7ucr{*|n%Uw_{_2>V89Q?K8+)iEI3*Nc zEw->aLdEwxgtNh6^f$&@ADyI!JTXV_u4YYv?>}B zbw-OKv+fqAc{hR+3MLKAOvu7ahE8HBkd1@w2vuw9-OBg%SJB@v(&jhg(celBzH6}Y zu9*(0{X!0VT5n9x@?jw|1U8^>@A*Q<*9yYnp%| zYGehz+?1>q<@Y}|(9DOlS;oSS4r&KNj+s{yzbsAsd?zUqk^}LYxp4TRKB6~-6-ie? za!NlLH1Cd`kInt$2=_}q*R*8QR4t{ZgWK_e`fN%!tpWyR9ML+K7~uT~8Nvt5WaXTk{(14R)2y4} zvx*-NQsts>Qx@S6+z*GiFjXxsqE>UXZ>zYNZWoFs3XPjJu?EWJXCoS)WZpD^s`s%x>{k$crH$wSS;aaX>lmzGZ}or>#sjP`=df z28S&4CK&q5{R)$W&>dC#>+kyG?})G7E(cz;IM#Yi7rP6XsUU*%o<@R-Oo3>=HO+>o9<1z}O zTjDBHWCOR6cs9Mhnc2!IVv)Nl{qD0I`MS( zXOs+vJXA5bco`h?>=T8oMBK1CgTq$6@r5 zCC{JWKWnFzVMA&JxjC=%{4&M!8-KVBE+|cDyHy8c(eOLH+g%w#~F!Gb=NPbX}eE4>m7!7QgE3ZPYnvVaFVKwsh zDwc<*LNMztF9dFWM9;FHxK9#rD-_?3puT%1^&Dp95SkvE8cKCXz@oJjiASjbx)7Ci z(mJGHVeSc1v*p3D)j|mykLKL~ist+t)TOK8xm;UJCpGi0dwRX;-X9VfUrl6IPCFL; zu+Hu~3CN^wfqA(Np54W9=ELWUwYuID@blPDcro?^X2PcprquQqT{pu@*v&1!oQ6ve zf!=71n-HUw@qP^v!H-^dDjZiRUXInyL_17LQaMyEc`1%xFk+MetxArBPZj2RksVX7 zgxj5zEh@F4D9;|%8f*&y2(F!Nrc5wNGoHM>&>>P3`g*Ht0IwMHQ zi3tHd3=Yzlp_U%qdM=SBji9Z}T|YLXHqBu%=A4PIbjPl%7YyzOEroVABjAqpq)D2l z8+FYlK@R%(ZmDjt4OgU;_F z<4;iqEJCSFRwsgrYPqv}8CD2~|MZRXbTp6crr`x%mL$;FAxrTZFRk2^XI;u>M{y!r zI$PZP>WmS}(9F3UiO>Tf*X`Uu-B*ynZle)2-q=E%lyl?Wb;keX~{Z zBi#6-hg~GDJebc~h7434$6*@basV2fu;%UUI(Tj#H*Mv`Z~9U9D2H72sXN~Fvwahq ze2@7rzM^5jKlt`xYA?dr!-Bsx&^9Kf5^VfPX@8LHTbgx#j%D(K%QL*(G6Cp-8oM`}4F%c{U5J5C#+?pAnz#~hH z}tQX`50Sz1EIa1E6!~_+W9?Elgj|jAwVCF_&`7> zb&f@AAv!d{GwA_UFcxr76p)J{>#P@yY;RfixBjJ)$=@B5g0j3W~~~28qtB)6NKjb;~Ur)+YySD%OGLRH5oTZ? z)w-{LzjX*S#4zDblIFMHLq`Y6wf7^XGSDuV?RSO5KTS11 zNG9K(=KK_PM>OnG=^>9mMt`ao z@1g9bzq;>PybSIoE0*Ot-kQn8{2AsDDZ_hb&N@c7f7%#pz?Cm}$9dtK48T9Xk)&y4 z$#bYX>krX2f08fA_*_SFnVvV%-mS`L@Yy2Ickt<(szO9so0SkfWgc_o8EfJgabb)Up1M%R#rCdf|mv%lGFAhSY;N%#NV%a9NfUnNu1b zlJGwBcoIk-#WlA!(Fnitx_H6L;)@5L{sljPx`SiN3VA!Fmtkv|J5h@Vnh&=9$-OH0^c z)>P-O?cr$k{6tO|o}og>>S@Jya*VZ~hq0Re+U#!_MBbyxS-hvtwm%LV0++pZC}*nH zjJ{e+PrpyM1TsP4;l&@=4yI#C&BTMf%&lBDO@-t>IcXpKEXm)6y~%g9 zVZ{l`n*Kq{On*Cp&Rr|}se)2>{*{f;EoFoc7QW_@(pT>8u<=>nkA)ZFDIU&i6oS#Q zks%0OQG{p8%o-PfJx7D&9XXaZjzUWdyFK%*=<2Vy_*CPHV z)eU^abT94W(8lgIrmMo`*jMBe5f~+(YF;0;ozu6_H_y05echy=r8cx$X2y}%X7dYe z3yuT@;T)bjx*fLBy>h=N;bD(;^NLO<2Ka<*Lw2*8n^|J~(t2ipDI>%Tb+KU*LK0{} z9&s5F7pRu!S3T);Xt*S(gg|Rk`uAG~VyA4QQa5}Z?NVc&_#)+?&<=%x%Q>T?9yH@b z1!KN8Z2zSULwF%bmTH@00O@F&NY^JZSL${+>qkF%vf39SMDc@ySzEzc=&}ThMkGY2 zN89RdO2jKuuWp3D6FvV7mCu;IUdAY@9yB8==8IMIX4^x{dgpVk|Hr4WsIN4ieP28K+gn|CumYVwaarH>#DqpRl^y|#Qee13Cw5?V(n?D`cGSuGa5aw2hc;&>VQhC%kNhFK$cpLl1w{l3IDh9u9VkjoU=zWwi61Pl=4Xv$W=BX#!`acBvg1+}gP517@J}M5U}D<+774GlF!4l-wqMvV6uy z(ahBGggI!cRu(=|G|!mea<#_@yf>Gov7QnpQ=Fxypbf3ACGYBbQj5AUKg2Ar6O4h zGxU5Lh3@i}L3G98S=|hX;#?l$p3~jd?ELZSuo5(0pz?BOIWf%d%;!sW$KFRa5;h*1 zGV{#FT6Mi6+ig=O`Dg~2*xTvXXNyJdo-KsTZ$0g~Y(d&E7^x46N`Lra^>~a0=#(ub znugC;;@O;(8|hOPLIr;|A=dgQ_l1>unk3xXa)})9ZeqYW;gv>Vq)oA-GdKL-w_dk1 zGMj1s;(lD1_j)z3?*g#CFefz=nm=rT*Mso=gX<0X4m-_f;&6t5U6~S-@jbYAl+*d#^8L(ID zSM1N&4zFBauJ!gA#@*+c9h7|JJ6N2P1qF-#a-S>ooT=t5S2xAyG=T6rh~-#lFWqY< z=@{~@3g(}@qD#g$=`GtE*BFIfmD;tmdIyN@=fvwtu9T#3=8_Ahec@$u_AA|UI5u7M d-VJ&{^~vyoGlf5K|NCcKML|=(M%FU${{VMBHzfc7 literal 0 HcmV?d00001 diff --git a/plugins/woocommerce/assets/images/payment_methods/72x72/zipco.png b/plugins/woocommerce/assets/images/payment_methods/72x72/zipco.png new file mode 100644 index 0000000000000000000000000000000000000000..00867047ef99e2475a094c10d07a083f4a157947 GIT binary patch literal 2730 zcmaJ@c|4SB8-B-HV@Y-iFWI*lWXc%B$Tl<@vKGVGry2W*BxFhFL|I05Av)pMvL#NT zMM}sLK1+>b$yg656n!(**ZG#;?|a_g^WN8UKi7TT_x-$oJnt`fYjZy6At(R1DF5KF z0YDN7;P}Bg!?diyDvuTO-Le-!{#Gnv`^mN_V*eYn!aRA@mY8OLkcD$70PqO0CIraM z7iX$DlkA+RPPmgu&p>}oqF11Yw`PQY5Gx8mMIf2b-f z7%Ta|74yB*Z(e4rXebKy^VrZ(2?Cv)`SI1TCK$U2$a0P=#l>8tYktc0Vm&{089_Rf zxRG)^p4*~u7eM1hhjB}QdN(jW?aS8VL9APg&B|WUWpSUJ*ru@Kr;OnOvpvx}MGL-1!Oh%|4!ln{*?@Y#0u&b%dTIp=DpDdwGMq zRHk+lwP zJK6aP>YG_I;~U+9EBZl;2E*~=uEhBk`@%4LPwRm2j{eh{h1t+0jo~W3CZgz$W5FZe zluSzxY1+s(LWFBwq+l*Xej&_hy1TMXV(!y^b@7kc0*JJzsTZXU^I|t)8A&vTYq)*1 zb2-Pgj01|T@lR4rZQ4xEwivo33yIlfEwU%Vli9_d?aXYJpFPppuMj-pS05!nF5qr!gZhQp z#D(9=D9Gz2sM%Xj-LPK|9z(B8*aba0F0mZ) zSJu%zEWNd}Ay&!s_w@t-Q2V-fNsO@G&wv|8dNgYQh)f&CEZ~$P~u_A%7Pd_KyHS(iy z(;9?0G4BX&5u3ZzHoJnHOpNcf5GTI9z-MmuhHuQ)Z3;ZknyqYYA&^-wPw3<@e6+J~ z;7O+W!yOPp-zZwv;393$MZ9E?6QXh~y~$0{pKz7WLr!#tflX=qZ0YS7#!%`uez5ol zXu*w~PyOJpl68#oTDU$B!QV@WDj0M4rD{WExKMNr!APa~mVJqp7K*5~Br~uI(ZMQvbIW({hQ~xMUCd}zd|V`G0gc;X1Nf&z1|h-cFDlfMW^Gm#%9af`Tg|xIRDx)#1*#cChmmu_spf- z+nm=|wjFh&ZH^;!b!Yjn8?Y1WtRFbGbetKeVDQVUZnk(BKwDf24@*B>e)=dM-Kp^e zLne4EROLj=CE$8^K7O^@YHH{6={%Qaqg|UQ%f*$+!P7#Vl@XIZ*n>+UDn5DKf1+nf z@vu<8$P%hq-_?tDUo6b$%Wr+<6-Uyl)x8F$Mu22b2*8iblAR;DGc2V@-(%>z4M?EhxC2Nt&~_ey5@%DJk6NB?w3L1E*a8m zc3Z)f>Cf+1RTD;4h^_r6`>!%iu5V;?-I0njO-(V?Zz_B&F2t1`-1d8n;zXXV2iyx( z?(l4{Nxal)3R#t#0Q>_jW;A`0tEyvecjdjP>mN#&pS(|@6nP>m{f9#ITZXBc(* zWqH1`lrN)oap1drnx0bT-!A1SkqHERy=mxlj&vsW1H%N$? zl~hc~szSJA4F#@4R|UYAy<*;{>!LrEf5=|5CYp$gP8G7xrcJhX1>zYutpaQsG*pLD ztM{kRVv@1Flc?j=Yta$UU+_taFoNz`-gQSu)^Pr#PH21-ZzL}z7)_p8!qc7UXW67| zdi7Odo>~x!3a8(01w)y|Tl!YWL_3Q|t&wvAn^Du*#30 z0x2j_tGqs+iah5Milje(+9{hPJh#^9?%kl8+G&UT(lEEqC&H?&cWA?%Iq?_Mn}^mz zJ{uJ`CMe0~zus7|f2$n+na>12@pj&FxBB_q1C97`!gHF3U$l_=4OjBzV!2T%(XGCh z(vVY7A}_s%6m4G0M~_S(+;U`s42B16k6M?@wFpWOOC>7M=1lYONzLxY)z2 zGH7caX_9X;txh0I2gjRBhvq=RwZf!CZjM6Ep;^v>b8Lk%dSrOI=aH*H&cYFX#j%)4 zi>CIOn;SZh-m065QP1@#@+B=NM!#_wk>hz<6#J<)JSA#o)>G-uTAa;4IFjWP!RVen zoS#y1T`C7M(%;#w|Nd`IT@#CvS5kqXw2 zBUY0>!qDqmBOnL;Fy_#2gg>{6lKtmgX&aqmWT*0DapE5uV!1n-R2-T-iT5t^Wc8NH z3XJ^eOE{~X-%m_9I2ox7Tks2*^5>6VgR0G7iw(OCiVgLN8Dpu{nAr=&Oy9dv2H3u@ zh}{?~!bsuR^&G;f{?eKe{YhK5!TiajQ2l|Z*8h9y{@0b 7, 'affirm' => 8, 'afterpay' => 9, + 'zipmoney' => 10, + 'payoneer-checkout' => 11, ); /** @@ -227,6 +229,9 @@ class DefaultPaymentGateways { 'is_visible' => array( self::get_rules_for_countries( array( + 'MX', + 'US', + 'CA', 'AT', 'BE', 'CH', @@ -241,12 +246,15 @@ class DefaultPaymentGateways { 'NO', 'PL', 'SE', + 'NZ', + 'AU', ) ), self::get_rules_for_cbd( false ), ), 'category_other' => array(), 'category_additional' => array( + 'MX', 'US', 'CA', 'AT', @@ -263,6 +271,8 @@ class DefaultPaymentGateways { 'NO', 'PL', 'SE', + 'NZ', + 'AU', ), ), array( @@ -318,6 +328,27 @@ class DefaultPaymentGateways { 'category_other' => array( 'ZA' ), 'category_additional' => array(), ), + array( + 'id' => 'payoneer-checkout', + 'title' => __( 'Payoneer Checkout', 'woocommerce' ), + 'content' => __( 'Payoneer Checkout is the next generation of payment processing platforms, giving merchants around the world the solutions and direction they need to succeed in today’s hyper-competitive global market.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/payoneer.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/payoneer.png', + 'plugins' => array( 'payoneer-checkout' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'HK', + 'CN', + ) + ), + ), + 'category_other' => array(), + 'category_additional' => array( + 'HK', + 'CN', + ), + ), array( 'id' => 'paystack', 'title' => __( 'Paystack', 'woocommerce' ), @@ -776,6 +807,29 @@ class DefaultPaymentGateways { ), ), ), + array( + 'id' => 'zipmoney', + 'title' => __( 'Zip Co - Buy Now, Pay Later', 'woocommerce' ), + 'content' => __( 'Give your customers the power to pay later, interest free and watch your sales grow.', 'woocommerce' ), + 'image' => WC_ADMIN_IMAGES_FOLDER_URL . '/onboarding/zipco.png', + 'image_72x72' => WC_ADMIN_IMAGES_FOLDER_URL . '/payment_methods/72x72/zipco.png', + 'plugins' => array( 'zipmoney-payments-woocommerce' ), + 'is_visible' => array( + self::get_rules_for_countries( + array( + 'US', + 'NZ', + 'AU', + ) + ), + ), + 'category_other' => array(), + 'category_additional' => array( + 'US', + 'NZ', + 'AU', + ), + ), ); foreach ( $payment_gateways as $index => $payment_gateway ) { From 9eeda1d8533fcab099c88032a05ea4f7604f62d3 Mon Sep 17 00:00:00 2001 From: Niels Lange Date: Tue, 28 Mar 2023 12:05:58 +0700 Subject: [PATCH 1265/1680] Move .wp-env.json.mustache to root folder --- .../js/extend-cart-checkout-block => }/.wp-env.json.mustache | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename packages/js/extend-cart-checkout-block/{packages/js/extend-cart-checkout-block => }/.wp-env.json.mustache (100%) diff --git a/packages/js/extend-cart-checkout-block/packages/js/extend-cart-checkout-block/.wp-env.json.mustache b/packages/js/extend-cart-checkout-block/.wp-env.json.mustache similarity index 100% rename from packages/js/extend-cart-checkout-block/packages/js/extend-cart-checkout-block/.wp-env.json.mustache rename to packages/js/extend-cart-checkout-block/.wp-env.json.mustache From cdeb32baa13acf93934c8d417bab942067d2c238 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Tue, 28 Mar 2023 14:18:25 +0800 Subject: [PATCH 1266/1680] Add `country` query param to payment suggestion data sources (#37443) * Add country query param to payment gateway data sources * Add changelog * Fix lint --- .../add-country-code-remote-payment-suggestion | 4 ++++ .../PaymentGatewaySuggestionsDataSourcePoller.php | 15 ++++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/add-country-code-remote-payment-suggestion diff --git a/plugins/woocommerce/changelog/add-country-code-remote-payment-suggestion b/plugins/woocommerce/changelog/add-country-code-remote-payment-suggestion new file mode 100644 index 00000000000..5cf797795b3 --- /dev/null +++ b/plugins/woocommerce/changelog/add-country-code-remote-payment-suggestion @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Add country query param to payment gateway data sources diff --git a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/PaymentGatewaySuggestionsDataSourcePoller.php b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/PaymentGatewaySuggestionsDataSourcePoller.php index 285f3ac76ef..7d1b87d5a40 100644 --- a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/PaymentGatewaySuggestionsDataSourcePoller.php +++ b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/PaymentGatewaySuggestionsDataSourcePoller.php @@ -33,7 +33,20 @@ class PaymentGatewaySuggestionsDataSourcePoller extends DataSourcePoller { */ public static function get_instance() { if ( ! self::$instance ) { - self::$instance = new self( self::ID, self::DATA_SOURCES ); + // Add country query param to data sources. + $base_location = wc_get_base_location(); + $data_sources = array_map( + function( $url ) use ( $base_location ) { + return add_query_arg( + 'country', + $base_location['country'], + $url + ); + }, + self::DATA_SOURCES + ); + + self::$instance = new self( self::ID, $data_sources ); } return self::$instance; } From bc42b853d83c8d5b29f8a340a6774c46cabea3cc Mon Sep 17 00:00:00 2001 From: louwie17 Date: Tue, 28 Mar 2023 04:15:17 -0300 Subject: [PATCH 1267/1680] Update product editor interpolate components (#37453) * Remove use cases of `interpolateComponents` * Remove from package json * Add changelog --- ...7312_product_editor_interpolate_components | 4 ++++ packages/js/product-editor/package.json | 3 +-- .../create-category-modal.tsx | 20 ++++++++-------- .../details-feature-field.tsx | 19 ++++++++------- .../components/details-name-block/edit.tsx | 13 +++++------ .../details-name-field/details-name-field.tsx | 17 ++++++++------ .../edit-product-link-modal.tsx | 17 ++++++++------ .../src/components/pricing-block/edit.tsx | 23 ++++++++++--------- pnpm-lock.yaml | 16 ++++++------- 9 files changed, 71 insertions(+), 61 deletions(-) create mode 100644 packages/js/product-editor/changelog/update-37312_product_editor_interpolate_components diff --git a/packages/js/product-editor/changelog/update-37312_product_editor_interpolate_components b/packages/js/product-editor/changelog/update-37312_product_editor_interpolate_components new file mode 100644 index 00000000000..6ad5335447e --- /dev/null +++ b/packages/js/product-editor/changelog/update-37312_product_editor_interpolate_components @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Remove use of @automattic/interpolate-components using createInterpolateElement instead. diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index 90056bb980a..d124e742dba 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -28,7 +28,6 @@ "access": "public" }, "dependencies": { - "@automattic/interpolate-components": "^1.2.0", "@types/lodash": "^4.14.179", "@types/wordpress__blocks": "^11.0.7", "@woocommerce/admin-layout": "workspace:*", @@ -79,8 +78,8 @@ "@types/wordpress__media-utils": "^3.0.0", "@types/wordpress__plugins": "^3.0.0", "@woocommerce/eslint-plugin": "workspace:*", - "@woocommerce/internal-style-build": "workspace:*", "@woocommerce/internal-js-tests": "workspace:*", + "@woocommerce/internal-style-build": "workspace:*", "@wordpress/block-editor": "^9.8.0", "@wordpress/browserslist-config": "wp-6.0", "concurrently": "^7.0.0", diff --git a/packages/js/product-editor/src/components/details-categories-field/create-category-modal.tsx b/packages/js/product-editor/src/components/details-categories-field/create-category-modal.tsx index 950fae6623b..6faebdd826a 100644 --- a/packages/js/product-editor/src/components/details-categories-field/create-category-modal.tsx +++ b/packages/js/product-editor/src/components/details-categories-field/create-category-modal.tsx @@ -2,10 +2,13 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; -import interpolateComponents from '@automattic/interpolate-components'; import { Button, Modal, Spinner, TextControl } from '@wordpress/components'; import { useDebounce } from '@wordpress/compose'; -import { useState, createElement } from '@wordpress/element'; +import { + useState, + createElement, + createInterpolateElement, +} from '@wordpress/element'; import { useDispatch } from '@wordpress/data'; import { __experimentalSelectControl as SelectControl, @@ -93,19 +96,16 @@ export const CreateCategoryModal: React.FC< CreateCategoryModalProps > = ( { /> > items={ categoriesSelectList } - label={ interpolateComponents( { - mixedString: __( - 'Parent category {{optional/}}', - 'woocommerce' - ), - components: { + label={ createInterpolateElement( + __( 'Parent category ', 'woocommerce' ), + { optional: ( { __( '(optional)', 'woocommerce' ) } ), - }, - } ) } + } + ) } selected={ categoryParent } onSelect={ ( item ) => item && setCategoryParent( item ) } onRemove={ () => setCategoryParent( null ) } diff --git a/packages/js/product-editor/src/components/details-feature-field/details-feature-field.tsx b/packages/js/product-editor/src/components/details-feature-field/details-feature-field.tsx index 5d256f69ce1..1821c2e41f4 100644 --- a/packages/js/product-editor/src/components/details-feature-field/details-feature-field.tsx +++ b/packages/js/product-editor/src/components/details-feature-field/details-feature-field.tsx @@ -8,10 +8,13 @@ import { Link, __experimentalTooltip as Tooltip, } from '@woocommerce/components'; -import interpolateComponents from '@automattic/interpolate-components'; import { Product } from '@woocommerce/data'; import { recordEvent } from '@woocommerce/tracks'; -import { createElement, Fragment } from '@wordpress/element'; +import { + createElement, + Fragment, + createInterpolateElement, +} from '@wordpress/element'; /** * Internal dependencies @@ -28,12 +31,12 @@ export const DetailsFeatureField = () => { <> { __( 'Feature this product', 'woocommerce' ) } ', 'woocommerce' ), - components: { + { moreLink: ( { { __( 'Learn more', 'woocommerce' ) } ), - }, - } ) } + } + ) } /> } diff --git a/packages/js/product-editor/src/components/details-name-block/edit.tsx b/packages/js/product-editor/src/components/details-name-block/edit.tsx index 3c18544da4b..ea38e9a0703 100644 --- a/packages/js/product-editor/src/components/details-name-block/edit.tsx +++ b/packages/js/product-editor/src/components/details-name-block/edit.tsx @@ -2,8 +2,7 @@ * External dependencies */ import { __ } from '@wordpress/i18n'; -import { createElement } from '@wordpress/element'; -import interpolateComponents from '@automattic/interpolate-components'; +import { createElement, createInterpolateElement } from '@wordpress/element'; import { TextControl } from '@woocommerce/components'; import { useBlockProps } from '@wordpress/block-editor'; // eslint-disable-next-line @typescript-eslint/ban-ts-comment @@ -18,16 +17,16 @@ export function Edit() { return (
    ', 'woocommerce' ), + { required: ( { __( '(required)', 'woocommerce' ) } ), - }, - } ) } + } + ) } name={ 'woocommerce-product-name' } placeholder={ __( 'e.g. 12 oz Coffee Mug', 'woocommerce' ) } onChange={ setName } diff --git a/packages/js/product-editor/src/components/details-name-field/details-name-field.tsx b/packages/js/product-editor/src/components/details-name-field/details-name-field.tsx index 7099b2968da..498c1f016e6 100644 --- a/packages/js/product-editor/src/components/details-name-field/details-name-field.tsx +++ b/packages/js/product-editor/src/components/details-name-field/details-name-field.tsx @@ -6,13 +6,16 @@ import { useSelect } from '@wordpress/data'; import { __ } from '@wordpress/i18n'; import { cleanForSlug } from '@wordpress/url'; import { useFormContext } from '@woocommerce/components'; -import interpolateComponents from '@automattic/interpolate-components'; import { Product, PRODUCTS_STORE_NAME, WCDataSelector, } from '@woocommerce/data'; -import { useState, createElement } from '@wordpress/element'; +import { + useState, + createElement, + createInterpolateElement, +} from '@wordpress/element'; /** * Internal dependencies @@ -55,16 +58,16 @@ export const DetailsNameField = ( {} ) => { return (
    ', 'woocommerce' ), + { required: ( { __( '(required)', 'woocommerce' ) } ), - }, - } ) } + } + ) } name={ `${ PRODUCT_DETAILS_SLUG }-name` } placeholder={ __( 'e.g. 12 oz Coffee Mug', 'woocommerce' ) } { ...getInputProps( 'name', { diff --git a/packages/js/product-editor/src/components/edit-product-link-modal/edit-product-link-modal.tsx b/packages/js/product-editor/src/components/edit-product-link-modal/edit-product-link-modal.tsx index 602845c8720..fab86bce6f5 100644 --- a/packages/js/product-editor/src/components/edit-product-link-modal/edit-product-link-modal.tsx +++ b/packages/js/product-editor/src/components/edit-product-link-modal/edit-product-link-modal.tsx @@ -3,10 +3,13 @@ */ import { __ } from '@wordpress/i18n'; import { Button, Modal, TextControl } from '@wordpress/components'; -import { useState, createElement } from '@wordpress/element'; +import { + useState, + createElement, + createInterpolateElement, +} from '@wordpress/element'; import { useDispatch } from '@wordpress/data'; import { cleanForSlug } from '@wordpress/url'; -import interpolateComponents from '@automattic/interpolate-components'; import { Product } from '@woocommerce/data'; import { useFormContext } from '@woocommerce/components'; import { recordEvent } from '@woocommerce/tracks'; @@ -106,12 +109,12 @@ export const EditProductLinkModal: React.FC< EditProductLinkModalProps > = ( { value={ slug } onChange={ setSlug } hideLabelFromVision - help={ interpolateComponents( { - mixedString: __( 'Preview: {{link/}}', 'woocommerce' ), - components: { + help={ createInterpolateElement( + __( 'Preview: ', 'woocommerce' ), + { link: { newProductLinkLabel }, - }, - } ) } + } + ) } />
    - + Date: Tue, 28 Mar 2023 19:11:20 +0530 Subject: [PATCH 1271/1680] Applied standards. --- .../DataStores/Orders/OrdersTableSearchQuery.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableSearchQuery.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableSearchQuery.php index 2ae18e4345a..a64cbc7fdaf 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableSearchQuery.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableSearchQuery.php @@ -80,7 +80,7 @@ class OrdersTableSearchQuery { private function generate_where(): string { $where = ''; $possible_order_id = (string) absint( $this->query->get( 's' ) ); - $order_table = $this->query->get_table_name( 'orders' ); + $order_table = $this->query->get_table_name( 'orders' ); // Support the passing of an order ID as the search term. if ( (string) $this->query->get( 's' ) === $possible_order_id ) { @@ -107,10 +107,9 @@ class OrdersTableSearchQuery { * @return string The where clause for meta table. */ private function generate_where_for_meta_table(): string { - $meta_table = $this->query->get_table_name( 'meta' ); - $meta_fields = $this->get_meta_fields_to_be_searched(); - return -" + $meta_table = $this->query->get_table_name( 'meta' ); + $meta_fields = $this->get_meta_fields_to_be_searched(); + return " SELECT search_query_meta.order_id FROM $meta_table as search_query_meta WHERE search_query_meta.meta_key IN ( $meta_fields ) From a92c16d93d8820dec347d9c48d68230828ea9049 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Tue, 28 Mar 2023 09:50:15 -0400 Subject: [PATCH 1272/1680] Update style of product attributes tab empty state (#37429) * Update style of product attributes tab empty state * Update icon --- .../images/icons/global-attributes-icon.svg | 6 +-- .../update-product-attributes-empty-state | 4 ++ .../woocommerce/client/legacy/css/admin.scss | 41 +++++++++++-------- .../views/html-product-data-attributes.php | 26 ++++++------ 4 files changed, 45 insertions(+), 32 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-product-attributes-empty-state diff --git a/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg b/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg index bbb5d8122d7..7e567300f87 100644 --- a/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg +++ b/plugins/woocommerce/assets/images/icons/global-attributes-icon.svg @@ -1,8 +1,8 @@ - - + + - + diff --git a/plugins/woocommerce/changelog/update-product-attributes-empty-state b/plugins/woocommerce/changelog/update-product-attributes-empty-state new file mode 100644 index 00000000000..204f428b324 --- /dev/null +++ b/plugins/woocommerce/changelog/update-product-attributes-empty-state @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Update style of product attributes tab empty state. diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index d6f3bc4a92c..45cdcdd07b7 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -1020,29 +1020,36 @@ #product_attributes { .add-global-attribute-container { - box-sizing: border-box; display: flex; flex-direction: column; - justify-content: center; - align-items: center; - padding: 32px 0px; - gap: 24px; height: 360px; - @media screen and ( max-width: 782px ) { - button { - vertical-align: top; - } - } - p { - width: 90%; - max-width: 544px; - font-size: 14px; - line-height: 18px; - text-align: center; - } + &.hidden { display: none; } + + .message { + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 32px 0px; + gap: 24px; + flex: 1; + @media screen and ( max-width: 782px ) { + button { + vertical-align: top; + } + } + p { + width: 90%; + max-width: 544px; + font-size: 14px; + line-height: 18px; + text-align: center; + } + } } .toolbar-top { .button, diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php index 7b7915fdcbc..1858a0c3b45 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php @@ -22,20 +22,22 @@ $icon_url = WC_ADMIN_IMAGES_FOLDER_URL . '/icons/global-a
    - + Date: Tue, 28 Mar 2023 12:53:29 -0700 Subject: [PATCH 1279/1680] Changelog. --- plugins/woocommerce/changelog/fix-27518-payment-gateway-title | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-27518-payment-gateway-title diff --git a/plugins/woocommerce/changelog/fix-27518-payment-gateway-title b/plugins/woocommerce/changelog/fix-27518-payment-gateway-title new file mode 100644 index 00000000000..654ab0ba5dc --- /dev/null +++ b/plugins/woocommerce/changelog/fix-27518-payment-gateway-title @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Avoid over-aggressive escaping of the payment gateway title in the context of the checkout thank you page. From 59c977e5e933a4492fc248547b4b77dc951d16cc Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Tue, 28 Mar 2023 13:19:57 -0700 Subject: [PATCH 1280/1680] Bump template version. --- plugins/woocommerce/templates/order/order-details.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/templates/order/order-details.php b/plugins/woocommerce/templates/order/order-details.php index faed60d6a5c..667eac1ae07 100644 --- a/plugins/woocommerce/templates/order/order-details.php +++ b/plugins/woocommerce/templates/order/order-details.php @@ -12,7 +12,7 @@ * * @see https://docs.woocommerce.com/document/template-structure/ * @package WooCommerce\Templates - * @version 4.6.0 + * @version 7.7.0 */ use Automattic\WooCommerce\Internal\Utilities\HtmlSanitizer; From 49cde4cad6986f0e4b503de70bbb7cd727057104 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Tue, 28 Mar 2023 15:18:00 -0700 Subject: [PATCH 1281/1680] Content lock all blocks in the product editor (#37382) * Lock all blocks in the product editor to content only * Add changelog entry * Add content role to summary field to allow editing * Remove unused BlockControls --- packages/js/product-editor/changelog/fix-37209 | 4 ++++ .../src/components/details-name-block/block.json | 3 ++- .../src/components/details-summary-block/block.json | 4 ++++ .../product-editor/src/components/pricing-block/block.json | 3 ++- packages/js/product-editor/src/components/tab/block.json | 7 +++++-- packages/js/product-editor/src/components/tab/edit.tsx | 6 ++++-- packages/js/product-editor/src/components/tab/style.scss | 5 +++++ 7 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 packages/js/product-editor/changelog/fix-37209 diff --git a/packages/js/product-editor/changelog/fix-37209 b/packages/js/product-editor/changelog/fix-37209 new file mode 100644 index 00000000000..79a64266bd5 --- /dev/null +++ b/packages/js/product-editor/changelog/fix-37209 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Content lock all blocks in the product editor diff --git a/packages/js/product-editor/src/components/details-name-block/block.json b/packages/js/product-editor/src/components/details-name-block/block.json index 920e5956645..15db681d2a1 100644 --- a/packages/js/product-editor/src/components/details-name-block/block.json +++ b/packages/js/product-editor/src/components/details-name-block/block.json @@ -9,7 +9,8 @@ "textdomain": "default", "attributes": { "name": { - "type": "string" + "type": "string", + "__experimentalRole": "content" } }, "supports": { diff --git a/packages/js/product-editor/src/components/details-summary-block/block.json b/packages/js/product-editor/src/components/details-summary-block/block.json index 003cd6841e9..dd1fa7f8a89 100644 --- a/packages/js/product-editor/src/components/details-summary-block/block.json +++ b/packages/js/product-editor/src/components/details-summary-block/block.json @@ -17,6 +17,10 @@ }, "label": { "type": "string" + }, + "content": { + "type": "string", + "__experimentalRole": "content" } }, "supports": { diff --git a/packages/js/product-editor/src/components/pricing-block/block.json b/packages/js/product-editor/src/components/pricing-block/block.json index 9ca3884ba5f..90851b04cf9 100644 --- a/packages/js/product-editor/src/components/pricing-block/block.json +++ b/packages/js/product-editor/src/components/pricing-block/block.json @@ -9,7 +9,8 @@ "textdomain": "default", "attributes": { "name": { - "type": "string" + "type": "string", + "__experimentalRole": "content" }, "label": { "type": "string" diff --git a/packages/js/product-editor/src/components/tab/block.json b/packages/js/product-editor/src/components/tab/block.json index f9edf354676..67a35ed4972 100644 --- a/packages/js/product-editor/src/components/tab/block.json +++ b/packages/js/product-editor/src/components/tab/block.json @@ -21,7 +21,10 @@ "multiple": true, "reusable": false, "inserter": false, - "lock": false + "lock": false, + "__experimentalToolbar": false }, - "usesContext": [ "selectedTab" ] + "usesContext": [ "selectedTab" ], + "editorStyle": "file:./editor.css", + "templateLock": "contentOnly" } diff --git a/packages/js/product-editor/src/components/tab/edit.tsx b/packages/js/product-editor/src/components/tab/edit.tsx index 226dbd92ea8..2147a97578a 100644 --- a/packages/js/product-editor/src/components/tab/edit.tsx +++ b/packages/js/product-editor/src/components/tab/edit.tsx @@ -1,9 +1,9 @@ /** * External dependencies */ +import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; import classnames from 'classnames'; import { createElement } from '@wordpress/element'; -import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; import type { BlockAttributes } from '@wordpress/blocks'; /** @@ -39,7 +39,9 @@ export function Edit( { role="tabpanel" className={ classes } > - + { /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */ } + { /* @ts-ignore Content only template locking does exist for this property. */ } + ); diff --git a/packages/js/product-editor/src/components/tab/style.scss b/packages/js/product-editor/src/components/tab/style.scss index 867fff9ee9a..d82fc701dbd 100644 --- a/packages/js/product-editor/src/components/tab/style.scss +++ b/packages/js/product-editor/src/components/tab/style.scss @@ -2,4 +2,9 @@ &:not(.is-selected) { display: none; } +} + +// Remove the Gutenberg selected outline. +.wp-block-woocommerce-product-tab:after { + display: none; } \ No newline at end of file From 1f714e8ade3b1a65d5f744be4e02ef39c4469201 Mon Sep 17 00:00:00 2001 From: smallfishes Date: Tue, 28 Mar 2023 15:24:02 -0700 Subject: [PATCH 1282/1680] =?UTF-8?q?fixed=20bug=20where=20adjust=5Fdownlo?= =?UTF-8?q?ad=5Fpermissions=20was=20being=20scheduled=20on=20va=E2=80=A6?= =?UTF-8?q?=20(#34828)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fixed bug where adjust_download_permissions was being scheduled on variable products without downloadable variations * check if is null per code review comment and issue 35918 on GitHub * clean up changelog file * Trigger checks * Fix DownloadPermissionsAdjuster tests --------- Co-authored-by: smallfishes Co-authored-by: Jorge A. Torres --- .../changelog/fix-32316-download-adjuster | 4 ++++ .../Internal/DownloadPermissionsAdjuster.php | 13 +++++++++++ .../DownloadPermissionsAdjusterTest.php | 23 +++++++++++++++++-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-32316-download-adjuster diff --git a/plugins/woocommerce/changelog/fix-32316-download-adjuster b/plugins/woocommerce/changelog/fix-32316-download-adjuster new file mode 100644 index 00000000000..89f94aad1d5 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-32316-download-adjuster @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +fixed bug where adjust_download_permissions was being scheduled on variable products without downloadable variations diff --git a/plugins/woocommerce/src/Internal/DownloadPermissionsAdjuster.php b/plugins/woocommerce/src/Internal/DownloadPermissionsAdjuster.php index f2f3adb5949..dc489c745b6 100644 --- a/plugins/woocommerce/src/Internal/DownloadPermissionsAdjuster.php +++ b/plugins/woocommerce/src/Internal/DownloadPermissionsAdjuster.php @@ -44,6 +44,19 @@ class DownloadPermissionsAdjuster { return; } + $are_any_children_downloadable = false; + foreach ( $children_ids as $child_id ) { + $child = wc_get_product( $child_id ); + if ( $child && $child->is_downloadable() ) { + $are_any_children_downloadable = true; + break; + } + } + + if ( ! $product->is_downloadable() && ! $are_any_children_downloadable ) { + return; + } + $scheduled_action_args = array( $product->get_id() ); $already_scheduled_actions = diff --git a/plugins/woocommerce/tests/php/src/Internal/DownloadPermissionsAdjusterTest.php b/plugins/woocommerce/tests/php/src/Internal/DownloadPermissionsAdjusterTest.php index 7f31dd09a3a..65ac309d8f2 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DownloadPermissionsAdjusterTest.php +++ b/plugins/woocommerce/tests/php/src/Internal/DownloadPermissionsAdjusterTest.php @@ -102,7 +102,7 @@ class DownloadPermissionsAdjusterTest extends \WC_Unit_Test_Case { ) ); - $product = ProductHelper::create_variation_product(); + $product = $this->create_downloadable_variation_product(); $this->sut->maybe_schedule_adjust_download_permissions( $product ); $expected_get_scheduled_actions_args = array( @@ -135,7 +135,7 @@ class DownloadPermissionsAdjusterTest extends \WC_Unit_Test_Case { ) ); - $product = ProductHelper::create_variation_product(); + $product = $this->create_downloadable_variation_product(); $this->sut->maybe_schedule_adjust_download_permissions( $product ); $expected_get_scheduled_actions_args = array( @@ -168,6 +168,7 @@ class DownloadPermissionsAdjusterTest extends \WC_Unit_Test_Case { $parent_download_id = current( $product->get_downloads() )->get_id(); $child = wc_get_product( current( $product->get_children() ) ); + $child->set_downloadable( true ); $child->set_downloads( array( $download ) ); $child->save(); $child_download_id = current( $child->get_downloads() )->get_id(); @@ -222,6 +223,7 @@ class DownloadPermissionsAdjusterTest extends \WC_Unit_Test_Case { $parent_download_id = current( $product->get_downloads() )->get_id(); $child = wc_get_product( current( $product->get_children() ) ); + $child->set_downloadable( true ); $child->set_downloads( array( $download ) ); $child->save(); $child_download_id = current( $child->get_downloads() )->get_id(); @@ -278,6 +280,7 @@ class DownloadPermissionsAdjusterTest extends \WC_Unit_Test_Case { $parent_download_id = current( $product->get_downloads() )->get_id(); $child = wc_get_product( current( $product->get_children() ) ); + $child->set_downloadable( true ); $child->set_downloads( array( $download ) ); $child->save(); $child_download_id = current( $child->get_downloads() )->get_id(); @@ -359,4 +362,20 @@ class DownloadPermissionsAdjusterTest extends \WC_Unit_Test_Case { return $data_store; } + + /** + * Creates a variable product with a downloadable variation. No downloads are added. + * + * @return \WC_Product A product. + */ + private function create_downloadable_variation_product() { + $product = ProductHelper::create_variation_product(); + + $child = wc_get_product( current( $product->get_children() ) ); + $child->set_downloadable( true ); + $child->save(); + + return $product; + } + } From 19a119f0a83c68ce8cac794935d3aa05aad5156d Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Wed, 29 Mar 2023 17:18:43 +0800 Subject: [PATCH 1283/1680] Upstream changes from experimental-select-control back to @woocommerce/components (#36521) * Add scrollIntoViewOnOpen and position props to menu * Add ability to customize active item style * Add menu toggle button * Add changelog * Fix changelog * Rename toggle button classname * Change default menu position * Update toggle button story * Add default value to getToggleButtonProps --- .../update-experimental-select-control | 4 +++ .../combo-box.scss | 15 +++++++++++ .../experimental-select-control/combo-box.tsx | 26 ++++++++++++++++++- .../experimental-select-control/menu-item.tsx | 6 +++-- .../src/experimental-select-control/menu.tsx | 13 +++++++++- .../select-control.tsx | 7 ++++- .../stories/index.tsx | 18 +++++++++++++ 7 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 packages/js/components/changelog/update-experimental-select-control diff --git a/packages/js/components/changelog/update-experimental-select-control b/packages/js/components/changelog/update-experimental-select-control new file mode 100644 index 00000000000..8b315f59b12 --- /dev/null +++ b/packages/js/components/changelog/update-experimental-select-control @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Apply wccom experimental select control changes diff --git a/packages/js/components/src/experimental-select-control/combo-box.scss b/packages/js/components/src/experimental-select-control/combo-box.scss index 481797ab2f0..7faddd52a83 100644 --- a/packages/js/components/src/experimental-select-control/combo-box.scss +++ b/packages/js/components/src/experimental-select-control/combo-box.scss @@ -44,3 +44,18 @@ .woocommerce-experimental-select-control__suffix { align-self: stretch; } + +.woocommerce-experimental-select-control__combox-box-toggle-button { + all: unset; + position: absolute; + right: 6px; + top: 50%; + transform: translateY( -50% ); + > svg { + margin-top: 4px; + } +} + +.woocommerce-experimental-select-control:not( .is-focused ) .woocommerce-experimental-select-control__combox-box-toggle-button { + pointer-events: none; // Prevents the icon from being clickable when the combobox is not focused, because otherwise we get a race condition when clicking on the icon, because focussing the combobox opens the menu, then sequentially the icon toggles it back closed +} diff --git a/packages/js/components/src/experimental-select-control/combo-box.tsx b/packages/js/components/src/experimental-select-control/combo-box.tsx index 91cca1c1ecf..d4a53d32c94 100644 --- a/packages/js/components/src/experimental-select-control/combo-box.tsx +++ b/packages/js/components/src/experimental-select-control/combo-box.tsx @@ -1,21 +1,42 @@ /** * External dependencies */ -import { createElement, MouseEvent, useRef } from 'react'; +import { createElement, MouseEvent, useRef, forwardRef } from 'react'; import classNames from 'classnames'; +import { Icon, chevronDown } from '@wordpress/icons'; type ComboBoxProps = { children?: JSX.Element | JSX.Element[] | null; comboBoxProps: JSX.IntrinsicElements[ 'div' ]; inputProps: JSX.IntrinsicElements[ 'input' ]; + getToggleButtonProps?: () => Omit< + JSX.IntrinsicElements[ 'button' ], + 'ref' + >; suffix?: JSX.Element | null; + showToggleButton?: boolean; }; +const ToggleButton = forwardRef< HTMLButtonElement >( ( props, ref ) => { + // using forwardRef here because getToggleButtonProps injects a ref prop + return ( + + ); +} ); + export const ComboBox = ( { children, comboBoxProps, + getToggleButtonProps = () => ( {} ), inputProps, suffix, + showToggleButton, }: ComboBoxProps ) => { const inputRef = useRef< HTMLInputElement | null >( null ); @@ -72,6 +93,9 @@ export const ComboBox = ( { { suffix } ) } + { showToggleButton && ( + + ) } ); }; diff --git a/packages/js/components/src/experimental-select-control/menu-item.tsx b/packages/js/components/src/experimental-select-control/menu-item.tsx index 2200ceba2ef..ef3dbbd465b 100644 --- a/packages/js/components/src/experimental-select-control/menu-item.tsx +++ b/packages/js/components/src/experimental-select-control/menu-item.tsx @@ -1,7 +1,7 @@ /** * External dependencies */ -import { createElement, ReactElement } from 'react'; +import { createElement, CSSProperties, ReactElement } from 'react'; /** * Internal dependencies @@ -14,6 +14,7 @@ export type MenuItemProps< ItemType > = { item: ItemType; children: ReactElement | string; getItemProps: getItemPropsType< ItemType >; + activeStyle?: CSSProperties; }; export const MenuItem = < ItemType, >( { @@ -21,11 +22,12 @@ export const MenuItem = < ItemType, >( { getItemProps, index, isActive, + activeStyle = { backgroundColor: '#bde4ff' }, item, }: MenuItemProps< ItemType > ) => { return (
  • diff --git a/packages/js/components/src/experimental-select-control/menu.tsx b/packages/js/components/src/experimental-select-control/menu.tsx index 13680d9349d..691b038af68 100644 --- a/packages/js/components/src/experimental-select-control/menu.tsx +++ b/packages/js/components/src/experimental-select-control/menu.tsx @@ -22,6 +22,8 @@ type MenuProps = { getMenuProps: getMenuPropsType; isOpen: boolean; className?: string; + position?: Popover.Position; + scrollIntoViewOnOpen?: boolean; }; export const Menu = ( { @@ -29,6 +31,8 @@ export const Menu = ( { getMenuProps, isOpen, className, + position = 'bottom right', + scrollIntoViewOnOpen = false, }: MenuProps ) => { const [ boundingRect, setBoundingRect ] = useState< DOMRect >(); const selectControlMenuRef = useRef< HTMLDivElement >( null ); @@ -41,6 +45,13 @@ export const Menu = ( { } }, [ selectControlMenuRef.current ] ); + // Scroll the selected item into view when the menu opens. + useEffect( () => { + if ( isOpen && scrollIntoViewOnOpen ) { + selectControlMenuRef.current?.scrollIntoView(); + } + }, [ isOpen, scrollIntoViewOnOpen ] ); + /* eslint-disable jsx-a11y/no-noninteractive-element-interactions, jsx-a11y/click-events-have-key-events */ /* Disabled because of the onmouseup on the ul element below. */ return ( @@ -60,7 +71,7 @@ export const Menu = ( { 'has-results': Children.count( children ) > 0, } ) } - position="bottom right" + position={ position } animate={ false } >
      = { disabled?: boolean; inputProps?: GetInputPropsOptions; suffix?: JSX.Element | null; + showToggleButton?: boolean; /** * This is a feature already implemented in downshift@7.0.0 through the * reducer. In order for us to use it this prop is added temporarily until @@ -123,6 +124,7 @@ function SelectControl< ItemType = DefaultItemType >( { disabled, inputProps = {}, suffix = , + showToggleButton = false, __experimentalOpenMenuOnFocus = false, }: SelectControlProps< ItemType > ) { const [ isFocused, setIsFocused ] = useState( false ); @@ -154,12 +156,13 @@ function SelectControl< ItemType = DefaultItemType >( { } setInputValue( getItemLabel( singleSelectedItem ) ); - }, [ singleSelectedItem ] ); + }, [ getItemLabel, multiple, singleSelectedItem ] ); const { isOpen, getLabelProps, getMenuProps, + getToggleButtonProps, getInputProps, getComboboxProps, highlightedIndex, @@ -256,6 +259,7 @@ function SelectControl< ItemType = DefaultItemType >( { { /* eslint-enable jsx-a11y/label-has-for */ } ( { ...inputProps, } ) } suffix={ suffix } + showToggleButton={ showToggleButton } > <> { children( { diff --git a/packages/js/components/src/experimental-select-control/stories/index.tsx b/packages/js/components/src/experimental-select-control/stories/index.tsx index 80902ed691c..cb1706d98d3 100644 --- a/packages/js/components/src/experimental-select-control/stories/index.tsx +++ b/packages/js/components/src/experimental-select-control/stories/index.tsx @@ -573,6 +573,24 @@ export const CustomSuffix: React.FC = () => { ); }; +export const ToggleButton: React.FC = () => { + const [ selected, setSelected ] = + useState< SelectedType< DefaultItemType > >(); + + return ( + item && setSelected( item ) } + onRemove={ () => setSelected( null ) } + suffix={ null } + showToggleButton={ true } + __experimentalOpenMenuOnFocus={ true } + /> + ); +}; + export default { title: 'WooCommerce Admin/experimental/SelectControl', component: SelectControl, From b5aaa1f9969d7feaaec16c438d177d023e27f7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Juh=C3=A9=20Lluveras?= Date: Wed, 29 Mar 2023 11:57:58 +0200 Subject: [PATCH 1284/1680] Update WooCommerce Blocks package to 9.8.3 (#37477) --- .../changelog/update-woocommerce-blocks-9.8.3 | 4 ++++ plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/composer.lock | 14 +++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 new file mode 100644 index 00000000000..974d6e765fd --- /dev/null +++ b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update WooCommerce Blocks to 9.8.3 diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 4427465d7b2..3e92aaa3041 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -21,7 +21,7 @@ "maxmind-db/reader": "^1.11", "pelago/emogrifier": "^6.0", "woocommerce/action-scheduler": "3.5.4", - "woocommerce/woocommerce-blocks": "9.8.2" + "woocommerce/woocommerce-blocks": "9.8.3" }, "require-dev": { "automattic/jetpack-changelogger": "^3.3.0", diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index 831d80f0efb..a595f51f08d 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": "48377a0bfe2b30537b522f197ba28984", + "content-hash": "d92c2e109d56bc31d8d8f4e1ec0bbaf1", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -628,16 +628,16 @@ }, { "name": "woocommerce/woocommerce-blocks", - "version": "9.8.2", + "version": "9.8.3", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-blocks.git", - "reference": "61488a0f1d1afc8fd7484e1b277d40afd782e005" + "reference": "9431e10310a9dc89d844bb9d480adab64297b130" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/61488a0f1d1afc8fd7484e1b277d40afd782e005", - "reference": "61488a0f1d1afc8fd7484e1b277d40afd782e005", + "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/9431e10310a9dc89d844bb9d480adab64297b130", + "reference": "9431e10310a9dc89d844bb9d480adab64297b130", "shasum": "" }, "require": { @@ -683,9 +683,9 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-blocks/issues", - "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v9.8.2" + "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v9.8.3" }, - "time": "2023-03-22T14:39:35+00:00" + "time": "2023-03-28T14:44:30+00:00" } ], "packages-dev": [ From b51d32e6b7a3fe83cdd594917bfb3d20526a932e Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 29 Mar 2023 19:00:20 +0800 Subject: [PATCH 1285/1680] Remove unused woocommerce_marketing_overview_welcome_hidden option. See https://github.com/woocommerce/woocommerce/pull/37430#discussion_r1150002880. --- plugins/woocommerce/src/Admin/API/Options.php | 1 - .../woocommerce/src/Internal/Admin/Marketing.php | 13 ------------- 2 files changed, 14 deletions(-) diff --git a/plugins/woocommerce/src/Admin/API/Options.php b/plugins/woocommerce/src/Admin/API/Options.php index 7205f72f711..c37a6058931 100644 --- a/plugins/woocommerce/src/Admin/API/Options.php +++ b/plugins/woocommerce/src/Admin/API/Options.php @@ -167,7 +167,6 @@ class Options extends \WC_REST_Data_Controller { 'woocommerce_task_list_dismissed_tasks', 'woocommerce_setting_payments_recommendations_hidden', 'woocommerce_navigation_favorites_tooltip_hidden', - 'woocommerce_marketing_overview_welcome_hidden', 'woocommerce_admin_transient_notices_queue', 'woocommerce_task_list_welcome_modal_dismissed', 'woocommerce_welcome_from_calypso_modal_dismissed', diff --git a/plugins/woocommerce/src/Internal/Admin/Marketing.php b/plugins/woocommerce/src/Internal/Admin/Marketing.php index 47d4ab241bb..acde214b53d 100644 --- a/plugins/woocommerce/src/Internal/Admin/Marketing.php +++ b/plugins/woocommerce/src/Internal/Admin/Marketing.php @@ -44,7 +44,6 @@ class Marketing { add_action( 'admin_menu', array( $this, 'register_pages' ), 5 ); add_action( 'admin_menu', array( $this, 'add_parent_menu_item' ), 6 ); - add_filter( 'woocommerce_admin_preload_options', array( $this, 'preload_options' ) ); add_filter( 'woocommerce_admin_shared_settings', array( $this, 'component_settings' ), 30 ); } @@ -141,18 +140,6 @@ class Marketing { } } - /** - * Preload options to prime state of the application. - * - * @param array $options Array of options to preload. - * @return array - */ - public function preload_options( $options ) { - $options[] = 'woocommerce_marketing_overview_welcome_hidden'; - - return $options; - } - /** * Add settings for marketing feature. * From 34bd12344841a17837e099cebc6f18ba7ae9ef7f Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 29 Mar 2023 19:06:40 +0800 Subject: [PATCH 1286/1680] Remove unused button-style mixins. --- .../js/internal-style-build/abstracts/_mixins.scss | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/packages/js/internal-style-build/abstracts/_mixins.scss b/packages/js/internal-style-build/abstracts/_mixins.scss index 43ab642052d..bbbce36cd95 100644 --- a/packages/js/internal-style-build/abstracts/_mixins.scss +++ b/packages/js/internal-style-build/abstracts/_mixins.scss @@ -102,20 +102,6 @@ cursor: default; } -@mixin button-style__hover { - background-color: $studio-white; - color: $gray-900; - box-shadow: inset 0 0 0 1px $gray-400, inset 0 0 0 2px $studio-white, - 0 1px 1px rgba( $gray-900, 0.2 ); -} - -@mixin button-style__active() { - outline: none; - background-color: $studio-white; - color: $gray-900; - box-shadow: inset 0 0 0 1px $gray-400, inset 0 0 0 2px $studio-white; -} - @mixin button-style__focus-active() { background-color: $studio-white; color: $gray-900; From f814f09cabc9ec341054d960965c4a8fa8e2da10 Mon Sep 17 00:00:00 2001 From: Gan Eng Chin Date: Wed, 29 Mar 2023 19:09:54 +0800 Subject: [PATCH 1287/1680] Edit changelog. To mention removing classic Marketing page and unused code. --- .../feature-37367-marketing-multichannel-remove-toggle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle b/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle index 54f79f3f168..a36d836c3dc 100644 --- a/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle +++ b/plugins/woocommerce/changelog/feature-37367-marketing-multichannel-remove-toggle @@ -1,4 +1,4 @@ Significance: minor Type: update -Make Multichannel Marketing the default new UI for Marketing page. +Make Multichannel Marketing the default new UI for Marketing page; remove classic Marketing page and unused code. From 2c0004a78d8519344f991b78f112473329a0da0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Juh=C3=A9=20Lluveras?= Date: Wed, 29 Mar 2023 14:59:28 +0200 Subject: [PATCH 1288/1680] Update WooCommerce Blocks package to 9.8.4 (#37492) --- .../changelog/update-woocommerce-blocks-9.8.4 | 4 ++++ plugins/woocommerce/composer.json | 2 +- plugins/woocommerce/composer.lock | 14 +++++++------- 3 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 new file mode 100644 index 00000000000..2cb3821d89a --- /dev/null +++ b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update WooCommerce Blocks to 9.8.4 diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index 3e92aaa3041..cdac34076f3 100644 --- a/plugins/woocommerce/composer.json +++ b/plugins/woocommerce/composer.json @@ -21,7 +21,7 @@ "maxmind-db/reader": "^1.11", "pelago/emogrifier": "^6.0", "woocommerce/action-scheduler": "3.5.4", - "woocommerce/woocommerce-blocks": "9.8.3" + "woocommerce/woocommerce-blocks": "9.8.4" }, "require-dev": { "automattic/jetpack-changelogger": "^3.3.0", diff --git a/plugins/woocommerce/composer.lock b/plugins/woocommerce/composer.lock index a595f51f08d..570a718d4b3 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": "d92c2e109d56bc31d8d8f4e1ec0bbaf1", + "content-hash": "6267272b0deee3fb00d6f72b07b199c4", "packages": [ { "name": "automattic/jetpack-autoloader", @@ -628,16 +628,16 @@ }, { "name": "woocommerce/woocommerce-blocks", - "version": "9.8.3", + "version": "9.8.4", "source": { "type": "git", "url": "https://github.com/woocommerce/woocommerce-blocks.git", - "reference": "9431e10310a9dc89d844bb9d480adab64297b130" + "reference": "bdb2e6ab2288f980a7fa75fa46dc846fd0c6b31f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/9431e10310a9dc89d844bb9d480adab64297b130", - "reference": "9431e10310a9dc89d844bb9d480adab64297b130", + "url": "https://api.github.com/repos/woocommerce/woocommerce-blocks/zipball/bdb2e6ab2288f980a7fa75fa46dc846fd0c6b31f", + "reference": "bdb2e6ab2288f980a7fa75fa46dc846fd0c6b31f", "shasum": "" }, "require": { @@ -683,9 +683,9 @@ ], "support": { "issues": "https://github.com/woocommerce/woocommerce-blocks/issues", - "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v9.8.3" + "source": "https://github.com/woocommerce/woocommerce-blocks/tree/v9.8.4" }, - "time": "2023-03-28T14:44:30+00:00" + "time": "2023-03-29T12:01:19+00:00" } ], "packages-dev": [ From 9892f7af28c3a411da8da4346c7689e908ffffd5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 16:11:24 +0200 Subject: [PATCH 1289/1680] Delete changelog files based on PR 37477 (#37489) Delete changelog files for 37477 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 deleted file mode 100644 index 974d6e765fd..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.3 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 9.8.3 From 5b234b92e1045ddd241900e5cc441d1b0440f359 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 29 Mar 2023 16:12:06 +0200 Subject: [PATCH 1290/1680] Delete changelog files based on PR 37492 (#37494) Delete changelog files for 37492 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 deleted file mode 100644 index 2cb3821d89a..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.4 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 9.8.4 From 6f5b7fd359acabd87d5dff469fa285f19ce2d33a Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 30 Mar 2023 09:13:09 +0800 Subject: [PATCH 1291/1680] Fix rest api filter to allow any strings in replacement (#37468) * Fix beta tester api filter replacement value * Add changelog * Fix lint * Add doc comments --- .../api/rest-api-filters/rest-api-filters.php | 208 ++++++++++-------- .../changelog/fix-rest-api-filter | 4 + 2 files changed, 123 insertions(+), 89 deletions(-) create mode 100644 plugins/woocommerce-beta-tester/changelog/fix-rest-api-filter diff --git a/plugins/woocommerce-beta-tester/api/rest-api-filters/rest-api-filters.php b/plugins/woocommerce-beta-tester/api/rest-api-filters/rest-api-filters.php index 19b06c9a722..c2cefb6158e 100644 --- a/plugins/woocommerce-beta-tester/api/rest-api-filters/rest-api-filters.php +++ b/plugins/woocommerce-beta-tester/api/rest-api-filters/rest-api-filters.php @@ -1,109 +1,139 @@ 'POST', - 'args' => array( - 'endpoint' => array( - 'description' => 'Rest API endpoint.', - 'type' => 'string', - 'required' => true, - 'sanitize_callback' => 'sanitize_text_field', - ), - 'dot_notation' => array( - 'description' => 'Dot notation of the target field.', - 'type' => 'string', - 'required' => true, - 'sanitize_callback' => 'sanitize_text_field', - ), - 'replacement' => array( - 'description' => 'Replacement value for the target field.', - 'type' => 'string', - 'required' => true, - 'sanitize_callback' => 'sanitize_text_field', - ), - ), - ) + '/rest-api-filters', + array( WCA_Test_Helper_Rest_Api_Filters::class, 'create' ), + array( + 'methods' => 'POST', + 'args' => array( + 'endpoint' => array( + 'description' => 'Rest API endpoint.', + 'type' => 'string', + 'required' => true, + 'sanitize_callback' => 'sanitize_text_field', + ), + 'dot_notation' => array( + 'description' => 'Dot notation of the target field.', + 'type' => 'string', + 'required' => true, + 'sanitize_callback' => 'sanitize_text_field', + ), + 'replacement' => array( + 'description' => 'Replacement value for the target field.', + 'type' => 'string', + 'required' => true, + 'sanitize_callback' => 'sanitize_text_field', + ), + ), + ) ); register_woocommerce_admin_test_helper_rest_route( - '/rest-api-filters', - [ WCA_Test_Helper_Rest_Api_Filters::class, 'delete' ], - array( - 'methods' => 'DELETE', - 'args' => array( - 'index' => array( - 'description' => 'Rest API endpoint.', - 'type' => 'integer', - 'required' => true, - ), - ), - ) + '/rest-api-filters', + array( WCA_Test_Helper_Rest_Api_Filters::class, 'delete' ), + array( + 'methods' => 'DELETE', + 'args' => array( + 'index' => array( + 'description' => 'Rest API endpoint.', + 'type' => 'integer', + 'required' => true, + ), + ), + ) ); register_woocommerce_admin_test_helper_rest_route( - '/rest-api-filters/(?P\d+)/toggle', - [ WCA_Test_Helper_Rest_Api_Filters::class, 'toggle' ], - array( - 'methods' => 'POST', - ) + '/rest-api-filters/(?P\d+)/toggle', + array( WCA_Test_Helper_Rest_Api_Filters::class, 'toggle' ), + array( + 'methods' => 'POST', + ) ); class WCA_Test_Helper_Rest_Api_Filters { - const WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION = 'wc-admin-test-helper-rest-api-filters'; + const WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION = 'wc-admin-test-helper-rest-api-filters'; - public static function create( $request ) { - $endpoint = $request->get_param('endpoint'); - $dot_notation = $request->get_param('dot_notation'); - $replacement = $request->get_param('replacement'); + /** + * Create a filter. + * + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public static function create( $request ) { + $endpoint = $request->get_param( 'endpoint' ); + $dot_notation = $request->get_param( 'dot_notation' ); + $replacement = $request->get_param( 'replacement' ); - self::update( - function ( $filters ) use ( - $endpoint, - $dot_notation, - $replacement - ) { - $filters[] = array( - 'endpoint' => $endpoint, - 'dot_notation' => $dot_notation, - 'replacement' => filter_var( $replacement, FILTER_VALIDATE_BOOLEAN ), - 'enabled' => true, - ); - return $filters; - } - ); - return new WP_REST_RESPONSE(null, 204); - } + if ( 'false' === $replacement ) { + $replacement = false; + } elseif ( 'true' === $replacement ) { + $replacement = true; + } - public static function update( callable $callback ) { - $filters = get_option(self::WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION, array()); - $filters = $callback( $filters ); - return update_option(self::WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION, $filters); - } + self::update( + function ( $filters ) use ( + $endpoint, + $dot_notation, + $replacement + ) { + $filters[] = array( + 'endpoint' => $endpoint, + 'dot_notation' => $dot_notation, + 'replacement' => $replacement, + 'enabled' => true, + ); + return $filters; + } + ); + return new WP_REST_RESPONSE( null, 204 ); + } - public static function delete( $request ) { - self::update( - function ( $filters ) use ( $request ) { - array_splice($filters, $request->get_param('index'), 1); - return $filters; - } - ); + /** + * Update the filters. + * + * @param callable $callback Callback to update the filters. + * @return bool + */ + public static function update( callable $callback ) { + $filters = get_option( self::WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION, array() ); + $filters = $callback( $filters ); + return update_option( self::WC_ADMIN_TEST_HELPER_REST_API_FILTER_OPTION, $filters ); + } - return new WP_REST_RESPONSE(null, 204); - } + /** + * Delete a filter. + * + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public static function delete( $request ) { + self::update( + function ( $filters ) use ( $request ) { + array_splice( $filters, $request->get_param( 'index' ), 1 ); + return $filters; + } + ); - public static function toggle( $request ) { - self::update( - function ( $filters ) use ( $request ) { - $index = $request->get_param('index'); - $filters[$index]['enabled'] = !$filters[$index]['enabled']; - return $filters; - } - ); - return new WP_REST_RESPONSE(null, 204); - } -} \ No newline at end of file + return new WP_REST_RESPONSE( null, 204 ); + } + + /** + * Toggle a filter on or off. + * + * @param WP_REST_Request $request Request object. + * @return WP_REST_Response + */ + public static function toggle( $request ) { + self::update( + function ( $filters ) use ( $request ) { + $index = $request->get_param( 'index' ); + $filters[ $index ]['enabled'] = ! $filters[ $index ]['enabled']; + return $filters; + } + ); + return new WP_REST_RESPONSE( null, 204 ); + } +} diff --git a/plugins/woocommerce-beta-tester/changelog/fix-rest-api-filter b/plugins/woocommerce-beta-tester/changelog/fix-rest-api-filter new file mode 100644 index 00000000000..91c2f4fd978 --- /dev/null +++ b/plugins/woocommerce-beta-tester/changelog/fix-rest-api-filter @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix rest api filter to allow any strings in replacement From 51af048c2848ed5ea534c2bc5692ba14e9410202 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 30 Mar 2023 09:15:17 +0800 Subject: [PATCH 1292/1680] Update payment gateway recommendation priority (#37442) * Update payment gateway recommendation priority * Reformat * Fix lint * Add changelog --- .../changelog/update-payment-order | 4 + .../DefaultPaymentGateways.php | 271 +++++++++++++++--- 2 files changed, 236 insertions(+), 39 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-payment-order diff --git a/plugins/woocommerce/changelog/update-payment-order b/plugins/woocommerce/changelog/update-payment-order new file mode 100644 index 00000000000..dedd63eacb9 --- /dev/null +++ b/plugins/woocommerce/changelog/update-payment-order @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Update payment gateway recommendation priority diff --git a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php index 0f77f660c24..fbe2de7ab01 100644 --- a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php +++ b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php @@ -11,37 +11,6 @@ defined( 'ABSPATH' ) || exit; * Default Payment Gateways */ class DefaultPaymentGateways { - /** - * Priority is used to determine which payment gateway to recommend first. - * The lower the number, the higher the priority. - * - * @var array - */ - private static $recommendation_priority = array( - 'woocommerce_payments' => 1, - 'woocommerce_payments:with-in-person-payments' => 1, - 'woocommerce_payments:without-in-person-payments' => 1, - 'stripe' => 2, - 'woo-mercado-pago-custom' => 3, - // PayPal Payments. - 'ppcp-gateway' => 4, - 'mollie_wc_gateway_banktransfer' => 5, - 'razorpay' => 5, - 'payfast' => 5, - 'payubiz' => 6, - 'square_credit_card' => 6, - 'klarna_payments' => 6, - // Klarna Checkout. - 'kco' => 6, - 'paystack' => 6, - 'eway' => 7, - 'amazon_payments_advanced' => 7, - 'affirm' => 8, - 'afterpay' => 9, - 'zipmoney' => 10, - 'payoneer-checkout' => 11, - ); - /** * Get default specs. * @@ -832,8 +801,10 @@ class DefaultPaymentGateways { ), ); + $base_location = wc_get_base_location(); + $country = $base_location['country']; foreach ( $payment_gateways as $index => $payment_gateway ) { - $payment_gateways[ $index ]['recommendation_priority'] = self::get_recommendation_priority( $payment_gateway['id'] ); + $payment_gateways[ $index ]['recommendation_priority'] = self::get_recommendation_priority( $payment_gateway['id'], $country ); } return $payment_gateways; @@ -935,16 +906,238 @@ class DefaultPaymentGateways { } /** - * Get recommendation priority for a given payment gateway by id. - * If no priority is set or the id is not found, return null. + * Get recommendation priority for a given payment gateway by id and country. + * If country is not supported, return null. * - * @param string $id Payment gateway id. - * @return int Priority. + * @param string $gateway_id Payment gateway id. + * @param string $country_code Store country code. + * @return int|null Priority. Priority is 0-indexed, so 0 is the highest priority. */ - private static function get_recommendation_priority( $id ) { - if ( ! $id || ! array_key_exists( $id, self::$recommendation_priority ) ) { + private static function get_recommendation_priority( $gateway_id, $country_code ) { + $recommendation_priority_map = array( + 'US' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'square_credit_card', + 'amazon_payments_advanced', + 'affirm', + 'afterpay', + 'klarna_payments', + 'zipmoney', + ], + 'CA' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'square_credit_card', + 'affirm', + 'afterpay', + 'klarna_payments', + ], + 'AT' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'BE' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'BG' => [ 'stripe', 'ppcp-gateway' ], + 'HR' => [ 'ppcp-gateway' ], + 'CH' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + ], + 'CY' => [ 'stripe', 'ppcp-gateway', 'amazon_payments_advanced' ], + 'CZ' => [ 'stripe', 'ppcp-gateway' ], + 'DK' => [ + 'stripe', + 'ppcp-gateway', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'EE' => [ 'stripe', 'ppcp-gateway' ], + 'ES' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'square_credit_card', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'FI' => [ + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'kco', + 'klarna_payments', + ], + 'FR' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'square_credit_card', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'DE' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'GB' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'square_credit_card', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'GR' => [ 'stripe', 'ppcp-gateway' ], + 'HU' => [ 'stripe', 'ppcp-gateway', 'amazon_payments_advanced' ], + 'IE' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'square_credit_card', + 'amazon_payments_advanced', + ], + 'IT' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'LV' => [ 'stripe', 'ppcp-gateway' ], + 'LT' => [ 'stripe', 'ppcp-gateway' ], + 'LU' => [ 'stripe', 'ppcp-gateway', 'amazon_payments_advanced' ], + 'MT' => [ 'stripe', 'ppcp-gateway' ], + 'NL' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'NO' => [ 'stripe', 'ppcp-gateway', 'kco', 'klarna_payments' ], + 'PL' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'mollie_wc_gateway_banktransfer', + 'klarna_payments', + ], + 'PT' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'amazon_payments_advanced', + ], + 'RO' => [ 'stripe', 'ppcp-gateway' ], + 'SK' => [ 'stripe', 'ppcp-gateway' ], + 'SL' => [ 'stripe', 'ppcp-gateway', 'amazon_payments_advanced' ], + 'SE' => [ + 'stripe', + 'ppcp-gateway', + 'kco', + 'klarna_payments', + 'amazon_payments_advanced', + ], + 'MX' => [ + 'stripe', + 'woo-mercado-pago-custom', + 'ppcp-gateway', + 'klarna_payments', + ], + 'BR' => [ 'stripe', 'woo-mercado-pago-custom', 'ppcp-gateway' ], + 'AR' => [ 'woo-mercado-pago-custom', 'ppcp-gateway' ], + 'BO' => [], + 'CL' => [ 'woo-mercado-pago-custom', 'ppcp-gateway' ], + 'CO' => [ 'woo-mercado-pago-custom', 'ppcp-gateway' ], + 'EC' => [ 'ppcp-gateway' ], + 'FK' => [], + 'GF' => [], + 'GY' => [], + 'PY' => [], + 'PE' => [ 'woo-mercado-pago-custom', 'ppcp-gateway' ], + 'SR' => [], + 'UY' => [ 'woo-mercado-pago-custom', 'ppcp-gateway' ], + 'VE' => [ 'ppcp-gateway' ], + 'AU' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'square_credit_card', + 'eway', + 'afterpay', + 'klarna_payments', + 'zipmoney', + ], + 'NZ' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'eway', + 'klarna_payments', + 'zipmoney', + ], + 'HK' => [ + 'woocommerce_payments', + 'stripe', + 'ppcp-gateway', + 'eway', + 'payoneer-checkout', + ], + 'JP' => [ + 'stripe', + 'ppcp-gateway', + 'square_credit_card', + 'amazon_payments_advanced', + ], + 'SG' => [ 'woocommerce_payments', 'stripe', 'ppcp-gateway', 'eway' ], + 'CN' => [ 'ppcp-gateway', 'payoneer-checkout' ], + 'FJ' => [], + 'GU' => [], + 'ID' => [ 'stripe', 'ppcp-gateway' ], + 'IN' => [ 'stripe', 'razorpay', 'payubiz', 'ppcp-gateway' ], + 'ZA' => [ 'payfast', 'paystack', 'ppcp-gateway' ], + 'NG' => [ 'paystack', 'ppcp-gateway' ], + 'GH' => [ 'paystack', 'ppcp-gateway' ], + ); + + // If the country code is not in the list, return null. + if ( ! isset( $recommendation_priority_map[ $country_code ] ) ) { return null; } - return self::$recommendation_priority[ $id ]; + + $index = array_search( $gateway_id, $recommendation_priority_map[ $country_code ], true ); + + // If the gateway is not in the list, return the last index + 1. + if ( false === $index ) { + return count( $recommendation_priority_map[ $country_code ] ); + } + + return $index; } } From be9f09f2171432fb7341f3c1b8838b2637b32624 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Thu, 30 Mar 2023 09:51:44 +0800 Subject: [PATCH 1293/1680] Fix missing result prop in `wcadmin_install_plugin_error` track (#37466) * Fix missing result prop in install_plugin_error track * Add changelog --- plugins/woocommerce/changelog/fix-install-plugin-error-track | 4 ++++ plugins/woocommerce/src/Admin/PluginsHelper.php | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-install-plugin-error-track diff --git a/plugins/woocommerce/changelog/fix-install-plugin-error-track b/plugins/woocommerce/changelog/fix-install-plugin-error-track new file mode 100644 index 00000000000..9be0defc8d8 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-install-plugin-error-track @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix missing result prop in wcadmin_install_plugin_error track diff --git a/plugins/woocommerce/src/Admin/PluginsHelper.php b/plugins/woocommerce/src/Admin/PluginsHelper.php index c333980947e..3f9e41a380a 100644 --- a/plugins/woocommerce/src/Admin/PluginsHelper.php +++ b/plugins/woocommerce/src/Admin/PluginsHelper.php @@ -234,7 +234,7 @@ class PluginsHelper { 'api_version' => $api->version, 'api_download_link' => $api->download_link, 'upgrader_skin_message' => implode( ',', $upgrader->skin->get_upgrade_messages() ), - 'result' => $result, + 'result' => is_wp_error( $result ) ? $result->get_error_message() : 'null', ); wc_admin_record_tracks_event( 'install_plugin_error', $properties ); From afc2344f47041000234130d82bd2a5714c1409ee Mon Sep 17 00:00:00 2001 From: Nima Karimi <73110514+nima-karimi@users.noreply.github.com> Date: Thu, 30 Mar 2023 14:13:57 +0100 Subject: [PATCH 1294/1680] Remove the MCM feature flag on update to WooCommerce 7.7 (#37454) * Remove the MCM feature flag on update to WooCommerce 7.7 This feature flag is no longer needed because the new marketing page will be the default on version 7.7 (pe2C5g-Ft-p2#comment-582). * Remove the marketing overview welcome option --- .../woocommerce/changelog/feature-remove-mcm-flag-option | 4 ++++ plugins/woocommerce/includes/class-wc-install.php | 3 +++ plugins/woocommerce/includes/wc-update-functions.php | 8 ++++++++ 3 files changed, 15 insertions(+) create mode 100644 plugins/woocommerce/changelog/feature-remove-mcm-flag-option diff --git a/plugins/woocommerce/changelog/feature-remove-mcm-flag-option b/plugins/woocommerce/changelog/feature-remove-mcm-flag-option new file mode 100644 index 00000000000..caa01e7e98b --- /dev/null +++ b/plugins/woocommerce/changelog/feature-remove-mcm-flag-option @@ -0,0 +1,4 @@ +Significance: minor +Type: tweak + +Remove the multichannel marketing feature flag from database since it's the default option now. diff --git a/plugins/woocommerce/includes/class-wc-install.php b/plugins/woocommerce/includes/class-wc-install.php index 33e21419f48..f2c1f4286bc 100644 --- a/plugins/woocommerce/includes/class-wc-install.php +++ b/plugins/woocommerce/includes/class-wc-install.php @@ -229,6 +229,9 @@ class WC_Install { 'wc_update_750_add_columns_to_order_stats_table', 'wc_update_750_disable_new_product_management_experience', ), + '7.7.0' => array( + 'wc_update_770_remove_multichannel_marketing_feature_options', + ), ); /** diff --git a/plugins/woocommerce/includes/wc-update-functions.php b/plugins/woocommerce/includes/wc-update-functions.php index 7c9020db0c7..d70a4233816 100644 --- a/plugins/woocommerce/includes/wc-update-functions.php +++ b/plugins/woocommerce/includes/wc-update-functions.php @@ -2581,3 +2581,11 @@ function wc_update_750_disable_new_product_management_experience() { update_option( 'woocommerce_new_product_management_enabled', 'no' ); } } + +/** + * Remove the multichannel marketing feature flag and options. This feature is now enabled by default. + */ +function wc_update_770_remove_multichannel_marketing_feature_options() { + delete_option( 'woocommerce_multichannel_marketing_enabled' ); + delete_option( 'woocommerce_marketing_overview_welcome_hidden' ); +} From d3229b97cbeb38f8a45b5d573a966147a6299a32 Mon Sep 17 00:00:00 2001 From: Ilyas Foo Date: Thu, 30 Mar 2023 23:36:12 +0800 Subject: [PATCH 1295/1680] Update mobile app modal image resolution (#37506) * Update image * Changelog --- .../illustrations/intro-devices-desktop.png | Bin 57751 -> 143961 bytes .../homescreen/mobile-app-modal/style.scss | 1 + .../fix-36142-mobile-app-image-resolution | 4 ++++ 3 files changed, 5 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-36142-mobile-app-image-resolution diff --git a/plugins/woocommerce-admin/client/homescreen/mobile-app-modal/illustrations/intro-devices-desktop.png b/plugins/woocommerce-admin/client/homescreen/mobile-app-modal/illustrations/intro-devices-desktop.png index 07932b5539c4b73cef1a732aa8e75d92b2307473..7911cb637a041b2b105094f6ca0c376dcde58ab5 100644 GIT binary patch literal 143961 zcmZ5mWmp?s(*^>;-GaNj6qjH{in|r3NQ+ZioZwR2J-EA;;_mJgcZ$37@w`93{gGVR zJv;ZvJ#!|z6Q-ξhB!0s{ksE-xpo4g&)Zfq?L@!N9;hsw!&Ay#K_+ z#6&|w1OD#-008gb$jHd$RrO_+b-B5D|Bg?~Dr&QH@~&@g#wO>cr)TCD7CXB7O3G`7 zN2iuo{$5>QkBm*%)i;h$&N?``?CkCjkBpsPT>f2MySlpS>KT0hTv%KgpPDznnhowbeao6CoHA!lcoC#M(lOMiEF_y7J~-`d*t)vTLc zSUx&Bo|&23+BrD-ce=g3dw6)Xyt;9Hb9a1vGC8vl9UXUb`*?bKHaokpzkjf?y_b~* z-QPdiKR8-n-&k2$U0PZ>K0XT%j~ttvMM6Ttz`!^;y&@nW*xftq>Kz&!nH(4xxVm^4 z86EBD=$e~f7#bR)q@+ws%Pc4;YHIqOlaqJ!?|f=%dSY^NV`FP{d}d*BDKRnS@ZhYw zyLW7SoSvROIVHWmzKMf_BQ7op30a}9m4=i%Y0tg6ZM>eJBFOmgXp{nmc|?>5A^d1>_Ec<=8XJ}~H++4jrdrbUIBR(NPS5L3Cwc%j%5?M*8w|}JM*Jxku z>U7V}Xv;=kz~IixS#!>uqLPxfwl>(;itVRKM@LJ0@sfK^SY6um^TkblMS*IN^Zm~8 z#3!Goy0QhUIQxtr@}EBKW&a7SjxvmKzFF8}HBkhA)1y?A+z2llmH3fTm-{6)@L%1~ zU$2~{@%|azkldDxAW`0q(ZPY*TsKwmsgByj zAC{R0;MCY~KTlT^F|MtH{qEZNv7VJ#&~oQH&)8hml{H}C5mB*lF$i592%T-2|Mh@X z&P539tyW&hnHxR4VI#4Cfn(p4mzL1{xqLjYX5Y<;1+TjI znrvSHU$`b01h)%VW68Zp6ENCr5QKfl_fk?W zS&01eP%0$UOKTJQ28ez0epvDSS@sZC@iu`<1h+`x*^)-&9|1;kko4T8y zs2UmLzTei#H66NEk27Arne7|8k|LTihCjST8!3702IS}`xG|7~PSnqWr72JYEaHTW-dH@>A53|F+}lQN#BU);&Br96S*Wg`HU^XKP%yk&=%n{ht#<w3 zSR5qBm|nyq{dPh2fC(nTG_xasL1b%)#c^fj?f(R0{^yvczdQqt%2}Qm;VWW}Qj$px zE}=|99!_7r)X|%6$A`z0gx6NA6^g6mhN7-s(QAxvaA~o;=J66|abHlFa^>5z(e?z= z1p;eHG9MlCJ7}M#eLj>!$-C9bLFV`rS|$Lm2JRuwlu!Ozc3{aH#^a}2wu@Sr zh)?$zk$ySc4D{njYkHN6r5bxS>5mT3cNsVxC``5Oc_x`8TrJ78H*YL2zu`_IO1`n5 zjx0N6fBPiQ7x306@D2C!n=`F)V-BsS>DZf9EA#JRTK+;>;VyAA)%H>B@1q(yJMh2Z z=;~I)z1oX*WOSV=6lwv5aSWc$k@87UTH%cagW9wS;}Sqwon{pPE}u{Q8*ln~>y! zc3Fp;9`{Ai@&=bK`Eqw@q0fLp=FYtCS^n4`q9n3ME&83F#Tt*|i0ctdiLB3s>udj_ zCB1>oTyq84CpV8WoVN1Xg%5h|RUGYuWRI?3C>f*d!4?aNX}noJeys#YJA~G4Z6`v=Z4OWL#yD!^6LM^pxGb$dUVUQUVJwSJApBn??+F5KZi%Y3?PQ&bd^$GtgQ zd$V{YGJ4fcm*h3y&g@6buuN(dGJl{|IRyA+r2fmo8q?(lI1OjX|at$8ATMB zUb~YuDMr^avwgk(ISP=X0gL|pd7==v|Mso5;QD;3@>`Xf=^m}4$0xjMwiyRXMFxQb}>xI$U=lroTzp!|M<33YE&$#NOuWUt9%gCqxo$aJB~z7Qvw; z^wTIRARCuhl9FR!W^SHiQJMN!)5YiLfq$4JL8ziN3l&kc(&0ZEVYi&)ak{vij?=VO z5M`e_v>MvE5wnc6twj(D3#Y%letCm(@bT}mFa@+QL8q6(Si8otHim~{FfJysIf_lj z3Q?g2-IZ+VoN!+}L|d*UFcF1FS?-dOslH~M8<|rNTysNZ|G??xKymyRl4v~%0F1|L zYYLsz-GQMlk%?_TV%Ddsr|fx0)7rm=;+ISvrZkd#5$UO(v2SAY>$Ks=qFF$mLBkni zJD5)j%KGLeq{RBymVc8^xVUS@*53`$8K`~$*{lw}8w;K2Dz9t_9ZndMSZ|ZER;U#3 zTMr)}U2S(k<%np$=M`pY`(WrcFPo?R@8R~=%^p|M@|kpgh7FX5AMPFzFJl`4h)ch@ z;T`={6Ap}D{iVm~k+ZQRm!A_IJ(9MFI}U)q><&M2XpqcFZ2Ief>oG^sb1Ybv zf|6Xl`8?qFk=s0xFdO-4UVS@8NW8)yWlL~2r;4!IDIl<#Uw{j7^g3rR9o5s(B*`Dy zy)T?WR}^NiE9hh!>`T$g-L+*>TzrYoQpj!TT#VC!C4n0DR?!UZ`|0@BZz8bR*H<*P z^5D-<{Fx;#U%RXgb~Rg0!}gr0P(jc?f-rz35xt#X)qe|W=7_7Tj&9mBie|z-j&_Ir$&6u)F4);si#a^jTlaGFWw0Q2V z7vCHAg_ zkSD)xQcK|~#Z=Jn+dnREakXciBdfhVis*qShxEt>vev!Lc{H8@d>F zw$zFRo;oIYpO%C|?UC|0J#u@Xd?agGPsxh9!LLx%*v_mkx*K99L#4&6CK|KlSrVHI z=pf^Pcm;QT*D)9*)OvEb*_`W!SzA<8B!VMa3xQ6!Z~=5(L~KdjbP$X`I}l{F3xWTE z5y9Q8Y%A=nJ9h`BZO(g|PplQ~%m1*5Kw;To#|EaGb1Sh*7(PaA2jYWeV!TT0B zYRkBTGoso3%+;}_X8H8wT6RUyh$LIoKoM}Ug6~UXsyybUh?$cF_(iF@AvoeO_4PyX zkB?`rUOYWCEAUZ`je&Z~C1(Q|{Lc8(=AH>^+Of{LCJWB9mC*V(f5X@Ll9ds?N?oG- zLLI2Q!~(f4W(n6qH`bO=N~SOGn(vaHk>`iy#vjx7kWVjR&~-|9T)fh0?%sKn??d|0 zm(} zow%6n<-^BYb{gY&SZJcPav1IB%ua}#nBq1Sev+zbSy~1ZeM!{J%P9>EEVsuqiyzbc z{*@7(b(6k*#ONYs=54?r&wLi5hRd%;G26ndz`uYGB>`wSDd)N>5?rIY7~Ua z9F{H4d}PDaDo+rl>hLTD&Ngrd-AUA!F<%Dq_s1${X`j<`B`icaQ468=KOSD!YrCgG zQ1%PyD%fP()#tuEDmxsQ}N4l+|rUq{zTz`cak}f zhcoyz^}@ZQ+!JQNn+xQvdQhEl%2T7NmK#=`mE_D^Raz_i$DZJw)VlJ|VZG z^-vQ60bo*!PvA5Wc~}n3Y8b@Ptc5i(GBS~)(A)ss8d?~{{>Owg@IzQjidkB*lx)sK zgy=9IsE9L3Zp6OYoe55kBR%hT_&(455nqFOY~K?X&$7>YOBwhK<;bwTgX90H@r)Q$ z5>}P`WdBzHi1Gnu(#e5MU;&%E468skCGi}dK%JC9!;gUM6;c>>2Lpqbq=-FhhYnKH zAUaQ`-TEvkNDoH&WI#u9j8ADBA3M)^O_Gk_v#4-`P3I!>b%~>UQ;fJtR2ysH7RmJ> zNNIn{Ea5re`P-xwx&-04kB95iP}7GuJ=d>oH+7T`osSQ-1@!JYz$@(bG1uLMFN(}H zs4+skksS7=`T+{H&MQ#<`c}i@534CZ` zEa=lEx#&N*+oSTp2drknS{`hxr=`~CH`9i$%bzz*mh|n=w_r1J*vAwF{ zd}At{x{K2#fxzbX9tCry{fR~h?nP|C(t<-y+0j>$8T&R(E6a(pXPc;#-*5GT(WI%x z1JUFFeMPE}!3-ISyPC}mYVB3y^5c{3I^bS_Ws41=EoTc;17gMucFN6Um@?6!#Gvj; z#W@+6JjrqAXq|p&$SWMo0-S`N&#}HiDC*5+qsDN-49dPgUGGk;J{xP7?c$S&2eD0J z;}traKtB8T+I@9JoXWw`tQ+bIlER)Req!|IDEtbGEXI!*(5GiXVz!X+F>MJM=9acl ztNU`ORjSnvg%#*U9X8g`_o;-FD3C6$usUBJ8-dm>ug7j0&uiWGC}YEK1yM;?NNEzt znAnc0{+ED&_dXBrhm_@ct|i`FC6QLcK3JI2*BcJ|;pvg(Yc(oEhlp?O@3%@s+eZNB zY$aD+mR(rO`x61YpRuN}{Emb$betUAIjr@ik%q*bp2tKi5{=mqB_WMcsj!dXN-x?$ zQwB={8Vqbt!|8cc$c2=5gN3SCI}XQ%=_*PYG?Xx9c^^fC#h5^$&M{8W5(UV8RPreiCz5QK|hL!Jndji~z40r9jI{w@BZt zb@ITehr6(-5je8AM+iN~K!!tDq}4|PdwCAZ^?U`#LPrV(Wa`os5lun~##r(uYiql? zX9bz!SeJm^?|Cs8^oEOX14Dcu0rd64JpNno}U!J&JMj*=m4M zPD@u}{c|*l4jPylATRMe<(DMqVH%%&h%}4u6rrh=#Ev8vN60i5co07wI-KgYV7mQr z4tvtXiCB{C@{P)ovL7AGuMD=hSgDG5s58E$PZ^a#bJ1C}b{%mUoeNfIg9PG7&S|}K z|ByT(?qd|6eRuZucg0YV+zsc~+SgB*Ve*P<tsy=TmW^yZwwRQADBRtuYEY z)hM}{?7y!lFrR(g&j$AA#{OmV!vy*XzVu@59hj~2ZZ3CSz-FoaXkmmOY4T~UlE6R6w2CWk@0Y*)5AbGrg9~@!~^nO+Gi-DP3lD(T}sg{`_ zpWVYe0tHDU@TIzckf0|dkEik1^C<}n&!N4wW-Uo8ct|8=oS?P&q&8{$7_Oza9+8GK zO^FW8(6RGeP-UP}{>!w~D*MfD7aayh(ptTu@jHVI!9t9hj?7QuH;=>wQa2|k4U3>k zJ?(0n3&W_kNiT#KTV5?cvB!Clyub4n^E0QyiQuGZGN2vnkz#@p=vOJ`b#>Bp^AB?k z7JPG$zQHZjk0jkSKrdN(Y)5j$+fnQ;v_DH-Dmb@M=sE?{pDEq#XF5u4)0Wt)YVhbp zj(Tzo%QB$CyAacgLwsG(`!Ua^LKa=ZT#81f3ogM3QPLgm_QoWd2GEYkuWq)-xY zzbD$E#+CcU{Ld3!==d_C&C@0}A88Bbl=0_zK9r#=;O7PGm|qr};a_!$MQlVB?soP* zFSxFNA03Tav0N`SrQh1*S@3xh6N!k3QboVL@>5?`@%x+2w>8-Z<7a7 zDXv|~v0)aGM&WQaA>w(YmLu?noUlzUkuNyT1;4a#;Ar+d+)QF+y~48x$eAl7$LSD7 zNPm$|_thNRH}4&MQ3{vkD^*k8ey&SEr?J>pWjh3NPL*f5fEh!PaCNTx5yN4w=Q|#k zlUq#W@GoP8Y{=9c`CHOuSB^(YNms9a5^m%hHip;DF!Uz0$--oBYxev4b7Q~<#8erx z!w>I-tvx?J{b_D%^UQG9C#`ZDX7&|*x?y6GO+3*VtA~lg2&|_;MM63Zm;0~{j~p8Q zcNP_;`eY;hQR7=wv+%0|S=EToXFfe0(tHw_dqs?oU}!P?IfQ~Jkj+On$sT&ze^)&_-fRz zB=d*KKY{YbOE~i$4;j)CC#n{Vk<3!s=h>joO+n~upX|9NF+kID;Q}<%Wc)r*xDFe^7l90uRE0NDeAEaQsevLRZ<$ zKx0)G*-ht|=Cpy1RG{QwSTl`C8;7IIQaMiLV0CV2097~nrp5O^R3W9}#X06$@>u9h zNf|Fe_v8S2r&P&C*~U55F?uP9Sq7(NbSEp}QTSguxIYukbWPU%4)8eyzF8UjOR&tUkVh_XS2l_?LVFi}N<&-nHT zkojVfAc-t8ng;W8&ORER@6AMt35hntE(!6^P-RY}nxzv`16F(`gh-s({e_SH6tki* z_X~El7JQfloK;Pe{wDrUruakBip?2G^u>l5V3mI|gXk{LkHahon8r$1miF=SaJry8 zIk^+X&&T+V%7^F1MZ5S5jv-g7=SGN5U&RqWO5D+c^Rzw+rFz)abj$Yjf?GUG-#GR4 z&rE6UCNX*oGkXCyQ}wglV@3gc?k#zP?qfz;l2TXH%X+N_Hk*!GKXZov_fCaOfXgtIPz@u1JbtGe)iK=4PNSW_$OVxuG6&vnA--U1{sa!`cyeFRYW zs^n}v3Rgo}!uP_+&oRrHveSea&7psG-L%pFPE{kMQjHs9%&{(}8G7t!3vg3yWwweM zIay%ouCm82@FLEuxiPU7omvtL_}R977~vUU#Gn;2#G@)`=n2fK&Str%=NUrZun}?tL60Vp8$Y8Wq z`9wTL$K`Kz~(4R4@V;B})dreM;0viWxJ{1E!w zY%oC?u|BX0V)Z}y@Z5_)_F{_%eP=FAr%u1=Jq zsR$P%-zNBt9DZ_HVhOo7K?j!aQRZKv!-(C5Qd=JNRMq$Sue{|rWRxCS5i17mPqe-xep57)wb(-GoCT^*0@3&sbvj(6 zSJl2X;Ft66$~b~qqBAl(cJtL~VT#upkoZ**Cd}ZSzLr@j?jetK3J5i0XiCLFKx8(I<;0=J8BQINDh$?In zFgO94pfLJ+2nl4rLk}>RbQvSh8A+c54Y1L}uaNoMWRv*km97HPLM-;qM#=p%FF6Ju z9f64iR)cX;kF8s~p&xgNvBESl*%$_;zYgaYZu>yX@<|Z8gLxW_Lpm$~ZIAsS9TP<} zwOH#8B)gTfWqRP1Om|i~M>rK2d|?_8Pk9~z-#n9u>xfL4=~Stw)>6|C(a-{^fZ3_L z`CwxG^K@JNK;c|{)D=kpF!l?IA7(b%T6o7d5NuK#NKuv00_C%aS1}QL7>QQ9K7``{ z&isIX_M#kKfvt|r>7B_Pzhk$nGON>dc+g%3;J_EhGSxx?rf7k~;b+A|(q+%+p}TT; z4(!Vh5d=p$C4cN*PofEr6{z$DtvoiSTnE)Xrq!f55DSC_yLiJK#`OVkyOfl6AVN8B3d)1@QgSJJR%ly%hda9T&R*fbO z9-{Nds*p0GEH%};c9ui``wjLO{%49dIAW(dEUKZpEWZU;h+>EHxj^80o@7fMgxh&4%N8tblT|7N>()eBD>bN%HR$4R?b4`foroAOA57 zao1s6#Z>*lZ$)OW!nm%v2praU#Yl{QKM*T5Q?D)y$Tcd{kP!$Uh%H}t7=NF1TS;<8 zZ8nxTPv()Ry5j$ETY_epeA3iNHqAH6M`$Fjpt(v6UO8Fyov$u<(sp#7B+cutu!kPq zH)fR;rav#Gf>)7OU?;zxRf#QLp9G{1ydGY0-6qfRq;-poQ@F#SQAQb|sWDl@2)DbK z6aL&)%=FC*44VVI#Y~;3d=}twhz!Y`3h9=1l4UlU8LrB08QFv%h=StgO5sbZkBClF zp1a*?ZqdXXp=10NYZPq`Dq!rkpBkCJbDJ2@ulT)U7!(jCcYQN8HbzGi3cDjB0^@OW zLpbwtcs*7Z_K(M?-Kcv!rL;le4;BzzQZg|d^&&MbeVPgtxU7!Xi3;N^{Rqr!uUAQw z+%6*E50Y-0wkFKHc>&E~pj|E+V$MFZC!tSj>v*-J?4=Gkp~ix2gOO0A5WRC+U=3k_ zqF?=~4)<5%%_;A(uiYx%YmBnH@xEBpieP0de9jM7F5vZ%Ke(#(&e7BNad$stDXXRN zdW|&mMAH-p68kN}rhRi3o_>3@MFMZ)jFE;H_b|Jgw!iqJUwfMpni6SF^C zADsVdFv#{p)TKGwF)>pG1y-PR?j2Hnd0)rtrU%2d!$e{AjY{*tFQw92Xg$&LbYp4_ zg+mqTb@iJg}9oCs=_t~p(*NPOP@+mD6jKe z3>SnT?XCqTuk?kS1XUxi7@ukn15ONRf2bgi{dt`zQhE7P9K^i%!LvN*GX;da7p}z` z&~|y-bNI^ZdjXQefDCkOA70xFGVy|Tj*123ic#B=dIkMO~0_PpV>Sy)D$nX zJ*!zin}ps3v5RxEOaI?U`fz`LF?V|LJLFTjhtT z7%cogXs0Z$2L5-Jc=XTq>F4JM-hpS4Jvw2wiQ%+;8+U>)&U=Y*zvaqp_&_)=<-gpO zEkDJb%{Exn>Dd@Ar4lHiI)oS8q)k*7Xf5Fey}+7Dq%CDHk?8WJpZ_ zM}!9mKADzA3r5;I!+f$Fj>gdWozw8~$NXdKPraYSM;R~pp4fU%>=j?*^R=wi(gLci z*e`U0YM0`2SiZ_q$%-aaW-5QJR1h3bP)yW_6hKg5U7r*3brzW+MIC`^)G{JmNi7sR zS6{`S&T>!3&8>p^Gg`TtaVo@&gbrE`fY+2*J75ruf`@k`TpuAvVf7bwv;+&m2tYqX z;r97_mtXw#eog}M#o&5cLPr`|>>nyt1IxAiE;-(W9GhEaDw7*X{4y*#{d4Mr*gV;@VqH(>Co^9 zx5vo;_msNyTJvXLWzAFT#%SVRUy8JG9M{Rxc*gi=sOO3X$%>ggoW)AM}lCG$+Pdv#CoqZ)orPr#qNJJMxPLQ z%ue)e_ae>DcbEk4oWTb^1a1aZXYL#zXvpEXy^mJ~wY4K#S8Z}cmF4d|S+j~z6y%3Y zg7Z-wl?8yd|oRlz@P!_w*)mwb{iUXHA6!7U$)mAa&Gk+RBdPAa{Cjoy>kL$rwqPLjXGv%U1`0OEj_~5=z5@pI^ZFgCDQ9SGjb7v`I^u|)e zCp|7p3J|N^DJr)4y_!a@TY0a?ENLS7x5OD~RbFco)8LDU843Y_7wciB4Xhgx65JRJ z9;*3g2HmxY&BOM>ht(_PuhP55)k84HZh3nTM7)3F7;@Q#OEuZ&P?f;4I@8$IOhuOf zZ4!a>mUff4>h>k(>xzVHa^lc>3r~&r*Ddoj#ZnBygeY8-786O3=lKcAHvGXs8f9}i zj9V_cmk=OzW^kZ8isb9uapb|Xxu8c4XuNXbY!4W3%h%s%4k5SNDvApzpoO!hyyRbj zc)h?(fEiTKLh77-#5vI6DDS!i(G(d8X%YWq#vwr=az(tXt#}-VcLVjKtQI)6?Rx2#^@RUNAr~zDB&SQ{({@ zD3-E!8aya&j)aH)P6`m*5c)T}$WS~*LC@W!UhtDM^QZ|7NZHSnQRO>_CBLh}mLHJ% z1WZ)i2inshrgB#+7_>^^#msaK$q74!BBVik&JkCsFC=X;;F%nJ-7k|ngkUwNHmFzG-g!f?l&vrzSH5j{}68jB3~KdRbXbd*Y&bG@E#&g89b z9(OIs76P?SwL|2JJ=7PIs%ynzy>Xl{N|t4bwvMcb;c)CE(t&^ z-)&b(_4&|GV=(9B?^w-T<8a8aP>TO8Y2{-8*^~$C&36Se2#~r$0X#-fu^Gf!KoA46 zZc2&VCkB*QsebPlb@}mOGBcqU?!D}w4Iiii{UN--veFR zgeiLdS5s?+FMLTo)gM0sWPs?>%e~+mfHlhCCNg6UaJd1fp8(t?_vHqD!Jh`#{AUuC zs)@47Bp6weGCfEO=$t8tbv4*DKB^lQh5b(Fa;Y8(Q`j)yG~n=533&+DUzf&qF4PDN z;?U=dV)BHXT{zee=(PLY^z+~aguE6frD09^MVyL@$pm0H@_Ra8s5A>>U7L47IVZp} zjr@cFn;+V}qL0M~b*MogfDFRBf-o0;=lUX&&}HzGn{IRo4#)B9MKJy{2|6C(J1t%5 zSq%|UtW5JtG3uA%^2pO|ulJ~F`v0f9o4hVRY>9u`S5syZzpfIbkawj~-$Ah^=h>zz z+@ys8HgwCyriLogqwLo$bi~Ar?CH1_G*&EDFeQt+DX^Eb1J zpwwYO-RI$7Myo#3S;L|4&IuF@B@&IqVic*;yD*1RYXE-Rlj>!9n=-iG^fpuvzE_+P zf*Ufl1jb@O1-fQZBZfukrU*&mfvqpEIrJV18FY9Fa51H{rnI!9urRe}8$|$zmtdG5 z1W@z8n~u#pdHPSbY39uju(R%eTE00?+Qm2ZkM-LQTE4$i))a~=J~EL`O5>R!>QmR+ z?{WoffT_T?r5A3O%*sr0C=S1WI0m(m>bXDTwetIf4P!X9Kgm>x<0jzV&u!TC4f#+J z(;lbzEnRTc#b_f>J+X9JW*+Qd{MTErXHP*2h1)V`H+CK5OIZ>`g}tL}%FqjLL~XoU zv|&fwL%8^uE5;2Jdfhn9lQp*0U9pf;>%Y?R(TF}kq@{|+wd9Sr|w0}$-6`<7vQp3l`NQ7m1~3Iy09B;LWLeUKHDDRr!TSg*_A4` zh|_Wubl@N1x28i)Nn9+#;y@K6#3)WjdGP#|+ev+Ur9;IX}&1;!u*++h#REj3J+^%B`N zXXSc6Gk_f}^2@f524*mxWsupk4_r9COFpo>aF(Fp-YE=p1~{bQo9t0xN7Rh>vxas{ z3qt!ebl1S#Iiu9bf!|z7z8#xdl?q7$$liACB|DlYX9KB%V($^7T|aL|Dd_%9U6$hY zQRii+e^ic4`b;$Z?(UaA5q_1tTBdUHlb|nO47U5kYHt0Tv{%L?|Q)-F1ctN#-XjGa7$!EkR)vBc|)g02InGQK}w8 zMJHhpEdSWOHw~6dL&O2xv?UH&2|1g(W2#GKVCMf4!1X??)R_E}hWE}Y?brB9mcRfg zRXIx_gp*-;`G7s<8I)`>sPZNE2AjnCs`EpiuSc6rX;(}fB@B0}1}F~PW7P-(0>XUD zL5!tCdBOot-SstgX7+yq7AuNw7zbmVp)54M6pR)9`)1HJH*#xP^5U^Nf9{e~5& zu4@JzS5}Kg?09ki^_ggSkq_Cb?A_Mg&Xh-9;Bb@W23At)^m3PE*Sw^%jTSN*yuBA0 z-gSGNYduwvpTGKhFXwTpevQo)^B2+fGpa}-ZT~_5X~uXC28eNEM}-ijYZVRa=WmlRdYvoq)JFXnSv zRUz4hwA{EASRlr&=Q9b3Y+Gw=o_xlXu~=dxIQ^_~C#z;$yNc+a`e?uUHPCuBQus`u zDLmO7q8`3^?~$?>Lm($T;wBCetFjDE1;AL=P`)E z1R*2{29c5QOwB8l(-@PCmNsoCSl6EW>iw4|Cgz7&|dMn{pu<3zj|U0AaMar zV40`Tzt;i?UacMTKuq^NuPZxH;R>u8(!MWpwwmhm1B-uzVdzqFa-dq zh2;#mFM*O)wsB!%uV;9C!QgGw1;26!!n*PxoA>LUd;Eb|PTI%KOXSMSpUKF14fG?}POtjjhZn4=s=rjsDUDHG!ePxNMjHVK>TL=DoA>SL=_Hc>(~RK!Y5EvI-ZziTwHn7cvm_-ploAQfA95NB3A{K6GQ6H8pRf}>df#b`yh};~x!s|PXs#N{ zrfY(0qT0EXqsV3st&;B!MJ)5;5|aarm814VN-q(9k>R!ON_p+442?f(c<&x|xuyLm||)pNT@I^+9{m zvUPf*GZoUxj5F`iblVc<-l^eb^bk!B>u36g25EJ}LJ7h!L(6}+`WPQzNyv}*ZZT)6 z*e^)8LTfW(vOjCn4Py|H`VaW)QDwiTfb~ZS*$jx#51N|jB)%q4EC?ujJUsc{liV@~ zrT&eSuI^9l{f+}z^*TnQ4TrVMz%XM|q+8!%0j!c_WG?9Zx4n8&p;s;3-KCU7ycDcDj3&#;dR#{3p{ zwQMN24^Z-2>^I?DG$^Y^e1W+#SjzCUAMdtPtj7+@Sf5V$TOP*o-%`6jp! z=sWs-xtj~i-kQ=p?tQcdt18j-;qiCD>n+n1aE0gX3al_{#{y9 z@!=3P?o=_w4A>!S#@2Lmd7*-3V7r`fk6N+q&*mKEhe!5WB+0aQ`bv)krQ(FA<)Gc* zW`;FtE)!i%9#H%Z0@^(1Ku~COU$g@gni(naLD9L9I}+etu;iBfu;NP!Fgz5p2*$e& z++akiigcjt_vS;eiAjSD?}sv=sK3hv<@Q?`?z`uj&qwZ)hxK?x;}-*IsE$!038qOGFJ@Nz;}z;PED66Y3gBc62+CSh#*V9*lW&iwy6MbBV;*CY*E42P%+31L>`Q7B87t)|zY@nVLjRsazs5CuUbT$9FWM{FE)<9y_pRJS3`{0x5nJS z8dsVG5(>(WL9FEdiNw~Z0$hj%Kz4%5WrIK_#b5gawi6-t=4ic4ln7)7DQWEm5mzOB z;JVp*1PFwE92Ej_E}-~$_^K-|*zqrzbjw@C9{QYyL$Yl|K-CRClh;=K!KI-V^R6H# z_jgz3$ClXesMJiFlsGAl)lr&0*Z4$zawO#v8(28N3E?8R&YO*>|6~_7Rn~yhs$vJY z+*`*f>RAsty}gM~SMqkhLA5~QiaGyUEL(2_J+R!iv2IO8+@c(u-a=j*aaBw(Lc30T zo#vX5DIJxKe$cq=Y>oy1A&r#GnET_E+vj)HGtR}a1Hk4{%- zWIRTQ1vvGX69>PwEuSyGov?WveZzpEZ!NquPa3{_XU)9C6crYJ&(CkRioVbs)1P0s zpL1BTjJniy^&6@)WS3IrxvL>Zc8GZE#ioQYODdI@a~>F-r}%gwn4Lw}Jxbr8$@v*C z%#{C>ZZb4rIG+HYiz8P2@S;&e0ZS5Sw7n|0k>Xr7&_yTH=&XNw`WI3w_)Jp_bbz*d zMYfdXi|erV22o0JrGTx3@Us(YaD$A82eRC$9ZL@6UY_Am!cL4IJs;=qsjOZfb=Kc_}UelOVVE8F+B-gkj&6{q{&=4n3!P5=n#{?_| z_aqEby_~?|li%e>4j5)bE*fVmWb_1=-!zR7Q%YhX$(x$Fhz1=Vy_x@r%}d|I7~H3b zXZI!d{U70SGRA9hcZT*evZk z2x0^MtK5W@t7YV`NCm_(!=3sPEzN^H_7DGK)p9wV)S01f#(qNma)FSF>oyc#4hNuQ zr#dXaIk}5wjT4QUUck^199s2=tqkXnGJJ!ws<_bhn-{Xl%N`7u) zV>?kArq=vxHU|oyS1?1+YuI84*DheKY`6i~9tIIeV6__Hw@xBDu6GVxjHdFu@E0z9 zJ};YmPE)KdnJS~O8c&U1vP6?c4E+L$LGt%Aq121jjln{Cp!~S7w>$5!3-P0H4f%Qr zUF`#_qy2mL@b+oQXX4`4e;~PP2aG>Hi|NLMOe}4YkmKEtyS&~h&Y{fKyrq>Zlz)Ri zg={oqpr^IQPwdYen(3?YlHw+X8M3G6@uZJgr2e8`s&ORu^Xgn%9G|_v0T&H|3y~bu zr$34#%oIL80X<&Sc?^A<%^;zWahWUds__+=1`~7fyH4=^*-{h`?grN&;5H%1zokK- zmxOV*yu7@!vJxxH(L+*3qcSFPQC1|-T9f2B9|w6TWzdvp3KpLTHPZrdcb1VBn1)(S zZtaFt&(Dh-QPxi}<82xg=B0|N5zun5snSY;)Jt;ElJxN|(^7y%&|;YMMw%uWn{uo; zXw%f#8zh&c@2hn3jk3Dc<6&(9Q)%{$AVe3iRCya+B-U-?*ICSr0mq3YT&(H*i7o^~ zCd;uGj7JcJMtdud#%py9%Q<=cVG2vNp4b=QP|A=`i+Ob}6B+4i234umB>D$2lEbu3 zBtQ*AH3IAU%z|lXQfD2Jfsd3mx^p;LjlIlHK)8n3XMVzBHkx_xZ>`AvSO|Ny?;=>l z@xBKz!mtAkHe3W-Q0SnB?$Gem@)F4n$*RH)vt^46NldyTB`8_q0A75Xd027a#(b3i zMLqR@y%rNi@}K2J`|`*SWX9|z?#JtcZCU(BVn)Lgdo{>{4fvoG>S_f5a<7t)eaK^Y z_-?lhHs_kOdvWgjy4O^D?$pyj5UdN((t^)dcE&`@|ImA>#z4X-DFrXB3crIBwVfmY zX9kehF1Drwlz&A{KMQWo@Ifx zPiEn11@4qQ95?$%{PKgp>byAqM748{Zalj@+S?zi5FO<9su<`+lr%E%2!X71>r)si zz+Cd~9do|F<9oqL-}Q_9C@EDWp~E&ZzjG(`4&`jqOktJKb~?fNP&2NKxFmU9Z9H0w zIK4#?zt8DEhNbiPvnEuH7o8gDg=+azQbRW*Ivgl-$U`l&nj0;Jqth=@RY+-2i8*vG z*J8)$q?Eq=A4S*U$cEQNBO;`m-hVs8>+)LyMo)Gk`ps#O%Rw@`b=-bHPtYR?jC zSN-g*R%^7z=lc)deeb^e&b{y4b6-zwS%`f0FeM55_$0_zO3ho2;F>03!Ihh`=By%Y7VgdrkMvQ#*fUn&dseZy>2Lq;$%F;-8tFZN zL(pcC@rQlWL7av2yWq>Fkgah+Kk&>W3-i}R^-$j>4h)1V!oRWS5XI=LaRLg(KZ?YW zOyl0$&NpRls&d*D1i4~oj?Cmi(K~G)ZoK(*eA)$jx61JDl9U~>(~p-j6nv}fL@$7E z1y`g~YP{kJKi9naPN(>AD!K3Qxor*sP#wV+rnYx{z?uv#3m!s{sK89tzpp~0xQmB* z8tUGu9B|V0A@~N@Zyd5(fBG@c>Y$Z`m@9&IRo`3T!t1*%;|VXgFG#Mtv$zA;nSxiA z(nK*F(hq!$;(FaH6TjU4>3n2iitWS>w2O5S97fIp>y23<=c3?BXMC3%6iMG-c1P>E~*>zhY(Lra&Cc*e#A35jP6*P zFho=^6j&i(CWBv-7{RC&W<=hNPlAdH+(F$Zf_=YMyM^NPP7!xRwmh`|+s;+@F>f6UVb=%C#6Yj#$y@+U%t|qNRZPp9UATff^PQ8e% z&HW<4gj?R3!Hv8aDvp6*7I124ascCFf0n3X-BDkdt@(8HKppghleC~!i*{_#` zvRF+9p{3Mrm!0?Xm62qyQ5-|5Vzi|$SLK*{W2S658{YfIoxXTrfohYR~*xbqDz=x_6esID$ z?|Z5TS2INy#y9$pUGc;HjbfwguAX*R2M<{kCjL8i=;AwBC>i#I({}~XS8#6Oc^)lY z!AMLT*VFabn!}a~3Mphv+PRA~vHzG}J)_S?y58k%MTeET{0dG%ZG`uun|i;lvI?84 zVeix&rJ(1<$s>@yE0LG#o3CDsz8y;Ek^`FWKL`=lYk1X?U3xQlIZF;$KJz9HX)WYFZ(Pj>0EGTSz@Ai(Rz%rVZJsMR9#33|W8tHBpBd9n5hY zC1P{FUfwe+;QB^HC(LgLMljJiGQ}>1aq4?HM(x@}_}R*6k$2O+3Y4W=TC{2-hL4_Q z(#S$YEP7nxGt6Nqh%fDfVP;5nG&KT+6+Z~?H|)ug?YtutFV}}?wCj(Z?LJg13>PI~ zVNm&0Xj*P6%wJS&Dx#Mr@ZE*xu?iMWX$3H-GK(p4r-&H+tq7NX-$cJhBuh)sD3 z8^r!H+bewjebpw#@n*G8%0wd@p|=J2Pqv(deuIWX6AwhCNyZkd4r7$U{h`f9u*xVH zogZgS^Lubvc-VRZ1pUD7!E|cLr$qnZcV8~YC|8yBchtG*!$?(IG|#AP_aZB}9S&Ju z6g*Ns{1k;S&nx--A3gE}HmVV7JFEXM)O&GcuALPHaBg*~c2mecbL+Hfg*$048tFe{o zYr^Dg@YyN9{Xq=7l?Az|Q37$oy)}FJDC7xr!YV4*SZ|ts(3H?||K4zi}yO+1mP0I!a@j$lDn+?Tl_X z*$5Zq{Yo8HQxtNm!}CM~ zhluv&H+v1cq+vkC35Z6c&h>7c-?J_q>1f3B**VjAL>EC??|Kq{*VXZYLzt2l_9{r? z_Hs#=VOo}*Z2Gkn?tMix&rD-I7r(yv1nj&=b7&A>?rX9Nku=EAS?McFi4pza$Gw;* z2x33mADCA<1ir^cPxj2xvMi8G!&ll_Tkpn~pQKTQM7S_YW`B64rQMl_kK?V?+a4Vo z3`wY|CSjqsGfA86IkrJ{7nKM`U`F%pj`^=9PFQT&p#W-1$gpn&rU8wBu@Qcvm^xW% z@J!LH;qbS8o!bE?n-7DKTZ#&W|B$f}Tm2{?*BS6o9qTr9rqKz9JQXYFT^{2$$UD;g zqI<3$2b-$+Ap8awe)sR=7+n)h&Z=m=Vd?#RRT`O(a)CFcdrP5KQ&xl+C7 zOek2No6Q--%X3H(TTBJ1qaZ<>dI#|Fdp0FZ>@;)qEl!g7< zecSSTZ7QRR@+>E(_Dw_EoH1b>00o97%3ZxIA=(H^z7*}Xxm*Zkx1ITejVOz*E?{6s zd;2m%QM$5J*1cYNYy5a{8hgJrZu75avA_U>LMw|@}O%p}w=c`yza4e-tHd3elK!m~i6OSZ0MUr+t`N2k21?yq# zxcox%R^fj{8gdDjsDHF7v^%85+tm|K~I75g8l zRFNQ49jyX$<5!&{0_T)ig!WK6b`S2mmUBt|5@y1APftw30|5=y>~e{wKfR&kO?t5; z`i|MxS<)6L8k0=Am}(e2g7!3GtP5=e*HvxI-*@+JH`NQotQ#64rQ2V#7Z%DJ8ontt z`u?Oev-w`2XRuJFw8_>cDnwaIUEcBa)7QHLMpl~jLFf!M#IjP7(6V}6G1`GjQ|dzv zQ`dIK+wJ{7n+xTK4RKdr{Et3gd}(gSk#7$w9^EK9TGBNO=Yk69wuT`n8or7VNPGNj z9l2K|g~w5_0cVU~6%2#kak znga%xubJE2Cv4pj=swPu2L()2d1(zb2V3V5_6fWXtE_h)PJI5+V*G5=w^I54e;O8y+XiRM|TE#JZ&el<4WCW{3cExQK-gLfS)#u&o%6is%`qc5JrQ48xw*3?@f61IeQFz;G^8O2aXMDcd z=hJ-c?+ua3G7g|6ugL&r=vm*-vz{RVx90xm?OOl**Y#BW8K0(&z;T_J1;pFh&L;wN z)ClK#JK9~y>T2OHT4^fl`7{2};p09CWqKTb{q)PdNZsVW+wibepmJ+@ zIyD8~{hRhFR+pdf1)>EWwrlG%9dXt~2x;n*b4B)k0moz!KkoI~UscXlcjcdtDTE|pV26x*nYjPwS^Ao%Hw1CIql9ZQ%0xw-jCh{%`n4*oGKK|VC> zq+4g;xH`mnQ~!U|^oU zHuJtI2IEi7w&koEZKhJQseKz?@!TwUzNSznQE3pe-UNLx+m&c3%nI+9U25rH`&b{hMP52iWr0P+C&`C4icc7FHK_q5>4S-+pf;XL z+R6~NvLEQ=pgz{_P$jzDZwKPEe z?c$C@!t3b)x-r3L#+2r@c%9<0RTpC2YIASOO*%i_zbYM4sBdA;VT^7r*G zVcL29n|k{c7W7U;N$MakluNe+a#}d4DjDck^Ted(;w{1t^|$Ul218lCFp-DYNJtmI z5I5|QS7AthWjYD4qi3`yfl1skF_5TyC#C|X(veEdHM-29Aw32lbe^;+hS#(}TnX}?Nf1Ew1`5F*5u))?YIGEG#aB@MRPjqVPm^p#C02f6Zv zxUxeU$t!rbsLBIn^ns4TPMTL`p#1y&@j zb+NQ%H%t*l|A|7E&;l7jZ$%|d^=Zfa?dJ|{sWO+V|JzEUf`VoZC4g4l{;&oX7ZEUm z3V-XY5t6?7N>-$PxUyyVA_{X>V1X#0be>Q_=3=ZfT3w13EYH`v?Kw1P`8fh#iBSH0 z1TcqYonD@4DC^9BXher0YHLitO}{bXVDKMVGG&4&JW8jCLc@lBN%_fW5gDC<-!(b3 zXYuS9r^uqYc%PkE)ld7VrN1HAL_EYYv4&K>_v!&)k9WQ+cvq(8nIYc1i{LaUQ;w4> z7y_#Gj1D=@sRQxbV|X<5_`2Cz00k?Xv<*;W)+AtG))bW?>&$ zrv0~4rPx;89fLmdBXGV8N=_}4!g({9DjudXG&^`@ijirs#TyVu zn84pcvcOhZcKCJ#FZYz7q180KFi83}L6ssLtZqP9kY8umPf~W0zU{DtC|3my{6`g?Uw`asZHk=)1;EZAh&Qo%)IaD%Lha9z@0V z`bUn~;UII)*2coFDcUH70)4Lzn2xg);yXEnD^jPRps(?_=>4@?;f1EAOg386RzD_h zaxeTPWof2oJ>u#nqeF2pgL!(iJKbMJ|NIxy>G5Ve<4d1|e6Q{_IL^LQ4+Ba9i+Nq} zuin6*CmD7cVCQ>**>8$$->kanINyYz@LMpWS5Ay87N5oqivwQC!fC_iB0S1}h5C&`3F=^uAb@b1>a)jm2?9^*Urd`ZdJLB02t@ zzOO}4rCIV@%)5~c1O^)ARhjyfs6LE|7PRw)Xrpnq9cEi#L;%Kct;k2ow?zKO${)P< zCjq#_SJ@BQdllH#(bQCb?b?zrZ^i$1C$J>NDA&x0D8>{T%hIu@|5NSaY~^HHF?KuW z1nqW0*t)`_et4}t`;zeOE0tSqib=i!ta(CGBiiX16lk8%Nb+En3^Ys~%1ZyeO<3^9 z4;3r}1ysehgsI}1J#;EZ=6>6!9+&o(LQhlJ(aa&1LPNyhdiA{Rf+{%L2=cr8pI?=y zylrO%U{U_>Cl4!ydJA5XKRR~X*{1&IioM-nY|F`FWOo0OOH8K7KuFGQU?#yM6$UcflhUOpG0%49f_$}*yjCmTb5Qp45bxi75#pi`pc1Qg*{Y-9hHcxU zGo916(Z$y6>4pHL3<3QUb4XY>=`v+PMD#LWQT$}o(3{pN!?}PgkDR3L-RFb-CFT#M zZf5CI8PHNvJCR8U=iAKtjLHuzNrU@@3(ddJ5c%0-|oP9 zC5&aje$P%FPo=ba>PSiaM9}50SSpQ#+CHXs98cm@ySz)1uih<&QXMefcK(iY?JXe{ ztHC*gTCkzgBfdn5FV|gZad%wAMmNkE$Ar0lzpppj_Wo3*+5r|*QYA9_TiN3`3M^1| z_(X3T?dyc4B?f86;84jEELHCA&w4&dc=5v;r_g*rmeW>+4iO0K_Krc6CXri=ni@-u zzojom4n8QiURYSDuylzgoQ-t_7<`r=sa5+rnba4uR{-OC*(nv1bz;~@E|9+bZzD24 zXe9Sj$A!19&|eKy@G=p1BQ@*sIREyom@X(iKBweWR^s;RH+!=BjeX(6aX{e#SK~PyK-`<0W^KTq2PbX{T7FhcrqOP;EdzFE>776bVkCXxFXUd4y5Uo@oDd~=SPQ6)Z$+P^%*+NX;Q5Qy7z};rTismBp z?v)NAQ7#=x0PL(yqQ89LB)PaCCoD4T`gzc_`0umwuMj1RTnY{$#p`lID#`5L38lN^ zNMm*=#l`_P2s5u0;p5`Q^^00se2V4nwghsU*o=Z%B!9I9}pD3}tSj~lY_;B0FqV|qG&*1iHNxyh1% zK&xeFNq2eL0w>%@$+{vY8f$!%Eb?0|-;NZ`5EFVDUf_t$yCbmr>zY5%ILmVgOWxsO34QR9Cuq#XPM z^Xbk8ECH21gl_)I=F<6HuTOVY`=Ao5Oj-oU+43KBsy+;Xe1mK(*G43@Ft0dL&xe;# zkl29P;F7K8^It9mAj&gBtATXf`e<}Rm?M`2M`Rpw-Zp2^@>B8Dh$MYv+KViT(F6n& z9Bnc-Ty)~aB8r9-U^VGpy0|#n601*(?R`#5UmfRsv-ypqp->BTV9dC>=zu@@Se9in2Rs}e)%8N6S4*z7eunQ-;M24 zuvFVm^Q%iYe5QI%wP)Mes3>~3WGS0ZUVTj5%P}I-NTS+Id&1q@?;*=41b+OIpnG=Y z$M&{JewTuBP#~+EbkMB=BlsXMd;5X3LMp%0BJT0|eBf~oOxvKZ+{;48@8yC(FHSVF zbepPy9d|K0I)W``*a*^$qs6Qef^j9OH3~ZoZ4VchmOv3t&aSTe)u{@0{MJpo$E|B3 zJLd1rD%4YL{QUWc%QQDw@wz#l@v)A&V7fpV#cjc#4|)Zt{@!Ov+i1f4fQRomecUvcXF>k){Jp=*-9=TW@OiOP;!l9Kr3~ zA~}chFX^UPe3XB0e4p@SqdcYeUb>4eda^_~aAJz=doiFIOu?>#B_d3d$$`iiaNG`rsEeuqoaJM1Bw)4sdBYN5UAD zgnH;VW_2EyPV`V-emqr<%*9MEkoRF1 zixj5ac6!%FYdK^ROTNuMAZLw)?E30I+y43$hpV^^Y>S8h6Uq^`w=414b@@r&bKr); z9*LWe#odc9bHZ>l(x=L!QC}`<6XMd~q4k)mo9pKfb)Cb8pYkxqeOEeNF|K9lGvYng z_lvm6?XqJzxeO2LML5*G0R^ z1@-wqjy}Kr?~Ks?XKflD*Zr@`q15fAH^wl0mr;z!tGtKx)%m@s9bSGdsW(Qq;A0AP z6+L7zGqcs|4VF!9f1%D^0&M`Nq^1HggyEt(Id}~8|64^P0h&Y`5=z2+e`S*Jfqi;#a8KUdVz)73Pr`xx%^059?!% z?4j zEOkeajYo^ayz|AH=+GCqLN zr2s67=R>$GH62>%D{k6hcYSHvVePt!>Z;EK4=^(0%L>(3nfZLYJCW)&cVkt1sQ3WD z9|VC}AitcOK`iV>EbXQ`tAi|EVY@1K z-ib|Ks^L<_x~W1&3W}75ETp)K`n{YJH{_b8!uRx^x+gC@d)HjRE~&^;@eplu2ctHj zm45k0Wl|j`jOy1xiK540M5RbrDsZPq76O%%PS@%A&3~PvspB-M>Ga?^0V0_kA3a_c zo1b7uHD~8;A%s=2Z7gN*4b^WIx}y1{v-eT{qD3)iT0B?^7zJT}XpmL>0m&{koKA`# z0BIfJR8I{GJ|J>$crd*3xI4P^Au9g5UUzl9GOk5jq}C@n)#pow{7($1(v$W*e%GEn zbxM2d$E%3xlKSw7h^x#@6E`BRE%GAVE3Lw#P^2h_^L!@a{R0>~CKQSj7k#4#BIYv> z@PEKxI~+&3BLML9Hc9L6C6mh^qODyscOm!?hMiob82UjehgwQiq<{bA@Z=wP$N9B& zb;FFY3W>7&BS&j97@hl8WT3(rh@LXA;hl2k<3CIxiqe`w{1%%C?f?EI!46-Oh`r?% zx@Vi2BQ5669@(9V+w0LWl|COxn(FuD@x*;ioBZ*^DRiF))58@XzaBo{99BpcQzp5s?n1Q2Z=NNdo=5D!Db( zbyL#FM`5<9w&oysAx#sTxEmfLrB9mf@O*xw4+27}quh@opE*IYyc z!swe5m*0oN_tMq&>!J~?XiUrz6D(K{X@k3LBO1bUKBQX+!q?^Moyv$V-(Tb9U5#L; zX#P7nedTZ};8*%!UZ;NcDf^mnw5sKA8W={HB&g0unFK}vg>Xeo_`#ex(JF5?I=>^FnDWvXv5k}902TXK(| zXVpT(`jBV~TcSrL>@KP#iuGbiD&syMw+};tvt7E%&Ov^UAPx@>DEi#wMx+c{xO*JL z44882j1!bpLsi8d4pBIB5LG>QJM2t6-3Mv)jRLZI1ZI4hKev7i42`FJOUWQ$Ns#O6 z&nFNA|2L?d+Czx@naDanx1~^Lie#~xcLUh*L8dxp6K|-1%#FVeJgqoEGhL#B?_B8nD6n_GN68>JMk=2Pi^Ge7UWk}6({DUfs;DsIpE#( zZWKGEgwSQTS8=b$NvIe(BO@cih*gdNm`RlKZS3Ytb8}iB5DtKtE|Y18lS+6=b+pv4X?kB8$95R;S**m?YJ)AzBKNuT3IPh!&xeDSB>A=_!m(1@rhmsOjZ6nZj@Q^VuFi3AW%fu>0 z4gh*j4yqtcu?*dU^YaO61tX#ZKDJr_lcr8;8!}UyKRPI7569yDHYSC5zJNcdQ9BM> z8~F!X4s;j61N{nCw)jq1&Q~PelRTwJLTM z5o$H>j2VWrW9~g_)D!k?fRn749kxj>wL?#j;?jH$(&ZY}%NUELbwuU|d_4Xm<3v(p zskbd$>#%)(Bp6TYfbT!E!1%EbB8l!PL;UAGNM&{Wl>`xKt=>Hx1;yK-Je^-?)q8k$ z*Yq_hZJ_)pE|UcXE{LzZI{F49WE~Be*>1#MW%kEvR|=}blqp%v8MEDH(do3c<)mTH zO(a2bR%iqYmt-acz6S?k2v^V}sX%AVOHP0MKdZA8cv%eVp zt6y`krqA6V=qAhT%m*-Xd#C!TOP+X4zG7a>{q061+u@?Ss58CN-|vN`n%Hx?tiqZ< z7gfIY{GY1Y>eo~rO9rJNjZ6^+Trhk6_jzl*SBP{0%5q1B)E#q)Fa+^j67jm{&R37P zKW3gJw%A{*w(+V(39_7;K-|54y8-$6qcGAi+30PQGFLcan5z^R%>_2$vjPNzkgA>U z|B3K!oo~(n#N2-3HxM5NN3lupcPBm}4}6WV!#%*N%AE9aAdzgMryzk;kGLkXOz)boEN3$0oxQI8$O1GIYNRy`6Mg$ zC?di>jkLFt1VUyuak6g4B?TLXkHri~)~8wi>&)nufT4n4Z+a}Sr6{|CNWEBgw8~7s z5cs+xVe917Uszti2?oALyLWZb0g}Dw=ON|)R=N{1em!CW82Edd=H398cVZ4GAp{g4 zNlpw(W9&I5sIk)8%P+?jMn=trEBx+3Ol0yWI{XWMDZx;$Lq`U};N4@_mV3v8M#&WBV$+t>o}$W#P|W9K58sMV(Eq`^Qz znO)S`=TH95pZER+B8%qQ?$bSv%4x4@IAEcsuCfJ1`d_Gf9T6L$O8?7@pn`@8o! zqj7O~b_*qPzO1O;&>s1_kB@RFmEI_bpB^9Xe!jl9gtI-f;WTc(|J#!{q6`{QwIn=gsoYN6g2AXMSxj5 zb69;-05L4#4AeTIoikskuG{KqTwJ)&tq7fOu!4BCTIsbx?bu8jlOUq{Z;;0QwRw-& z+qvG3of>Eqo^vW^A`ONT0s+1cL)43*9kQR;8cf8xIpOa*)u^*W`9eL@*`0ycN!CbQ zle^N6;zkL{*gF|7%J9 z-qQ#2t0x3a9a19M5j$tnUj$O0#HzuZQBdlMnhFCs?*pK`)qyN8R3nK(PVLp8B4MNd(H&ObeR*V|i$#oSR? z2(!e04?Yptbyo-6oNOOKQhM6s)Rul(WU+)gr5nv@W64&@-;2bQLVZJJCskkt~E zJt;NZN-%`CI)_?Hkjj=-hJ@F+@X61$Rh0;tbuMim;Lryc~F{{r3RV7OCs2<1FdzKS-52TU3Hot zc(qA*d!GI*=w>t0;|8swi19`~*RZ-S*3?R3b+|CB@}RJkyyb>-=?{PO=3zXzfGqSa*dldF_}AfE*|8 z@0k^Ti1-g55r&;ZakkucEP_||PfLhxfc2R_9 z0e2J#sMtSK#~WO*ohR?_ZG_j@p&;p%Kw+jQU8qlpaUCUnKcq4z>i=5Y%QwEea1*bL z*l6?I=H1T>vl7TB)}f9@8aYgpT)W9dYAzd4k?)c7i{LP2mt!75_7uGeLdt7RdRin8 z9~Y#@vyx%j*PiwrTSq~~t~nm=w`utl6CUFEe=UG4YfEb?pc|v=7vcgMRD@FH3vzg{ z$^-06V$aBbG@ot4Ut$276eg-Z_F9=o6nL+%3?5m6Jxa^FegJIFrkJyj2myLpUExsV})>Sek6;4 z9@^@vGJBd2+c)s{iU(ef-}A^m!aR`pFlb7q8haid=-Y@WL*{>L2>t4U05(|A9B1$GJhrtXGi!1!8VrPq`5 z#N^y_^f&p?a)#x|E#VBrVI$FyLts`DqdT)fq2V>TuqIL8x5=MUB>sL3pky@3Je#*l zLs#uB?Tg?eh#EHH5g0dYtW7Mag$+r)LpkZ*T{@sYD%%JdWZAy->)`Dhs0Z9i-UMjN>y{B>AIr z-ZvX?5|JH9vELD{5(|Yqj1jDFAg&@^209bH(4w1KcYr^= z0iqj8+=r;PzQ1>FgK`dyJHZ%q(eqTXb%ks&*o99$UF z9Ye}FDZU|gKzo_;Ud?4??wcFGhp+n8uA&#d zZ!mCY50gbaF)(=6$vXHV_}7iwujv7Ju0 zDV9n4T%36f9KTk8!cmwkSVAud*%n#8H@-9V+`8his{^8{%U#sr%_a7ivXbCaiq@#UO{(KRzb3Ep;dOg{MU>e6m zBjzk8pU);I5ded$3EKBM!t?^(!*K2)antpr*>_R)PKkvu#J0o|DcT3#(K&{Dq~)9 zaROZg8@=(6C|G+dZ9Yr*BeC{vpO2n3H%cCe^6_e+oG~GXoh4s(oW&|K z<3A$BJDcF^Jj5vyAP@5$qbE(Q|E-H6AA^-z8$~rQ*H!B5DESD0n=uq1 z7y44rnz}Q)K^eO~l{OJ7=AxrfLQ(SUlq`pr{5n{%RWIPUJ5yXR^Xe)*T&->pW&1*$ zfO4qgY;~~1i_!WD-|BWAPq;s_7X}r=Jna9E^|gTQ%)B^>qfGDH2;0nN0;13*2lXT( z(CkKpEe|QGVkbw;toVb&y2z4_bRm1vBYaW_IwIfy#qI}Qun+9g4up3<)gwpt?UoO~ zIgq`PUBDB0eR^YO@Jpn+bXQ2s=fqNBVty2a!euO#WobQ)$Us?hI;| zR~rq!7Bb*qCmWKF6?i&~75>t00)V2nhqFcBDXAX7sCFRxeH6Y}0xdO8DiDyJ!OEFc zGkL<3m+Xp7FT)<4cV+>53VGX0&;3y#x_5*~X>;E#I*;PYqm?z5jV_ud6~Rw{X>$)m-GQ|>}THvB+7ikh=yA6JUyMYf_> zwwRavp*PVjq=?tZ^&0>b(kBTQz4wcbCr@Z+$@I@wu1_u4b8(gt7mrl7c?xL|b5?l7 zVNJ|Q@S3ftc_EzDuetJ#$2_@{)>I~56ZfT({Wtm*S zqvr=nW*%3KL!-jT>k;^UumHq9h=bUH-E(bBB?8hIJRG;%)L&9kq(M$cAGWy_ytC;Z zY$nY}Y?59sUgB#$x;oIE1C5L(w4*{vm-{tVe0P=5{vBlhWoN-fb&vegc|X*f&pOqK z+sI|3z!v@KBy{vQ%#~Vwem9~IFG&VeBuECN2-Xp`cEgRRfSc;VQ&ZQqGiSovnlgLC zUpajXQp$KPl9{e-6hnwsc?7bpL)aR}1j(#yP?sZNJZ{lw*B|unH6$2oB3RtJi?IFRj-sxh~aWjafkS1bM4FmrxEY)CaxWsF$JPGwCkC`8kf zTr7w=I0lJTaB-%+#JBZUP+(kjj8eES`#GOSDw10jzxszT$NDmb`DH+(ir|_IjX7ldC7>G!eM&kay@+!5JMB75s1M{p zJH)R&1Hh2>TDZ|aVQV4*`f|}ZBqM}LO}NNGYrbz0JhyAQl^qv^xD&1n*{@SywQpm% zDX1?fopG@+Z{(#+XaPx8rV7Mi_wA%Q&sr)X-SRJe8QP*plpPuZPbcs=&47{hI@n7D zndZBN?71-xIfPhJKj8vyF0$op(?o~emrWQM?L>QqUQY~twE8@-t0+bmPeRT_B3a#n zAn((mv{=AjU1D{Eh#67ZI_ZSzA_>0PucQv*t!@!xweRC5GNg{yfRF2WzdZ3qaV0q9 zp#6zEJ#9a6WsUS^olVU!zATs~8(|kj63A$GaemN#u`DI$)J8z8%N{@~M3M28nYQUB zSbhmT#AWw;B}DzWhedZX6b3D(UK72#>A=3s5{8z;K&yu{$}Jp=-Y5=(R(2j2*mHD_ zhc4!~+7EcO1;l}?0#=U{CJ~fE>zwm4L`z6g1P=W3X_`?R5-2u4h)>>#ht+G4icTSf z24)FmIG}h+PdK5!);B`x^2WrXj#|k&$8K<*tHCq(vMdHj)}3VSW=oHCdmU^$SK8x9 z73MHm;*E_Y7ot;>-jPDfSZU}Q3i^sNqRk`V1X4`kt93W+HMsVfjQIy$Epgf65u@GY zM9FR~Rb(HDWZki>6!;X5#wOW%+#~Rg0Y?cPSQz;`-?Ry@ywZP@3o4iE6RsC(-^J^uKavg*a`{>h&Kf|<4c>+XJ#$HVA;PMlm&)I;5$_`Nrw6P?W> zw0cW4KfiP~r!D`8jPQPu!$V@%gdml=DcWHu@T3@R#fGX!lCk!@CzQDC;W+#hd6$`K zZXtY`0{<`ivTO8dY~nOpWforzUr#U3BSVV&0otNS=n)9HL_=LX;G9kIe5cLJ^5r(XU4m~)8 z-IAOq_VOQQWD}qhSQX{`6&g$cfgay+zS~C;&EWf87H)CD(kD+2;7fY9M#Fg%D#dLIq2@DrUs0R>hnHw0=;R9 zn?gdVAc^+-!_Ny6hkDA{{6k(-M1Ti1*4*rI?_Z#>6J2A!YsT{ZX*D0-*VQN-z9URx z>3}7_9>~Z#R_QqPI+#~YudB(i4zM6UGCo5AGjG|B%c}f?NpR8M%OZ_;3s!DsE=5=!7Bqbv&4+pPi_$K1JH{5gElkmG^y=T|Q{``BK+3~+nn?R|AwF@tlya3}CY zZD+@tzB{qUL%G0MABelaj32yx=UlcF(!rYV3NaD9oV1`9t+&S8R{=?h zK>#U`-!MelT(GgBCI5nk=@M6K51#*(OS`Rur0~UG{j&i%}p( zx4w-^&uZ$Z7tC}XSb1OFg;DUdz8#8O8Dt7YN}~}=q^O^|?5x^98DD#xR_bI^x^e8x z@{KmDt@k&&g1=cV3R&!x~8y7z_ehlZms!47jbrvtdw3 zf*k_Vx5mp3b-~;rKry4YVsh5_=Vc5Bers2ALBhd^JF^F8csMUp=5>@OM?}2|yTSXf z!~A!z>Hly|k+yHz`obtLd*4q=krB6-?i50Y08vlIT27#I(hg{{lEqNT86h4_O7Bb9 zmKTz5G%~rulL`z!76WUtk_Le*DAl2bQ)U6dRtD05>HDc?B`Omlt7CC0X&+Wgk5A&e zVcbyfX>oKG5^F$Ax6Wh*-Adsl;RHN37GRXVRX^?}gH)zUI)d1wvkXB%JVfrxUdY4I zk382a`e9IJ44y%NL%=btq(DFDgERRPQwHEnIS~+D7>D&%!^G98Qy%WtSJUe(dx{2o zLqjqU&QG}jXaqYCE|*+4(66<{=ZtjnR+N7E9zKcEPekvuLm|_4WN|^TmH(0S-GOYq z-~S|$#7yi>jG{`5Dz&dYYNS@tmfEpv)uG-uA(cmXW$ElPJD?ryjhsDTtK z9RpPSMl9tl{5x4nU|2n3r{=q>5mxgI;YGN%*0M~2dF({%`Wcdd+_}p?({n@{-WDEX z03e($+J>O1y+6SZO>i8QFaGXct!$!>jrPiPI)W#$fltH!8JyFUQ@e~3;ocoeol%>L+fxD~Dg6{cal2 z`Wl~4PcNhJ9f>v1n`OKz9LxkrLAY!TrzJTA6j;dQsOr=l1tc}bl8(PexsZpF#+F1C zTVLmS7!xZwhu9FfrAbw&G(G}53H&!_tJMns7Pd9A%uxTdvKUr*^y8yoS|oXS9uXAc zX=QAPE0tTcyp~L?s9{wfYX-ipn`%1Amb3KzXZ1WPg__ZWDjB!yfbG&Ud)K~a=7BA7v~ z7GGkGKTG1E`XHCbATDZ`Bfyon>-L99@XuZgl{Zh-`~I^NeiWbhN-a!`)i`(Sd#oNt zJPu&bPf#@Ss?Szv94w>3bjrqWSNJMaLMmN2S|0^hdN@r?lV<@wR>&~Puhv0np(4I` z+JVIyAQEs4MN=6-c24ZxI4DtAznfP?@jN0#bfqiV01?tkWI!p3w&G+_c?_nASC|CT zb3~oHls_Ra*#RsaU?A+m<6&JtqiRY*0xDB@aoiQdczUXC87!?3)VlN0ji0aWx}Rv{ z%byRrpRWfJU)ZkpEgK)VogLih2F!_{Z*@l%en$4Jez}=}$@{yn7|5PXG%765Bu4=a zAD&z-*pf~jTs3m)ekPzhg%@03yy+ci7+NZdOOUU+)2(#M%Z@-OM|7MkBmgpUxI zSz~oMRc^QCg^DCcT9)#1+Cm!k%=fgl^_{$E!j7%e{+g~MSn+?EhDx!{%tF~3)~7h+ zMs=oSY+;^weLG3>?4dd-AyMT#+ zbh~;Zu)VfUOuDJsXQaDesTCo|w%pWMY_<38$sWbD{KrPCy@LGK`8Fjh|K)=GLg)FD zji`ap+F5NGt$kg|O z4x3OMQ5z^pMCWpIfY4H9ta~$cXW5!e^AALN-v_ZqGo~9{>+@dDCBu^K^ok^4RdV0R z?+10cM$xzj{H+L+NN>g4dOF1oGkjXDd&YgRmKgl;LPnOesnyB?O-A{Ed9#gMfaMCm z$Q%tVjW>t6-{MT*V(aCo{5}zj-f8e#z!qZ|bZPPLPxA+vDi2>7^F&_r@v@XITF*k5 zJ?!~i1(6rm-@5Z#{Jq|O5oMxswWwr%hIn3hOyRci^IqhW=K2`S%i!PRzgy8~R6J;r z&ysQq9}*%%pWb)Mo&Px+zyNaj!+9x%m6f?TOmApN9{Jnns)nEX)fCfVW4P?@O-U7X zytcpJ{*nC^1j`)?TD`Oh!bEEx699Uq~oR zJ>au7$pAB#NbYyq$EVo)9vAvMZHlAYoD3i?G8=@<&)_v1Sp;j2I%ke9$M z1060mM=h+2S4lMedPG_j3jv`-{u}Xl zJTTOd13`*75pJYVQP4VsL*s%o2K7-!>?}FH3*r%*yrJKauf6#YG?rKwn|xOV7p%pp z2Kt#%=Y9Q1qj=sftOI@ghY~T1;vPk7AUrpVxHM6x`>Plxy739plBlfC8Oenl6xx1b z$LPdcQ5R2=P+@zb@Ce2E2pa;(MnNI9+!Um|o+v4%1c(yk@hvD#)f+Cj<2TM8VoZVh zsVCt|Ajd`uiR^zQ>ZLa#L!yC-lfs!&xctWwEsJE=cG2WPJB8_J-mW4ufUIzAtiVr! z)yLdOj#PDoA^!Zm^K%PIXyYG!4h%0{bK^H}YaN;mGXdYr-RX;yf)22%Brr4mg@_bn zMgExoO0Uen1V+tY?@@ORE!nLIYOg z)6b@bKRw8V)xg0Cccot_81RLz9f(LVgdamY@a5Iu35be@4bugz^LJ)+Nzkq%&8a?#^-7GWN`xBHjlKk@T&ba_YPCb z1-NlSU3|2{t15UiHIzUn4hTUx5e+`%3|Th}pQJ>eA6!e)q)TpBnoj`6CK#B$lr= zv5^!|L51Q3x|U#!yfRjk>5Se?c@_5#C)B!w93x42x}(E2z3gurThggW7KQ`a)ivUv z>|qc!wmAYOXw0Fp$;%-yv-qpx*!zWokhe7gG8*sz?XqYR#nbS1XmuLhYD7=9QzPB` z&B=Ju2-Z&ENx!>eQNcqho`Y1KZM;#nrsgvugvp&GicBgLAb4PoUFi4a#`S4R5!y8Q zlzzR)7}tPXJjh`lC1n1;7+a97xiN+TG#0v{jZlFI8bkE!wDD{{F2dhyLPCHU=H5#Q2uy8jPr+hKk&o;B?qm4Es?;X~W3PMPguD+_Lp!Tp_f_;)SX#LssNh`f9`G^jN;Z8XJc${(3? z-n&QHC8#}z|41F}ff)_7zj}_s9hfk+3~-()-;KVo#E}#o9_my2QA2+5-(^nh>ssXt zCXqvOYId`a9VCA1KV7E9CjL$$4NH{GxQMku>J?8Bw#UH(^+fniR|yd?OW9@diB;p* zn04{_=#H^P8-0P458Ntu<;!5x4UtV4xTQmQ{>-nAAq6h_}zt96X#~>?KON zE-Q+tQ)$Sx076QxLMf_(eDB}z3?E{S7 zw!$dk^57{lTa-kgifqg+Ld5MQA>Vh4RE0+o6N271H!zx=OW7DB{-1%;i~Z0x0#{j$ zHl57d>X&R!auA1&+Sk{m!xY!mfAvI!6F4`K5XIFStQ!@2gsK1w^CyE`T=U92*o;qZ_uy;Roij&c8#LG>$vT zK8k6Sj-{!7O|OmzkP!L=1Tut=0D^_G3*{@6`}gyFq6~KX`dCI};~^2VGkQ8kAiW*VS*lE*buGMv=$gYY ztH#+e-BR2(FVn7^Wb` z>7tQq<=R&=nf6&*ANbM57Tthk{?7J)c3drwBe>)EG!eWbePQ2^wwq2MDSar{7@9@N z_KTa#!XollFTXHBLj5*c7c1sgD@FXX7%hcjBq}1#f1_f8@D<-0i>UuVfSF16=0d#`^R3dlgjOKPf`eFZ`^D!(0--;;yX> zaDQepmv$pPo~^uA_12gc|6f2nS)i(>bW_(|#E9c78X_%+HPcs}y&kNh6oZO6L~&u4 z)L@e#9B{qJ9)lymT%aq~<6gYS!WVD>dY@SSl#}h{37m?Z?ZtyvY*-t~p|$^%COj<< zZ7M4}({$BQKlDg+z@i{acHyC#%pl6;^qB#JS=5uLZ|NYgGWmXb_x*GgnG{hzkDz>aw%14v_Eeq_& z(QqsE(G2%By%7CYZ^swat zZ_Gd6TLSR$A{)Xj&uCOQG>D?%Yps>7&nL5i1hLxF{p3+v39{q+q8fvPz%e;DHal9#`v0L={@Q&ej4fHcy_;>ni|rO zWea+IM}FQFrHMLXiBG}2>x^Z_8d8yE+w~MDfaE=){>d} zuk_Lf9|$<(U(zcukU|Ij@ga-e z48!j7kE^rL zhkv=UqcUySj-Nj}u%azGn}v6OVh_o+SjZd~8`iHpJ=1Z@Gsa#3O{@6grbpA0lrSpX zW!GBi?;IybOD=R@J}H6+J>@l_o|9q(daeW_4uyV}tE06WM|Ry}S3$iYabzR{37=qg z-M>(RU?1KxIubwM-F3|iQMiF^VCxS7rq#V~%<(;E+?j~T2 z29l){bo*QEbMCqb-G+H7fr>~gU1z9>`)#ZPsS{M*jGw0ZF^A;omYq84=`nvV)F>h8 z83kX()G*5XL+nak@8=RYVt@MIq&4&_7UT%oUWH_@&Q~V z${qfgE+#(dKFCP&m5+sauI~xm^hYw&tzOnUB3+J&UHKxuY==Msz**LhHPeBsd>{EV zdEWV6*Q_yLWu3wJuk!cSQpeihy1F5iQ~4a`>_@$79WYVE8VEGCVu=2`Kydsa(`m%m zQb~~VmQ61yyqgFD_g~qm%|*g(0JJ|n6e2eH;+s_sQ}xb)G&hw%=t?0MmgVapYs+Pp zJWJyB#g&xDhRMw+kF{KOI?Bu!e`s|K^wDA-tS-+qj8?!6>uAUC*Gu0c$}CjrxjUP7 zBT7SnIuaO&DvV*<=K+vVk6DKNKYa$mtgt!clsv$TtsUr+MG4c)LnN5q0MZ&OuaB(S$YzGX_+ zX1m(Vq#}IjqVe7dK_Lu!4z4xN0Mjeev}WXOf{483G<50c>Paq` z0=FWei>}k;tgK|R9u8X5q}_&H?>B2-gkn(9rPSek#=}nc@LqC}8=(8V>RWn=8v?ju5rdnvS-jCO}y_IO6Ctf^@ z0rBE~w}|F!tj{VGYfxbiZrR@EK1-o;q`J-)=p+Jk3G}G9-AF(U=<}YrF2N5ggDYEYj&Ao> zq7Lk-@8a57?CU1uqkN!5t(YCd*&<5Y9%DFN8|Gn4F=4-yr5zoGtMBss*5=T`=XoZp zl&nODUn<4uRMr&p{X8w_`)8qsH`ALkx#zO+a;o!1F?r4by*GPBi`YUdy{nN=ejzWOFHkf!3Xcd|RVyOY#75!dllv-GX>zOkgdNgD^P+;z^EnfB4VRKyz^(5GMkW>e?NCvj#Y8hCy>u&IZlY8rT~)_0TOFK3gQKE}6j zV&se%WHf&S4&Iw-Y~%?fQrKzu!s$b3&vLnw`S;7^(0r%1U9p4IsDm6%G_GLb0nJ9| zb1})nepfjXS;qSvst|6M-mLEd|B-)fR{VHuwElhkpQvlF`!}`ktHDu0dSdUw{yQ4G z847+^M%Vnhs=L(dgsprZ2LoN9u-(-aR44I7D~+XOvZaw@qeDn8Mp6)p3f?^X;f|}v2%~=Yv@sz^ENrM zJnihV4M2koH8cHl`*fy+HAD^h&jVMXVX0@j3Uf^20}I!4W<`! z*723rIK#Lah>G7}2AUM5wctAD^31+)tXo#yx&IO(f&B z*TMhl4#XpndGda}&)t0BvY8i+68J(pu31#{EO)%{7k0xCO2J$D#B#s;USgD_m%`Tc zBq3R)ipb9c{M10A5K@pI?->mJ=B7W+bt`<*+{e7}9OoM`=&RlaM*x+|W$u;W- zf>3`ThZcROnyi}~jR4pI;>hF4(^;IA_+8rV(Gyog27{T#l>7Non~)0+M@KETClQGD z6XZ6U)47j9p24@NlT_thGDJ&dGk33kxN#Bh_9}3w)XNTJ>yN5^Uto$#6Ia|?n*4|) zNM_1~oVHXARkY%MocG8@*w)rWip~-*w#Th=g`Odw{2F_Y08JKlpl>3gm5u4<@y zd7M5tNW?c1R{lU`*DBGnJ zzIa7pm*v`^{LN|bNkRk%GsOL}i__PFsZ)J1*Z)7Z^0%#J{WKxv?9=fp*S@ty^eqSI zaB8d><2>^#{A1`etY>2VV(U{Yk<1HB2og|L4F!H92VYrO{(ePujjVY?!YSzMxSGfh!dzs9j!ocT%COqifJyVnw+2~w85FB z__3okwfEZd7&Q_j(k7zrAhExqHwg#G=WNPIm*1Rl7XD3om28H1|PbwY7XM~W<<6o{GLb;EqU3kEIFYuRW|5J)o3{q6SySM%t{ zG}U~?BP#e5{^cbWmjp?ZeW2HqnUYX*(H8FogcI)hOZl&y7Un9rVyX9gBf$O@5C zB3Cfb$7q=b%lDH}zdkU^5)LL+@TaJ*_I#}JrDj+IHAXofs-<&Wa#DxjT{otz-(hoX zU9Rp|!$0LpY^b+NgeJLaf=Kk~&C^&MZddDzRfpmgW@XwleJce*PUBE;{{-{b@X-6h zjV_H1eEl?JBQ%HTTaBi_fq^jNzg2B(EDq9svTzp1{=fU^k9}Y#C7D4Amr93J#2Zh!lH>;>H|3ll0vfKWN6biFX z?ycTA#-^P*3ZL=t3=c-vu)_~dRbbZmdpw2YRm63Q0bg(Eb~r8ao*`&is-8{Km0-R3knrwRQJ8`ijNhKDZEBva4}T3`=Zzq zGOh6&*%;nc-|OOBSq9Jm5W!N!me?g;l;sxi4HETLMOQ@%kDmnV6ClREP2g{Wkn& zO47iwnB=dM|JmRpzD?1dRINY<0PuRjxnbPQKe}2nTK2*6V356m-vf?$aFNgC++>s+ zO0Z~OcPt5pgLEGO&o8m&aWC*|90#I$v_y5-x}_aPg@>PC1f>h-&h*o)H)F z;=YQZ35vc-d3o_+&iL*Efsvz`U>U_ZqMmlOg6y1&wU*tcRcA<}mo|DtT8Qap^2dJVN1LmrJK4eW3R>@jV`@F9hQ%@=h%E|FhnKnWsU-U zjr7A$pPF_axzI5M*>3w>6`Fzt9^Pmuvm9^qT|M=oK@I@T%WpAS_RHT6vz%z?8iC4) zw<*lL38R7T8Z~L;XC3J0&6gsC1!^>iI8gH$Tj~p%nMEwVV}M$zWl51nJEMYI@Erxe zAK>~;!>x^S{`!BkGXG|y1MX_Kyew(TgoG3a|LYh(XcUf%rah~}sz`E`HA}aCCdAd> z0C!d!u&tQp=g61D4oml8pCSNefwVK$==Yr$Y+sQl2aJ|M!KeU@GBIuz4WB0VFUk_= zuxD18KxCnLrqobq-}_I-6T~k*sXZ*UrO}-;z&qoQ+uX!wY6G83-N%2Tj=d=qRMF=$Ew?a6U@5T_jr#{a+cK0tIiY; z`|L&mbjqcQTQHbn4#1^fBBc5%AN{GujYPaH4?YvrmcX4B#$qpMUW5H^ek$S?I0fD@ zFo=)xCtrfy8MfcUOER%g75I_xG4FXb4>`t71DqH{BZAZ~f0jIWPS*aENdq^}qxk*f zmdTdz*m#j2Dn22gSs9hk0|-*n=?+oy=I}-)xMbLuUNEGT{#CJvz_wZEls05S5p%$( zNI;d4k{iw2W@{w&r}+>?$P2tgNS+5-2vtWYDeg9?GsEm*X|_}p1vGmd1kOaW&S zu~=Y~>MNwEkkTIfvBCdy(*q-xNj!}7`3&u7g!%WZ-1+Zkictb32RrM(?HGEeK783B zHH~FexM<0jZxBx`o0^)2EAOG6x^(yf8vF(Z#dLfZ(H<~j1Kgmp1>x1a z-Wq9=yky+pv|Dfaaf@UC2QP6)fHuIqJ;%k^rNUNn0{+WIkax;ginKd=ylDH8gTkmV zoN413tf#9e3ftWzQo+=_^G1UANp8QA6UWJB!?3j{YMX$x`X!xG}s4C zI0W*GGL@B4Mr3~;4N)FzoV`ME!2S}*TF9^U8bmBnEd}5n*1%d)-vWWl^;u%D_ zm5G9tE2@-(8vIu#1ADP)ln~59c^tfkeYd!hY!)gfVnR_eP*tN%*29bJ5lN43%a~=2 zmhUteOFGS)UUi6O)!0S9dgNiC;o$p>9US2L!;`H2vE@VtK0$K zR{B{b;-`R)yjA?G>j333wmmhsKy>v)=$=BBF6=-8X_T~$uR#h3AxbDpq5GOjIU5#Q-t&7%*cAiZ zLYX-#KOP~}Rp7VUnlve>O-(KA>8)=73@n#A%7r zC^-1@eSc5-Sqjs6sD-di_f*lqu@U%fRGS8vyB)@l!B3*OdX|EnMM*L@QmtP;>0So5 zslS&PZ6WB&!{tt|Sa~=DstNxg^jX5p(}~x%joHICGlK8uB ztJtGV@^!(o;n)`i4~c5VoLk;cR_d^%L;E3$k<#oAl*=7BH;O6xXj-j!Ja6$?wIXN3$)xnns3@^o~M=iL`zU;Gq82i z{tcj{q%X=rdA$4DE#SJaM#4 zEjS@oc|psT{b46i)eSo96&;ib&Wvdw#_zEPKecOm7HX9HFnI4__cQ3{XObHBWmdav zB4E=JB9UiYJ8^b>FP{*(ME=$TvJC?2v_;ox<0 zr_^2DKAIq>IXv#wUG2%vaI8GL->DYGF;sxA6{lC)W|cGLrWSSIfX^Y}uCA+*_B}*5 zlS}Hyu~TyO%U;XdqWa}2aY~j*f|!2e(7?X(Opm<}+o}2DEYVEq75cX;eER2nl$$p1 zd*H#&DBU-}XS=7KM}6|f#Txu0zARl=^EG@o zj?#-jl%S#eU6x1;)O10{m;*FhsTGHa}LMUzi=T2z4wW zn&X+GKvSWEc>Zeur7b_VCi&mD%YAZ432nM5n>gTU{Zi(`H`HzFgQ_Fj??*=0akm$ zf$8P`rWhoa`{ikFNnJN4Ws!@pcmYK8D~+5-@w6VGuNhBmm+9EAR%K8p(Bhk9+Og1m z17^K)CJp!dgy_SjSZ4V#xH|ingB^Y{MP#(jS~x^4o7i@YAn+a#Vw=^35&uxm!MuDZVv%=_VhZOAKS8{UlH(jKFR!hl5 z*1vP#fgOoatGV_;iZ#7&*Q!i#RHL{53)(-K+h@!U@7+Ofd~Shn36?bUW`_z-m>;%Z zvhRk#UZA9)O4t1c2ER<1gD6TIEn@}x%f!qpYMC(K>m*Dm#7AkeH}r>}kx*h~D-=!m za*FbE=1D4xZHSA>De#;h#?ns+sA)OfZyIP>o)5$oBcto2tHqw zN)+~?MFW4jb0+HBMA7M9k;FevbqQY6*zRYC4i6lvPMgnua|C&zBwr8@VvZcN3vg{LD>n6738BgLg@3KtgSia-G>;r1_`F>f|+8TpI(G@!uZ^;IX zqx~K`H@#YvM0(RnU7oC$IvA$D6EUvRW&32K03#%q{f+y6O^sk zonFGa7lEQKv3=?xusdA4=82f4b8ob9%@}I1ah8b`(J0+g~@(q}Eif{ErDv z)9y{7G?bd{foFL2tgEWGLp%GnjqNgTxS@nz1h)5-Ewr9BY+KHUbmc!jt`KMZn$Wd- z_xGcex$QkyL%YqygMG3QQp#`(s+5<})i7tCg~jwPQ(XUgHeUFB+NqThk^U{@6jq zuP*d)?UYXKBct^5y%Z?vn{e)HQaTskk0yD~nZi*`%mGri{=J#z7cEm0E8A&Q@dp*> zy_*X-sE^WTO5SncI>%F%k2Si(hu4bYI7SS&;vbGxDck@ujUzMRG&|H&v%lNAmw*j? z(1gGLTCov_#=*Vh*Sr^R#AqBWQI?!4loTzIv#c6q*b?2pmbt}Kg4*spouz+my6ZVa z@25Y78&Y^t5|sQxy)w)X;b*2N0@dd?pqC6E(WZxv>pN3MA_P&`UL-hos=xE)iYw}I zd@%1|Ek%<8l10N?z(7U$O(p3N`6E6*7I-p6cdlwx)4_Fg6E@tZ^AM;D35Dtth%p6+ zfG5V5&eVK;fRgMP+B*00-!i{T4ARK5oNxdvS1aKa#ye) zKOY}A4d$T%Ep5=9tBEsyCePX$5?l+{q2J#EOr-nM$eWP5xcmcdD9t3yBI3X->sKX8 zLqXJN4Z9_d4nZC|!7#jr+kMBK7F_a@GqB*~5l!L;t=rW-z!M6W_wu6Yq#9nlWLt?? zp>b7;l3^D+(6|)*Zcq%WJO~`Yjjz@IgmrAxtfT^0jA4vzPgbFoD(7aO-JP~pq2L(p zdi;$MQ&q%IxBJD6xX27r8nVh6V2xa0^uOZ|%$U1013ka#i*0ON@hmB0NgG=)dOfb* z9u0I0YVR|Oo~V4~qxHm@&d>@!H;atXK7K%v<^t|@`P&IBbzDz&Y*dmU?H>}Rns2G; zFOo=Up7cla%Wsz~OJ3dj&dZiT{6$>E^QFl5+h8k1lv_3^C|D-Mx$xxm)w0ZAXft^< ztM&Wk?^P`DR)bg1isT_Htg8`NhKDq= zcThU_=*6Izj5V8EO10|`UQn%;Q&_WT3=JZ$gsVizyW*KBAv6S%W7>>%4#=%io&DgV z6zsT9KRZ84+2L=C_L;) zQ*U8Vk7UD*V+GI5%EkzlB2B%S8nTux-#Y!{m<=t_QPxf%^t-X8G5Ip1nvl_#4rAn{pMA&B%Y`=@jD3yhV?RaA7t>BNV*D)OBgkp64sSKFh|YdDS(t z_D~OEUxRP0dR_*hr)&opzxWE!1H?ObRQ@j4@lW_7?&D~#S9YD<)(cYd|2XfdKOngk zhAlM`V|d>IL^5gY71lv%8blPIi{ea|lcTeQKi&|>4gK61Jv=_E*PKXBBo0<#DrW#U zjjxf@hPcHHo!$pG+!Iw5Ne*y*10CFbMD*NRMJnXmJ;Vn~>;5Cd8T9XjV%3aj8i>cM#_zlEY!neYrdm|kZogK! z?hNu%oyz5V6d2-VqZ!S-!ASekwp(R4ill4pVd^4+AByZYAU7 zVzNN?V&iAy4}rW>K3~7mueDCm@0*UvRG(ZMu19@~gZFO-+}SVE0nM><6mD+d=H6nl zuReGCR$L1Q@JQmecWOF=3u2+6LCv!%!8}g8q1fMaVhFnRbzZO2PL3r%hV^bG@t;@o z9k|ABU^yzfSzN7yalRbO7s7RV!62sx9SP%HtVHlq2xX3CBKQ(_Tv3r zr~5Xv<6sh}dH2O;((6#>f9NV+odn-d9-d1x2yb9k97!0@efj-cgkVf4GR0l5N37$( z4Th!pB*!sS!hMgPk{7}6DRDMpFb8Ca25gYu_RM$$_1JrEiJI@oQNnE;5=o+UZ?SPo z;(oa{<8!JgN`eX;t7`e1Pa;+LP@|&yHRJvH)T0^nJi;2K3H0IRdbFQzgRej@Zmp5$iY5a zJ^0sU_O1^5A`}PUYzUJ~Xf>{OP>+;f1oq2#y2(u*!(f|OW-pN1$iu?mif=Bub^Q~FEZF!n-6_cM?CGnd|Ni5-Q(#FEca;Sb4jXLVfR2V#5lW^1Q&!?T3Z*x`i0dDQ2ONS7BBhTtqW2 zhRQ!1sObPGPK%YMpD{vNx@FP#=zc;w_1cP;1v@B9TB8ge3CA0}7Tu0%Z(*4B^r*k1 zEXCn0rR)8nt!>w251XsFuDBmc_e_U3ry!D5{R=HcNCBw_?1t+T_E;3xGbA>42I@*@ zZqSJSN(-yu(|08$)^11)+|T z(%tTiQdzkMQkbn#cjB(?RG#T#Z2hLyz>xE-LyDj9(4RsVlEE@2k-zrb zFBL}>9&r4#_@AhdH(W~N?5bc*MWs5=yNr=igYXSX71)OezVCtHQ}>E#sEA%o9GrYt z>a$O=6RI{!?-ukBS(m}IVPROsykQoDuaq0(#E6dO&ctBNblIu;M428A?a7vOHl5;s z9X7|`{i=JIJNlBlU0YXo{H}h$g(_2dMi8p)UVL@uJ0`H{8aa5*RIgs9z%ezps;0B= zOJi2HuG%&ubZdWaK4gU~NH8j_FoQ{8_28^^za5{0&3moQoP)*F|LsI)>SR*dNaLS> za|mF%Oly8L=3mUeA6vZA_o3<*)GWVbS@rR*p(uJWObn@fdwbv!)PE=c$xUJqey94X zdDVV5vtZ@{SZWmbCFQU{=rXhD#b7_n(@NszblQIe z=d{Z~>rA{waSb-~cI;%(*=a+2*}pXR(V8;F!%I=WYE14(j=Hd-FT%Po_#zsxUnxyT zIP(p{@IDd}^SzIfw;`CGyMG)@`vpxN_cl8(hzZm!UTY|VyWOCM8-0?mAA?=vGCPa? zmSFxBC@=heiH(;ru<-kv(9VPK+MZn)UT=KBo_~FOG*Wh^`gLzT@k+0(Pk&^r6FmFe z1V_ASYBC$S8bN!$@4Q&+>3^}mw0REBV3Rg`i0%DCImvwW_nTXsG7YNrE2~eC>Fydd zC%bSDTH!?HcJ5eyKt(uecE9;QA0)`IxeL2CGHwgw0sVj>Na$D3>~Us@~g)V)f23hHKt0`q_Bo-mx2-6Us+kRqR=@U24LUd#Dr4fO4>F4iwC5C1y}`H+Lfuo*fD552%k zn*0586Tuy)uG+j_bcduZ4qts6)D1dP*)?5ufB5Q^?$h1s^`xI2iL0NGXU+pJw@ff| z&n@p29>0_M_7w9UhP+)_nQ+I)ZlFB&uDF*MXP=R_t#8Pjn@mnfB{B)D+PG-JIWNP6 ziz4@z;97R&xFVcZT91Syeq=AIPVn)13vbB6dSwdb?X4&5BCRTI7?KI@>}Rd76p$Yx z&aIfu$R8#8=z~RF-=^qNgbFojtE71O;lCUUU&wA}mqJ-cc-J>G4h9(Gq&nC+-Rz}` zW?vSu?ENk4{0Adh-0&>E9UN#SxU2hsrC$KGHrKd(wf5)FI(E1E9ot~p`Co>M^9<{w zwT^*i>!Z=nuYdO!vMZ!zVgCz$C8R;L|8bR$@SMcRcBii|>ScySJIqk$oCAZ*!3sTE z`#PUI&uSw~w9_u2pxvYl5Ciy_GjsYXE01VD{2W@#4pXh@l zl)io(P*pu2g#0I(LdCbj8oQD#1alO)yB9Utf|h*8P#TAA)A195)-6!+eRuI7o>&}e zd{yBxcz6$`=!fx;!VBfU@ny{}zo+JgkSzZu4s7_dV107B)ts1@ z0c#9brw*>*DWmvxsQ*EPUeFb*6+TsVdfMlSF~{hL=wBYJ*Qa!a-p^F-Vn=SR)TjP`ZyB_WV&C7wRPr3v_q@Bf5rtbQuDwtZl}~N83ufiC;|p zA4gXm7S-2;7Zw(T1(t4DQo37W>FyGxyHh%s?oyNxSU^(g5|I#)?vU>8?)vzB|KI1H zxpST~bMDOhzO!z3^PI~G-uNQvj_aOPU#U6+`0Y_62EP8;H4PS9}u=z5#S4@=+hctj4`nJ9EG*49O7UovTRV^CrrZe3ocxKA1@(a*3 zQJXv7di>qi4ikKhp8)C~M+qTdpnK8LR!U4}{;7U6gQQqC8wBu=j!$9WoJ^>u?maM~ zd?^|YP6~e_=Nlm7yp)sk$Q5CbIl{>DX=GXY+^afo1#^5%iB2fe?QH7O_=3vhu8(5k zJ)Tv3uX=N1ynNBFYG?RZZ0iN&zTH9nrVr`Sz_bue0R3_Xhrh}$=21;b@?3@3yMXiO&|ncFlc~u)*1s8TOF*fBM36()l2E?IREe`|G3j7nI|8q${gfD zyB;|AjVPqUw2IGxN$+nL6$YACO%FW>uJ71+0e2rQbdtGozY&jW2ZzDw2d^AySQ8&Q zl|WKG4;Ocx>|U}ih|aW!in?S8r^HD5~>4v=N5EeI$~N7`W%@4fv2k@5$`kyqJ{7aZ9KzBp^XjgyGcP((hK+zL3lt z##jqN_R-43aJza4&qx%$p!wBf11}wg8~!oBNz`u0M~-ch{pAStWeAQ|jkf;ji1_T$ zv%9+0&%uXb4ZZqiEn?}&E(_EQh>1~TSd0T{wRR-i4kO3^D;=b#!FvAUQ3(HR35$G{ z0e^$?ai_PHj7+ZiNlt1b3%i8e7_;`13Y#S!Pa@`otc1C(hi~R0jPP|4tyOn~8=9EM zBZ=*F%5samaB*Cz_B+R7t=rx77p@osDAc2878xt$C%hqqmh#v!=U|1b!ps)*j?o_p z5qM$?eed!b&?}r4pneWpZf@&r>BXB7F=&&aS6&;{=qFLQB?uA!-f{!M0*35jMo_t@ zX^kuDD*oZ;QgaeGtsX+X{X~Y2IH8w9VDL4=srWl=E=hVKPOWCFfGzJD;an{RP3w|W z4)1WhDYmbTm&E7t?6#ev)(gXOUYo<|FL8_l{TF$-Bv8{#k2XD|9j?VW6tq*F*1G%TCNdjHdN-FZx=` zF-Fy-QmToX)T5|7v+rE%zqx+uPDQ0$?IZb4KONp>2BHk~>!`KrBjo|m zTmf??5}h;G?0c=nX8fy7AKqgj8_>8j!bnPkPh)_YY!5x;u-qgn@{faAHNVuSgpDt@ zP`jH}rR#B(8xAik3MP76s)t15;h?dbU?F`n+n`U_E~Hu2fJN-OE`e7Or}Fw!=u4lp zCId_Gjs8n?c6QJf_(q%#U$pMq{~V^<*zJMzsLic0;H8d9;FA%^;v%sSSj7%3u(>zG z=@px2pTnBxBwp^y@x#V3K|_o|ME2xd2mXeI3+S6PgFz~Rk1Yw6f9Zfo2Y(Fyqri;RiL4DR26(?jeKv3zatc#m}lp|Yo#RFaZYe9U8~ z!yl&a6kI1(i#<+M_{_~>Y}eblil`LnLs`Z*Ks6L>}kdU|leLo!2Ht&1|N zu;nUwfQq6xU18L?sJh?!uq-L&;&ntAGg+gz;bhKG$&c-4uwO9|j34{#yW{T6f48!d z;c{yjWG=uWVj{XlA(g%Qy9zSEn9`xpOs*?npEW^pVMxY&u`Lv!7!I3yae!_H`ExoA zmJS2RPnASL13L$;BlSU6oliIUUoz9K1=JJ|4_Ct~a~URgLlXl+b$k9~5YfT{re^{k zD{OEldx=CjJCt?BnL%R$Np)Y|SN(Y>R%{G}l=k0adS;>aCpor3;*cR3x|%$)k@vW= z5*ny4=2?Y8b5MB%WXUZMYh6;fz*j6CST8snM}1Jfi~I&wj5(oRL=7nQy$gn}G<3bY zN`4?W#RvZ$j-uM33o=JGpY|mxsiRXk=qs6k>D{a5-Eog~19rw<>LpV?lG!A0@P+~( zI|CmdF9bUa*8`{T(fx^ZRKKQvMscIC_)8gN*gxFo6ET)xFB4lci)DA(_sX1$ zLm~HC-$yTe5#N=}ZZwWQ>5bvgmylaSA1mUexQ)Ft5%?6ZOdG7tLaY8z9IM?f9+psoP$ZN=qVMm38>%UuM{b z!IiK}zjU2aq`hPwn#dg6rKA#*aNQ$?0PQYVX#Yu~%%kww-8+)y&yu)*t62D2;Qbde z#HHp?DqstXUp}fXSB{3TBjcTFN(_-sFrEk<9SMtglL^fnxGcC;-iN;e>VCV$3a8%um7hSa?JL}> zBB8-c#`GLzbn@EYW@4fnxBFC2cV3%Q7v~Ud=ajUZs_BPHePCWaTL#`cL3egcsoq3^ zJ&ddbNg-5zHNC2`ebe@`>VS5lR0ib*SC(7TBmU)(q=}5nff=JVJv-f<2dU8Nb_L;w zhr!@2-z^ifzZ1k;7}4ua3C9VW$qrR+3tm9q?+AG7B(n#UJMW-&-UhM!bc0O)3|hjE ziCrG~V%EZ4Zn=|I>i#AO+_(tqEUJ4^j^@smW*kd(^LhOVw~!rL4R)aWXX-9GOYhta z{~7Sx2dgWiikx!5qtEQ}XV z(Zr^VLQ??##tgwM*l7s5?^xR8AEo0iy!0>tD#~#O2pSV!cjIiqC|~vA$E-Ikg4UQv zN6Boz!R40T-ee5I>G2_r0@t2au5%N@D1mn=!WSscjc^$}dWwrLq~#W0%xKY4y{!}& z*M{H(Q_IY7(fQNSH$N!S0Zd8UoSs&Ph) z(`RD82#*Rm*TR3sTrv;tQ7a36o=EGF_{E>BlFxvT3p%@sz#>u53=fveiBZcI;^4*? z)ft69V>QmfoVI;X`OX@0{?P7>6)Wc*FOn&!F@03&m?u~7dcj}FU?|o_lGFo=wW&MS#v$f9bteerv~?0bJbB!P#U6ND@VnlChmtmih#!&!e|RJu z<*mbCgerW4Sw_Qu^uJo~ZnqBX-ZZD;5a&z0WE$iT0l-b5E63ULk{3^w!A`Py=gx%Evb#kJp%F;=cXP-_iX50aJM`Pau6@iM3G+V$SPw=pT(Kq(3Gly>#-#@f8Imx~9w|ok%_uySU z{@vA${YPV>t^a)57E`Ux3rh&ayvel_vLj5~F z$W@<5X!8$k+e^0CWWL#C0itx|ztvR(IC={IX#>y=N0lRj8*0deCQqfK=e8JRC--|$ za>$QxHj$v3e2~izyeJR#{cW|&pR?-ujiE35olx2VOL_?*8HF!OKwQsZE&aH>5Y=I3 z6-mW8j8{O^@^M-u6I@C+svU}fK#)?KLZOz#GG|^39qm|M_8uvd(=Q3jNnrcT#P$EZ zj6FxoqZfz)QyHzJMzu^mvev1ii>B(rAed5R3f0#EAs22BwEN3AD%}Oj(iLoD~B>VQm)= ztI^q#HQ!NbJMM$W-h^}c7Rau*Z`MxpLjLK^JI@^rz$@l$YE{ap-GQrE-p}ZlAD%Cd z{;CJkXOi1)o)%oOsJz6WG`Nfn%d0^CN+!{mL=Pl4;GzS$0!{pV6=ttvj%c&}w{8lHoYL|IW?@aV;6R3k0@2mZ44YrA7kz3y$>YhyAfo zCM!_}Q4*5${lL7ZEowA0av{Ge>-LQ~T$IhXOX+>JB?eL&l|t9qXOkp9ugYZC|I6YC z6xvTG2F0#EC3Xu-bs9ym11-J=bW_C;O$dj>MTJL|Yy_WpeI06F3~J&}{#DnGXFCl$ z@J)hmvG_>5t<^?RAe)BQirFG`Py1zmNB>m(@b1M5N{>tjn=G>vbH*YQ+X{gX>*Iy+ zZpM%+`=oNW_x~Wk2+TW<^j`)4$^jH(v6VJZR@AR8K|tM6dqel(4;S1(ZvQ`yANN}5 z`cbG}_93u#&;jZUeaYHIJjpu=*J6gFI`u|CW-%Z`GQ%jxw%mU2uM1pc5Eb&a`6u`% zRyJg5r+$hOwAwRdE?Q=})@2y>o?O%gC_Ij+=Jk&Q2+&SgG!%awkVz7yof%#Y>W`V` z&z~UctwksAvVgkaEea$rV187wg1VW^yfz7(;!iGPS)}(Py|i{UV1R91mpc7MmQtV` zm~!0_}ux&`rQ^xEY+6YFLt;<`pzEFVPB;R)Ao29dnk?tqA-I>rW)U2 zWI#oE)jHWNynn+fek-87VbUhu8B&}-HRla_!6jf{6dt@}vubkAVVMyLOHiiv{CBRx zEE!hRZ-Qy)G_cHQ{)FKD&k+&bo_+3eWK1cN`(>JfXFO|m5^_eoLH|uR`3{6PxW+rETvb{Vpij^?)D#ZUe)pnpjQytk ztrX?ohQx63PaF;tH3?~sb`ArM#I>)qLGN%e`j;j3)u0Kc1nmcgUhx?;WB7-s`8EXu=B8Wo9Aa(r4@C!r3wiQ&HqpXuJ z15Eu-fTuJ~yjcZn!-TSTv2Io$Ha$GlfoDlXln9ry9*B?~oq^#*!}D>U3{&(h3u?nq z2^v%%t$=VI)6KB;FRud|W(XOv=mS2+hJ6X6y=TW!X<-rzzJ09nwCt0avECfHaYife zrFtu}Uz-;G1^(~7uxzc&WYt)k-o=IaKkBhbV$HGp9~riF5b&DasiGAcSwCpV)tQ zh1nk9+r0Sv2?=f0!-|?~&~3B+vg)nD7Su?XguKL<2FI;ivn@$CT%b$(?4`M(cX8C* z2;T|ai9`7?Yk|J8l;)PZ(a~W{O4Fv5cOZ}xF$?PGxs|%q%}6tT6;de$9CCyz)m<$8 zFr)ry8tH)f+oPrGvn6AWqB|Gw*GI^g_am|)Yc|lkJV|J-$R)~jMSRq@x79+FuSK_) zuFB1?hmFjgn=mwPJk;2=mksuVUHGRdp6en^zl;j5w|2enfd}jt^Z_t za)b=!JF@uGk({DU$)waYwM11SdV;CY`#RPOSK1;!$kOsdM&x~271bq)0_0ZMufr{% z63C8F$K1Ft^f`>36+h|556z{`*tdZY~Z=ioXZAF=bH3The_KA9!=^Hh1nInV`Gepb~7ZqcMn}B== z3{#%>cF{~qS`I`Z>rw+)YF%6!D@L_ujm8z>NEM!Bpi4=JSP;05kE8+g>wb^a zT&4rXmi`*!oBs~Bc{lV$;Cq}a#sq;faws=uRndaBM8azIeB zv&;P4>)|_z+e6kIPqxt7!xl&$*Ayb4p8BYwr~=^1%t7j3lxx;jv>g}FK-G!vPX0zYJ7 zCIv+iKTcadO05{?u!}pHY)W2}TqL$KJX;1}JEw9#_yDj~E<=3d8y(-3T4@$DpM->PdFO#97y~R4%xjsmXfL zqC~5U8>WE01(XEjg9^xXrZ@M}-D&yO4yckse~`ux7YYOp3-HD3g$riFD2RDzHEsV} zw1E%u$OO{5GKUt@XkhoB22WsXdI+S&cJ>SHP<|-EU&)4el5EmtBl359$R7l)Pl3Zj z4CE!BMsRwbgeg%DFV6Gf;(qK0R=~V3cZvsU^gK29kZ955l)r8&aR_TQ&xJ1-rMP%! zscl@Q@kBDo>!?UJWP41^Sf8Q-T@`*$x{ghr1E(Hgo>V1z8qUrN7FKdtXUpb@_86BF z@#t3m&KW*BR0j5_p%YMcLZp8B?6r^}u@hn&vJ(}&2>Bq&bLszrNp?VFXp=`5fE%r| zMCtXa&E-??WZs~pV*pF}QrD`($@*+1M?H*oPGb?UE*M!XNl8rVI1Hx`<*WEPhbXny zNXk!QU}-|=BMFmW<*Qw+_nyp8ff!oI${qI_(_1qbTc5-r2he|Vf60A@0k3cQM)Lx^ zmZR>NMc`gdJNRN_oQn~GuODF@up$14WEm%Dc|nYRMYa(Yx^%1UPf|c1J}C5>4;(d9 z&}_`KvM~Od@9QNYK-MKzR0FVLzl;Cr6KK2>3~0i6z7BS%)Fv;XN~6)wuvIev(~b8p zh)(~(?%BkpkXE={Cpd=8NUzxeKzR-;==G2uGl%G<^H;5VIq^*McNzjWMB@XA+_Czqvrc6vCN#82 z(YwbljClXKtx`;PytDshSY2s?KaFQL8qVmo7B7kmOjvvMXCcF;$ceWyny<&qJS(Wj zsDH+7pd0h^&$64eSR*0?w>oN%xv(8a>B;ahcd-5zzpSS_I?US5gaUV4sPB*%mEv!q zh|=fQ#P0Fnx98q*bc76A1aVlHgxa6!8Q(J{%T@PDxCH_et0DS_@l*XU!ATtS;lD3u z4m~(AD?hHX@u;IU%BILm8;E@ChMdT~hrD6EDJ$vi49gIcLJW5=*>i+V#QZ+}!HtF9 z%XY2RBHts>2^59yS}<5VO<;Abow5Po!-Nqj2jAbXe!p&-}XG z%ny0q6Em%nif?AU>VmAdv_{+w>^)y8ss>k}QJs6jygt@XIW_lvA^_1&(_Am#{yrALo9N zFM4|PZ0D6E;|I!m9x5=V^6_|s{9cGk|HP!YED5;YQUFGYu5#dmNJ0hlX#gG@Qb`?f zqr+{`cP>aUHx?j)0n>F;Vi6usYJ|M^`SN6t?fgp;Uh8U-Rdxp})~5{?XrW>(Wq z@{VkheHxm5w~Aw`=-5}0#%ZyT4<*YiU`ydsfXzle)`dkjs-JIc%>@3ZDPKg=JkAHA zIy0hoEAfG^DmBPjzBalk#A zU7-4?u+PmEZedzLy$2Lik}XRc=m5d~+68*o`F--2xHM)-kAEyIetAywJyTwseXo?1 zfQO&>(1~aAe7xK;=~Mb)Kz~el&QCIf8Uftqdp~KC-jktMe@L5bfo}H{Nf`6Qqv|d? z>%lLJQ`f(~V?&wDC4Q#gMX#Lb&40ETIcyRti+E%yJ5AB%LyJMT$vlQz;%rjtgyObVVZ8{_AZ4nNhuBU!UIom_{v9+Hxyp!mIr(K9=bdfo znd{pwBKZ=z8F!qTe5%M%OfI_-z0|96`?`BU(9&O+AL)uUNqU`?fxO@E;bo$uKo;O; zA4;eN(9^ENYZQyiMw_HHZXA{}q{P#%pk+5aNi~F9?I6nAfJ$(0%i5q%SOTUGcQ=KO z_jPn#=&S00`jrQID;5v5+G1ieva2lfR=yh6z{}hpXf`h>igWatjDt$C>WG1XC8Yi0 z!V;X9K%-KNVjn}CBsjr43^T5x9?+9XqmmdD6e`siu;r#LyJf`x2=TgEdUpmDmV$1@%T@kN;vUq~? zKC;FBg`|Af5kN(B?}zwHApAY58wP*4a)uEA3*7@g|AirkaOJ22<2QFCwt9(dpy|s+ z!gVuG&Jci&kCz~3su@CtTdh!YE{n!1n$vk0srR(yj4b_z<<~DfT+@&f0}ctAcvD0> z%TN-U`y}k*4F#vm_){hp4*|m~sq#{Y(wQqZ`4HZtOTHlF7o8L|@VMo|8|FRm zbL$(4Wow>TIKoj4kqvTkZ>?PJ1)IBz;c9R<^Wc0I%wCE+lR5OY~*Vjh#m zP6)PwLWzL4pfgg``<5!%UlC@Ny-&38T<8#`{t9h=~@DjfhmxYwl0!!!oWh_lqyN|4~!pa(I*tkM14~uxbymUIt1@_ zT`bhMXpw!tm=Ni8AU*C+uwp9XrnHu-m{6$Q1)630f?}Zmvify_ZUbD-f=kPo=cK6O zI5OM7F&Vyyi=ua+sflF}T4YRNDmZ=j!bS3A%&ijs0jv5KbQng&CJAXH-XibaHoj@C zI_{QoRAP<6O=3`GV?D!nSrP=+R`Tslc&BgCWox8v&fo z7Eu1Y=|kzzl>w9v_gn5ikJtEzJuvZt_UnkiVsa)J?rApd&Zz8{VC!>@1qa0TPe62s zKD`zND_(JZ3zr1WhKIz1F$uRu^j0Y73Ac9$j2;Bph|j{h5S3t=dka6sGe=(2GYbN5 z@Z!}m-W`<=-Q;O#e9JNeqD1DR{6c$im%8+N)=*xlA$Y?QVHYf(JYp;K7bXeDP4>lQ z%&dh4f%#BgJ{~7T2$gi3aLzeW__|vgc*~ufgl|X{{h=r*VIPisS3Q&u=SMkfT!~tB z2A+E4tD;K&pv{zE>BIxx8j*?@{2`Ctg3rX128coGliJ9);^VNs9Y>sUC&L*~{8Ci6 zS9r$meE)AI_ys7OO|A~^qOgn&c~BV@`#A&Sd!T7csG%HDXR-jD?KPc>S-sI6sq>eHfo$0pLP_K7M`Y-$^nX&z-?T3+*OPCy(z|;;pAp+jv zY@@OjdTxa0VSGIGAMjK@q}1R%r>^2cT2B+q9694Xt%SN@6JaF1 z7KAaaa4IUE&tXF`)|aqfA;^xex;vpvESYBU7TynA&fH(Q~b8Jk}+^mICeve2pZJw^AlmN)JE zhz&gBXRj`3?N?w}p8BU!mv{DjNeZx#Xbt63XPVdox)Dk;wvPb0pGHV*LFn!{l#Fn^ zuj!#kp%m7^+OuDLBBy1}%TG6sxJq+KqyNIF1MgSW=K`Q3KRQAq=q!t>>B3%_mY7+Sy3irGB6cjYRJSal~RY9C=ISLo{304`ApZf6U5uKJ^r= z>PsJoWZiV8QJY9G1}pLFj{s;n<>W9qF>^*v2p@5qhzmu%Rn_`Zrfmg9^dDl`bI{$5 zwuMxNyw^J2BDf~?uq%W+IQ|FIG`Fi|TjUQz!mcqey$sGMWoDC`D}NVEG8K(SbsK#Y zw|p+-zgU!u=Jx?uZpFh|l|E$5I{So5pyBxn_RfVRt+TA`q61K+DLdQgL3ru7j>rSm zypJ`As%v#scX^012}-npj%Vzp#CDyau4y)|W)zBRsR*1MM!TbO*uKxLtK|`OcmCaKt5t@DI*$nD6NwBp z52jJt+PgbD`?X z@*Tojc+k_s#7OYeIc%v!;cFjMilL<;>CofXdl&oMkubUU_jiX&1^}q=vL3);Z2iu3dhu}^BqT~2bnf(X1XmUi|cai_^zu7`T7 zTqVytD#erW)zH>zk|$Yr1{n;lOYU<7NV05M?kY{0=dLtq0p5Il?7R*iYu1*{FQPVw zc1l*hOe`D;#^xC_@q>c)pi*ACi%zTa|hGVw!b7j5$u!YKEn5m(liwbs_; zjM=Z&C^yJxKkR%gbdc$-lSbf*j~g~(aCA3t#+&LUn~GQWQ0qLu1&N4?i?^21ejud* zl@0O$>!&(}uLgq{Ta-%kgig4C!f$(h-z@D>$A$742i~__FWqShCcpMu-(;1Eu8oyh zmCG|zK|#kO7R*LS8^`U^`^&eA)ID#;d8Ezek;nzewKw)Zw zo4xOqtxhDp_`Zl)mX4CzK^UY6$BGeN6@jj9MUq@(E`&yoVc=K2tQxvc)8T~d!&nC` z27VeBrmZuBY59M{=7>DTw8*ekhIEN&|EWatV*_rwy`QmX2DFnh75~c#`J*L!_}9}5 zzMZq^!$CO2+*`_@L$n^5h)sh85d;4%J~eIJZNNvhf3_CD^dK zDm#5pxq-gq zp4!)iin0($nPVFho0f$1+21_#h@YmKo#rFaKV9 zs6f>EQMy_}a}XJgZ5aoWIxa4UEWmB+`or-`O_qrwy6H&zRrmZshe3GXQ7j@w2o_HC zlTofc&CJ>WavHK41Fpm0jbI z^vz{YD1sK=*7hN+F#_bh>d0arL3m1NEVuK4OP>KyxBN$M18TJQk&&I)U%I|S2_HU`8Rm*T9FV;JL5K0E=UaY^gGL;xYQbecj)jpQCpg;bc zvYYZ?Ky>L%lphTp^UQF&n~=O=8)OFg#Vq^)<#Q*y+1I{S+h_hBohRV8xruV}fhE0Y zsVxQcp6mi6;*qUJ!w5Bp+(}&mgK@*%MDhi8rM%+&7EE75qVPU^*T#zLIpm1i1jd*H z7ajv5r_#IT&aAOPksrD43`i?aK>69F#s(3R`4v#i$9b`(L-ub4I{U16Gg?zu6^Ub% z*cK02TJPOHzLcQF$q*D@yW2Nsesr{A*X&XtHP`Y4potZL$g=b7pu-Xk&1RKVtz6>x zsus|sNub#`^UcJt$$3H~HZCB462&%?-i`w&K~3tOBiojLV&D%c1CK?N^jAYuBf4F- zPxYM557haGr9&HX82RiOw$B?knlCrp3p(v=9JY;S9`IXP+5uqTSs}4GbWr725iRDB zED~GYV5rDDtWYdcnf8Ce>buioV^sY|=%!|+_S%j@v#X5$OlTELagBl+F!KSfPKn6S zhtRHjw|aPV*v_Jvc=E?kV{233W7#y&w;Kkiy}dI7W!V0JM`TG4`c6P}3_v-tr*nT2 ze@*H_^2m{SCCfWo-9d~SIrj0}KgEU0XcNks3A;#lnomcAygNl{x%DM#hZO>DCU`c? z=MG=-<2wsL9I)44qX^4O2B_9ugTwPKVUMk`d>pi|2v>h zH$YTqxg&FZqspIDlZCR?XU-`HdwYnsZ^Olt_ex~FJ7rQtO5k2UE@991G7dlFn*1_T z|D}9Q#n5PS6buwE|2G4KmZ0|vD!XsE!c^OuI%6@9= zhUZUmO*o<`jiZBeCAHAvejGlUsYda!#P~*APnq)f=T&s zEG};2LcJPMmjf4>k{>V8u_0XByS?S48 z_+u0_t!L2 zPANPa8)yMg_HB{N$r_aO+Hxban#I!X0u{wfI1_Vy4FGWFTw$y(8)Ndhkz>>;$UzSZ zO2ynf8p?Nmw4^aUe&7ZY*x?5A-Vzck_O^ihau$D9aLo^KHCMz720cu@!SAOn6=4(y zn(}C*lQJ1FI=(VBN5f@#a4d4g!gWS59n?Lp=#UBQn#JIXzhQ1hx5kD@qF$R%y!`vr zd6%T-mm1OGgx7m$7jEV-8>F{rL9}#g?o_<)HpVa({T`&n-nI6wsFNQQ+wqL5edbf` zFUNS?Es_R&DU+(eC$5H{EwbI-HXw%>1kTY*OiSM>l}ZmZl*zhc9r2HPc=dGG4pk91 z3BL^Gj^<8Jx#7;iKfDvwNZ(4El0e}iEeS{GZ&!gzd0?p2rF2e$OXJWRxlIXpFR->u zVT%6W@KJcJ#6di2BfTO1t7>fDGIr$Z8?r@&_3t7=%n)^R2ZiqHyn77<4&G%Y#7Vi5 zYg&C2-}=AIs)!*~MUW-fx6Cx@@*LQVfOTxGuW7sxeCo0LXrzTy;R!c1WrZ*3dXN@* z!pF%Wld^XNfZ-aYf*d6i=ClU%WIdMC7Aejw_FvW$V=W+BII1;<1;8H;d(`SK% z`m!q>S57t%k2QU&X!6+wxHzvsf5(pvu?gRr+@iKbB9c!_&50qZ^7u5U2Y}6Kf6{&F z3`!E2epDaRL}nU<(bpYt#s~*c;sVAqws_LdU?u8jx7yP?BA{^w5ey*gXO#Ub^ouF1 zvooIpR=BcjCH%m8stx8+Fl-n2+}V4f9@fHz^EE9+4#ktT9sG^6=n2sAqNEY%a;8Jj z9(X@WJI*m&65d zNAP5Q#@}xDEu4G%1Lx!IjSQwmlKAO%)Am>Y;aW4%IwX!kQ&hvb8s2 z!eC@mfTsRSWr%9cS8Q`caFl}$eIoVW$k$cdHe|iZvcacwXw(4**7;H1>(n2>DAo9% zHMlww;ps!Uk-nKskTPlBhgC+FzyCOtHQ`z=xc^KQoNkUJ1mPk1ne)2n9BZp5iWuD~ z*arRHE30b*KuzEyGd3E^=4}5cEbrLeKHYuzD9PSz&A0-UAWaMxv6&-Z zSnw5@z#b78U+tb_(fARz(z2^K-SODNoE9BFIxJe~h@JdBPFWZJc1+uZoA zOZ>CuF5BNz3OV*G-2+Hk>z>WZvn|V9ZPTc@=`;il&6|_v>QTi0d*}6&?G#+Ye=DH4 zlR(t)A;Z=jVF7RFns;=uMRYkkUz1wJJ$in?c+c^}D`b4&Sk?(h`6oHo_M5b#e_TTx zfK)&qO^H9a?%)_LAH;JuLIj5ygLWKei<_5EIn`T;y2F{kgE;yIt+)TImp{p@Uh{Tvx|6{MPo?MY5aZLDG!x zd42oX>-V1+wYuL8;ET%n_;EB7je*ff>3Di%dM-HK_A1J#9F12cA=W=ZdSmv0~@IBkXzKj4}Vv z=VaB=^tvF3i&=IyX^vY6A6FhLDS%=x^zNC;AiIqqBa|;oODIV7C?rzvy&A?>w4R2q zw~jf4zomE(TizsJy)JciprqnyRpH|w&Es>7Su%I%BvF{_t4|(a!Xa2`V5KUGV>-h{nd++?3_b<$Ssa%grMAd+4p$@pROg*T1pa%Y=8{e9(QSxrD zc#x7b8lzW&&2Ns`(VXROq7jce;C6~`F2f%GStMAOOOH&B>ybT|NTebpwOOB-tm3$8 zU9@=t=6%H8dy-P5IV$u9$Is?`LwL;Tsze2=?(2X}w!hi-0h|jDBGkwe?xbh-)pXM) zGbRx%R+~M|NX`_v_954!=iqpO0O+X~YzXXsHIIx&wXMc-0{ck^ywpmiXJGxzw&Von zBN)A~m^pYEm!sSOkK`WpPqLIEg*}?uOx0@yxyY}Y#!t3-SS zQr0%n{V8KNWsuCBv9bEkij>IfJB`nb;Vv4U6VS~`pz{3xX7L+q z)cq0wmuK^`KG1~}xV`9%E3qCaKtn;LNC<_%nTE!liJk_ahK!slMF-^8Vxc*;y&+KS z8~veDSCH$5Bqp&4%Lx?)vL~pSB|-5IlPO9}o^u+t1)Q2TMjm*w?kXkb68i}oTHide z1F2eCUcJGvKx@lQURrEf?A-HlH`_$0qIVLcUoK;N>tPBDn9Mxx-cxtrF!FMD!Uku) z+RowV%yc>wr+Lv-q7RpYoueM@ATgD7v+VP*ap8M;?g7ci@W)aj3HIy>$wqbo6Whv& z0Xeu+rzKF*?alSR(%pxup(6zVqW1mcCIOisgwMnGH>t6<`q?sORYT@{C8yG&M6c*) zw2o}DXl7<3cP`5G*eMenxaxyc<6xYvv>NjCWJzeMdx{&Fp5Ib=Y-9}`!J%(nGnFe= z8q^U`GpmhfLYf3`jTd>*V@RUM*^nx};)AF}Di_gZsED$kSsW*yFQsGQbjfyJs)&7E zTj_R<+w~E{kCA7fq7r|4N3t6u{>#&rx43mr=wk z96jh#J>%^9-?JuO5NP~MO7h~=`0!i|g75@?owj4U+fSO8c=F}`q__JZe=nVec9A7i z2^Ua}*FCZZNtsc~Bk8)40`PRjkn%EhEddB?RX&ZnX{d?5meK|)C+s8f6JzK@E%Cj(I0^Vutjx| zl1lR>b1uWj3P*|TH!4jTA&E4s<+QvRHse(@TUyi^fyJ1CFMPbLesXECM6Ae7+8sW^ zr@tRTg4yGp*}$h8)s2;-Z9IfDCu4r2f*Vh0K=vt>_yl$7b29WSff@T)fUHBZam_5B zvPzddw$W17OFs9k(jg@)k@5VnSV5JUaP`3JuaF;SgXr>Y4?`f>qzTL+*d(xhXN^(}(mq7fKcTSdUuLqI6F#9^Sfx=LX_zV0lSfjvb zGf(%7j_$pU1?5mST5P``8Q_;5`y2Yf$#Pz(f(<^_hqAK5w_Z&=128HJq~vGky|`NN zMiQLrPk7DynkI*HaugNowIQ8EoQOzlb5SJjCz4*Yk1??Jub@=E_CU2& z=xQnI>fcsRTFes~7jxDML_nT#E)Fify7;1HfO>m?|HG-Z9Ny0;PzzJIuFY>Ch$*cQDZO7L7-3n% z8GvNflF!cMUduKR)3y2uw6H0=20~q2OM$ea&u1Vn{CRG|%G4{+5NISI?-ce}tMLIt z?)Vf&^FaLcS{N;bL13WU8K`JtJqi>-6r~#&XhF8h0OA=o4Z}3M2mmc~WJB$wNG2Mh zeM>h~x#1d!#8|p&Xq$5w$T5$9Z~Tmng0>d*dR}_R$a0a`j zfg%RR7a0cTC)r&drhe+(H2`4VE!75T>5-FV)qg-sPua0I)(f%qE6Snb86+l(w@ z5dElFW05LKR(P->znNEmlgA&--dH#x2qJ&@&tbkom}{UQ4;1i^tMQ*NkW(1%oWmvx z2q4Hq-`YUHbqq}CuSW&A6=>7!XP1`heQN;oasAzR-yv-Bj6^RA@(lDAHPEBnSQs!T zx9o}LhljA~d1w?U==KHzF4i)!jj2^`si1`c#)g6QK?>&Nx#@UgqCNZ}5M|=d)K6&) z6r92WZek$tW+V=8WrTR1I*4((VxMXLLEPe8W@0!lG{3@7CdA_nt-7MB|>m0ZlI zh2U05nM!A{66X-i$?T1VQ|5Dcd*i)4kXH=z_X7n63b6r03{1aYjReQy`FZqdBd04}^V=ymhu~Id$S%m+V*#>g)Hw3x*@o#PR3>3sb0XM*( ziMCH+-0)t;#7uOz!nq;>A9EULL$-7oTh%1YhoG4mm`(>VhEef$Pm;M|Tx;voL2fpjei(;5=zG*HSgOAAt>hkF9d z2Pg6{9ZkJ&!xOJJ5DJN+<4si7G5${-I>)`RX(P(~i{o8GggHslq< zlJbXqaYL4`Ey#T(7q%Dq@0 zIbTn-BTlAkVx58iklEGv*&7QdwM4%%b_xsb#<$K74-b#k$bI=A;=RV3RPV(=nF~{u z@j*ji9O|a2X)^95xu&XEsvJXT$+T2W#qucv5GtlAYlhVj90PrHflDEn#wqRr9}O>w z2wbve4FL%Zlrl(~{mHUvYyf~JpJBCHA4WNGgS=qL5dcZ9_Hg@R`1YCpfUYJN?pcQ!|k?xvm+Bt@CeY3JCr7x@^pG=!_c1c3Xmf49fhD%me0x0Wx zEV-EN>t#d@#MP{l1Rh-Glmm}Xt!}!bn(9StO003fA903aqLKwLT!7JxhwQjxR- z013K|DlO87k@VA=A0GdL#Ne&H^ z&5&;ym1SZeB}~3$50{-+0m@bb$gg7g9u&srF%Xj;n3!VLQV9NAX09uA<|KMtK7+k5 zEfF1bBsvfSk{l-)lmY<-;u`0c3wU14iK4QS`rFu>ZD z%0RfiT{!vvNsZZZPhq@QjsIjhL26-LTyZkdDb1`TIYe*_#Mcyh$VD-H2Ara$z`-_9 zW?+pq*hwwLrn&?aY9OAW+B97eY%_l^DnX zLXo)7c{OWRG?k)yDq@&T9|h?b)tfNnP}$_ z7W4yMF;Ip*meR+2$G`oN--lS?rxZv(pTwl|{60R;A8^pl{rv0x39A7rkOk%|tinj& z=b!!dEPoD92!9OpdMJ`4%|Nz+7=fXzW2-vYOba6eaTm_+oQ$DCSm{ZgfpE*zm*5g< zU9rJga6p@i{w~lxHQ>LmlA@MdXHyD+JNWFV|xGLSUD z>P2_s9z;NQv?~Kpz0=pUUh(P|B-9qnOI*do^4IKa_U#MvBs6U}$K_iYOHbWE1vQgd z`KfRLwY~2pCjEO(M9)qtuyXP%)6IRKVx*t9%FxdLCUQUQ9bPifFI&H-nDC#g53B$7 zHcae^=Hf{b12u4E)Dpea(M(hCC5HwAB=r>pgovs_U1^3q11W|~;u(*np@BBQrEFDs zAY@JNjVsm$#LN-`v~K8z)<2W48VGewU9I-}#uNhq^KMTyO*!^3GSN3T5L483xnI?- z{?b1;P_m^Z!7rb`~F8{tIzyZ6pYqMRn4O9lm9$hvN&aINSA2s3WFlk1j9Rmp@5419V zGc|5irJ;d<=_>2=t1DIskYR+uhA(a~v=$c8jV161_Z3CXB5)C9b@+0{>@wi+(V3al zh?&af1tQ++Uo}t>)7k7%*>4~{4K8S4ZT|nspcvc%17-NHE2--e5D|jlV%2NZMy*#QetA0D$2Dxb|wl&<4dHyJ=o&AJDN=sPjc87>2XsguEnLZl`eS}8d)5Ryt&L+&III52}!D%Mx!Qi^8D zO6jg_h*G2W5nR&`6N_Q~Q<%Re`iWNKe*h@0{uPJL>Uk7W#=ZooS9n$^0c_^} zj06AMLHd$`cK4bPJ+}?Cvh`gCB)MIOr-N@o+2vE169Y*-tJ)|IbUlj@>M7Mh9WgP> zs5R_IMFv2;u==IOg;|X{9f?fCYNcQ*d=FPw?9apGi(OK(MRmh9?QhmSlYKEzO2(~j zqa|xT1Cl zuhz#}l>F<}tH#BJl&b0?z~byPn149OesUwIQh#6&~Umu>r1g9GB z>`YD7uwp54mZ&P+vXlx!Oi@)7MO!8gL5mGjQLJhhIR=8z>~Vc!2V0gx?B#)K$}lf2 zo?-j5-YxlRVVSC>;ETwa&p^o@R%$#GZz-0AYxkidefH4uxK6ae&5~s0RhNAZ|@w0;0fW| z*7LyvnUP3-5EutOu_Pf1Ab~^ly{UuQ+Nb+zW zxDx}RjjAnrwHc$=StO49TsNwYfs$qm2u)l@u7RvI`p&*uw+&>_(4HD7D$l7OuNXF( z&T*w1$Ui9hy-^JGWDPWiRF|$kiHHcsNhX=mi%%&4attJlWul$E@jO)%0S$j#BG{Gj zpBsoGZr1v`Vx7ei5crQ4VJCiTKpmx38nS_|7-&MQ~I10Y`zG_w}=R$!oj+r>cq$Uv@uTmu39DaZu4Mbr$9UiA5|+P_k+q zgzDNT4muS4RdZuxAWMrgkSv)!Y1}|e>6#d5Y7{iZKmMNRCp{l1U~VRFZFcs? zPmFE*BgEJQXR!Y}6TP@ul~q;iBp3jc zX=++O7Vnh+QoRQ43msH7?Tq$_x|!%irLR>7X#^lPYZBOqgPsI{rV42OQkcIV$e#y# zFQ~=`-27Gs-P-IN!-8`BJu(mgmx#pOZZ;%|42%;JosLbf7RHMl0zb23Apd}%iCddr z@kZ5OnN%MbDBvGY=lEc8SPK&v-u}V3jOU>tD8^r7pnCu{&=h70$bUE0!?&zw;*{2) zBQfCS{XpKW41p5_x-g6|sTv;yL66r!H2(1=qPC>>(Hkg%|`=n0+;#{4{?#-q#QGEMyN#$pp{{uyHr7oaUh(|fvks+jZeDu zt8P`a8dnwiAb1Ira8UG`Z1F8@p&DA;mN9Q2+?k5p48cIk^HeIAP-i94D@K%IHY|+4 zWgrqeto{7a$tw^fa%;0%6}vMcw#EyKn}q>oyc}rxj6}@FBWoK-3f#iT?(y-n7qdzA zo`T5CKtMb&68+B&L<)6V@3l>HH z7e`yt7Zym!V`u7S47AtNJ4P&hQP)S(%?xy5N5r9Ti4)3huM7l<`@(Xw=^SVvWUX5m zH&Ck8dY9(=!dBEoV_U`s3^X!_%seMnF9{Sv77Zl90)%h_@y8ctXhmYwr20Ga2I3C# z40Pn@!cv$EL&6a%5`iR=vg%bN#+AUP44hE5X#@Sx%Ro_!9U0jA!v3(Jas!caY3v*l z;HVc)zmxF{lxR5P;h_Rxbo*vl5J-#y1;%p-t*O3%?gb2#JHkjba$N((Wm%Nu7T7``aWp(Kn{rm-467oihUX48OUQH4)pB9POF6mLat~a$vXq7vfma) znZnWQ@78+uSOt)p#gbF2 z>b`+GX0=9{n2rLBl3oN#vd#?D?3RYLfgNF>uyP>ATse@?o5~Edv-AE7#(|J)M54KY zRNp{8!5}p5%Gi*B81d7#od?CK^eXi#H_*`R)u)_Ez;N_)pvW{5t&ZsXlY!0+6fPk_ zLF@LWemr=-`|(Q)b79Dh;y^BQOPd!967d-HuMH$+3<4CzG0&lE5B34zb;UQ(nRy2D zjPw#vjI3**Q){qC0Af~zfv9|haI_$xu!5j3?+)I54;p9(>w%D~<-%k>BT-WP6A<>L zZrDKbWUToHDnnmyfXk`n8))C`PoK)OxPun$6!*tlwX&lH7zlBkR-qdx+BtCrn_|a!(pyL#7>p>#m`@*<^ zRN1cw3iih1t_;|8Us%PQ6w8fa&l*YaT5p%$yIbLBXCPAOS;I#0hdxe#N4c##jc&Et zt{QOSK0Q1iOxP_<>xFJC6mwzW>w1Ku#3!F=B>DiSv?AAvM5|shOrZ`E=0v*y?#kGN zfuwxjHf__)o~r<)(=%b#~ zpes#^zBl8+XUv5mH_L^wWY}UoA`rlY{6=$OiTwNW8v+cH(G-{``NkkHhmn!NgCyR_ z;1dxCx+M%KTb+*QmoRQ1b_+YeovFxr^*{@`Fx4fl@NE2wz3~J*PKq)h0k(QZB0B|% zCDELP-gt3B5Hk>VrXuSgX5(2T+G`9G1JOJb%>|VC{mn!L{bBEXTN=5dINbmJG-nuo z3=WerEfge>LQ{eS8;C{jWnKhLM-$9aiK8Kg#;MT=F$8Kv5QMyoF671f0rVT}$LZV~ zCzE8}@AgQ0R5oI6fNPH{?`r#w(#+%7xQYW9^a`}8N9ePAQGj()t z87hsTW^?(}{<%gYD8p->`!N}y(R4@(6dK1Y?56UoQDyKsv!9zMAN9wisn8@m)DNWl zF;HkP%r}r__o*9Zy>q70D*>}?AgP~F8A#&)Jtm;=Z5iJ_K^FG&O|@FiQJ-wL%`s+ezWcr4Heb&fmSgP{d#T?lF8~T?2(;ASs}KcW?8PRid*!j=(^>4B(f|o&&)7i+q+D7@N9*7H>Ji23qA} z$*0W*06VA99qJ|r4-AyzV3yA^O#!3Az(NMnm&NjrYE1_~DI!+N(EHt6d|M`Bkuvx$ zO-K*}1qPbmto<%Gfxb)x9~Xt!n;&Xpx0E#h?_ua4fy3T{TZ`x_M!mXywm& z68wHF6SUu!dpDg*@#Ta{vuhyFKJqnQ1{%JwCp4z@fh_DJbtEb~C4k$$ff8kaZzjyh zVhun|r#>4T=(MJ6Amy(rz-%^ZAh~3FH=&t{8Uvap-H|DQHLZbx>J06uPlTpGj>GD> z;|5xCfkq~xndc&8OA#fyuy)9-!dfAsNDb^*rAZ0uK&n)V9yQEU)-**LrrokrLtpA} zZgFO9YKlTZ3`7IU{2dX^H(ka#stwdh5I+H`aiYP8 z#)dsG&?(TRX%Z~~%^iE(KzYDD>p$QEM?~`{Xsr;P0INiL-o<5-rnk zFN9e(kjTOw-3<#RVc*=-6aCR{>yZYk=CoDcKnD!gDhbRQP|A`(`IE!mPk#aiD(8&c zxPcCD8jW-R0bKY7N-^+VH84;YIHf6~RT$i*)v$pYjc$wtsvS1aZzb?Ug(gOkHxmYX zVVbpW#LIkLi0K`F|D(Rm?1G{y>O0m-DB>Bv4m9|t(m?y%N~uIj_JXIBQ3K`NMw*Bs z%k2YtAP=%62{z1TO9+Qh9%f~)$f zI%=RDx0-o5B_NMkHqgEEIf7C3!a(9RYM^gIF;Gwk`u{PIn%0N{0|lHrKsP}iS`)Z= zLsK`9GH((E1`2avgXa|zBx?*8Q3?zce-ETq>Nk$lUS84Z*@<2Px6!~rVImaC2;Cb>HGmui` z;Lb&D?-OWOeHLceK>lrEql8YT`uP4C34+3v=wF}0Kw4ewy_4XlmPighZ3CHIc(99g z>XUE*A)~-RTP5*;Q?1$zveo8!`HKT<^pJtlCAs{@6-hSQHn&=DY0(jx*#96D0|^5e zhLK{|x_-jOzerxf`RyDEu+gd*MZg>q9Fqn9e~$Y63MF?lbd|c zO0o&OPtxNC;y3j)NfL+ow^@<>vOmep)hqezgvJc-g)zs_^-Rl-M(xHQs>s5wMh=FB zIufOU5;v?)K7oN2m}ek?x|lh(aZE3S**1`8pMN`}>`T86Bzd~|Kw$%=IN)rMAj`p0 z3VqrJ($?UK1;~UZFwj-Wvj3ENT5JMrpPrSRC92Exkbz>AqobY;@bb?z zKwq;^P9%>lfLE_*62dW%!F!saC%ZhqZB-(w8gJuR^-zptTvy~X{TOI;FHEWVJpqTC zTT0e;b8>|>)HKD6Y4R(dqWn_wuqQB(YJ5x{70`WY*sz2`m!=L%LE*FUzdVhBv;_vV zwn(6MfJ>7;aRc?aY5{hZD0u{2rUL_wQFO#VJ|{*MsA(ex3S(}%Ks!!8hYni5tH*#{ zW#H$N8%Q6Dfi!nt9F5E5inacH^Ha3tQkoV~Zq*7O-3t z>^eZ_;4DcK^7IB$);Um-$23@NwJ30b_h&nc6wu$6x}oRf4B*>E!8;c?K07n$J}N*^ z@J(KbU&+rFtlveBS*M8zcO<68(bTxZc{?f2g)Lp;;viety}_-f2>cj`lwkvDP1u!8 zA=T!d+LbQsdSNAX>4+@s%;Kj%#nKfQDS9EybQU&dp0I&JEkXAg=qa->ZJPt-4eGPT z0jm!K80Q(9CSe1qiD=Xh9I`D>I7Dv&a7zLYZtoK%gQtEL8{_nx)CUXV4B(un$w!Gs zqbBva8agwp9f8$U+5v79+GA)dGy$Q0pt)#&Hb(`h%Y&(UwqtQ`U2Zcf3(*h6K=h{O zFz+$mSyG68E_3gL+glcuXyd@NsxZmy>8}X*?LYaeXri_br)7%PFvzk8|YyLeLmh1^i7{<-i;RmYHX0t z{$=Bi5(Df;V}+(k*g#4J{^4=G&SizC*cc$!+`b}Zm;2fg(=gZ$Jtymp;U8kD(U>Qq zSSCUqmq4pP0`nH|H@%lGQ2I+HT9*dOSZJ6u0paN!bDD1G!JVlRGnOz06QX@6gfTSP zO^GCi7NjN<5qd$)wt*hHH#MAug+|ps*@UvdKr#ihwljB_q{n=UqN*F6`XHFVK=o$x zK&;&b?CqsQ;!WKG*ea0{^NHI)GbSz_h_(S%`6HP;KV`s4nx2#3hj``!d3lPYaA{RD zBprjsSv(Qj=rQ1;?|!WVwylV#fD4WCz_mh?5H^ruXoiQ3jfRl|@?Q$QUX}46GjE{J z?wL~d@bUPs#)l++`=nV|#>FrP6!3@hY3+rXZa-(46FYaX8fCF`KDNSOFKpie;I`W~ z0B47$M6efDhdj7Okz07Q%2f_On3MgWT@obQV8{C_bef2;fiz7zNM2VM=tmt~)bo02>W7$d1IZLDTn4(g z6zvy*Lj6D=y$)0;moGEqQM@S+vqu4MuFK`r^s9}vDO81dFwc<{Of%-;OXfVr4MhDHDGI$NVGlCv z29ov>5_<4_d|;plI}%@SEF`J{$1mj=z{Du}+-M9mC-2G_H_$*p(mt>Ld6bzqP-swV zs3YB+YD5zDL(s&_l1Rj?mniDS zTOf+GjT8crev1wCL;3^Ke~_QkopCp7Gu~?M%{&^TdGi)J(5Ex!oH@rcbQBJOF^kE$ zFo8GsKvW_O?j*!gVbl2^7-&+b=&1&p*B|J;#(|vcp@0aCnb47Fr)VC-IKeq-69j;O z<-%t2#tk%*&j&LyVYBarefF6d2m1b<8;CKVi4}<$d3|>n$)eG|W4P>>nHwn5B5Bi_1! zKAbo%gVGPR2Qs)nwV9p57;`{^^Zw0L!#_N4pTdZLMrDgIG7xzOP6RgOJu}dV*I}Ug zi40R&pi@1y2b$a|njRTu=fd83O*CTx=!(R>lKY^U$qYRF-6`ygXfT%>Y&elOAB+SC zDIP#tYvyvzeUbbX-?5qt)_k00AQY}|zkH8`N8oiCC=?%YR9@p?K9T8z0T$|!_yK)6 zetMs1<4LgZg|TcrV*%(m5Z7wAa?N@&k_lS|k_MHlS}RzIB6pn_NJOrBC74eoDrCo# z&dJGCy_h-VMg~IBV$u)qnx`?4!=c9wHXVA~`D6yN%b}@M*pzb^-6WCa!WjSM6vq84 z8{cZ@qCVGZE0UK?1BD}bms3m!6Mm;F7RgFHLdO+#l@|kfIg3DQ7PCH4+9@Xd#6W1T z7!1Js=BW(y+rB~m%%LZr(m=#K#y2VuO_wBodM_W(Zl*H+BX&IyXBjAkW6=RQ=;uZp zN210n;w6qmq5&Z(lk)-s_$j0Q1YtQZ004K`^k4(Ij%C#c@0_PHPzW%qe>sM$KtPfU zFi!H_LRjIZ8%U4@Vxa#%xY>Ye5Omk1%(M_yk;rmkjKvHj+?~Sqa4yWBORQLXph{wY zl?0-(fwloqx>%A(ZFDjdLc5V2u#h5G+eOt2@13VL5G1#>FnEIMO00a@1^|Dvf7y-H zV1!$3oRnJ6t&Yc~UBj9v%Ow@uZrx5(BY&VT?r$#N9K{ zfneZIB&aO7s{$At{E8bX$IHY(``Tt;B(2Rq!Qi(G(lh;Nemx>JJsum#u1TC+5ybif zF_zDT*#;tephRMYvsgc_CyR1SKqzY)2>*JW7|13`es=qLpd+-C#66P6nBga6mM|oEu@HAIA)o46Nl6Zg}TBt%11m=BWqIG&muj8;)ue0QjIIzJ@<(#{eLx4%$GW z)6K3A0Nj7givmr&8gDXj2V`2v?o|J%w=x3P-EQI>?s0xpf>+BR0dSWz2zahIfC?Qrk_=$dG<2NDI_K*;4MMTvQNkHmoxLSiDAMgS;~N%~Haw8U-8$#*rL@EHxX!yEWYnxpSD45Y`vAbg=D1Tb*+92Jl>M}#Aq>d^+uZpAkM z6J7jXDm|-*E{e9Z@lO(o7IV5@y@+c`3I0V?$-%3oq36NC)9d=b{qrxlBlLTp2dS&R z{78=xD5mL!s32#n9U^&_L;cf!a$TaE+Z7k)H?f6*{k_ zdE(lU);^Brs)ZUXN5J_=k?8R~kQs?K4dhM8gH|gUX$c6Wb8<5!AlFqz&F7Pqx(fi( zaa{RRLe#XLC+H8fauy#T04}dITyWgpPBgYbXf+zGZDOEwyW7F@%a1$fYPSW# zpnDnl7G9iEmgb=dDFB{=V-@Nu_Y!|Qx$u5)O7oxjC@2Iu9=2L4Zf zH8MEvcO(8~DiW--&*9(>wYR zUK**R>;kNvb^*die*;{{t2b4>1?$xlSN$}uonAxWOs@`m!#yN+;x~ocy->Aqd!}7V z@QnC|S^zME8i(q-HmoXLCq$LM3a3@Q<2pF~8v)l=4#(H|X0*;jW1SBm+miuWz25LN z-ta@XFg!ZC&@cHVPGR=lc*4IY7V>@js~8Vclb^r4F2DT z;JqDgOB;U`_OXFR>+CYt`Is2UciY?bySsWG!o6y0eedXE`#}a01krfVgX8U48Ek0k z!wlq|OnoT>?P^LB2uF@G_~TnD0?g3yE6L68f&tgY25N1_NB@MtA_khEplLT#4L+sf zK#vuPR+VcGFlA*QWG#pQ5_$;$N``@I7hSL0o#|acP6^`Gs193Rm+KWoS-!aW-R-*U zeLFG`y6ws5K1m`58pVOo@540!baJsHcJQx3Q@h+<_eltz5wG^A3rtd4AK}-AVIW-C zaj8WOkE$pfPe7{B@VdR%y#(ZxBmitzhjqNp#6WvW1OTFij$xon9#FZLTD~5LOe{40 zGjUc10@kShp$3A<{JfNbgg+fO_~$6)&<}Aq`e+X;Crh&Np`%f1EZoBeavyE>{Q%%< zEYKs7^3Tk4Jb|i-eiQ@cl`;>QuI>f7mj{5h79+>A93&xL4}-h1prc_s%w8Y zUqfpKxz{?^8j^VmYu(26+qP%SK(4dDe*%Dx78N@M9{@;=o>INcbMTA=E{@j0BuN~; zR{hm9P}eY!@1iSZwEeqvu0T#X1^_8%t}`}JUTFgU*ZdR0y)FRA|HVM`#6sSll`(l> z7BX^u_`X9^!{PehI;lvEY$}c2jc7-i z7Y8z5CYJ+I2Ab8O?BNF5(0}!li1fwjx@n+FyafO_5l_Oc1Ce!ZmM^ptF;G^?5p`WIYoL1*3wco>GgFCy&{&T|YxBc)K@T)g za59jubk*P9*`@ew?)%HEv3za*jI9Jc=5Lj(E7e)8fZPbio}-IfR_iIo*tcTz{o(- z;W_8rIX!Zl25LxvI=vJi>2`Qv8pw0NBT3ep@Qk3K-jxvIgYk~@kHU!v{B^uNZlHX; zebGh`z4(i)^B34a);g!O1~E`5{;LQmsb`io(7n0wJTE#)uX@e~amWS`8`tv!k!b(P zi63lsI{g5QNVk6-o^?yso}qtx^rz}GdnCF#H^blip4jLUiuP~MZu*CdOf00@bC9Fh zJqO)u&+*B}mVq8G8;_!A`iU(6t>31>G?4RF?`OI=63w;a4OJdiJ*I)OgXMy~(t1v%3|xn85G{$35kbK>smzqhY1<45}- zb>iJjr*P^WH<0f(UI+tT=dQ8Nr{0l)P_1wqYwm2w%RmtQRo8D?c=PY;#^d@;44DRUC983*5P22-VPe&I4NL<;ZK(C)CvG4Hf<#X# zgLF02b-la-rh!)baZNidaqz69`*Fos+(Qn)+t+mc_87(u#LLRB90076b(1C98A8d|t; z9O#$Fy&I1L*<(Na3!k5Z5i1Aet%Yz9ehqPGn)R>*_X%x?FotyC5#ZVJ9cR4=2(BGJ zOv8WRf-!{f_&W0k9$1FS^TGte_`EP=C&SE4JewRpi#3?Rwk&VM1PlYgb1~CD_T%2j zX7WOx!p8cOv1vVw|HPE3%_I^na8x!P1LXHuJFC+1My^Jp#evrN2an<*c=u$P^>5uiV^_48Uxvx_z$LcX=NSC7>@)JoRopgbJ+MH z42@R=v6AT7ENY;1PA0Sj0C+V9vi3mu+vJMGkLY<}vkdelGZ14s2&cU6MWV?b2%CvY z#*^OwwgsBaq6R|yI4_pTyTIV}7zoP;KdD<8QwxIVyYauUQy60rCT8QYf~ZLJ$U5Ye zT??DTn~wvTSK}$BX5+1isjO2y<3D1@fyD8eXfqpcfyUDDFv`iZTN%@N^9CXgnh}Sl zBGI@-*|byGSIj_+8QAqe^eN2J4`D13hJalQo5fo<(1&-!G8UQ}PoVCFv8m0B1(ECpFu*D}C-Fagct z%^QfW1tK+xHq^DSi4}?8vze)kIZTd33ntvZlVO1FU=`7`c=HA_M}|#r(n`+@qdL{I zTo_{!=u=qw+l`I$Z_m%qL*Irl>2w-@dD8f09IuBljYF8q8!*t_<#>8zDy1MR48(3_ zFqVPd1986fRg7fJ0*du&TtVJkcr4N=gF38{l9j$QN}Zn8S{& zO`2n%loJdBnc}KxAaNn{Am`Y71eloynmjXg%Cw%5fmkk#@hGP-x;ux(xPMqd;)4tX z=m*zC1X##G&QxR%8_2z{=7L!l!12Hhn6*I&P@okwe!7AH!uc=&AWtfoOUC?Q;NMQ> za#v}zP(9Fn0Z|5;eKVCsq8UpXi0pyx_eivBqFJNpWel`Dw1K!-BnprT4icqOqEdIl zTBQaUwU~xLqFBl|Wii%)gvpjd2PsdCZ>;4*$*Y9{2}MGW*I%_IRCPa+@_R*}e9 z(m>O2>~0H@qz{t2az3sjI5?5X+tfBU_C(wHA|Jj7eY+lm5`LJ#JG`x z+-hdq$FCn(@&MbF)VlP=d9ldBB2ggvW-5I*{@$=2Ru9Bjeh$iDtPl#(#vKmB9(3xdo!q@o;A$)}-u343ylBMt4)0%pSt0uvIWPC>|Rx znHT~gA6z$#Bj-0(07DGqYDOd&gA=9IL1cZQT$r7YxBO#Ch^|MZPhreJjD?`Pw2sbT z#*@y40eP@KtuJMu3MNwA=j?i*FgDN+YRLub!8!utwUSfoJG^NiUr+{{)mk&D28*){ z^r5LB{Ej|?+5RytWQBoPP4qwPo!v_#R}{ee>3?%BmrFWB0@H$2q!A1aLn@((3={Go z<~yhu@}*G{^XXC(gl>x-8L5jY%bRYWOKc{nVW->81pSE^4&HW{Ab~TZG`f=_# z=bj^Y79*#$QUMK&=db~U#E7zY5(Dk7twq-*fB^$RB(n)?>N*%mJN0CtoZdssKyLpb z0u!{OW|D7GCw|Q{&CXQgYxL!K?ijW-Xdp4ARWM^e5O*)^iGeV-)6l{{?=%w)yn)u$ ztfOAAe(Kn0X?F@U&~j5-1`}V}zb66U)K~*q=HUi(a1DtAL6EqWA^4a3fn;u11_i`? zp!d%}O47fYX#s%bav}PnrhUvnxTVGDH{@7dT2CaM^u6iHF%Z`fWT%4ot<9E!_z7jg zK!WEO$U)OU&VdLBKV24v#NE{Q$v`Nk77v3g&ME96!28;rix~(4g-q0m967ZPZoly} zv( zmjeOC{)P-)Wb;Q84aCo?pL8v3Nz92BJljAR!P5z4l9Rt1Z?RJMi2*_HnSs!LrjB5G zCU+#V$EbB-d{6X}xEn9v_=h)BnSl5^8LK~#`(@ZXi$`F39MMGMRY%+2SP*ahw+519 zNwwgGS(s{D*av(bh(Crg{|vdADmE4hp4X9xo%Wn)t`>%vfnIwcIFo@k+j&9>KkmRn z@ZTCpiZxTgS=>I!KwJpK;Fk3;M%Ti=5;2hAIUR|;G!X7nkOhDgY3C4{DF$+sbdqnV z$3GBqwgrp8e`_G*aLEW}V%8b0%s(G;nP_fb*e7B}qJU$@TNze6BIQXn9{L7!%wiz# zJ;~RBvQr{wL0ACR;5}!OfO@a}0vf$Fp6f{bUgUuUQ^9ZR!FE5;a&+BcJE*rQgVH^P zDM1A+kT>W98ztxglV&)cl!1b_tGbGTf;~YQY?RGq_FZ34g8ud% zBDX(AJNaq@x~x2s8_P|oU47*RK+AcWM z%2k-eTL?h8*F#rl=Q`0G02iU#TRoodK$o37DT0OKb|HYM@%GADo*dK=fJ$zz!xiJR zKQ^mz`a2p5%scaIAciHK4@PV(qz^6;O%XlOg4y6>AgQCD=cs`~SA|@(_?DD5F}}>@ za=W{+8@=Q)4YYZthi_Y(J4d(V)(eo-^U1Z~ZaWl@Q3HkIrzcsf?A6kV2cFWXpIT81;3xJx+?gY5bbd?$C$N@dlB-H)QjxGp-q4))& znWHO`VFscfcKtv~djJqP*B@ZsnQH@mXnsv@ie9pp^^Cb2|G6-bU^IL+zNBliVW83` zt%Nzx^`vQ_t$4gh-(#M_bPWTgL0&Yl9WzE5whP zf>wUeALx6m7^s>8#s#SW#j}-4J{)unbn62P76SogD?}*aRp^kn#T2DY;?zK|6aZ?V zuG1ccfnJ=+J<$|C1{yseXk-lZg*b%?Mq|&3w(f<=RlRGVYhS;Cu%k_GfWF1bMCW&b zu|=u?jtAQGtcUcjfqv*WP>K*1@pzJczyFwoSKtpqbQ5Nv8)2aTnu!gGoPLI8ftJh} ziL4gJ;0+`?5(VQxhJc=AqLb%_ft-ecynO~jI2rnD4>8ObD8Ge((jw;o1wDM<)*cdP zLkzSVCt0v4lKci-liRY|B_Ry-PWWIf1c0uG7|8d?6vIFr^4bSK+TQ?Spm)MF3sXNBb_n}$ z@DOIjKue+)CYT+*9|-UEVj$U$fno=Goe2o_s_~@5yy3Vd8bsoiC>UH`4KWZ(7^N=^ zjJ3G_fT2##*MJhJ1%-j8#OeMwnR#tI^^d(Xm0Ou=t;!G`iGrEnV<6lJ>6+Zl17XWR z-s@0XMif9+EsTT?-vGo z4-I6k%CPxpL@lhZ9KR%bq6IU<&xw`~!n!807|1qIo5b50N+Q_H163<}C+U9->m45` zk0h>L_^G*%Y9!dYO+0h1wh@E_Msl%Fy9b_>-omX*s zoET-q+ir?Z@zhYI*Tqf!@YbI!K|uuxGfX9MFv4 zmLv)45BTeLm$6}PjCX5uy6!at`w@K=~0<6S+g_QPZGj^SgazhRmkNVZ!=g;rvL6mu#ADfc!6 z+urJY!r-|;zJWBkAJu9A@gcC883f6?2OxN&L^ZHmGFCj6%t$(jG=B=$6nm^>^aX)s z5nJGYYtSpxdu|hg&l&wzUEbp}I?v*wDZ+W174Z4A zeO1~q#ZYTkSNb7{72Hy+-VyPTq?jdhQ+X0A(+Ubg=za~TXnO3LZ@rsDxj=Per46-6 z+S!4`JJM)Q9X57nmg8uu% zW|{PO5#3-Kb0uXgPGasV_8DM)>mLURU&{2BuXu_p?71h8U(rnzUgT^8;b0jBJ*NJI z>r+hWCc+IBKJwhS44&_{)=Yt8!HDGBI%g}qDU@|$MWty5i0cy`=cwuFzNR07DQqQ9 z*|Jp#;6`WkDu*Dloef))^V9MH^Q}9_oF4X}G&}z1 zk1Z@?@#oIN27Phq$s@z6vlebYT0&%tSM5x)dbyW{iQ>!MO>2?uv2YIwjnhk65e~(p zp$I6B(CUCCSNT7cUfhId5+r}-$j;y`#`7O&a4Dpe$rFYldAY1F^XhY_vv~xu7JoXO zgI>0qD3_P^gBT5Xn~6a26-t;bq;W8?N7+w&dqmBHVzYBw45@hHV4eN#an?KZ6NT( z`n_01STGfDUL0?%P5a zJ8Detw=f}w#c7b104{clni`H|em))QRy5M7msI-E{|O#^tp$Mcr$W{P^_;j=SL);N__w|eR( zM}jHF8ddy8KIW*-^NZ8LsOCu^@Q(HC?WiVuZX^DOnkM~kGt$@;S?~!?!nP&CH(vXH zsbV7^%a62j4YV1S850bV?|t!d3K>+@$aSTmGKAri4j$3*f4;y!Rf}>mDRda!-A!vZ z!EbC}!(vg_9t;zSjjit6aO92EnIIqVr-y!V)~h^6UlHM;(s^;d9<)Xx6?wS^u+y;> z?m2Vsd-~ujx|JuVhr;l`y@s8Jp`qHA1Vq9*Pt_i?r00Z}fKV5$y6V>s1Vhp8s*QL; z-`J>s3M~2a-xk1oL6sqZmz(0)nr67Yp$-0jd0ovsL2ES7Tf@%RF>Omh8QpeD>02a> z^&Z3Wnb9dJ45xhCa0vw$p~O#4)MhJc3#L?@2Cv^Xk}5B-H-4>Q7ztS^Xzt-LXje5b<9j0*Vja1R}kDObMR?ozNw$V6!+7eS;m zOZZ21EbUM6GLhSf=a~se2l0J_wNe!(!Zxq zKEaKW_k02gTd`napsWzLomCvoI$iAlf<+zG03Oc&vy`eVlE2|Dg4BG%-l;jPjZcO# zFuC53%CFc=mzHNTN6I#zi=cMF(rhnHtnRCebTt9K-!C4y#74!LpQ(lOkY7c8Ig)mf zhG3A$EYj6HO`{f>D$Sq}&=oBTNQ)~E2T7i0ja8DODdni!&Th~eMRbJ=P zMZL9HB`J49H1Cr#^!{YR|4!up#xn@YB9txp*cJZDj0(lk^lx`g=Xp=?Y!WRg;8Cjl z-7!J?w|yVuE)zWe@1G!*43kYDJ`uS{T{F_893-V2#x6orZ);Ebcq?(6y-P(gW0d%L z%!d!D9&|X#qo(VG=pEp8IbeZ0nf7wETm#D=UP5In@0!Rbo`oGA^ch*Yqd z0lFG$j$PC)e?H)!`z^honvH}#koXn-p=D1|FT4BW0)jX1B@YNjNm(xhe0zTZ|5XGW zSuRcbSHL~e;A43eA}Ds6S4LnkOQ~X4VfHR3HVhG$@k8Am6Y_jc7<6ow76Nucd@SG( z%Z`tnMmEF6u8%!of2sXY%-*XG95ff8^&iF+t-=v#2hKb<_6B$Tt?Yv*5FC)4XxZK4`gIB(6UMsn)#pq$x11**A_Rm3G#p z?^hM9VLSw%yiy%-dIm)Y-T}y*p{Q#P^_q}CUunr0G+^|T89;T(>kMP~udwwmVEuOK z;W^$I;5oVYoJl5v^R~6qTSqXZ=Ma~< zeB>k?Mrz5Mnk-ubRkJV~)P&yL?};@Q%R)RQ^(940jlb1i?m=&qH7Y55HZdxc6Zo&< z731Y=>raM0nJ2K{d28X%u)Xbvw*(tKHrFQiQK=&HwEcbZ$RLNt3jzD&FSVm84)v@6 zb0)l*h(b}KkJ_UHGg?&wV>i3t!;J?Tv#Iy!FmE(+;pkG@BIkpcb=#_qi(b&Z%%n2HSTP;Z=v9DwTKvjn zUXokEn7eP*UQT<=^zMrtBE9282R-YAVg>9;6hV?|sDc58k0k@TSpY@jYs z@umu19{X2`5TaE0(c2!DjwQI}?P|3=Yp+}d4-vvYN7YBd*h=>=39RvCC`80%1qC(p zsf*8rM?&~JZ{npAp5I_CrbYh4i-A)wuA_RD&P8j^hnn{~=L5K{CkAr`{p<|Q?;sT- zD3C3mEW?mug5%-$;YlEY8(#~u7c^t24f*;E+sSbxAjV`?Vcp*@HV}q3iEsA$?a85} z{sLV>(XVZ}sdLA%EuyznudNW)WWJ;cl^}(RoPkn+lszTO_4=mn1!iMeG9S`}E@<=G z)JR?8p?BM*eK(P!v9_)FNZMV5$W0ugJ0r3w4*Ch=hwaLWrYs%ipOp<13jY0(jrZZJ zkL$O(bk>5}l;#msoZy`x(gB?m6b{*wujV*b8r$hx#qt3`t#|ux#*P$Q4OGbP1>AZE#YZAyWgylhI}( zQ#sleo{k+AEq?o5=NyZ@t6mCwaW?OYaLA;>ax^ErA5_i3dMSJ(sqBt6)lAn59QjZi zO!}9`uLj8BCJ!at>}bf6g}ko(Tv`2e3cZR=VQ2>rZw7%*=SlUHs@wcxGUE*Jr!#y3 z(v~sgxlO|nHV^@dC!M3}Q~mnxy$|w5@(7^%&uIcGD=epuF44rmO(CrU?Cux&KRBF< zVm@kHxX4Q0kgbALSSY$^_H%L5?3~SvoL^TiWO7s%twq8cU9=#_PXuH_sX_J$=wZ#) zA4r^|mZhMoWGZNlPROoY-fQ*mj!ua8vS}84@q)X0on#tz0`#@7-<{nn7F`SKcyrz4 z@p!^GDOgLrb1jaY&E_uiVU$wIzW2VGGKbDZKcnGfpBsG!Nc%c#r)jW8{n~=9A?tR5 zx76I)qbA~n<<48Ypq)fJDjUOAJ`+KrY~Bnh%BA$gYaI0yr-HWLo!BuI`7H%HU0?ax6lH}en#^~JrmP&A3nrkab4I87=h)&aD46%M zx2*8&%EOwC#~0Boo20TUlR#o4PiS~d}XiJnVKuswwJMPlaR_1a1?jrZr=INENmqrmHSF)$2&BU)Z9xiW#2mjaYj z7#jBPpig%q=v^=(NHvtQEImm;$Cash{d+DIV#b0*L%3Tr>n|nD*71IiQZ;0QPhbAi z3Y``ontnzxuq&OXa6V9=Zhbkl5c3gzm07*bveq=D^zl^4ek4Zbu8H0WX5uWjQTH** z+G@Q5FH%((q08lFRxcx%Cy-$6L@h^HBnLsMD;+S{h?sD0<3w3AGUhyqLsZ-2R*X?H z#5Hk$c!z;Wto!C`*B{zD;@CBE`=5}vNP&_UKBf7F$7%S~afL`IHzgNl(9Hz%8M(az#EAdGQ4wV14$@(i%E z8v^zUO*LHwEjP;(#;!Z75&F!$A^|k=n)cpy^P8*mZ0^et_d85$oAqPB-sXU=pYmK8 zJz}f8lQ;i)Z2RUWAd;1=XaXkT%()dr{_3_E!J=+S(@?PBL4OU0YzC4yWQ1OY@1oKH z&5nu{F?6KXjm)AAk?IDQc z9v_z*IwQJW{$U!K*f|?@A<1$g%|pSu4au{}-~B9@cXCYshdAo{cWWJ*HbvlKZtwta z#()&RQFPVx<9B~Mqe9pK_G6W)^=AqJYM()@x46CIIf6t<M+| zUX0kWLOEcsM1^v9toGZ^97i0sWcbAS#6Ux^QHB?@qMU_utz#SvE@UyM6e<%m8zU2Ez>v z4~6}i<`=r8iIExLv;`6bcE&}+=Xd$*V7Dsw*y3$${L14d3~{qf5pw1T=;YG((+{zL zy0>$NS#r(GZK$vs+kRY9rcATV$@nCp$vw3o@^t_SL*78**8W;j>P0UAUy}?%UTK%v zQ6)?)1l;L{ucUqFUcsDg!t>T1ZfMCs#cAeJ>M(;2mP3#m(b`4p<+FA%p#g(KX zy2C^iOV1M8djd`o1eTV;UcD~E4!L16+xzgpYMfmmL7ZgRflvCmR~8ebuKvlX-gx6N z9u*XR%xMm_z~*&K8t*DWMvULm>$pcN@Va;6#DvU&?7t||N4lG>pa(p`>1cm+QoEVJ zW=)6x<)T07I*og!#!E7d}K7v=j-LrZolCrHQmSG!{~ zD)K=uD<+yy5rm40$|Qeo`p%`1tdXE3gbrD!9ujuH&79(k+Yq>E7*gQ(2BN;M8b{6U z!_6-ukp8|07wewZ_|>ef>-xxw*r}GPzHSYjjzqiOg~PwGY8@gJubw_e!E3ybcN%o> zC%>%XKS5|2w{9_Ay$@A(tE`4n%X3Z`3Z1?CfEfjJ3+wkCgwbwJmhaQ$ z-$hm+4RoSjLX=95{(`LP1)k&kaAKp+eMK_xeZcz$FAo=c^iVMVrXwV$u_H!GzaJS? zw&e2t=KDYTfuu8A1Vlo0@36*31$HX50bH157S`Ds$;WH3yE*p5pUsurV!bY@AQ3>D z2Bs=JXxT|Q^|7rHAMu3JaMl>m(i&|^%*Pz7q1kCY`#OVIt^)3bnvU4f@7G0;|4pK3 zGru6~{#hOu_c-!x)knSS{ZwkKCBKkJTB~EzJN$7O0PU7hy}aLAiBnHbE|JhFfrUpN z4L{CNNYnBf8G~Q*z%LW<_pnhva48FoYIfxQE5e$Sax24oQkp?Ke(vN>zeZ z8SwuyiA~iPjJ#cY8!9VLv;u4?ZcOu16(l_+p90DmlLYSG-i_9T+%I0dK^Ie|cX%1( zeo&^{o4uvS;WL{zrWcG;=rGYl2lI^KG7BB zvyNH@nG$4Ee6lekwykfvb`)oxdXA+&TP|FRh#}*_ej^n5%JOSo$EGta5wpFV8m53Z6<(#j=_% z_(9MTw?c0rkir*^2%dxi@sgeqGcc&RxPs4=;C*8nW?)gZsQE-(h=zuX6=z0eJ|et{ z*A*AfFIwvbd}QGQe;0wNupg>jK7@OKdIWFa6p-fmKef)p3=Hayg`>oCeH`-#p1E9i z1Z^S_j)>!A>~UPxU=1On)BJr=A>@*JH#s=Z$|i{Pamw|eOT4H50Nt}k+?X1M3K&wt$+6HJ1m9B_BanTBzGL^r zoT|Aq9Mt6{EV^Tg>JT#wvY>Ah9Ct&F!{prhE$A^WA{~qH7};O=(x$jS=`Y2C z4ZwL#3!p21;aAsE$T_)zUp=>92$kV?ziYCR?|9t$P(076BV&u!PLJhAmkX>6yl@oguAZmoW$LEXwM4@cO>D_Gu43 z1F?UrdBv8QzWoOAdlLI0nJT0CWENUfVOootEa~|y*={_-y{y}_^@9U=EJ`QjxGH%X z5B)*@`iULuM;g$Pt)m{}NQ=mGZd9{~d3lhAkw`}JnQE>9?~bAchKgp;E@s`~JC0cT zb>XYHMdFuF-eS$clUMqi6@iziPoXv-3kArf;99c#agRgT zFH0{nqNj}p=8M0IPNJ>dej(w*M`@55I$S+uVVy)nA;@F7@aO62=Yjz@ND&^_+k%=$ z8*oEw6SxlRoP~e}>t!Q68s12WhL!GR1)3i!>EL@|`s>BsA8ShdzRS2b0{w4vMouVi z1KH(U;Ga!;7jJsF%DiFG@ZVh2 z5wlBtCuH_q`}|E8jaoYa=G41;i1Or0Cl4==DJXvUk=U0Cv-$ozK2r#~X5jo3K)K&Y zIh3j67vdgV74o|&f6x`-@>i=DzzAId+*W`G%oB%n-Gnt2NVUg~Mll?g%k!juD=X|P zyw3@?$&`St>X7Izrn(wsCjCOBM`dsbgD(87UyKJ|;bI~+YsE7$!k5B_xjq6qx1D@7 z1=af}d=TGdYC;&@c?*h?O_`Y$YW!@DO57bbdzr)Yp@<*cJBu+TZI&3)5GHI&0I z67`h|OV_$;u@hy^@PuwV%{SX%5}&2{LM-OU2+NXZ79lq=HereNa3Awa47Co6!x1u` zHjIOt;uPq4CW~AOh(RZqMD~wWmK8k39d&i|lw;Sx2_PQ`GYnHMmXpldWs6+mo3_bZ z&e|hl`)sbVWy(X>(U$a7k<`hbfPWf4shGZY_WcCZIuMN+>eV(SYc5NwqafGEm!hF0 zs|@)Vk*ez9@vXdC4^_v)vio|Ab23?~x9$y%w^io{pSyX=TJDRO&y(8=vr=QQ-1dB- zB^yGMY&ZP}+g_r!e)5yGR+0lpOMgiK2OLSMDi-xk7sw-#0}_a0hklOFxgkucpF4hQ z2e05OD!=Rh7=<~te1FDIlsD&vn}++$HGaMYcmG48NRk!zoRu$1WQEbKx-Q%yb>yVA z8j8P0eS|4k+>}@YDti;#AjeUew-iuQz{sQN>YIWGr;mYKV<`LBi65YSI{F?@1Kw)P zxPQ|$hDT<;dOW#(;}x1n-|L1QlAZ{6e}&u;kB6SvsiLM>zDY{WNS%p zTyP0I(*)37S6CT_mNdW@FQeW>mW)S-`P>e1rHDU5Ai@V{ky}4zUT?X!MZx6Nbl(`eq3x^q|0P_x90b2c#^6CCosxd{o zJHKbQIXBP^@n&0hQs!ngX@s0|+8M^;_tH0+!?9LZ3ULl?i+myLzQHk+SXY>#wPmqE zPmeI4Ptsr&u$ts7olh6it4^r4lSB@WSd%rn%_2ObpR-I0X7VF8(P`}nF*ghkX=1;l zBwvZpF`!^{RXQTw4MMV%^LF^Tx6x8;J)5MPYr1z)Uax<5tGK3^I9~;BmzgWHtr6~71ID6TjyYPK^nq!p`CZv;RE}ByNIcEAP)aeCM@RZE&YwmGdfFK9v z{)$`QKanWh@~ZSkPPB^M|n&EHo(o__zkXjsvx7+`7ezZQv51P5m_PrK{EC z$brC^~(I;Sgb5L?B;aS=%J0su}Im*r0yCgZEt?KuLO&Ef~Wx3Cse z9X+`--a=GeN+^>lrfI^ETc62!mCo+*AnTtYPKM(_szaJc=nAsOKEB6?VBkjm9&&kQg18racXE1H z8#7kgIJUgv#V-MbB~a+6`M>^QJbzB@c4!`hi=8a{en4o z-}Az(?bkC$(zQb}LVo;nH_@BKKtwcr+epcp<>TJmQjh#pfY0^MlpNR_H-z{hJYy~N z(AnEZKn8^WAwYu0qGLfE7Pcyq;zqyCC+69Yn>)Gid*9J_q z7vc?;z&HX*x#!~02cg$Tew%q`X?yU`UXbf4AXS;k!Gkd-YkOFS8QL>#So*N1;W&~O z7lVM4Bs-VfgO+^)7XS_UyrzMIB}&%ca9hpupWcnVI7P1ORn>KS4o}2vFEP^t>a<;_ zhtcRN`5b0_|Pr>-$Dw=&__cN^~{+_*u zm5%%Y*LEvd%~~v6ERy6hUPJ?A1B0>Ts;kV8u2jrmWlfy{_xw?>ivqBlRZ1)UgT0ZYfV(^E(2Jmi&8Fd8oln8G@oc_~^_P8)hvF=S^@O zpeJQ^6qSa&qTa1HsDrgykHR|bBL*hcxmP2FeFD(X7!SJradX#asneDHZXJVB1LSTn z_j|I^wSkPHi2GDqo<$X;c*Qp~a9vS4UQ}9C4?9|`ftt3GwVi7TJ)};qKk6Yzy1lpz z1uc-3Hs!W`r@zv3Y@27z)`Z0Q_-IQ$1VHU#X$?e zg)<*N@wvh1fV`(k^1(=p(-7;!#-bnAj;$+JF+xT1h6S(SUUbf*&=DiIF#aR>;}9p&0*wa`6;m1ntL)Xn&C`h60<3!rlgYkVmrC z$^rDJxkw6ses4W(tj&xfvzNr+$GX8#&qIzO2PCDjs1vbk*Bh|+9NRCvOdDgtYsbDn zv>U4d@>j3Xu@sV2h01pD&uw>_@EFnSS7*=Sg^+gN?+)RFx^LYI_Flea)rNddQYPS# zq5J82{~N)Y)J@e?yVX1R=PCmC4Q$V^7%nyt4Et19k#!tHOX?~=NmHKnuBoBvTHp-c z?*EI{>oyH!)jK@T%N_Eo_xG^Wj{rotpC5tKP0qP!!QY_DLn>&%GJU>9u2izW&xdnx-=hM;s zJ~Opvg7KFhQC81}Y7#U4mD}Gf2zJdiU^^ETUUm5kBcMUnDRuLFPQ?qAs_kWL`yrSx zee1A{r%$y@^N$!EcbbdUKU?> z-m)g|F9%GTry|aY?1OAY)CCi=#+$gCgsj>Rnce5U7%oND--*3IA_!+ACm}0h$Qvvn z=b{yJHyDAdE>YnpG$JartRH7k`Qru;x;619Z`Vf z)gDW6uYlTF;JhpW-a3r}A<|c8`bV8iHnDzKnUiXGm1%~hz$b|T{B?%6!rSZkRK?n1 zH&!{?eMIH@L^Iu3aE)`D_H8l~pqrdD^Q*aRwWW*A4nA8T*B}F(-SAO6D!nO;I9DXv zF$JNY@{EO>i|Qyy_b_TmMKO|l7xhaa6UgNtQ!+UDk|7`gi-S#Q(deI$6uv9ozb~uD z*{rc_jZ}lJ)Uj-@sjO`9u;&43v%$~4{ezd!Bc29J6``n8_)^x6l+jSR-1DU$20V;Z zkSyda)Vho>tqHGJX50%VjUKo-U}j{?pA)Ang_zEm(6NVQPpY8_i}zV9Hwk{E1pDHI z;~C4t))_}W-#}OszEk_+Gb02w4h|Of%LY5ImI_xj2Qd_Wnl@RVn1?^ z|J5vWQP1|vNR_KK zMA9fcXLl+w=!(FPQnJMIJNKA}4cBYbm^SoOM9ZoOeihS>D_F9FZ*ZARj~;ghmspEh z5GA@Q!x{FGz>5tMr)GA5ahv6)KB^1rdVcwnPsmRQ?}L?NG!UuIyxQv4QdOvn^1Tmx zwB7rQDyU4hxoE|{!23;nIj}#-=jkjMIuwq|5|@F26ve8q;{y{0!G4Q0kH(k~;w}n4 z6x#jQ=9AMYN|?XeAD@@og}zs2cXh;TSQA8g6BGn+#e%v@2k`c?L|=MxgET`~eH12F z?XQHNFO2(vWx%|~3dU=(n9xXrg?8T{73*6zi2rF&Hawzrwcq<*${E$#XU)ije=r~c zZR_`vrAYR#Ka|rRErsP)i-ves%flWhC=;>bd@@Q7)nU))7enq6roQyn?wmX{tk;{m$_X^F8avy+9}Q^z z_+JQq8C}}-c)U1LfLR=3zN>TyY?<%|2DIxOUyvvsa|gKF@AHiD=`;vlEI&&Sv4;Ko z&{6SN>)#~p`q7GZQ0ZP|Zun6At8`guDkYmO3$qA5b0R>U-3h{JeCj42U~Kh=5=+gO zH-TD^G+GBxsTbnWOksN~7rY;H5;gbMdvW@oOfu5TLAuMY7PEDD8WhPNvAMc>9w@!#TQw&>c1unQjQnv$4trXMM7o zHOyHH1E`#2rLK3HHyB-5?>X{c(dEzD9OIx4|I89GdTFG_lI(7mzwqh{XVJ}*yd-TQ_f(^$#LL`0nr@kG5zNy>{dpn2UDzP+ zjEIy<#S#~OafiUd`!EYpT>U#2rd0RAh#k_yN^oM=_0;9`rHOXvI682B>Z=Tj{In*8 z7WPmRvJ`mZ`(EeS&A;pAVvCHXkfCc(VE!X4-hH**%J}^7$Lw_1XPl`(a=Pd!hYzqD z6r6__w+#o3&!xPTvqShcg21b&+SgzwGqZq!ybBLIzN)eD>Wy2g6mg;66i-x5sS&a_FM>(G%)o~VHZJeaJ4zmoscp%?_Y8Z$l{;wz zK3EifjJY4w20S11PRK2=*z&hNj+-B06^;=IVKr_u8p_XBDEhVF-BJ#uF#M*k}ysf>yauM{8Wg6p%A581+vBYSY8C!#Pu=hNNB9%%6;8Lo$NX}oJ8i< zDq6T6q`zFe9_0NZrZhh<9V_kr)o+N!d$MN$mHxymwaQ^q)J0Jm$U>dz9WWQTTn#}h zIr@6_q6G6<`AVxy|O# z*{!+K2E0xfuoK4KouJzoCFo#`9OHb5w=v7MrUy}Rm1bMGhGcYooZ`WW#4qs9cJ0;# zRMPAWElV6^Fd9;NHOIat$fPpwuMo*VaoEqlt4+1Go#gA^yXwJW2SN>6A2i0$ICM5H zk~yesF!sQG(dwK>`Za}ZRFe+s7)24jui4Hmb~M8}u5cIVCXk5YPFz1H;jBpc1``n7 zgMCMUb3oY*V8@ht7S~COdCD=>tOBRkf?P^TZeHXs?)e^GOgJIBo|J2Lj_?xcYj__0C$R+}|Fgyx4X;ss#dzyP0AW**x%&z!||o|Z^S zptuoHS?D|d1{zoPec}^`TRs1@mdEIMlYM~`>th_UzR4vfte^n%2YK(6eB&H$n;Fhb z*As?^5{i^#ea{ek>wm-TSLzmd;B}R_wNL42+pPU1=SJJ#dQmDHbRCqtX4N#4hD9&@ zlL$>r;Yfa8{{oS>rz?^e4kA&^5=4jOjRB_Qu<-!kxEv)NdL+}>6ZfzU;M+yj4-?T=po1A2993&|8+H>b}ld%tN` zy^Nogrg?PBQ+U;8YlZpd^W%q|3m(J*ZJPj5^^1?XA|v2Nllm%?HVIL|q_f6E`@~Ld zA5cLE4jWK;74RzaBluh7uQO~*5M%f8=AaR))j*U(UjXOkp&#n-J$UBste#nnv@KVN zKA?`$97C%B9Tx5nbh>0{hP+g}S=zR3_N&vW=ve&hR(i^q;?J=u!kJ=*N|ZW@d{mB% zlX2#7Z;Lbotui%!|7^uuq2!iJvwAB!x7&{J%nvJgR{eItzMv~>>YHm@e!qLE00$%v zTxh`iDe$s~%K?J1VFUZX@YjhWl(TrHo)3-2YO7=H@>pt?Unrx<1TwW~a9$c*Kk5Yh z6aQss{LV*9w<*Hl@4#F?z%Cd3bkTdeR;h}U$cgZ+4KJ=f8_ALnYiq6g(RR7cny&-T zOsW0?kKZYQKFxqIX3yOk2;ax7c!(O8Ky4Q@!TnkESVyT+Wz|#fdF+=joy4T6E$2gzN_bV1g%3Hi0a;#RZGx<># z3?h7DiV|OL{$%+~XJ%YN_Yy;osy{Rb6R8oO(Gf6Qf~hRHvl1)u!Szf@6)mcYRgN3+ z5p=8h*@F8dr(!p?{F^tH{HyRr#j$trvAQy#1Ep`UT(qe+D6m>t1E~Oidajex53u>j zD1QOEY83>pnYCXhFMn#xn`Af~)hf)PLVQ0Ub`4>AKT(ah%4+-sHvS1^Nu#y|=-5vc z##rvD$BA4^xa>JF<#LG$vWhxfT)o0355Gf7NlfJ)SWu;!2Es}If zBLB@C+|vg?%`R^{@qK4yET{pRgiYZ%W9*qEDPn#XrWM(I z>R{VJ5l-mzjsJPQpQCWwY_a}3w^0e59j%oBSci2T;dn&eD}Qcq+qETu62CEhM&6Vz` z(^R9?&lx4T`0dIttkiSejn|wMZ-*bbz@sevGt@h$$>Pi30nEyKcw?4BClUIu1;{JQ z)F^xnrTT@7ke07FedlGX<@wUr&eBeJGf97Gxf)WctVBxlkX%>~aHVg;Hi(I?DwXg| zl@1g+(%J|XyRytwnD()$G50Q-;7xIAg*gzu_VayYPEqeFs$6hktbDsVBDT7jE~wtZ z5DFSEie#-YY=(LXLgkVDekRZ-LQAp@_g)jsQ#+g)a3B2ecBwIvQML15i?Eh=_uf&| zfrEj2+wjHVyy7#1!P;w7(S+*Y!QtHipce=A0H*xZS(f;9RuruP{??CZpjC}V{J?JL zTb!2Y3!rGi+$c*T!{HO%>mq*i#dT_ZHlM#G&s9}??oK3HoY(i7l(3f0SFDO&urUL+8!&-&iHTnGyE z7w)BjRVVm52$g4pq;bFHB!nA?%U|X*{k> zL0-h{w+%N^8FS))^2`F)x!K&P!lXI9Zn{0>u5KSPH5Us{IUUEdPd4(PgrHqPjPZW! z6P0S9$lOnUjkB1m!#~J?0>Z##=qgvDUbrz?{SGV=Fc8;ZD+t)tv}J12~b!?qb-e_;K!?Ajfgv8!6|u7>g|=0mS~jYskO69O2<6H}&|yOZ1|W6VsZR6|4g#oR{&{(AbmT5)Bn z`16HSA8O$S-Li6y!SO zhP9aePuM%EYf`lAZj3J-YTV=eD`PtT>MU)?IKOKoW_wpg!bW5K`3{Uf?*0n26~~Gd zFdv0w^3(KYH{j?abXeb?!@q#Jm46`Q?+_eFz@?Y)Lx%W1OTwjUUzwUOdY=@@=&q@& z+js|`#QM^+KQIf+4x{h^W*zVPbbL5j>BR2eK)+`t^}Up_T^|c2Q_B~<0<@~<4x=s- zmmxdB=_5*pmu1)QZ85IYeRa6MX0SumsHT+Vo$-8shrW6X7^P zE7wJzMjz;1B}DT{F3#T@=V;p7v?-LF8}k$Oysrhxro^tb+Z#n}!&SS$NksG=V*}QL zF{GF1r9hSu7oCs};&|T796m6D(@5Q*AG^)xGT4=9~KPAQ=~2_grITZ&*&XE>-~@8!`v3j|SaTBlj^`23(@T<9ooj^HJ3S z7_Nc_nM02r+{aHpQQHo7^Ktj(3k1{u0KPy$zdg|-8PJ@=h0+n;+>)i%=75d_ouGP4 zPB6TgN&rDgE zcSeh;@3zmqFmg`seM$z0UgAZe|=&DV3bS+&Q3HfhaTy(;Ei@!Sm+0 zt^x%I0AOSxn+(B~2&QA>RDnJL7|3RaR0W#0R-n7(Us|@RL?cXw47M^519y(La475C zrREZn0VQ@9qS0V^X}i_SK$wQ1OVD2To---ctpl+#kj`p6(1+IwyWT|NMrsiGc!S-_JO%L*FqoihjGj z6zBr;h*8Oi!V#Vjg9bxr^G#}b@b3mWbtI+SOmx7$yj&0)a0RSqw3WNrl=BdVo0F7l7_sx!_)`#AEeu43$1N85O`I!Rg1wr1io@-}e zp(KjUh~ju6aV$4A?gQbo42Cjg1%gmIw?dU@Eth^kfJ`sv);WdsJ5?B2Byzj)AK&g6X!I!GtwY|lkWt#kt$AoH zxYfBS{ZF}6pqkxyRe%D7+Y8gIqCKD1YxKgD!4O;l@@OqRHMP9TUOblR1zulT z_;77%D*bXy0m}H|L#U#6bg7seN&TlQk%MYk?Trs0UZ+4#eS zSU+ipB`^+n%=g+R6HE9n>7g+2FXIuD+i$>d=Z$C=+u z5}VrXwvd0%JrDmANP)(WzPh-aVP3knxSUOZ!gHY{OJ%dE01jmciGlF;nM|Dxp#m}N z`#C1O`*`l3$dJv0Fjmen4b;^l3iU`t{UPog%wZG_@hQxY2eCIEU%Zz#lT+AiDEEco zB*eR68t-s`LW6N4Q%h|vqR>2$F`6pK#zM0eA2$T~5^@DH3Sq>e%;OvuVs{Q~!uhBT zPEwh&j}d;`lwKea#WfS{F_mF_3$S=?ydPm#Af-I`LK4xmC2`ib7Ixn=(fGl?(1t)x ze=`^xYRPd&izvcnHXgAF5ba5fGeQ1@T!Fl|He1zr>Qq1Lu{RzC=)Ru9_z`LR3C1Ow ziEY66=wM>$A=Ki>q(DY3Oz3Xr97aJt?uqsz>>hWejV%!$(P1qG^#yEqKejt3JJ<*C#=7CU1PR@rMK4@OR z_&8Z;Mz$7Dd!l<;AbikL7^sWIspvk0U4iHk4EfsD6OFftqa!g~F%TxAkA|y2U7%57 z62`?G+Ui8M5@w#lNHv}gWmsL&aVpxEuqzPikLzf>folXb8^Vr6Jp9}aJN`7z`S>%r z<|eWT50_TUsh&BeGU7aRf5NUnWG>a%)k74B?v4L8L@|(dH1y%8EzeCbCiszb)QK!# z6i9buqEpl++ExpTmu2`9b_FsVf{06*$7sCe(i*Nz^c*_+4O;`hk&ejYK{Z5&-kfX< zF_3PLfsA4p^+;5AJQe0o$Q1~s$8Rjm5+S-WHB|mUXh(lMZ2AQcPNxjU10Ly4B0G|S zxa>^TjWm!`fw+BHPkapX;eS*hp2=oc1q{yPXDeV5s3Xz898W7@vti2vU89O{LH31^R8LRW2WFt}z&pM5*uwY|QvW{mD$5 zXjhNKP|n7G8YKaIg~RMH7TQFtP%P|gdj6leFkNu>g<%l)15HJN66J!iIDV~Cp9hLyV3Bet5E58{RQRKw zJlcW06bK1XEv!A#lG5(UxCS$@79Z(Dn9Ht=gz|~jg;F49<$|u~lu9TW?eRMe7IH{7}!eT5t5d z!{xpaka7EaB+iCef#iOiwuXp-FC=+`XE+W4nLE4eB*7JaywF4;6w$qC43tQugz~EA z7EYH|7O(4>f&%R~-Z1E~TB$O~6j~`j_UcOji{(c7!-2Gb1}N3{iwC>;#)l02SgJRQ zrOkxcE-b@lIhQMyw&1YwEXc+}^`J`&of>q4 zbc06pw{u=Xc&bGimwq6OfqDp=`f#%+I$jqxB?ZdY{{n-RQX%0`AikG7Tu!84H_G@{ zsZoBFSy?ORmO!lT=5|&eF{MD6SNY0st1IxTQ0te7_8!Whr7%N*Lbk1keU^!6F*My% z9Oi;xTw?8h;n+1~V$z&UL>f5)e`hv6kuvv%F=q?}@)6IaPDOzd)#76?&})T7hXS$H z`2+y4QZ6kO=vVpm)7+t%2a*b8=7Ctg*hhhS%#fvp4=4{bht?ctVtA5RN;`ufp z;~LB9e9ZZ`g6p?M=l;wY$5BKi=?-wF?0Xa@}rHqh_&T0|SS zJP_TL!R@Ou;t*&m3Y4wa9|Q1bmD&$wnQPVyyHZcYL466;W|sjHECzyXzkXzaAGLnh5Jfh=%#3?Bdds#0& zPXpV_RT{Mw04O(>bjUodpaT6=tv+UKb+17bXtPm!#0>>nDdm<@9FUnH7G(sl7zh(V zp>t_HUO4UwL=zex;voe^#xKwxF6Zb4qMgYoXzor!^o9Hxu0{9J+nEZ^o@m5w55(}c zt;>kl#!qK1EcG^5FKus^3WahOke9j2{`PLEj0%*f<;t~Msg)-Rv{tAeY^8b%#I_s7 z)*FC84rM-hXp)IWi?Wc_!rGV@P71CGd<=2PUwM8N%qa03^FNx9Br)W9f0G0g4JGMJ zXgtc7-zm(LABn9H#vmRGo62lFe^RQ{>-A#2s1%5AG$xNJu6ph39(aM1c3BjwYmdHkcLEj4!AcS30pr<$2k6s@W~N3*j24TU(^`A z!NvQ9=Iw@KE?$O5(H0@2BT;u`qKN{T0u=A+nWjUT$gchPIJK4A7a-BIs|*ZM*$lX& zb1>lv1~AxcJWT}AejxK0_H9UFpbI?yjP|(~;u7^^1Kgn}EyczyN|4nYeJdwJqAfq% zWir+2RIgz6(bU+gezFQgNxa?6!bk*|OhxEeh5;E18?+;F>QS^@mnue-p!U0kW*7Rg zae_9`!jhmS&Sz+5Uv~3T)FU9S(M+^%z@5b~z)KN31Q8~yK)?lu5jboOw6&R-n@ROg4^Cf+H`x&%z~5`y|f8$pn8 z1VPTBj97vExc5%=`v)_DhU4kVRJu5R$epQ~_3Gg&DAIqW0kVg`!361^qBX~e!AHQs z3^_#K7A9J+IT|Eb&;Pg~ln@&K(Wrf;E?v0n%1DVXP0>s~On^b`6CHX5N~imJw5n%k z9@=YP7~-)n%$mxeezW;PwX(zk_*(hz7XZt}=P*GokJV>?GyxJ_nMekIv>Uk>QCMi_ zC_$$k=q)U})utYWO!eaK?i?vHnTj}ehQ(1(m=!2MEex6Qp2`??Z@eh)FXorFD(jGX zTKrIbIdKKLXre5PoPgPo^Y!3Qo3=i7Pf&uo%BAtR6ZtF<*W6uNg(X0YOoqh@zF8x&gqCn!sJcCJ~ea2Rvkw5z)d5dK( z2EKIZ48H12JV}CFI<^sE0qVWD^aCL};<~U9)JyD8=1bTWsF#SQCas1+BB{oI>$0uq z58oIlliz%le*y>>u>3`V5+7P=m;K*c#1 zc#TFEmFyaPxj_33PQX0W!j)XsVf;^MToIM8H1%Y>(v5{mfQ)09iRBIy+mrPp>5vJ){=qsz9%H7a7*VN{2d_ z3bd5|aFAv&5l(s;7=_0BL1e-ri6PE4_;7~(h};#e-PU+d2B$9z6MLc|kWflPs`08E z&u!S`C(c9nA>0b2uo{A_enip{OEwnRGz!@hN|h5hX350pqB zEM*u-ct+rJIsw4a8JGl^h(5B1AHgFar(y`X2gA1>-#x|I(>Mh34T7Z7P?uIRnQ8~{ zj?ZC!EWy~}>2VUks2(5Q!|~)8Hn>OPS_Y_7ER? zD-g|iKaBV2R|cdX$Zamnp+KBlY3Nvgrl3Hn#c|T#p_LePkcLEi5EQCi8EDPXJafb! z!6P8+(`2Z~t)EdMlWQ_GzX(Y4s!~6!_cYHSNVw01=?c0l!$=0jYny!u^C`@72ckjH zS7s@UZY&Jb&eX27nCF&~XhW63xTZ8r+5dnC+7XVWdIdm+{ygLm$b8p5-qbu!VF{TA zN;xASd?0prpg0rlNyrsQwL_Ccw0c+)^tIy@7Os6^a+>R$+pF5b# zp*6?R#=y-$^jx8WAaUeVk3Yxhj}6xV$od>o0en#J(XyEHCuj_$_Y?>bbS%TrpZFB! zOV}02NCCOcWzc>gV=inqJp01f4UR*Y-9XwPH~p7gaOtrD9$c!T8%6j<584BMj|M?P z+*Kf+FeJ#O6c&$#1>ylH5cR6>Hx@P{X?3VF%Zo}i#((Tx&2B0;6mHb^sxNbnEKxzSY8GAOU3h{% zM_6{p3IzgNHb@DStfKo$JvNSG^Z94s4oTelvth`LXC@cj`EveG0kt!bGXjAfD4v$_ zi_Bz9^dDc2ffkS2IMW}r$DN|sNLuPbHRJ(Wn9Gg#+s6AHblFU|}BZrz9=qhCe3PYkn4YL%4-Fm*9 z9Z0tsR08hjB~v%#SrB3=W}uZ`(O$`yvjfplUf5048RodB)#u2eW(Eq1BmR`=SSSMw z(H37nFYHjYkoDwVwrZ&LIzs5C&e{xQ7q@L}ii_h+Dg!EGlQ9EBh)3 zMSpY6dOnGPc(J-Z^^|+bB<)uQQY&3^kpK_6KB9ftK3&xKs@sSR6cpz`B}~s|1nWg$b&K344mT0y8=iz?ObP9B@_kBnT=5_whGN!RYiR#hBBeK8rD?IaGZ5xS5 z)H>J=BxR_#wA5w=Dxh`-G880087N&K=rigA4PK|Z>))E`1neKgJlqfSxQ&VyN?c1@ z)Z^2>g5LAhwkQLQQmOI8R`zMRsaaIcKt=)r`iWYBzS$ay))yxDz?kT<1pG}NB{Tgb z3R;TmeC+5TJG&p>P41pR9eh1RKB5fNY}4L0YKazGv}qe3tC84j(PdQ5K!R*IkY|PV zoMBL%8iDPAa1d&tt4`E)1v7kRNV2Ipvn zGNnhzK*ZEK78X%E16lHscT~czj+L-C8R**w=f*GYMFRRh9_}>-b(ew$-%Xq{_aOwi zsTTi8HC76-5JU7z1-`Im5yEXu2C@tk)`|9;Hn))IJZfj4xGPN9$Jv3PWoof+eBW4! zgz@+~X6F6FDT>(bOdM3qN``sMP8r2%77bq{158l>k&9+yc31J2+u63vQA_kq#1I_{ zK}`qCqIw3htui1O2z_CmJKnr~6ay`uL;^Ad#A>Ofpbd9CQ5Vc$R=thG+g8f4-ckU` z)%bqRu)2-o5vvnDycq`G_^?13Q;P@6qIw20dYGdiED(gQu#c_I!Taf*u5-u->}QkC zQqWoiChspWjI#)X`F4Ic*^mdL?rk+eHWDg)z0f!Q#xzY0Q&ah!gBk%9Q9A=^{?Qu* zh(LaB{D;XvynN6EG++z0o(ZpXGDn+ssoa4DIxcY(Bue3qe28giZq>aw3AL%rCc;3! z+m@-oKQ1GTTDP7Ys%M~7Zags1w{(TF3tFPrLO_qpAv+9ZPdAU4socy(BIw2xZU}S^ z82Q+U8ED18S4|LtVeLSpcRSEX1IlwKOFrDnw3bji1A!|nQ=J2{GA{0o=cS1OQtWVw zIa=1OnTwLni3^xFq6jX?!%`|S4i0x}YFO@@)eNK}mS`IegodEjx4DSQ8OU`k#GcKT zfn*BG9SbkPKx#WRWD`OyA37;w$-3Z3I77%&R@rVo(lO0VBb6`FmKc^r2rbbh!=TxLGN_w@1i(KTcRVOzg5NHpg_%r@iNqNLI(x)c zx?L&@dNTvbwAf92fBe0~2gRQ|CG+#2|IdAQ-(8Rwrd&i~(6NvM0y4zYD%I!lA7CIo zuxm3E2>K?|ghXc|694E+2D;Xn821ZKqMV?ync5(oK4GsXjSJ`WhOtgRb4+L7J;GA< z*#GwZosyF^5{DyD!mI|ytz}^zwKLF_9mN`nSSA{C4CAN#O}tXQ z$xH<`j1GfZa(ot*Gmx-PjDGA3onclDyKH?RtzS*IoJBc7<6ax0Q8#i>$3Lp*Ubuw8 zR##;u10`(qs*t}>07%oGf)72o^x@f77kQG^$cW`Ff7g?BT*mdvfX+X&+|Lct-3za%ZF5S^zGzsK6rmH2p$rG zA7L*ATjFv^qF<{9Cu4-n%yQ`e`CQu%|Vjfc-2c1-Wcd1PVdr-2{@#R`-b~ zfsRLf=`K}}x4F0$MrU4uO1mj~xGV*^ys%NAg$Xb-)e8k;Zib*F>Smy;RBoy>L(40l z8~x*^?|HAKH9Cv&`*m;%%g4wvWDn%eW0H)E8{{n5^uK; z+5-Ku;#0Aj0|l8X^^+AoANZ62K}6Lk@;3(e)*sJ8fE$jTk2ghi22P}uR6!?-AIK*7 z0e2OSQm8|Qsopu{Tf?v%>SiF9m@1=KA4tZfs&kBu0yf=^`7A8w5SqB0>e3vHf2QFn9fCj^5NE5{{0ZPUJ;7&?X6FR^g((Ik%atmt*B9DPazaO+PX9r^Q zCTIbP-B39Ld8TLq76|$|)vZSWmgw^sNG<=-9{~QMtLA+PSKARST zj1NpwXvHF(jW?p?uYf@7Pq;Yo5$=>?uI>h>G*2SnV3fY-AOm67=8=IyHB8XDHWyJj z13{T+C=`uK*tcFI5{EC3S^?YM@{d3rdBny~I!eg>FHSv&Wl(bOdLo4qwNLC}g9lOS zKot2X{QdF7yjT^2GNM$H)F^)|_+HDA0HYyPD6@uWtj=L8w6=i6JSu0PD`yLmk5HW> zlbI^$M+?&y==tk_e-L4Uh6z+&`41$$Gm#zclRE&z%;*rTW+HXzV$}Dy{yzwkU`P|!tpe(9q zAkQ6!zOXPHC{V-D4)o_)4D?+qV0-|bIWR#(1eDpe_qd>*L~(lvsuC&R(6uOfJKl*d zra~1YBp{5+3m@H(xHx7!cS{rYZMd*^Hu)SJau|p?!2-OufZ*bU%iML416@q?D3F14 z#|(&xw%2WTpaSY=pjflQxE^NEcdv}WcB6hY_?I9-!?a6v$2?iy{jWxufeGb-qjml< zQz&uqWV86Ar{PWT!YHMYzdAaP7nqZ90aA~hY!8F*WoPncl#zk(QttL{ZM-^%5Kxen z0h(iThGkGW16f~K$r}$O)T=KHXpV6)ADviMKhvr%6fGHS3w_w5#I! zU}y0pJaF0}N*#tx*O6Kqyiu}F^l?0p-#4C{43tIv3}oG5^2%som>d5q*n!T@Obsjs z=YaGG5;Ww)+E-X&<5b2w{$U`5x0~3s)Dy3o-P!%5@-2J0P^m zn=h<{>KQ27w%JQeMR&aMhW*-SUKlg|xDZ5Mf`*cCLC-$iw+zHg)*nAVXnVxx$v}=j zKUM}RuP%@BiD*nuS)v7gQbyoGXyt(lsGfnWA=*w*!y+nJCM)B78K@)#;i0JGcylmE z?}dnpC!H+=xtrZ-?AY!)Lk7Zs^M6kU3WT5_Gu30Dp&%L$)bhegsGotX8s-D*17Vd` z0oZ}gmVunL@!V%aKwg5zP8SEFBFCHt0x#K2hjMRR9lxSDkjQBWMh0~90lauAVEa5! z{usGUv{#1MqKyy)MG~nwfrNh!1C%fY&c zP|O|QqZZ~UBohHxrU#dxA(*W3YWU<70Nh}Jj6-(k*+P&zH=Ci+lMqBF3qj?C4J!O? z$jCshVOWqBrVgjJ@*G7}&Olc(Q40eR2n^BvdgDVHL6lV{a!Sx4LBsUVVJf71pCSj5rXij{W9F!-mq?k z|AFG#CoG`uVvxIYaHq3`AmlS(=tA-s`ocz0OEe$3!&=M2f7v^~-LzpSjBBi~6ANjK zh^xNB_Bef)UFUg_QdO$NMJEOIj%OG~#?HxS`xrW!8hyX8GMrG7RQ-BcIS?BzY6(Ir7`UGfd;eYbkvVCO$}2YxHzhG=hXAs5V&2 z*{#lBQN-j{YE8k2>cNtC8fRf`>sR9gW7C!$qhWoZEY&Meq(tIkQl@pG*+5hvQULmaoDGD_@jiTkMG`ftSD;CC4xEK8CPi93 z*f*XEL^6O4Q)%SwuWya71$oRzU3v^v!PWIhGcNWm?s~ z@jnTP^EqbGV|1knZ}myoW`0d=C6<_tR)YLqL`>wdp&W!qxUEj=rEd%#Jn(43g(5a+7?2h$9J+a~bV z!4W`-CmL;_u`hZ-KM?sp;4G~53go9@#%`h42?b~_1=_uL&xac+kX|Cl18ZTd4@9oS zt;VA#dLum1vH=h^Xf6dBx~_X&-dusOI?y8Dw)w%qcp!2aNl*0VC`{mqcD=^fFKjji zdh7PxOMe>$!rb`eV%YH!PYYvAG`WmiOtiFtmMjl6zXJ8o@BMpsaIZ{%7!JGktU%k{ zFdTX_R-k^j{b5Is`&;+y-l%$k?B-+$3q@l%ko^~pNc{Ck1tS00JKxsittf!+KkUPt z%Y~&05yC)b%M^5zl9ezmdt0=U7_2l{3?dY%#1F8SL;3-p4+-RLH z+Stad>vn(2&0`;}Pkrc*d(XM|oWoXObUg=R1iLoV^}%>vCin~{mT7%T5pY8jSkxbUa-wMt>Pd z!bRI+KAyWCK5dHE{*=vz=AJu$^>!eC8uYquJwLv8HeOOhhzI45+dPH1kbVZn$?atl zVuT0^#DpvmU?}3D27=98n8Xyc$3Q@Uufd`lXx!fcgzF>r~9}PsO z{l$|nss5IM+!TTV)Qwc=l zSM$CEaX?B<&9vGI#DY|^ngW1WvNW^V5Fj>gTK74K0U~5trT_rR?r#roj6_RlA!eX` zjpO+&=sgTX#{D_L*LqV40OtL<2*_Z>3^ZA+#53`>=Rkx#WwBhj5sxkTaFTRbbq>7m z%Y`9_Rpgl!wkq~>ITJabtr8U&VtzIDz11DuoX9g--cWJe3 z6(KGXrgO}g0u3~D-N^yj_`o7;cek*=_5*#hGY<5_EA|74 zjaI`!0|~YvfLv<*3Xv#kf9Sq}NbWR8@tR1GRGk7z*OL&5lA!_+yGsEed3q+`Mat7e zJpn{5qzOdg&dhdn0ccq#0KXa?040GxLE5*|3CU(f5VHjtqCy{>l9j`2UM9J^0stg0 z$fsEV@ia>z0u`fBW(G2B)p}sxRw1c^?7x95pQQkl`q_(fAm$&0IcQg_3|^k>y&};Q zTuTiR^a+9Q`rc$C8$atWV99)^fu7a|ns|%hA=&sqw;oofbzk53Z;r7eQ7Gq?HX2B2 z6anC@iDSOu7}YF*T&*_@r>-;%qb9;ZsM-Vd4U{*Urf#GGs_m|(o0m9P1&G46aRDH8 zI|Ss8rD@G;0yVv?X;!Ji7EaOZkW!$G1|o?B0H{U-!0z_&O&TZomXD6sG=DKPO)Ee| zF7=B`W}uu|`h=fIg}_O(Y-(0HgM$&p(P;sE1EFS^fs%U1!Otc`A+I;^2kBnp;3Qu% zkgy{XO?VvW-3>JFdkcowpATU0cLR-J$uz`3Pu^%4UMD)ZA$q%S{Px+@ua43;o`}E< zw1nJPIS?JAQ87#v6s_GUJ?f90l5JhWA<&MK0N+5BPg%8S_Rv7B2ldRjom>8wgegYT`%!YqfcX26`;0rE{~c7SFE( ztFY~kg$z*&PJs~M`+?raKts2`cut^Afa3CP%RnwUa1O-6*>F(1utSR^es#2L{MtaI zz``uzX@Wpb&!B-C6zF+b1bX1_UR|%l(m+(9qTDsmK#t0W1i+PoAl zWf$$jAX7gMBKNq$u6BY~veS`PFp6H_(D63VOBxpYS$1lwq8t57T ztPBpuK?b7jGF=%+x@}Z#of)Vq1N2x5s}jjTq^8}eO2M%Opl6j{)$t9Khvjc{RzH@3 zNXlu5c(r>tl9H}S-5#6V*$~}8Dg76CHc$zWM+Z)HHoZJ&507df{SJ_JRnFrZto|#_ z$_oZsp2-lUm4V1+C>mBb0z4S~4;x5A?+{=R4El&LWdkx;Far%o-tupsybuEs=C9Cf z{5l^NOojz3lzkQ2t>?7{N;tMJpoU>OPU{T@DxQ~XwVGwufHt&F<;FRpfrPG2@KVsT zPp z8c6Qp!UMV0?~+PddxL>$O#=u zrUJRO-e4diF!U<{F7yXkzSfRtAhD-q2}$&fv{*G%n(xM9AjLL|s;VjgcB>%>m#r&u z#8sFmAQ>wwL(bHTLgK1<9iM@;+n<#O>k`6NVf3$TJl;3D^#m#;@^fKFGtk_1hlf6M z2G7hEqan~C>c^c=o<__-Fqkb|cQGE0-Pzhe_~+$mj#W{ik^g3NGIB#^KnRY(V__l3 zGQR$5XRnO!UuPh>eC~9RBGk{jw+}|ZKnKI(K=kU|Fx%}T8VK^Annqh|r3fi#reQub zV=xeTxNm7lmqnrt)3mw@1Pm07btKv`HS2-IW}s#l-{8C=zF;7_Wgu1~k@5G2g>)+p z1UwEDW}x`Nv+o4f(BW_ZhcWmpgq`QYkbQfiHx#tJBk^^SXrXh(ra+F*H9)3q+Bv%b zid_eQ?imi%5*$q37fm{IO7jWx=WtL{5FP*Di*X>KSYsaz%`$Bi5;)XVh=iIYz&KO= zIFNjO&AzKxSJ=DY0IB2)XX9mIqdEuKa1h@U^lvlJ+X=JJ=29$pDkCrlimgtxs8IO7 zg9d{5Km$Rnpn+gNdval7U=p-W!?PRk8f7o?!40(D3bbz>w&|bk8i~A8{n7cK7zqAW zA4u{gv=IjSD;CX*B!=?g4a5`_@K3NvYcLeO9S8b}8|WCQ3dD$*mmpS1$Q$hKSh)La zDm>qK7-&Bq-9VoQ)A4>XK6onQoBiE-c-Lmm0qi>)?-QsKy-vgPO7$=D(G7&|+1Du} zSR!$|SH@TCIS{Xr$T@)B^?@W=UN(;3T_Tb9jSu0&8))Z_pcmRUf5oe`a^6VLKy+;& zWLML8;9XNg_zxK9xlsLPGVGu_(R>cXc@2B^L`%~8R0dfqXzO%5k43-0hd0pY>uh}3 zBxrp$m3M9CyoEiHXbA}%3qxSF0OKd)U*v-u$TtsOf|Xi#7-(}#A{vP2!Z@#F+dzSn zsbn(~wt~-qLipeYLiq#|@~inzFde_W2;*IwIj0?25BEUN+{zStj-N6 zP&^I8SJ*C^ge4_Vq(JOMlLiV`o7Eey==_WEKy}AWQ@ZtnsS`u@gXdeV7tm!?^-2wGSA>5^wx2X#=SMaVMHw3)VoXF%|pJTnMV+TY+R0pUWrf zGHswwOy?lmDenUf!oY7Ghb^EpmHR-X0n3#! z%w${9yqH?y78FS2N6{`&Akv@p6$ZXA_JK$Xsz76OH(rmXs{VwJ`r^YEOCSU93e;s? z86raFMq;8smmll{kqU*KXbG#Ac#iZL#v-VSdj$&OBi{<9w2J1rUv?CjJ#@{xPmLC-PI+2YR6^gEWED_q#TFca?z z)OC4pYM~KiIaBZ12O=h@K&QLF>F(=E_!&NZ`21&*FJka#`ruT0K;lgW0qU>@5^Fp& z63IIiXcPr{e0Y9-nE4)fjCgv(`TTSyd48WiIQ67@>;rZABFJ{8avD!8%AM$$K}PZE zD~t(=Rh+-Va`y`Db7A2Z73jiFG^r8qL?4oUph2!>peG~z@?MXHa|M!E4$vPfrj<$c zWFx3Rp#oY0f{ua)MeCIe)<72C6{wSs>QH++2PzO>VgJ}WyVWLwC;obIxf zAc!I;G#VrnAr;B87h-GLhE|j|w!}jHs|M1Ni!}5~=$%E#MSK8#10TnoI2pU0-Lu*4 ztT;Gdl7)&ew2+T8XXcz^Ku9A{BodX>1b~tZl9Rrc%(F*Vd}yRSrM}` zCI+$rCW#={A4njk#uGC(J_YR!By!QyjBSqe2Qr=N4Vl2^h1rfH-3KCsJxq5F9Ni5h zg+E+Cahaeqvog#s%#aB=6D>N`d%P}88rvNHCvzN+qP>BbgpxZ&UycwXpyFeox#r+o zI~!jfuU1G7EZcGO;Mf+)x86U!8e2#uN&SIb22)eyG)zdyL_jFo8z>}vCU|V zq<&(dy|lAUbK!Sa9=Rk7mhD1*+^pYL_BGUCHCJW$A?JY{U;^?)X}mZLi`)h>*MShU zH_)HgY4EDBtH}nst}+I?`=Leiv%Oy;Q5s+zcKn;#XronPG zTg@gaz^67l2~`;;5rm_?fkO2l!+PYhFcAe690M)%sRH~@C6bDjQ$Tsc1>4hYH8nf2 zq`EM^3zH4RKBhD^1?>&Q{3A}opcaRqSgxL{DM&}h z&&miLG)BITC<-!6Sq6gc1`72f)y7{sg)E>6McznU>rr*|=Lv#ZBcw$O%7y3smDSWJ zC~0PD_=?O6vqJ1i^kdHBQ_$T&7ddi+AUP2ozLO1fU11DV`al)p9}xrxRO1i?OWV~H zq=FLqM2pk-XeyfUk%gu<6-9RgP3|NjjiTj55EqbSAXPUK*IHC1ha?$1QLFx|>gcTXhx?&TD~$KGELU zF0I@_;yR)UfiQG8P+W&ZE+DKlRXz(-X`mj(X)JHB!}{Sy$eXW^QiQ*hTEfJO}8jy{nqxb8xskf&; zS4b?Wo3I;4pX;;)#hjClsZzPGU(l(5K*JzzhWKUJal+@auyafLiP17GT(k z%ejEDble!Uxq*T;U{t?QZXo5WZMJ)ZMra_I9R?2p;Pu-fpm@p*Q4a{4tKY|-v-#I52|@`wyDB9>OQ=4{M$f5FapMt?FKiH^3|4mThDiyf#B)e zF0<_0O+fK%axP*g7BU4zM`f^&$U|q^hZzI?o211+q9y|^%V7FJPUBVX!hTScZkBl0lufG@{D(}-9B#wS zKIrg4MGywQxe0yfK7jiMejL*+M7xvZ=Ct5*ffjcI(YuXT7hBtN{Z+6MJ$sa8EtnL-Hc(GJ*g^Uf=&bs}IzK(Y=%nEOA1cvY(0>Xe zz3-{}_=1(_`Oj&Z!K4tjfdr@!G-X@*YM=y$g)qiWb*3`)A`#7rRuftUU?m!8tjVha=~EzyW%AC)LYOtOJ<|-9WMsWZ4%sr354mgeuWb`|3bir> zW+U}Os|-01?pq0Vk~59Q#-<1)P&p9o+m*ptNw>9Gr9bg5%tG)668_N@q7~+@jPs-1 z+RWP3)Ca2vkW1oGK?&qSSa{L=?M!8;4kQPZVFO78IgRJo&$3SyfSoMMb^vA%V_(=9 zk)H$MLeP|MTaQHDg^kicQ11FrPl9$V*=$|~VE3EN6_^x)HxSN&gnrQ0)cjo;m(?lE3(3yjunwxeuYd#IoWK%r zgYl4}app%rh6!b?_vt%@Ng$4?cOY~FokLF&EvGQ~BGF_ZRf+ZkSz50Rx3Bs6EOCuh z8r})KM8Flo!imNbPYOV{@u)XmBK4y@6eVOKYy+J`r!bTQ>Fdyz+xVN{4R-%98#E89 zt=_IA;0|F!r3#!gLW+b-7!M&D=l=YI45YU8^mS#Be`X{CkhrnXPS^(OIY|2`+SnQ| z^n>?>q4_}mxY0h^Yt)L`r?J-QR-h;eW1Q3C92YVO6or&TxN(lw3*^&3+RjwU+283L zgy2eazJR`bHgOjwfv^o^T$XX}bR9?v2-SgbSB76^Zfw3@D8!?mn@bc1fe?}u2h~Z7 z#2e#iGLkp6r!b1gL@NRH?M*eaW?t+BlR(G@l7l(KAE&+XC*;mZj70R{zA)Jvf2uJ| zU4}W8fxc%Zc3~0-*+8lcWF5{ir8AHK?@Sd6iUx`p(AI%aC0Z4N`uj4#%)J*T7GV+y z+(5!XwrxF{TC}kabSvgS5ewQGiE>p&f^wjLGoW}EW+r$8$rK0)$kdgQTL-!Wk%$iU zCc3{bOudQ5g&+VRg7_xLLg)rM_Rr}-_2P?OB%;mn_)T=I14V2Y-b6FTwR57CgyLnq zjnEAwi_yJrZd(REgy9@0)`21>^mk#h3?vnVUq#1rn4Q24q*jHQ>Og2hnSF2krI-Un zOz3kU#!b62Kz;~`Igpv~4I~|8noy?vqjI1N(LjILJGa#)f-sJ&sBiNh23dDWVG#oo zOu$1}Vpxnp6fZ)Wm`!N3OKeUnNp0LHMDaq4P-yT@?VUb=zJZV9W;?81XR;m;apL@1 zbbF*1<=6SkajKr9LVp~&{f)bG5Kv7rNu~eWrO;)jT{@dj59L}+X_nK}d|A-jP>`|vXogIC7U6HquK zF=1n&sz_8MAfAyJ%?A=Rh5>{?rNR=C-au?XP*P*qiTFLVn$Ds4O~jMx!ywEM6eI=+ zlVL`Iy``-|A-jQ&C-$cD>G+eutI$9fRW@Fch)YGafL-Fe*OeoWtfEe5%2r=wCk2VnS{MHy3>NMIfOz|}S$`cbZ{PW{j?V1vtZxDK$Ip)*n!WvgzyBVqh};Ge z-9w*98Wep}%?DEaCj5*T z7FH114J0}So#0CnqwyS3YdlvEr0#(fNeJ(O3^pWDIG_v!;xo|Y?#s*0*jyNBZ@jTF zn zL&CzJcyBxtkU{yrun_PI!|YkMJ@!66#==0_^A88F_P}U2h9C2xf&8rv08c*}p@H0f zvsSB>(^x^|HV`+WHDt-w_{2%|7tdc&22v!#S0ri+|DIqX22w571WwpoeW}VPL z#QXI8p@s#TodvvEIW$n|j!kf{{{*3dDt9LY1$QOa_sDJ_CY@smT^Wp6Hl8=o%GCq? zY&QU*s%zk<;BTVoq8f;s&Jp#-GyCvSSQhJB&-0;yQ10*VAY|?NC+o@ZiD_6bZf=ri z`@7GEA1@yosIWVJ_Hg*PfE7e~14RWv;-$@86n2{17bfXVw3gKnqF>h_z^s??Gn6Z5 zq4+VJf!Iy-0-fJj7!@RPe+t^R3Eimz?G^y~<&B0zN{z?6t_c+FCz~)|@9tVfpkfyQ zh}gC-<4>VySJ`HK z6c!$V#9bNeQ`pOLGJOXTnnAFDMsFPX(25>aGnEJU^-a z^mlvXCG87S2Ku`!jlxo*nrK8}7!o%YcKjm#Z{#-6aV`c6IC=!)3WAOvftZ0Lt%;5s zXs?qm9XMWzA|TUr{K|!efk?XUJKl{H%=*DiZ@Ni9%M<6IZ2}->#q&Gq$UxeIdcNb# zH%Wdw_;Lz>W_pgZo+UtfCsUd`+XbyWcX}BDK-=(~c})k*YCF5`_&aBT>U_|e)&TQ? z?@Y=Rhmce*_{r*P2!9;M-%jT`IzUTJ$C(x-iY-A3>@X-t9Zt;VG14?5J`Y2EZDIignvPVf#V z1r!df;L-P(fnd%XbH8T~s*X3YM|A>P9oUn3V{i|+)M&OQo@-ZIleudb0kb*qd(NOj zk@oFL@M!f?sQ9DSqzbd=&YQkfA?*832lJjc@J*oT1dq<#?`qK7ZfkyEyPJ>(;gnV* z_(w3LHEPIEgX$BJ-9UT@#sm~~WgJmZx@NRDG}mQn#umNjJM0r2Wy(8Z8_QN}#3gj!uztJ1Mf(^wtnkbapfnd~F%n zw(1%wG_9_N%XX`nN|jo+30dGeQ&~2iUl$gyidKu`mm|A@0{;kG>Er2yJi4VT>d;o}t0&BbG7v<7w$wC!dAq#Q?sALe-r_BR8KQb20%763A_v$QfQ z0U!^oYk`3#WO2Ca5g_X}k#|}Yi^nNR`>qa-#KgH^h|dnV9HEK(`N zPMkGCDl7>kCy?q8q;)AX zm&O~rw0`?VAj`e5DCdaBG6|y%fI187u7zNfmIPWSl%t+TaJO?n>Ts1nPlbmxx?4Dx z1nR~y&y_WF0+I27CK0~@wQk1Zh;knZlmaT0TRhSsKw(hXBFziSZ6I|RX6TWq@KZZs z6|$T_5T~Lbl zZ9s$M8i87&=zx@$%;Azix6vMybOND90b?HIN)tT#>P0EIN#@{27>VAqalUxG09#}{ z3u|jOkjjZx9$4*$Rmye(sf@(R<9PifEWegEP#%f4Z&t=ADnh-@J?&x~D0M)7NoL@Q zU4H9lK%x*S6BY!*sLswG16nC#N5z4L^csQ4DnXQyo!DvwdiThhxVJad2}JrH!TsYU zmARK>HG81x(dq2R%=fa-0Tc)}3s8-7`GqrTY>UljCvYbFthW=!#O|-d3 z;907b>#34c6upU4^qAs*fY>5%(Bm+XZ#LL7-0^Qs#K;E;*A&?uM5eV=A z{bLqiBM^9$cY$o9(>skoB#0MHZ~{6wBap|AO-U6#AkYkd*+5}D1NcnQ1AFjKz4u#= z1R8QC7oRZN1Y2aNOf72T&4c4XIbgL7RH6TbKt=?WE?9M^`mf3cvMnD78lmv{+K(Sw zfL_>vQRdU{cv!^~%EV%w0eljIGj>1%4cCd-Ipl!~%HmT){`^72TqP`km}2&?`e2y7D+)$^LvGfaYeNh3QQL014E+4R-g#JnS&~v2H%>%=r&IhWNysthd- zZ6;9Zh1otc6$$k3YwkbY^kz>Y02^hQKeeHS z7Yw>+&w(k4TBmy3Y@kxhqYVL-)||ym(0K!Flp!BT+CYVxFX-dEsL81LQ!UF0RQh3N zFH9erS|%h~-y`u{PQ!}7bH|-byRHLP$~3VM5u_3l$+-;#_*th!|3>x`2&MJss4R`I z>eBkbS_0Mjtr&)3Xs3UiOdklcbn4PA_diV&R3_|FW~KyC z!Pf%+281JtB+T(iRDD3cu*{kIRnZq_o`!c}@6(mR0c9};@I>Wb6=o#7 zjsIQ75Ai@t(;x&zJ0M6PV|^i z)~u=VX8}@_S0Gx%hb;q;E$lVh#_y$lVdi#lk+^nmAT$;Z%P?F5xi0L2@(L7{Ve^ny z>I(~K676lgkz~E`TPw>L9zmli!wRIRu0Sxyb7d+Q$IH&t@8Zr>b2s4&qrR|pJAD}# z11*2cdVCeFD6c@L{*X65A4JDjSnA5yizbwrC&4c4-KBGEY=568r-NLS2}S zDAT?1`*D$I1u~l4m2rAgAwUZ`!>mA(`U=$CVbq$+yD%)n@|@_sSYOx=duNn`APj@y z7>&o_)p&qzFUA`X48)Os4gzB{(}!kj*2%9pbNGqStA{u|0&DPVpMxwDbA{x*6!gv`5nbu+kgfM((O7)AhZh_bl9T662 zb{Uop&>@uSjr~9@tjt)*1_;YA84T-8oufwU7D&&TI+Lx(ERgXF*$;G6)H!s8GJ74U zM)MX3uAqYDd|_8rC)zyGMh&?$)xW^#N1u77LqLX3Pk&C`0-Yq90g43%2sY?YxiXCH z>FyIxbUzI5As&f-LI}ad;#^3@XqPo!Ah|PD?u}QH^8}hRUp8@f8?gq-97>cN6Fe=i!Qf^TWKmVo&O?qJ{sh;#N zs)IKAzl2f9p?=sqe;p@+7!Eh^Jk}N#lI0cBL=+%sXlc^q5qN*>&p$1obm!}c@(cL+?41IW<{v!JHC(*C||IdxT-~PaJ#O`Q+#dN@YsF*vhOEuDaO-AlX;#B-9-Fy)P1RhwM}2j3@2jB1gYXFfISFHZ;v9C=b4kG@Q4!Ml(EXoEN~`6un-~gI?m7D6)o`>WGa%vZtBH zvTb;wh%V`)HeNB_BNpLBZq};pmgtdQCo{BI{>gh`l%pl$k05j^1O4*d`1e;G=#r;$ z{>;={;|FO1A*(pFWl?B0qIqO)X};}j=h^-i?mN3dd(Isi7(enu2mleA2^e4rCH$1B zHH3_994^(|9INpV?9Y zvHCZ5(84t%Wa7-md-og2;6Ma|91~%#ZadgyHh4PV>p#E`Jw2fZlp+ofmJL0*iu66| zGQ2fL8DF4&W8h`_41#F=@(3pW929B*z4%_(b%(M`{_+$?4x}vT{s{tspq07u(YrV2 zr{1~R?q=pnEEs36_Z&T#R62}nPgNHq_b@0lsX(cApM1&yNOiQkQ5~^aADyU{r~$;< zmfa}Wec!XLkoE&dfJ-F8otyKFq7CY>2?3F~l!1X8K{i5YBXt--?BN$K{#lcy&m(^f9$LyxzM4kdYbhX zTBAzS!p8>H*`!EAYLt#y2SA{Pc@5zd>ddIHBJlx0G&blmAeTrECLj|_DpsZqoWCJYfQ_8y{VNqPY;TEe=?Ns8fy2;~&3A=)~G;1xZ!fF2vx z*~20b+GeU75hHmCDNvAh2}C;LnDCOMMcpQH#Er}jk`QN1yO+S8j7>Zdb3;Wg27?t@ z1fZA*B>eO&>-t39<_jNX-*fWx&cEZB04)LG8lk7p){Wg9{8xLO(K7=93*o5J_N$%cFn;Nmwy4h1z2% zEvPi#$52|8{1r-adIDFiuHyDuE26I%9WWRIhV5i7nNb4)g*y6N@$^%hPlae62ZEr` zxfK2SrT4<#U2@4c_Re0{X&{KgqTz8^Q7nknm|~y-DMF&4p`pnm%$!+=+xGQ#F6{f^beb}dgrMW6lA-gM*&{X_d1slLTpB_t#~4iL`ee3o zeM!X_g7J#hh=)82QHyAGO)lNa?R;8e4pCth?{u)4P|D~3)e&&Kw^+}pi2V1+ikbo_5lLj&V?Pm zf1mg%07d2)>Di)$3%PW&g1iebFa;El$Q2Nij12`3Wd$!#fr4C=u{=XO(g}1>dxBX< zy$w7lB~SakXAz6u9mmkvG}?FUH3FAIlQ28gH!UWJz{in;6R?9Z7&)OV-cXFp9ca7zhP0fA?6Zoe-X8=^WE1Uw`4sG?d0+}sGi*67?nzswjo zr(Kb;Vac=8wh3z)1;@ux7$3I9pd0If{9f4W>$ft#>}#TTdr1^F?Tx;n%mg9`JCzRf zV>&>mQ#nHD(2*mDW`eR`&b~9#m5U)Lb3Ebf(omEV_6`tZppuhhR!$te&~&}LaW>>7L*;+kax^I7V~h#z-WI$2D9HeM(q=15n@Ug8i>~8tX>&(j6`k~ z&+vu0uxl0Qz6%6`uK&NVkNb+m-JZ|JA7(P_gb;LsJ^-lnpa=<_T~Wet1S44obtr0D zuZe0zD8bIb5@PEE7Xax6di4#*f{lKF4AWYQajFz^-b-z|eI6D=hEmq@O7L0Epfe|z z8cY}oeyo;=6v?0gj(oSa{EXh1#nfQr8X}{V*u+V|MyuS?h9i0z-j~%e`;pP4Gl^3| zs~&M^#55`si3a{0^+Rwq%hYM~K?7s75qjntb(Z%!H$-X0e2-To^5^!7pc`wV9f$32 zrtbE?xv=*a1VV`ZH3@_W^y^d3UFPwq+1VnZL7<9dynYbnhaY)E&`FbnkBfzYD(Z=a z^`R`5YhlW#Aub6~S{e;ALR|=Np-zNDS8r~bseQ>qi~&3DAx4UBAE+Byu3~&T(RF4g zrfYO+McE1z=rD$)%!soC=A|X)L3|0$BZQj(OLRsdYPhSdd>gPTAM_Z$WdSG{ojRdc z6!KEgx_<$ET!r%oK9EJAYaQr141+(n-%Q|H=Ya#Hq;Qb@>mv+=t6D%~ zOW=@{By*=D(pZFP&Y>YImnly3L~>FKHJ3w*8aYEG(`p?KyF*5O7!z?m1Qpr<1fzg$ zMxBRh$BF{lCs@)b)v5_{)`C=Z!?WR?VhU^&XBn~8a0h&jzTl-mX6s^6D>)dD@yytR z5UO@3ya0mn*cd&xr>2dOzVeF0cREX=!^tVC&Cpr?=a`n%QhLk}1O;1}u}1(}`%3`b z7NW5`KG5gg2iooFHPHtLVSY1pS;pIpuD|rL)X=jxA{ZeFuc<2J0G%poER11k+KDDj zb(6sJIgBnTKwK~L1jd!Zh7Uxv3k^v9VyMTYMKM%YXb|%oVRz!b7n*cuqQlYseO{H&R zD4kV%MK#kZU610SwAOm{!F~-Wv50MN1NWp1otP95N&lfb1blTI(2cMOaCsbyMyO0> zc2e*KHWeM_qdAo_8N z37!H0pQC0aITPIKj$;h!iyT>xb1*YO6S73(J+M=TA;VbefZo{f&N|+ zeHDfoL4R^#yAQP6b5YoOGxgiyY`l_D7!rXZj**#~{!9&K1}1VS$M zG9ohD5Y}Y85MjWIz-BrbsGKxSdvR8R^&f?K1OPXDMFwbQF0xA^ES@b*$*83$Et=PN zN7B{GuM?AiF;o{hrNsjwM>olf;` z{3%JrN5tIW>$AwErU*aN67NOnUW>90EDWLMERrKC=Da|#UPWj6dp!@f-jkqJZ7c3F zLv+z+(p(sdP(U9J9ItMsM?FrVoQeh%{)-3gUJhuMy`myOb~n;D=wqp7{kK= zSc=L<7s&(}RR@jiDde0PZcz_@XX*|-D6Uo)4!nZoUfcRM5~rt`-*gLEgy=fqk_|+P ze;68E6L&IPV11LC((uEN3e+h=<7(CA5&x4v-X1TCeqDdy&z)~5`?9YG+U+-cXO8SN z5QO233vdr0V5y?o1Ve-qmVlV#RdE4s!(r+E`lE%*k0-N)8f?iL%_0f()BX1{w|XT0 z8kveu^rsYoKp!?~kAGV<0~86NRlYUE2>A9jZA_IJTe}|Xn33CApmqWnL41(Y&3^U) zR=Pf02wLzuw2OYtW9v6&rBPbYawKfn(+K$F3_2sEPw725w6_K>8N?Ng3a5)y!Hv~# zNi1;a7yjB%3~BRK(tKqwd`hZfyx zh-^*xOx5PEr7I+-y>e!`!6A{)PJW>AiMAYhqL1=FawN7AW`3aj<_8$c*S1KL2r?OK z#F|hrvr0(bP-QH7eMYJ=m`fq3ihjrR&sz8%B_qI!nWSL`!d^J%>LcsTi&pdXR8JWd zq@sQ#qStq2=#QpP=vA)NloEIS(`OdMj=Tk_vZBrKAMYWGd{Y2hgw$~n;1@+6dxb7nRtLPc7CfK~aEb`p7t{w`3N>{W zGNIZyLKgn)YGL>IBi_pbJ*qDv&;=7D0v+qdALS2tpy$d!pWinTJy99sk(l_?fs>k$ zVq(_eVnSEwVK(GIQC@h@x+1!XKeeABF>G!$bVQHy#c~*-!Q<1)##B2K_Hl7XAPNpd zBzY>me{9MelPr;9JS@LxM^ULuv1?O1t4ciL{zRZtO;1lpBzOguhG8d@yu;eGkL7a) zcDWNnT$#^hGH@2Romj&iqwFmqyffm1o!(G>_WXe!b_WuF1fUBd`e34u@>kh8K%mJJ z4Fo0rNJM|p9FI?QQJhE5hH&zsuZob8k`)Fwus6S zb)yx_x2y*;;1~j*j(Adjy%yvxj9q)@Idd=7Ir2_ zViG~$V4^>hCwjf^s4zHS&_Q+-L%Ok<6JaTB%p1RbjkYj`UaF#9`sA@|T>65yv-=s@02j>>JhJD(guZe%~BU3Ip-l8AD4I!A0GqwZ~ z$G}4vCol2KLWNHj9gso<1!~ubOJ-!{r_V^gNple}gY7W> z!C(K`vhhkl*K4NElBtibWT1ke53PkA2y~QvE$sPuonAeG2SNuse=8yyDF}<$9Uv4H zmmpcfHknohAotqpePR2I1{{6+BDTfDs;CPMaU+M!JGzA=6m;-qFh?fejS0s>Ed#65 zHf)DW7`{KoxJh>%o4wnc&=N-gh7!jh5Ht$NFjE+jqMwgd=sy|@1NX)SnrPh%+9qH) z#n5LM5t+?f1XG-r<0t{D#W4J(>DV~dKpdbW_4q&QB*4fhdk9WDS{MQlyTPB|*uusf zf03f>@z?Ju1RYHDQT~XDe)ar$0Yb%vRcw5TKogZwG;}Q*CZ04k`*hYMBoPP4W@_DH zxi~I0imno}wCHRa24IZ>7oblK7I{uU0%K%B*y~jd4qfm(hJFZyHT)RQg+M)b3}Wkg zk%W-5@GfW+6N_rVdQXTb;Z%YsQ;UI&=S_)l!9*e)5XoJEN1QR(Lm`nXUN}-ML(jI9 z_sTe^e&c8mtC~r`+0L9s;heP8<#V3~y7EcfWS|Gu$~dg?NBJu)>@qU7jbWcIm}r(Q z|%wTR`JytB4c(p3O~*R0D+jO175*AuUl^+3PhOuEYk6Y z$we{Ah;I?I>={5uYh(4i19)-$jI_NmbnIqn{Y`A@l?3!qhO&1@Wa?3FM4)@ujsMa) z>VcuVl_*rv7tk)@|GzA*!}~@UQkdl<*5_ zjZyJ0@E7Ne_yR7NLTYEy$M?FXQbEiY)dUX+T`x&7CiXrxc{HV`;Avsxi&*_Au&trf z;cG22?eajH!uGRs{5~q9)Ud-J=qR@`(I3y}^)WH%8BBD3O;i76V&hkk#{zLcQgt*b zP4GxQ)c2ZU>?dQoY1-A2IB%5b_&`?|mr$OdcHU`87YhOl^~hNl$R!g+mHN&^Yk&dr z+%#`6s*4v{#MSOk)ev4=;#WzY@j?a(m<`-TfN^+wcle2{Rol@3$415R3-WmbVhgUddn3P!$9Qs5J zk!^E3qDGcYEXp4YDh5fvn4PqyR2z%&f0T1-B;hKVxBHvd(UrN@>Kg&{bOu20$}Tah zT0mi=$;jV;5F0O@jkAk&S_CJBEmzP;7d1?1x^qG0j%*juLarW2G_{6F1%Mml$z03B z6+Tus%RQbEkZ<#M)TqaoXXo?TrGfn3k3k#$=nixx1ARa810CgWwXk!q7M2?XAU@dQ zSG%K7u)6>Qu%9Snn!$RBQ`u@_v-Dk&ZPr4gK64^psafMWnZAge5@}jF3Zw;zZ1D|0 zB2hiC5=9Ag6@chf$FIIHp!tOsEt{*QZdLR(s(^jS) zx+gjdgCa9>B7?Gf#0SQhe`H5A>~EMKL(eINX42*ng%~1?OzaL&MeW2RaKe|`ZU{sB z5LWasgGBCFV=WA=dH!G5hxwC@45BH80V66i)!k5J-37eSn^O~`sBYOGVF!zjx(;c5zj|b<9@S`Kxx1-}Txl18 zKvI~R$k#BN=CRLpl`B$P3Ms`nK)~KsVWMSO(@-L~TW7g)Uw9FSH+LmwIx~!FDD3jBG%6=OkIW~0zg0VL_@zQQ~j4qmp**l{V@W7R&@W> z?sw9g{SWB*?vK!g&!5g7O9wi?(19)=nhw;a!vvsg>oPLQl9-cI^16BZDF+r3=tb?? zgqDX|g|UF_(?cD@fM?SQ$I_hWYhYW^%)fk#WA>j!iRK0ALJ!j^Yti41ak7s%(}O7@`5 zIdUAKfS%8#aiuqt@BSnP6wmcSyU)~Vf9#iC%I+S}M^`?rT;zo$TH#?slTEt|Lf}W|j^* z6ceQNLqF?Mg)W_u0$!N+4?B@l(07R26~)9$?n?WKd!jhG;E$)3G|%^Cj3uYpl{{`Z zkr&i*Hgjtx>{~|I4-n`Z>%vaS4+H{Tdo$Df{|Hp{?C$=~-3Q0kfo@&BeD&((8HBD} zI~)j%#vKF<#aDLD?l*=g4C4}ikG6`NmTq)ys~@}AGOX>ko2^kqmkayRO-eN4g5{D( zxDXN{@e!^hF7^t4mf!o#YbR^UMy!wEnfJUO&w0<8A@Q1XW@k|8y=iKORU`;|Wy5L@ z5&!%`7$l&_T!ShM){+shGn^a?Lt~iJVmz{_AQ&Y9d~>594DpFjV^GSsd4ZG)o1et4 zFEo;?^b1yn6GEdjBCQMN`iUKrQo>k>vU-XO#U#KO5;RmK=QbOXXjZAz0mi07zg{5H zAfv*g>(QlJKM`63l&>xypSH3ShH(0WjrpAF2O)M3vk;7NJ>HjwjsMS(WfmJ`J>U0f z4wWBoiHBkR-b~fkIR;aKcD;Q0@-5-7hAL2LG{*JcQ-O|_w#38VRDp(`jedMGdS}p2 z6`EtNSULj{N^{_f zLb~IF$q>C)fp{0e{>}>YhwTF$I<<20(&&|7z)#~>bHaRX9<`b=EIJNx z%p!b6aclJUWL+fzjnLvS)^wO8^ShlWfG>#f>D+TNlCtNOIn-m##mlQ`@!cUFxUEro zEh^WTB=0OCF+?x?3=F7|T8;+P%p&A#wyXqYq*Ad;mgH+tG@y%7GMc<-3{wC!Nw9V{ zi%sRt(Udit)pOH0Pzum}ccLXi@^Sq3J`ckZzX$p&Do}7TM&o}40w+hWG^$rlT^;Z$ zZ0_v3aCyB_K`QlneXh=XhI5AFh&u}l$GfN=Z&fk0nHfyA)vC74!p^inl{Qmt;iG%7 z+?qLnIk3FEOt5_5fO*!W_Ae8gwO1TDVDVvT2<{SQ3BjWofg=!4O-(H=nKFZO7!oVy z@zm7#l(oZXcmfj{4p@s2sS-McN~OkAQmRCRB7j5*@J(C~aRm{v zD}DmuaArb+hZqXPIsOqBnj}q3G$*DBCZ?wg)6K#}4z~$e$TbUvLT)-|9nd-4Las2K zL(}Baq5oSf-uAtpX{7)qZh;c7Wh5%lkKO|fjf{*8{UH_Tcke{szQ~UPE^dKST;78n zzY6)styZIP;oQdBtNqdmrGT5E+j1_wOS{2^VOw(?L3&3ka=quG6v5c;U>s&KWc9jvbCR92D(Lo7QQ! z&$I>6_`QJHFtf3NY^a(44CNLx0in88;PGQP;Iv8D;c|Y&!)>}4CQnX?SO{bTHY%YZ{6ZzJ=XS% zHc_>+EZPPz*7j!sp)A`cC^;xGNQ5BGnQ0EWZhMiJW`Uvn82Nm;W-AYltd=}9)3j)b zLPO%UQ`FHz!IjN%Mh6lnXyr-E7STmwL)OS5jWw%WTfgG6h%Nda8;Vu!iD=giEfnPz zQ4k2e46!K(LB@g%l$ng00)?3z+U)%NYHoEtv&wSXEK6%4lj*Yp+xp#9--fpKwRhtO z{F~_aFAg63F!Eu0>@5qsTM|NYP1K`V(HtgPQikKd$W9q<>$fvtIT#hG8Ja!wop6anEc@ELT zw3t@DcO_C$p7T}giL!=ieUcKvk#FV?_YTuvY%*<_mSB5)hH-ej)3{;d1pQjcQ{))u zglF{Mh(>ymT!aZKKwtSrqW>m3^;cA&PwbuR>kLsC#}zvwAEH&Q-0|8Rt&8^&4y3{8k1Os5XNLYLV6w!)nj- zE55ItvQKTMN`+z-n=)-Z_(&n9ml2J?XW#aw^8w$udh<j0H^WDo{BVCLp*q%=LZ{s!jVt4f$H7! z?#UM=#gwi*aJOBrw)@3GD3E^Q4OBzC!0|Lb?LLPnsCNqwPAV$GV<01Z1TtaEpH2mq z4oR7l0w~kU5IW#nQ9)V%SbO1x$8f|LSw}deAvX>_j8c%$8pzKiK9Q(@Dc%nhHy5_3 zyV^i&c86^Is|s}gwre&EtwWb>2OHV3ul6f%vP<T9qM)A{D+^_>t8mu_qCql592@s3qPP|H|VE#{aLyI3X;o&4RKBYO#e7W z)5bx#qemkR9up=FY@d-M$B+Ca29F&43k)&8Ax#-8!w8K{&2V^0^h!4rO~@An+22fU zJ`O~^ux@Gt{X+`G{51tCZn{x#>{W(~jrxuI?XL^tXQD^Q6w>3M z9JBGcY5%MA=8(A<-a;?*5t3I7iDyDvE1VLi&P7`B-hXv$ zpQiC&E09u08aMYS!`_>X^{RaZsw69rRf`}6P5BpeBBv<{Z6F8`1+8Tni7Qj>cO-UW zFYNFg7yRD}RJ!4QsZwu@dS9zWSD3JVJ?i{ zP*zmG#Jfk2AAckT`uh0s!`Gxh4`@7Hu>zetzir2!w~e~nxW4?#w)00-+au8xKURSXg}epSO(f5SCC$_KhX5Drh4fojkRmIQ1Sr_Bi*8s%7tCIjF-**b%}}lL`B5`Ism>x5=tL?3>RttU z>AJ_>;3?>}XO6k;Id7@&1#Bfr3qR!sJU5&P^D~{MEkbG0U{9f3=K!Fx%1zKqoXq~Teav~`A^ulU>sicUB zRu4=n5aGa~UE*K|BJi7WlGEied2Ld4V)Mhv@ck#w#mjM^rgLF(Bzp8vQXm?N4trti zswyWZ0^dU$s7j6^CSV1sP#{d|I`$vAhy$x?!_wg-6S3O^Ftrkcs1s8LQb!|5i9$^?&F>Btb8!{cno#nm-{d_Jr_(35~fJ}rC5k2rGhMTA8Noj@*Fg&D(( z$@={#K9OklG^;Xj3dT~PMWjH%WY~6455Uom8iI<&6;i^f zu?JBG!fEVd%tV>-MZpenB*{R`J!Sj;d$sU_ASpm3LGhDe)7~2enoHk#TNy0N$o5cl z&Yz-GBL(s+rBVqBRGcLHUgQwaAH8!ZC#$4UAoT4(fL47P9%OU z=!KQbRVdJyA6FQOu>=GBBzij;ruRQl#2+KgIFNip2M~kNa&7A5_rb!j*`We0R5>{T z^D7M00#ASJ!hCjxj>PdO>Dc~ zNab`{FwSdy!uUAGKY$Y0I@mLO|0!0c+H1mW{fT%a$ogW>sGb)^LxJ*vpqxmGHPZ_t z1@dcw0+mLJv1cdje2Hq)+p4_?8V?cUB9+s_u!9h6In|iJR)bTa9JXf=v=6|VeE~AE z5x|Mrkzu~v%-(;xm8k#{BwImpLf(E&D;`NSL(wZLDktYB%GH|ZX$7j(yg-5c(X2iN zmLKD=0uiWkG2md^IBn*TDXbtO5MP3{%<}!W{&o)59~L0}lM-Yt3^R`;uGDRyIV)zV zoSg6MUE5D9MHu%Q6BCUlnizdh6R(NiW+T0vR#&l=5J5x`n@R*vqe10T3!DJaV5KRI z1zUtl8y`NMDzsS}{?uFRlz;R!7xb;`a54VBcK8(953t? zjTH1I7@(pO7?jEz@V|iSAMCS(0B>_ETnsEVH8ma;io($|2p0&o5ue2YGBjTg{1-GZ z9Z0vs99o`%Y|qdxq%ZW)UP&yjJ19^ANbSwD3cR? z(h1Lc68-}etCcg5-P(|6Ap7H_{g44hf!?wTbah}H3gfwChRN?ur9~+mEEq<6)uSWG ztQnU0<(S1|bH8Mv7&_)NaDf;Ju8iDiPmcB|P(XiZ4lV{mf$px}ra+TgjDaS7AY-Z- z&IkSYC|zSS(>Cdhw-NpW90dk)p-0-LASXRS48-Y&$Olu*2&9Ia0$p=;aJk2C911HA ziGbv{rZOeyWxhYh8{`PWXjq*Q1N}O`jM?)3QWg$2bd`J;>j*V-yt53pou%Av2PhlI z#~awVy>W1S04mnbM>F!Qr#+Zi4yUWs!EZXpN5FC`GS;OtkQR&hS^=D~)|hVq`o@#( z8k8JE!F~XHYG%M2^M2Re2-V$5#xVAulg)RKfm+wFQa$Vh80en8SBWT$6j=hli=#8aEnWd!L!>`1mgE_zf6{ zrUXfl{6NyAXkm5yho_DprUWSl43yp9!!A4X*(~ho7TNA1BbUnT(n(?|Q<=RzpIcUP zONs35;|eu5zqFsZak7-yU)oim^k@&>VtMZuKWPim^y<$oe*}-FS4ZbSn+UD{5f}r1 za5c2jI@Y!x4@I1SC_Mv#Z}Lu8Fd9yJ$AaOlbhs5fsld_9YQP80K>!#IR734(bbTt? z`F*M_y#=k4hpCzA)^lJW=n8bgT-)J9;K=?#Xc%z#gAk5`IvbqW8XZ!8n({+$+bqCD z+_H&HfpIW^&B_@FVa2biDC(^q#TocDvkM)kKafKlH&35R;>hiaXjKh!4bq6$Z5bpiR0`Ifcc%1EZkk(1tpPC z0dcUD0d*&%Fe~if_AaQIr2{p08`Y%DVg_uv{ku?dpfr8Y^6y7u+Cr#bRW{q&RhWH! z4tm1c1LW}q&Q#~%;7v~WsOV}YO4g}ADWg*2Uk219eIJrb>U1c%ihLt&ee zZdO7O#lGeP16Z9-tF@s48R%oH6%%A2%aeueA~)hDk@_j)Q~y=l*PS@T($xrx4+%d zv9YuPgc34P3m3mJZD9q#wsOdvLvxT?ukw0-X!H1k!vM-wXjoG%P;v~l#m6IuZM{m@ zC{khn=+D@eI;!`D?*LS%3k>8>j{qoDRe1*LZtEUU?MkT`Xet_=3XVW~V94ujNsmMG zYO5nY3pxWu!hK$E*J!VD7;$a+qTg2s+m)G_c8hA{_EX(1msQI%kV~JLsDk2rid$f` zl<04bk3v|M#Fsa)B5$LFdSD`oCuJmp#0}J*Z)GLAA2nb`yuou`qh7*?fpw*O@kbEv zM9)ghME$XF$;WTZKEW!)uS8wjW^DkVO9eMQch0PL=KRFP`kOCndc|A zPv#f12f!GJ5fAL|ROAv^NZj5>Bo3hT7!3BZe57qqTSx(D3$s|OP0wjZ!5JOZeq;Q@epT?YzaL(gcnKiY)_O*@T+x%zs7%?cJu><5|+HNsE9m>1y!OLBHDT$R^> zR%@}T-VW`no9mY0t)mD4r~_T=*xyJ6a-kzgLnX-S#Kew9*sG@-k;()l+Z^U3S(F{~ zATxv?lE_MeCO{TW^C-$NXIihq_)Y3S($Wn1l|8Z_NOT0f{SKL7k`g2{kdj@@DvW`Y zKlk@HxC)fpR&OK{l^ydt70SWVZpDpV^aC*l%3!TxBX=HtAk`PVRd4Z(1;?F?fzZJD z*6Hzmj((tMyQOg~4vc}SA~C1d6F^!xR|cv|&sIA>OE=jDN1L6_CiDZv+S;81D{a-< z%Jd!0zy1S2DCw~eN1PUay89d$2;*;xb28;|w#JbRd&3K}Dr2B;f^(X4C|L#GX;h9r zO9#FIOMJ-U^o2fve}d+AyEy|jxKS0tP?&1vZXi7PLTm}bPq={yl?ukPeG!oFb(zO6 zQI6SJiT4`q(~3Cz=4Ld*3cl#K1SO~#1Hs;}yTBL-wr}rO0>joZXw)UO97CXRyWg$_+l{IS{&5DzTCNOUHCbmWK9Gm!FK z@H2>|XHwAx55U0cXe}@XvP7m*E9r3!)Fd`Jw*uIl3dL6@lLjh~4i*h-&|I3PVJOW0 z{3DEkgcz9Q0-|5#GA=O;`A61(5b}(~;xmE@OT*9!bh=%=u@ba#0B|GIf#j3Hnr$hk z0H>hL&fbQK`R;BdRBY_*WNe^pA7BeqVhvB73mRjQcx255p#Izr2=6Ulvp?2?T-5X9 z=7agZ zGWb7nxe+cWV<4B#Kn|PQ@DeS=kQs;~GG+3)3NS-JqzBe*pna zhZpC#Vrj;YMP956ZZzP~LRsbs*gn^d@5~Ifk@r^ z|7D`TyWf=Bm`q*x9KYmI;1akWr2b1rmg2743jm4I9enXIK@QlL7=IO+^ z{VI*$j?E*e>?vztci5v4dF}q9I9*S7QA4m^H&>PY{Q& zJWg7h%5XXJYjP#O$z}E=(F67WXp`h+B}+vLrzW=u6FXf@F_+ z3th!acwS8E*+E?jeNEB{HOnGScc4bPCDnOZ6l59liU z_I~;8h1VI12N{TgnPGJ|G0`lV`vuVhB)WaL%m}~8tcEz1H`d0$Pf{bxPP_9mD^Ul` zdB#Apn=jH8bZg!woH@OWa@Je?hgmxnS;|k-6H|?zuh5-%29HZQe!B5JCc!!zZWS%< zR?qPq-!1x`Pu>xfp!dtKaK6T9s3W-Dx+SJFP=l-fG3Ei1mxyzae6flMk|(L1a`TY8 z7vxf|$=zfacQJnfN&Y1tzd8Dm^dOmlIHXsGF+4q}dxCT)&|64D+!@VQsM?^6YYIml zK_?%US{tnHmqZT`9s1|oxneah@}6=2o~lf&@{^S`|rcq(X;5&$_dfas42R1}we4@e0a=0KkjDS~$GBCk_n zx_7FL!!BO=Ax@BPj4t!~#j~Kv>4gAjxmV^i8e%OvbjZOy$4POzo`y)Y6n-he5 zyy(_Lc_wI;#>j_>7qoa5G$}2ZKg(rBpQVe#mKkTnisI4Clg@qtKp_enlll>;y(LH? z==4@62rudQoev{90tEz3QyzdS_JW8)nG40Trx&dYghzMfcNel?qf*pQHU=|Mn2Ez^ zas-0z{a80fmv0$C(m^aBXkz-n0ayhU*)k)!(!1+dLYvpGqNC$~hflPje3+-%+Y5{S zjX>>R2Z6TuKw!|hi&yw19Ymj$pGyp0&@}ad{hy@=plV4a4nR*#2zE-Q9Ukh9{YVFxv=c^%#-R1-{;qDGqxg>V-u@bm_0IWQe?j0(o~^w0aM4J?Xj%i zgTk@a|E~$8y4&kl1ku#q8hzsm58T5|L5FUhdVyGe6gp^(Uh_{JfeC-|x+VZYPtMLv z8<2mqGqHhZRlnCUv-WK)B*GqJ6UtPqqAlhPTf`-4dPJ(om@iJtN08ZObc~|@Jpsh? zjYIZyzAjpHM@BCs_~e`rYXY&*M{ELmSqOis`j`Ne=XLglC`6*dr%b?-bVQ|N#($z**4F2@!Q0qmdvCCV~E53f#g;bWOs~R#Eay1oi)i zZW##ByWdz31U-I^YFaz4ogQBh{?Hr(feeIT z3bNh^W=kI(56B*vjYR-9z5UvZd}}1>ukr%!19rm{jZH_&|IpVj3su~(Xgu}r3n0%$ z+Z>5m9|&F$bpGdeASfXMNm3pRszWcaF=~DQ{^U-H0BEhJHxPoEz8FfliJKd!vMFp? zb=-W7x%WQ?3a|zu*o)mQ0I@4ms=rXLqjwnc@gNWYqyn*f(m#y7ARx$##IoQ9jZQDu zDX;oi0FfbH=2rPhvLbHy6 z!=PI}g7TGHNF){>4H~KDZv;Q$0F}g_xT^9}l%#isKT5U<+ROHym`d@ zB<9DWMJD*Ea~E|nf8w;L^F)-cuA?)&7lL8z8K_AC14O<~?a>|kB!xOmt^OU&K<2ST zye0@EXF$LEs0xA-v`1?O6=6ix5ol2~_+bD!{={WgI|nGG4{cw+(7cTU(j&rnkFWtg zyBeFd-;>pToOo3Am-~<*(6%nBXGEGoH-MlOAxPSz-K|kED8ym|*Zd&!_*1SOpg7Oi z0g6-l#H&jJptgRfIt+`D3meRRzV}s(=*%Z~71jq5`alLiod{y|xz@Yj=$cqhD z&kw#d(HAKx9e+qwMF8Se`a8UI7W|okKQ;}ITOciH+7koow!Ze}kiD~Q(h%x@%1VzQ zf4cp3tpJdRpoa~DyhscX0);+>2B9HpzW7=@9W#D}KS@kVC<0>uIj!CjfY1UoL;R%x zqHwjEY5wXBx_*_M@*CRf)XJb+*MEFRd$eniW(Lt3%TTB~T7*WSJ=gQaQRTrWfl>~+(rO)m5q(G>Z?+7J zAP?{m8rnWkXbWET)5ImN5e*AkYpBy#D#HV{0aVhZ(Yuu z@^Ttld@@>Jch|EYFpraaZ*^CnAdjCsfB721L+y$B^XxqxFc+ZZ#aIOhqpRdvoRlNa zR&!D-`@Cw}Gxsma#gdI2|>VPLff}BkeoTC98$RAiZ zA%AXc^=jKkzLD*5dDW- z=b~O1+%Q7evZYR@gv_ z3Ld9E9(}fT^Zt|DKXAa3{#;D%>LA#4Pt*jW8&(G5|8HOd33!6%TQAJE7zsigNN)_f zwe`ec2Ei9w&>3?o(;yL|qgga|Ewl{<=8JD@S@EEW0V*Q;vJ^rwA)Y)>>_!ns+d`#YbuhN{2E;(K?)3RJ#WQn^AEN+bucC0qqLgp6`Ry+Rii zFq?|8O6{v+G51xdDoSNM12!8t!q47zsXrI9yFq^lUrnfHP_cdraK~X53o>6T2#%Po zDnhq>-ozaZT5Mnmd6Tt8s!R9G#R)ByDLA z%(_~AqW5*FKTFe}>9`fS5vUQM68I@(RDhbTAe}ZkYEXATGsuA6RAvcnD)?grooibX zmKA;X#^Mh0P(hKjFVr5%E_q7e}Bdg}dG;?Ej(J`N0&q3l%>#3$N6kH%pHOy^~lH-mwq zK!wb8tWCjaRUqCUEq6x;4cf+oC_-zf&`CvGs(k@kx=`?);{L3%6Kd!QTf9UEh`U%; z?>|vAc|JOZQ8U$ls@vyyRC{RsaQy2_Z`}5fU<))2#6yM3D11ScT`$IKq|1_I$vbo1)>HO0V*iGF@BH! zXedY>G2x~dLiS2Acw_L#XbxGnJ{k;)KP zorLI*ijV3~2}Bpv52J~!k)VtWhsmvpqCn)sG{Kc#ib9 zL8TML3wB#tJkR@}P0oS3qL-0Fq@876n^2QO(LZhk4c>vx$?8MzYcT0{wgmC9wLS)2 zjG#gz_^VI}iW<~XvKtn;sod&LW*8eYmf%H}qDD>ngRGfJ<9e%s>4W1Nqy!Zdt&);d zGO|z_NRgx0Ye;gVueh2eSh*k77meQQ#7>ebxD1+6K#l{@5?H$We4Nf6cH1I9R3V80 z3D?TKKm`T!bEI53d{>aVVs-H#GMY~YQ@dL_8AD+CGraJXHR>6P4PcMsSf2OC^Wm_2 z48!^Otatw6DzbF#vB=Mt>1;e4xv{%N1Zao)`+&+gSV7@z(UwFQ2g;}?CPQL!o3zN# ztT#1t=%Xo-;Z{-F0L1Apa&c}<^XFJH?Ttrf&B3UvGxU&1yDh{1`O=Bknw}dMyaF+8 z_SKs`3kT=U1WIh@u>eQsa{*qd4p$yCe5SqrWY}pZ=y$6D)DQxK^pt193N^qu7Bfgi zsLl_wm9!-uv=_4s?o1|U{n>0b_+DmblgW5&N6iL3W6-y1s`t0m+})FIgWajhZk+7$ z3jOgABGVq;JDVBSiUTGiRTnm>1S!L_p5s?CCi5=#?wTwQ64;^7ZxTLwe{fXyV5htH zo%qM=+fkGGu!~T7d{q zYbOR&KNMC5!wL#+lMlgYksz|~z93SkKt+SD4DGb-&_PQ1*&hVj8qHCF%H7a~W?=g? z+!fSp24ycy142cJt^(~EqWN<;3T@h>ZWzZp%9PNBqaRRJFHDj7qh(x-`ctInq-jS9 z!mpF+lU9+RRvZNLtqjB$j(5ej$+2VdDnY&|Zs0?GPFjuHEHv)q`WjsrUvl+yzhN66 zjzxv?qxO%=4{abz$^&7AADAb|7gZlxLFAwU(Gv1az@I$+>Q66H?H|fE$O{z(AJl88 z(7I!&i$`)fO$U?_IxndLk&cF+qX5~a)c9X1EpyTr4#t7FD*E~!RiRE=Yh%*tmxY2D z7Dt#O?VL!v&}J^D4gzB^hVH~J`FEu#<*&p7jt(*=SO25mKiZ_IYxFrS;6MO+cSgi| z2MmMo#SJTbW$$X#+Xi7^0~zoC$aA#YG4%k=b-u)Ib;kS|WB3|fWr1Oh1qT&Cwo;wj zq^Fi?3TKyZ1XL$1fzuqt+z#B#r~x&gyrn7bxD_cBBF(Tc^9W=!6y{+i(mkf6?|e7w z8L#ZWv}ru_1s~C7yD^s)b3|h02@4)2mL27KZ_ZfTQi%dDo}oon%Dz=!EDEbfZ}(t z?feWf5DnCi;6y^&I%_}{$(e1gJg~gy*E4m@qiF{a815nYlwWms3VTP0yFxwo@D#WBZW5xt_@gAi56fqDBF?Ay7qL*nji~42$S?1jc6> z0Sos9!&ewN5|-Fyj^-!K!HbxzVjm2RL2l_gF>ZTbWGFgX!e8lro7BhB2Gs0Y>{?D% zVJ;Ftr&R_`6%WaHMgO(Y;Guwig4M_-t0HndBl#z>Qw3VgOqBgp#U!mO2+eV)Pc6h7 zjv(=rmVV+s%6HGalRL(;$Q(EB%nA_l`8ao>H^JXaWlN3pFYJF?pauj410VtRc{oLW zi<aTnqB(Q^Vid=~Db*7(NXU)}!zYW`7_ z(Vjd*@Hdp-V+|FZ;zD)GrJ#X(R=$}=>q1V5h$1fEz5DF z4wTprytxYkHK@ku0$baaK(--~J`&XLFcI@|{j$byh#3f~k1)_`04(>2PaJs#L#X&W z^<%0Al_du`CX&fRh-pHTAOgu@sHl2dojw5VGXVw3fPHkDURNVJUB$MRxAwmeSE2_~ zz|Lof$4vd99XclhCB6du1Dl$H{`vzo$j%THTSgmoBg!`}dNG5TqbPXHkN$H$QfImD zF~^c5LvT$mf=5wONuLbKJP6hLj<$7m30Vl<-2WEMz_cp&kQ&i30w5>le`K&&Fx`PvV)Z0yNzkwJ!^u zDp2Cf?1NGHB}#$Qk2M}%szTRAvD2}S?1r({f%1d+#32TvKeq%q?orf|uVdFjq2^-| z#f@KKMDu`hd(^~X(3*&F0RARt9K_fN7g3T5eS`tZ)jIeusJ_bbKMc2X4kMm4LMIL? zK*Vx-w2aEnCQBO`T}32In8oZUqnwb4N=QEip0H1}F+BIh$laL}&jIHJEdWyxyeYsz z<$T&fiSmo&c2A+?bG8nD0{=(AS=0grzRH<^8-VAk(23_NMQdYp=b;HI0vRS7h^b`5 zFK|dIN-XYrsg!XxpNa#ylLk*$tmU1vr@gKJBp#>wDD~(f9JiGQ1mymxiD%DGyv2yr zAP$mIrY*(gJ&-~P08t2^k5Mu$MzETmWWcKi-x5f=g*YwKx7a^Du>ucfR`*3LKFi?N(f#Y@V*o$lvFi*S zZhd#>65^f>?H54E$bt7*{V-T@7CN%V8l*4GBS;XA$MPuCkdlNM*p055yqIhgDsc!&z(*ry+ML7tf>?YUrU4V(2P8nJlmuV!|XKqW5x|BOEl<@e+wNyf){Xt1o6eY@n z{p1?^K^yw^ufVy%T7ECSf(|u`kaTDgkA|o|th7fK21FP19FuM+xnmYbg0Br8v2o+? zahAHVuawFy^8V^1AyQ{quQ$O?C)rO)iT1t4du1_y<=*hySVwjji7E2z^z|H5VpsQI_mK{;;1tK4QPy!HUTCV+BJE zzl!e@CLvjv1Z#v;@pQiVul2iU<=*+SY*k;qPch%y`(byj5!TA+jLvW4|yk_0!}_ ze~NG8_aO(%XCU`uk;G9IwuE0@PwlU;z9W zWrg)t-PiAIwjb?UmC$?GZ^&q^f#WUI1*pZgpglqyB)n$Zgax+Tm3C!JsfrQXCG@eL zQDf2N3}4-Wqu30jhH%kp@7~gOxfiY@ZxpghX~6Ddr7@FPeY1V6-3oOAbg>&is6?gF z3d;WmBi!#2HnqtHqpEycHnWZ{P2a_KBm1o--4nYgG2ow57l9SK<9d@>lQLs3wydsw zYfr>R?rnx37+D{DJo##rg%{IA345jc`Ku{o*uj2DD$A|N);j;ExFtyQl{(V(CpY!u zKF@Yop82)@qVbz>#+V3o_NO;kdUd&~OJ@k_Bp`52la1O18@$s7_G`y#Fap#}Pw@1G#R-11O+X-gqfy~C>saniH+`Cs zvJzLBq_spwY$Yu_1+Mv`l8Lz&Vwx7fwGTa9zuz_LZ{sOjVmYJ!_{AQ>5S%GbGvOc% z+eIEeJnT6iY->2fW)|8My0- zMDNSAm6WH~U&?}o290Qp)$~KjvD0 zDZjz#nw?&MDFN!)ANzDH00000Ak5!7kT!#k^ux&g(0e}s000000000000000Z4`_G a3IG5kVFiUlq<*#l0000k>}zJv?3uYvwAL$SG7@@{J9qAosj4Vy-?>A8ymJRY z0J?|&=dH_5BmRrPOIul7=JzloubmH2G`>lr522Wk6-qt5KFiCni zEJ{Q->{xPYEGW*Ba0i;L+M>{aF2!GeX^%1>F``wF+$KmY;;1%v*-zclD=jhIE>+`i7ZDz|l7 z3NFdp5WMvE+D4jKEKV&lZ6+w-xGLn{-tx{`_jsIlF{4r50o!r=ZbR>jy*)>@?pb3X znPP)y(ofFzn*8B6C6_OuagFsg@SWpdagJV_`F|5JB?!* zG1hzj%+7h`PBRzxIc_gTZ+`_?kMK8D8p$vM5M&6tCv4%c13Adq8yn2irH0}(yC~il z=tj+7n3H}+-|dHX*?H7}rd8Gasah$HF;d}nHt@2Kcz&i7MSEL&+jh3s2)S=tL2hmC zc8ND%?-Fk4d^qS`tinyK;Ww4?v;ZIKz8Q5P!Ucb56^lwxc@r)f&@DYA8PgN$x= zc9INOI9*N$QjNr(>nO+K4&)7niuKU0$nKdo@PzzWNr2uq%|Z)L#`7@t>mdYOMqZMk<= z?R%j9cgYhzXS+rJZiL69@_mA6WA6F5uSKuvTkMb_i|pV@k|cRM?~$p<$xTZ&)@Qc( z?CC?H9qAX1Qs6m(IsQ+A7JauLTm4n{KJpOgm60rtbPr3My_Z~mFS#$F#0MTGt)AT1 zgzwdzXsiYqmFD$eis>fLH-onu)XNt$(ec*bnq4KYuYT-Ki?rt~S2o4xtk=Vvygj$) z=AS9m-98-l_cmOPG~<-3Q4xO`&ifylXjl=1?~0uG_}@%fzP1`&L4vV{#pt47CsaAWnd~s~Q{ao7`BF&LuTK&Z7YJcc|o0M+{ z`KHpHss9&PTWJ;zKTr$oJn-!LJYAVJ%X@;YZfEj;*C4vv*l^UB_dLzn;+FnwPuBY- z_I$GG>DKdB_k+{7+l%XUI+{PuS1tp#u`f+`bEI$fhFp^8f}QfDXL)=NZhzY5aR+B- zY`^`sE9^U(d@)k#w6X}ZeEIO$iE$IJmRAIG5SG^Xl=QaX<3VU{W|~P*U0!YwW~XWY z=DNUJ!!D~}*n>IeJ@<0Ulu!AKRc~C*y3k!`s^5HX=nIFWs{Aa%_b&{-fW{i zQ-a@pJjmVGDX4WwW~q7q7>#X1FS=~cuU@+~th$^}XUIBv^`$PQ$#OPJ)mLm?d7<{( z-E#8%CCrDdGcl`fyJ_>*=d(65sS@a=t5L7^-l4_|!TOg6e%IbdyPLV)MhDpUW*;9_ zXhH>qjmPyeHi~s^^pwMWE%f!g1||5N{)Qi1;nG=;gwoTl(%WP-Bss@t1)J#31KPF& z;*S=mPvWb0t6DRHW2K)l<%y42Ys*hw=SlSriO*Tr^kuOVHA{K9Na*;w<~T_!HA|WE;_lZ4Q4Xo$XD`jwyQRsG*`bV8nRTdChnuw;E>2 zxuK?XDX{p!51cz}F^tZog&*QIw;<-QwcxTO>uW z?JiAM#SH?*)N|Q?1|L*ry>zSzqHtjFjJ=o-leCz^l!Wriz^Au^w$*1>Pdj(ruK!Al ztpqyxpYUM^7Y}|kx2#tL3^X6e7&8CZ)|x(OMXOArmBa#g&&4K{>Ln?b7VDOzDzb9E z^#(R;wC@MXCY;wx>Sx{L80Q)%^xkNcZ>Jr#yZD&9=9o60HAoukNLmcz%ypY>ar+D_ z=lhGR8ZPTMf3Ysxd}`!(pYa>t#vyQEczm@Zr#?HQtJzx(7WYN?{Y!@918oxs8CNG~0 z8<^j$i^0!kO0NKtr*T9Bk?m*p$6qI;iW;OnFQYSpC|qP4=J!2umC6OOXFK0cn9=EH zm>G+~tD+grob~so;)CL3X4vZ8t@Esar#g#q%fXJpZSDTpKh2{bX|JC#d_gq6V7cl8eb>uA zonTphZ_}m|w8<#C)~&tiEaKc@)~L>u#F@F!Q##PkRrv(j^yHg2%Ji(Ev2{OST*Cdm zbxBgwld}}`U58bPChxumBN0OW!!61Mg-rQ8_e_JVhh9VaA4b`n`*OF-$`cr8FdXgX zeS&o(yqOxSHG-K*=Y3ewx>2Kg>V+@i+Lm6>Z7BN8pJv~A?p2`7R!PcEuBNHyJRaPc z#dg;6^~7$o;ck)~qqdE{IX9i%1X00qgDiv3@sxf|CmGwj{xe?2qcYo+g|*JflYlMp z2&4G!O5sA0IrRBeKNWj8TS8Yxsr~}92nA|AKa#@W zHvW^5a3RAMwLcDA{fS8UW?=Czw3 z$X2e`t&(GqS6qso^HNOS?ao_7it~Wj$0BXacnr)JB!_F;;!_&73zJ_hcwI;n@rONc z8MQW-llW+vUEl5xbQsYTE={l-5{wmeEC2SW#BH8;Vc0NvQffPw`hD%W_#j>2LArK` z-`>#{(8pC4-X~p`m)$V#OO9y;HqoR%x0{wRp5MrovT1mKdyp4UBDSyt#JLo05#$t+OZVMbp2t&ELCI9-g5LCiNv+p zDunpX?B+JNDP)c!dy$K7kk@f8A0NCz>=XzOIVV1Zsfsf<$fT4K={hhu+I$LLXP`&} zgZQ|>n7{|{F1X6!Xu;;tn})yC3)W!~`%cW->B=Vb1)XJY8F+NP0N!PXW(g-3*pcNv z8NRnFl1IA<{&pBtv!=-o+b5Q!vG<-mLOoUTCb4CetF4Q%K+B4_jKkwMGsOOnJuSTf(QWcDE=t1~xQS+aMKCxmw^(X zY0%!)P)TC!_=5-)tD$Qdz$0~e>v(=;HE!WaaP@r$ktSlqV#%AwZyBvqS{#B%_jGxZxM$xQZX-u5>cdT%3Rr8 zEqRS9eQfx>-$?{9#RzIt^O-B&ExIQ;6B&ffG*Inp5;ohfE-L-vldGebCKua6Y?}(= zDIUF83b0UMM0Btoq1YnR;GpE5wH{r|n#av4zBhhbFY|kPE*JIYTwiBZ6vAnG1ONM= z#Vr|_Cp>$r37pOGU18$)uylxe%OA%PRoW3|bpshjg{BMSI#qHF`DA)Hdb*gqc*EDD1n zMIP{%0CeO^Z2~eX+9W^uuRJl*p4vES*_K92Mt6k3qB_(lQOI*Slc|D7Qj4quXYrEcTI~N#hYkAd&Ky|cOLx$ItB%?$Aznxci14G%^F>cOLJM29XI50X5GzNNOxl}zB-asf3b zuk2Q2Tw4h$bVo;177hansn;8*Y@y~@wGbt*Alv4{m+O zyPSv`W~mZWCdC0|i{km~gd#uI*M>#MuIsS0tCH`c$dXfx^pyw9lQFD&JtZGozN#kGK>-o>S5c~})_#4QzZ8an~G-7hWD__hI1`EoA zVH^+;aIGGUHTm6=NJN$XL>n*U$5C%qs=MN3$D9B3EvX(iTYtuSj7eI5pt(^EBSSC- z>{SQnZ4t8vLJ`CFHKD7w=Z%9GZ5Nt@C!@0Mfv4krsqb_L``&OESgJjw53drwr!pSj z_17L+f1Y@T@SD^diKVTt0_Z5H5sC+1x+_7^0jn0yCR9dsc;tvuc1k$G7KBa$q^+n= z0@d^=Fe2<8)f_MC3Z}@44#p7;wBIbYn;pL9gOH};?bDg+KI#A^^G|2*a(-BO4N*$C zx2DQ&yFx<7E+BfUWF^O%UVHmj0W$ByUSt0c0*Tv%F1#+n%L(#xm$L8W{gk&68-Z;3 z{{YLE0;ejlvQxWq@#@>)oht>q@?`zs8p=nVdM{axj9rgiExk-b^YGOvJ{02pRhROs z#)RRILlTX9^NR9y6q_H?Rmz;1qqwam)Y!8{NqD;a2z8YHxe{L0=+E4n=Im6&q+;~> zB48cDQXwm{O+;+JA_W|8wAQ z^|Fq4Ri3zn64h=lN}rnXM}&ocIH?)}p|M0ExB?Y>s5!Q3eupxgHeDhFhSv^{DxkH# zDn^4lIaBfcQc>Qdw-pt3RD@zpgHX|{SUQ3Ls@4c09s#+HV;D4H#!?$eG#qz#E$2@_ zq@z_h1zx#-;c!h!-|~rlieMtHz&@+exIb(r+Wg0F=Z_0vdJoA8`AK+6j_y69{wJ|& zh(rTeE*}%2@&q7g)lxnV`lxrJrvR;|HVXnLt6UDTS$FwaOW}9f9pLflq^7c$%XkQn z0Mk3X_#|ENizPqkBM54REjmmYw6TIs%_8#rGnW6#WNMb3KmGjC+|sX%d=1q)ACn(b zB)pKX+}q?1>`#sxM8FErwod`;gvG-KOk_4uu$Fr@D^@Mpt|d9|{}ylR8Nhwa&Jzhk z?>hwhE_=`Zya@i)A-(xE&D{9*%p%xz8B1PA$yp}yfTI>L+4cH7m|?)Auus7aq?l-^ zWG98x<9fdm_EoO%fmPQNM}nZ^ey%kBpren2ldmMpms$gSMcu+Lp4It`zo15u92vm9 zULoTCS)So(F(5gtJbaU_+W6Hw4l0Q?dlBS9pe-B^N2@w?5T(fPNDyB|ThX+2LhCPp zBXjdp5KXvY*+2*X>ck7lD{I@^7nC|3>)xa_2>h9u$41zI9eP{A%a5DdoW^kjtkeRw zGTvtHKU9}L!5yG)D>6oLv%yyp$7>(?E8?%3wsW0QJ+dp|`%VllF)qay{n!^;KeZ1)T3W@F}Rz zyQaLE{g>yRKYhR#Oon`g#G5G;Jr2ISNK=&&MW@A(9F&zW>Vpd~k!nzGfXH*V99!zYxBYXs&2%{6u#;%8vHfOW zuhy=r!w-lktR9ztBJlc?av=2cCShl+UgU8@m!I%DLWEw$SFuYEkikJ@Qvd=YN{akb zc@?2QH7$$ zzhB*4+kxlO4RFHtZ_N*M5X5Xo(TxK1QN2L!d%c9*OHpAfL_#009Pwg)$BRcrbc8?N zlfjD$I?2lN2f-&g6?BZ(0%=(q>f@^|4*~tc5B&3pl>&1d~f~=qp8%$w8nk$bxFYs@1 z$vm+AZEjG-#Ao7Mt@ZhuxOFq9MaxID=>po;Um7Fo`F{H2Jr5PO*+(cxXjI<2C~9To zrDx%vtaJ&J(gt>YYP45Q@BW5y|(*V-R1_gV_zJQ%rE9B zjEH3pSfU)Bq-`3@4f;FJR#+qd*il?Nqu%AmClZYZTSwXoFOUOw=}fiw`0pbQ*VK7B#t&wx5zy1G zzul!kHy5pF{!I8|0xEfK$NiYc0vN6#L&O~*0hC?fYySpkyNczrSQfB4GdOY~v%fnD z)ooUO@7R8!pp<=$xF;E9+|LHG$@*f-L0;9(PIaJ>BE+3d%<~OFlcDiWoyJ=J{WnEu zVE^DZO9sG7X8p?1h_BBKty;p!v9~1K1y;CcEf00*IiG0g z6}udj1Gl;j0hG~Y42XxrY^u;mh$dCkkcl|Jh+-cv6#Hdd#`MAa!NBkbUszm73-F^W zWF%jqq4Jxv7glkq?51dKPLMPGf&xU~bv3iaA#+O^7#Q}UN;!%R$P3z3QnzHH$641* z+;V)V(wn67e|#zN{He(O8M%Vb5JXtdY|EA?EsNz(wH(4N;X3x2@oMXzZ*Zrhfl;An zT{uD6UT~C{SsV*euDqKvdR7L1%%MsQW`Em70#IH5J~XAwT<<8~bmmf=kbhGc)Oag~ zJ+i=+pA8??|4LYN5o>6lx!nbJP5D8Uvm9Iaa73zM_2<=n_K-gKtS_7{DB%^&j96RZ z3=DHGE$LpD&jXNbJ>#{6Pv*i?pra+P-9L+P12X2F^)w%Sj^k$YnSdgBWG?29gRc@Q zd2sWUxZPs|+_mqZ$@!}5kfCOp*lJCC%h8qz4{J5Bru?NL&&5F6+M)bZvfSjJPf;FC zMy%_?%-L)9Em7>=qD4`={%R1D0!UnF@AM|00{&gltoo+Z;>OW7Pi!M!zYY#9KN?FR z!l!graAE`pg(mxXumdy|Z0BH^dL_8vPvNea1w#v(}lzCyF3Z0O&$2&=q_%3Cf=`3PAu6@~@4wwa|GbBR*Kj+3C7gR+s{;5SqawSp(->x0UHy;!a>Eae8R}39k zWHGpF?XTVfnmryv3AYrRzSqf+@ASAynZS9a-7n!oj~B&&+@9aH=;Jy`*M;(#vL~4q zyXZ(Xp7Q*yJo@sW;%_(m?Ec{(W{cJ(-}Q#H-2V(GNxg`!JE0zw?yQUFsJ9qV!q#@r zR%Bn0Uo)jwZd@SOTSjEuo*c^4&mazZ3B=`I0z-)L^^RWWbh=ycNz$(m=DU_+toJn^ z!#9NO{E?{hZlUZyLMC5PgdrWK;k|O*6afFv;fFZv(;F=X`c<6HTYY1q%zjAF8vg(! z=w{SlA$rIN&K`me8z9O;!1i#t?8bv-A2f;GwxKgq$_)GO=4U1M1Dkn|aO90~qZtItmp9dX$+;+T?a`>A3N!RAtNW-mE8aM1U{V&Kbao z2_X_?D*Z(Pi>Vo@Pwaq~)D{cyu6709Xcvs}v7sYNjud%w1=szC+8(4)yMm}NUN=fl%wR|8Za{-mf*>hPSm-@Zj262s9e@Ce14nUZq_pC& z$Cpw*HwD33^^-wIwzM8&@zU7fvKcG*IT=B9>+Dl#yai?wrzMJ7&%S7H6-pSNdjO#4 z*cZE_O62>yF4l88epPV(q18N95xnc?ZE#v8R+ki;>i)9M%yqs(5c~4fA~7uN;zP$p zhirfMrF^SLVXvv&qfkOn~ItV}!@H8~1{`mTBjsL~YU zrWK)5J=UPEWF=S0^4+uxN)5Gu9j`8;22Olz%+gAqe1SoQZm&Mm=ybfk-5@hC03vos zEbd{GAV7fl?{7h6j<{jXyw{0D#vpcusRxP#JHPnz1u3*Uum2N|ks5mejSar&Yd5DP z1|FkvCumW8c+Yr!P)Ul(UW>bt*>rmBNPxoWBOkcv#CqRDAD?8``la2FXu4Qq&WrM1 ztwyg(dhK2~XDxC1%3xLo01wJK(&h8pRIA(CqPN+Is(>q zq8#+y^M``Qd#$G|kvqd&(h*?Sr zke)B)r;?)Pd*eGAc?2s(E#!?Bu|e0>KaQb3tG7QSu?>AW;*B%a8#6~ILDzl3jH^nt z6+GqL7@3WW@2VSfpU(4pKhJR`5i^K@_oQuP!;Omz-a3PQ zj^c1~3^cJkP7oO4umfAhsIb$;O@H$ryM$V+z4=9Xa!8m`Nk~m&gXkv-`Jh-B4ud`) zAAcxdlAjMFXN1s#pXa8vU!|1>jlFtaVdBNdP{W|`3xX#d92;V!pZMgJT9PjbFy$mJ`a-sQ-y`vg*e>Td9bL!sKJs*#)X^! zM+VZ{vRZsWNmiQ_WiA=`|b^v0QYtrMaf{>BDWlr-DZBg2bQ6`^2r#N^}S*bCj*P`t!kfr z&{j+q_8`k>;LZ2|O)d{LBJN3wiek4N_{&D2&ZyiF{F#Magv|D{0uAyGFeI4pHwFGY zyzx9zaW3K>ap2C+-9gR3J%yAE65;eAedq3TdlBb8sX%sn2_*3=Z?6vFT4a?Rs_vDxf}71(o&-P265Pu7@KHj-zXTw_IGu;CekEd#WQlibH3u_KLN; zx;9UVcxTrh@YDzWW!yt+25;5k=AKn#+~5cymmMDin}3Cn8t*ToZ@VEhh(p$41*r2| zq7euB(Cxx4?52;j@UQsWi_pVUN|Isf0j(*0n|e3CA$e%3qUVAN&l8>k?>{$I*N+C0 z1vW!tBQjL`Lv7O7hH&44PmW_Aj&`%!2qGCQ5?sbW8ShD^BCoQl$sEwYFyKPcm`4Z|r=Kbj?d6 zC!*I_jKluP`1}jO!Sm!DesAZ{8#|1K9?8r7N?(X{pH(F;y$v(N<}g70QBB5g-v*^D z#91p{B`y#F10RZLvcoe$z@%gED&|G>Do$+LkY8-YPe(L{V-k*aE!NO_-X*BaZA>yu z2>2}q{9Lu1^Xuap8~QUV+oj z-rqe@3e4bpgt2B`!`oRACnjWF(4hx%l|%392(N_3py_Lml>;orjX{MUl9|dwaYp2- zV4s9%VW|r3#|bdz7BraL=I*$2*gYZL$|tl&n+lqeg}*g)^?XD)Q=BT>cN*Q=PdbF- zBn&0rxETI1q%zWB7&Dbv7`%^Xo5*4m-Gx8sDH5A#oBLklL3o5fhRczo#Q=M3YMe5N{tC&3lo|?BmnP=ZKld;?O4p2tX z2a(U@LqsSvnV+{-wjAqhZl=LoGH-8*R?R5yDSq&|Lk#`pQSuQcU}Y5)!fr@J1;am3&h8;dm+37PxM( zO6K7nV)`zMaJc)$Ngc?Bl3j?)Un76j2vgnVYrhyj22ph^KJxTzV2$sFWjkKngiKRO*~zD)@}GTB^4U%F3|2k*E&S^J>jikp_@%L_PP+?-wYRjOZU zF(gI!QKyPo*As7O)ibvdYv|iQLPpWEcXhl;gRgZB5Rm&{&l9Z}WaL4KfYR(WyO3*N zTEs83)>cyzC?&=9L@8Y;Zxehs6NDzoyvGhOin{h28IMPq82KJQUR-x>)G**AG}%au zD>`N=s?#+0*c@FA9CW!TSTQ=T8u_lf99SAHGJNYZ$Zmfc>}urLX129WM!cQxy>~QJ zdou@5m>=cc9j(DFiJB?yPQnVqQCCl0dXmCt)p}{%@0T%w2^Fn8a5&$WU!w(Z(d|u@ zEDsL`71Dy6Fc9tE%!gUHdCtgcVA7d2>)GLzU+} z*@{kI@T4hRQ7OGx|J-`h7`#2jZx%dB6s`E-k+jnyDEAZb$B&3RhZZrlb^Z;}4gQ&3 zf&QocB{M;neF#T6h@97)f(*QF%7*B>T-noUiVr&<9vEc1dc$3IY8`U zy8ez!^*Tb4<76WqZEmZ#j?8wv5t6;p@x-L8h=)*$%xiiu89ixO$4?P?FP^pMJB4g6 zo5A7NYt)@n;n9P3g_C}C>2G!t8O=1wdZ<-vr2MUfI&Z3qef~^!eVTZVyFLj%92DDM zeA{23N7Vt26g4}l@k&B;NWl(2YI(A=PW%q9VNV)>5a*$K2>?xJX{*cl`aO{itYK2d z<3-2*#TzS-38UH&)LrPI0=3g3yzwnB9$7rLs-)#WdBnrQaDf?V_K*i2#|gK|MemxE zfDY-Mpm`-yhp29mA+z+VG5N7KQBz%V@%`!?>MDC2(cqVn+$RFwnB}Kk&Ca2Tg#=#7aCU9a&Yc6llI~s@go@ zV+Yv;6>1oY1LP!s2Um#Ugxy*}HnF4KV(P4=8C#`S5ahi$919IdapWESEjUa97&1y2 z2lxW+A2UqYuK{XHE{?-g!0g)U)*rzorBs}IM3Fx|mE6BqGWdVm=RHYXEwJah+c2bO zexgMno4uJTRZ^H4psy!m>!IKC+92^h@EH{oYq4q%C!;+0vnDk$z{mmyy%gXjZ^a2u z2Wl9b2H*)5z;@6eG%-f^@9M4+lsj23UMjwh%{Vej0n&de7i`b!IZ_Y}18%r{)-(0& zx7Dkoy}hrYqoLP!Ber_B$Vb)mH`8fAtYydGCr}$JR~T-us6duXn*ZI8HIrzIFCweA zuzuzU*1Pfk5^PrKFLIV9asU)fN9})*I=n8Rl84S*SoMd}iGvMkz^CAFE=tO~gNpZZ z6?^X+(x!9T@onc$ir{?!a8y(&Nf!OMSSva_y@b~RB}o1VX%sZAm*+x>;%`0o=BrKd zF8m0?pVsy1?Abj@<>l5pY?PAk)yz;5Cv&JNGIB0TsWOLqd}=26cz%7Vi95yjThHiZ zK1Sx*JV;dLxxwACz1D9jLv#q;Vfk(vll}LZx|t2qbB+k%EECHCMnf%f8eZzU92-vS zV?c^QV8*{ll(LMcmGIxsLk6@NWk`bfcOoeR#K9-!DedyWF3&DF1HdSw50_qrBFg{3 zxvP_WRIA^po`}CW)yu=?l)O-P`B{>!J@d{R zm&ogtK>|S7BHoV8Os##bd2N`g*uu@DV&i4Chiqt=Ny%PAh6OU3@ogZ;{S7T*xWM#9 zyr8fs-nc6QZk6QEazOk0DD5Y2CMmwE8}{lpvChPXKhoe7ln>q{>f{1Ape_*Hr1F^= zuz{ZMh*a3M;Tl+lv$UlEZu#?z0EAAdh$o}+$C!|r9P?4q-6BBle~i(8*do0>U!8ql zY8DsRP5&eFb3n4ceCD@k0%83gwZEZk)U3QBNiHm^SG$#01t=cVPdfR4+&4vn#j{k< zI{&|^1<*nyN+HFUc7jy!C@ZizLoY$-C2PO?@|PUmxd~W|;?7~|ErztwYa+d(&8JWL zE7d*QpCrd14N86L*TcM5vY0xg`*$~H{Ao=5*pMSJ==iy1R5x{$3Vzipz_;&hyGn=^ z74N);s(ai8r+ySCjw`I+?AU z$#U(HY)HqU=mfJ<3v-ux3KigFN*x8`mQ@3Z1}z9~(m9J!0HU=L0+GX^g21(Yh51c$ zd~+aj*tC6;GKzzuG(1WX3c7*`$mKhj1|I#VclmV0D;%?S=WP=z6z7193xsZj2xxr* zDcbQC*+amfQGpEtmSGKMrCuD%B(09vwPOs-IFrbZ&jF(Rcg43p0h-V;#qzR;lMXXx zo>$CljN0lj1SA&yj?6zRAhCOCAl>sX2pXaNM+2UCO<`AY2+n?FQKk_)!&*CxFmaVI zju6m!ffxnqq-Yp?3i_r>`a8G|tYPKj_h)?Xb;Dr2lX0BTpT8!X_ktY*nFr3Q7W(RE z4|r((?;;FWi3Ix)_&FMX%CvlMdd-))wNt?eSj)MU3BcA>MAr_KBDo_yq7oVcIZ&-Cf;!q*tQ)#BM71N&)|CQL6BO-!_ zlgx3AW{vBh#s9_$Jw7AmP&^t2c!>y6+pmEv&zW^Ncxl+*m^l8Jv>$W;U9!wY@yNnH zi6D9XZ33BD$!!ZOCB~JQ8%4;1qyE|$0rHFYB-==ZCL9#q=L_Y@U`n?{8w6G`W|1M| zu#=K7Vi#A4$~f8TzV2Loinm9$`tAp*A-}~wGxyHB{9T>h1Ybd6m31&nVS6}UUC9w5ap!20%tCqmkRytTzvr2XBB3Vt z@xT@$3I-+J#5bS^ES)-CpteXiU0POlCQ>63^4V-b-9n)YH!Z}~>N zh76vMmE%IwxWRL=RpAd(TAxnprouv0I2ZAa<=Mwd%&cTK44&jdmW~W3r?!>%UYBJS z$Lp@2ZRD4|BlBPUm%L&*<-4n&9*_C4#I$K2v&4H08K#$s#PV%)23m|TdCk~wJvPfY z4?7<}3ixp(WgPE?TEC<SO zeBCrub^i5zL2E$)T42}vOD%FH2@x>_I~?Mfn}zsdY}Neali`nS3Y7I%CR`u7^;d8z zj_??X3uOQ+Q4wY_wOE!Ua=exJpaG^=r6T6DNpdNpP&5YC+(*RSNn>M3`bXg@p#UX< zfbwRtiBTL-3_|6PdSh|Ye z4bK1?-bp&J-0W+hqhWx570B^xG>rbbh+T@~7k4DU2)`dYkVc~5M3up?lu4PGpO$Z| z9L*jbf4_#%ys9IAM+qu1g;vr2BF1Mzl>!CUk-$x2#aEN{pss)8l1=Lq=>SuY5Yf*U4;kO(<{4sT#$-CaRa`ISeGiOw zEOQSDMBD|K5VZI`sd~&x0Ai0|+q8|8Lf!qv@xK8yTwI=cBQ|i)noe&Q+GCEx%%-^o zV;6bkI?y~7m+xw0_piEa0)kG=k7Q5Ep;GIy!X@13hX6trHo))aa}fDRZ$GYix|=aE zz}}GXXxTs%zsYCKL|DA;KEZ~c#H`GC$w)m)6?U|8aqFOWtk~ptEazn^lB*P-)54xa^p*p;VIL}kT_V>pDST-d zcSUmShaZSv<$FDj?{nk?9X0>vfhGJ(4FP?Ut41lcmNFJd9<+nfgIt*XznTBwXyDcW z8}N7-TY5V$+deLGDG&dT$NV)D!y*eZ{kGTbx_9C(h6eApa|0ga2muSFXAFEjV3l~q z7S0gMw@qStM*H1VAPB2H1lgB3z)T@x&7F_PaPN%deI~5NDW>d?wu^ zt5E}%?i6|Gc5Z-c{Zsk-@*fy4lLC)ET9_u@13=b(2d5e={5SA1cw8w>cf$*_!|#~! z&HOkCe}Nx1nie7~8MYrPvV%d!}h;s-&CN_@a=>6tC(K6K6y9?Sd%rq zrtNHuT9qo16VP8pkrm*eWXm@uEmnx+QUD}q6+ldL9 zAN@*q9rP8hLTClI5dcmY`zo#b;VD>KY{-eJwkM7_<(KqBPPTc;xZi)x_dUv4D5`{( z12(5EesCy3@g9e8wDt%1PiC#?-VS7~YG*`2?`Gse!5WHSqRj9iUEb!yt^|XV!`D^P zigL-s>Og>h6&diCDA=h>n;KyWur|5I*UP`3i*MPIo^n%1$@{W^fjluyouonbW~57}V{iKP|QW>f~)IZfDk9C+Hw_J54MQ^QB}tc=v2G z)OW9R;dcP~ah`-9Zi!w+nY5Z71bh=&77mNOD)|ck{w}(XA`=f-8J>ZquMiJ|l9;~> zi_iXJ&xo;jQJ$n5wDC&@THK25uo3J1V2W{-6xCAnl83jT!^_w8k*9qAag()yR@wydH z5!=55V&7D3#E(CA)H&}9Wyl~@c#u~l`Q(qFfqmeAsm8Do2q4x%3D6BVQ4`aKf8{;T zk_oo8Et0^=wtbzzzfY=R$cmJ7y9|tkjltXtCj(P<Uwa%2*r^TAiXmGtwpXPp_L6`9(kKEp zH5Y#qEv3B=LM&-Bk%k@R;eIU@9bxH$_adKAQ6en6s1Rekh|l43y&tq0yC0IVD?!Tv zF{~6sdsZY(^jI%dR3&^`$fB5}auoO6V;V<^=Y=*Xz9Kxr(@7`*R7+LQHt7jWuMrXR!K5`v&J)+hMV7PJs*2YW2Mx5v>t5k zz(TSfF10~ql_6$3E``vgM}Yu4=~aq&+FR6L3#RoxY5oPyvQ!Fo4MRjZi8@r*P%ECA zQuC7#;(nFEi7c6%QZe{g&>np6it&2%XW+Dut#lE1xF&qp#~x2rvEl=Cwg6f1+okN@ z+KJpHgzB|}uk4RcK?az#(?npDi>%*)nW0409Z2V!kG(N*dbp{0}ik=cAFGJTf zwXKEzB<4Z>&bDxJOwB!M(aHsG{fKsyMXZjzj;zuH2Gl4&w}P{HexEE02J+cxVIN~f zk@}SXwT%-gF<-*)gxwzzFlWL41nE)S-?F>p4B}YbxRKzm-j88o{8fAVV*yhy5pcPd=5EP+k>!Mbf5DDpbstT&g%aJcdqQM1+cng)XeG z=I*YKgEdIeIzfS*WOcaylg=`op@svbL4x1Lv+&*Z-^0dIgW-gEKv0;(RV`!wiCP7?*`xak3L3x`Q_&EGGx;fHlqUO7`0-N{zZVS3Q2L(_tfW(=jDc(SGSwWQ^lSQ@+;Oz5 zT~)^S7ON`m6;Je$^bp9+ca~k|!M{aO0IE5bx4Db(Efgul!{hJ0a+>MY?{og(SDm7o zQQ@wAQm-i|zV%vY89WQ||5*C&c&gw3{o|a&IrcfWW1L}RW`ro? z;NaN1jtIw|nH8d(pV#xc zt{dQv1`&gM`ER4lq$YbmG33#2+Aw%9KZ#x1{t4h{En)W{x4_UI)j~y6m zmGMC8UDUwDhpvEK08|tDb3qN^+Mjn=|7{)J&jd`9KG>z*tI;Xy@P6STUudIzU6*0C z>^5gO6h{tGXNRU$JQEsFGr_2~m4}tt?k?Opr1*O%P$DfzLS4w z_@*;PxTW({$^36qFWr=VYmNcke+E?si}a}jB+zYB*6WJrWgaH0M{>}7ne4I3g0aQ!=Ya4eX^$*#Hb}!qrQT~QV{W|j zPe^=6q~)YN5rV^eW_LcFlXw8OqrA8IgV;0*PKxOknX)-J=Yi`1g+m$9wbm{2Ekeen z@1E~igWs80L2Tb=1bv%`?L4E_Iv_O2Ob%rx`LHw^E-hq!?IzNTU7EDJ_P*D&WN0}38vB>cu(mD%`0f8IpLLObcg#vhUlAm*~t`l$dP zqVpcoR4O!L*W>9{E#j~txu}y`rOWDhhz2XER4dUmuJfuVp0aEe-dx=UTgzR(D-%f{>Sub{cV|zqNV@R zXxucPq{mNC#1QqV3~4&vU07%ZLe|1A(ft1+;VV2s9^KDWhAYVLR!8p*tPg=>FYipj zK}F25x0f~jb~v800m=fQ2XTBSvk{6tdw90f(lMiNj6=LD+^)QGJlfuHdp^_URM`lo zyrJoW^@;Tas6H0zjOUty8Avy_RxaHa{7Fle*i8N2J$!!}(Te36VH{SwvHP3VHM&C_ z|2-Fd`XP<@d|pUK7TP7tdLEU({pV@rquS%0*5`!oNE#SQ4iG|;S{%D+_riZq0aAXMKbeBW202EX$0?)4ZGOzfRoPYFg$)qKlU0K1!8jjvAHMxWw>=})-auU^rT38K`1 z!4xd5u3lX9v;A$}Qnb{K9m{2LgKw{csp*q~eU(_qq+l5eEZOJK*Beb=>HiV9kZw!=LevpSBKXEJ7(>8gn*AG>DToBSg`Am!U#X@g zSE`qd<82V>1OJrK75XWL0+ImV5yLUC2wKqB_*rmyO-$8j`kh`}by~~?@Mu|xD2&j5 zg)YKuv6~T+6Wwsy+fwp>zdBGeC*glSTQcepI47U}0nyKTT%N>>QZRG7oZ0T-RJ<1> zhlRQjZ=Ilv_~{1&+HdrC1w28^$<`~sv@|eNrkt+@ljUH39)wAlF{!eTJ9P*ktY$hS+o<;kSVJfZT_J603 z1yQXy#9?@jGq?+y$ifiRar*`*K|99rq@}Ls0eJ3W9G&>K9cu&VLeO;Uvnt5xfPX z{F-lg+S9AM)EA)mMaJCrr$C&b-LlE8Tu>s^@PC!hc zLd4ut@s!PO483O|v*=m~S3stGzynZ04jz|&x{+UnfYIRn%JrTXs;USC+!o!J;v2Ct zTdJL5BO{v)Xsd3wp_^E6Q*nw|w#_|@otL*#FIkdYA*1njvS3y;Fc3MPU~m=%2vl1D zj>_s<{~|;g{jk4XJ>zRaYW8&E6Y8fMqG;^&&NGa9wP#j_FAuu##BHbkS(($fg9Guh z=D1c=$V{57G2c1&vt&TFjIuO<~l{`~|q7e>| zYF&!Od<|{ z`c7qF>3{jYcSbU&I&(rF^YVilSUgy1ThUkBLj2?b~6gb-M0bJN@d^KX)UJ>72h)F0K)4V*J^nlK?}P-?s6sy|uQzZs>63cyre6t8u#z zlJEMp&a*TJ)lFAdzFm)B#Y=cq@j%2u9j-fU%(2m{BRE=AN_2b_`~#}I$#1ne{AW8y zZ1hG>__t``Hu0K&I3ZW*1z9uW4@ti!BFa?iDKcYhDfme}Xoa_^-o{6+$6x~kXhoK2 z>%mc(2RlNR7^9A=Yd{?HLr>Ah>F`&4dY9)H59gBdlxj1=D=HoFLI~z~=!i_= z_4yzBb+Vje&!%q&%2l|39mw8VsF!cvnY?zXVZvMM<( zL@N`B*ub)-B*4zkDeOyFxHtE;Oe$=S*Nr;LtL@HR)gpJrnnJY2lhqO=_Um@07@ z)5g1mgeLdDFG=0)`3ct+D>I%bLV9( zN;a;^S*9n8O$jt+@CW=G4&QTk_CFH@GfjcN!hnx$!MhqO30$u?9De4O) z-i!Av_y$CxF@wi~#7Z^9%27Ptg>T|_MSbE=0OJWWDj-=$RMhfH_}g7T~1wNYDdz;6XTax@# zOhBf~<0O8Zgx1HksL@qCD+KHBSzO?XY#zC3d8SIShqgP=dmaXkTN)&sS21!P=vj=1 zMq5CR69Q!NQSdERXHSX{?>Twy9@?52ZaI;SQo(MMq z`rW(@$e5&%8qx~RuzFHFt30BRZSOW9-f?~_*+Tcn0U4GnI9tH(A&+T&dMbc-C{&X) zk4#Eg0iTq{ak>QJp8~;rG$p5E=A~_<<5Qi0>QRBOT;kgAua#y=QcfOe3VsDrEJ=?D zd`>jRC<_>}Vr>MA#5Dnmc4x6TR0^A1b=_LbVzeJ-(8v#1L5|6Ib9 z71~-7Aj&=|6v$W~kFu9;=v+V6F9R^*yL^_MQ)K>S<*89%fj_VKYc4>X1r1Te9lQqY zc=rs&AE=D-GfGgrFP2ouVs4ensWdIH*5ZAoPZ}A;7YAECjX(EaiL#uf{QuqCY&L28 zq5T({)6nZ|LcYw1`uqE>-ab_sZ3Ejo;*MYx3CkqlErD{UZKF#kFl7m@}%U)Ym`797!?rqmTHGb1(l)h6Fb2X5;&+JXR z6L7N@Q`1^`l#cHA68_Fo=F|{G2xHRXo&}iVl)XXmlRN{}WfrZaS*Vz2;7!WSUHw=@ zE4ay#EuK| ze$7+$htC0`6Bb~NYT+pO{6_TdC=%x$ciqla$4`xD_Z(+IK!-m=1uT9KGO=cpM#s$%G33KHHMsqOZQ{I?vS_|u- zZw0zkf)0QTi3W1yexXpew$o}v>h2d$U9M+SUvB6^5d$3C zNj5$r8Mct3$%D0-_|9aa&`Q$Qu4U;Lx8La5FL*El`iZ-z^D!vOX9w@Da~HYi(|~4g zO$=Qv4I9#SYvopRRP)ND%xjm@`^y%ZnuC3{5!or>_#bBN|6#L+{AhRVq{$4nAXo~% zf%ne0xs=tC0ud%GFIY)gNs*d(IXW!bc2rtzmEVmz<^m05j9nk~iy9U7=Lv^{i_idI z3MmS^@vOtenWpnMZ~tbe39(WP5AsWc$M)ZmF8>YO@q7)#Iwo}U#+!JxDAB*!*MbuD zyzoaq3w&7>Q{zZcyaK~qD6YA_D=2fAeVwky(N}5TJxf)4aYv3 zW1+?72p;^Isa8gzn)}8IoPzN~tSc-IWyVHD{@E;_gfa zp;?D2^;#^q6M7-pBTuQP6*P4-Zykhd|0v!1$i?`M!e1FPp7edRZHro07G65rz@kdU z=aAcFf%>gqZs)>`IXz@2sL1#JdmYz8)i0+KI4i12EQytUrVHh!Zd?^Im8D|3dWVyfwv#Qc_;2S zp(*nX<}GmQpXR}bHLce35V z53on?^<1}dGZF1bu0LG9^$P<#6f9?|T{@%D%1mdYhW&>#$H>o}br>Lg4uVn|{}{R3 z?tk<-d=eR8!`K0t3l2^w1{YIkXDe$=H#)@! z&EuU|dB`Fbo(Qm&3Onm5(J;j8j=25$Umwr)*e6yz{P{U#u<11tM!I@7OG2*~_PviF zSX&t#{^qp7{`Bs2g2xNYFZDp-E#$Al2yuvRia;s=*EIiZY92Z}A`h+w>>#8Y za5Iov^EO{gQZ`YO3+ST{qOslVfvf~_N&7SHO+O4g!d0^(lw=JxaAnHWq6rYn1kqr3 zv>(z!#k%}*SzBXz2S$3E%zHmF2yQe%ei<%#>HKC{>NO2n z+UmumA}+PhwdN+3d3wg}efxdoS_yGU9q~|$Dx!)98Fu*PA#{3%w-yhH`-VH~Oz|V$ zx_=F`wLto2ksN=Gs>*`>zSzT!eTa9FP>sJ9DDHhbofDaNwiH@|&FZ~gx}KUo?NxOU z<_g}QeWuC%wxsv4O}C+M?Z-1stA0*K;^vaz`s&O>k;G$Ax2SOsE?G_ywdeb~Hj=>- zZeRrg7}*L@Dp($34#0Bc$YO85)f3&EXgX|NJRZCf*0#Fns9s@I5T4Y}K*_$DYYq{wGcxhX@?w zBb~2SddS52rf|_5ttJYonn_Kal_p%a)y)UywFj@lWrshZz2@3Aun@jgt~`~5Z;*Ha z2k@4XGHZywjReRD10>zjR536BFs%^nS5YZ&+An~jUI=c@6Mk>}x`_+y>VsQY)AO3K z%&qJ5*28Ej?Ip;Nz6G3!gECCm`&h`0FVuMUW=TeVL-*0un-ZJ^!sC>zB7oxZN$JMs z;H#(l;MaZ_Pe8jv1Q6$wZ2wC)2MNh|3<#=D}RK=Dr0n?CQs?;&Ha64@t4t48Chm8dqD-YmZ{| z#n=}VCc1}SMGq9<6k{rpDBytgcT4m9j-0p1yy9(v0*6WPe6rZ&Wx#+$l$aMGNa?@o z9ibnq@%#-0ITvW-ciDaR*tf=yvxl~R?#;Q`%c(R=zH^rp=s2LQ9!%Bc&6h%y68%n% zMMPs}k}rq?3Eq-aR=9fZ)rT`dFIWtC$Vec~)G%-p2hcGEAj;D_zaMA07ARu&N$(s< zx&vSS3E&n1GG-vG5dom_Ux<0pPS|LIb~WV~ng#3)W>3D$yAY@y`G}H22vT?bhX!nh zTG{t_Soh6}Hh1yhn|%QFN;>Ey`wOVuf_WQoJ-=s+#oHNG-2PA2lZV_cp)c!gb^@lM z1Yn67EID$EcU8#%8t;vOOHB$#Bs6KsJo#P9G|>B*T0PiF-!4CjfZAoltRmekZ0}jH zdG^*>k}TC-QzYP3>MM6YyyOEDv0#Vh0Z~2-u~)G)8ZR>|dbw{p8NstLHMZdliJ1j8^W156F(^extue z0Q`z4hkz^2m!G$e_>YDU3kw2K%$()@pfhI#jL%h~x1QcHwA@!6eZWmvk>UMX-1y$w z4?Ebcs)j(q-6i!|(mcLIW`sPN@h?)v^Cjq)*W%TNJSEMH#lH~k&u8LMJhER4myA9O zem_9pk!d)S`;@nLf4*e<*Z$b$4={?RGK)&V#e~TXDQnqee$|IW0;3R?@{P{yCIuH1 z4;Mev`a$N3Y@;qszf?O21!sFe4OY)r<-RZW-t2++Kr>dYIT6VIk!JoBSHo*-AW1t<_{FvYG0ltkiz1ft>cG9C zNdlDq$l7b%S|spHg4JwEAe?0?P8cpchJ}mbV_Ua3d#fYA!F?3r`^?Fq-GNSweLUpGqT=I!^1C+WIQQ=?X zC*8U1HZJ7cr{8V2^bTKluKEexO666tcFrtChP#SuKKOX#vChqe#}-zX)GM0o+;|B# z*!Rdu1l$eR;ddu-&pWNuNP?f|&8ygsAiL>8(%XUzW&`Bo!abv#Im0Z$F!b9iMx`uN z(CTc3=b}|catCo$y9VSr4X-YQsWNW{puKV2JyJXxnUS-QCVPD&k9)?gMl;OK*cag5EA=d0mIa4>W>~P9&uIk5Cs!aT(st&QCr?v z!NjfAr{WKY=jR8#I}A#y41xzzb*r2f@TFe@brt#*`{VMy>v@(E_E&GX^8;Dj9J~sP zw8mW5Miez+=*5IHPa1=yW5}Y*`k3H;R_XEgXGW#ckzjoH^%$6NK#*-oN4SA=anfm} zrW@Hexgq&~x&zT5&Ke@&I=1FL+Q9#8#W0PTf@q09K$Yf6A%2VfO}nU-${y2T1`UrVp`e&rkCVh(Md!3?ke9Nq)zM zDo|v?&E5tk_J8uy#cw9UB^MFrs|2jhtenRpO?9~fH7L2^9o!i3jF2MfypN*j=4YfK zlo2PH!-CDi3sA~rL-mLlZ{cdi7PIOvdW^GeN(06Vt`&DGn40gZ>pOvGb}5*Y>B<{K z*e@D4i-9gHWISBgXUDzk<*PM3pQ!wy#@ocWW-&C^#9;?N5Uz|%S?rLeMOi(?ZKx1( zxITuR2zcl4$2M*7L@Xl*+I!%^t{zZLw~g@7jdl4^8>bmKzfqVI*@}zu7djs0!E)mfp&0Uhzv9$M8(-b3qB@*Z6+Pez5C?13^LA=(v^V!X3nveI|Na|rj<8f&|rk1rgsFhWb-lJy12EL$|9Qt+V( z7WP4dIt4!DI1CQ4$LGJMpYZW!k}SVn@dv%fPK_MkE`?f^8FdGhLT?wL)_42bKL5Qx z<7+-kF?_cJ$5-K`)tb+6zX*q(V;6prrr_o8t@p5;yF z*&*g3>7bisL{4&AeA%#yWM|VfpK;+xsp{O*Q-JA}=ICny;~gAb#XIc5D0DZVXAWow zmA@I~c01g`<|_26N~IgTr?YM>eE=)=>KSehpVGe-oxRBU4R(mwRo^MSmWJ>w-F$U@ z!~?5({aS{vyoW1z1`;%75&Bi|uGpaoJwh+aw+WAtcy_w5BYN@K30$$rx!;1c;gE&L zx@eSN`@f{yL8;iG+#e;L3r=38U#_;!|8pumXcFJ|xt^~x;JA_Zm-16)Y?k66S>b}< z^mjfxa(3Q=icji-baP&0pW|JY59XQF1gsQgxe2p(_O%gGs82Sofdh@6luApg)Az$C zdhAD^l{QABe}>eTJnGbjGGM~RqF&n8e7GtQQ=?9`0_`ara_a=+qLH`}AID`5wY%+V zh*saYl!R+O>L`$Kjgs!6rkmpnd{WtHUC3RdAA#fiGJEQD)$%w*qPIj7LHuNqvPdF7 zv{`c%;eP5{e~czY+s9OLh~HlHmPP-0viq#EJf&<6>mL0F@wTuexlTKZ2$_+v@4xxr*-_vcxWkvU%1S;Skv5p@yWug7C zoreIVBLg@Ry*;7`2WRq&CX@Co44m<&XF<9lQ3+ocqeJnPGYywb)d3djLIaiXV zOVzdP4esjh?3sj0^f*4h<4cvD1BI#AGEX}L8k*khg)+{%bSBe>x_ z?g1DbADapNfaj1sb^q(bKf+Y}h{K*mVeR$ih59i+Y>_rS8txSWGzHI=57WGF$}ZHc zeUd4}@^tm;)N@0bdd|;lgEMD0s_CK{*Ti3G_YEJMiCVSUlH$%@J&J)mfOdr(kT*c8 z#fuVB=9pvOJ1GRqt#Ig==7r%#ry z8}RMb$`T0Q5TicFjNOOqTG}puqlXOBD(t2bVYDyjFaO8=WjLCp`1|e1tS%DoIl1gc z$G0y49`z~l7$b~EsxsVbHomOP_Aa%A!xZBX1;_H_bmlG(#dhFLS!S8Mg?qXN8QR2@ z%NVIwDKH;HGzC+bH}~o&t;Zk~Fr8*x0MCdw>kRS-cfY7`8#01lvG5pr3clH~gPMB! z=;G`6Ek5D7MA1RSrYQGd;rf><0FRTq3ed?C}$&$15`fR*rj%Prn~wg%d-~gk;*%kJ{YezR-BFC>hxH zqehEAgvF<-c^^;rL2U6hav!-zWDs_n-A4-cMZAhIxM+UrQsK)Y++e=`75YP6wrA(y z*Bij?A5{4bFsh2U$>27L)86q`(YS1ws-=Rt^LJ0g%y7ZW zoc$^>Ks|QS(WB?gZ!Bxv&YB(|JF_8pd?=VOcQZ+;lE3*2#)ZC@0QD$-l#rLfFhiz< zRRI?9t(>_;P3iOxKIQjWa@iEPZ%QM6>rijYj>ec_{_T}ZjE3gpM+EqqeB*FI-OtAm zI+Xr7nTW!Hyw!&Ct&#h`tXVVsZte78S`{dOja%{?gFoZ=fDOk02L>S0Xw`R9Q~&^- zQ=|6Y7E}UIzxrVc?;NtWlt#_(!SKAG?)dK*L~t0A0wC2ucLf)kunM}uW~KU1~yv)&LfH&+2~ zSQ8_RoM#1G!9MlrJ<5AiT7p$%MzT226yjP67Q2kq&nDv0YM;QLjo&wY zViOv}%dN|-sOVdW6GL$1EEb;eD9C3v*%N0r02)23KV~ZRq2wcFvL$421mC~gNw&-d z_R`LX%t`T;QCAily%<+{XQ8Y{`R;2`3f~ys>~vXfnrt!Cy({wBBOKC>0A1z@uZ|WD zOG6&_w17E-cmmm%vp1~+0I*xB2DcFs)(9n z0Fa|9a*%)U^!(ia7Fg5>+5p7%0PhghzuD*qo^f4C0GDUs&r5k_%y^s{#R{W7&QO13 zttpgSHa=_~$4a-bwPHtY;zmyIOJv(f&Xk@7?ABQabBO04Yfl<;VRnE`=Mx^*QT)S> zg-zniW~F4`L9#Hu~4_tCcF4Ar+Nc3xG{lI2^L_&PGh} z!J`XKLkW0?eKv#X(>;_4NVy-!<-N{Da;hm5%<{TYt^3m_n<<>0I5FG;fQLpNwgYnd z<3^$?5Eyh}lKj2$U|Tl<+v)HyQW7isEnaC^+8G1Ut~k$&BRMt7`GKoSu_E+@H>ky3 zgVn$h)w@!`)(|?^qOqO=FH>!yG}P!Q_at)XK~0OowcL8HP2k%uY|@VA04SecjC+U_ z2ZMd*`FlE~;YTlpN3IUV+J<(tsoeV2x)=QUy-MUun~w)&x^*cl`v3>xxbb{e{P_t) z;Pdb1^f0HIOpDo9i+_#1P_XC6t%W3u^BQdRvqzc-oA3HEQ}0?xy8w1g6?S$1a_y~Z zds{(`zu4V&5-i`vQo__or8$cwOmMNcGuPZ!sd5I4glslzovrsjT&w}!{kf06jq7Ba zJ4*JQf_(tYy9$;I4b}(x9yzce72zRl8afz}f*vn&OWHAFPn{3Vc zZwr_GK7|$^P3T*lzbdIT=k9GV{rA}4S@E$XHKX{NU->n-Y;y+Nyb6DlpO?O_DCtD+ zg$M8owq_vmVTDwV@ zmlAdgp~f-L(^|rGo1L*Cr4((t``_Z74;PYb45G|B0o&V0HN~s1tzFM$GcOKmVnHG@ zAKXuYx&{vnS0l1?5ba+=;xR^D#yX4UcWs4sbCNZI#~gmfu(3a)^m8QoQ{x`HEkyjn zE}eR-Sy?=MKpk!f>#DDE@XebSUB<(4vJQutlc<9){)0}PJ_9Bz#P zFQABXuavHbRfb_*G_Q78X}KZcRcXpT%CdWNC`*30sj=Oh5b!VDVa6#xJSl;lZB3lC z)GI#Sm=6#wUIDMZHO%HH8)8pX#J(S_n7S{cNQ=H-dRXDJLskQ%dkp-4EZQ&WwI>iX z^dhTMhOnR9$gwrHA#`k%U{}er&M3pfbr zID}rygK>j)mNDQqPh(ICcF^$YyBYfi>wqu*^gOii^f7?S>b}sVt5o|}@c&Ht-G4J2 zx&@UN2L%-tZ|<%%JboKsaZv#E=}N$K?AG{O6|<57CPfaOL=1C_;%{~PmQ$RNc5wis zw+f4mD7f)sJ>VNcl-9LNgiz)lu;c(m36Tiq`R)nJaZmBM8!=%LIMcS!4QkexXhNz} z!bobA)u7b|s~4O(CjJ9Oc*%$26AwMMi4FIR$W8z`eRX_bu)e8E1zCelN3_IpUJ@XI zu|J4wGjK~*E}F#4gWd3lv2Qkvtk6Ie>xZ=ar)P9Z;1ewqJu|G67Xr|Mm2eCp>|h(d z`1XGfkyJ{AVbrOt%gBidlNNzVBx{_|qk+QE8+?>kDh8s3#X#SAW7WVypHuE~Il|(g z)$`UnrQvq;zP2(~Ii+fJP~7`;?)jebqicQ8*Z!FG1chR}vS9!A@OgPCx#aw>-HOi& zwj{9IFwZ8Pb@3+1V9>^apDK{EIxX+GC~u!a%ssjRc{IGEH%xY?+{z0OQF{OL6Iw1LQ~O7Kop zH|TOoo*$?Z76bs%*?8segP%^kW)`@qf+E)4zLrkZR6HK8ibCS?_ebZRvK4xSMdqDa z_QSk_Rsd{tBToQ@4#aL`68oR4ERFUaQ{u6Qnsxmr_@r0J{Qi3VVH4@hl(~w=<6bjs z+XWIm5n$eM62_yP3h1s>Z1`3qwDsP!tGj38M>v7P2ha(ib`x(S(G+i3UNefw;Ld62 z7XgC&kA8oQ=JM+jeq3E7*DSHDa z5WT2c@Iws1-J>79rM`#EM`keTYfPQ~5wTzgfXskokP+qlacP3)DA_!E^C7pFtSyPs zS&{t?-w)BBJjKnE&0;VD8B7uP6iHzLh{a_x`YFlT-}z*dLJeLNiY{z&~$s@Qf53#Nh5zR>yFl!ek#Tz)~wtHonbEvB`I4z3Yei zVhzw8i&x@D8kMfOA2bGm^+oVCygpV<4gkQisAF7st0F#DBK^)Hln3w(5tS;llgabF zy$R*99*zCTwQIuDl!w%gpzS~A@F+)@5j^`7fBBB;p1Eh?#W3^3h=H?@60pI7mKZOw z?lC#Xu2(Z2o&wVzomG?U(a5bF#`}NPRIFgYsk}D}fsVT;wF&eSi;V70zH;e}R2stV zY3x>WdMsSrrnSU_*)`Kr3O}`4?N+-G=DNMJn`1(fZ~Hy9&*k{H`Ol#T&zS04G0LU= zVpy9;T6;fSN)1s|2DBjiR8fC#+AfU{;rD$8n!<-k=o$T4*LCNFBfn_(1Lb^td*_HbCE>3=zd)2v1k@w-^`$?h!Vmf)h`;&ba!w@u zbZEO@#9Bq-oO!~`|5)m49Ds`B1%5zw?|tZaxTPn^cW$0)sNf>%YC%I%3j}k9d^$La zOrqf>)+(1*G5?Mg=dAi~Z*7!kUwosrv0A>j-nceCpjBBH{_r^$9Q%;p?X10ob;q+g z)kC7_cdEk&B zSwBu0dq(3*r0$Jt znTE*Rv(gvqaC#o-+m zQTors!+)>4kHJ1%3Xn#+@}(d`zadt?n8bnEjez{yCP<|!Ys`t#jW=1*C@u$)~EJm#NuX=T5}{kZpYqbOd2E$PIaNV|#D zsq+I~5^1tHZ3NE62AXj@_up{hY_(@Ap17*FQs0R?Eyi>&XSIY`TT^c1!6WqBjNY~l z#Kt^TfUz4Mta(H9zjZ~7c64WTVS4{y_lpF{sB+Egx=`hr&`X8)J0ibsaW;X7$s4|R zT|K_Kxw0*U9i9oPM{`X}z3`b0-$|I~|X1$7iC zc#u(O5m`d?i@;O00UcEw2Ba_lCLv3s^JslASfGqz7#qW~CNgmK3@@b$fXbAoVqEA` zErm6FTAEzs18~aH2l|-4~|_T2%e$^`s8GA^mWb5^2MZ$3xkNhQ@lhE0>cVd zUYj^x*cgk$qWT@r-LMkBpTiuH*39rNKGg&wIYhP(Q#uz&< zMA4k!z`GslJ`Gl~y#8p~+C+JKg4O167XYXc%{}t9=@|O5hj5$CfKCDd5OwnVanK43 zr6u21+@ZrNM7bF>ekzx+Ohe(nlXp+yYL?8OG$~L<^oqF;YRXQ~h&6f#^?OWxcr=hl zdR2ZVFaTQC$g?Hg^wR)>5yZZuGTP@;k<1!+fy6?o;W?Et6b4kmGjCxqgFA9;3MT!P zGk6eC=o+K~yhQ`D2q4k|Qd~>s?-aa)z}+pTVcgL>7S zFDh0bP8Vcv;oY48L8_movpEL9U=$VXAxI2DjSHj&YGG^PzRL}#`La;sg-Ean-W6pu zuAIBtPhAU4p8Bz_K|$EW7jc0ZdZ*HK0=}a@D}S()^Ec=t$s8k^AgY*ZHcQ223~0gg%6F{<8&dM_?E=L@HcF$|%45AM-_4d+U_(0XjeQ$MD}qG1>_9fU^-fkyod2Tx9~#oU&hp8tn3Sh^qLndTVkc zv{4X`Q~WG<*s9NQb4~B#r-xNX-Xlijd}`;k0WCwU{;M>673IAa#uV`9(jY6g2%N(- zDx_bokbs6?=s)^4_4(D0@Vu*cy@OUr!NSo$Z`$T$)5iibl<*L6?edqAG?O&1RCdYt zw|>u1*<)B_BM~U$H6k&dfV=8Zn|cPCaV_0hl8RRlLS+dj>?)%dx>-ch*SdN%TAMg~ zlV%}{qMyC??rhX=90uxby?=b}LCoL%-*u1w##BA2zY^E*q;9Hi(QWwY*oyrulktK+ z?I%s06CzIbNO(~0K!F!u5qs|QQUseN7y%K#XvC0qdkI)DP4RT#rwP^Kz6r zE9aDCDrAZZ-9s>mnl-SNUoX>h;Je+oy9rBSI@wUq-Rmi`DC&Iy7q3962KAfU@ua{I zuPB5|?Uqj{4rdH<F3yNC7;`RK9N)4&kab&zNl8MjdYN4Yygs~$#vQ~}RmLDuI>eTh~_4)B0CpaSmRLI~yVG%-yrV_>{$V z^MLKJz9p^>#A6RU4sr%2E%kQZISV6sX48#VE^s+q!&VT_4pP$`1DN1k|*=M zC|Q8s_695rIo+Khqt|TOF4u1pS@Xce|1MRGTmu-D$QR6rK!}R*W`zq08DC?g z^Icns%`JrRZrvm7F=D2*D7)G2UhwGOj`dpX!8NG|1xgWKGCiFl%cB{*fIMG+(EHi1+*fk zcLJmP{I!fb6K(cA_b~q$XU}7{!dx5HcsSv?%%%&5Jc}FUjCbkq$6(<@oYVIV#->@u z9ApxI$#s)z$9Ui@Tv1=bHWJFAjEMA4OdyIDE8Yu6F3B7})7PyGj z`1KCBd#DyjC)UP`BoR0U$&?b$0>V0SR?QV6<43r)^RHvxJD<(NQ@zq^BY)QxFWs^$ zTFr4MIlMNG>=9y%raW`1Y0Qjyc-L&O0M&yp)T_&KIhMyWo{o{Fs3N1`6ux?a~c~$UGCcrnA|-k(k?kJ+nYf)wuF|UjQdggF9c6-un?BI_qfc zszgycd3=GGCI3I3zA~<<|NZ+cXn`?l5C#sEkd%}dN{mqHk`9$t>5_qAKKKjc{>Ia(BQ{1c$YFV0)92!>KTLINBQ(Y%DdCzdWX#Oxg2sdsLdB zv3TppdGs|Ssm9|zMma&yTCACeg&@*9+KbB_g-R9%h9GuAtce)bcdeBqd2kdQsjID_ zlGgx-;-uNS5)Gh*9>&XhoDFpnnf?G@B1Tt|K*_zMLxG#)iHPPJA-^N-e3Jz8F-JER z{_FGA66|;icK0FyT!qk&olo_@&kR^<2QY9N#5PC4mB-TIbH4WJyThlFL6En(lbJp? zX5u+MHTWkL3K77wV3U888r?9bMlA^bZvOaAYZ0KkEHaeanPnb0cg1q$^VK*^_I0*0 zjH>ExfkE0U4KzU%Xu(E132~C!qP<1peMsa6?@ZxtSZ8vkR0r(D zuB$FM+GN*wJ+Ug<8PzR~P|10>5`0r4)h6$bM!|b+>jeOeBxdX99Tw1Ip5*adW7%dB@fQtZmYT{3$g^>>6#J$rjbhUAE2Mv@ z5dZ=p(|z%*NZrr6FOD&V3aw5WK}3DB9HPt)))Wauor*~6QWVwb02OoA=$Pb`>mIAY zc?lajk~2zZzq^YTg$b^W+f9ZN?MR71WO#dcgo3aR=&smJ5O5=jJuHM{p5V1r?J%&H zk^Felwy@N;t?nP!67^nNO%r#n&9d~9tOB%{+mbXXG97^sa!eb$ws`D6Wq!df7)bUaNiIm48Z7`1$wUxloy`K=Ve}XNxo^rXTK{Piz%VEG55X2kQ9qC zMVP!3R|ktdK({bK`+-RrFA<@BRWqk6&|48e7M8o#FC^XLso;xEi1DK(7F#t|vpYKY zZMJD>!U=c+Dq(5`RX{H-h}+dS=6~cwq@_Z=kS5$+0c(P^-L1g>P*sPaP{D76*WS$k zQbhqe<~g1_fAqxO6^TuobT{2?yPL1CPr|-)F$VP8{dQ5}IIkwZWeOI~uGwLz&s-n` zkbceLHh;nqXgg427mPax%_~~$60(-S@9aWmOw{Dp&JYhI zzA$`7JVz>+O}G@=b$B4ad+?Oci?X_Ob#k?xfn;955t_ zm6E9onq+qhiufG-HxEmO6&S_=7_`ghT?hq^q{D4QA4>WM94FdTx84sUSEhFD$fqT8 z3DmQzc#g6IA*+IMyqqkoS&KFi>-=hRFy_wv+ztL%3>+=LmslF^N{q2BC~Ke;crx!| zVBC~F+!mu?!9&;ywTcqCn{w?^U^ilO-;CfV^sqzhu`3NmVgInd1_-G} zQNRIf#W?aPC@s6X01jRO2T0y0ig>3`7F|n;B0(J8i6(hM1mI8%{sDk_(r@<~dwu2d z?b4S<_elsZ$Pi|(i5+k$tLNTn{HA|zIW(7E4sj~`Lv`@L$gFPxrd+7w@g`!Yu(G&s z@Tpw#n|IfJ2ARQXB2E&Kh9>ZuYZrao<`DbK*HcHr?PCt%;PV_nQZHkzKQP^gAea^6 zNT?t7pBI!$(`2KbT+(jofV@~_PLYcvxpXC+0;6>2%a>&I6l(pBpU>j0*@>NOYqmg? zLwU^MR+xZ4r7pF*Rd)qe8qpcCcBJ#R9#9U2e-#h*zp<>Y zk5u;NFBzaJ&KHw8?|vsZ%ZRs%Ivd~f=1JWiy0lyr=vuXz55PxWL@gDO*?h0}r!8TP zZemYk!w_f=v=O-S(Dp9tGdO$ef%V_DPS=jO#Y+xQhveq~3={U~^$z5kJte7?wBad~ z^`zhH2pX{FE*-(4q{Np#L^Qf=uIiz0yc!xYN>vR0fXI+;E=aax#M~n1z@2Vdmcb32PcOEWZ%443CF0?qOg^6 z4*-Z&>)~4bjnH|P`=?M-tQamzmpD+@@GpXg@UZ`~(_C1hjS>CLG@&C@e)mj<%F_5RSm_a}O=Lr3feQ z(xgE=7GKVk`OeX~J$@U21e1X3*uCTW`y!%M$XzraKY9d(KlwYUDk$rc-{bG3jMtECUoiMfLFJ z2?lNaUbZpNqfxeMU5kN|Cc9$E4m#F2`2cYHx+7$m28wvyVioSFG$YC0cIY#hokln_ zv5+bdN>ER1a*1oun7Zid!5&yZj~33>HMs+Z!`)${aD84$R{7MgL}*uKq4HuDH1@j9 zl{*K+XTyIaiOB_jbph@`v0ly>c>sJ107RZZ>6h|M7Nz@wW39WC-$ln7kUTGc2cX!6 zv(7c9axcCDIVyva3JB*OOb?~D%NPpOWhVz(lZ{+@oCEe?+yyTAH(5qwm4}(UF0o9# z`=@r*Q&tjRzd_=z2L1YNJN41M&~ADX(t>gT4#7ud^P5MQQlcQv`jMs`_qY>P-e|UP zuO68=_+JE4U10lt!)RDtB1V-TIU1t-3U`o}=~!GIJ%{-cKIa*B^lo^S{}DFp#qVcw zl4|^X;GK#BjD3I>hWPcbL17V;6mTOAlBb2n+N(ppf3yT@uuz?aj~Y{XFGvy3`~SlX z>|<>`?*-Z`5j6`Q>!sSQ1cMo5*rrgYmWol{X6h|J6uixe5p}uuVD}ZJbjVo(+ z>V@GO3dq6oUppu4r`Z`iR4wLXorQIkw$Ez;UxMWDWWmku-g?|4#z`e$SMI5hF zVW!ZJ=|Wm;+s1zf)NdyBiWy%(rdR7R@c8|>m?Ij~t z`t=>YHCF*Q6b2`Xt)|0=Ol$F=EKnuYKo$SVPUhNAK(^Ai7J3W)1yhEbiX9y^*xll1NxY}a+E z{o(FW1#r2?IJ7SLkl|~fSa<&iBj#SSv?DBhjWbrjE${F#4TUoBY;VM#$hNrX{DgZ#@F#v{9o9SF4sQx#2twh&A9 zuT;ASuPc`-R@epuS>x@L_<(lC1XCEEBsPsoKuM(1yLtP&`b(dI>hQkv>~tu*d_@^} zDzW$O=kEKrYbN)pP?f>P_d%r0ps_qj$sMfhVR59rR~+C^K5uCHS{EU7TT^&Yu*U!@ zP8ERsDKq^CklDv`q2rv&8f!@q_U`#vv_S`Mrio1UiS9QkQHEh7?WDWlf2y4%PgMYE zNMR?8p>EqkVmCgyzfgX!^3r2MA|HFN;2lBa*}hE?e?JV%PY`)TR)`W){6>MYIq}JW zq7VSo{Z)6{R-tv7j|>imQSv0w*_?rr&pm0Qma1OGb$kNXqJd+|W?E$^29zdQG<#D? z2>Dsjb&DN6NH#nz+Bqa)BM*2s?1Ex`%3zs2^xpmQ3fC{5KcwLm`RwKhty}gY{Sq6B zr$omnKtylaTOJ1>48!cHmt=XFu*MKO1yfcW0voMCSs1#Aw*_Y!e`J)_wpIcDj@C8R zkZ>rN5ggBc9j#97Y}wTSP_Bt5C(O|h>~}Qxpo>rmJMJcl#NheQx1B|ltAcMGb&3e} zdWn(1O?_o|Si5n&3-sl;qx|e^6e8RsoD*SiZYhg@Mih3wU}5lB>sGDApDEAGtI(pF zyN5$4bvn8GMGS4*K=hS64sWGtFo)BNic+$jI=jYujb)_u<<9C4=EFxc^B+eqt?Ki3 zr!A>5U=n^LmOV~+ZFBh#`hi@8%#HfDMbMi7Evx%1F>5$5IiX6uxrung4$|HkJdE94 z7}SY?y+s2}x@(3O(oW}f7>D3{o<+t4F)@VGv&?Nby3=FhuAAjC0Tu=`bpDuk$h zO|RjJ%lU^76MD9u0Ek`RwYMpvtK}CI2xj+WNE&H;&;b+g{UWuNR${so@VH2?a`w44 z=h2BNAjkjZ6u@dg3nzS%@8IJk6Wg|pze@bA|^>G z4}eN*cV_Z%lB-?8m@RvDLI+|jsFMO}huTA#` zyv|QS6js<}O;#&na)$91c?A0*eFnzPO{s2yelne(3BrHs7EK1_p45ENzE^K6&m<=W zr%(;mxck!c$lmphK5Ngy)`tvW}sH9Nj0_|nQ-DolVp;bEJZ@vB7b z=xiZ%(X9GuUxq*hDeHj2Zvh}}G6%PgIQ=&uy^o_AxB0Hy86mylj zI@I=B(~Ih>BA%ZC2A2Ly_EEmCQPTm3vzK?WoyA53xJH+gZBrvhmn}O*B>AOl#W}{l zNQg3NsvxnK*#;P3Ljn#?2F5fP$GaYC^2_tRk=E%w8AgMPg}zt*@fN~5qPN*!h1@;X zfZz>4Yya<#2UHq2BL8Sx55^ElGijMmes~AHBLRX{;V6K#bE5t`K!#=tzJwt|LGIz; za1l|(Us@=2-ZwE+TXuj+ypi=@YKZne>RX52Do0!1mu#*;;w8EC^% zUw7Azp_uAn_U;$<$C$r_-*CDpYyd?yAMU^pr9cp238%p+^SJ0(U-1N#`h~m)MH$FD z)|fICKSV@EC}cf|zUh6(lf=h)rRi3FD@Zo*9jk%J35eZT?TVN&iw?nhC+d(C?WCvM zpRTfC!}6X_&@gvxw8WiHYzS0SN-rfhq5g!^LyhIO+x6Cchs}SP5!vxF*}sO4^nvh| zV9-Y;*+*KbuF~2@Y`rZJ#^yRqP{bs*^05UI#DH_`4xE{8^gOFeg7eZ{S2c^p{Cx zf9H6W%}(XAkK$`Z-W(7`k6MD@ut!TQgN^h!_SadJIsBE8VTWW>3W`6>h0XQiWPtB8o*{HWH*j4&4brmNRSwVqWL{gT<*L< zbP?fN=$@3Y9`1Z1C-q%k%O&1pLxOFyvH+|*Y@uBw4=1XE$DJFRh^0E#p249)iQR9> z5KX^hS!=(9CK%c!6GPOe2x*RNP;#qS7{Lr-o#%T|vhVxb*kL@l?W^4&T^qU3e|Kt5IjQ@u4jA#(8*fcBCLZD+Njwno7*-U1sz^0 z5g#(se{$4H=C?*fEsaEbn}7)cU~hNa`ZVtuM#j`nxy?ansQ>MoXXfZ*wymi2Le3VB z{^gK2r`k}9)oGRNQ#a2Fxnv^7n`!#&is3ql(mE)$vkthJdk|?C!IL_q-?;9{Y+zhe z)_7MHoqMAHi%X}Xi2bMN%gF8NOZx*7@l-uV=r?iEbGevh@5GA%rSnS)>fx;4Ht=31^`Xa7F6#_b1*;}~5eR)Q$}0*q!{>I6}vZh8}LhtHpVA3-kV zN&hstW1|is?~egO^Mo5oh0b=aaH(nNC3?NbPw;OSe8p=VF9TjoL%6fpE zwl+Tj)4=8?Ohe==5B?1(zhu+Y3@8L*%tdXTS@foTWz=NqhF^Vc{+fxrqBqq7#oxEr zbwTyy)c^4DRoxwFzH$3w%RT6I7Y$p$MhRU+f`sCeG4y0MVt?-?VMLBlL%|_<>ue#- z$d{U2pq9NQ3ZO+t=vKb3ujND|NMt8d66;gft)2CF2=q_%fz+5kqy%#U@yF?aKCtW< z0^b{$!g^TJ5>uDL5}}A)*PE9VQ5Ee{aufsK2a_<8&_JeMEDop==K2yt{7jw>!bhY> z^(^bwE_nd=R#z}K&v!`#+9g@QjCrz9Bh=uuoa;INEulKvF~<##8am}Oui$s*EB>vE z?=2NsFc(9sOY;zY67(&BR}pI8zCEUOVuK+}Z#aB%zG%^|`;?fev`XN2L3YoVX~sg< zJFzN*6^rL056qy$_`7A)6Py>jp_a5E zsatOZq$Y!{BuL2o?wF!NJ42;rW{*l|kFG`cgfRqn>0doM+`6hee|7&$bM(tt4HJkilLm+Kvbh<>mWwV= zbLF|;hjblsgg0rzKBkpEOu2e#q1~(Z8z#n2AR1O!U!J77*w(qqt`9|hlTB1F;Eq41{!lA5CA{EvPGWZHRysBDjA%%?4A~C5jg%GhuFxyyF%}NyA_)!q4Q+!;>=P4!Q~cL z2m9~;N6GIFN;4!SV$xzgHk^b@gqRqG8o>YJ7gv=0+9D5+6)o&YN%Wd;fC_Pv!(DtJ zcSb|sn9&N3GB`43yy$$fP!p2nX`bK@9vd@fqS(czn`~XDvp$uY?lf&bXz{@9f+U&< z8PP?3)5|>CZ_VKs99yMt2fi%MMXL$|}}7rr|EwYs4i_QmL9tPj(;7%@fgO7@HI5(^*N9Wknp zYPdLweF!{+ZF8E(r7)IGbmFd(olyD<{fmfnuSO#3!yQU=(Hdn3w!GGsj_zjyBfE!Wa^{7h zHJ=|_Vn4Ibcrxe1l9dn{-Jw>Ql!W_EVvA;uYzlXHTpJic8x>>Me+eA?KBmRxhNPIZ zC?>=2Qbe~>j;`nAY!EF*fNREms7k)e*;(xP@wE@`H_c)f z`g+U=m46<-smXAHz6Oycjm1noO9L>7UHm#BoQ?XthDYEKzzBY%m!lvAWEaWk$e?YD zk?e&qHvx3$sTlM~{|)(SQh8vxn-H(PIX;!@9@JgDZ?doE4V)X;R`sCe)+UMh-z5Xf z8?{{8B4nCls5~3Km_qlB*3;(YX$EF|#hYw}W3hL`(7{N~D?O2Sp?4;9l*O{u7RQ^` znud+_SQ3uzfJ1^(BZ;Nc(zaunPJC6et1|#|Q~R zu!#yu7a$UUqC)k|PJ8Q_wF^qm;0863SjCq_6ggwTj5~w7c!n z+#7eHnso^r#sVbZrch3>iuX-mkkY!i?U`}o(uC`@hL2#eD-n6I3c5h$ckHgYIEnA0 z?&~o}OCaLX_qBkW!;S;!n%1hSZ6rk~Bk^|^Eck;5_`h8og_Q&m+$D=2P|K}D;>G@w z4yn;%M!g6EG&$MB?^$5NGDU)ux+#*ntUY0`q&yP97Zk?ta$$(%L(N_cCM?wd~`H!(B&=807xE1JA(l;+4L!(p`d3hJV#- zn1iY_>f3F8q+wCDQza5B#O4Ne#COx7U8&bHU8k(`)RA}+T9V5j1B~TwbxmIGDK4iG z1POc%_wOlm@cId|jIolb|)&i32rz7sspzcV8$TeO}pa zZn7`GQl9OmiM#8uCIr%yX6U0ZUPAf1R!2%ojT>)y{lK3?35+2+H~l~z*dRR+9D9{w z01g}lMaV|l2AwbkH6IOT1r!{gW*v1gO`R`a2CP4gnwSD~+2xzvw6imkeTlzw&Sgk3 zHlILgT%YZEA?F!Us_c>CeumerMJ5p0*>7D5#z!qV@qrnYsQ$Zkk{7oHeZJY`F12v5 z&G~+#>G)Q0{Iwv7`Yh3-k+S=xP2i(T> zzsB?B{>l9FcLga{zeU`bB^KrVH)9@Pg023EJWZ*`z@Ah9t=sG{QOUsAPxn`4lN6X= z?2rh(AuAXV#J!cB4>)@l!#DRdSUg*kGJL3hKWeF|K)-51n$XE{-n~*gv4E*XltfZC2Jd zr+AOTe8ot6U-}M=cZ`cjyr#pu#%G=#ir>JA2<^xFcaH-S^A!On*Y4MheUsae`Sjaj zGlcohK5kZbAGbbDmekAeu;H%Xukd%1vl+DH@97>s>-W>zxYf_8`A_uP8PoQgJja|x zuxt=6u^&__E-zSzZ2`=?Z=YNJBj_8)xuU2j5kSs41hPWvkn!9jlSmCHBayZ{%^3Cm zQX;nwqr9O%-IDfda1ALn&Mv$4?-yd4JVVmAu$p+g2tzT%<=~$!k2g%jIq*D|3IBM6 zxl*`$|3+G#=pGx;;6!KwTcm*-uY(Jn(}RBmoo{7d4*SzVHBP6Xc$fIoC%Dul zUnKs?ISc2I0v7o7!>5tD9Yk>fYcQ`bXG7rXKp`fsfXH-ohcf$qVXoB@mN6C{2Sq?2 zfuc00CP3^8Wp?GxVya7Cd<|WY7Ia&;3&mD;=Py=IgyE-l+0EojE6L+|7exj zrk(<~#dEgRrfBiQZ`I`nEZ41rD4fzI1PMJ9m&|Tyu+GGqkx`?fx{b}m$7saEKnMzu ze9Q!d5Z@lhpg$ui@cB<^k(dumN7+`XFalqp7CH6Plh z65fvn)+5Y>1s!U1R3Tih+S$Okmeo4Guj3Xu+5?HDM$7f9TS<~FuLj)XZ#)xa!|%2J z-NO{^R$P>6-wO^ZRv!Igz%?kNeqCDT!V&r!!D6)tjL5l|bmg3}xZ0lo2tF)I9@s9_ zYM>^XeA-50A733DTmM@FX?!?e>VXEOO6m~&>ry~W@uCc+$26?xf_yRqMKq)_5fdQx z#gl(OV;sY8V9M=F(f)8g!}N0F|FV}TIKicyHJPgTsU$%HZ>Av|pU)X?;etwh&3;!R zr$;o0^s>-@)f|8D;~$I(jx8`Ye0LawAv($#bpsc$$ENt7xJ!?prkxC_x;$O{zv}aQ z!EVJ@P1K7J-EUZV#IW%va&(ElLpZ3)LDp}B5dQyF>Y|!i;ZjB691ATGV6FlRJYn+T2yK9B~B?~&B2DcKZ%r7Up%n#M~;G0MZO7evKNl+xKRB2&66J1x$fhCDK z{2$oDjaUYeRrC-P@44XetFrc1jB?q<$0Esezt;oS|=~Iw}o>+?94lgl|skD{#qf~MKo=KX9Sfs;-j9^7{1V?cwU1PXA zXfN-Y467qU@pRLJxI90ot}#o1B1TJhV~Z$sc|h%OBE}{Sii+h5v{E)=$HsSG&>{R+ z7&KT0bM<*arv2mJ|L8)H;BW%L8Sr&gK{xwA-KErwhFa9Kr>L3BAfs6f;wBe0hRv4t zT@Q5>Z%X-2tD_iyNe9c|;=O$A*L~XOTQ7?18WwI8gHiq)TU}k_x=S&e+sQx^r$|az zO0Q&^qlTcvJsW&_T;-O~!dXI}3{&`qQ}Drsy00f2Oxz&XD#3vrFUF34aBldp%}UYE zI#g$RIgoPu+1ac8<{(cm3$v5aNzjV@@hB!}&nSK|S9sW*rCze|8&`f^wA=hp#2Ki*{t#Ci zt)5??&s$JFsuZeDVMhZT{=TMI|8c98%9|3^`TB}e@j~Lj`=-D9ZROTBWD@U?`5&Ap zT)vt~zO67b=D-j;Du*sm!9r*k#}81}TKu0t^FmD~C6?nIhrhwgkmv4ZCOK0Nqp&>u zYQz`}pmrw5nrh91eym!6^G(v649lMHIYlV_rgrmbTQajE&+Dc3|8}~6o?R+`uhGp0 zR`BVYf@8wvTOy-mQAME|&AZ_y*&NcV!&GBlf7CMm#wlo^uj0yf6$&kG)%^7RInfd5 zXvCj>bFPEPnVW>4;t9SgC8;D}8YM^`&*AIWSCK)a3 zSTUx!s=s5!eACZJN0G;KSu^h@u}ATwP0=iHMK8r8SVgylLDCEw+eqP(YlA5ArR?$`ORU(PxZzT%?=z0jTrFoD9bY^kT{BS8j= z%@6ZEUjVREeVgHV!@8v+M18y9izD3C!&) zRd?CQb#Lz9={L(;_MnIS-p-P%@%vl&&L7#;pLzCWCFtCUQ;3XUAd5WB;VlmyAYh!8 z3TxnEPLdWWE_^uSxp8_-rXPP+oP9*863}{7GiEVWOU8MkBaj+!&=yoBK`NtSZU+hV z1?+kk{!KNP8&KFqoVG#9o29hezwWKEVmdS?Cm-*b1LV4_k{>m`FBd?`!8K~79sVKo z&sL-NOE1)nAdunOAb($w2-fxvQ37t=HD#5C57{b9uUv z+D=Hy0(!0i`R#qatmu-=-0ur{*B<>DqggO)MSVbVT|2sa28b85C*-|v&}%xV=zrYJ z9>aNV{V8BBcwS{O+2`e5h{Q(hM!dPO!>4Bp-_%hGq;}~JS^!n%1SRT1GLsI&3L}5O zu;0rx#*4{@*3>yO;J5kXAMy$dG7AqW@gbatz!g(PqXI>t`9)EZE_#>RMc(Iq$zPkS z`JgO2mC&&gd=R2L1;%2C-6s!yh;rydB~(a)c6QmJ_c)--CzSz1_zs(BBFp>Sz zHztdXPA;1_48q0E zv+*;vqxNnkkA4vlGTh>>+(yd1u0-c^)9C>o7Auk%UKezoF!0XZ?S~KT0I5xQnOIa4 z(ES`nb(nMK$KHi9F!6~b*Mj#X@Ast0rTkuXuW->Q`C=Q0{lS{J`j1(B7)+aSFfnxey^$70Lt=#?#Rs45w-?Y&ByDDL}Rv%@t*qBv&*L3nt(#_aDqjlxzz^)@GmTsG*hX|a{)eU*3#oj?ytMPw<6pj6%ieVu_U zPQzZ;-TFrSYgQbpur0Xl&k50W2Xj35+%zQCSaVY7e|V^z z(31scf08^wJjlgFYyPJ#=P%KC^+w}|Par$q88y`vX5esskus561Alq=7?P4PY0_+) zYs=FD2C|R8PGCyt%z=5m)F^eX4}bW{kxYB+>tZtt<==H62)W&^_v_)=)7RzoDs~4` z^m)O6v6`@8y&8Rg=5r+;*I>=z8fw z^PB3i(LsuY;LE~iI)bk!c29#oAn?Te)adD(i4+tH4j;_o;-i?-nJkv4o{rgP@ErcY zU;h)t3|WMrq<(nlJ!rxW0f{!UlmHZqKM;9K59Q6ZkBQZJh0lvfn2Cvaf45B07FR1wWyQizubdvE~2bK@Y$~q~t5_brKhY z_uq8vKsS{Z3Lib9^f6{Itj$i?Ze{)5io~(oOIcJd{pG$>!002r3Hp$VgNBo@YW{nh zhVw0tIk!gC&G zDl6D!D2OW;(b3#lG{b~GmuCDErgTXJByMQu+K{CEl1*~Vug)eq&Ge}iNoD>?h+Y#M6oDcEFmeMT50&rXg3m|DF3mvkIM|=k^JS)x7AmyW zLr?_}ye+MI>O_N>e-cHcIkMA2UnXz7)u~|vuICwKavvDq?Wup2s%v3fLL~=29+y(+ z{-1zw87#l)0W1}_hP@4y#y1miI0d{4M*%~Mn2=Mz)uH*9ashS%t5wrDc3emuhWja( zQdXPmYLl`4rnsaI*H-^aV{tbH%O>KNB84H^Xp49=vrL%`(b_^xdoPEF+j4c}2C3iB zz0b!c>d0R^sCcSw-mwjkpFWZ6)VeDX)TGlFJ@(Fhf2Ei;yy-uvoC0Tzs%Qx<>;sP{br0~a&Ppa5R*KUE;Nr!i_dPgFfmOx=ForGau4f6>BR z;V&i2v6b^7#|#_g`ToZ>1KfxTQPhhx6bFViw@D17sXjDZ^mzK$nXm;b5ug>Lp32%_ zMGx$YR9kFac9^j!QaREIpY*o^Zm~>;2G$0$&icPPoD9rl7z{yI$OU$e#3#v9pyQ+W zhd`zn5>wP#1h$N5Cc~Ow!Hb?qAIi~~w)E_0B9}bB!<4kt%)^WhI~V2V9MDwD1G<>r zXuv4+z;NXA-&aXci5bbm; z`k6O+4ekhk?s)iH@4k1>UDm~WGC_*A>mL_3)EsB)ttQ`*cDjhUy1pr}?BJOC6O=Vw zlX%vo_g+eNcBX3jkZ10#J*^zE)zJo|Z)lVy25;bQO3)C8=-wu`}W z{!wZ5(<~l=*Fycv!KyCEI{M5+6biqp&l++*ky5q0cllP}lBL zqY=VkTOodkW%1u<$sSpv=YHjGmoOf#G-m(Ml+D8DU;57rg?Hs_>nyjI=Z|n6U(GwU zk@(JTbrTuVblI|o=5Lc*3cH(n&o>$m-$=_iIA`1k%(tuWjHEo=@{)g-UlAo2SR&skb~-$^Umi63?$Mfqgx>kMe7GHX zLem#q@}rzX|GF`z&fVrS_oA|!s3dhG(eWsChRL#7{Mb-&PZB;^=nn!S0k$?np*+*|M*W z!4k|>wfZ#?7V8Xk#z#y2QjY|_?%iq){r2Hl$BCl)q{2a4X2eK`WJsB!Kr8hTIH}>E z36l?4uiPMj1s<=Sa+nHeL&q!E6>9P0^kpe;K2&~ZvZa0b4uI)kv5e^6bGdXl|Lbhc z*8#;Qwv-TY?HMpod%)TW*sjUG)YZ9!yVD_Gcvl}14O0)AiKVtR%{oh)_b0GjgO=-1 z5TAMxI_kIMV#kPL-9_bE#r5Fzqu_^JP;GGNoxjMg57+LQo^SF{90#?Fl-R{e&d@Zz z?^tKavzl9stE`KfV$qOGX|PLddihf#T6`Z1`sRAp_EM9SUp7A|bQFx!*X0PRZ;Fgs z5{Msa^3#Co0Yh2mga~C$_xU|xkF=jLg|;tiqp{vuVkb!=+M@AqlMVTN zh@HX)jca4M*QGkEDVO!3J~>an?~m+T`dPp)sk@bChTd%G)I$qTEE)IbbbiIX0-*r_ z6)Uj$IeK5y^00#zKzz>CxNsSo09>BoL&*R#V|Uxxk}?(||7{Lq=AXC8+n+OEXqVS6x4l{A!c8T z-}b%C79R4rWESbbORc*6A@18GuNTDMxxNt%Lxkye{J}7ZAMUEPo^2L$YOdM>Lm?n1 z{s>cNVGJ{}fN@JAPxD5jLDXUsiMg=ljkN8{SH(Bgsc-s?eKHjGpXh1*cdL2lRwOLe zEod=wBz^Ye&!E@$yHeleM+8s5?2T>0l{=<=^kSE0sGOqcl50+Uc`_~TNR7M^m3}BY zWo35E_HOI!u&L7W^nqQkQqYz0-yL5+Y;LS7WJ${qY^r;?J6GONE5~7}P);b8VysVi z9N)d}uo_K<(Y^D3RmB$u-g`$gye-bn2VaD1qEho%O&&n#(6Kyp?*0n`mJ?9rA`0as zjp?bX{^gabtVWmBz^RB(Mod?e0I(fLp8eDIwyeW%<&v3*Gz)Ous%K9I)1GyImDZO{ z0hVhumQmfSzt+zl3q5bD4VsEkl=L;Xoyuf8W32c8)xX}qSHCsW?*3e;A?RP4UZBc8 z@BSy^^ZQc~XvB9RXC%KM8FvPyCSXI1G5LkL@W4x%9Vcc)RZt^w4IuDg*|_0ZwmKOH z`Mq|3D!tgP*S{Nh21dW*vM!`!+ye#Rt{7Ay!*rWZu&flipqLS&W z;M3`v8cqSOyLx1~T7AI))v8Q6Yr14j<~;9nS#^7LZ7Oec>fc<<$90gKfA+pXIVYVM z!GQ@7#FC-F5fLyWYFguUNEj zd-DFGlkgj3SO2rHwt;(DGF1_2auj>#^vi9UD5lb6Ng9yQafDv=qsJb+m{*+qNOu}Q zilF=WEU-J5-<0+0OF`V6O2<)djKb);B{vQ;&I5u>Ql$!q-S=zHVMAp;UwZ0f$LMi# zy8~B)rc2@@@+aNS|G9ZbpX;0s9aydwKJ5SUZRUORib2^&F~{>0%ah0_{ww1Jr)Qhz zXF+%T=hmP&87mcFV&wH9rdd_Er9XJm@TQ-}mI^UPLQatbW;pfZbseFZ9#m*lG zZ_iKqtKaWbXFADl=BK;*Mb{o~S6i-fo-V0b?s#(^9~TctK$I_pzzDCT+pgk5hZ`uzxJdRlSc_f5y+-E$_h z{qY)_Be8x{k8j<}dqmGK+Z$0`d#Sx`%JoV&Vz|X_k zl6x5eTvJI{4vbabqfG;Wz$Hyz2ahHwdGAS4@q0%Xj=I^iuzxe|S#^0$L(GgAf*(p9 z)kKnQW4Y3kZms%ixJkbXHQ*wZ$JpwA$-UyW$l3JFnO2rjim%zmqRp|^?$a>EhjwQ_ z4+|^AJM;fA{-6qKCJRhS`7q<<;Mgm_>%J9eVV&F}GkDgrcQE^5>k#|BC@Z|q2-LGB zeFe4j)xxi6(e${job_aa+zhxQw7>RI&{1(<3}~GVw>~FO36eUZWAZ}CLT|M6P1NNT z&AjG3|G9Ey(??CX_Rm$$!^f+L@*9-^x3>kztE4@=9=KFIEY8wn6|gg<*O}M1r*-?L zd94baxx&9!hRHiWYvSF}aaEiJz^~#lF80y8(i@i{=Q6n~$c*hvHYjN&gQmJ_ddl zb>_dk7kCcqJWouPEYVQ1EXY(pVj35r5{*j!=;aG8v%cE#i@EmnK!BrjZ&eZH-|2(f zvORu&!hW;vac}JCC#L#idb8vh7tOt_^dQ$`&D>e8k*wn%A7@8hG@~~kR4e+?JkGU? zR4+tY>xg~1o-%+pGJ1acVD>O504@9eDg2&6kq0yR79b5E8Vunm%kvKNu`QY|j8I0M z(J3=Rz43G7I!&iStxfLpYB!iSD~ER0*{O~)hI4kF?R=e1@96*sroDbH zph(;N<{9U+MXl7;akq*Y1q~gcl3>b6GvjJcmDWtkNY2mPwpF9S&(Ab1kDHyvR3PLE z>xukVNaI$oI+{SpU+$g%U4C#@U*+jx8A*znWXfdnJgu}CT?-_bGfIF|yWpve4ku6N z?~dpW^=QRWqwaqd3Ys0&`;S*7KFwRoZXc+-I6t@DfB1E8;dze_{!eXRGI#)c-E@Z**;CpHoE}Bh>hGK z(V7{ucNy`=il%?wS4fr3rL_2%F0#Li*dL>tVaiB8q7L!@{wcH9&AZT_)bE?ctBx^A zaZbeboiqixCVS4SdH>KY5E<*+sr=hnR(}s;X4?m@!FM{5fAkSIa*L6s8fcsWg zcl?4EqS(?h=Y3;nrtkj?ju~<0=9y6UPQcqzi21<;$H09_a~4SoNRf?O*%mP#0CMW| z3+Djj^y&8beDTHKd=KF8b_}Ts{MVvf;`!f|i;kFM*En|S@zJ_HFWR0OC)$?V?#CHB zuC%4D*Mr_B_oVcm=Eg|f*RfW5PVP60=2g0F-SV`GJ+V|9-Dl$+R3%&wEWKGz0wHkb zTX%oE1rTdUM+za&N-5oO^Mh@C2QTN}{@FKI&!2v=WpXSb*73MvKf#1-$BmcN)9hoN zZNGf>)GU$@8F=yjA&MK1AW~?+a7Yz^0U9EG0NV)EgW3J+*QX9VCIs)K4}S22?K}x^ zWS%fc<^};Sq>>=In|VSU$99fko%6ZJ4?J-Ez`&lk4su;FuY1o*yxe2%9dl$Z?EmIB zzttX#w;1=9xw0S7WC_4ez2EdhYom70f(Jm-N+qXHf1_~*%7iMVdx!J_iy5q!de5xN zINIiqFJ|tJk#~KYjN9RO6UMp3UXvRux~@xu{cRsXDT!3e^_x3(Fn@P__P#{m6aHSl zkHlEXd9KGy-LLF#Zti(%+_B#>OHmYhSk~4^AU+yhB9ArVw8larTEG6Sd!C65=|~|k z%n||=XvgpR>FTo|{z1D0Fq8+2h;$;*0U7pdAB|%HAog>d&N(RJYyHL>Kh&;&?Bh4L zOb#Z?k^natAKO3msZY1t33ww<7Vf79?b=JyLB_uJ+G|%I{_x+l4NxI&f_(rBbH47n z>)N>jbO0lBX09-A&gFV09$h?WZm7C-j+Vi-U1DsiWAn=%lK?z_|EBcSn_bQm%rFIN^T*-Z#(7OAz9&eN)0P$+9i<^WLV)S`d0_j|Ny&>JIu}Y;7 zr6_^u6eR#o~VjghxsCPz=&ylh4bYPu<(@+_|V5eknS;aLP8?? zobdr~<_rL`pT>5;n)@s8BR>|$uwMF6)7Eb|ak5<^rM1h`=iGU}_@%G>eq(?`swt}` z(2E~2p-l6hkja)}%&co)!FZ!%uM5pho>SB(`_-R0Hrc;*>aoYOuC||R%Z(eHKe!e< zhiIOe-{6?-Cv^{}u9yBkZkeU9Cc2`~jT-A>Ye-)YXjNEV0_i-lWCu|$ECEQH1@p0| zx)Pu{dh($YtKYo%k8So{ts`kj9fiaJSg;?kU2n{YKJ)i3e1=5fB~Zpg5k0b7!u{p z^}#%eX<-{nslIkifEUsZK*HEa8q5vg`^;xP)9&ZK0*HVHQU~{(W7!X}y;K5G&2yS+ znA6%Mbf?ceWIPft3yh+@FL5z+Rs0kKG5>ch+7>mAa~gxu^X)#Z`)yI5e%q8ejveE8 z&ZL%_uWxH6x$kl1rCM^|bzJH1;s2j9x74w@KHS)OTJ`N8$&~J{(@p~6WsqK1BD;*} z*g;5+mQ!QFOsA4Sp;Dze2;fkKK`V*0QrIs~{3q*$W5B~o1II{As62CcY3ksU9KOD}l|+dD zSicLG%J6HOQ(<(B$iBz{W9+r{yO{moY>WEnz{GD~kDVIxnD4_Mr}J&!T3-WZ5A4i% z;k5?y&TdQ0|5)N0a`$pDmOs{wbW=&I!i!*Lf^4H7p%Nk0uL*N03t-E*WkiROC{WW0SbW!s#hw)_2d zejD7I%R(q~;KS#6_9k{UR4i(QCSg?wAWx=LB=|z?f=zS_Ls6O+PB# z4(I_yAY#Me!R1CHv{n*1SHAWWa>-pYg`THS zq#n>$z4^MoP|U$)#J0@N+9s3#TSgKvn+sKW)NV_RQ_?&$?#;*M*VA~G8JAv{bMDEu z;JU(b3OiBXj z4C##l5R*_Wbm^5xmZTB6^IL2)6N;0TKwLQiF(;((6U{XY4jYtj8q+5XBb=JR;z5YNWvn?3P)Ex!PltU0%B;0U~0CK^g1ZI2V|4 zF0jls!OVK+ikaInQ()ugo)}{gzo!4k03o;Cf=tx6KQ983f_qaupVV(S(vpDMtUYZb z&`R`QOpzy+T4#uH?!4BwJ#^`HMW$LwEt=s4GB^#9=eU=H>^gpFpqLt1>RUedE3wyViIv>rI2QARJZmJrFj>a z2t))VytD*qRjRa0Lh8V_VI>YeVid0=Aff%};YVLsr!47Gg&0q(i=A=&BKJOB@bQm- zyi<#;`d{^)!8LBFmwd3@?^_KSesUahY~%V4$BE8Q%zJRmDgeM>yl`&j-00Zux)cA8 zHh*jYraemZ-6Z;)dJj`=^tv;B<>p}fY0S1_@*N61ti|4gNY4%uRVnlabpV7)ZK_yk zK}6nJQfYbHNClEg+a{^21RQ{co;f~dBys3@1Uzur^?9sppql*Zd1qikth=w*?nM`q z@@?d0A7whLfT5Va$Ho~OJ3MDK1c@X=)wTO$qHD7APL02c8FgxX3Yh4;F#szCgYLWl zpa%CSF`sVy!m%1N|KvRh`kF)$fLIWTTzY#!g%&^rA{IbUX(={@FE%fUNCHVoBMLmk z?><-mp;DzBk++HzBvMIP(BN6KnGysfJd@x5!H-TU-b0b*HlLCOj>dVntkz7>G0o`x zi?*lU*XaM;%b#UN8;n0-Qd(c7nPB7AQ{zQ_kIgCC-&-ce8~ic=5tr}Z$A1fB9cIO zc@=QT(u0YYOmMX%B?^o|HL7c?O@*F#Hu&h^S@D1&&=7FY*e~^!96j#)!Glk)QG6$ZS>3mL#pmHT&Kn|5sn>z*gXDCkm95Xk}WpIur8I> zd*1V&-~HCNzx#JS@uCF{sS>PYVw*i~&Suphxnq3u=ccxg9T)u{?VB=Q>R7*jYD@LE zZNQ9v3lBtW(+7*Bjyu13_y6XeX2Od=0`XGFx<$5-fl>A{kik}`D5c*^(fC5Msk4T10VS7mp2ADg0i8Z>Z)0LT{SKy zq1rzx9T^IM#0Q)V(wj8tM2nF+OXWU$AfkHe>vpBub^rd)ufoud9@>M6ZTfojAY&um zqwVKYvkZ@hOX()f_p{%5lJV&Uha4G-n?O*ygZ+zn$uQbnT zPi@r%(uYfpJ;*iGRLP^#5u}t~a0DPNh$IS5h4v6*R8L7G1Bs+rtGE96?Qee>=}-U^ z>?OST01J}J_aFGtV=#lMjq~V(c6R-H+OBQ%ZI1n(Kd#&Mg9pE6xADK*_Lz>db7h_5 zxgNFk7?1hm_&SEsaUY1KQA~}bHk#~8H1dN(VXjQF)YJyGLaDK5(O84%5#BpR( ztW@dH)2JP!34o+ozg#XGX%9q9jEI#+20)@TC?+AJmrlBMF-EQ1Wv7r^Rf3LycR3zXrE#3_Fi4- zuW>!U@S4qhx^q+4VYb`n!RBD|uHz}tXd6;TBzZ_}6;yM(C`yyvB-B?`0;zOVC`>cZ z^aBhdqk89^)#MH91GQG5+Ulf|45$p+nyC!_7gN#y_Bh9QI|(TDC2P;M=d9Zm!M14s z;5a{b+e+_2bX-uY-d}qp{dJ7l-#dFPcIl+X!G3$M{W+QY)XrZZ8T}rK>$T62f3CXc z&H%>1+o~Bp%RRM~uU*l&R3&Swl1HT@Nl_TQw}qsl)KlqBy6nB~Ywxn4`Io+Hm#?YW zfT5P0=Z}GLx$MHdo1lids{%L32-^%LjtU@^jvOWPrkIzdlSHDz^D?gU0xDj_yr5nhiHz+7 zFtJ~kUXSgL@eC#U-+!eJ_W7^bfC&$x?9DmR*aIf##_;OA@H(~4RDiU=nqr{27S1`i zmce}OvC-FmaJ;`~VV@2_{O>w;J-rVS_dNM$E@dbmNFGhotHj5nhGG5jyQ#? ztj5KMtVQ{YT^p#hjA7EMwnBq@6G$g^dycs_hT-KHsogh$;g%kMnPv6`eObWlU87g? zrS4C3t{Xoq<=OjXm#OP0xo1<3nfM#@o(I2fB@G3*nw)LkPB#D$CshxC!&j`6)Zr53 zRjPC}Dfpu5rJ!DK8>q9Iy)U&c&2^KojTA^Fml}O_#4xih!)S|+OEIWT`-=L@_3QVQ z&SA>^NzG#yW2Nq?T~4_lG@cE+UFy*YK!U))F`I{dp0n{DiEOWxDjjV~BwFlABJVbZ z;=PBK(IX#osUW&EDE`GZUy7qGVi--I$=Ls+7cS?Oc3c{$AO0fK%xf^wtBrNYjrS@$n;rRthL%$8Dn@%a}RNG3rZQdi%k- z(K)$!xV|n)%<&SdrqQ|`CmJ)FXX)Jhak{qs-uqPlsq^ji@*yIFxIRh}QinH^cLkxE zevFeoh&r`ZllHi(RH;%#Ry0q6hDgc6^ISE3^;M-xl>$m-7WJyFUJCg2x`M8H?!K(M zFTkjE3_(&#PFhK+#J1UdNz5up4 zI?ui2xQYG;&ysV=^&d4+O7;#gQZ|pKdRtYhG>O6(kw8CeQ=WKt-;1ofulW+}sknUV z?8bdXI;NRBHu^FhWkM0db^qspFWF2VJ)lfoZ{qktL9YOCBGq7Y{o&VoruF7(>};hvnd5~#v@jJ811@v4oDz`><+$sX&j&ojyFak*OV_DKUE@e+x9Ne6(^^j&|)T90XX zrXMj>pEWpQWF?Gu3bXbGTDR|!^1>M19AT3x;jzHCaC=y>gC=@{3=u8(Nki#*UciK~|iW~7acnfv-q zGU3D+WBUfj(Vt`Jz2jYGTl-u1dy>4rzJHV8(7WGWsC|Jt)h9xXfFrVbRH{^I%j7*% za>*Eb_7US-AE~%{O?BBVGxrjV{x?j<1Jc-bZ=<=$#kE}2xG&m(VGiaM9aA!Prft-J z;{Y@`??S&m(sybe*7GjekJ}dgCMnyQjS%mCljxagg6A$u!M@(sco*HKf=8uF2S-sF z6d%!UUu6H1H+?B(5Tw{R2Hp%AMz}9%7bVuaKD?1NVRZHV^uB^K$46h#gKM=e(ZTgw zRbcWuM(#uJyhL9Y*?DEIt+c;hOZ0b9^cw`%7JYz(>ZxW37=sU=AnvJBrAh}t0|TQ| zWrenpCQgy!rIwI6xG&0q6ysDE-MVE;i6F>cv;72p_U04>p!LRZ(pL}k5)3g?y$qJ_ z+z^2M|AB);m4rKdEvDO%|9ziNjNf=n`0|gs!Rq6c;s z%LpUMW)miq1d~iYu;?06z%~Y;;kDalzLsC&#_Skq01m!Se;pCP4gk#0HLxcPYzz@l zMJ)iA@Sa6>ikvrKWS^_qb1PLkf2ji!mkN8pBnucs?&~ud| zhm`%Q^v#1xt`F_cq@*wYVoj+;wC?6J05N+^WTdtGQrDKcZ^1F)eHpu_Blj(0%+dVD z<~6tvff{SXE&kdw_p1U&rAn2ulw}f;n#cX0 z0+;aEX2|UPaUpY0#1tIJ*Ky`6d~Ez^e@XiC5{8}wkLp5OsnQJe{{smd7-b|Wm`(ry N002ovPDHLkV1k=n Date: Thu, 30 Mar 2023 11:22:07 -0700 Subject: [PATCH 1296/1680] Add product images block to product editor (#37455) * Add images block to the product editor * Allow html in section block descriptions * Add changelog entry * Add client changelog entry * Remove SVG related changes * Fix up lock file after rebase * Remove unused import * Fix up php lint errors * Move sanitize function to utils folder --- .../js/product-editor/changelog/add-37272 | 4 + packages/js/product-editor/package.json | 2 + .../src/components/editor/init-blocks.ts | 2 + .../src/components/images/block.json | 32 +++ .../src/components/images/edit.tsx | 184 ++++++++++++++++++ .../src/components/images/editor.scss | 21 ++ .../src/components/images/index.ts | 22 +++ .../src/components/section/edit.tsx | 12 +- packages/js/product-editor/src/style.scss | 1 + .../product-editor/src/utils/sanitize-html.ts | 13 ++ plugins/woocommerce/changelog/add-37272 | 4 + .../includes/class-wc-post-types.php | 20 ++ pnpm-lock.yaml | 99 +++++----- 13 files changed, 363 insertions(+), 53 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37272 create mode 100644 packages/js/product-editor/src/components/images/block.json create mode 100644 packages/js/product-editor/src/components/images/edit.tsx create mode 100644 packages/js/product-editor/src/components/images/editor.scss create mode 100644 packages/js/product-editor/src/components/images/index.ts create mode 100644 packages/js/product-editor/src/utils/sanitize-html.ts create mode 100644 plugins/woocommerce/changelog/add-37272 diff --git a/packages/js/product-editor/changelog/add-37272 b/packages/js/product-editor/changelog/add-37272 new file mode 100644 index 00000000000..5f3441d57be --- /dev/null +++ b/packages/js/product-editor/changelog/add-37272 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add images block to product editor diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index 37bdbadf283..c0e0cc448ba 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -58,6 +58,7 @@ "@wordpress/plugins": "wp-6.0", "@wordpress/url": "wp-6.0", "classnames": "^2.3.1", + "dompurify": "^2.3.6", "lodash": "^4.17.21", "prop-types": "^15.8.1", "react-router-dom": "^6.3.0" @@ -69,6 +70,7 @@ "@testing-library/react": "^12.1.3", "@testing-library/react-hooks": "^8.0.1", "@testing-library/user-event": "^13.5.0", + "@types/dompurify": "^2.3.3", "@types/jest": "^27.4.1", "@types/react": "^17.0.2", "@types/testing-library__jest-dom": "^5.14.3", diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index 8b0977991bf..7a49334fb22 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -12,6 +12,7 @@ import { /** * Internal dependencies */ +import { init as initImages } from '../images'; import { init as initName } from '../details-name-block'; import { init as initSummary } from '../details-summary-block'; import { init as initSection } from '../section'; @@ -28,6 +29,7 @@ export const initBlocks = () => { // @ts-ignore An argument is allowed to specify which blocks to register. registerCoreBlocks( blocks ); + initImages(); initName(); initSummary(); initSection(); diff --git a/packages/js/product-editor/src/components/images/block.json b/packages/js/product-editor/src/components/images/block.json new file mode 100644 index 00000000000..28e4a958e13 --- /dev/null +++ b/packages/js/product-editor/src/components/images/block.json @@ -0,0 +1,32 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-images", + "title": "Product images", + "category": "widgets", + "description": "The product images.", + "keywords": [ "products", "image", "images", "gallery" ], + "textdomain": "default", + "attributes": { + "mediaId": { + "type": "number", + "__experimentalRole": "content" + }, + "images": { + "__experimentalRole": "content", + "type": "array", + "items": { + "type": "number" + }, + "default": [] + } + }, + "supports": { + "align": false, + "html": false, + "multiple": false, + "reusable": false, + "inserter": false, + "lock": false + } +} diff --git a/packages/js/product-editor/src/components/images/edit.tsx b/packages/js/product-editor/src/components/images/edit.tsx new file mode 100644 index 00000000000..3c668e74813 --- /dev/null +++ b/packages/js/product-editor/src/components/images/edit.tsx @@ -0,0 +1,184 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { CardBody, DropZone } from '@wordpress/components'; +import classnames from 'classnames'; +import { createElement, useState } from '@wordpress/element'; +import { Icon, trash } from '@wordpress/icons'; +import { MediaItem } from '@wordpress/media-utils'; +import { + MediaUploader, + ImageGallery, + ImageGalleryItem, +} from '@woocommerce/components'; +import { recordEvent } from '@woocommerce/tracks'; +import { useBlockProps } from '@wordpress/block-editor'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore No types for this exist yet. +// eslint-disable-next-line @woocommerce/dependency-group +import { useEntityProp } from '@wordpress/core-data'; + +type Image = MediaItem & { + src: string; +}; + +export function Edit() { + const [ images, setImages ] = useEntityProp< MediaItem[] >( + 'postType', + 'product', + 'images' + ); + const [ isRemovingZoneVisible, setIsRemovingZoneVisible ] = + useState< boolean >( false ); + const [ isRemoving, setIsRemoving ] = useState< boolean >( false ); + const [ draggedImageId, setDraggedImageId ] = useState< number | null >( + null + ); + + const blockProps = useBlockProps( { + className: classnames( { + 'has-images': images.length > 0, + } ), + } ); + + const toggleRemoveZone = () => { + setIsRemovingZoneVisible( ! isRemovingZoneVisible ); + }; + + const orderImages = ( newOrder: JSX.Element[] ) => { + const orderedImages = newOrder.map( ( image ) => { + return images.find( + ( file ) => file.id === parseInt( image?.props?.id, 10 ) + ); + } ); + recordEvent( 'product_images_change_image_order_via_image_gallery' ); + setImages( orderedImages as MediaItem[] ); + }; + + const onFileUpload = ( files: MediaItem[] ) => { + if ( files[ 0 ].id ) { + recordEvent( 'product_images_add_via_file_upload_area' ); + setImages( [ ...images, ...files ] ); + } + }; + + return ( +
      +
      + { isRemovingZoneVisible ? ( + +
      + + + { __( 'Drop here to remove', 'woocommerce' ) } + + setIsRemoving( true ) } + onDrop={ () => setIsRemoving( true ) } + label={ __( + 'Drop here to remove', + 'woocommerce' + ) } + /> +
      +
      + ) : ( + + null } + onFileUploadChange={ onFileUpload } + onSelect={ ( files ) => { + const newImages = files.filter( + ( img: Image ) => + ! images.find( + ( image ) => image.id === img.id + ) + ); + if ( newImages.length > 0 ) { + recordEvent( + 'product_images_add_via_media_library' + ); + setImages( [ ...images, ...newImages ] ); + } + } } + onUpload={ ( files ) => { + if ( files[ 0 ].id ) { + recordEvent( + 'product_images_add_via_drag_and_drop_upload' + ); + setImages( [ ...images, ...files ] ); + } + } } + label={ '' } + /> + + ) } +
      + { + const { id: imageId, dataset } = + event.target as HTMLElement; + if ( imageId ) { + setDraggedImageId( parseInt( imageId, 10 ) ); + } else { + const index = dataset?.index; + if ( index ) { + setDraggedImageId( + images[ parseInt( index, 10 ) ]?.id + ); + } + } + toggleRemoveZone(); + } } + onDragEnd={ () => { + if ( isRemoving && draggedImageId ) { + recordEvent( + 'product_images_remove_image_button_click' + ); + setImages( + images.filter( + ( img ) => img.id !== draggedImageId + ) + ); + setIsRemoving( false ); + setDraggedImageId( null ); + } + toggleRemoveZone(); + } } + onOrderChange={ orderImages } + onReplace={ ( { replaceIndex, media } ) => { + if ( + images.find( ( img ) => media.id === img.id ) === + undefined + ) { + images[ replaceIndex ] = media as MediaItem; + recordEvent( + 'product_images_replace_image_button_click' + ); + setImages( images ); + } + } } + onSelectAsCover={ () => + recordEvent( + 'product_images_select_image_as_cover_button_click' + ) + } + > + { images.map( ( image ) => ( + + ) ) } + +
      + ); +} diff --git a/packages/js/product-editor/src/components/images/editor.scss b/packages/js/product-editor/src/components/images/editor.scss new file mode 100644 index 00000000000..29228aec4d6 --- /dev/null +++ b/packages/js/product-editor/src/components/images/editor.scss @@ -0,0 +1,21 @@ +.wp-block-woocommerce-product-images { + .components-card__body { + padding: 0 0 40px 0; + } + .woocommerce-media-uploader { + text-align: left; + } + .woocommerce-media-uploader__label { + display: none; + } + .woocommerce-sortable { + margin-top: 0; + padding: 0; + } + + &:not(.has-images) { + .woocommerce-sortable { + display: none; + } + } +} diff --git a/packages/js/product-editor/src/components/images/index.ts b/packages/js/product-editor/src/components/images/index.ts new file mode 100644 index 00000000000..59d35906a12 --- /dev/null +++ b/packages/js/product-editor/src/components/images/index.ts @@ -0,0 +1,22 @@ +/** + * Internal dependencies + */ +import { initBlock } from '../../utils'; +import metadata from './block.json'; +import { Edit } from './edit'; + +const { name } = metadata; + +export { metadata, name }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export const init = () => + initBlock( { + name, + metadata: metadata as never, + settings, + } ); diff --git a/packages/js/product-editor/src/components/section/edit.tsx b/packages/js/product-editor/src/components/section/edit.tsx index 369055d4a0d..9e32b344529 100644 --- a/packages/js/product-editor/src/components/section/edit.tsx +++ b/packages/js/product-editor/src/components/section/edit.tsx @@ -2,14 +2,15 @@ * External dependencies */ import { createElement } from '@wordpress/element'; -import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; import type { BlockEditProps } from '@wordpress/blocks'; +import { InnerBlocks, useBlockProps } from '@wordpress/block-editor'; /** * Internal dependencies */ -import { SectionBlockAttributes } from './types'; import { BlockIcon } from '../block-icon'; +import { SectionBlockAttributes } from './types'; +import { sanitizeHTML } from '../../utils/sanitize-html'; export function Edit( { attributes, @@ -24,9 +25,10 @@ export function Edit( { { title } -

      - { description } -

      +

      ); diff --git a/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index 955c5d3813d..a4d59bce446 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -4,6 +4,7 @@ @import 'components/details-categories-field/style.scss'; @import 'components/details-categories-field/create-category-modal.scss'; @import 'components/header/style.scss'; +@import 'components/images/editor.scss'; @import 'components/block-editor/style.scss'; @import 'components/section/style.scss'; @import 'components/tab/style.scss'; diff --git a/packages/js/product-editor/src/utils/sanitize-html.ts b/packages/js/product-editor/src/utils/sanitize-html.ts new file mode 100644 index 00000000000..fb47b6530a3 --- /dev/null +++ b/packages/js/product-editor/src/utils/sanitize-html.ts @@ -0,0 +1,13 @@ +/** + * External dependencies + */ +import { sanitize } from 'dompurify'; + +const ALLOWED_TAGS = [ 'a', 'b', 'em', 'i', 'strong', 'p', 'br' ]; +const ALLOWED_ATTR = [ 'target', 'href', 'rel', 'name', 'download' ]; + +export function sanitizeHTML( html: string ) { + return { + __html: sanitize( html, { ALLOWED_TAGS, ALLOWED_ATTR } ), + }; +} diff --git a/plugins/woocommerce/changelog/add-37272 b/plugins/woocommerce/changelog/add-37272 new file mode 100644 index 00000000000..b87251a28a6 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37272 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add images block to product editor template diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 3d630729817..2cf291c43a4 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -432,6 +432,26 @@ class WC_Post_Types { ), ), ), + array( + 'woocommerce/product-section', + array( + 'title' => __( 'Images', 'woocommerce' ), + 'description' => sprintf( + /* translators: %1$s: Images guide link opening tag. %2$s: Images guide link closing tag.*/ + __( 'Drag images, upload new ones or select files from your library. For best results, use JPEG files that are 1000 by 1000 pixels or larger. %1$sHow to prepare images?%2$s.', 'woocommerce' ), + '', + '' + ), + ), + array( + array( + 'woocommerce/product-images', + array( + 'images' => array(), + ), + ), + ), + ), ), ), array( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 173c95cb63b..ef8830eed25 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1416,6 +1416,7 @@ importers: '@testing-library/react': ^12.1.3 '@testing-library/react-hooks': ^8.0.1 '@testing-library/user-event': ^13.5.0 + '@types/dompurify': ^2.3.3 '@types/jest': ^27.4.1 '@types/lodash': ^4.14.179 '@types/prop-types': ^15.7.4 @@ -1463,6 +1464,7 @@ importers: classnames: ^2.3.1 concurrently: ^7.0.0 css-loader: ^3.6.0 + dompurify: ^2.3.6 eslint: ^8.32.0 jest: ^27.5.1 jest-cli: ^27.5.1 @@ -1511,6 +1513,7 @@ importers: '@wordpress/plugins': 4.4.3_react@17.0.2 '@wordpress/url': 3.7.1 classnames: 2.3.1 + dompurify: 2.3.6 lodash: 4.17.21 prop-types: 15.8.1 react-router-dom: 6.3.0_sfoxds7t5ydpegc3knd667wn6m @@ -1521,6 +1524,7 @@ importers: '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m '@testing-library/react-hooks': 8.0.1_hiunvzosbwliizyirxfy6hjyim '@testing-library/user-event': 13.5.0_gzufz4q333be4gqfrvipwvqt6a + '@types/dompurify': 2.3.3 '@types/jest': 27.4.1 '@types/react': 17.0.50 '@types/testing-library__jest-dom': 5.14.3 @@ -8465,6 +8469,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.11 + dev: true /@babel/runtime/7.21.0: resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==} @@ -8777,7 +8782,7 @@ packages: optional: true dependencies: '@babel/core': 7.17.8 - '@babel/runtime': 7.19.0 + '@babel/runtime': 7.21.0 '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 '@emotion/cache': 11.10.5 '@emotion/serialize': 1.1.1 @@ -8801,7 +8806,7 @@ packages: optional: true dependencies: '@babel/core': 7.17.8 - '@babel/runtime': 7.19.0 + '@babel/runtime': 7.21.0 '@emotion/babel-plugin': 11.10.5_@babel+core@7.17.8 '@emotion/cache': 11.10.5 '@emotion/serialize': 1.1.1 @@ -16616,21 +16621,21 @@ packages: '@emotion/styled': 11.8.1_6t3indjc5ssefvr44gr3wo2uqu '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.28.0 + '@wordpress/a11y': 3.6.1 '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.28.0 - '@wordpress/deprecated': 3.28.0 - '@wordpress/dom': 3.28.0 + '@wordpress/date': 4.6.1 + '@wordpress/deprecated': 3.6.1 + '@wordpress/dom': 3.6.1 '@wordpress/element': 4.4.1 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.28.0 + '@wordpress/hooks': 3.6.1 '@wordpress/i18n': 4.6.1 '@wordpress/icons': 8.2.3 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.28.0 - '@wordpress/primitives': 3.26.0 - '@wordpress/rich-text': 5.17.0_react@17.0.2 - '@wordpress/warning': 2.28.0 + '@wordpress/keycodes': 3.6.1 + '@wordpress/primitives': 3.4.1 + '@wordpress/rich-text': 5.4.2_react@17.0.2 + '@wordpress/warning': 2.6.1 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -17096,11 +17101,11 @@ packages: '@babel/runtime': 7.21.0 '@types/lodash': 4.14.184 '@types/mousetrap': 1.6.9 - '@wordpress/deprecated': 3.28.0 - '@wordpress/dom': 3.28.0 + '@wordpress/deprecated': 3.6.1 + '@wordpress/dom': 3.6.1 '@wordpress/element': 4.4.1 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.28.0 + '@wordpress/keycodes': 3.6.1 '@wordpress/priority-queue': 2.28.0 clipboard: 2.0.10 lodash: 4.17.21 @@ -17136,10 +17141,10 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/api-fetch': 6.25.0 + '@wordpress/api-fetch': 6.3.1 '@wordpress/blocks': 11.18.0_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.28.0 + '@wordpress/deprecated': 3.6.1 '@wordpress/element': 4.4.1 '@wordpress/html-entities': 3.6.1 '@wordpress/i18n': 4.6.1 @@ -17279,7 +17284,7 @@ packages: dependencies: '@babel/runtime': 7.21.0 '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/deprecated': 3.28.0 + '@wordpress/deprecated': 3.6.1 '@wordpress/element': 4.4.1 '@wordpress/is-shallow-equal': 4.28.0 '@wordpress/priority-queue': 2.28.0 @@ -17394,7 +17399,6 @@ packages: dependencies: '@babel/runtime': 7.21.0 '@wordpress/hooks': 3.6.1 - dev: false /@wordpress/dom-ready/3.28.0: resolution: {integrity: sha512-PFFAnuPUouV0uSDZN6G/B8yksybtxzS/6H53OZJEA3h3EsNCicKRMGSowkumvLwXA23HV0K2Kht6JuS+bDECzA==} @@ -17428,7 +17432,6 @@ packages: dependencies: '@babel/runtime': 7.21.0 lodash: 4.17.21 - dev: false /@wordpress/e2e-test-utils/3.0.0_ddjhsfu4aotkh3cuzmpsln6ywq: resolution: {integrity: sha512-XMdR8DeKyDQRF5jKeUlOzP4pTRtoJuOLsNZRLUFUvnrs9y/7/hH17VmPbWp3TJGvV/eGKzO4+D+wJTsP9nJmIw==} @@ -17495,28 +17498,28 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/a11y': 3.28.0 - '@wordpress/api-fetch': 6.25.0 + '@wordpress/a11y': 3.6.1 + '@wordpress/api-fetch': 6.3.1 '@wordpress/block-editor': 8.6.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/blocks': 11.18.0_react@17.0.2 '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/core-data': 4.4.5_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/date': 4.28.0 - '@wordpress/deprecated': 3.28.0 + '@wordpress/date': 4.6.1 + '@wordpress/deprecated': 3.6.1 '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.28.0 + '@wordpress/hooks': 3.6.1 '@wordpress/html-entities': 3.6.1 '@wordpress/i18n': 4.6.1 '@wordpress/icons': 8.2.3 '@wordpress/keyboard-shortcuts': 3.4.1_react@17.0.2 - '@wordpress/keycodes': 3.28.0 + '@wordpress/keycodes': 3.6.1 '@wordpress/media-utils': 3.4.1 - '@wordpress/notices': 3.28.0_react@17.0.2 + '@wordpress/notices': 3.6.1_react@17.0.2 '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/reusable-blocks': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm - '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/rich-text': 5.4.2_react@17.0.2 '@wordpress/server-side-render': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm '@wordpress/url': 3.7.1 '@wordpress/wordcount': 3.28.0 @@ -17817,7 +17820,6 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - dev: false /@wordpress/html-entities/3.28.0: resolution: {integrity: sha512-UAaU6au8UTrSkowkV33pE/EvdPov2mA9W51vh6t88KsJPzt4171EzIchGnQuzt04HuZLdLyWy2A+7JCOSbfhBA==} @@ -17876,7 +17878,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.21.0 - '@wordpress/hooks': 3.28.0 + '@wordpress/hooks': 3.6.1 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 @@ -17898,7 +17900,7 @@ packages: dependencies: '@babel/runtime': 7.21.0 '@wordpress/element': 4.4.1 - '@wordpress/primitives': 3.26.0 + '@wordpress/primitives': 3.4.1 dev: false /@wordpress/icons/8.4.0: @@ -17926,17 +17928,17 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/a11y': 3.28.0 + '@wordpress/a11y': 3.6.1 '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.28.0 + '@wordpress/deprecated': 3.6.1 '@wordpress/element': 4.4.1 '@wordpress/i18n': 4.6.1 '@wordpress/icons': 8.2.3 '@wordpress/plugins': 4.4.3_react@17.0.2 '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi - '@wordpress/viewport': 4.17.0_react@17.0.2 + '@wordpress/viewport': 4.4.1_react@17.0.2 classnames: 2.3.1 lodash: 4.17.21 react: 17.0.2 @@ -18120,7 +18122,7 @@ packages: '@babel/runtime': 7.21.0 '@wordpress/data': 6.6.1_react@17.0.2 '@wordpress/element': 4.4.1 - '@wordpress/keycodes': 3.28.0 + '@wordpress/keycodes': 3.6.1 lodash: 4.17.21 react: 17.0.2 rememo: 3.0.0 @@ -18157,14 +18159,13 @@ packages: '@babel/runtime': 7.21.0 '@wordpress/i18n': 4.6.1 lodash: 4.17.21 - dev: false /@wordpress/media-utils/3.4.1: resolution: {integrity: sha512-WNAaMqqw6Eqy61KTWBy1NlgXSZH82Cm2SPVbz0v6yhJ4ktJmSRFm7Fd4mTMFS/L7NKTxwo+DFqEHlTGKj3lyzQ==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/api-fetch': 6.25.0 + '@wordpress/api-fetch': 6.3.1 '@wordpress/blob': 3.28.0 '@wordpress/element': 4.4.1 '@wordpress/i18n': 4.6.1 @@ -18221,7 +18222,7 @@ packages: '@babel/runtime': 7.21.0 '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.28.0 + '@wordpress/hooks': 3.6.1 '@wordpress/icons': 8.2.3 lodash: 4.17.21 memize: 1.1.0 @@ -19635,8 +19636,8 @@ packages: peerDependencies: postcss: ^8.1.0 dependencies: - browserslist: 4.20.2 - caniuse-lite: 1.0.30001352 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001418 fraction.js: 4.2.0 normalize-range: 0.1.2 picocolors: 1.0.0 @@ -21141,6 +21142,7 @@ packages: escalade: 3.1.1 node-releases: 2.0.6 picocolors: 1.0.0 + dev: true /browserslist/4.20.4: resolution: {integrity: sha512-ok1d+1WpnU24XYN7oC3QWgTyMhY/avPJ/r9T00xxvUOIparA/gc+UPUMaod3i+G6s+nI2nUb9xZ5k794uIwShw==} @@ -24519,9 +24521,9 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -24550,9 +24552,9 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.0.4 + minimatch: 3.1.2 object.values: 1.1.5 - resolve: 1.20.0 + resolve: 1.22.1 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -33112,6 +33114,7 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 + dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -36586,7 +36589,7 @@ packages: is-touch-device: 1.0.1 lodash: 4.17.21 moment: 2.29.4 - object.assign: 4.1.4 + object.assign: 4.1.2 object.values: 1.1.5 prop-types: 15.8.1 raf: 3.4.1 @@ -36596,7 +36599,7 @@ packages: react-outside-click-handler: 1.3.0_sfoxds7t5ydpegc3knd667wn6m react-portal: 4.2.1_sfoxds7t5ydpegc3knd667wn6m react-with-direction: 1.4.0_sfoxds7t5ydpegc3knd667wn6m - react-with-styles: 4.2.0_tzgwoaxjvs23ve2qhnwxwqxt3e + react-with-styles: 4.2.0_ijumbsfrpvhmwfiiw5c3tpdyzq react-with-styles-interface-css: 6.0.0_eivcclzbvdxqy5cnlnup5iddhy dev: false @@ -37212,7 +37215,7 @@ packages: '@babel/runtime': 7.21.0 array.prototype.flat: 1.2.5 global-cache: 1.2.1 - react-with-styles: 4.2.0_tzgwoaxjvs23ve2qhnwxwqxt3e + react-with-styles: 4.2.0_ijumbsfrpvhmwfiiw5c3tpdyzq dev: false /react-with-styles-interface-css/6.0.0_u5gvwsivijvqc4cln26hqg7igq: @@ -37240,14 +37243,14 @@ packages: react-with-direction: 1.4.0_sfoxds7t5ydpegc3knd667wn6m dev: false - /react-with-styles/4.2.0_tzgwoaxjvs23ve2qhnwxwqxt3e: + /react-with-styles/4.2.0_ijumbsfrpvhmwfiiw5c3tpdyzq: resolution: {integrity: sha512-tZCTY27KriRNhwHIbg1NkSdTTOSfXDg6Z7s+Q37mtz0Ym7Sc7IOr3PzVt4qJhJMW6Nkvfi3g34FuhtiGAJCBQA==} peerDependencies: '@babel/runtime': ^7.0.0 react: '>=0.14' react-with-direction: ^1.3.1 dependencies: - '@babel/runtime': 7.19.0 + '@babel/runtime': 7.21.0 airbnb-prop-types: 2.16.0_react@17.0.2 hoist-non-react-statics: 3.3.2 object.assign: 4.1.4 From 658034f64e2fad22fad3b7bef888be34eed31acb Mon Sep 17 00:00:00 2001 From: Moon Date: Thu, 30 Mar 2023 12:07:58 -0700 Subject: [PATCH 1297/1680] Migrate steps/location to TS (#37257) * Migrate steps location to TS * Add description for ts-expect-error --- .../fills/steps/{location.js => location.tsx} | 76 +++++++++++++------ .../update-37188-migrate-location-step-to-ts | 4 + 2 files changed, 58 insertions(+), 22 deletions(-) rename plugins/woocommerce-admin/client/tasks/fills/steps/{location.js => location.tsx} (57%) create mode 100644 plugins/woocommerce/changelog/update-37188-migrate-location-step-to-ts diff --git a/plugins/woocommerce-admin/client/tasks/fills/steps/location.js b/plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx similarity index 57% rename from plugins/woocommerce-admin/client/tasks/fills/steps/location.js rename to plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx index a4cce788a99..da75cd2c374 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/steps/location.js +++ b/plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx @@ -5,9 +5,9 @@ import { __ } from '@wordpress/i18n'; import { Button } from '@wordpress/components'; import { COUNTRIES_STORE_NAME } from '@woocommerce/data'; import { Fragment } from '@wordpress/element'; -import { Form, Spinner } from '@woocommerce/components'; +import { Form, FormContext, Spinner } from '@woocommerce/components'; import { useSelect } from '@wordpress/data'; - +import { Status, Options } from 'wordpress__notices'; /** * Internal dependencies */ @@ -16,6 +16,42 @@ import { getStoreAddressValidator, } from '../../../dashboard/components/settings/general/store-address'; +type FormValues = { + addressLine1: string; + addressLine2: string; + countryState: string; + city: string; + postCode: string; +}; + +type StoreLocationProps = { + onComplete: ( values: FormValues ) => void; + createNotice: ( + status: Status | undefined, + content: string, + options?: Partial< Options > + ) => void; + isSettingsError: boolean; + isSettingsRequesting: boolean; + buttonText?: string; + updateAndPersistSettingsForGroup: ( + group: string, + data: { + [ key: string ]: unknown; + } & { + general?: { + [ key: string ]: string; + }; + tax?: { + [ key: string ]: string; + }; + } + ) => void; + settings?: { + [ key: string ]: string; + }; +}; + const StoreLocation = ( { onComplete, createNotice, @@ -24,8 +60,8 @@ const StoreLocation = ( { updateAndPersistSettingsForGroup, settings, buttonText = __( 'Continue', 'woocommerce' ), -} ) => { - const { getLocale, hasFinishedResolution } = useSelect( ( select ) => { +}: StoreLocationProps ) => { + const { hasFinishedResolution } = useSelect( ( select ) => { const countryStore = select( COUNTRIES_STORE_NAME ); countryStore.getCountries(); return { @@ -36,7 +72,7 @@ const StoreLocation = ( { countryStore.hasFinishedResolution( 'getCountries' ), }; } ); - const onSubmit = async ( values ) => { + const onSubmit = async ( values: FormValues ) => { await updateAndPersistSettingsForGroup( 'general', { general: { ...settings, @@ -62,26 +98,17 @@ const StoreLocation = ( { }; const getInitialValues = () => { - const { - woocommerce_store_address: storeAddress, - woocommerce_store_address_2: storeAddress2, - woocommerce_store_city: storeCity, - woocommerce_default_country: defaultCountry, - woocommerce_store_postcode: storePostcode, - } = settings; - return { - addressLine1: storeAddress || '', - addressLine2: storeAddress2 || '', - city: storeCity || '', - countryState: defaultCountry || '', - postCode: storePostcode || '', + addressLine1: settings?.woocommerce_store_address || '', + addressLine2: settings?.woocommerce_store_address_2 || '', + city: settings?.woocommerce_store_city || '', + countryState: settings?.woocommerce_default_country || '', + postCode: settings?.woocommerce_store_postcode || '', }; }; - const validate = ( values ) => { - const locale = getLocale( values.countryState ); - const validator = getStoreAddressValidator( locale ); + const validate = ( values: FormValues ) => { + const validator = getStoreAddressValidator(); return validator( values ); }; @@ -95,9 +122,14 @@ const StoreLocation = ( { onSubmit={ onSubmit } validate={ validate } > - { ( { getInputProps, handleSubmit, setValue } ) => ( + { ( { + getInputProps, + handleSubmit, + setValue, + }: FormContext< FormValues > ) => ( diff --git a/plugins/woocommerce/changelog/update-37188-migrate-location-step-to-ts b/plugins/woocommerce/changelog/update-37188-migrate-location-step-to-ts new file mode 100644 index 00000000000..c0223de6799 --- /dev/null +++ b/plugins/woocommerce/changelog/update-37188-migrate-location-step-to-ts @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Migrate steps location task to TS From deb1cde4480622e398dedafea6ba8565c59d67ca Mon Sep 17 00:00:00 2001 From: Nathan Silveira Date: Thu, 30 Mar 2023 16:41:20 -0300 Subject: [PATCH 1298/1680] Add listener to parent to avoid event being overwritten when DOM is replaced (#37431) --- .../woocommerce/changelog/fix-disable-save-btn | 5 +++++ .../client/legacy/js/admin/meta-boxes.js | 18 ++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-disable-save-btn diff --git a/plugins/woocommerce/changelog/fix-disable-save-btn b/plugins/woocommerce/changelog/fix-disable-save-btn new file mode 100644 index 00000000000..37f582bd74e --- /dev/null +++ b/plugins/woocommerce/changelog/fix-disable-save-btn @@ -0,0 +1,5 @@ +Significance: patch +Type: fix +Comment: Attach event to parent node to avoid it being overwritten when DOM changes + + diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js index 5e58c4a902a..bffcde118e8 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js @@ -30,13 +30,16 @@ jQuery( function ( $ ) { * Function to maybe disable the save button. */ jQuery.maybe_disable_save_button = function () { - var $tab = $( '.product_attributes' ); - var $save_button = $( 'button.save_attributes' ); + var $tab; + var $save_button; if ( $( '.woocommerce_variation_new_attribute_data' ).is( ':visible' ) ) { $tab = $( '.woocommerce_variation_new_attribute_data' ); $save_button = $( 'button.create-variations' ); + } else { + var $tab = $( '.product_attributes' ); + var $save_button = $( 'button.save_attributes' ); } var attributes_and_variations_data = $tab.find( @@ -153,15 +156,14 @@ jQuery( function ( $ ) { $( this ).find( '.wc-metabox-content' ).hide(); } ); - $( '.product_attributes, .woocommerce_variation_new_attribute_data' ).on( - 'keyup', - 'input, textarea', - jQuery.maybe_disable_save_button - ); - $( '#product_attributes' ).on( 'change', 'select.attribute_values', jQuery.maybe_disable_save_button ); + $( '#product_attributes, #variable_product_options' ).on( + 'keyup', + 'input, textarea', + jQuery.maybe_disable_save_button + ); } ); From e553759ab6e79547836de91356e6a6d35b9d6b89 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Fri, 31 Mar 2023 18:43:16 +0800 Subject: [PATCH 1299/1680] Fix `FormContext` type error in client/tasks/fills/steps/location.tsx (#37532) * Fix FormContext type error * Add changelog --- .../woocommerce-admin/client/tasks/fills/steps/location.tsx | 4 ++-- plugins/woocommerce/changelog/fix-location-type-error | 5 +++++ 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-location-type-error diff --git a/plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx b/plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx index da75cd2c374..670f5a5016d 100644 --- a/plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx +++ b/plugins/woocommerce-admin/client/tasks/fills/steps/location.tsx @@ -5,7 +5,7 @@ import { __ } from '@wordpress/i18n'; import { Button } from '@wordpress/components'; import { COUNTRIES_STORE_NAME } from '@woocommerce/data'; import { Fragment } from '@wordpress/element'; -import { Form, FormContext, Spinner } from '@woocommerce/components'; +import { Form, FormContextType, Spinner } from '@woocommerce/components'; import { useSelect } from '@wordpress/data'; import { Status, Options } from 'wordpress__notices'; /** @@ -126,7 +126,7 @@ const StoreLocation = ( { getInputProps, handleSubmit, setValue, - }: FormContext< FormValues > ) => ( + }: FormContextType< FormValues > ) => ( Date: Fri, 31 Mar 2023 10:36:40 -0700 Subject: [PATCH 1300/1680] Add block related assets entry points to product editor build (#37318) * Add editorStyle properties to blocks * Rename style.scss files to editor.scss * Get block entry points for block related assets * Copy block assets to core assets build folder * Remove unusable dependency * Add changelog entries * Fix up RTL style builds for block assets * Update copy-webpack-plugin dependency and lock file * Fix up lock file after rebase * Fix order of webpack rtl stylesheet builds to prevent additional stylsheets * Fix up lock file after rebase * Fix tsconfig --- .../changelog/add-37241-blocks-build | 4 + .../config/block-entry-points.js | 145 +++++ packages/js/product-editor/package.json | 1 + .../components/details-name-block/block.json | 3 +- .../src/components/pricing-block/block.json | 3 +- .../src/components/section/block.json | 3 +- .../section/{style.scss => editor.scss} | 0 .../tab/{style.scss => editor.scss} | 0 packages/js/product-editor/src/style.scss | 4 +- packages/js/product-editor/tsconfig-cjs.json | 3 +- packages/js/product-editor/webpack.config.js | 56 +- plugins/woocommerce-admin/webpack.config.js | 12 + .../changelog/add-37241-blocks-build | 4 + pnpm-lock.yaml | 543 ++++++------------ 14 files changed, 392 insertions(+), 389 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37241-blocks-build create mode 100644 packages/js/product-editor/config/block-entry-points.js rename packages/js/product-editor/src/components/section/{style.scss => editor.scss} (100%) rename packages/js/product-editor/src/components/tab/{style.scss => editor.scss} (100%) create mode 100644 plugins/woocommerce/changelog/add-37241-blocks-build diff --git a/packages/js/product-editor/changelog/add-37241-blocks-build b/packages/js/product-editor/changelog/add-37241-blocks-build new file mode 100644 index 00000000000..5faad0551c3 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37241-blocks-build @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add block related assets entry points to build diff --git a/packages/js/product-editor/config/block-entry-points.js b/packages/js/product-editor/config/block-entry-points.js new file mode 100644 index 00000000000..c23f6b3b3d1 --- /dev/null +++ b/packages/js/product-editor/config/block-entry-points.js @@ -0,0 +1,145 @@ +/** + * External dependencies + */ +const fs = require( 'fs' ); +const path = require( 'path' ); +const { sync: glob } = require( 'fast-glob' ); + +const srcDir = path.resolve( process.cwd(), 'src' ); +const blocksBuildDir = '/build/blocks'; + +/** + * Get all the block meta data files in the src directory. + * + * @return {string[]} Block file paths. + */ +const getBlockMetaDataFiles = () => { + return glob( `${ srcDir.replace( /\\/g, '/' ) }/**/block.json`, { + absolute: true, + } ); +}; + +/** + * Get the block meta data from a block.json file. + * + * @param {string} filePath File path to block.json file. + * @return {Object} Block meta data. + */ +const getBlockMetaData = ( filePath ) => { + return JSON.parse( fs.readFileSync( filePath ) ); +}; + +/** + * Get the block file assets with raw file paths. + * + * @param {Object} blockMetaData + * @return {string[]} Asset file paths. + */ +const getBlockFileAssets = ( blockMetaData ) => { + const { editorScript, script, viewScript, style, editorStyle } = + blockMetaData; + + return [ editorScript, script, viewScript, style, editorStyle ] + .flat() + .filter( + ( rawFilepath ) => rawFilepath && rawFilepath.startsWith( 'file:' ) + ); +}; + +/** + * Get the block name from the meta data, removing the `woocommerce/` namespace. + * + * @param {Object} blockMetaData + * @return {string} Block name. + */ +const getBlockName = ( blockMetaData ) => { + return blockMetaData.name.split( '/' ).at( 1 ); +}; + +/** + * Get the entry point name. + * + * @param {string} entryFilePath + * @param {Object} blockMetaData + * @return {string} The entry point name. + */ +const getEntryPointName = ( entryFilePath, blockMetaData ) => { + const filePathParts = entryFilePath.split( '/' ); + filePathParts[ filePathParts.length - 2 ] = getBlockName( blockMetaData ); + return filePathParts + .join( '/' ) + .replace( srcDir, blocksBuildDir ) + .replace( '/components', '' ); +}; + +/** + * Get the entry file path. + * + * @param {string} rawFilepath Raw file path from the block.json file. + * @param {*} dir The directory the block exists in. + * @return {string} Entry file path. + */ +const getEntryFilePath = ( rawFilepath, dir ) => { + const filepath = path.join( dir, rawFilepath.replace( 'file:', '' ) ); + + return filepath + .replace( path.extname( filepath ), '' ) + .replace( /\\/g, '/' ); +}; + +/** + * Gets the absolute file path based on the entry file path, including the extension. + * + * @param {string} entryFilePath Entry file path. + * @return {string} Absolute file path. + */ +const getAbsoluteEntryFilePath = ( entryFilePath ) => { + const [ absoluteEntryFilepath ] = glob( + `${ entryFilePath }.([jt]s?(x)|?(s)css)`, + { + absolute: true, + } + ); + return absoluteEntryFilepath; +}; + +/** + * Find all directories with block.json files and get entry points for block related assets. + */ +const blockEntryPoints = getBlockMetaDataFiles().reduce( + ( accumulator, blockMetadataFile ) => { + const blockMetaData = getBlockMetaData( blockMetadataFile ); + + getBlockFileAssets( blockMetaData ).forEach( ( rawFilePath ) => { + const entryFilePath = getEntryFilePath( + rawFilePath, + path.dirname( blockMetadataFile ) + ); + + const absoluteEntryFilepath = + getAbsoluteEntryFilePath( entryFilePath ); + + if ( ! absoluteEntryFilepath ) { + // eslint-disable-next-line no-console + console.warn( 'Block asset file not found.', entryFilePath ); + return; + } + + const entryPointName = getEntryPointName( + entryFilePath, + blockMetaData + ); + + accumulator[ entryPointName ] = absoluteEntryFilepath; + } ); + return accumulator; + }, + {} +); + +module.exports = { + blocksBuildDir, + blockEntryPoints, + getBlockMetaData, + getEntryPointName, +}; diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index c0e0cc448ba..a5e2de6b022 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -89,6 +89,7 @@ "@wordpress/block-editor": "^9.8.0", "@wordpress/browserslist-config": "wp-6.0", "concurrently": "^7.0.0", + "copy-webpack-plugin": "^9.1.0", "css-loader": "^3.6.0", "eslint": "^8.32.0", "jest": "^27.5.1", diff --git a/packages/js/product-editor/src/components/details-name-block/block.json b/packages/js/product-editor/src/components/details-name-block/block.json index 15db681d2a1..d62e85caf34 100644 --- a/packages/js/product-editor/src/components/details-name-block/block.json +++ b/packages/js/product-editor/src/components/details-name-block/block.json @@ -20,5 +20,6 @@ "reusable": false, "inserter": false, "lock": false - } + }, + "editorStyle": "file:./editor.css" } diff --git a/packages/js/product-editor/src/components/pricing-block/block.json b/packages/js/product-editor/src/components/pricing-block/block.json index 90851b04cf9..59d66189f30 100644 --- a/packages/js/product-editor/src/components/pricing-block/block.json +++ b/packages/js/product-editor/src/components/pricing-block/block.json @@ -26,5 +26,6 @@ "reusable": false, "inserter": false, "lock": false - } + }, + "editorStyle": "file:./editor.css" } diff --git a/packages/js/product-editor/src/components/section/block.json b/packages/js/product-editor/src/components/section/block.json index 89f8811fb0c..cde81d65f95 100644 --- a/packages/js/product-editor/src/components/section/block.json +++ b/packages/js/product-editor/src/components/section/block.json @@ -25,5 +25,6 @@ "reusable": false, "inserter": false, "lock": false - } + }, + "editorStyle": "file:./editor.css" } diff --git a/packages/js/product-editor/src/components/section/style.scss b/packages/js/product-editor/src/components/section/editor.scss similarity index 100% rename from packages/js/product-editor/src/components/section/style.scss rename to packages/js/product-editor/src/components/section/editor.scss diff --git a/packages/js/product-editor/src/components/tab/style.scss b/packages/js/product-editor/src/components/tab/editor.scss similarity index 100% rename from packages/js/product-editor/src/components/tab/style.scss rename to packages/js/product-editor/src/components/tab/editor.scss diff --git a/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index a4d59bce446..fdba01eac4b 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -6,8 +6,8 @@ @import 'components/header/style.scss'; @import 'components/images/editor.scss'; @import 'components/block-editor/style.scss'; -@import 'components/section/style.scss'; -@import 'components/tab/style.scss'; +@import 'components/section/editor.scss'; +@import 'components/tab/editor.scss'; @import 'components/tabs/style.scss'; @import 'components/details-summary-block/style.scss'; @import 'components/product-mvp-ces-footer/style.scss'; diff --git a/packages/js/product-editor/tsconfig-cjs.json b/packages/js/product-editor/tsconfig-cjs.json index 1df8b7b1f7a..92bfe004f21 100644 --- a/packages/js/product-editor/tsconfig-cjs.json +++ b/packages/js/product-editor/tsconfig-cjs.json @@ -1,7 +1,8 @@ { "extends": "../tsconfig-cjs", "include": [ - "**/*", + "**/*.d.ts", + "src/**/*", "src/**/*.json" ], "compilerOptions": { diff --git a/packages/js/product-editor/webpack.config.js b/packages/js/product-editor/webpack.config.js index 9b42746f1dd..ae2cba9f015 100644 --- a/packages/js/product-editor/webpack.config.js +++ b/packages/js/product-editor/webpack.config.js @@ -1,12 +1,29 @@ +/** + * External dependencies + */ +const CopyWebpackPlugin = require( 'copy-webpack-plugin' ); +const MiniCssExtractPlugin = require( 'mini-css-extract-plugin' ); +const path = require( 'path' ); +const RemoveEmptyScriptsPlugin = require( 'webpack-remove-empty-scripts' ); +const WebpackRTLPlugin = require( 'webpack-rtl-plugin' ); + /** * Internal dependencies */ const { webpackConfig } = require( '@woocommerce/internal-style-build' ); +const { + blockEntryPoints, + getBlockMetaData, + getEntryPointName, +} = require( './config/block-entry-points' ); + +const NODE_ENV = process.env.NODE_ENV || 'development'; module.exports = { mode: process.env.NODE_ENV || 'development', entry: { 'build-style': __dirname + '/src/style.scss', + ...blockEntryPoints, }, output: { path: __dirname, @@ -15,5 +32,42 @@ module.exports = { parser: webpackConfig.parser, rules: webpackConfig.rules, }, - plugins: webpackConfig.plugins, + plugins: [ + new RemoveEmptyScriptsPlugin(), + new MiniCssExtractPlugin( { + filename: ( data ) => { + return data.chunk.name.startsWith( '/build/blocks' ) + ? `[name].css` + : `[name]/style.css`; + }, + chunkFilename: 'chunks/[id].style.css', + } ), + new WebpackRTLPlugin( { + test: /(?=6.9.0'} dev: true + /@babel/compat-data/7.19.3: + resolution: {integrity: sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==} + engines: {node: '>=6.9.0'} + /@babel/compat-data/7.21.0: resolution: {integrity: sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==} engines: {node: '>=6.9.0'} @@ -2966,7 +2972,7 @@ packages: peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.19.3 '@babel/core': 7.12.9 '@babel/helper-validator-option': 7.18.6 browserslist: 4.19.3 @@ -3116,9 +3122,9 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 - '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color @@ -3266,6 +3272,12 @@ packages: dependencies: '@babel/types': 7.21.3 + /@babel/helper-member-expression-to-functions/7.18.9: + resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.21.3 + /@babel/helper-member-expression-to-functions/7.21.0: resolution: {integrity: sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==} engines: {node: '>=6.9.0'} @@ -3668,36 +3680,6 @@ packages: - supports-color dev: true - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.12.9: - resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-proposal-async-generator-functions/7.19.1_@babel+core@7.17.8: - resolution: {integrity: sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-proposal-async-generator-functions/7.20.7_@babel+core@7.12.9: resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} engines: {node: '>=6.9.0'} @@ -4308,34 +4290,6 @@ packages: '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.21.3 dev: true - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.12.9 - dev: true - - /@babel/plugin-proposal-object-rest-spread/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/compat-data': 7.21.0 - '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.17.8 - dev: true - /@babel/plugin-proposal-object-rest-spread/7.20.7_@babel+core@7.12.9: resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} @@ -5144,7 +5098,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.17.8: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} @@ -5519,26 +5473,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.12.9: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-block-scoping/7.18.9_@babel+core@7.17.8: - resolution: {integrity: sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-block-scoping/7.21.0_@babel+core@7.12.9: resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==} engines: {node: '>=6.9.0'} @@ -5596,7 +5530,7 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 globals: 11.12.0 transitivePeerDependencies: @@ -5615,47 +5549,7 @@ packages: '@babel/helper-function-name': 7.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.12.9: - resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 - '@babel/helper-split-export-declaration': 7.18.6 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-classes/7.19.0_@babel+core@7.17.8: - resolution: {integrity: sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-annotate-as-pure': 7.18.6 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-environment-visitor': 7.18.9 - '@babel/helper-function-name': 7.21.0 - '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 globals: 11.12.0 transitivePeerDependencies: @@ -5796,26 +5690,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.12.9: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-destructuring/7.18.13_@babel+core@7.17.8: - resolution: {integrity: sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-destructuring/7.21.3_@babel+core@7.12.9: resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==} engines: {node: '>=6.9.0'} @@ -6260,34 +6134,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-amd/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-amd/7.20.11_@babel+core@7.12.9: resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==} engines: {node: '>=6.9.0'} @@ -6349,7 +6195,7 @@ packages: '@babel/core': 7.17.8 '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 + '@babel/helper-simple-access': 7.18.6 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -6363,37 +6209,7 @@ packages: '@babel/core': 7.21.3 '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.12.9: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-commonjs/7.18.6_@babel+core@7.17.8: - resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-simple-access': 7.20.2 + '@babel/helper-simple-access': 7.18.6 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: - supports-color @@ -6470,38 +6286,6 @@ packages: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.12.9: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/plugin-transform-modules-systemjs/7.19.0_@babel+core@7.17.8: - resolution: {integrity: sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-hoist-variables': 7.18.6 - '@babel/helper-module-transforms': 7.21.2 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-identifier': 7.19.1 - babel-plugin-dynamic-import-node: 2.3.3 - transitivePeerDependencies: - - supports-color - dev: true - /@babel/plugin-transform-modules-systemjs/7.20.11_@babel+core@7.12.9: resolution: {integrity: sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==} engines: {node: '>=6.9.0'} @@ -6727,7 +6511,7 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-replace-supers': 7.19.1 transitivePeerDependencies: - supports-color dev: true @@ -6798,26 +6582,6 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.12.9: - resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.12.9 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - - /@babel/plugin-transform-parameters/7.18.8_@babel+core@7.17.8: - resolution: {integrity: sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.20.2 - dev: true - /@babel/plugin-transform-parameters/7.21.3_@babel+core@7.12.9: resolution: {integrity: sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==} engines: {node: '>=6.9.0'} @@ -7772,11 +7536,11 @@ packages: '@babel/compat-data': 7.21.0 '@babel/core': 7.12.9 '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.12.9 '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 @@ -7785,7 +7549,7 @@ packages: '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.12.9 '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 @@ -7808,10 +7572,10 @@ packages: '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.12.9 '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.12.9 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 @@ -7819,14 +7583,14 @@ packages: '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.12.9 '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.12.9 '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 @@ -7857,11 +7621,11 @@ packages: '@babel/compat-data': 7.21.0 '@babel/core': 7.17.8 '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.19.0 + '@babel/helper-plugin-utils': 7.20.2 '@babel/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.17.8 '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-async-generator-functions': 7.19.1_@babel+core@7.17.8 + '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.17.8 '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.17.8 '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.17.8 @@ -7870,7 +7634,7 @@ packages: '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.17.8 '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.18.9_@babel+core@7.17.8 + '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.17.8 '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.17.8 '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 @@ -7893,10 +7657,10 @@ packages: '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.19.0_@babel+core@7.17.8 + '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.17.8 + '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.17.8 '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.18.13_@babel+core@7.17.8 + '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.17.8 '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.17.8 '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.17.8 @@ -7904,14 +7668,14 @@ packages: '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.17.8 '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.17.8 '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-amd': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-commonjs': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-systemjs': 7.19.0_@babel+core@7.17.8 + '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.17.8 + '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.17.8 + '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.17.8 '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.17.8 '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.18.8_@babel+core@7.17.8 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.17.8 '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.17.8 '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.17.8 @@ -9233,7 +8997,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 jest-message-util: 26.6.2 jest-util: 26.6.2 @@ -9245,7 +9009,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 jest-message-util: 27.5.1 jest-util: 27.5.1 @@ -9337,7 +9101,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/transform': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 ansi-escapes: 4.3.2 chalk: 4.1.2 exit: 0.1.2 @@ -9382,7 +9146,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -9445,7 +9209,7 @@ packages: dependencies: '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-mock: 26.6.2 dev: true @@ -9455,7 +9219,7 @@ packages: dependencies: '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-mock: 27.5.1 /@jest/fake-timers/24.9.0: @@ -9486,7 +9250,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@sinonjs/fake-timers': 6.0.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-message-util: 26.6.2 jest-mock: 26.6.2 jest-util: 26.6.2 @@ -9498,7 +9262,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@sinonjs/fake-timers': 8.1.0 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-message-util: 27.5.1 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -9642,7 +9406,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -9913,7 +9677,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 '@types/yargs': 15.0.14 chalk: 4.1.2 @@ -9923,7 +9687,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 '@types/yargs': 16.0.4 chalk: 4.1.2 @@ -10610,7 +10374,7 @@ packages: engines: {node: '>=14'} hasBin: true dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 playwright-core: 1.30.0 dev: true @@ -11030,14 +10794,14 @@ packages: resolution: {integrity: sha512-OkIJpiU2fz6HOJujhlhfIGrc8hB4ibqtf7nnbJQDerG0BqwZCfmgtK5sWzZ0TkXVRBKD5MpLrTmCYyMxoMCgPw==} engines: {node: '>= 8.9.0', npm: '>= 5.5.1'} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: false /@slack/logger/3.0.0: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: false /@slack/types/1.10.0: @@ -11057,7 +10821,7 @@ packages: '@slack/logger': 2.0.0 '@slack/types': 1.10.0 '@types/is-stream': 1.1.0 - '@types/node': 16.18.18 + '@types/node': 16.18.21 axios: 0.21.4 eventemitter3: 3.1.2 form-data: 2.5.1 @@ -11075,7 +10839,7 @@ packages: '@slack/logger': 3.0.0 '@slack/types': 2.4.0 '@types/is-stream': 1.1.0 - '@types/node': 16.18.18 + '@types/node': 16.18.21 axios: 0.24.0 eventemitter3: 3.1.2 form-data: 2.5.1 @@ -12629,7 +12393,7 @@ packages: interpret: 2.2.0 json5: 2.2.3 lazy-universal-dotenv: 3.0.1 - picomatch: 2.3.1 + picomatch: 2.3.0 pkg-dir: 5.0.0 pretty-hrtime: 1.0.3 react: 17.0.2 @@ -14359,13 +14123,13 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/bonjour/3.5.10: resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/cacheable-request/6.0.2: @@ -14373,18 +14137,18 @@ packages: dependencies: '@types/http-cache-semantics': 4.0.1 '@types/keyv': 3.1.4 - '@types/node': 16.18.18 + '@types/node': 16.18.21 '@types/responselike': 1.0.0 /@types/cheerio/0.22.30: resolution: {integrity: sha512-t7ZVArWZlq3dFa9Yt33qFBQIK4CQd1Q3UJp0V+UhP6vgLWLM6Qug7vZuRSGXg45zXeB1Fm5X2vmBkEX58LV2Tw==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 /@types/cli-progress/3.11.0: resolution: {integrity: sha512-XhXhBv1R/q2ahF3BM7qT5HLzJNlIL0wbcGyZVjqOTqAybAnsLisd7gy1UCyIqpL+5Iv6XhlSyzjLCnI2sIdbCg==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: false /@types/color-convert/2.0.0: @@ -14405,13 +14169,13 @@ packages: resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==} dependencies: '@types/express-serve-static-core': 4.17.31 - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/cookie/0.4.1: @@ -14421,7 +14185,7 @@ packages: /@types/create-hmac/1.1.0: resolution: {integrity: sha512-BNYNdzdhOZZQWCOpwvIll3FSvgo3e55Y2M6s/jOY6TuOCwqt3cLmQsK4tSmJ5fayDot8EG4k3+hcZagfww9JlQ==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/d3-time-format/2.3.1: @@ -14473,7 +14237,7 @@ packages: /@types/express-serve-static-core/4.17.31: resolution: {integrity: sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -14491,13 +14255,13 @@ packages: resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} dependencies: '@types/minimatch': 3.0.5 - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/graceful-fs/4.1.5: resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 /@types/hast/2.3.4: resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==} @@ -14523,7 +14287,7 @@ packages: /@types/http-proxy/1.17.10: resolution: {integrity: sha512-Qs5aULi+zV1bwKAg5z1PWnDXWmsn+LxIvUGv6E2+OOMYhclZMO+OXd9pYVf2gLykf2I7IV2u7oTHwChPNsvJ7g==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/is-function/1.0.1: @@ -14533,7 +14297,7 @@ packages: /@types/is-stream/1.1.0: resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: false /@types/istanbul-lib-coverage/2.0.3: @@ -14580,7 +14344,7 @@ packages: /@types/keyv/3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 /@types/lodash.shuffle/4.2.7: resolution: {integrity: sha512-b+K0NBpB4WcNoQTfifuTmi5nm5mJXRw9DBdbFfBr1q1+EVoTKkClDxq/7r1sq2GZcRelMFRsFcGGHrHQgxRySg==} @@ -14634,14 +14398,14 @@ packages: /@types/node-fetch/2.6.1: resolution: {integrity: sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 form-data: 3.0.1 dev: true /@types/node-fetch/2.6.2: resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 form-data: 3.0.1 dev: true @@ -14657,8 +14421,8 @@ packages: resolution: {integrity: sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==} dev: true - /@types/node/16.18.18: - resolution: {integrity: sha512-fwGw1uvQAzabxL1pyoknPlJIF2t7+K90uTqynleKRx24n3lYcxWa3+KByLhgkF8GEAK2c7hC8Ki0RkNM5H15jQ==} + /@types/node/16.18.21: + resolution: {integrity: sha512-TassPGd0AEZWA10qcNnXnSNwHlLfSth8XwUaWc3gTSDmBz/rKb613Qw5qRf6o2fdRBrLbsgeC9PMZshobkuUqg==} /@types/normalize-package-data/2.4.1: resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} @@ -14703,13 +14467,13 @@ packages: /@types/puppeteer/4.0.2: resolution: {integrity: sha512-LOjNvVmJR9X2K7/hUJlt1VHss4VjNOLml27i21PJfwdQLGxxXq47mPRqcY54LR1J2IoFdyM0WFYddWFhFM51pw==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/puppeteer/5.4.5: resolution: {integrity: sha512-lxCjpDEY+DZ66+W3x5Af4oHnEmUXt0HuaRzkBGE2UZiZEp/V1d3StpLPlmNVu/ea091bdNmVPl44lu8Wy/0ZCA==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/q/1.5.5: @@ -14781,7 +14545,7 @@ packages: /@types/responselike/1.0.0: resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 /@types/retry/0.12.1: resolution: {integrity: sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==} @@ -14802,7 +14566,7 @@ packages: resolution: {integrity: sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==} dependencies: '@types/mime': 3.0.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/sizzle/2.3.3: @@ -14812,7 +14576,7 @@ packages: /@types/sockjs/0.3.33: resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/source-list-map/0.1.2: @@ -14872,7 +14636,7 @@ packages: resolution: {integrity: sha512-ayJ0iOCDNHnKpKTgBG6Q6JOnHTj9zFta+3j2b8Ejza0e4cvRyMn0ZoLEmbPrTHe5YYRlDYPvPWVdV4cTaRyH7g==} dependencies: '@types/expect': 1.20.4 - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/webpack-env/1.16.3: @@ -14882,7 +14646,7 @@ packages: /@types/webpack-sources/0.1.9: resolution: {integrity: sha512-bvzMnzqoK16PQIC8AYHNdW45eREJQMd6WG/msQWX5V2+vZmODCOPb4TJcbgRljTZZTwTM4wUMcsI8FftNA7new==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 '@types/source-list-map': 0.1.2 source-map: 0.6.1 dev: true @@ -14890,7 +14654,7 @@ packages: /@types/webpack/4.41.32: resolution: {integrity: sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 '@types/tapable': 1.0.8 '@types/uglify-js': 3.13.1 '@types/webpack-sources': 0.1.9 @@ -15054,7 +14818,7 @@ packages: /@types/ws/8.5.4: resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /@types/yargs-parser/20.2.1: @@ -15080,7 +14844,7 @@ packages: resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==} requiresBuild: true dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 optional: true /@typescript-eslint/eslint-plugin/4.33.0_s2qqtxhzmb7vugvfoyripfgp7i: @@ -18564,8 +18328,8 @@ packages: puppeteer: /puppeteer-core/3.0.0 read-pkg-up: 1.0.1 resolve-bin: 0.4.3 - sass: 1.59.3 - sass-loader: 8.0.2_sass@1.59.3+webpack@4.46.0 + sass: 1.60.0 + sass-loader: 8.0.2_sass@1.60.0+webpack@4.46.0 source-map-loader: 0.2.4 stylelint: 13.13.1 stylelint-config-wordpress: 17.0.0_stylelint@13.13.1 @@ -22493,6 +22257,21 @@ packages: webpack: 5.76.3 dev: true + /copy-webpack-plugin/9.1.0_webpack@5.70.0: + resolution: {integrity: sha512-rxnR7PaGigJzhqETHGmAcxKnLZSR5u1Y3/bcIv/1FnqXedcL/E2ewK7ZCNrArJKCiSv8yVXhTqetJh8inDvfsA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + webpack: ^5.1.0 + dependencies: + fast-glob: 3.2.11 + glob-parent: 6.0.2 + globby: 11.1.0 + normalize-path: 3.0.0 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + webpack: 5.70.0_webpack-cli@3.3.12 + dev: true + /core-js-compat/3.19.1: resolution: {integrity: sha512-Q/VJ7jAF/y68+aUsQJ/afPOewdsGkDtcMb40J8MbuWKlK3Y+wtHq8bTHKPj2WKWLIqmS5JhHs4CzHtz6pT2W6g==} dependencies: @@ -25736,7 +25515,7 @@ packages: '@nodelib/fs.walk': 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 - micromatch: 4.0.5 + micromatch: 4.0.4 dev: true /fast-json-parse/1.0.3: @@ -29305,7 +29084,7 @@ packages: '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 '@types/babel__traverse': 7.14.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -29336,7 +29115,7 @@ packages: '@jest/environment': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -29767,7 +29546,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-mock: 26.6.2 jest-util: 26.6.2 jsdom: 16.7.0 @@ -29785,7 +29564,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-mock: 27.5.1 jest-util: 27.5.1 jsdom: 16.7.0 @@ -29827,7 +29606,7 @@ packages: '@jest/environment': 26.6.2 '@jest/fake-timers': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-mock: 26.6.2 jest-util: 26.6.2 dev: true @@ -29839,7 +29618,7 @@ packages: '@jest/environment': 27.5.1 '@jest/fake-timers': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 jest-mock: 27.5.1 jest-util: 27.5.1 @@ -29934,7 +29713,7 @@ packages: dependencies: '@jest/types': 26.6.2 '@types/graceful-fs': 4.1.5 - '@types/node': 16.18.18 + '@types/node': 16.18.21 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.9 @@ -29956,7 +29735,7 @@ packages: dependencies: '@jest/types': 27.5.1 '@types/graceful-fs': 4.1.5 - '@types/node': 16.18.18 + '@types/node': 16.18.21 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.9 @@ -30030,7 +29809,7 @@ packages: '@jest/source-map': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 co: 4.6.0 expect: 26.6.2 @@ -30059,7 +29838,7 @@ packages: '@jest/source-map': 27.5.1 '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 co: 4.6.0 expect: 27.5.1 @@ -30233,7 +30012,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 dev: true /jest-mock/27.5.1: @@ -30241,7 +30020,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 /jest-pnp-resolver/1.2.2_jest-resolve@24.9.0: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} @@ -30507,7 +30286,7 @@ packages: '@jest/environment': 26.6.2 '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 emittery: 0.7.2 exit: 0.1.2 @@ -30540,7 +30319,7 @@ packages: '@jest/test-result': 27.5.1 '@jest/transform': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 emittery: 0.8.1 graceful-fs: 4.2.9 @@ -30719,14 +30498,14 @@ packages: resolution: {integrity: sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==} engines: {node: '>= 10.14.2'} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 graceful-fs: 4.2.9 /jest-serializer/27.5.1: resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 graceful-fs: 4.2.9 /jest-snapshot/24.9.0: @@ -30860,7 +30639,7 @@ packages: engines: {node: '>= 10.14.2'} dependencies: '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 graceful-fs: 4.2.9 is-ci: 2.0.0 @@ -30871,7 +30650,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 chalk: 4.1.2 ci-info: 3.2.0 graceful-fs: 4.2.9 @@ -30956,7 +30735,7 @@ packages: dependencies: '@jest/test-result': 26.6.2 '@jest/types': 26.6.2 - '@types/node': 16.18.18 + '@types/node': 16.18.21 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 26.6.2 @@ -30969,7 +30748,7 @@ packages: dependencies: '@jest/test-result': 27.5.1 '@jest/types': 27.5.1 - '@types/node': 16.18.18 + '@types/node': 16.18.21 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.5.1 @@ -30995,7 +30774,7 @@ packages: resolution: {integrity: sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 merge-stream: 2.0.0 supports-color: 7.2.0 @@ -31003,7 +30782,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.18.18 + '@types/node': 16.18.21 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -33419,8 +33198,8 @@ packages: hasBin: true dev: true - /nanoid/3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + /nanoid/3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -33686,8 +33465,8 @@ packages: is: 3.3.0 dev: false - /nodemon/2.0.21: - resolution: {integrity: sha512-djN/n2549DUtY33S7o1djRCd7dEm0kBnj9c7S9XVXqRUbuggN1MZH/Nqa+5RFQr63Fbefq37nFXAE9VU86yL1A==} + /nodemon/2.0.22: + resolution: {integrity: sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==} engines: {node: '>=8.10.0'} hasBin: true dependencies: @@ -35808,7 +35587,7 @@ packages: resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.4 + nanoid: 3.3.6 picocolors: 1.0.0 source-map-js: 1.0.2 @@ -38247,7 +38026,7 @@ packages: semver: 7.3.5 webpack: 5.70.0_webpack-cli@3.3.12 - /sass-loader/10.4.1_sass@1.59.3+webpack@5.76.3: + /sass-loader/10.4.1_sass@1.60.0+webpack@5.76.3: resolution: {integrity: sha512-aX/iJZTTpNUNx/OSYzo2KsjIUQHqvWsAhhUijFjAPdZTEhstjZI9zTNvkTTwsx+uNUJqUwOw5gacxQMx4hJxGQ==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -38266,7 +38045,7 @@ packages: klona: 2.0.5 loader-utils: 2.0.4 neo-async: 2.6.2 - sass: 1.59.3 + sass: 1.60.0 schema-utils: 3.1.1 semver: 7.3.8 webpack: 5.76.3 @@ -38297,7 +38076,7 @@ packages: webpack: 5.70.0_bgqcrdgdviybk52kjcpjat65sa dev: true - /sass-loader/8.0.2_sass@1.59.3+webpack@4.46.0: + /sass-loader/8.0.2_sass@1.60.0+webpack@4.46.0: resolution: {integrity: sha512-7o4dbSK8/Ol2KflEmSco4jTjQoV988bM82P9CZdmo9hR3RLnvNc0ufMNdMrB0caq38JQ/FgF4/7RcbcfKzxoFQ==} engines: {node: '>= 8.9.0'} peerDependencies: @@ -38316,7 +38095,7 @@ packages: clone-deep: 4.0.1 loader-utils: 1.4.0 neo-async: 2.6.2 - sass: 1.59.3 + sass: 1.60.0 schema-utils: 2.7.1 semver: 6.3.0 webpack: 4.46.0_webpack-cli@3.3.12 @@ -38332,8 +38111,8 @@ packages: source-map-js: 1.0.2 dev: true - /sass/1.59.3: - resolution: {integrity: sha512-QCq98N3hX1jfTCoUAsF3eyGuXLsY7BCnCEg9qAact94Yc21npG2/mVOqoDvE0fCbWDqiM4WlcJQla0gWG2YlxQ==} + /sass/1.60.0: + resolution: {integrity: sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==} engines: {node: '>=12.0.0'} hasBin: true dependencies: @@ -40863,7 +40642,7 @@ packages: webpack: 5.76.3_bgqcrdgdviybk52kjcpjat65sa dev: true - /ts-node/10.9.1_z2kt25o33of7k4uzjztqjquebu: + /ts-node/10.9.1_kmfuqqg37ytwipeijbkfhsguau: resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} hasBin: true peerDependencies: @@ -40882,7 +40661,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.3 - '@types/node': 16.18.18 + '@types/node': 16.18.21 acorn: 8.7.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -41484,7 +41263,7 @@ packages: webpack: ^3.0.0 || ^4.0.0 dependencies: loader-utils: 1.4.0 - mime: 2.5.2 + mime: 2.6.0 schema-utils: 1.0.0 webpack: 5.70.0_webpack-cli@4.9.2 dev: true @@ -41496,7 +41275,7 @@ packages: webpack: ^3.0.0 || ^4.0.0 dependencies: loader-utils: 1.4.0 - mime: 2.5.2 + mime: 2.6.0 schema-utils: 1.0.0 webpack: 5.76.3 dev: true From 6df1cef307fcff327276f35f20b58a466bffb5f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Fri, 31 Mar 2023 14:47:31 -0300 Subject: [PATCH 1301/1680] Add Sale price and list price blocks to pricing tab with pricing section (#37513) * Add pricing section to the pricing tab * Add changelog file * Fix php linter errors --- .../js/product-editor/changelog/add-37390 | 4 ++ plugins/woocommerce/changelog/add-37390 | 4 ++ .../includes/class-wc-post-types.php | 56 +++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 packages/js/product-editor/changelog/add-37390 create mode 100644 plugins/woocommerce/changelog/add-37390 diff --git a/packages/js/product-editor/changelog/add-37390 b/packages/js/product-editor/changelog/add-37390 new file mode 100644 index 00000000000..ec8d62081e0 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37390 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add pricing section to the pricing tab diff --git a/plugins/woocommerce/changelog/add-37390 b/plugins/woocommerce/changelog/add-37390 new file mode 100644 index 00000000000..ec8d62081e0 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37390 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add pricing section to the pricing tab diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 2cf291c43a4..77114474dd5 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -460,6 +460,62 @@ class WC_Post_Types { 'id' => 'pricing', 'title' => __( 'Pricing', 'woocommerce' ), ), + array( + array( + 'woocommerce/product-section', + array( + 'title' => __( 'Pricing', 'woocommerce' ), + 'description' => sprintf( + /* translators: %1$s: Images guide link opening tag. %2$s: Images guide link closing tag.*/ + __( 'Set a competitive price, put the product on sale, and manage tax calculations. %1$sHow to price your product?%2$s', 'woocommerce' ), + '', + '' + ), + 'icon' => array( + 'src' => '', + ), + ), + array( + array( + 'core/columns', + array(), + array( + array( + 'core/column', + array( + 'templateLock' => 'all', + ), + array( + array( + 'woocommerce/product-pricing', + array( + 'name' => 'regular_price', + 'label' => __( 'List price', 'woocommerce' ), + 'showPricingSection' => true, + ), + ), + ), + ), + array( + 'core/column', + array( + 'templateLock' => 'all', + ), + array( + array( + 'woocommerce/product-pricing', + array( + 'name' => 'sale_price', + 'label' => __( 'Sale price', 'woocommerce' ), + ), + ), + ), + ), + ), + ), + ), + ), + ), ), array( 'woocommerce/product-tab', From d625f72e2bab1033cd3f5e3cafc99a747de13dc7 Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Fri, 31 Mar 2023 16:40:16 -0300 Subject: [PATCH 1302/1680] New empty state for variations (#37411) * Add variations empty state # Conflicts: # plugins/woocommerce/client/legacy/css/admin.scss # plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php * Fix styles * Add changelog * Fix html * Fix js * Show and hide select and button * Fix e2e tests # Conflicts: # plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js * Fix lint * Fix hidden style * Fix js for hidden elements * Fix lint * Transform `load_variations` into a promise * Fix e2e test * Fix tests * Remove comment * Fix styles * Fix comment * Remove async * Remove async --------- Co-authored-by: Fernando Marichal --- .../product_data/no-variation-arrow.svg | 3 + .../no-variation-background-image.svg | 8 + ...dev-37147_empty_state_no_variation_created | 4 + .../woocommerce/client/legacy/css/admin.scss | 661 +++++++++--------- .../js/admin/meta-boxes-product-variation.js | 140 ++-- .../views/html-product-data-variations.php | 29 +- .../merchant/create-variable-product.spec.js | 14 +- 7 files changed, 489 insertions(+), 370 deletions(-) create mode 100644 plugins/woocommerce/assets/images/product_data/no-variation-arrow.svg create mode 100644 plugins/woocommerce/assets/images/product_data/no-variation-background-image.svg create mode 100644 plugins/woocommerce/changelog/dev-37147_empty_state_no_variation_created diff --git a/plugins/woocommerce/assets/images/product_data/no-variation-arrow.svg b/plugins/woocommerce/assets/images/product_data/no-variation-arrow.svg new file mode 100644 index 00000000000..551d585d6d4 --- /dev/null +++ b/plugins/woocommerce/assets/images/product_data/no-variation-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/plugins/woocommerce/assets/images/product_data/no-variation-background-image.svg b/plugins/woocommerce/assets/images/product_data/no-variation-background-image.svg new file mode 100644 index 00000000000..bbb5d8122d7 --- /dev/null +++ b/plugins/woocommerce/assets/images/product_data/no-variation-background-image.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/plugins/woocommerce/changelog/dev-37147_empty_state_no_variation_created b/plugins/woocommerce/changelog/dev-37147_empty_state_no_variation_created new file mode 100644 index 00000000000..48fb332d92f --- /dev/null +++ b/plugins/woocommerce/changelog/dev-37147_empty_state_no_variation_created @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +New empty state for variations - no variations have been created yet diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index 91838040e51..db87b9c7344 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -6,10 +6,10 @@ /** * Imports */ -@import 'mixins'; -@import 'variables'; -@import 'animation'; -@import 'fonts'; +@import "mixins"; +@import "variables"; +@import "animation"; +@import "fonts"; /** * Styling begins @@ -20,7 +20,7 @@ .wc-addons-wrap { .marketplace-header { - background-image: url( ../images/marketplace-header-bg@2x.png ); + background-image: url(../images/marketplace-header-bg@2x.png); background-position: right; background-size: cover; box-sizing: border-box; @@ -85,7 +85,7 @@ height: 60px; margin: 0 0 16px; - @media only screen and ( min-width: 768px ) { + @media only screen and (min-width: 768px) { margin-bottom: 24px; } } @@ -97,7 +97,7 @@ position: relative; width: 100%; - @media only screen and ( min-width: 600px ) { + @media only screen and (min-width: 600px) { width: 288px; } @@ -115,13 +115,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; } @@ -131,8 +131,8 @@ margin: 0; &.current a::after { - background-image: url( ../images/icons/gridicons-checkmark.svg ); - content: ''; + background-image: url(../images/icons/gridicons-checkmark.svg); + content: ""; display: block; height: 20px; position: absolute; @@ -157,7 +157,7 @@ position: relative; width: 100%; - @media only screen and ( min-width: 600px ) { + @media only screen and (min-width: 600px) { padding: 10px 18px; } } @@ -177,9 +177,9 @@ } .current-section-name::after { - background-image: url( ../images/icons/gridicons-chevron-down.svg ); + background-image: url(../images/icons/gridicons-chevron-down.svg); background-size: contain; - content: ''; + content: ""; display: block; height: 20px; position: absolute; @@ -194,7 +194,7 @@ } .current-section-name::after { - transform: rotate( 0.5turn ); + transform: rotate(0.5turn); } } @@ -214,8 +214,8 @@ /** * Marketplace related variables */ - $font-sf-pro-text: helveticaneue-light, 'Helvetica Neue Light', - 'Helvetica Neue', sans-serif; + $font-sf-pro-text: helveticaneue-light, "Helvetica Neue Light", + "Helvetica Neue", sans-serif; $font-sf-pro-display: sans-serif; @@ -237,11 +237,11 @@ } .subsubsub li::after { - content: '|'; + content: "|"; } .subsubsub li:last-child::after { - content: ''; + content: ""; } .addons-button { @@ -316,7 +316,7 @@ flex-direction: row; justify-content: center; - @media screen and ( min-width: 500px ) { + @media screen and (min-width: 500px) { justify-content: left; } @@ -340,7 +340,7 @@ padding: 0 0.5em; } - .addons-column:nth-child( 2 ) { + .addons-column:nth-child(2) { margin-right: 0; } @@ -429,7 +429,7 @@ opacity: 0.8; } - @media only screen and ( max-width: 400px ) { + @media only screen and (max-width: 400px) { .addons-button { width: 100%; } @@ -497,13 +497,13 @@ .product.addons-product-banner, .product.addons-buttons-banner { - max-width: calc( 100% - 2px ); + max-width: calc(100% - 2px); } - @media screen and ( min-width: 960px ) { + @media screen and (min-width: 960px) { // Adjust heading titles font for three-column product groups &.addons-products-three-column li.product { - max-width: calc( 33.33% - 12px ); + max-width: calc(33.33% - 12px); h2, h3 { @@ -522,7 +522,7 @@ flex-direction: column; justify-content: space-between; margin: 12px 0; - max-width: calc( 50% - 12px ); + max-width: calc(50% - 12px); min-width: 280px; min-height: 220px; overflow: hidden; @@ -533,7 +533,7 @@ max-width: 100%; } - @media only screen and ( max-width: 768px ) { + @media only screen and (max-width: 768px) { max-width: none; width: 100%; } @@ -589,7 +589,7 @@ line-height: 28px; margin: 0 !important; // Don't cover a product icon - max-width: calc( 100% - 48px ); + max-width: calc(100% - 48px); } .addons-buttons-banner-details h2 { @@ -694,15 +694,15 @@ width: 17px; &__fill { - background-image: url( ../images/icons/star-golden.svg ); + background-image: url(../images/icons/star-golden.svg); } &__half-fill { - background-image: url( ../images/icons/star-half-filled.svg ); + background-image: url(../images/icons/star-half-filled.svg); } &__no-fill { - background-image: url( ../images/icons/star-gray.svg ); + background-image: url(../images/icons/star-gray.svg); } } @@ -755,7 +755,7 @@ .addons-buttons-banner-details-container { padding-left: 0; - width: calc( 100% - 198px - 24px - 24px ); + width: calc(100% - 198px - 24px - 24px); } .addons-buttons-banner-details-container { @@ -782,7 +782,7 @@ .storefront { max-width: 990px; - background: url( ../images/storefront-bg.jpg ) bottom right #f6f6f6; + background: url(../images/storefront-bg.jpg) bottom right #f6f6f6; border: 1px solid #ddd; margin: 1em auto; padding: 24px; @@ -795,7 +795,7 @@ max-width: 400px; height: auto; margin: 0 auto 16px; - box-shadow: 0 1px 6px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 1px 6px rgba(0, 0, 0, 0.1); } p:last-of-type { @@ -847,7 +847,7 @@ } .current-section-name::after { - transform: rotate( 0.5turn ); + transform: rotate(0.5turn); } } } @@ -904,7 +904,7 @@ button.button-primary { background: #bb77ae; border-color: #a36597; - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), 0 1px 0 #a36597; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; color: #fff; text-shadow: 0 -1px 1px #a36597, 1px 0 1px #a36597, 0 1px 1px #a36597, -1px 0 1px #a36597; @@ -915,8 +915,7 @@ &:active { background: #a36597; border-color: #a36597; - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 #a36597; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; } } } @@ -970,7 +969,7 @@ white-space: nowrap; } } - > p:not( :last-child ) { + > p:not(:last-child) { width: 85%; } .woocommerce-add-variation-price-container { @@ -1006,6 +1005,14 @@ } } +/** + * Variations related variables + */ +$container-height: 360px; +$max-content-width: 544px; +$default-font-size: 14px; +$default-line-height: 18px; + #variable_product_options { .form-row select { max-width: 100%; @@ -1017,18 +1024,30 @@ } } - .add-attributes-container { + %container-defaults { box-sizing: border-box; display: flex; - align-items: center; padding: 32px 0; - height: 360px; + height: $container-height; + } + + %centered-text { + width: 90%; + max-width: $max-content-width; + font-size: $default-font-size; + line-height: $default-line-height; + text-align: center; + } + + .add-attributes-container { + @extend %container-defaults; + align-items: center; a { text-decoration: none; &[target="_blank"]::after { - content: url('../images/icons/external-link.svg'); + content: url("../images/icons/external-link.svg"); margin-left: 2px; vertical-align: sub; } @@ -1042,14 +1061,33 @@ width: 100%; p { - width: 90%; - max-width: 544px; - font-size: 14px; - line-height: 18px; - text-align: center; + @extend %centered-text; } } } + + .add-variation-container { + @extend %container-defaults; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + position: relative; + + .arrow-image-wrapper { + position: absolute; + top: 10px; + left: 87px; + } + + p { + @extend %centered-text; + } + + &.hidden { + display: none; + } + } } #product_attributes { @@ -1071,7 +1109,7 @@ padding: 32px 0px; gap: 24px; flex: 1; - @media screen and ( max-width: 782px ) { + @media screen and (max-width: 782px) { button { vertical-align: top; } @@ -1133,7 +1171,7 @@ mark.amount { width: 16px; &::after { - @include icon_dashicons( '\f223' ); + @include icon_dashicons("\f223"); cursor: help; } } @@ -1160,7 +1198,7 @@ table.wc_status_table { margin: 0; } - tr:nth-child( 2n ) { + tr:nth-child(2n) { th, td { background: #fcfcfc; @@ -1311,7 +1349,7 @@ table.wc_status_table--tools { } // Adjust log table columns only when table is not collapsed - @media screen and ( min-width: 783px ) { + @media screen and (min-width: 783px) { .column-timestamp { width: 18%; } @@ -1338,7 +1376,7 @@ table.wc_status_table--tools { #log-viewer { background: #fff; border: 1px solid #e5e5e5; - box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.04 ); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04); padding: 5px 20px; pre { @@ -1497,7 +1535,7 @@ ul.wc_coupon_list { */ &::before { - @include icon_dashicons( '\f158' ); + @include icon_dashicons("\f158"); } &:hover::before { @@ -1539,7 +1577,7 @@ ul.wc_coupon_list_block { display: inline-block; &::after { - @include icon_dashicons( '\f345' ); + @include icon_dashicons("\f345"); line-height: 28px; } } @@ -1561,8 +1599,8 @@ ul.wc_coupon_list_block { h2 { margin: 0; - font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', - 'Helvetica Neue', sans-serif; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", sans-serif; font-size: 21px; font-weight: normal; line-height: 1.2; @@ -1586,8 +1624,8 @@ ul.wc_coupon_list_block { p.order_number { margin: 0; - font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', - 'Helvetica Neue', sans-serif; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", sans-serif; font-weight: normal; line-height: 1.6em; font-size: 16px; @@ -1740,7 +1778,7 @@ ul.wc_coupon_list_block { } &::after { - font-family: 'WooCommerce'; + font-family: "WooCommerce"; position: absolute; top: 0; left: 0; @@ -1753,8 +1791,8 @@ ul.wc_coupon_list_block { } a.edit_address::after { - font-family: 'Dashicons'; - content: '\f464'; + font-family: "Dashicons"; + content: "\f464"; } .billing-same-as-shipping, @@ -1886,7 +1924,7 @@ ul.wc_coupon_list_block { margin: 0 0 0 0.5em; box-sizing: border-box; - input[type='text'] { + input[type="text"] { width: 96%; float: right; } @@ -2058,7 +2096,7 @@ ul.wc_coupon_list_block { text-align: center; &:empty::before { - @include icon_dashicons( '\f128' ); + @include icon_dashicons("\f128"); width: 38px; line-height: 38px; display: block; @@ -2129,7 +2167,7 @@ ul.wc_coupon_list_block { display: inline-block; background: #fff; border: 1px solid #ddd; - box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 ); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); margin: 1px 0; min-width: 80px; overflow: hidden; @@ -2302,7 +2340,7 @@ ul.wc_coupon_list_block { margin: 0 auto; &::before { - @include icon( '\e007' ); + @include icon("\e007"); color: #ccc; } } @@ -2315,7 +2353,7 @@ ul.wc_coupon_list_block { margin: 0 auto; &::before { - @include icon( '\e014' ); + @include icon("\e014"); color: #ccc; } } @@ -2329,7 +2367,7 @@ ul.wc_coupon_list_block { margin: 0 auto; &::before { - @include icon( '\e01a' ); + @include icon("\e01a"); color: #ccc; } } @@ -2355,7 +2393,7 @@ ul.wc_coupon_list_block { margin: 3px -18px 0 0; &::before { - @include icon_dashicons( '\f153' ); + @include icon_dashicons("\f153"); color: #999; } @@ -2376,7 +2414,7 @@ ul.wc_coupon_list_block { margin-top: 0.5em; &::before { - @include icon_dashicons( '\f171' ); + @include icon_dashicons("\f171"); position: relative; top: auto; left: auto; @@ -2430,14 +2468,14 @@ ul.wc_coupon_list_block { } .edit-order-item::before { - @include icon_dashicons( '\f464' ); + @include icon_dashicons("\f464"); position: relative; } .delete-order-item, .delete_refund { &::before { - @include icon_dashicons( '\f158' ); + @include icon_dashicons("\f158"); position: relative; } @@ -2582,7 +2620,7 @@ ul.wc_coupon_list_block { vertical-align: middle; &::after { - font-family: 'Dashicons'; + font-family: "Dashicons"; speak: never; font-weight: normal; font-variant: normal; @@ -2606,30 +2644,30 @@ ul.wc_coupon_list_block { } a.edit::after { - content: '\f464'; + content: "\f464"; } a.link::after { - font-family: 'WooCommerce'; - content: '\e00d'; + font-family: "WooCommerce"; + content: "\e00d"; } a.view::after { - content: '\f177'; + content: "\f177"; } a.refresh::after { - font-family: 'WooCommerce'; - content: '\e031'; + font-family: "WooCommerce"; + content: "\e031"; } a.processing::after { - font-family: 'WooCommerce'; - content: '\e00f'; + font-family: "WooCommerce"; + content: "\e00f"; } a.complete::after { - content: '\f147'; + content: "\f147"; } } @@ -2720,7 +2758,7 @@ ul.wc_coupon_list_block { border-top: 1px solid #f5f5f5; } - tbody tr:hover:not( .status-trash ):not( .no-link ) td { + tbody tr:hover:not(.status-trash):not(.no-link) td { cursor: pointer; } @@ -2804,7 +2842,7 @@ ul.wc_coupon_list_block { border-radius: 4px; &::before { - @include icon( '\e010' ); + @include icon("\e010"); line-height: 16px; font-size: 14px; vertical-align: middle; @@ -2818,9 +2856,8 @@ ul.wc_coupon_list_block { .order-preview.disabled { &::before { - content: ''; - background: url( '../images/wpspin-2x.gif' ) no-repeat center - top; + content: ""; + background: url("../images/wpspin-2x.gif") no-repeat center top; background-size: 71%; } } @@ -2833,7 +2870,7 @@ ul.wc_coupon_list_block { color: #777; background: #e5e5e5; border-radius: 4px; - border-bottom: 1px solid rgba( 0, 0, 0, 0.05 ); + border-bottom: 1px solid rgba(0, 0, 0, 0.05); margin: -0.25em 0; cursor: inherit !important; white-space: nowrap; @@ -3038,7 +3075,7 @@ ul.wc_coupon_list_block { } } -@media screen and ( max-width: 782px ) { +@media screen and (max-width: 782px) { .wc-order-preview footer { .wc-action-button-group .wc-action-button-group__items { display: flex; @@ -3095,7 +3132,7 @@ ul.wc_coupon_list_block { color: #999; &::after { - @include icon( '\e026' ); + @include icon("\e026"); line-height: 16px; } } @@ -3106,7 +3143,7 @@ ul.wc_coupon_list_block { color: #999; &::after { - @include icon( '\e027' ); + @include icon("\e027"); line-height: 16px; } } @@ -3132,8 +3169,8 @@ ul.wc_coupon_list_block { width: 2em; &::after { - @include icon( '\f111' ); - font-family: 'Dashicons'; + @include icon("\f111"); + font-family: "Dashicons"; line-height: 1.85; } } @@ -3173,7 +3210,7 @@ ul.order_notes { } .note_content::after { - content: ''; + content: ""; display: block; position: absolute; bottom: -10px; @@ -3241,8 +3278,8 @@ table.wp-list-table { vertical-align: text-top; &::before { - content: '\f333'; - font-family: 'Dashicons'; + content: "\f333"; + font-family: "Dashicons"; text-align: center; line-height: 1; color: #999; @@ -3329,17 +3366,17 @@ table.wp-list-table { margin: 0 auto; &::before { - @include icon_dashicons( '\f128' ); + @include icon_dashicons("\f128"); } } span.wc-featured { &::before { - content: '\f155'; + content: "\f155"; } &.not-featured::before { - content: '\f154'; + content: "\f154"; } } @@ -3382,15 +3419,15 @@ table.wp-list-table { } .order-notes_head::after { - content: '\e028'; + content: "\e028"; } .notes_head::after { - content: '\e026'; + content: "\e026"; } .status_head::after { - content: '\e011'; + content: "\e011"; } .column-order_items { @@ -3480,8 +3517,8 @@ table.wc_input_table { background: #fff; cursor: default; - input[type='text'], - input[type='number'] { + input[type="text"], + input[type="number"] { width: 100% !important; min-width: 100px; padding: 8px 10px; @@ -3533,7 +3570,7 @@ table.wc_input_table { padding: 0 4px; } - .ui-sortable:not( .ui-sortable-disabled ) td.sort { + .ui-sortable:not(.ui-sortable-disabled) td.sort { cursor: move; font-size: 15px; background: #f9f9f9; @@ -3541,8 +3578,8 @@ table.wc_input_table { vertical-align: middle; &::before { - content: '\f333'; - font-family: 'Dashicons'; + content: "\f333"; + font-family: "Dashicons"; text-align: center; line-height: 1; color: #999; @@ -3615,7 +3652,7 @@ table.wc_shipping { vertical-align: middle; } - tr:nth-child( odd ) td { + tr:nth-child(odd) td { background: #f9f9f9; } @@ -3650,8 +3687,8 @@ table.wc_shipping { width: 72px; &::before { - content: '\f333'; - font-family: 'Dashicons'; + content: "\f333"; + font-family: "Dashicons"; text-align: center; line-height: 1; color: #999; @@ -3700,11 +3737,11 @@ table.wc_shipping { } .wc-move-down::before { - content: '\f347'; + content: "\f347"; } .wc-move-up::before { - content: '\f343'; + content: "\f343"; } .wc-move-disabled { @@ -3899,8 +3936,8 @@ table.wc-shipping-classes { } &::before { - content: '\e01b'; - font-family: 'WooCommerce'; + content: "\e01b"; + font-family: "WooCommerce"; text-align: center; line-height: 1; color: #eee2ec; @@ -3916,8 +3953,8 @@ table.wc-shipping-classes { .button-primary { background-color: #804877; border-color: #804877; - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.2 ), - 0 1px 0 rgba( 0, 0, 0, 0.15 ); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), + 0 1px 0 rgba(0, 0, 0, 0.15); margin: 0; opacity: 1; text-shadow: 0 -1px 1px #8a4f7f, 1px 0 1px #8a4f7f, @@ -3931,13 +3968,13 @@ table.wc-shipping-classes { } .wc-shipping-zone-method-rows { - tr:nth-child( even ) td { + tr:nth-child(even) td { background: #f9f9f9; } } tr.odd, - .wc-shipping-class-rows tr:nth-child( odd ) { + .wc-shipping-class-rows tr:nth-child(odd) { td { background: #f9f9f9; } @@ -3974,8 +4011,8 @@ table.wc-shipping-classes { text-align: center; &::before { - content: '\f333'; - font-family: 'Dashicons'; + content: "\f333"; + font-family: "Dashicons"; text-align: center; line-height: 1; color: #999; @@ -3995,8 +4032,8 @@ table.wc-shipping-classes { text-align: center; &::before { - content: '\f319'; - font-family: 'dashicons'; + content: "\f319"; + font-family: "dashicons"; text-align: center; line-height: 1; color: #999; @@ -4057,11 +4094,11 @@ table.wc-shipping-classes { } li::before { - content: ', '; + content: ", "; } li:first-child::before { - content: ''; + content: ""; } } @@ -4075,8 +4112,8 @@ table.wc-shipping-classes { &::before { @include icon; - font-family: 'Dashicons'; - content: '\f502'; + font-family: "Dashicons"; + content: "\f502"; color: #999; vertical-align: middle; line-height: 24px; @@ -4150,7 +4187,7 @@ table.wc-shipping-classes { vertical-align: text-top; &::before { - content: ''; + content: ""; display: block; width: 16px; height: 16px; @@ -4208,7 +4245,7 @@ table.wc-shipping-classes { min-width: 250px; } - input[type='checkbox'] { + input[type="checkbox"] { width: auto; min-width: 16px; } @@ -4270,17 +4307,17 @@ img.help_tip { } .status-manual::before { - @include icon( '\e008' ); + @include icon("\e008"); color: #999; } .status-enabled::before { - @include icon( '\e015' ); + @include icon("\e015"); color: $woocommerce; } .status-disabled::before { - @include icon( '\e013' ); + @include icon("\e013"); color: #ccc; } @@ -4293,7 +4330,7 @@ img.help_tip { margin: 1.5em 0 1em; } - .subsubsub:not( .list-table-filters ) { + .subsubsub:not(.list-table-filters) { margin: -8px 0 0; } @@ -4319,7 +4356,7 @@ img.help_tip { } } - textarea[disabled='disabled'] { + textarea[disabled="disabled"] { background: #dfdfdf !important; } @@ -4336,9 +4373,9 @@ img.help_tip { } } - input[type='text'], - input[type='number'], - input[type='email'] { + input[type="text"], + input[type="number"], + input[type="email"] { height: auto; } @@ -4350,17 +4387,17 @@ img.help_tip { // Give regular settings inputs a standard width and padding. textarea, - input[type='text'], - input[type='email'], - input[type='number'], - input[type='password'], - input[type='datetime'], - input[type='datetime-local'], - input[type='date'], - input[type='time'], - input[type='week'], - input[type='url'], - input[type='tel'], + input[type="text"], + input[type="email"], + input[type="number"], + input[type="password"], + input[type="datetime"], + input[type="datetime-local"], + input[type="date"], + input[type="time"], + input[type="week"], + input[type="url"], + input[type="tel"], input.regular-input { width: 400px; margin: 0; @@ -4369,11 +4406,11 @@ img.help_tip { vertical-align: top; } - input[type='datetime-local'], - input[type='date'], - input[type='time'], - input[type='week'], - input[type='tel'] { + input[type="datetime-local"], + input[type="date"], + input[type="time"], + input[type="week"], + input[type="tel"] { width: 200px; } @@ -4393,9 +4430,9 @@ img.help_tip { table { select, textarea, - input[type='text'], - input[type='email'], - input[type='number'], + input[type="text"], + input[type="email"], + input[type="number"], input.regular-input { width: auto; } @@ -4496,7 +4533,7 @@ img.help_tip { position: absolute; border: 1px solid #ccc; border-radius: 3px; - box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.2 ); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); .ui-slider { border: 0 !important; @@ -4570,27 +4607,27 @@ img.help_tip { table.form-table { // Give regular settings inputs a standard width and padding. textarea, - input[type='text'], - input[type='email'], - input[type='number'], - input[type='password'], - input[type='datetime'], - input[type='datetime-local'], - input[type='date'], - input[type='time'], - input[type='week'], - input[type='url'], - input[type='tel'], + input[type="text"], + input[type="email"], + input[type="number"], + input[type="password"], + input[type="datetime"], + input[type="datetime-local"], + input[type="date"], + input[type="time"], + input[type="week"], + input[type="url"], + input[type="tel"], input.regular-input { padding: 0 8px; - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { width: 100%; } } select { - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { width: 100%; } } @@ -4600,7 +4637,7 @@ img.help_tip { .woocommerce-help-tip { margin: -7px -24px 0 0; - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { right: auto; margin-left: 5px; } @@ -4615,12 +4652,12 @@ img.help_tip { padding: 0; width: 30px; height: 30px; - box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.2 ); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.2); font-size: 16px; border-radius: 4px; margin-right: 3px; - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { float: left; width: 40px; height: 40px; @@ -4714,7 +4751,7 @@ img.help_tip { margin: 9px 9px 0 0; background: #f7f7f7; - @include border-radius( 2px ); + @include border-radius(2px); position: relative; box-sizing: border-box; @@ -4730,7 +4767,7 @@ img.help_tip { position: relative; &::after { - @include icon_dashicons( '\f161' ); + @include icon_dashicons("\f161"); font-size: 2.618em; line-height: 72px; color: #ddd; @@ -4744,7 +4781,7 @@ img.help_tip { padding: 2px; display: none; - @media ( max-width: 768px ) { + @media (max-width: 768px) { display: block; } @@ -4770,7 +4807,7 @@ img.help_tip { font-size: 1.4em; &::before { - @include icon_dashicons( '\f153' ); + @include icon_dashicons("\f153"); color: #999; background: #fff; border-radius: 50%; @@ -4932,7 +4969,7 @@ img.help_tip { box-sizing: border-box; &::after { - content: ''; + content: ""; display: block; width: 100%; height: 9999em; @@ -4964,34 +5001,34 @@ img.help_tip { } &::before { - @include iconbeforedashicons( '\f107' ); + @include iconbeforedashicons("\f107"); } } &.general_options a::before { - content: '\f107'; + content: "\f107"; } &.inventory_options a::before { - content: '\f481'; + content: "\f481"; } &.shipping_options a::before { - font-family: 'WooCommerce'; - content: '\e01a'; + font-family: "WooCommerce"; + content: "\e01a"; } &.linked_product_options a::before { - content: '\f103'; + content: "\f103"; } &.attribute_options a::before { - content: '\f175'; + content: "\f175"; } &.advanced_options a::before { - font-family: 'Dashicons'; - content: '\f111'; + font-family: "Dashicons"; + content: "\f111"; } &.marketplace-suggestions_options a::before { @@ -4999,22 +5036,22 @@ img.help_tip { } &.variations_options a::before { - content: '\f509'; + content: "\f509"; } &.usage_restriction_options a::before { - font-family: 'WooCommerce'; - content: '\e602'; + font-family: "WooCommerce"; + content: "\e602"; } &.usage_limit_options a::before { - font-family: 'WooCommerce'; - content: '\e601'; + font-family: "WooCommerce"; + content: "\e601"; } &.general_coupon_data a::before { - font-family: 'WooCommerce'; - content: '\e600'; + font-family: "WooCommerce"; + content: "\e600"; } &.active a { @@ -5030,8 +5067,8 @@ img.help_tip { * Shipping */ .woocommerce_page_wc-settings { - input[type='url'], - input[type='email'] { + input[type="url"], + input[type="email"] { direction: ltr; } @@ -5045,7 +5082,7 @@ img.help_tip { } .add.button::before { - @include iconbefore( '\e007' ); + @include iconbefore("\e007"); } } @@ -5095,7 +5132,7 @@ img.help_tip { line-height: 24px; &::after { - content: '.'; + content: "."; display: block; height: 0; clear: both; @@ -5165,7 +5202,7 @@ img.help_tip { font-size: 1.2em; &::before { - @include icon_dashicons( '\f153' ); + @include icon_dashicons("\f153"); color: #999; } @@ -5186,8 +5223,8 @@ img.help_tip { padding-right: 7px !important; &::before { - content: '\f333'; - font-family: 'Dashicons'; + content: "\f333"; + font-family: "Dashicons"; text-align: center; line-height: 1; color: #999; @@ -5204,7 +5241,7 @@ img.help_tip { /* Warning asterisk (indicates if there is a problem with a downloadable file). */ span.disabled { - color: var( --wc-red ); + color: var(--wc-red); } } } @@ -5223,8 +5260,8 @@ img.help_tip { vertical-align: middle; &::before { - content: '\f333'; - font-family: 'Dashicons'; + content: "\f333"; + font-family: "Dashicons"; text-align: center; line-height: 28px; color: #999; @@ -5286,7 +5323,7 @@ img.help_tip { margin-bottom: 1em; } - .short:nth-of-type( 2 ) { + .short:nth-of-type(2) { clear: left; } } @@ -5330,10 +5367,10 @@ img.help_tip { vertical-align: top; } - input[type='text'], - input[type='email'], - input[type='number'], - input[type='password'] { + input[type="text"], + input[type="email"], + input[type="number"], + input[type="password"] { width: 50%; float: left; } @@ -5347,10 +5384,10 @@ img.help_tip { float: left; } - input[type='text'].short, - input[type='email'].short, - input[type='number'].short, - input[type='password'].short, + input[type="text"].short, + input[type="email"].short, + input[type="number"].short, + input[type="password"].short, .short { width: 50%; } @@ -5458,7 +5495,7 @@ img.help_tip { margin: 0 !important; border-top: 1px solid white; padding: 9px 12px !important; - &:not( .expand-close-hidden ) { + &:not(.expand-close-hidden) { border-bottom: 1px solid #eee; } @@ -5542,10 +5579,10 @@ img.help_tip { float: right; &::before { - content: '\f142' !important; + content: "\f142" !important; cursor: pointer; display: inline-block; - font: 400 20px/1 'Dashicons'; + font: 400 20px/1 "Dashicons"; line-height: 0.5 !important; padding: 8px 10px; position: relative; @@ -5555,10 +5592,10 @@ img.help_tip { } &.closed { - @include border-radius( 3px ); + @include border-radius(3px); .handlediv::before { - content: '\f140' !important; + content: "\f140" !important; } h3 { @@ -5737,7 +5774,7 @@ img.help_tip { a { padding: 0 10px 3px; - background: rgba( 0, 0, 0, 0.05 ); + background: rgba(0, 0, 0, 0.05); font-size: 16px; font-weight: 400; text-decoration: none; @@ -5748,7 +5785,7 @@ img.help_tip { a.disabled:focus, a.disabled:hover { color: #a0a5aa; - background: rgba( 0, 0, 0, 0.05 ); + background: rgba(0, 0, 0, 0.05); } } @@ -5785,8 +5822,8 @@ img.help_tip { } &::before { - content: '\f128'; - font-family: 'Dashicons'; + content: "\f128"; + font-family: "Dashicons"; position: absolute; top: 0; left: 0; @@ -5805,7 +5842,7 @@ img.help_tip { } &::before { - content: '\f335'; + content: "\f335"; display: none; } @@ -5825,7 +5862,7 @@ img.help_tip { padding: 4px 1em 2px 0; } - input[type='checkbox'] { + input[type="checkbox"] { margin: 0 5px 0 0.5em !important; vertical-align: middle; } @@ -5841,20 +5878,20 @@ img.help_tip { float: right; } - input[type='text'], - input[type='number'], - input[type='password'], - input[type='color'], - input[type='date'], - input[type='datetime'], - input[type='datetime-local'], - input[type='email'], - input[type='month'], - input[type='search'], - input[type='tel'], - input[type='time'], - input[type='url'], - input[type='week'], + input[type="text"], + input[type="number"], + input[type="password"], + input[type="color"], + input[type="date"], + input[type="datetime"], + input[type="datetime-local"], + input[type="email"], + input[type="month"], + input[type="search"], + input[type="tel"], + input[type="time"], + input[type="url"], + input[type="week"], select, textarea { width: 100%; @@ -5974,7 +6011,7 @@ img.tips { text-align: center; border-radius: 3px; padding: 0.618em 1em; - box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.2 ); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); code { padding: 1px; @@ -6009,7 +6046,7 @@ img.tips { z-index: 9999999; &::after { - content: ''; + content: ""; display: block; border: 8px solid #d82223; border-right-color: transparent; @@ -6079,7 +6116,7 @@ img.ui-datepicker-trigger { .postbox { &::after { - content: '.'; + content: "."; display: block; height: 0; clear: both; @@ -6110,7 +6147,7 @@ img.ui-datepicker-trigger { text-decoration: none; &::before { - @include iconbeforedashicons( '\f346' ); + @include iconbeforedashicons("\f346"); margin-right: 4px; } } @@ -6125,7 +6162,7 @@ img.ui-datepicker-trigger { &::before, &::after { - content: ' '; + content: " "; display: table; } @@ -6206,7 +6243,7 @@ img.ui-datepicker-trigger { border: 1px solid #dfdfdf; &::after { - content: '.'; + content: "."; display: block; height: 0; clear: both; @@ -6222,11 +6259,7 @@ img.ui-datepicker-trigger { margin: 0; color: $blue; border-top-width: 0; - background-image: linear-gradient( - to top, - #ececec, - #f9f9f9 - ); + background-image: linear-gradient(to top, #ececec, #f9f9f9); &.section_title:hover { color: $red; @@ -6240,7 +6273,7 @@ img.ui-datepicker-trigger { display: block; &::after { - @include iconafter( '\e035' ); + @include iconafter("\e035"); float: right; font-size: 0.9em; line-height: 1.618; @@ -6364,8 +6397,8 @@ img.ui-datepicker-trigger { color: #464646; font-weight: normal; display: block; - font-family: 'HelveticaNeue-Light', 'Helvetica Neue Light', - 'Helvetica Neue', sans-serif; + font-family: "HelveticaNeue-Light", "Helvetica Neue Light", + "Helvetica Neue", sans-serif; del { color: #e74c3c; @@ -6375,7 +6408,7 @@ img.ui-datepicker-trigger { &:hover { box-shadow: inset 0 -1px 0 0 #dfdfdf, - inset 300px 0 0 rgba( 156, 93, 144, 0.1 ); + inset 300px 0 0 rgba(156, 93, 144, 0.1); border-right: 5px solid #9c5d90 !important; padding-left: 1.5em; color: #9c5d90; @@ -6573,24 +6606,24 @@ table.bar_chart { .woocommerce_page_wc-orders, .post-type-shop_order { .woocommerce-BlankState-message::before { - @include icon( '\e01d' ); + @include icon("\e01d"); } } .post-type-shop_coupon .woocommerce-BlankState-message::before { - @include icon( '\e600' ); + @include icon("\e600"); } .post-type-product .woocommerce-BlankState-message::before { - @include icon( '\e006' ); + @include icon("\e006"); } .woocommerce-BlankState--api .woocommerce-BlankState-message::before { - @include icon( '\e01c' ); + @include icon("\e01c"); } .woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before { - @include icon( '\e01b' ); + @include icon("\e01b"); } .woocommerce-BlankState { @@ -6606,8 +6639,8 @@ table.bar_chart { &::before { color: #ddd; - text-shadow: 0 -1px 1px rgba( 0, 0, 0, 0.2 ), - 0 1px 0 rgba( 255, 255, 255, 0.8 ); + text-shadow: 0 -1px 1px rgba(0, 0, 0, 0.2), + 0 1px 0 rgba(255, 255, 255, 0.8); font-size: 8em; display: block; position: relative !important; @@ -6663,7 +6696,7 @@ table.bar_chart { /** * Small screen optimisation */ -@media only screen and ( max-width: 1280px ) { +@media only screen and (max-width: 1280px) { #order_data { .order_data_column { width: 48%; @@ -6682,10 +6715,10 @@ table.bar_chart { } .short, - input[type='text'].short, - input[type='email'].short, - input[type='number'].short, - input[type='password'].short, + input[type="text"].short, + input[type="email"].short, + input[type="number"].short, + input[type="password"].short, .dimensions_field .wrap { width: 80%; } @@ -6721,7 +6754,7 @@ table.bar_chart { /** * Optimisation for screens 900px and smaller */ -@media only screen and ( max-width: 900px ) { +@media only screen and (max-width: 900px) { #woocommerce-coupon-data ul.coupon_data_tabs, #woocommerce-product-data ul.product_data_tabs, #woocommerce-product-data .wc-tabs-back { @@ -6759,7 +6792,7 @@ table.bar_chart { /** * Optimisation for screens 782px and smaller */ -@media only screen and ( max-width: 782px ) { +@media only screen and (max-width: 782px) { #wp-excerpt-media-buttons a { font-size: 16px; line-height: 37px; @@ -6819,7 +6852,7 @@ table.bar_chart { } } - .is-expanded td:not( .hidden ) { + .is-expanded td:not(.hidden) { overflow: visible; } @@ -6841,7 +6874,7 @@ table.bar_chart { margin: 0; } - .is-expanded td:not( .hidden ) { + .is-expanded td:not(.hidden) { overflow: visible; } @@ -6852,7 +6885,7 @@ table.bar_chart { } } -@media only screen and ( max-width: 500px ) { +@media only screen and (max-width: 500px) { .woocommerce_options_panel label, .woocommerce_options_panel legend { float: none; @@ -6903,7 +6936,7 @@ table.bar_chart { z-index: 100000; left: 50%; top: 50%; - transform: translate( -50%, -50% ); + transform: translate(-50%, -50%); max-width: 100%; min-width: 500px; @@ -6922,7 +6955,7 @@ table.bar_chart { } } -@media screen and ( max-width: 782px ) { +@media screen and (max-width: 782px) { .wc-backbone-modal .wc-backbone-modal-content { width: 100%; height: 100%; @@ -6980,10 +7013,10 @@ table.bar_chart { transition: color 0.1s ease-in-out, background 0.1s ease-in-out; &::before { - font: normal 22px/50px 'dashicons' !important; + font: normal 22px/50px "dashicons" !important; color: #666; display: block; - content: '\f335'; + content: "\f335"; font-weight: 300; } @@ -7072,7 +7105,7 @@ table.bar_chart { padding: 1em 1.5em; background: #fcfcfc; border-top: 1px solid #dfdfdf; - box-shadow: 0 -4px 4px -4px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 -4px 4px -4px rgba(0, 0, 0, 0.1); .inner { text-align: right; @@ -7114,11 +7147,11 @@ table.bar_chart { } .select2-dropdown--below { - box-shadow: 0 1px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.1); } .select2-dropdown--above { - box-shadow: 0 -1px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 -1px 1px rgba(0, 0, 0, 0.1); } .select2-container { @@ -7203,12 +7236,12 @@ table.bar_chart { right: 0; height: 1px; background: #fff; - content: ''; + content: ""; } } .select2-dropdown--below { - box-shadow: 0 0 0 1px #007cba, 0 2px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 0 0 1px #007cba, 0 2px 1px rgba(0, 0, 0, 0.1); &::after { top: -1px; @@ -7216,7 +7249,7 @@ table.bar_chart { } .select2-dropdown--above { - box-shadow: 0 0 0 1px #007cba, 0 -2px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 0 0 1px #007cba, 0 -2px 1px rgba(0, 0, 0, 0.1); &::after { bottom: -1px; @@ -7224,7 +7257,7 @@ table.bar_chart { } .select2-container { - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { font-size: 16px; } @@ -7236,7 +7269,7 @@ table.bar_chart { height: 30px; border-color: #7e8993; - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { height: 40px; } @@ -7247,7 +7280,7 @@ table.bar_chart { .select2-selection__rendered { line-height: 28px; - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { line-height: 38px; } @@ -7260,11 +7293,11 @@ table.bar_chart { right: 1px; height: 28px; width: 23px; - background: url( 'data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E' ) + background: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E") no-repeat right 5px top 55%; background-size: 16px 16px; - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { height: 38px; } @@ -7294,7 +7327,7 @@ table.bar_chart { } .woocommerce table.form-table .select2-container { - @media only screen and ( max-width: 782px ) { + @media only screen and (max-width: 782px) { min-width: 100% !important; } } @@ -7336,11 +7369,11 @@ table.bar_chart { } .select2-dropdown--below { - box-shadow: 0 0 0 1px $color, 0 2px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 0 0 1px $color, 0 2px 1px rgba(0, 0, 0, 0.1); } .select2-dropdown--above { - box-shadow: 0 0 0 1px $color, 0 -2px 1px rgba( 0, 0, 0, 0.1 ); + box-shadow: 0 0 0 1px $color, 0 -2px 1px rgba(0, 0, 0, 0.1); } .select2-selection--single .select2-selection__rendered:hover { @@ -7422,7 +7455,7 @@ table.bar_chart { } li::before { - content: ''; + content: ""; border: 4px solid #ccc; border-radius: 100%; width: 4px; @@ -7465,9 +7498,9 @@ table.bar_chart { border-radius: 4px; background-color: #bb77ae; border-color: #a36597; - -webkit-box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), 0 1px 0 #a36597; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; text-shadow: 0 -1px 1px #a36597, 1px 0 1px #a36597, 0 1px 1px #a36597, -1px 0 1px #a36597; margin: 0; @@ -7478,10 +7511,9 @@ table.bar_chart { &:active { background: #a36597; border-color: #a36597; - -webkit-box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), - 0 1px 0 #a36597; - box-shadow: inset 0 1px 0 rgba( 255, 255, 255, 0.25 ), + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 0 #a36597; } } @@ -7512,7 +7544,7 @@ table.bar_chart { overflow: hidden; padding: 0; margin: 0 0 16px; - box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.13 ); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.13); color: #555; text-align: left; @@ -7563,13 +7595,13 @@ table.bar_chart { font-weight: normal; } - input[type='checkbox'] { + input[type="checkbox"] { margin: 0 4px 0 0; padding: 7px; } - input[type='text'], - input[type='number'] { + input[type="text"], + input[type="number"] { padding: 7px; height: auto; margin: 0; @@ -7577,8 +7609,8 @@ table.bar_chart { .woocommerce-importer-file-url-field-wrapper { border: 1px solid #ddd; - -webkit-box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 ); - box-shadow: inset 0 1px 2px rgba( 0, 0, 0, 0.07 ); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.07); background-color: #fff; color: #32373c; outline: 0; @@ -7625,7 +7657,7 @@ table.bar_chart { border: 2px solid #eee; border-radius: 4px; padding: 0; - box-shadow: 0 1px 0 0 rgba( 255, 255, 255, 0.2 ); + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.2); } progress::-webkit-progress-bar { @@ -7638,25 +7670,25 @@ table.bar_chart { progress::-webkit-progress-value { border-radius: 3px; - box-shadow: inset 0 1px 1px 0 rgba( 255, 255, 255, 0.4 ); + box-shadow: inset 0 1px 1px 0 rgba(255, 255, 255, 0.4); background: #a46497; - background: linear-gradient( to bottom, #a46497, #66405f ), #a46497; + background: linear-gradient(to bottom, #a46497, #66405f), #a46497; transition: width 1s ease; } progress::-moz-progress-bar { border-radius: 3px; - box-shadow: inset 0 1px 1px 0 rgba( 255, 255, 255, 0.4 ); + box-shadow: inset 0 1px 1px 0 rgba(255, 255, 255, 0.4); background: #a46497; - background: linear-gradient( to bottom, #a46497, #66405f ), #a46497; + background: linear-gradient(to bottom, #a46497, #66405f), #a46497; transition: width 1s ease; } progress::-ms-fill { border-radius: 3px; - box-shadow: inset 0 1px 1px 0 rgba( 255, 255, 255, 0.4 ); + box-shadow: inset 0 1px 1px 0 rgba(255, 255, 255, 0.4); background: #a46497; - background: linear-gradient( to bottom, #a46497, #66405f ), #a46497; + background: linear-gradient(to bottom, #a46497, #66405f), #a46497; transition: width 1s ease; } @@ -7701,8 +7733,8 @@ table.bar_chart { } } - tbody tr:nth-child( odd ) td, - tbody tr:nth-child( odd ) th { + tbody tr:nth-child(odd) td, + tbody tr:nth-child(odd) th { background: #fbfbfb; } @@ -7748,7 +7780,7 @@ table.bar_chart { line-height: 1.75em; &::before { - @include icon( '\e015' ); + @include icon("\e015"); color: #a16696; position: static; font-size: 100px; @@ -7790,7 +7822,7 @@ table.bar_chart { } } -@media screen and ( min-width: 600px ) { +@media screen and (min-width: 600px) { .wc-addons-wrap { .marketplace-header { padding-left: 84px; @@ -7814,13 +7846,13 @@ table.bar_chart { } } -@media screen and ( min-width: 961px ) { +@media screen and (min-width: 961px) { .marketplace-header__tabs { margin-left: 84px; } } -@media screen and ( min-width: 1024px ) { +@media screen and (min-width: 1024px) { .current-section-name { display: none; } @@ -7895,7 +7927,6 @@ table.bar_chart { * Product Reviews */ .wp-list-table.product-reviews { - .column-author { width: 20%; } @@ -7904,7 +7935,7 @@ table.bar_chart { width: 10%; } - @media screen and ( max-width: 782px ) { + @media screen and (max-width: 782px) { th.column-type, td.column-type, th.column-author, @@ -7955,6 +7986,6 @@ table.bar_chart { } #post-status-info { margin: 0px 12px 12px; - width: calc( 100% - 24px ); + width: calc(100% - 24px); } } diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js index b4ddb08d186..4d43ad94999 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js @@ -126,7 +126,11 @@ jQuery( function ( $ ) { * @param {Int} qty */ reload: function () { - wc_meta_boxes_product_variations_ajax.load_variations( 1 ); + wc_meta_boxes_product_variations_ajax + .load_variations( 1 ) + .then( + wc_meta_boxes_product_variations_ajax.show_hide_variation_empty_state + ); wc_meta_boxes_product_variations_pagenav.set_paginav( 0 ); }, @@ -655,6 +659,18 @@ jQuery( function ( $ ) { 'a.do_variation_action', this.do_variation_action ); + + $( '.wc-metaboxes-wrapper' ).on( + 'click', + 'button.generate_variations', + this.generate_variations + ); + + $( '.wc-metaboxes-wrapper' ).on( + 'click', + 'button.add_variation_manually', + this.add_variation_manually + ); }, /** @@ -726,41 +742,50 @@ jQuery( function ( $ ) { * @param {Int} per_page (default: 10) */ load_variations: function ( page, per_page ) { - page = page || 1; - per_page = - per_page || - woocommerce_admin_meta_boxes_variations.variations_per_page; + return new Promise( ( resolve, reject ) => { + page = page || 1; + per_page = + per_page || + woocommerce_admin_meta_boxes_variations.variations_per_page; - var wrapper = $( '#variable_product_options' ).find( - '.woocommerce_variations' - ); + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ); - wc_meta_boxes_product_variations_ajax.block(); + wc_meta_boxes_product_variations_ajax.block(); - $.ajax( { - url: woocommerce_admin_meta_boxes_variations.ajax_url, - data: { - action: 'woocommerce_load_variations', - security: - woocommerce_admin_meta_boxes_variations.load_variations_nonce, - product_id: woocommerce_admin_meta_boxes_variations.post_id, - attributes: wrapper.data( 'attributes' ), - page: page, - per_page: per_page, - }, - type: 'POST', - success: function ( response ) { - wrapper - .empty() - .append( response ) - .attr( 'data-page', page ); + $.ajax( { + url: woocommerce_admin_meta_boxes_variations.ajax_url, + data: { + action: 'woocommerce_load_variations', + security: + woocommerce_admin_meta_boxes_variations.load_variations_nonce, + product_id: + woocommerce_admin_meta_boxes_variations.post_id, + attributes: wrapper.data( 'attributes' ), + page: page, + per_page: per_page, + }, + type: 'POST', + success: function ( response ) { + wrapper + .empty() + .append( response ) + .attr( 'data-page', page ); - $( '#woocommerce-product-data' ).trigger( - 'woocommerce_variations_loaded' - ); + $( '#woocommerce-product-data' ).trigger( + 'woocommerce_variations_loaded' + ); - wc_meta_boxes_product_variations_ajax.unblock(); - }, + wc_meta_boxes_product_variations_ajax.unblock(); + + resolve( response ); + }, + error: function ( jqXHR, textStatus, errorThrown ) { + wc_meta_boxes_product_variations_ajax.unblock(); + reject( { jqXHR, textStatus, errorThrown } ); + }, + } ); } ); }, @@ -972,6 +997,7 @@ jQuery( function ( $ ) { 'woocommerce_variations_added', 1 ); + wc_meta_boxes_product_variations_ajax.show_hide_variation_empty_state(); wc_meta_boxes_product_variations_ajax.unblock(); } ); @@ -1104,6 +1130,8 @@ jQuery( function ( $ ) { ); } + wc_meta_boxes_product_variations_ajax.show_hide_variation_empty_state(); + if ( count > 0 ) { wc_meta_boxes_product_variations_pagenav.go_to_page( 1, @@ -1173,12 +1201,6 @@ jQuery( function ( $ ) { value; switch ( do_variation_action ) { - case 'add_variation': - wc_meta_boxes_product_variations_ajax.add_variation(); - return; - case 'link_all_variations': - wc_meta_boxes_product_variations_ajax.link_all_variations(); - return; case 'delete_all': if ( window.confirm( @@ -1311,6 +1333,38 @@ jQuery( function ( $ ) { }, } ); }, + + /** + * Show/hide variation empty state + */ + show_hide_variation_empty_state: function () { + var wrapper = $( '#variable_product_options' ).find( + '.woocommerce_variations' + ); + if ( parseInt( wrapper.attr( 'data-total' ) ) > 0 ) { + $( '.add-variation-container' ).addClass( 'hidden' ); + $( '#field_to_edit' ).removeClass( 'hidden' ); + $( 'a.do_variation_action' ).removeClass( 'hidden' ); + } else { + $( '.add-variation-container' ).removeClass( 'hidden' ); + $( '#field_to_edit' ).addClass( 'hidden' ); + $( 'a.do_variation_action' ).addClass( 'hidden' ); + } + }, + + /** + * Generate variations + */ + generate_variations: function () { + wc_meta_boxes_product_variations_ajax.link_all_variations(); + }, + + /** + * Add variation + */ + add_variation_manually: function () { + wc_meta_boxes_product_variations_ajax.add_variation(); + }, }; /** @@ -1397,7 +1451,7 @@ jQuery( function ( $ ) { if ( page_nav.is( ':hidden' ) ) { $( 'option, optgroup', '.variation_actions' ).show(); - $( '.variation_actions' ).val( 'add_variation' ); + $( '.variation_actions' ).val( 'delete_all' ); $( '#variable_product_options' ).find( '.toolbar' ).show(); page_nav.show(); $( '.pagination-links', page_nav ).hide(); @@ -1444,13 +1498,13 @@ jQuery( function ( $ ) { toolbar.not( '.toolbar-top, .toolbar-buttons' ).hide(); page_nav.hide(); $( 'option, optgroup', variation_action ).hide(); - $( '.variation_actions' ).val( 'add_variation' ); + $( '.variation_actions' ).val( 'delete_all' ); $( 'option[data-global="true"]', variation_action ).show(); } else { toolbar.show(); page_nav.show(); $( 'option, optgroup', variation_action ).show(); - $( '.variation_actions' ).val( 'add_variation' ); + $( '.variation_actions' ).val( 'delete_all' ); // Show/hide links if ( 1 === total_pages ) { @@ -1536,7 +1590,11 @@ jQuery( function ( $ ) { selected, parseInt( wrapper.attr( 'data-total_pages' ), 10 ) ); - wc_meta_boxes_product_variations_ajax.load_variations( selected ); + wc_meta_boxes_product_variations_ajax + .load_variations( selected ) + .then( + wc_meta_boxes_product_variations_ajax.show_hide_variation_empty_state() + ); }, /** diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php index 1b85eb444b3..06507a54061 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php @@ -9,7 +9,9 @@ if ( ! defined( 'ABSPATH' ) ) { exit; } -$add_attributes_icon_url = WC_ADMIN_IMAGES_FOLDER_URL . '/icons/info.svg'; +$add_attributes_img_url = WC_ADMIN_IMAGES_FOLDER_URL . '/icons/info.svg'; +$background_img_url = WC_ADMIN_IMAGES_FOLDER_URL . '/product_data/no-variation-background-image.svg'; +$arrow_img_url = WC_ADMIN_IMAGES_FOLDER_URL . '/product_data/no-variation-arrow.svg'; ?>

  • - + Date: Mon, 3 Apr 2023 12:51:23 -0400 Subject: [PATCH 1307/1680] Updating core pull request template (#37555) Streamlining the pull request template by removing checkboxes --- .github/PULL_REQUEST_TEMPLATE.md | 30 ++++++++---------------------- 1 file changed, 8 insertions(+), 22 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 3b1ff6841c6..0ff2173615b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,10 +1,9 @@ -### All Submissions: +### Submission Review Guidelines: -- [ ] Have you followed the [WooCommerce Contributing guideline](https://github.com/woocommerce/woocommerce/blob/trunk/.github/CONTRIBUTING.md)? -- [ ] Does your code follow the [WordPress' coding standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards/)? -- [ ] Have you checked to ensure there aren't other open [Pull Requests](https://github.com/woocommerce/woocommerce/pulls) for the same update/change? - - +- I have followed the [WooCommerce Contributing Guidelines](https://github.com/woocommerce/woocommerce/blob/trunk/.github/CONTRIBUTING.md) and the [WordPress Coding Standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards/). +- I have checked to ensure there aren't other open [Pull Requests](https://github.com/woocommerce/woocommerce/pulls) for the same update/change. +- I have reviewed my code for [security best practices](https://developer.wordpress.org/apis/security/). +- Following the above guidelines will result in quick merges and clear and detailed feedback when appropriate. @@ -18,25 +17,12 @@ Closes # . ### How to test the changes in this Pull Request: - + -- [ ] Have you followed the [Writing high-quality testing instructions guide](https://github.com/woocommerce/woocommerce/wiki/Writing-high-quality-testing-instructions)? +Using the [WooCommerce Testing Instructions Guide](https://github.com/woocommerce/woocommerce/wiki/Writing-high-quality-testing-instructions), include your detailed testing instructions: 1. 2. 3. - - -### Other information: - -- [ ] Have you added an explanation of what your changes do and why you'd like us to include them? -- [ ] Have you written new tests for your changes, as applicable? -- [ ] Have you created a changelog file for each project being changed, ie `pnpm --filter= changelog add`? -- [ ] Have you included testing instructions? - - - -### FOR PR REVIEWER ONLY: - -- [ ] I have reviewed that everything is sanitized/escaped appropriately for any SQL or XSS injection possibilities. I made sure Linting is not ignored or disabled. + \ No newline at end of file From 1384a54a98a5e112c945068137836d1cf2a59db8 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:17:33 -0700 Subject: [PATCH 1308/1680] Correct development blog link. --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3e3b424196e..7421d61af09 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -7,7 +7,7 @@ There are many ways to contribute to the project! - [Translating strings into your language](https://github.com/woocommerce/woocommerce/wiki/Translating-WooCommerce). - Answering questions on the various WooCommerce communities like the [WP.org support forums](https://wordpress.org/support/plugin/woocommerce/). - Testing open [issues](https://github.com/woocommerce/woocommerce/issues) or [pull requests](https://github.com/woocommerce/woocommerce/pulls) and sharing your findings in a comment. -- Testing WooCommerce beta versions and release candidates. Those are announced in the [WooCommerce development blog](https://woocommerce.wordpress.com/). +- Testing WooCommerce beta versions and release candidates. Those are announced in the [WooCommerce development blog](https://developer.woocommerce.com/blog/). - Submitting fixes, improvements, and enhancements. - To disclose a security issue to our team, [please submit a report via HackerOne](https://hackerone.com/automattic/). From 5d0cf7e84481121e6182574077784c7df8734d6f Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:20:53 -0700 Subject: [PATCH 1309/1680] Update links to GitHub articles. --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 7421d61af09..a194a64876e 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -11,7 +11,7 @@ There are many ways to contribute to the project! - Submitting fixes, improvements, and enhancements. - To disclose a security issue to our team, [please submit a report via HackerOne](https://hackerone.com/automattic/). -If you wish to contribute code, please read the information in the sections below. Then [fork](https://help.github.com/articles/fork-a-repo/) WooCommerce, commit your changes, and [submit a pull request](https://help.github.com/articles/using-pull-requests/) 🎉 +If you wish to contribute code, please read the information in the sections below. Then [fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo) WooCommerce, commit your changes, and [submit a pull request](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) 🎉 We use the `good first issue` label to mark issues that are suitable for new contributors. You can find all the issues with this label [here](https://github.com/woocommerce/woocommerce/issues?q=is%3Aopen+is%3Aissue+label%3A%22type%3A+good+first+issue%22). From 766aaea48e5b3677c500eb815aa7bbdb2d9a3652 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:28:17 -0700 Subject: [PATCH 1310/1680] No need for a one-item bulleted list. --- .github/CONTRIBUTING.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index a194a64876e..ecde5853704 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -41,9 +41,8 @@ If you have questions about the process to contribute code or want to discuss de - Make sure to write good and detailed commit messages (see [this post](https://chris.beams.io/posts/git-commit/) for more on this) and follow all the applicable sections of the pull request template. - Please avoid modifying the changelog directly or updating the .pot files. These will be updated by the WooCommerce team. -If you are contributing code to the (Javascript-driven) Gutenberg blocks, note that it's developed in an external package. - -- [Blocks](https://github.com/woocommerce/woocommerce-gutenberg-products-block) +If you are contributing code to our (Javascript-driven) Gutenberg blocks, please note that +they are developed in their [own repository](https://github.com/woocommerce/woocommerce-gutenberg-products-block) and have their [own issue tracker](https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues). ## Feature Requests 🚀 From 79cda9aa297b267c10e35f9c47eafa8aca99f5af Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:29:03 -0700 Subject: [PATCH 1311/1680] Revise feature request guidance. --- .github/CONTRIBUTING.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index ecde5853704..89336e7ac00 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -46,8 +46,6 @@ they are developed in their [own repository](https://github.com/woocommerce/wooc ## Feature Requests 🚀 -Feature requests can be [submitted to our issue tracker](https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=type%3A+enhancement%2Cstatus%3A+awaiting+triage&template=2-enhancement.yml&title=%5BEnhancement%5D%3A+). Be sure to include a description of the expected behavior and use case, and before submitting a request, please search for similar ones in the closed issues. +The best place to submit feature requests is over on our [dedicated feature request page](https://woocommerce.com/feature-requests/woocommerce/). You can easily search and vote for existing requests, or create new requests if necessary. -Feature request issues will remain closed until we see sufficient interest via comments and [👍 reactions](https://help.github.com/articles/about-discussions-in-issues-and-pull-requests/) from the community. - -You can see a [list of current feature requests which require votes here](https://github.com/woocommerce/woocommerce/issues?q=is%3Aissue+sort%3Areactions-%2B1-desc+label%3A%22needs%3A+votes%22+). +Alternatively, if you wish to propose a straightforward technical enhancement that is unlikely to require much discussion, you can [open a new issue](https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=type%3A+enhancement%2Cstatus%3A+awaiting+triage&template=2-enhancement.yml&title=%5BEnhancement%5D%3A+) right here on GitHub. From 67570fd420ac988a18d5994576d6a75c3b35e5e3 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:33:13 -0700 Subject: [PATCH 1312/1680] Punctuation. --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 89336e7ac00..e0f75e2b3e1 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -31,7 +31,7 @@ If you have questions about the process to contribute code or want to discuss de ## Coding Guidelines and Development 🛠 -- Ensure you stick to the [WordPress Coding Standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/) +- Ensure you stick to the [WordPress Coding Standards](https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/). - Run our build process described in the document on [how to set up WooCommerce development environment](https://github.com/woocommerce/woocommerce/wiki/How-to-set-up-WooCommerce-development-environment), it will install our pre-commit hook, code sniffs, dependencies, and more. - Whenever possible please fix pre-existing code standards errors in the files that you change. It is ok to skip that for larger files or complex fixes. - Ensure you use LF line endings in your code editor. Use [EditorConfig](http://editorconfig.org/) if your editor supports it so that indentation, line endings and other settings are auto configured. From 25dc06dbbe527d703b924d43bc77c25a0a2cf746 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 11:37:26 -0700 Subject: [PATCH 1313/1680] Clarify changelog procedure. --- .github/CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e0f75e2b3e1..3315bd462b8 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -39,7 +39,8 @@ If you have questions about the process to contribute code or want to discuss de - Ensure that your code supports the minimum supported versions of PHP and WordPress; this is shown at the top of the `readme.txt` file. - Push the changes to your fork and submit a pull request on the trunk branch of the WooCommerce repository. - Make sure to write good and detailed commit messages (see [this post](https://chris.beams.io/posts/git-commit/) for more on this) and follow all the applicable sections of the pull request template. -- Please avoid modifying the changelog directly or updating the .pot files. These will be updated by the WooCommerce team. +- Please add a changelog entry by following the steps detailed in the [development guide](https://github.com/woocommerce/woocommerce/blob/trunk/DEVELOPMENT.md), but do not modify `changelog.txt` directly. +- Please do not update any `.pot` files. These will be updated by the WooCommerce team. If you are contributing code to our (Javascript-driven) Gutenberg blocks, please note that they are developed in their [own repository](https://github.com/woocommerce/woocommerce-gutenberg-products-block) and have their [own issue tracker](https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues). From b156651243bf611d9dc30592c2a93ad444efe038 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 3 Apr 2023 13:55:30 -0500 Subject: [PATCH 1314/1680] Use backticks for JOIN on OrdersTableQuery --- .../src/Internal/DataStores/Orders/OrdersTableQuery.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php index 92148b218c6..f62dff69b4e 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php @@ -755,9 +755,9 @@ class OrdersTableQuery { if ( empty( $on ) ) { if ( $this->tables['orders'] === $table ) { - $on = "{$this->tables['orders']}.id = {$alias}.id"; + $on = "`{$this->tables['orders']}`.id = `{$alias}`.id"; } else { - $on = "{$this->tables['orders']}.id = {$alias}.order_id"; + $on = "`{$this->tables['orders']}`.id = `{$alias}`.order_id"; } } @@ -775,8 +775,8 @@ class OrdersTableQuery { } $sql_join = ''; - $sql_join .= "{$join_type} JOIN {$table} "; - $sql_join .= ( $alias !== $table ) ? "AS {$alias} " : ''; + $sql_join .= "{$join_type} JOIN `{$table}` "; + $sql_join .= ( $alias !== $table ) ? "AS `{$alias}` " : ''; $sql_join .= "ON ( {$on} )"; $this->join[ $alias ] = $sql_join; From 35bbb0c9206708a7eed4e8fc8c4a070c1a114ddb Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 3 Apr 2023 13:55:38 -0500 Subject: [PATCH 1315/1680] Re-use aliases from OrdersTableQuery for field queries --- .../src/Internal/DataStores/Orders/OrdersTableFieldQuery.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableFieldQuery.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableFieldQuery.php index 83bee65d254..bc77c5a30fe 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableFieldQuery.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableFieldQuery.php @@ -246,7 +246,7 @@ class OrdersTableFieldQuery { $this->table_aliases[] = $alias; if ( $join ) { - $this->join[] = $join; + $this->join[ $alias ] = $join; } return $alias; From 2cd5cdcc8c2c423dd0d72f718d1e87aa76441e4b Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 3 Apr 2023 13:56:27 -0500 Subject: [PATCH 1316/1680] Add changelog --- plugins/woocommerce/changelog/fix-37173 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-37173 diff --git a/plugins/woocommerce/changelog/fix-37173 b/plugins/woocommerce/changelog/fix-37173 new file mode 100644 index 00000000000..a8e167ce10b --- /dev/null +++ b/plugins/woocommerce/changelog/fix-37173 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix table alias issue in order field queries. From ac343d08d3c35b7901c682a7c76e12a25fdd1e09 Mon Sep 17 00:00:00 2001 From: jonathansadowski Date: Mon, 3 Apr 2023 13:57:27 -0500 Subject: [PATCH 1317/1680] Add info about changelog tool to contributor guide (#37556) * Add info about changelog tool to contributor guide * Update .github/CONTRIBUTING.md Co-authored-by: Leif Singer --------- Co-authored-by: Leif Singer --- .github/CONTRIBUTING.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3e3b424196e..5dfdfc34c42 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -39,7 +39,8 @@ If you have questions about the process to contribute code or want to discuss de - Ensure that your code supports the minimum supported versions of PHP and WordPress; this is shown at the top of the `readme.txt` file. - Push the changes to your fork and submit a pull request on the trunk branch of the WooCommerce repository. - Make sure to write good and detailed commit messages (see [this post](https://chris.beams.io/posts/git-commit/) for more on this) and follow all the applicable sections of the pull request template. -- Please avoid modifying the changelog directly or updating the .pot files. These will be updated by the WooCommerce team. +- Please create a change file for your changes by running `pnpm --filter= changelog add`. For example, a change file for the WooCommerce Core project would be added by running `pnpm --filter=woocommerce changelog add`. +- Please avoid modifying the changelog directly or updating the .pot files. These will be updated by the WooCommerce team. If you are contributing code to the (Javascript-driven) Gutenberg blocks, note that it's developed in an external package. From 56c4741757ec13ed301909da5209c159b25d38eb Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Mon, 3 Apr 2023 12:01:07 -0700 Subject: [PATCH 1318/1680] Formatting. --- .github/CONTRIBUTING.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 3315bd462b8..94ac442fe9c 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -42,8 +42,7 @@ If you have questions about the process to contribute code or want to discuss de - Please add a changelog entry by following the steps detailed in the [development guide](https://github.com/woocommerce/woocommerce/blob/trunk/DEVELOPMENT.md), but do not modify `changelog.txt` directly. - Please do not update any `.pot` files. These will be updated by the WooCommerce team. -If you are contributing code to our (Javascript-driven) Gutenberg blocks, please note that -they are developed in their [own repository](https://github.com/woocommerce/woocommerce-gutenberg-products-block) and have their [own issue tracker](https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues). +If you are contributing code to our (Javascript-driven) Gutenberg blocks, please note that they are developed in their [own repository](https://github.com/woocommerce/woocommerce-gutenberg-products-block) and have their [own issue tracker](https://github.com/woocommerce/woocommerce-gutenberg-products-block/issues). ## Feature Requests 🚀 From 6291d10112c9467f57c5b0df655b694fde08d730 Mon Sep 17 00:00:00 2001 From: Nathan Silveira Date: Tue, 4 Apr 2023 09:28:19 -0300 Subject: [PATCH 1319/1680] Use SelectTree component in Category field (#37479) * Migrate category field to TreeSelect * Rename and refactor some props due to changes in SelectTree that were introduced afterwards * add Changelog * Rename type to a better name * Add tests to select-tree and remove tests from category-field * Restore ts change that broke build * Run linter * Fix broken tests * Update test * Import from wordpress instead of react --- .../changelog/update-migrate-category-field | 5 + .../test/select-tree.test.tsx | 107 +++++++ .../changelog/update-migrate-category-field | 4 + .../category-field-item.tsx | 12 +- .../category-field.tsx | 250 ++++++--------- .../create-category-modal.tsx | 10 +- .../details-categories-field.tsx | 7 +- .../test/category-field.test.tsx | 284 ++---------------- .../use-category-search.ts | 34 ++- 9 files changed, 263 insertions(+), 450 deletions(-) create mode 100644 packages/js/components/changelog/update-migrate-category-field create mode 100644 packages/js/components/src/experimental-select-tree-control/test/select-tree.test.tsx create mode 100644 packages/js/product-editor/changelog/update-migrate-category-field diff --git a/packages/js/components/changelog/update-migrate-category-field b/packages/js/components/changelog/update-migrate-category-field new file mode 100644 index 00000000000..6c8e15c88a6 --- /dev/null +++ b/packages/js/components/changelog/update-migrate-category-field @@ -0,0 +1,5 @@ +Significance: patch +Type: dev +Comment: Add unit tests + + diff --git a/packages/js/components/src/experimental-select-tree-control/test/select-tree.test.tsx b/packages/js/components/src/experimental-select-tree-control/test/select-tree.test.tsx new file mode 100644 index 00000000000..efb87059c6c --- /dev/null +++ b/packages/js/components/src/experimental-select-tree-control/test/select-tree.test.tsx @@ -0,0 +1,107 @@ +import { render } from '@testing-library/react'; +import React, { createElement } from '@wordpress/element'; +import { SelectTree } from '../select-tree'; +import { Item } from '../../experimental-tree-control'; + +const mockItems: Item[] = [ + { + label: 'Item 1', + value: 'item-1', + }, + { + label: 'Item 2', + value: 'item-2', + parent: 'item-1', + }, + { + label: 'Item 3', + value: 'item-3', + }, +]; + +const DEFAULT_PROPS = { + id: 'select-tree', + items: mockItems, + label: 'Select Tree', + placeholder: 'Type here', +}; + +describe( 'SelectTree', () => { + beforeEach( () => { + jest.clearAllMocks(); + } ); + + it( 'should show the popover only when focused', () => { + const { queryByPlaceholderText, queryByText } = render( + + ); + expect( queryByText( 'Item 1' ) ).not.toBeInTheDocument(); + queryByPlaceholderText( 'Type here' )?.focus(); + expect( queryByText( 'Item 1' ) ).toBeInTheDocument(); + } ); + + it( 'should show create button when callback is true ', () => { + const { queryByText, queryByPlaceholderText } = render( + true } + /> + ); + queryByPlaceholderText( 'Type here' )?.focus(); + expect( queryByText( 'Create new' ) ).toBeInTheDocument(); + } ); + it( 'should not show create button when callback is false or no callback', () => { + const { queryByText, queryByPlaceholderText } = render( + + ); + queryByPlaceholderText( 'Type here' )?.focus(); + expect( queryByText( 'Create new' ) ).not.toBeInTheDocument(); + } ); + it( 'should show a root item when focused and child when expand button is clicked', () => { + const { queryByText, queryByLabelText, queryByPlaceholderText } = + render( ); + queryByPlaceholderText( 'Type here' )?.focus(); + expect( queryByText( 'Item 1' ) ).toBeInTheDocument(); + + expect( queryByText( 'Item 2' ) ).not.toBeInTheDocument(); + queryByLabelText( 'Expand' )?.click(); + expect( queryByText( 'Item 2' ) ).toBeInTheDocument(); + } ); + + it( 'should show selected items', () => { + const { queryAllByRole, queryByPlaceholderText } = render( + + ); + queryByPlaceholderText( 'Type here' )?.focus(); + expect( queryAllByRole( 'treeitem' )[ 0 ] ).toHaveAttribute( + 'aria-selected', + 'true' + ); + } ); + + it( 'should show Create "" button', () => { + const { queryByPlaceholderText, queryByText } = render( + true } + /> + ); + queryByPlaceholderText( 'Type here' )?.focus(); + expect( queryByText( 'Create "new item"' ) ).toBeInTheDocument(); + } ); + it( 'should call onCreateNew when Create "" button is clicked', () => { + const mockFn = jest.fn(); + const { queryByPlaceholderText, queryByText } = render( + true } + onCreateNew={ mockFn } + /> + ); + queryByPlaceholderText( 'Type here' )?.focus(); + queryByText( 'Create "new item"' )?.click(); + expect( mockFn ).toBeCalledTimes( 1 ); + } ); +} ); diff --git a/packages/js/product-editor/changelog/update-migrate-category-field b/packages/js/product-editor/changelog/update-migrate-category-field new file mode 100644 index 00000000000..06c9e04e9a2 --- /dev/null +++ b/packages/js/product-editor/changelog/update-migrate-category-field @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Use SelectTree component in product editor's category field diff --git a/packages/js/product-editor/src/components/details-categories-field/category-field-item.tsx b/packages/js/product-editor/src/components/details-categories-field/category-field-item.tsx index 99ae2d273a3..689554220fd 100644 --- a/packages/js/product-editor/src/components/details-categories-field/category-field-item.tsx +++ b/packages/js/product-editor/src/components/details-categories-field/category-field-item.tsx @@ -9,6 +9,11 @@ import { ProductCategory } from '@woocommerce/data'; import { __experimentalSelectControlMenuItemProps as MenuItemProps } from '@woocommerce/components'; import classNames from 'classnames'; +/** + * Internal dependencies + */ +import { ProductCategoryNode } from './use-category-search'; + export type CategoryTreeItem = { data: ProductCategory; children: CategoryTreeItem[]; @@ -19,13 +24,10 @@ export type CategoryTreeItem = { type CategoryFieldItemProps = { item: CategoryTreeItem; selectedIds: number[]; - items: Pick< ProductCategory, 'id' | 'name' >[]; + items: ProductCategoryNode[]; highlightedIndex: number; openParent?: () => void; -} & Pick< - MenuItemProps< Pick< ProductCategory, 'id' | 'name' > >, - 'getItemProps' ->; +} & Pick< MenuItemProps< ProductCategoryNode >, 'getItemProps' >; export const CategoryFieldItem: React.FC< CategoryFieldItemProps > = ( { item, diff --git a/packages/js/product-editor/src/components/details-categories-field/category-field.tsx b/packages/js/product-editor/src/components/details-categories-field/category-field.tsx index e8c8fe1b626..f9160e19180 100644 --- a/packages/js/product-editor/src/components/details-categories-field/category-field.tsx +++ b/packages/js/product-editor/src/components/details-categories-field/category-field.tsx @@ -3,11 +3,8 @@ */ import { useMemo, useState, createElement, Fragment } from '@wordpress/element'; import { - selectControlStateChangeTypes, - Spinner, - __experimentalSelectControl as SelectControl, - __experimentalSelectControlMenuSlot as MenuSlot, - __experimentalSelectControlMenu as Menu, + TreeItemType, + __experimentalSelectTreeControl as SelectTree, } from '@woocommerce/components'; import { ProductCategory } from '@woocommerce/data'; import { debounce } from 'lodash'; @@ -15,16 +12,15 @@ import { debounce } from 'lodash'; /** * Internal dependencies */ -import { CategoryFieldItem, CategoryTreeItem } from './category-field-item'; -import { useCategorySearch } from './use-category-search'; +import { CategoryTreeItem } from './category-field-item'; +import { useCategorySearch, ProductCategoryNode } from './use-category-search'; import { CreateCategoryModal } from './create-category-modal'; -import { CategoryFieldAddNewItem } from './category-field-add-new-item'; type CategoryFieldProps = { label: string; placeholder: string; - value?: Pick< ProductCategory, 'id' | 'name' >[]; - onChange: ( value: Pick< ProductCategory, 'id' | 'name' >[] ) => void; + value?: ProductCategoryNode[]; + onChange: ( value: ProductCategoryNode[] ) => void; }; /** @@ -32,11 +28,11 @@ type CategoryFieldProps = { * if not included already. */ function getSelectedWithParents( - selected: Pick< ProductCategory, 'id' | 'name' >[] = [], + selected: ProductCategoryNode[] = [], item: ProductCategory, treeKeyValues: Record< number, CategoryTreeItem > -): Pick< ProductCategory, 'id' | 'name' >[] { - selected.push( { id: item.id, name: item.name } ); +): ProductCategoryNode[] { + selected.push( { id: item.id, name: item.name, parent: item.parent } ); const parentId = item.parent !== undefined @@ -59,6 +55,33 @@ function getSelectedWithParents( return selected; } +function mapFromCategoryType( + categories: ProductCategoryNode[] +): TreeItemType[] { + return categories.map( ( val ) => + val.parent + ? { + value: String( val.id ), + label: val.name, + parent: String( val.parent ), + } + : { + value: String( val.id ), + label: val.name, + } + ); +} + +function mapToCategoryType( + categories: TreeItemType[] +): ProductCategoryNode[] { + return categories.map( ( cat ) => ( { + id: +cat.value, + name: cat.label, + parent: cat.parent ? +cat.parent : 0, + } ) ); +} + export const CategoryField: React.FC< CategoryFieldProps > = ( { label, placeholder, @@ -70,7 +93,7 @@ export const CategoryField: React.FC< CategoryFieldProps > = ( { categoriesSelectList, categoryTreeKeyValues, searchCategories, - getFilteredItems, + getFilteredItemsForSelectTree, } = useCategorySearch(); const [ showCreateNewModal, setShowCreateNewModal ] = useState( false ); const [ searchValue, setSearchValue ] = useState( '' ); @@ -85,167 +108,62 @@ export const CategoryField: React.FC< CategoryFieldProps > = ( { [ onInputChange ] ); - const onSelect = ( itemId: number, selected: boolean ) => { - if ( itemId === -99 ) { - setShowCreateNewModal( true ); - return; - } - if ( selected ) { - const item = categoryTreeKeyValues[ itemId ].data; - if ( item ) { - onChange( - getSelectedWithParents( - [ ...value ], - item, - categoryTreeKeyValues - ) - ); - } - } else { - onChange( value.filter( ( i ) => i.id !== itemId ) ); - } - }; - - const categoryFieldGetFilteredItems = ( - allItems: Pick< ProductCategory, 'id' | 'name' >[], - inputValue: string, - selectedItems: Pick< ProductCategory, 'id' | 'name' >[] - ) => { - const filteredItems = getFilteredItems( - allItems, - inputValue, - selectedItems - ); - if ( - inputValue.length > 0 && - ! isSearching && - ! filteredItems.find( - ( item ) => item.name.toLowerCase() === inputValue.toLowerCase() - ) - ) { - return [ - ...filteredItems, - { - id: -99, - name: inputValue, - }, - ]; - } - return filteredItems; - }; - - const selectedIds = value.map( ( item ) => item.id ); - return ( <> - > - className="woocommerce-category-field-dropdown components-base-control" + item?.name || '' } - getItemValue={ ( item ) => item?.id || '' } - onSelect={ ( item ) => { - if ( item ) { - onSelect( item.id, ! selectedIds.includes( item.id ) ); - } - } } - onRemove={ ( item ) => item && onSelect( item.id, false ) } + isLoading={ isSearching } onInputChange={ searchDelayed } - getFilteredItems={ categoryFieldGetFilteredItems } placeholder={ value.length === 0 ? placeholder : '' } - stateReducer={ ( state, actionAndChanges ) => { - const { changes, type } = actionAndChanges; - switch ( type ) { - case selectControlStateChangeTypes.ControlledPropUpdatedSelectedItem: - return { - ...changes, - inputValue: state.inputValue, - }; - case selectControlStateChangeTypes.ItemClick: - if ( - changes.selectedItem && - changes.selectedItem.id === -99 - ) { - return changes; - } - return { - ...changes, - isOpen: true, - inputValue: state.inputValue, - highlightedIndex: state.highlightedIndex, - }; - default: - return changes; + onCreateNew={ () => { + setShowCreateNewModal( true ); + } } + shouldShowCreateButton={ ( typedValue ) => + ! typedValue || + categoriesSelectList.findIndex( + ( item ) => item.name === typedValue + ) === -1 + } + items={ getFilteredItemsForSelectTree( + mapFromCategoryType( categoriesSelectList ), + searchValue, + mapFromCategoryType( value ) + ) } + selected={ mapFromCategoryType( value ) } + onSelect={ ( selectedItems ) => { + if ( Array.isArray( selectedItems ) ) { + const newItems: ProductCategoryNode[] = + mapToCategoryType( + selectedItems.filter( + ( { value: selectedItemValue } ) => + ! value.some( + ( item ) => + item.id === +selectedItemValue + ) + ) + ); + onChange( [ ...value, ...newItems ] ); } } } - __experimentalOpenMenuOnFocus - > - { ( { - items, - isOpen, - getMenuProps, - getItemProps, - highlightedIndex, - } ) => { - const rootItems = - items.length > 0 - ? items.filter( - ( item ) => - categoryTreeKeyValues[ item.id ] - ?.parentID === 0 || item.id === -99 - ) - : []; - return ( - - <> - { isSearching ? ( -
  • -
    - -
    -
  • - ) : ( - rootItems.map( ( item ) => { - return item.id === -99 ? ( - - ) : ( - - ); - } ) - ) } - -
    - ); + onRemove={ ( removedItems ) => { + const newValues = Array.isArray( removedItems ) + ? value.filter( + ( item ) => + ! removedItems.some( + ( { value: removedValue } ) => + item.id === +removedValue + ) + ) + : value.filter( + ( item ) => item.id !== +removedItems.value + ); + onChange( newValues ); } } - - + >
    { showCreateNewModal && ( = ( { const [ categoryName, setCategoryName ] = useState( initialCategoryName || '' ); - const [ categoryParent, setCategoryParent ] = useState< Pick< - ProductCategory, - 'id' | 'name' - > | null >( null ); + const [ categoryParent, setCategoryParent ] = + useState< ProductCategoryNode | null >( null ); const onSave = async () => { recordEvent( 'product_category_add', { @@ -94,7 +92,7 @@ export const CreateCategoryModal: React.FC< CreateCategoryModalProps > = ( { value={ categoryName } onChange={ setCategoryName } /> - > + items={ categoriesSelectList } label={ createInterpolateElement( __( 'Parent category ', 'woocommerce' ), diff --git a/packages/js/product-editor/src/components/details-categories-field/details-categories-field.tsx b/packages/js/product-editor/src/components/details-categories-field/details-categories-field.tsx index 0d7b8c7bc06..298633b5d73 100644 --- a/packages/js/product-editor/src/components/details-categories-field/details-categories-field.tsx +++ b/packages/js/product-editor/src/components/details-categories-field/details-categories-field.tsx @@ -3,13 +3,14 @@ */ import { __ } from '@wordpress/i18n'; import { useFormContext } from '@woocommerce/components'; -import { Product, ProductCategory } from '@woocommerce/data'; +import { Product } from '@woocommerce/data'; import { createElement } from '@wordpress/element'; /** * Internal dependencies */ import { CategoryField } from './category-field'; +import { ProductCategoryNode } from './use-category-search'; export const DetailsCategoriesField = () => { const { getInputProps } = useFormContext< Product >(); @@ -18,9 +19,7 @@ export const DetailsCategoriesField = () => { [] >( - 'categories' - ) } + { ...getInputProps< ProductCategoryNode[] >( 'categories' ) } /> ); }; diff --git a/packages/js/product-editor/src/components/details-categories-field/test/category-field.test.tsx b/packages/js/product-editor/src/components/details-categories-field/test/category-field.test.tsx index 840026a8e76..d0616672c2e 100644 --- a/packages/js/product-editor/src/components/details-categories-field/test/category-field.test.tsx +++ b/packages/js/product-editor/src/components/details-categories-field/test/category-field.test.tsx @@ -1,94 +1,17 @@ /** * External dependencies */ -import { ReactElement, Component } from 'react'; -import { render, fireEvent } from '@testing-library/react'; +import { render } from '@testing-library/react'; import { Form, FormContextType } from '@woocommerce/components'; -import { Product, ProductCategory } from '@woocommerce/data'; +import { Product } from '@woocommerce/data'; import { createElement } from '@wordpress/element'; /** * Internal dependencies */ import { CategoryField } from '../category-field'; -import { - getCategoriesTreeWithMissingParents, - useCategorySearch, -} from '../use-category-search'; +import { ProductCategoryNode } from '../use-category-search'; -const mockCategoryList = [ - { id: 1, name: 'Clothing', parent: 0 }, - { id: 2, name: 'Hoodies', parent: 1 }, - { id: 3, name: 'Rain gear', parent: 0 }, -] as ProductCategory[]; - -jest.mock( '@woocommerce/components', () => { - const originalModule = jest.requireActual( '@woocommerce/components' ); - - type ChildrenProps = { - items: ProductCategory[]; - isOpen: boolean; - highlightedIndex: number; - getMenuProps: () => Record< string, string >; - getItemProps: () => Record< string, string >; - selectItem: ( item: ProductCategory ) => void; - setInputValue: ( value: string ) => void; - }; - type SelectControlProps = { - children: ( {}: ChildrenProps ) => ReactElement | Component; - items: ProductCategory[]; - label: string; - initialSelectedItems?: ProductCategory[]; - itemToString?: ( item: ProductCategory | null ) => string; - getFilteredItems?: ( - allItems: ProductCategory[], - inputValue: string, - selectedItems: ProductCategory[] - ) => ProductCategory[]; - multiple?: boolean; - onInputChange?: ( value: string | undefined ) => void; - onRemove?: ( item: ProductCategory ) => void; - onSelect?: ( selected: ProductCategory ) => void; - placeholder?: string; - selected: ProductCategory[]; - }; - - return { - ...originalModule, - __experimentalSelectControlMenu: ( { - children, - }: { - children: JSX.Element; - } ) => children, - __experimentalSelectControl: ( { - children, - items, - selected, - }: SelectControlProps ) => { - return ( -
    - [select-control] -
    - { selected.map( ( item ) => ( -
    { item.name }
    - ) ) } -
    -
    - { children( { - items, - isOpen: true, - getMenuProps: () => ( {} ), - selectItem: () => {}, - highlightedIndex: -1, - setInputValue: () => {}, - getItemProps: () => ( {} ), - } ) } -
    -
    - ); - }, - }; -} ); jest.mock( '@woocommerce/tracks', () => ( { recordEvent: jest.fn() } ) ); jest.mock( '../use-category-search', () => { @@ -98,7 +21,7 @@ jest.mock( '../use-category-search', () => { originalModule.getCategoriesTreeWithMissingParents, useCategorySearch: jest.fn().mockReturnValue( { searchCategories: jest.fn(), - getFilteredItems: jest.fn(), + getFilteredItemsForSelectTree: jest.fn().mockReturnValue( [] ), isSearching: false, categoriesSelectList: [], categoryTreeKeyValues: {}, @@ -112,24 +35,25 @@ describe( 'CategoryField', () => { } ); it( 'should render a dropdown select control', () => { - const { queryByText } = render( + const { queryByText, queryByPlaceholderText } = render( { ( { getInputProps }: FormContextType< Product > ) => ( [] - >( 'categories' ) } + { ...getInputProps< ProductCategoryNode[] >( + 'categories' + ) } /> ) } ); - expect( queryByText( '[select-control]' ) ).toBeInTheDocument(); + queryByPlaceholderText( 'Search or create category…' )?.focus(); + expect( queryByText( 'Create new' ) ).toBeInTheDocument(); } ); it( 'should pass in the selected categories as select control items', () => { - const { queryByText } = render( + const { queryAllByText, queryByPlaceholderText } = render(
    { [] - >( 'categories' ) } + { ...getInputProps< ProductCategoryNode[] >( + 'categories' + ) } /> ) } ); - expect( queryByText( 'Test' ) ).toBeInTheDocument(); - expect( queryByText( 'Clothing' ) ).toBeInTheDocument(); - } ); - - describe( 'search values', () => { - beforeEach( async () => { - const items = await getCategoriesTreeWithMissingParents( - mockCategoryList, - '' - ); - ( useCategorySearch as jest.Mock ).mockReturnValue( { - searchCategories: jest.fn(), - getFilteredItems: jest.fn(), - isSearching: false, - categoriesSelectList: items[ 0 ], - categoryTreeKeyValues: items[ 2 ], - } ); - } ); - - it( 'should display only the parent categories passed in to the categoriesSelectList', () => { - const { queryByText } = render( -
    - { ( { getInputProps }: FormContextType< Product > ) => ( - [] - >( 'categories' ) } - /> - ) } - - ); - expect( - queryByText( mockCategoryList[ 0 ].name ) - ).toBeInTheDocument(); - const childParent = queryByText( - mockCategoryList[ 1 ].name - )?.parentElement?.closest( - '.woocommerce-category-field-dropdown__item-children' - ); - expect( childParent ).toBeInTheDocument(); - expect( childParent?.className ).not.toMatch( - 'woocommerce-category-field-dropdown__item-open' - ); - expect( - queryByText( mockCategoryList[ 2 ].name ) - ).toBeInTheDocument(); - } ); - - it( 'should show selected categories as selected', () => { - const { getByLabelText } = render( -
    - { ( { getInputProps }: FormContextType< Product > ) => ( - [] - >( 'categories' ) } - /> - ) } - - ); - const rainGearCheckbox = getByLabelText( - mockCategoryList[ 2 ].name - ); - expect( rainGearCheckbox ).toBeChecked(); - const clothingCheckbox = getByLabelText( - mockCategoryList[ 0 ].name - ); - expect( clothingCheckbox ).not.toBeChecked(); - } ); - - it( 'should show selected categories as selected', () => { - const { getByLabelText } = render( -
    - { ( { getInputProps }: FormContextType< Product > ) => ( - [] - >( 'categories' ) } - /> - ) } - - ); - const rainGearCheckbox = getByLabelText( - mockCategoryList[ 2 ].name - ); - expect( rainGearCheckbox ).toBeChecked(); - const clothingCheckbox = getByLabelText( - mockCategoryList[ 0 ].name - ); - expect( clothingCheckbox ).not.toBeChecked(); - } ); - - it( 'should include a toggle icon for parents that contain children', () => { - const { getByLabelText } = render( -
    - { ( { getInputProps }: FormContextType< Product > ) => ( - [] - >( 'categories' ) } - /> - ) } - - ); - const rainGearCheckboxParent = getByLabelText( - mockCategoryList[ 0 ].name - ).parentElement?.closest( - '.woocommerce-category-field-dropdown__item-content' - ); - - expect( - rainGearCheckboxParent?.querySelector( 'svg' ) - ).toBeInTheDocument(); - } ); - - it( 'should allow user to toggle the parents using the svg button', () => { - const { getByLabelText, queryByText } = render( -
    - { ( { getInputProps }: FormContextType< Product > ) => ( - [] - >( 'categories' ) } - /> - ) } - - ); - const rainGearCheckboxParent = getByLabelText( - mockCategoryList[ 0 ].name - ).parentElement?.closest( - '.woocommerce-category-field-dropdown__item-content' - ); - - const toggle = rainGearCheckboxParent?.querySelector( 'svg' ); - if ( toggle ) { - fireEvent.click( toggle ); - } - const childParent = queryByText( - mockCategoryList[ 1 ].name - )?.parentElement?.closest( - '.woocommerce-category-field-dropdown__item-children' - ); - expect( childParent ).toBeInTheDocument(); - expect( childParent?.className ).toMatch( - 'woocommerce-category-field-dropdown__item-open' - ); - } ); + queryByPlaceholderText( 'Search or create category…' )?.focus(); + expect( queryAllByText( 'Test' ) ).toHaveLength( 2 ); + expect( queryAllByText( 'Clothing' ) ).toHaveLength( 2 ); } ); } ); diff --git a/packages/js/product-editor/src/components/details-categories-field/use-category-search.ts b/packages/js/product-editor/src/components/details-categories-field/use-category-search.ts index 26ef004384c..cfd5b14a774 100644 --- a/packages/js/product-editor/src/components/details-categories-field/use-category-search.ts +++ b/packages/js/product-editor/src/components/details-categories-field/use-category-search.ts @@ -9,6 +9,7 @@ import { ProductCategory, } from '@woocommerce/data'; import { escapeRegExp } from 'lodash'; +import { TreeItemType } from '@woocommerce/components'; /** * Internal dependencies @@ -33,6 +34,11 @@ function openParents( } } +export type ProductCategoryNode = Pick< + ProductCategory, + 'id' | 'name' | 'parent' +>; + /** * Sort function for category tree items, sorts by popularity and then alphabetically. */ @@ -256,9 +262,9 @@ export const useCategorySearch = () => { */ const getFilteredItems = useCallback( ( - allItems: Pick< ProductCategory, 'id' | 'name' >[], + allItems: ProductCategoryNode[], inputValue: string, - selectedItems: Pick< ProductCategory, 'id' | 'name' >[] + selectedItems: ProductCategoryNode[] ) => { const searchRegex = new RegExp( escapeRegExp( inputValue ), 'i' ); return allItems.filter( @@ -272,9 +278,33 @@ export const useCategorySearch = () => { [ categoriesAndNewItem ] ); + /** + * this is the same as getFilteredItems but for the SelectTree component, where item id is a string. + * After all the occurrences of getFilteredItems are migrated to use SelectTree, + * this can become the standard version + */ + const getFilteredItemsForSelectTree = useCallback( + ( + allItems: TreeItemType[], + inputValue: string, + selectedItems: TreeItemType[] + ) => { + const searchRegex = new RegExp( escapeRegExp( inputValue ), 'i' ); + return allItems.filter( + ( item ) => + selectedItems.indexOf( item ) < 0 && + ( searchRegex.test( item.label ) || + ( categoryTreeKeyValues[ +item.value ] && + categoryTreeKeyValues[ +item.value ].isOpen ) ) + ); + }, + [ categoriesAndNewItem ] + ); + return { searchCategories, getFilteredItems, + getFilteredItemsForSelectTree, categoriesSelectList: categoriesAndNewItem[ 0 ], categories: categoriesAndNewItem[ 1 ], isSearching, From f7572b436162b033cc73c2ccdabea777387774da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Tue, 4 Apr 2023 11:30:39 -0400 Subject: [PATCH 1320/1680] Move the Save draft and Preview buttons to the product editor header (#37461) * Add preview button to the product editor header * Publish the product on add or on save * Add save draft button * Save product changes before previewing it * Add notice messages * Fix linter errors * Force the store page to be openned in a new tab after publishing the product * Enable publish button when the status is not publish * Add changelog files * Fix some comment typos * Address comment suggestions * Move preview logic to its own component * Move save draft logic to its own component * Move publish logic to its own component --- .../js/product-editor/changelog/add-37249 | 4 + .../src/components/editor/editor.tsx | 7 +- .../src/components/header/header.tsx | 79 ++-------- .../header/hooks/use-preview/index.ts | 1 + .../header/hooks/use-preview/use-preview.tsx | 140 ++++++++++++++++++ .../header/hooks/use-publish/index.ts | 1 + .../header/hooks/use-publish/use-publish.tsx | 105 +++++++++++++ .../header/hooks/use-save-draft/index.ts | 1 + .../hooks/use-save-draft/use-save-draft.tsx | 109 ++++++++++++++ .../components/header/preview-button/index.ts | 1 + .../header/preview-button/preview-button.tsx | 47 ++++++ .../components/header/publish-button/index.ts | 1 + .../header/publish-button/publish-button.tsx | 72 +++++++++ .../header/save-draft-button/index.ts | 1 + .../save-draft-button/save-draft-button.tsx | 49 ++++++ .../client/stylesheets/shared/_global.scss | 2 +- plugins/woocommerce/changelog/add-37249 | 4 + 17 files changed, 554 insertions(+), 70 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37249 create mode 100644 packages/js/product-editor/src/components/header/hooks/use-preview/index.ts create mode 100644 packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx create mode 100644 packages/js/product-editor/src/components/header/hooks/use-publish/index.ts create mode 100644 packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx create mode 100644 packages/js/product-editor/src/components/header/hooks/use-save-draft/index.ts create mode 100644 packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx create mode 100644 packages/js/product-editor/src/components/header/preview-button/index.ts create mode 100644 packages/js/product-editor/src/components/header/preview-button/preview-button.tsx create mode 100644 packages/js/product-editor/src/components/header/publish-button/index.ts create mode 100644 packages/js/product-editor/src/components/header/publish-button/publish-button.tsx create mode 100644 packages/js/product-editor/src/components/header/save-draft-button/index.ts create mode 100644 packages/js/product-editor/src/components/header/save-draft-button/save-draft-button.tsx create mode 100644 plugins/woocommerce/changelog/add-37249 diff --git a/packages/js/product-editor/changelog/add-37249 b/packages/js/product-editor/changelog/add-37249 new file mode 100644 index 00000000000..9bcccfd3224 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37249 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add action buttons to the editor header diff --git a/packages/js/product-editor/src/components/editor/editor.tsx b/packages/js/product-editor/src/components/editor/editor.tsx index 94a4e36e871..9d475b542ee 100644 --- a/packages/js/product-editor/src/components/editor/editor.tsx +++ b/packages/js/product-editor/src/components/editor/editor.tsx @@ -48,12 +48,7 @@ export function Editor( { product, settings }: EditorProps ) { - } + header={
    } content={ <> { - const { isSavingEntityRecord, getEditedEntityRecord } = - select( 'core' ); - const { isPostSavingLocked } = select( 'core/editor' ); - - const product: Product = getEditedEntityRecord( - 'postType', - 'product', - productId - ); - - return { - isProductLocked: isPostSavingLocked(), - isSaving: isSavingEntityRecord( - 'postType', - 'product', - productId - ), - editedProductName: product?.name, - }; - }, - [ productId ] +export function Header( { productName }: HeaderProps ) { + const [ editedProductName ] = useEntityProp< string >( + 'postType', + 'product', + 'name' ); - const isDisabled = isProductLocked || isSaving; - const isCreating = productName === AUTO_DRAFT_NAME; - - const { saveEditedEntityRecord } = useDispatch( 'core' ); - - function handleSave() { - saveEditedEntityRecord< Product >( - 'postType', - 'product', - productId - ).then( ( response ) => { - if ( isCreating ) { - navigateTo( { - url: getNewPath( {}, `/product/${ response.id }` ), - } ); - } - } ); - } - return (
    - + + + + + +
    diff --git a/packages/js/product-editor/src/components/header/hooks/use-preview/index.ts b/packages/js/product-editor/src/components/header/hooks/use-preview/index.ts new file mode 100644 index 00000000000..872825f555c --- /dev/null +++ b/packages/js/product-editor/src/components/header/hooks/use-preview/index.ts @@ -0,0 +1 @@ +export * from './use-preview'; diff --git a/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx b/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx new file mode 100644 index 00000000000..a2bbecdc43d --- /dev/null +++ b/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx @@ -0,0 +1,140 @@ +/** + * External dependencies + */ +import { Product, ProductStatus } from '@woocommerce/data'; +import { Button } from '@wordpress/components'; +import { useEntityProp } from '@wordpress/core-data'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { useRef } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { MouseEvent } from 'react'; + +export function usePreview( { + disabled, + onClick, + onSaveSuccess, + onSaveError, + ...props +}: Omit< Button.AnchorProps, 'aria-disabled' | 'variant' | 'href' > & { + onSaveSuccess?( product: Product ): void; + onSaveError?( error: Error ): void; +} ): Button.AnchorProps { + const anchorRef = useRef< HTMLAnchorElement >(); + + const [ productId ] = useEntityProp< number >( + 'postType', + 'product', + 'id' + ); + const [ productStatus ] = useEntityProp< ProductStatus | 'auto-draft' >( + 'postType', + 'product', + 'status' + ); + const [ permalink ] = useEntityProp< string >( + 'postType', + 'product', + 'permalink' + ); + + const { hasEdits, isDisabled } = useSelect( + ( select ) => { + const { hasEditsForEntityRecord, isSavingEntityRecord } = + select( 'core' ); + const { isPostSavingLocked } = select( 'core/editor' ); + const isSavingLocked = isPostSavingLocked(); + const isSaving = isSavingEntityRecord< boolean >( + 'postType', + 'product', + productId + ); + + return { + isDisabled: isSavingLocked || isSaving, + hasEdits: hasEditsForEntityRecord< boolean >( + 'postType', + 'product', + productId + ), + }; + }, + [ productId ] + ); + + const { editEntityRecord, saveEditedEntityRecord } = useDispatch( 'core' ); + + let previewLink: URL | undefined; + if ( typeof permalink === 'string' ) { + previewLink = new URL( permalink ); + previewLink.searchParams.append( 'preview', 'true' ); + } + + /** + * Overrides the default anchor behaviour when the product has unsaved changes. + * Before redirecting to the preview page all changes are saved and then the + * redirection is performed. + * + * @param event + */ + async function handleClick( event: MouseEvent< HTMLAnchorElement > ) { + if ( onClick ) { + onClick( event ); + } + + // Prevent an infinite recursion call due to the + // `anchorRef.current?.click()` call. + if ( ! hasEdits ) { + return; + } + + // Prevent the default anchor behaviour. + event.preventDefault(); + + try { + // If the product status is `auto-draft` it's not possible to + // reach the preview page, so the status is changed to `draft` + // before redirecting. + if ( productStatus === 'auto-draft' ) { + await editEntityRecord( 'postType', 'product', productId, { + status: 'draft', + } ); + } + + // Persist the product changes before redirecting + const publishedProduct = await saveEditedEntityRecord< Product >( + 'postType', + 'product', + productId + ); + + // Redirect using the default anchor behaviour. This way, the usage + // of `window.open` is avoided which comes with some edge cases. + anchorRef.current?.click(); + + if ( onSaveSuccess ) { + onSaveSuccess( publishedProduct ); + } + } catch ( error ) { + if ( onSaveError ) { + onSaveError( error as Error ); + } + } + } + + return { + 'aria-label': __( 'Preview in new tab', 'woocommerce' ), + children: __( 'Preview', 'woocommerce' ), + target: '_blank', + ...props, + ref( element: HTMLAnchorElement ) { + if ( typeof props.ref === 'function' ) props.ref( element ); + anchorRef.current = element; + }, + 'aria-disabled': disabled || isDisabled, + // Note that the href is always passed for a11y support. So + // the final rendered element is always an anchor. + href: previewLink?.toString(), + variant: 'tertiary', + onClick: handleClick, + }; +} diff --git a/packages/js/product-editor/src/components/header/hooks/use-publish/index.ts b/packages/js/product-editor/src/components/header/hooks/use-publish/index.ts new file mode 100644 index 00000000000..8a01d3e84ae --- /dev/null +++ b/packages/js/product-editor/src/components/header/hooks/use-publish/index.ts @@ -0,0 +1 @@ +export * from './use-publish'; diff --git a/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx b/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx new file mode 100644 index 00000000000..8a084e1655c --- /dev/null +++ b/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx @@ -0,0 +1,105 @@ +/** + * External dependencies + */ +import { Product, ProductStatus } from '@woocommerce/data'; +import { Button } from '@wordpress/components'; +import { useEntityProp } from '@wordpress/core-data'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; +import { MouseEvent } from 'react'; + +export function usePublish( { + disabled, + onClick, + onPublishSuccess, + onPublishError, + ...props +}: Omit< Button.ButtonProps, 'aria-disabled' | 'variant' | 'children' > & { + onPublishSuccess?( product: Product ): void; + onPublishError?( error: Error ): void; +} ): Button.ButtonProps { + const [ productId ] = useEntityProp< number >( + 'postType', + 'product', + 'id' + ); + const [ productStatus ] = useEntityProp< ProductStatus | 'auto-draft' >( + 'postType', + 'product', + 'status' + ); + + const { hasEdits, isDisabled, isBusy } = useSelect( + ( select ) => { + const { hasEditsForEntityRecord, isSavingEntityRecord } = + select( 'core' ); + const { isPostSavingLocked } = select( 'core/editor' ); + const isSavingLocked = isPostSavingLocked(); + const isSaving = isSavingEntityRecord< boolean >( + 'postType', + 'product', + productId + ); + + return { + isDisabled: isSavingLocked || isSaving, + isBusy: isSaving, + hasEdits: hasEditsForEntityRecord< boolean >( + 'postType', + 'product', + productId + ), + }; + }, + [ productId ] + ); + + const isCreating = productStatus === 'auto-draft'; + + const { editEntityRecord, saveEditedEntityRecord } = useDispatch( 'core' ); + + async function handleClick( event: MouseEvent< HTMLButtonElement > ) { + if ( onClick ) { + onClick( event ); + } + + try { + // The publish button click not only change the status of the product + // but also save all the pending changes. So even if the status is + // publish it's possible to save the product too. + if ( productStatus !== 'publish' ) { + await editEntityRecord( 'postType', 'product', productId, { + status: 'publish', + } ); + } + + const publishedProduct = await saveEditedEntityRecord< Product >( + 'postType', + 'product', + productId + ); + + if ( onPublishSuccess ) { + onPublishSuccess( publishedProduct ); + } + } catch ( error ) { + if ( onPublishError ) { + onPublishError( error as Error ); + } + } + } + + return { + children: isCreating + ? __( 'Add', 'woocommerce' ) + : __( 'Save', 'woocommerce' ), + ...props, + 'aria-disabled': + disabled || + isDisabled || + ( productStatus === 'publish' && ! hasEdits ), + isBusy, + variant: 'primary', + onClick: handleClick, + }; +} diff --git a/packages/js/product-editor/src/components/header/hooks/use-save-draft/index.ts b/packages/js/product-editor/src/components/header/hooks/use-save-draft/index.ts new file mode 100644 index 00000000000..679dac40f10 --- /dev/null +++ b/packages/js/product-editor/src/components/header/hooks/use-save-draft/index.ts @@ -0,0 +1 @@ +export * from './use-save-draft'; diff --git a/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx b/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx new file mode 100644 index 00000000000..fff02bd5451 --- /dev/null +++ b/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx @@ -0,0 +1,109 @@ +/** + * External dependencies + */ +import { Product, ProductStatus } from '@woocommerce/data'; +import { Button, Icon } from '@wordpress/components'; +import { useEntityProp } from '@wordpress/core-data'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; +import { check } from '@wordpress/icons'; +import { createElement, Fragment } from '@wordpress/element'; +import { MouseEvent, ReactNode } from 'react'; + +export function useSaveDraft( { + disabled, + onClick, + onSaveSuccess, + onSaveError, + ...props +}: Omit< Button.ButtonProps, 'aria-disabled' | 'variant' | 'children' > & { + onSaveSuccess?( product: Product ): void; + onSaveError?( error: Error ): void; +} ): Button.ButtonProps { + const [ productId ] = useEntityProp< number >( + 'postType', + 'product', + 'id' + ); + const [ productStatus ] = useEntityProp< ProductStatus | 'auto-draft' >( + 'postType', + 'product', + 'status' + ); + + const { hasEdits, isDisabled } = useSelect( + ( select ) => { + const { hasEditsForEntityRecord, isSavingEntityRecord } = + select( 'core' ); + const { isPostSavingLocked } = select( 'core/editor' ); + const isSavingLocked = isPostSavingLocked(); + const isSaving = isSavingEntityRecord< boolean >( + 'postType', + 'product', + productId + ); + + return { + isDisabled: isSavingLocked || isSaving, + hasEdits: hasEditsForEntityRecord< boolean >( + 'postType', + 'product', + productId + ), + }; + }, + [ productId ] + ); + + const { editEntityRecord, saveEditedEntityRecord } = useDispatch( 'core' ); + + async function handleClick( event: MouseEvent< HTMLButtonElement > ) { + if ( onClick ) { + onClick( event ); + } + + try { + await editEntityRecord( 'postType', 'product', productId, { + status: 'draft', + } ); + const publishedProduct = await saveEditedEntityRecord< Product >( + 'postType', + 'product', + productId + ); + + if ( onSaveSuccess ) { + onSaveSuccess( publishedProduct ); + } + } catch ( error ) { + if ( onSaveError ) { + onSaveError( error as Error ); + } + } + } + + let children: ReactNode; + if ( productStatus === 'publish' ) { + children = __( 'Switch to draft', 'woocommerce' ); + } else if ( hasEdits ) { + children = __( 'Save draft', 'woocommerce' ); + } else { + children = ( + <> + + { __( 'Saved', 'woocommerce' ) } + + ); + } + + return { + children, + ...props, + 'aria-disabled': + disabled || + isDisabled || + ( productStatus !== 'publish' && ! hasEdits ), + variant: 'tertiary', + onClick: handleClick, + }; +} diff --git a/packages/js/product-editor/src/components/header/preview-button/index.ts b/packages/js/product-editor/src/components/header/preview-button/index.ts new file mode 100644 index 00000000000..c3a99f6e222 --- /dev/null +++ b/packages/js/product-editor/src/components/header/preview-button/index.ts @@ -0,0 +1 @@ +export * from './preview-button'; diff --git a/packages/js/product-editor/src/components/header/preview-button/preview-button.tsx b/packages/js/product-editor/src/components/header/preview-button/preview-button.tsx new file mode 100644 index 00000000000..3bdc165ffc3 --- /dev/null +++ b/packages/js/product-editor/src/components/header/preview-button/preview-button.tsx @@ -0,0 +1,47 @@ +/** + * External dependencies + */ +import { Product, ProductStatus } from '@woocommerce/data'; +import { getNewPath, navigateTo } from '@woocommerce/navigation'; +import { Button } from '@wordpress/components'; +import { useEntityProp } from '@wordpress/core-data'; +import { useDispatch } from '@wordpress/data'; +import { createElement } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; + +/** + * Internal dependencies + */ +import { usePreview } from '../hooks/use-preview'; + +export function PreviewButton( { + ...props +}: Omit< + Button.AnchorProps, + 'aria-disabled' | 'variant' | 'href' | 'children' +> ) { + const [ productStatus ] = useEntityProp< ProductStatus | 'auto-draft' >( + 'postType', + 'product', + 'status' + ); + + const { createErrorNotice } = useDispatch( 'core/notices' ); + + const previewButtonProps = usePreview( { + ...props, + onSaveSuccess( savedProduct: Product ) { + if ( productStatus === 'auto-draft' ) { + const url = getNewPath( {}, `/product/${ savedProduct.id }` ); + navigateTo( { url } ); + } + }, + onSaveError() { + createErrorNotice( + __( 'Failed to preview product.', 'woocommerce' ) + ); + }, + } ); + + return
    -

    +

    - + From 54eb2a0c43ce03d05a746916ad0bf911c09232dc Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 5 Apr 2023 15:13:13 +0530 Subject: [PATCH 1329/1680] Add sort order for migration script. (#37545) --- plugins/woocommerce/changelog/hpos-add_sort | 4 ++++ .../DataStores/Orders/DataSynchronizer.php | 5 ++++- .../Orders/DataSynchronizerTests.php | 18 ++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/hpos-add_sort diff --git a/plugins/woocommerce/changelog/hpos-add_sort b/plugins/woocommerce/changelog/hpos-add_sort new file mode 100644 index 00000000000..dad318f81a1 --- /dev/null +++ b/plugins/woocommerce/changelog/hpos-add_sort @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Add sort order to migration script for consistency. diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php index 84e9e9cd956..193009492ec 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php @@ -294,7 +294,8 @@ LEFT JOIN $orders_table orders ON posts.ID = orders.id WHERE posts.post_type IN ($order_post_type_placeholders) AND posts.post_status != 'auto-draft' - AND orders.id IS NULL", + AND orders.id IS NULL +ORDER BY posts.ID ASC", $order_post_types ); // phpcs:enable WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare @@ -305,6 +306,7 @@ SELECT posts.ID FROM $wpdb->posts posts INNER JOIN $orders_table orders ON posts.id=orders.id WHERE posts.post_type = '" . self::PLACEHOLDER_ORDER_POST_TYPE . "' AND orders.status not in ( 'auto-draft' ) +ORDER BY posts.id ASC "; break; case self::ID_TYPE_DIFFERENT_UPDATE_DATE: @@ -317,6 +319,7 @@ JOIN $wpdb->posts posts on posts.ID = orders.id WHERE posts.post_type IN ($order_post_type_placeholders) AND orders.date_updated_gmt $operator posts.post_modified_gmt +ORDER BY orders.id ASC ", $order_post_types ); diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php index fbe5e011fa0..6d1ac547a35 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php @@ -293,4 +293,22 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { 'Meta data deleted from the CPT datastore should also be deleted from the HPOS datastore.' ); } + + /** + * @testDox Orders for migration are picked by ID sorted. + */ + public function test_migration_sort() { + global $wpdb; + $order1 = wc_get_order( OrderHelper::create_order() ); + $order2 = wc_get_order( OrderHelper::create_order() ); + + // Let's update order1 id to be greater than order2 id. + // phpcs:ignore + $max_id = $wpdb->get_var( "SELECT MAX(id) FROM $wpdb->posts" ); + $wpdb->update( $wpdb->posts, array( 'ID' => $max_id + 1 ), array( 'ID' => $order1->get_id() ) ); + + $orders_to_migrate = $this->sut->get_next_batch_to_process( 2 ); + $this->assertEquals( $order2->get_id(), $orders_to_migrate[0] ); + $this->assertEquals( $max_id + 1, $orders_to_migrate[1] ); + } } From 800ee5d6ddce5fddf24d8fdbc63be6cda218b6a8 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 5 Apr 2023 18:52:00 +0530 Subject: [PATCH 1330/1680] Minor fixup for getting order ids in verify db command. --- plugins/woocommerce/changelog/fix-order_count | 4 ++++ .../src/Database/Migrations/CustomOrderTable/CLIRunner.php | 6 +++--- 2 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-order_count diff --git a/plugins/woocommerce/changelog/fix-order_count b/plugins/woocommerce/changelog/fix-order_count new file mode 100644 index 00000000000..b488dca856f --- /dev/null +++ b/plugins/woocommerce/changelog/fix-order_count @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Minor fixup for getting order ids in verify db command. diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index 0b54d70cae3..1958d2d9677 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -325,7 +325,7 @@ class CLIRunner { $order_id_start = (int) $assoc_args['start-from']; $order_id_end = (int) $assoc_args['end-at']; $order_id_end = -1 === $order_id_end ? PHP_INT_MAX : $order_id_end; - $order_count = $this->get_verify_order_count( $order_id_start, $order_id_end ); + $order_count = $this->get_verify_order_count( $order_id_start, $order_id_end, false ); $batch_size = ( (int) $assoc_args['batch-size'] ) === 0 ? 500 : (int) $assoc_args['batch-size']; $progress = WP_CLI\Utils\make_progress_bar( 'Order Data Verification', $order_count / $batch_size ); @@ -372,8 +372,8 @@ class CLIRunner { ) ); - $order_id_start = max( $order_ids ); - $remaining_count = $this->get_verify_order_count( $order_id_start, false ); + $order_id_start = max( $order_ids ) + 1; + $remaining_count = $this->get_verify_order_count( $order_id_start, $order_id_end, false ); if ( $remaining_count === $order_count ) { return WP_CLI::error( __( 'Infinite loop detected, aborting. No errors found.', 'woocommerce' ) ); } From b5e74ae90c3ebf406db04fc65703acfd5bb526ec Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 5 Apr 2023 19:28:15 +0530 Subject: [PATCH 1331/1680] Add support for verbose command to display errors as they happen. --- .../Migrations/CustomOrderTable/CLIRunner.php | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index 1958d2d9677..f1579c7d442 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -294,6 +294,12 @@ class CLIRunner { * default: -1 * --- * + * [--verbose=] + * : Whether to output errors as they happen in batch, or output them all together at the end. + * --- + * default: false + * --- + * * ## EXAMPLES * * # Verify migrated order data, 500 orders at a time. @@ -315,6 +321,7 @@ class CLIRunner { 'batch-size' => 500, 'start-from' => 0, 'end-at' => -1, + 'verbose' => false, ) ); @@ -327,6 +334,7 @@ class CLIRunner { $order_id_end = -1 === $order_id_end ? PHP_INT_MAX : $order_id_end; $order_count = $this->get_verify_order_count( $order_id_start, $order_id_end, false ); $batch_size = ( (int) $assoc_args['batch-size'] ) === 0 ? 500 : (int) $assoc_args['batch-size']; + $verbose = (bool) $assoc_args['verbose']; $progress = WP_CLI\Utils\make_progress_bar( 'Order Data Verification', $order_count / $batch_size ); @@ -353,13 +361,31 @@ class CLIRunner { ) ); $batch_start_time = microtime( true ); - $failed_ids = $failed_ids + $this->post_to_cot_migrator->verify_migrated_orders( $order_ids ); - $failed_ids = $this->verify_meta_data( $order_ids, $failed_ids ); - $processed += count( $order_ids ); + $failed_ids_in_current_batch = $this->post_to_cot_migrator->verify_migrated_orders( $order_ids ); + $failed_ids_in_current_batch = $this->verify_meta_data( $order_ids, $failed_ids_in_current_batch ); + $failed_ids = $failed_ids + $failed_ids_in_current_batch; + $processed += count( $order_ids ); $batch_total_time = microtime( true ) - $batch_start_time; $batch_count ++; $total_time += $batch_total_time; + if ( $verbose && count( $failed_ids_in_current_batch ) > 0 ) { + $errors = print_r( $failed_ids_in_current_batch, true ); + WP_CLI::warning( + sprintf( + /* Translators: %1$d is number of errors and %2$s is the formatted array of order IDs. */ + _n( + '%1$d error found: %2$s. Please review the error above.', + '%1$d errors found: %2$s. Please review the errors above.', + count( $failed_ids_in_current_batch ), + 'woocommerce' + ), + count( $failed_ids_in_current_batch ), + $errors + ) + ); + } + $progress->tick(); WP_CLI::debug( From b7965223850a78de17568f969cd6d4851f3600ff Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 5 Apr 2023 19:38:01 +0530 Subject: [PATCH 1332/1680] Applied coding standards. --- .../Database/Migrations/CustomOrderTable/CLIRunner.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index f1579c7d442..65a3341ebd4 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -76,7 +76,7 @@ class CLIRunner { sprintf( // translators: %s - link to testing instructions webpage. __( 'Custom order table usage is not enabled. If you are testing, you can enable it by following the testing instructions in %s', 'woocommerce' ), - 'https://developer.woocommerce.com/' // TODO: Change the link when testing instructin page is live. + 'https://github.com/woocommerce/woocommerce/wiki/High-Performance-Order-Storage-Upgrade-Recipe-Book' ) ); } @@ -352,7 +352,7 @@ class CLIRunner { ) ); - $order_ids = $wpdb->get_col( + $order_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM $wpdb->posts WHERE post_type = 'shop_order' AND ID >= %d AND ID <= %d ORDER BY ID ASC LIMIT %d", $order_id_start, @@ -360,12 +360,12 @@ class CLIRunner { $batch_size ) ); - $batch_start_time = microtime( true ); + $batch_start_time = microtime( true ); $failed_ids_in_current_batch = $this->post_to_cot_migrator->verify_migrated_orders( $order_ids ); $failed_ids_in_current_batch = $this->verify_meta_data( $order_ids, $failed_ids_in_current_batch ); $failed_ids = $failed_ids + $failed_ids_in_current_batch; - $processed += count( $order_ids ); - $batch_total_time = microtime( true ) - $batch_start_time; + $processed += count( $order_ids ); + $batch_total_time = microtime( true ) - $batch_start_time; $batch_count ++; $total_time += $batch_total_time; From 85c7bb64269307fbe9e690995bfbd7773b57e798 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 5 Apr 2023 20:44:27 +0530 Subject: [PATCH 1333/1680] Apply coding standards. --- .../src/Database/Migrations/CustomOrderTable/CLIRunner.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index 65a3341ebd4..4393ffc9b26 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -370,6 +370,7 @@ class CLIRunner { $total_time += $batch_total_time; if ( $verbose && count( $failed_ids_in_current_batch ) > 0 ) { + // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- This is a CLI command and debugging code is intended. $errors = print_r( $failed_ids_in_current_batch, true ); WP_CLI::warning( sprintf( From bb22fd586489d97ecd65e0bc4d161376618152f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Wed, 5 Apr 2023 12:55:22 -0400 Subject: [PATCH 1334/1680] Prevent click event when buttons are aria-disabled (#37577) * Prevent click event when buttons are aria-disabled * Add changelog file --- packages/js/product-editor/changelog/fix-37249 | 4 ++++ .../header/hooks/use-preview/use-preview.tsx | 8 +++++++- .../header/hooks/use-publish/use-publish.tsx | 11 +++++++---- .../header/hooks/use-save-draft/use-save-draft.tsx | 12 ++++++++---- 4 files changed, 26 insertions(+), 9 deletions(-) create mode 100644 packages/js/product-editor/changelog/fix-37249 diff --git a/packages/js/product-editor/changelog/fix-37249 b/packages/js/product-editor/changelog/fix-37249 new file mode 100644 index 00000000000..16fafe1d487 --- /dev/null +++ b/packages/js/product-editor/changelog/fix-37249 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Prevent click event when the element is aria-disabled" diff --git a/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx b/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx index a2bbecdc43d..41fe6371316 100644 --- a/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx +++ b/packages/js/product-editor/src/components/header/hooks/use-preview/use-preview.tsx @@ -61,6 +61,8 @@ export function usePreview( { [ productId ] ); + const ariaDisabled = disabled || isDisabled; + const { editEntityRecord, saveEditedEntityRecord } = useDispatch( 'core' ); let previewLink: URL | undefined; @@ -77,6 +79,10 @@ export function usePreview( { * @param event */ async function handleClick( event: MouseEvent< HTMLAnchorElement > ) { + if ( ariaDisabled ) { + return event.preventDefault(); + } + if ( onClick ) { onClick( event ); } @@ -130,7 +136,7 @@ export function usePreview( { if ( typeof props.ref === 'function' ) props.ref( element ); anchorRef.current = element; }, - 'aria-disabled': disabled || isDisabled, + 'aria-disabled': ariaDisabled, // Note that the href is always passed for a11y support. So // the final rendered element is always an anchor. href: previewLink?.toString(), diff --git a/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx b/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx index 8a084e1655c..6b1b2b47979 100644 --- a/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx +++ b/packages/js/product-editor/src/components/header/hooks/use-publish/use-publish.tsx @@ -55,10 +55,16 @@ export function usePublish( { ); const isCreating = productStatus === 'auto-draft'; + const ariaDisabled = + disabled || isDisabled || ( productStatus === 'publish' && ! hasEdits ); const { editEntityRecord, saveEditedEntityRecord } = useDispatch( 'core' ); async function handleClick( event: MouseEvent< HTMLButtonElement > ) { + if ( ariaDisabled ) { + return event.preventDefault(); + } + if ( onClick ) { onClick( event ); } @@ -94,10 +100,7 @@ export function usePublish( { ? __( 'Add', 'woocommerce' ) : __( 'Save', 'woocommerce' ), ...props, - 'aria-disabled': - disabled || - isDisabled || - ( productStatus === 'publish' && ! hasEdits ), + 'aria-disabled': ariaDisabled, isBusy, variant: 'primary', onClick: handleClick, diff --git a/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx b/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx index fff02bd5451..d8df2f5a8b0 100644 --- a/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx +++ b/packages/js/product-editor/src/components/header/hooks/use-save-draft/use-save-draft.tsx @@ -55,9 +55,16 @@ export function useSaveDraft( { [ productId ] ); + const ariaDisabled = + disabled || isDisabled || ( productStatus !== 'publish' && ! hasEdits ); + const { editEntityRecord, saveEditedEntityRecord } = useDispatch( 'core' ); async function handleClick( event: MouseEvent< HTMLButtonElement > ) { + if ( ariaDisabled ) { + return event.preventDefault(); + } + if ( onClick ) { onClick( event ); } @@ -99,10 +106,7 @@ export function useSaveDraft( { return { children, ...props, - 'aria-disabled': - disabled || - isDisabled || - ( productStatus !== 'publish' && ! hasEdits ), + 'aria-disabled': ariaDisabled, variant: 'tertiary', onClick: handleClick, }; From a5fe4232c797c87291a18ac7d7a90a922968496e Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Wed, 5 Apr 2023 13:56:42 -0300 Subject: [PATCH 1335/1680] Change variations dropdown visibility (#37558) * Add default action with the name `Bulk actions` * Attach event when dropdown changes * Add changelog * Remove `Go` button * Fix e2e tests * Fix styles --------- Co-authored-by: Fernando Marichal --- ...add-37148_change_variations_dropdown_visibility | 4 ++++ plugins/woocommerce/client/legacy/css/admin.scss | 7 ++++++- .../js/admin/meta-boxes-product-variation.js | 14 ++++++-------- .../views/html-product-data-variations.php | 4 ++-- .../tests/merchant/create-variable-product.spec.js | 2 -- 5 files changed, 18 insertions(+), 13 deletions(-) create mode 100644 plugins/woocommerce/changelog/add-37148_change_variations_dropdown_visibility diff --git a/plugins/woocommerce/changelog/add-37148_change_variations_dropdown_visibility b/plugins/woocommerce/changelog/add-37148_change_variations_dropdown_visibility new file mode 100644 index 00000000000..5209f44c4a5 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37148_change_variations_dropdown_visibility @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Change variations dropdown menu visibility diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index db87b9c7344..ad9a3e3d1cf 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -1018,8 +1018,13 @@ $default-line-height: 18px; max-width: 100%; } + .variation_actions { + max-width: 131px; + } + .toolbar-top { - .button { + .button, + .select { margin: 1px; } } diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js index 4d43ad94999..f75438fb80c 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js @@ -655,8 +655,8 @@ jQuery( function ( $ ) { } ); $( '.wc-metaboxes-wrapper' ).on( - 'click', - 'a.do_variation_action', + 'change', + '#field_to_edit', this.do_variation_action ); @@ -1195,7 +1195,7 @@ jQuery( function ( $ ) { * Actions */ do_variation_action: function () { - var do_variation_action = $( 'select.variation_actions' ).val(), + var do_variation_action = $( this ).val(), data = {}, changes = 0, value; @@ -1344,11 +1344,9 @@ jQuery( function ( $ ) { if ( parseInt( wrapper.attr( 'data-total' ) ) > 0 ) { $( '.add-variation-container' ).addClass( 'hidden' ); $( '#field_to_edit' ).removeClass( 'hidden' ); - $( 'a.do_variation_action' ).removeClass( 'hidden' ); } else { $( '.add-variation-container' ).removeClass( 'hidden' ); $( '#field_to_edit' ).addClass( 'hidden' ); - $( 'a.do_variation_action' ).addClass( 'hidden' ); } }, @@ -1451,7 +1449,7 @@ jQuery( function ( $ ) { if ( page_nav.is( ':hidden' ) ) { $( 'option, optgroup', '.variation_actions' ).show(); - $( '.variation_actions' ).val( 'delete_all' ); + $( '.variation_actions' ).val( 'bulk_actions' ); $( '#variable_product_options' ).find( '.toolbar' ).show(); page_nav.show(); $( '.pagination-links', page_nav ).hide(); @@ -1498,13 +1496,13 @@ jQuery( function ( $ ) { toolbar.not( '.toolbar-top, .toolbar-buttons' ).hide(); page_nav.hide(); $( 'option, optgroup', variation_action ).hide(); - $( '.variation_actions' ).val( 'delete_all' ); + $( '.variation_actions' ).val( 'bulk_actions' ); $( 'option[data-global="true"]', variation_action ).show(); } else { toolbar.show(); page_nav.show(); $( 'option, optgroup', variation_action ).show(); - $( '.variation_actions' ).val( 'delete_all' ); + $( '.variation_actions' ).val( 'bulk_actions' ); // Show/hide links if ( 1 === total_pages ) { diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php index 06507a54061..7c37b7af4a1 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php @@ -97,7 +97,8 @@ $arrow_img_url = WC_ADMIN_IMAGES_FOLDER_URL . '/product_data/no-variati

    - + @@ -135,7 +136,6 @@ $arrow_img_url = WC_ADMIN_IMAGES_FOLDER_URL . '/product_data/no-variati -
    diff --git a/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js index 04c139e1d4b..32fae78413c 100644 --- a/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js +++ b/plugins/woocommerce/tests/e2e-pw/tests/merchant/create-variable-product.spec.js @@ -179,7 +179,6 @@ test.describe( 'Add New Variable Product Page', () => { await page.selectOption( '#field_to_edit', 'toggle_downloadable', { force: true, } ); - await page.click( 'a.do_variation_action' ); await page.click( '#variable_product_options .toolbar-top a.expand_all' ); @@ -196,7 +195,6 @@ test.describe( 'Add New Variable Product Page', () => { await page.click( 'a[href="#variable_product_options"]' ); await page.waitForLoadState( 'networkidle' ); await page.selectOption( '#field_to_edit', 'delete_all' ); - await page.click( 'a.do_variation_action' ); await page.waitForSelector( '.woocommerce_variation', { state: 'detached', } ); From 7734027b4a6e1066b220f1f3c0a5b08b9e8ac29c Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Wed, 5 Apr 2023 10:13:05 -0700 Subject: [PATCH 1336/1680] Add product radio block and tax class to product blocks editor (#37529) * Add product radio block * Wrap tax class radio in collapsible block * Add link to description and sanitize HTML * Add changelog entry * Fix up php lint errors * Add changelog entry * Fix linting errors * Remove unused import --- .../js/product-editor/changelog/add-37395 | 4 ++ .../components/collapsible-block/block.json | 3 +- .../src/components/editor/init-blocks.ts | 2 + .../src/components/radio/block.json | 39 ++++++++++++++++ .../src/components/radio/edit.tsx | 46 +++++++++++++++++++ .../src/components/radio/editor.scss | 27 +++++++++++ .../src/components/radio/index.ts | 17 +++++++ packages/js/product-editor/src/style.scss | 1 + plugins/woocommerce/changelog/add-37395 | 4 ++ .../includes/class-wc-post-types.php | 37 +++++++++++++++ 10 files changed, 179 insertions(+), 1 deletion(-) create mode 100644 packages/js/product-editor/changelog/add-37395 create mode 100644 packages/js/product-editor/src/components/radio/block.json create mode 100644 packages/js/product-editor/src/components/radio/edit.tsx create mode 100644 packages/js/product-editor/src/components/radio/editor.scss create mode 100644 packages/js/product-editor/src/components/radio/index.ts create mode 100644 plugins/woocommerce/changelog/add-37395 diff --git a/packages/js/product-editor/changelog/add-37395 b/packages/js/product-editor/changelog/add-37395 new file mode 100644 index 00000000000..737428f453f --- /dev/null +++ b/packages/js/product-editor/changelog/add-37395 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product radio block and tax class to product blocks editor diff --git a/packages/js/product-editor/src/components/collapsible-block/block.json b/packages/js/product-editor/src/components/collapsible-block/block.json index d0a6e6deac5..07e301c32fc 100644 --- a/packages/js/product-editor/src/components/collapsible-block/block.json +++ b/packages/js/product-editor/src/components/collapsible-block/block.json @@ -8,7 +8,8 @@ "textdomain": "default", "attributes": { "toggleText": { - "type": "string" + "type": "string", + "__experimentalRole": "content" }, "initialCollapsed": { "type": "boolean" diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index 7a49334fb22..7555c6a2a1f 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -14,6 +14,7 @@ import { */ import { init as initImages } from '../images'; import { init as initName } from '../details-name-block'; +import { init as initRadio } from '../radio'; import { init as initSummary } from '../details-summary-block'; import { init as initSection } from '../section'; import { init as initTab } from '../tab'; @@ -31,6 +32,7 @@ export const initBlocks = () => { initImages(); initName(); + initRadio(); initSummary(); initSection(); initTab(); diff --git a/packages/js/product-editor/src/components/radio/block.json b/packages/js/product-editor/src/components/radio/block.json new file mode 100644 index 00000000000..33dec4fcf11 --- /dev/null +++ b/packages/js/product-editor/src/components/radio/block.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-radio", + "title": "Product radio control", + "category": "woocommerce", + "description": "The product radio.", + "keywords": [ "products", "radio", "input" ], + "textdomain": "default", + "attributes": { + "title": { + "type": "string" + }, + "description": { + "type": "string" + }, + "property": { + "type": "string" + }, + "options": { + "type": "array", + "items": { + "type": "object" + }, + "default": [], + "__experimentalRole": "content" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": true, + "reusable": false, + "inserter": false, + "lock": false, + "__experimentalToolbar": false + }, + "editorStyle": "file:./editor.css" +} diff --git a/packages/js/product-editor/src/components/radio/edit.tsx b/packages/js/product-editor/src/components/radio/edit.tsx new file mode 100644 index 00000000000..77644752595 --- /dev/null +++ b/packages/js/product-editor/src/components/radio/edit.tsx @@ -0,0 +1,46 @@ +/** + * External dependencies + */ +import { createElement, Fragment } from '@wordpress/element'; +import type { BlockAttributes } from '@wordpress/blocks'; +import { RadioControl } from '@wordpress/components'; +import { useBlockProps } from '@wordpress/block-editor'; +import { useEntityProp } from '@wordpress/core-data'; + +/** + * Internal dependencies + */ +import { sanitizeHTML } from '../../utils/sanitize-html'; + +export function Edit( { attributes }: { attributes: BlockAttributes } ) { + const blockProps = useBlockProps(); + const { description, options, property, title } = attributes; + const [ value, setValue ] = useEntityProp< string >( + 'postType', + 'product', + property + ); + + return ( +
    + + + { title } + + + + } + selected={ value } + options={ options } + onChange={ ( selected ) => setValue( selected || '' ) } + /> +
    + ); +} diff --git a/packages/js/product-editor/src/components/radio/editor.scss b/packages/js/product-editor/src/components/radio/editor.scss new file mode 100644 index 00000000000..8b1729d3d81 --- /dev/null +++ b/packages/js/product-editor/src/components/radio/editor.scss @@ -0,0 +1,27 @@ +.wp-block-woocommerce-product-radio { + .components-base-control__label { + text-transform: none; + font-weight: 400; + > span { + display: block; + line-height: 1.5; + } + margin-bottom: $gap-large; + } + + &__title { + font-size: 16px; + font-weight: 600; + color: #1e1e1e; + margin-bottom: $gap-smaller; + } + + &__description { + font-size: 13px; + color: #1e1e1e; + } + + .components-base-control__field > .components-v-stack { + gap: $gap; + } +} \ No newline at end of file diff --git a/packages/js/product-editor/src/components/radio/index.ts b/packages/js/product-editor/src/components/radio/index.ts new file mode 100644 index 00000000000..15144b2b28d --- /dev/null +++ b/packages/js/product-editor/src/components/radio/index.ts @@ -0,0 +1,17 @@ +/** + * Internal dependencies + */ +import initBlock from '../../utils/init-block'; +import metadata from './block.json'; +import { Edit } from './edit'; + +const { name } = metadata; + +export { metadata, name }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export const init = () => initBlock( { name, metadata, settings } ); diff --git a/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index fdba01eac4b..0287d7c8690 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -6,6 +6,7 @@ @import 'components/header/style.scss'; @import 'components/images/editor.scss'; @import 'components/block-editor/style.scss'; +@import 'components/radio/editor.scss'; @import 'components/section/editor.scss'; @import 'components/tab/editor.scss'; @import 'components/tabs/style.scss'; diff --git a/plugins/woocommerce/changelog/add-37395 b/plugins/woocommerce/changelog/add-37395 new file mode 100644 index 00000000000..0865cfe9c7d --- /dev/null +++ b/plugins/woocommerce/changelog/add-37395 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add tax class to product editor template diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 77114474dd5..e42dab1c988 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -513,6 +513,43 @@ class WC_Post_Types { ), ), ), + array( + 'woocommerce/collapsible', + array( + 'toggleText' => __( 'Advanced', 'woocommerce' ), + 'initialCollapsed' => true, + 'persistRender' => true, + ), + array( + array( + 'woocommerce/product-radio', + array( + 'title' => __( 'Tax class', 'woocommerce' ), + 'description' => sprintf( + /* translators: %1$s: Learn more link opening tag. %2$s: Learn more link closing tag.*/ + __( 'Apply a tax rate if this product qualifies for tax reduction or exemption. %1$sLearn more%2$s.', 'woocommerce' ), + '', + '' + ), + 'property' => 'tax_class', + 'options' => array( + array( + 'label' => __( 'Standard', 'woocommerce' ), + 'value' => '', + ), + array( + 'label' => __( 'Reduced rate', 'woocommerce' ), + 'value' => 'reduced-rate', + ), + array( + 'label' => __( 'Zero rate', 'woocommerce' ), + 'value' => 'zero-rate', + ), + ), + ), + ), + ), + ), ), ), ), From 277f4aab12ee5baeb4231f541bd231b93c1b7b45 Mon Sep 17 00:00:00 2001 From: Nathan Silveira Date: Wed, 5 Apr 2023 16:22:59 -0300 Subject: [PATCH 1337/1680] Show tooltip in Save attributes button instead of using title attribute (#37345) * Modify tipTip to allow showing dynamic content * Show tooltip when button is disabled * Add tipTip and disabled logic to create variations button * Add header comment in tipTip plugin --- .../product-tracking/shared.ts | 9 ++++- .../changelog/update-save-attributes-tooltip | 4 ++ .../js/admin/meta-boxes-product-variation.js | 6 ++- .../legacy/js/admin/meta-boxes-product.js | 6 ++- .../client/legacy/js/admin/meta-boxes.js | 39 ++++++++++++++----- .../legacy/js/jquery-tiptip/jquery.tipTip.js | 13 +++++-- .../views/html-product-data-attributes.php | 2 +- .../views/html-product-data-variations.php | 2 +- 8 files changed, 64 insertions(+), 17 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-save-attributes-tooltip diff --git a/plugins/woocommerce-admin/client/wp-admin-scripts/product-tracking/shared.ts b/plugins/woocommerce-admin/client/wp-admin-scripts/product-tracking/shared.ts index 1e40d57ff87..38712440139 100644 --- a/plugins/woocommerce-admin/client/wp-admin-scripts/product-tracking/shared.ts +++ b/plugins/woocommerce-admin/client/wp-admin-scripts/product-tracking/shared.ts @@ -504,7 +504,14 @@ export const initProductScreenTracks = () => { document .querySelector( '.save_attributes' ) - ?.addEventListener( 'click', () => { + ?.addEventListener( 'click', ( event ) => { + if ( + event.target instanceof Element && + event.target.classList.contains( 'disabled' ) + ) { + // skip in case the button is disabled + return; + } const newAttributesCount = document.querySelectorAll( '.woocommerce_attribute' ).length; diff --git a/plugins/woocommerce/changelog/update-save-attributes-tooltip b/plugins/woocommerce/changelog/update-save-attributes-tooltip new file mode 100644 index 00000000000..7518ccd9ba3 --- /dev/null +++ b/plugins/woocommerce/changelog/update-save-attributes-tooltip @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Show tooltip in Save attributes button instead of using title attribute diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js index f75438fb80c..7f865a90066 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product-variation.js @@ -56,7 +56,11 @@ jQuery( function ( $ ) { ); }, - create_variations: function () { + create_variations: function ( event ) { + if ( $( this ).hasClass( 'disabled' ) ) { + event.preventDefault(); + return; + } var new_attribute_data = $( '.woocommerce_variation_new_attribute_data' ); diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js index 5bc65fd8058..859901b27fa 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js @@ -750,7 +750,11 @@ jQuery( function ( $ ) { ); // Save attributes and update variations. - $( '.save_attributes' ).on( 'click', function () { + $( '.save_attributes' ).on( 'click', function ( event ) { + if ( $( this ).hasClass( 'disabled' ) ) { + event.preventDefault(); + return; + } $( '.product_attributes' ).block( { message: null, overlayCSS: { diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js index bffcde118e8..f773e673ffa 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes.js @@ -50,17 +50,14 @@ jQuery( function ( $ ) { attributes_and_variations_data ) ) { - if ( ! $save_button.is( ':disabled' ) ) { - $save_button.attr( 'disabled', 'disabled' ); - $save_button.attr( - 'title', - woocommerce_admin_meta_boxes.i18n_save_attribute_variation_tip - ); + if ( ! $save_button.hasClass( 'disabled' ) ) { + $save_button.addClass( 'disabled' ); + $save_button.attr( 'aria-disabled', true ); } - return; + } else { + $save_button.removeClass( 'disabled' ); + $save_button.removeAttr( 'aria-disabled' ); } - $save_button.removeAttr( 'disabled' ); - $save_button.removeAttr( 'title' ); }; // Run tipTip @@ -79,6 +76,30 @@ jQuery( function ( $ ) { runTipTip(); + $( '.save_attributes' ).tipTip( { + content: function () { + return $( '.save_attributes' ).hasClass( 'disabled' ) + ? woocommerce_admin_meta_boxes.i18n_save_attribute_variation_tip + : ''; + }, + fadeIn: 50, + fadeOut: 50, + delay: 200, + keepAlive: true, + } ); + + $( '.create-variations' ).tipTip( { + content: function () { + return $( '.create-variations' ).hasClass( 'disabled' ) + ? woocommerce_admin_meta_boxes.i18n_save_attribute_variation_tip + : ''; + }, + fadeIn: 50, + fadeOut: 50, + delay: 200, + keepAlive: true, + } ); + $( '.wc-metaboxes-wrapper' ).on( 'click', '.wc-metabox > h3', function () { var metabox = $( this ).parent( '.wc-metabox' ); diff --git a/plugins/woocommerce/client/legacy/js/jquery-tiptip/jquery.tipTip.js b/plugins/woocommerce/client/legacy/js/jquery-tiptip/jquery.tipTip.js index 6672f09fc07..8a2d1acc582 100644 --- a/plugins/woocommerce/client/legacy/js/jquery-tiptip/jquery.tipTip.js +++ b/plugins/woocommerce/client/legacy/js/jquery-tiptip/jquery.tipTip.js @@ -4,7 +4,10 @@ * www.drewwilson.com * code.drewwilson.com/entry/tiptip-jquery-plugin * - * Version 1.3 - Updated: Mar. 23, 2010 + * Version 1.3.1 - Updated: Mar. 30, 2023 + * + * This is a custom version of TipTip. This file has been locally modified for specific requirements. + * Since the original version is no longer maintained, the changes were not submitted back to the original author. * * This Plug-In will create a custom tooltip to replace the default * browser tooltip. It is extremely lightweight and very smart in @@ -31,7 +34,7 @@ fadeIn: 200, fadeOut: 200, attribute: "title", - content: false, // HTML or String to fill TipTIp with + content: false, // HTML or String or callback to fill TipTIp with enter: function(){}, exit: function(){} }; @@ -98,8 +101,12 @@ } function active_tiptip(){ + var content = typeof opts.content === 'function' ? opts.content() : org_title; + if (!content) { + return; + } opts.enter.call(this); - tiptip_content.html(org_title); + tiptip_content.html(content); tiptip_holder.hide().css("margin","0"); tiptip_holder.removeAttr('class'); tiptip_arrow.removeAttr("style"); diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php index 1858a0c3b45..a757f0414e8 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-attributes.php @@ -108,7 +108,7 @@ $icon_url = WC_ADMIN_IMAGES_FOLDER_URL . '/icons/global-a / - +
    diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php index 7c37b7af4a1..0cf51a2aaaf 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-data-variations.php @@ -53,7 +53,7 @@ $arrow_img_url = WC_ADMIN_IMAGES_FOLDER_URL . '/product_data/no-variati require __DIR__ . '/html-product-attribute-inner.php'; ?>
    - +
    From 07b84051b2b076d3af69be999e5ba1374aff5fa9 Mon Sep 17 00:00:00 2001 From: Joel Thiessen <444632+joelclimbsthings@users.noreply.github.com> Date: Wed, 5 Apr 2023 16:23:58 -0700 Subject: [PATCH 1338/1680] Adding charge sales tax field to product block editor template (#37582) --- .../changelog/add-charge-sales-tax-37396 | 4 ++++ .../includes/class-wc-post-types.php | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-charge-sales-tax-37396 diff --git a/plugins/woocommerce/changelog/add-charge-sales-tax-37396 b/plugins/woocommerce/changelog/add-charge-sales-tax-37396 new file mode 100644 index 00000000000..55779d97a07 --- /dev/null +++ b/plugins/woocommerce/changelog/add-charge-sales-tax-37396 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Adding charge sales tax field to product block editor template. diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index e42dab1c988..d2a8a6083e9 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -513,6 +513,27 @@ class WC_Post_Types { ), ), ), + array( + 'woocommerce/product-radio', + array( + 'title' => __( 'Charge sales tax on', 'woocommerce' ), + 'property' => 'tax_status', + 'options' => array( + array( + 'label' => __( 'Product and shipping', 'woocommerce' ), + 'value' => 'taxable', + ), + array( + 'label' => __( 'Only shipping', 'woocommerce' ), + 'value' => 'shipping', + ), + array( + 'label' => __( "Don't charge tax", 'woocommerce' ), + 'value' => 'none', + ), + ), + ), + ), array( 'woocommerce/collapsible', array( From 33352895bc9aa9cfff222b13df6322b580e8cb16 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 6 Apr 2023 01:56:28 +0200 Subject: [PATCH 1339/1680] Delete changelog files based on PR 37569 (#37581) Delete changelog files for 37569 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-order-cache-order-type | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-order-cache-order-type diff --git a/plugins/woocommerce/changelog/fix-order-cache-order-type b/plugins/woocommerce/changelog/fix-order-cache-order-type deleted file mode 100644 index 5e58de01771..00000000000 --- a/plugins/woocommerce/changelog/fix-order-cache-order-type +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Do not attempt to cache order during order creation (HPOS). From 6eca1ed56124ffccfb084cb3f28243ddff4d43f2 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 6 Apr 2023 15:14:06 +0530 Subject: [PATCH 1340/1680] Prevent errors from being logged twice when verbose is passed. --- .../src/Database/Migrations/CustomOrderTable/CLIRunner.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index 4393ffc9b26..2a210e453a9 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -294,7 +294,7 @@ class CLIRunner { * default: -1 * --- * - * [--verbose=] + * [--verbose] * : Whether to output errors as they happen in batch, or output them all together at the end. * --- * default: false @@ -425,6 +425,9 @@ class CLIRunner { ) ); } else { + if ( $verbose ) { + return; + } $errors = print_r( $failed_ids, true ); return WP_CLI::error( From dbb4bd5e27778604c911c322a4f29f11922a3e4e Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 6 Apr 2023 15:23:19 +0530 Subject: [PATCH 1341/1680] Dont store order failures when verbose is enabled to save memory. --- .../Database/Migrations/CustomOrderTable/CLIRunner.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php index 2a210e453a9..a25238b7c61 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/CLIRunner.php @@ -363,7 +363,7 @@ class CLIRunner { $batch_start_time = microtime( true ); $failed_ids_in_current_batch = $this->post_to_cot_migrator->verify_migrated_orders( $order_ids ); $failed_ids_in_current_batch = $this->verify_meta_data( $order_ids, $failed_ids_in_current_batch ); - $failed_ids = $failed_ids + $failed_ids_in_current_batch; + $failed_ids = $verbose ? array() : $failed_ids + $failed_ids_in_current_batch; $processed += count( $order_ids ); $batch_total_time = microtime( true ) - $batch_start_time; $batch_count ++; @@ -410,6 +410,10 @@ class CLIRunner { $progress->finish(); WP_CLI::log( __( 'Verification completed.', 'woocommerce' ) ); + if ( $verbose ) { + return; + } + if ( 0 === count( $failed_ids ) ) { return WP_CLI::success( sprintf( @@ -425,9 +429,6 @@ class CLIRunner { ) ); } else { - if ( $verbose ) { - return; - } $errors = print_r( $failed_ids, true ); return WP_CLI::error( From ebb43378a1198fbd9a380fbb0b0338ff4f58e603 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 6 Apr 2023 20:46:59 +0530 Subject: [PATCH 1342/1680] Remove unique constraint from order_key to prevent empty key conflict. --- .../changelog/fix-order_key_migration | 4 ++++ .../DataStores/Orders/OrdersTableDataStore.php | 2 +- .../PostsToOrdersMigrationControllerTest.php | 17 +++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-order_key_migration diff --git a/plugins/woocommerce/changelog/fix-order_key_migration b/plugins/woocommerce/changelog/fix-order_key_migration new file mode 100644 index 00000000000..6d6b7f5a067 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-order_key_migration @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Remove unique constraint from order_key, since orders can be created with emtpy order key, which conflicts with the constraint. diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 4050de796f1..1de11b44f65 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -2412,7 +2412,7 @@ CREATE TABLE $operational_data_table_name ( discount_total_amount decimal(26, 8) NULL, recorded_sales tinyint(1) NULL, UNIQUE KEY order_id (order_id), - UNIQUE KEY order_key (order_key) + KEY order_key (order_key) ) $collate; CREATE TABLE $meta_table ( id bigint(20) unsigned auto_increment primary key, diff --git a/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php b/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php index 1670e5444c3..739d518724f 100644 --- a/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php +++ b/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php @@ -746,4 +746,21 @@ WHERE order_id = {$order_id} AND meta_key = 'non_unique_key_1' AND meta_value in $this->assertEmpty( $errors ); } + + /** + * @testDox Test migration for multiple null order_key meta value. + */ + public function test_order_key_null_multiple() { + $order1 = OrderHelper::create_order(); + $order2 = OrderHelper::create_order(); + delete_post_meta( $order1->get_id(), '_order_key' ); + delete_post_meta( $order2->get_id(), '_order_key' ); + + $this->sut->migrate_order( $order1->get_id() ); + $this->sut->migrate_order( $order2->get_id() ); + + $errors = $this->sut->verify_migrated_orders( array( $order1->get_id(), $order2->get_id() ) ); + + $this->assertEmpty( $errors ); + } } From 7f00d211d11fc26982fc9c83670e44543d2c84e3 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 6 Apr 2023 20:48:11 +0530 Subject: [PATCH 1343/1680] Make migration more strict by removing IGNORE. --- .../src/Database/Migrations/MetaToCustomTableMigrator.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php index 728cdaa70bb..71b0d3022a4 100644 --- a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php @@ -121,7 +121,7 @@ abstract class MetaToCustomTableMigrator extends TableMigrator { list( $value_sql, $column_sql ) = $this->generate_column_clauses( array_merge( $this->core_column_mapping, $this->meta_column_mapping ), $batch ); - return "INSERT IGNORE INTO $table (`$column_sql`) VALUES $value_sql;"; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, -- $insert_query is hardcoded, $value_sql is already escaped. + return "INSERT INTO $table (`$column_sql`) VALUES $value_sql;"; // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, -- $insert_query is hardcoded, $value_sql is already escaped. } /** From 232a98317a211ec633c305df734e1516c077c44b Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 6 Apr 2023 20:48:45 +0530 Subject: [PATCH 1344/1680] Add changelog. --- plugins/woocommerce/changelog/fix-stricter_migration | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-stricter_migration diff --git a/plugins/woocommerce/changelog/fix-stricter_migration b/plugins/woocommerce/changelog/fix-stricter_migration new file mode 100644 index 00000000000..6913259462b --- /dev/null +++ b/plugins/woocommerce/changelog/fix-stricter_migration @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Make migration more strict by removing IGNORE From 322639bb7efb4fe89cc651e9ab201b58e7e20d75 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Thu, 6 Apr 2023 21:06:38 +0530 Subject: [PATCH 1345/1680] Extra protection for empty order key orders. Some order can have order key set to empty string. This commit disallows fetching those orders via key at DB level (its already disallowed from interface). --- .../src/Internal/DataStores/Orders/OrdersTableDataStore.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index 1de11b44f65..f9d15c1e53a 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -847,7 +847,7 @@ WHERE $wpdb->prepare( "SELECT {$orders_table}.id FROM {$orders_table} INNER JOIN {$op_table} ON {$op_table}.order_id = {$orders_table}.id - WHERE {$op_table}.order_key = %s", + WHERE {$op_table}.order_key = %s AND {$op_table}.order_key != ''", $order_key ) ); From 868fbbf23a3370c7244a82721e38aab7428f4fb6 Mon Sep 17 00:00:00 2001 From: Joshua T Flowers Date: Thu, 6 Apr 2023 10:13:48 -0700 Subject: [PATCH 1346/1680] Register product editor blocks server-side (#37339) * Move product block editor to new feature name * Register all blocks and block assets server-side * Add changelog entry * Disable phpcs rule for file_get_contents --- .../client/layout/controller.js | 2 +- .../client/typings/global.d.ts | 2 +- .../changelog/update-37241-block-registration | 4 + .../woocommerce/client/admin/config/core.json | 2 +- .../client/admin/config/development.json | 2 +- .../includes/admin/class-wc-admin-assets.php | 2 +- .../includes/admin/class-wc-admin-menus.php | 2 +- .../src/Admin/Features/Features.php | 2 +- .../ProductBlockEditor/BlockRegistry.php | 92 +++++++++++++++++++ .../Init.php} | 13 ++- 10 files changed, 111 insertions(+), 12 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-37241-block-registration create mode 100644 plugins/woocommerce/src/Admin/Features/ProductBlockEditor/BlockRegistry.php rename plugins/woocommerce/src/Admin/Features/{BlockEditorFeatureEnabled.php => ProductBlockEditor/Init.php} (89%) diff --git a/plugins/woocommerce-admin/client/layout/controller.js b/plugins/woocommerce-admin/client/layout/controller.js index 1863c17522e..b89dd7596d5 100644 --- a/plugins/woocommerce-admin/client/layout/controller.js +++ b/plugins/woocommerce-admin/client/layout/controller.js @@ -167,7 +167,7 @@ export const getPages = () => { } ); } - if ( window.wcAdminFeatures[ 'block-editor-feature-enabled' ] ) { + if ( window.wcAdminFeatures[ 'product-block-editor' ] ) { pages.push( { container: ProductPage, path: '/add-product', diff --git a/plugins/woocommerce-admin/client/typings/global.d.ts b/plugins/woocommerce-admin/client/typings/global.d.ts index 18d3d3c6d02..88b1a9564e8 100644 --- a/plugins/woocommerce-admin/client/typings/global.d.ts +++ b/plugins/woocommerce-admin/client/typings/global.d.ts @@ -9,7 +9,7 @@ declare global { wcAdminFeatures: { 'activity-panels': boolean; analytics: boolean; - 'block-editor-feature-enabled': boolean; + 'product-block-editor': boolean; coupons: boolean; 'customer-effort-score-tracks': boolean; homescreen: boolean; diff --git a/plugins/woocommerce/changelog/update-37241-block-registration b/plugins/woocommerce/changelog/update-37241-block-registration new file mode 100644 index 00000000000..bc69f48ac0f --- /dev/null +++ b/plugins/woocommerce/changelog/update-37241-block-registration @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Register product editor blocks server-side diff --git a/plugins/woocommerce/client/admin/config/core.json b/plugins/woocommerce/client/admin/config/core.json index f796d84a040..ddc2eb8f623 100644 --- a/plugins/woocommerce/client/admin/config/core.json +++ b/plugins/woocommerce/client/admin/config/core.json @@ -2,7 +2,7 @@ "features": { "activity-panels": true, "analytics": true, - "block-editor-feature-enabled": false, + "product-block-editor": false, "coupons": true, "customer-effort-score-tracks": true, "import-products-task": true, diff --git a/plugins/woocommerce/client/admin/config/development.json b/plugins/woocommerce/client/admin/config/development.json index b2511893a64..c6a95550b95 100644 --- a/plugins/woocommerce/client/admin/config/development.json +++ b/plugins/woocommerce/client/admin/config/development.json @@ -2,7 +2,7 @@ "features": { "activity-panels": true, "analytics": true, - "block-editor-feature-enabled": true, + "product-block-editor": true, "coupons": true, "customer-effort-score-tracks": true, "import-products-task": true, diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index 251486de4d8..4c2ba397706 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -225,7 +225,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : 'gateway_toggle' => wp_create_nonce( 'woocommerce-toggle-payment-gateway-enabled' ), ), 'urls' => array( - 'add_product' => Features::is_enabled( 'new-product-management-experience' ) || Features::is_enabled( 'block-editor-feature-enabled' ) ? esc_url_raw( admin_url( 'admin.php?page=wc-admin&path=/add-product' ) ) : null, + 'add_product' => Features::is_enabled( 'new-product-management-experience' ) || Features::is_enabled( 'product-block-editor' ) ? esc_url_raw( admin_url( 'admin.php?page=wc-admin&path=/add-product' ) ) : null, 'import_products' => current_user_can( 'import' ) ? esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_importer' ) ) : null, 'export_products' => current_user_can( 'export' ) ? esc_url_raw( admin_url( 'edit.php?post_type=product&page=product_exporter' ) ) : null, ), diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php index 1f3174c4dc9..79d4eb44045 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-menus.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-menus.php @@ -427,7 +427,7 @@ class WC_Admin_Menus { * Maybe add new management product experience. */ public function maybe_add_new_product_management_experience() { - if ( Features::is_enabled( 'new-product-management-experience' ) || Features::is_enabled( 'block-editor-feature-enabled' ) ) { + if ( Features::is_enabled( 'new-product-management-experience' ) || Features::is_enabled( 'product-block-editor' ) ) { global $submenu; if ( isset( $submenu['edit.php?post_type=product'][10] ) ) { // Disable phpcs since we need to override submenu classes. diff --git a/plugins/woocommerce/src/Admin/Features/Features.php b/plugins/woocommerce/src/Admin/Features/Features.php index 681b322bb6c..0c7d36b845e 100644 --- a/plugins/woocommerce/src/Admin/Features/Features.php +++ b/plugins/woocommerce/src/Admin/Features/Features.php @@ -40,7 +40,7 @@ class Features { protected static $beta_features = array( 'navigation', 'new-product-management-experience', - 'block-editor-feature-enabled', + 'product-block-editor', 'settings', ); diff --git a/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/BlockRegistry.php b/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/BlockRegistry.php new file mode 100644 index 00000000000..0271e4cf7ac --- /dev/null +++ b/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/BlockRegistry.php @@ -0,0 +1,92 @@ +register_block( $block_name ); + } + } + + /** + * Get the block name without the "woocommerce/" prefix. + * + * @param string $block_name Block name. + * + * @return string + */ + public function remove_block_prefix( $block_name ) { + if ( 0 === strpos( $block_name, 'woocommerce/' ) ) { + return substr_replace( $block_name, '', 0, strlen( 'woocommerce/' ) ); + } + + return $block_name; + } + + /** + * Register a single block. + * + * @param string $block_name Block name. + * + * @return WP_Block_Type|false The registered block type on success, or false on failure. + */ + public function register_block( $block_name ) { + $block_name = $this->remove_block_prefix( $block_name ); + $block_json_file = $this->get_file_path( $block_name . '/block.json' ); + + if ( ! file_exists( $block_json_file ) ) { + return false; + } + + // phpcs:disable WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents + $metadata = json_decode( file_get_contents( $block_json_file ), true ); + if ( ! is_array( $metadata ) || ! $metadata['name'] ) { + return false; + } + + $registry = \WP_Block_Type_Registry::get_instance(); + + if ( $registry->is_registered( $metadata['name'] ) ) { + $registry->unregister( $metadata['name'] ); + } + + return register_block_type_from_metadata( $block_json_file ); + } + +} diff --git a/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php b/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php similarity index 89% rename from plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php rename to plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php index bdd41ab0a84..b907226e10f 100644 --- a/plugins/woocommerce/src/Admin/Features/BlockEditorFeatureEnabled.php +++ b/plugins/woocommerce/src/Admin/Features/ProductBlockEditor/Init.php @@ -1,21 +1,22 @@ register_product_blocks(); } } From 2396eb8e4c0be8363f473e02c8da5ac6e2b5f410 Mon Sep 17 00:00:00 2001 From: Barry Hughes <3594411+barryhughes@users.noreply.github.com> Date: Thu, 6 Apr 2023 12:24:35 -0700 Subject: [PATCH 1347/1680] Add link to GitHub Discussions per DevAdv feedback. --- .github/CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6e472c962d1..03c09011544 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -48,4 +48,4 @@ If you are contributing code to our (Javascript-driven) Gutenberg blocks, please The best place to submit feature requests is over on our [dedicated feature request page](https://woocommerce.com/feature-requests/woocommerce/). You can easily search and vote for existing requests, or create new requests if necessary. -Alternatively, if you wish to propose a straightforward technical enhancement that is unlikely to require much discussion, you can [open a new issue](https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=type%3A+enhancement%2Cstatus%3A+awaiting+triage&template=2-enhancement.yml&title=%5BEnhancement%5D%3A+) right here on GitHub. +Alternatively, if you wish to propose a straightforward technical enhancement that is unlikely to require much discussion, you can [open a new issue](https://github.com/woocommerce/woocommerce/issues/new?assignees=&labels=type%3A+enhancement%2Cstatus%3A+awaiting+triage&template=2-enhancement.yml&title=%5BEnhancement%5D%3A+) right here on GitHub and, for any that may require more discussion, consider syncing with us during office hours or publishing a thread on [GitHub Discussions](https://github.com/woocommerce/woocommerce/discussions). From e0327e32232221e42a4d864bdd916fc93c80718b Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 7 Apr 2023 18:06:55 +0530 Subject: [PATCH 1348/1680] Fixup in unit test. --- .../class-wc-abstract-order-test.php | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) 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 3b2cc7a9c46..f0e9b60cd6e 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 @@ -272,11 +272,16 @@ class WC_Abstract_Order_Test extends WC_Unit_Test_Case { /** * Test for get_discount_to_display which must return a value - * with and without tax whatever the setting of the options + * with and without tax whatever the setting of the options. * * Issue :https://github.com/woocommerce/woocommerce/issues/36794 */ public function test_get_discount_to_display() { + update_option( 'woocommerce_calc_taxes', 'yes' ); + update_option( 'woocommerce_prices_include_tax', 'no' ); + update_option( 'woocommerce_currency', 'USD' ); + update_option( 'woocommerce_tax_display_cart', 'incl' ); + // Set dummy data $tax_rate = array( 'tax_rate_country' => '', @@ -289,7 +294,7 @@ class WC_Abstract_Order_Test extends WC_Unit_Test_Case { WC_Tax::_insert_tax_rate( $tax_rate ); $coupon = WC_Helper_Coupon::create_coupon(); - $product = WC_Helper_Product::create_simple_product(); + $product = WC_Helper_Product::create_simple_product( true, array( 'price' => 10 ) ); $order = new WC_Order(); $order->add_product( $product ); @@ -297,16 +302,8 @@ class WC_Abstract_Order_Test extends WC_Unit_Test_Case { $order->calculate_totals(); $order->save(); - // Test - update_option( 'woocommerce_currency', 'USD' ); - update_option( 'woocommerce_currency_pos', 'right' ); - update_option( 'woocommerce_price_thousand_sep', '' ); - update_option( 'woocommerce_price_decimal_sep', '.' ); - update_option( 'woocommerce_price_num_decimals', 2 ); - - update_option( 'woocommerce_tax_display_cart', 'incl' ); - $this->assertEquals( '1.00$', strip_tags( $order->get_discount_to_display( 'excl' ) ) ); - $this->assertEquals( '1.20$', strip_tags( $order->get_discount_to_display( 'incl' ) ) ); + $this->assertEquals( wc_price( 1, array( 'currency' => 'USD' ) ), $order->get_discount_to_display( 'excl' ) ); + $this->assertEquals( wc_price( 1.20, array( 'currency' => 'USD' ) ), $order->get_discount_to_display( 'incl' ) ); } } From 835d089fb745d7abe0a2d67809007e2e1f5d1eda Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 7 Apr 2023 18:11:32 +0530 Subject: [PATCH 1349/1680] Add changelog. --- plugins/woocommerce/changelog/pr-36885 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/pr-36885 diff --git a/plugins/woocommerce/changelog/pr-36885 b/plugins/woocommerce/changelog/pr-36885 new file mode 100644 index 00000000000..ed20c22ae98 --- /dev/null +++ b/plugins/woocommerce/changelog/pr-36885 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Remove double checking for woocommerce_tax_display_cart filter. From 40d823df5c5a07cbf0d764d1c14df26742067c99 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Fri, 7 Apr 2023 18:31:21 +0530 Subject: [PATCH 1350/1680] Coding standard fix. --- .../woocommerce/includes/abstracts/abstract-wc-order.php | 6 ++++++ .../php/includes/abstracts/class-wc-abstract-order-test.php | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php index e077c36055e..717800b4c4c 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php @@ -2185,6 +2185,12 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order { */ public function get_discount_to_display( $tax_display = '' ) { $tax_display = $tax_display ? $tax_display : get_option( 'woocommerce_tax_display_cart' ); + + /** + * Filter the discount amount to display. + * + * @since 2.7.0. + */ return apply_filters( 'woocommerce_order_discount_to_display', wc_price( $this->get_total_discount( 'excl' === $tax_display ), array( 'currency' => $this->get_currency() ) ), $this ); } 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 23e0f9a1f79..b164ec95a5f 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 @@ -282,7 +282,7 @@ class WC_Abstract_Order_Test extends WC_Unit_Test_Case { update_option( 'woocommerce_currency', 'USD' ); update_option( 'woocommerce_tax_display_cart', 'incl' ); - // Set dummy data + // Set dummy data. $tax_rate = array( 'tax_rate_country' => '', 'tax_rate_state' => '', From ad565bd8534ed6a5546e91b2f411fba38338769c Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Fri, 7 Apr 2023 15:40:44 -0700 Subject: [PATCH 1351/1680] Add table name methods to OrderUtil Adds methods to determine the names of the database tables currently being used for orders and order meta, without needing to make a separate check first to see if HPOS is enabled and in use. --- .../woocommerce/src/Utilities/OrderUtil.php | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Utilities/OrderUtil.php b/plugins/woocommerce/src/Utilities/OrderUtil.php index 1a609058a01..e341ef8ef50 100644 --- a/plugins/woocommerce/src/Utilities/OrderUtil.php +++ b/plugins/woocommerce/src/Utilities/OrderUtil.php @@ -7,7 +7,7 @@ namespace Automattic\WooCommerce\Utilities; use Automattic\WooCommerce\Caches\OrderCacheController; use Automattic\WooCommerce\Internal\Admin\Orders\PageController; -use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController; +use Automattic\WooCommerce\Internal\DataStores\Orders\{ CustomOrdersTableController, OrdersTableDataStore }; use Automattic\WooCommerce\Internal\Features\FeaturesController; use Automattic\WooCommerce\Internal\Utilities\COTMigrationUtil; use WC_Order; @@ -134,4 +134,36 @@ final class OrderUtil { public static function get_order_admin_new_url() : string { return wc_get_container()->get( PageController::class )->get_new_page_url(); } + + /** + * Get the name of the database table that's currently in use for orders. + * + * @return string + */ + public static function get_table_for_orders() { + if ( self::custom_orders_table_usage_is_enabled() ) { + $table_name = OrdersTableDataStore::get_orders_table_name(); + } else { + global $wpdb; + $table_name = $wpdb->posts; + } + + return $table_name; + } + + /** + * Get the name of the database table that's currently in use for orders. + * + * @return string + */ + public static function get_table_for_order_meta() { + if ( self::custom_orders_table_usage_is_enabled() ) { + $table_name = OrdersTableDataStore::get_meta_table_name(); + } else { + global $wpdb; + $table_name = $wpdb->postmeta; + } + + return $table_name; + } } From 208fa5ea00af4c22494fe55317d646e77cf91e69 Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Fri, 7 Apr 2023 17:21:12 -0700 Subject: [PATCH 1352/1680] Add unit tests --- .../tests/php/src/Utilities/OrderUtilTest.php | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php diff --git a/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php b/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php new file mode 100644 index 00000000000..a1726b28992 --- /dev/null +++ b/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php @@ -0,0 +1,76 @@ +prev_cot_state = OrderUtil::custom_orders_table_usage_is_enabled(); + } + + /** + * Restore the COT state after the test. + * + * @return void + */ + public function tearDown(): void { + OrderHelper::toggle_cot( $this->prev_cot_state ); + parent::tearDown(); + } + + /** + * @testdox `get_table_for_orders` should return the name of the posts table when HPOS is not in use. + */ + public function test_get_table_for_orders_posts() { + OrderHelper::toggle_cot( false ); + + $table_name = OrderUtil::get_table_for_orders(); + $this->assertEquals( 'wptests_posts', $table_name ); + } + + /** + * @testdox `get_table_for_orders` should return the name of the orders table when HPOS is in use. + */ + public function test_get_table_for_orders_hpos() { + OrderHelper::toggle_cot( true ); + + $table_name = OrderUtil::get_table_for_orders(); + $this->assertEquals( 'wptests_wc_orders', $table_name ); + } + + /** + * @testdox `get_table_for_order_meta` should return the name of the postmeta table when HPOS is not in use. + */ + public function test_get_table_for_order_meta_posts() { + OrderHelper::toggle_cot( false ); + + $table_name = OrderUtil::get_table_for_order_meta(); + $this->assertEquals( 'wptests_postmeta', $table_name ); + } + + /** + * @testdox `get_table_for_order_meta` should return the name of the orders meta table when HPOS is in use. + */ + public function test_get_table_for_order_meta_hpos() { + OrderHelper::toggle_cot( true ); + + $table_name = OrderUtil::get_table_for_order_meta(); + $this->assertEquals( 'wptests_wc_orders_meta', $table_name ); + } +} From 62ceb8e08b0bf559998a9c4d627aa41d8975f43a Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Fri, 7 Apr 2023 17:30:31 -0700 Subject: [PATCH 1353/1680] Add changelog file --- plugins/woocommerce/changelog/add-hpos-table-name-util | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/add-hpos-table-name-util diff --git a/plugins/woocommerce/changelog/add-hpos-table-name-util b/plugins/woocommerce/changelog/add-hpos-table-name-util new file mode 100644 index 00000000000..164749112f1 --- /dev/null +++ b/plugins/woocommerce/changelog/add-hpos-table-name-util @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add methods to OrderUtil to get the names of order database tables From 0bc31867a49ab3e06eb3af0b96702988ae128a85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CChris?= Date: Mon, 10 Apr 2023 14:25:19 +0300 Subject: [PATCH 1354/1680] Print block-based css classes only on fse themes --- plugins/woocommerce/includes/wc-conditional-functions.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/woocommerce/includes/wc-conditional-functions.php b/plugins/woocommerce/includes/wc-conditional-functions.php index 64651baab16..c5fc0c261e8 100644 --- a/plugins/woocommerce/includes/wc-conditional-functions.php +++ b/plugins/woocommerce/includes/wc-conditional-functions.php @@ -527,7 +527,7 @@ function wc_current_theme_supports_woocommerce_or_fse() { /** * Given an element name, returns a class name. * - * If the WP-related function is not defined, return empty string. + * If the WP-related function is not defined or current theme is not a FSE theme, return empty string. * * @param string $element The name of the element. * @@ -535,7 +535,7 @@ function wc_current_theme_supports_woocommerce_or_fse() { * @return string */ function wc_wp_theme_get_element_class_name( $element ) { - if ( function_exists( 'wp_theme_get_element_class_name' ) ) { + if ( wc_current_theme_is_fse_theme() && function_exists( 'wp_theme_get_element_class_name' ) ) { return wp_theme_get_element_class_name( $element ); } From 0863a76ce180aed18404c3618c594389af3c0ed4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CChris?= Date: Mon, 10 Apr 2023 14:27:20 +0300 Subject: [PATCH 1355/1680] Add changelog --- .../changelog/enchancement-37630-theme-element-class-name | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/enchancement-37630-theme-element-class-name diff --git a/plugins/woocommerce/changelog/enchancement-37630-theme-element-class-name b/plugins/woocommerce/changelog/enchancement-37630-theme-element-class-name new file mode 100644 index 00000000000..67c83314bf7 --- /dev/null +++ b/plugins/woocommerce/changelog/enchancement-37630-theme-element-class-name @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Print blocks-based CSS classes only when a FSE theme is used From 5dda0aac48b7fd95f86332a7fc68a8839b4e2298 Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Mon, 10 Apr 2023 08:34:38 -0400 Subject: [PATCH 1356/1680] Beta Tester: Update WCA Test Helper Features list (#37483) * Alphabetize features list * Use toggles instead of button for features * Changelog --- .../update-test-helper-features-list | 4 ++ .../src/features/index.js | 50 +++++++------------ 2 files changed, 22 insertions(+), 32 deletions(-) create mode 100644 plugins/woocommerce-beta-tester/changelog/update-test-helper-features-list diff --git a/plugins/woocommerce-beta-tester/changelog/update-test-helper-features-list b/plugins/woocommerce-beta-tester/changelog/update-test-helper-features-list new file mode 100644 index 00000000000..eacb1ddb3c4 --- /dev/null +++ b/plugins/woocommerce-beta-tester/changelog/update-test-helper-features-list @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Alphabetize the features list, and use toggle controls instead of buttons. diff --git a/plugins/woocommerce-beta-tester/src/features/index.js b/plugins/woocommerce-beta-tester/src/features/index.js index f89defecc1c..667f817de85 100644 --- a/plugins/woocommerce-beta-tester/src/features/index.js +++ b/plugins/woocommerce-beta-tester/src/features/index.js @@ -2,7 +2,7 @@ * External dependencies */ import { useDispatch, useSelect } from '@wordpress/data'; -import { Button } from '@wordpress/components'; +import { Button, ToggleControl } from '@wordpress/components'; /** * Internal dependencies @@ -21,6 +21,8 @@ function Features() { const { toggleFeature, resetModifiedFeatures } = useDispatch( STORE_KEY ); + const sortedFeatureNames = Object.keys( features ).sort(); + return (

    @@ -34,37 +36,21 @@ function Features() { Reset to defaults

    -
    get( HtmlSanitizer::class )->sanitize( $total['value'] ) : wp_kses_post( $total['value'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
    get( HtmlSanitizer::class )->sanitize( $total['value'] ) : wp_kses_post( $total['value'] ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
    - - - - - - - - - { Object.keys( features ).map( ( feature_name ) => { - return ( - - - - - - ); - } ) } - -
    Feature NameEnabled?Toggle
    - { feature_name } - { features[ feature_name ].toString() } - -
    +

      + { sortedFeatureNames.map( ( feature_name ) => { + return ( +
    • + { + toggleFeature( feature_name ); + } } + /> +
    • + ); + } ) } +
    ); } From a054ddbf50383147ab844ab1d8eef9658f7f470a Mon Sep 17 00:00:00 2001 From: Matt Sherman Date: Mon, 10 Apr 2023 08:36:13 -0400 Subject: [PATCH 1357/1680] Beta Tester: Update WCA Test Helper option modal to show full option name (#37495) * Adjust options modal so that option name is not cut off * Changelog --- .../changelog/fix-test-helper-option-modal | 4 ++ .../woocommerce-beta-tester/src/index.scss | 32 +++++++++-- .../src/options/OptionEditor.js | 48 ---------------- .../src/options/index.js | 24 +++----- .../src/options/option-modal.js | 57 +++++++++++++++++++ 5 files changed, 95 insertions(+), 70 deletions(-) create mode 100644 plugins/woocommerce-beta-tester/changelog/fix-test-helper-option-modal delete mode 100644 plugins/woocommerce-beta-tester/src/options/OptionEditor.js create mode 100644 plugins/woocommerce-beta-tester/src/options/option-modal.js diff --git a/plugins/woocommerce-beta-tester/changelog/fix-test-helper-option-modal b/plugins/woocommerce-beta-tester/changelog/fix-test-helper-option-modal new file mode 100644 index 00000000000..ae1bfdb42bc --- /dev/null +++ b/plugins/woocommerce-beta-tester/changelog/fix-test-helper-option-modal @@ -0,0 +1,4 @@ +Significance: minor +Type: enhancement + +Adjust option modal so that longer option names are fully shown. diff --git a/plugins/woocommerce-beta-tester/src/index.scss b/plugins/woocommerce-beta-tester/src/index.scss index b051363c9f4..d213c21ec37 100644 --- a/plugins/woocommerce-beta-tester/src/index.scss +++ b/plugins/woocommerce-beta-tester/src/index.scss @@ -50,13 +50,33 @@ } } -.wca-test-helper-option-editor { - width: 100%; - height: 300px; -} +.wca-test-helper-option-modal-content { + display: flex; + flex-direction: column; -.wca-test-helper-edit-btn-save { - float: right; + label { + margin-bottom: 5px; + } + + output, textarea { + margin-bottom: 10px; + } + + #wca-test-helper-option-modal-name { + font-size: 1.2em; + font-weight: bold; + } + + #wca-test-helper-option-editor { + height: 300px; + } + + .wca-test-helper-option-modal-buttons { + display: flex; + justify-content: flex-end; + margin-top: 10px; + gap: 10px; + } } #wc-admin-test-helper-tools, diff --git a/plugins/woocommerce-beta-tester/src/options/OptionEditor.js b/plugins/woocommerce-beta-tester/src/options/OptionEditor.js deleted file mode 100644 index 5784b179fd3..00000000000 --- a/plugins/woocommerce-beta-tester/src/options/OptionEditor.js +++ /dev/null @@ -1,48 +0,0 @@ -/** - * External dependencies - */ -import { useEffect, useState } from '@wordpress/element'; -import PropTypes from 'prop-types'; -import { Button } from '@wordpress/components'; - -const OptionEditor = ( props ) => { - const [ value, setValue ] = useState( props.option.content ); - - useEffect( () => { - setValue( props.option.content ); - }, [ props.option ] ); - - const handleChange = ( event ) => { - setValue( event.target.value ); - }; - - const handleSave = () => { - props.onSave( props.option.name, value ); - }; - - return ( - <> - - -
    - - ); -}; - -OptionEditor.propTypes = { - option: PropTypes.object.isRequired, - onSave: PropTypes.func.isRequired, -}; - -export default OptionEditor; diff --git a/plugins/woocommerce-beta-tester/src/options/index.js b/plugins/woocommerce-beta-tester/src/options/index.js index a85a37afcea..c4eae7e908d 100644 --- a/plugins/woocommerce-beta-tester/src/options/index.js +++ b/plugins/woocommerce-beta-tester/src/options/index.js @@ -3,14 +3,14 @@ */ import { withDispatch, withSelect } from '@wordpress/data'; import { compose } from '@wordpress/compose'; -import { Modal, Notice } from '@wordpress/components'; +import { Notice } from '@wordpress/components'; import { useState } from '@wordpress/element'; /** * Internal dependencies */ import { STORE_KEY } from './data/constants'; -import { default as OptionEditor } from './OptionEditor'; +import { OptionModal } from './option-modal'; import './data'; function shorten( input ) { @@ -131,17 +131,13 @@ function Options( { return ( <> { isEditModalOpen && ( - { setEditModalOpen( false ); } } - > - - + option={ editingOption } + onSave={ handleSaveOption } + /> ) }
    { notice.message.length > 0 && ( @@ -224,12 +220,8 @@ function Options( { export default compose( withSelect( ( select ) => { - const { - getOptions, - getOptionForEditing, - getNotice, - isLoading, - } = select( STORE_KEY ); + const { getOptions, getOptionForEditing, getNotice, isLoading } = + select( STORE_KEY ); const options = getOptions(); const editingOption = getOptionForEditing(); const notice = getNotice(); diff --git a/plugins/woocommerce-beta-tester/src/options/option-modal.js b/plugins/woocommerce-beta-tester/src/options/option-modal.js new file mode 100644 index 00000000000..6bbca0c3567 --- /dev/null +++ b/plugins/woocommerce-beta-tester/src/options/option-modal.js @@ -0,0 +1,57 @@ +/** + * External dependencies + */ +import { useEffect, useState } from '@wordpress/element'; +import PropTypes from 'prop-types'; +import { Button, Modal } from '@wordpress/components'; + +export const OptionModal = ( props ) => { + const [ value, setValue ] = useState( props.option.content ); + + useEffect( () => { + setValue( props.option.content ); + }, [ props.option ] ); + + const handleChange = ( event ) => { + setValue( event.target.value ); + }; + + const handleSave = () => { + props.onSave( props.option.name, value ); + }; + + return ( + +
    + + + { props.option.name } + + + +
    + + +
    +
    +
    + ); +}; + +OptionModal.propTypes = { + option: PropTypes.object.isRequired, + onRequestClose: PropTypes.func.isRequired, + onSave: PropTypes.func.isRequired, +}; From 2c626fe854c825bde40588dee816ad26aff2876a Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 10 Apr 2023 14:11:08 -0500 Subject: [PATCH 1358/1680] Add auto-draft to orders list table --- .../woocommerce/src/Internal/Admin/Orders/ListTable.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php index 02745c54589..c105b4e4ce1 100644 --- a/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php +++ b/plugins/woocommerce/src/Internal/Admin/Orders/ListTable.php @@ -471,7 +471,7 @@ class ListTable extends WP_List_Table { $view_counts[ $slug ] = $total_in_status; } - if ( ( get_post_status_object( $slug ) )->show_in_admin_all_list ) { + if ( ( get_post_status_object( $slug ) )->show_in_admin_all_list && 'auto-draft' !== $slug ) { $all_count += $total_in_status; } } @@ -550,8 +550,9 @@ class ListTable extends WP_List_Table { array_merge( wc_get_order_statuses(), array( - 'trash' => ( get_post_status_object( 'trash' ) )->label, - 'draft' => ( get_post_status_object( 'draft' ) )->label, + 'trash' => ( get_post_status_object( 'trash' ) )->label, + 'draft' => ( get_post_status_object( 'draft' ) )->label, + 'auto-draft' => ( get_post_status_object( 'auto-draft' ) )->label, ) ), array_flip( get_post_stati( array( 'show_in_admin_status_list' => true ) ) ) @@ -916,7 +917,7 @@ class ListTable extends WP_List_Table { } // Gracefully handle legacy statuses. - if ( in_array( $order->get_status(), array( 'trash', 'draft' ), true ) ) { + if ( in_array( $order->get_status(), array( 'trash', 'draft', 'auto-draft' ), true ) ) { $status_name = ( get_post_status_object( $order->get_status() ) )->label; } else { $status_name = wc_get_order_status_name( $order->get_status() ); From 9d60bf90ed4277238b9049765bee41c3817a4af2 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 10 Apr 2023 14:13:00 -0500 Subject: [PATCH 1359/1680] =?UTF-8?q?Create=20orders=20as=20=E2=80=98auto-?= =?UTF-8?q?draft=E2=80=99=20instead=20of=20=E2=80=98pending=E2=80=99=20in?= =?UTF-8?q?=20the=20admin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/Internal/Admin/Orders/PageController.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Internal/Admin/Orders/PageController.php b/plugins/woocommerce/src/Internal/Admin/Orders/PageController.php index b2e93628844..7f6109a2dbd 100644 --- a/plugins/woocommerce/src/Internal/Admin/Orders/PageController.php +++ b/plugins/woocommerce/src/Internal/Admin/Orders/PageController.php @@ -286,9 +286,14 @@ class PageController { $this->order = new $order_class_name(); $this->order->set_object_read( false ); - $this->order->set_status( 'pending' ); + $this->order->set_status( 'auto-draft' ); $this->order->save(); + // Schedule auto-draft cleanup. We re-use the WP event here on purpose. + if ( ! wp_next_scheduled( 'wp_scheduled_auto_draft_delete' ) ) { + wp_schedule_event( time(), 'daily', 'wp_scheduled_auto_draft_delete' ); + } + $theorder = $this->order; } From dec3dda375788048fcddf5c66b318eb150e71d9d Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 10 Apr 2023 14:13:12 -0500 Subject: [PATCH 1360/1680] Periodically delete auto-draft orders older than a week --- .../DataStores/Orders/DataSynchronizer.php | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php index 193009492ec..d407ef946d4 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/DataSynchronizer.php @@ -79,6 +79,8 @@ class DataSynchronizer implements BatchProcessorInterface { self::add_action( 'deleted_post', array( $this, 'handle_deleted_post' ), 10, 2 ); self::add_action( 'woocommerce_new_order', array( $this, 'handle_updated_order' ), 100 ); self::add_action( 'woocommerce_update_order', array( $this, 'handle_updated_order' ), 100 ); + self::add_action( 'wp_scheduled_auto_draft_delete', array( $this, 'delete_auto_draft_orders' ) ); + self::add_filter( 'woocommerce_feature_description_tip', array( $this, 'handle_feature_description_tip' ), 10, 3 ); } @@ -467,6 +469,45 @@ ORDER BY orders.id ASC } } + /** + * Handles deletion of auto-draft orders in sync with WP's own auto-draft deletion. + * + * @since 7.7.0 + * + * @return void + */ + private function delete_auto_draft_orders() { + if ( ! $this->custom_orders_table_is_authoritative() ) { + return; + } + + // Fetch auto-draft orders older than 1 week. + $to_delete = wc_get_orders( + array( + 'date_query' => array( + array( + 'column' => 'date_created', + 'before' => '-1 week', + ), + ), + 'orderby' => 'date', + 'order' => 'ASC', + 'status' => 'auto-draft', + ) + ); + + foreach ( $to_delete as $order ) { + $order->delete( true ); + } + + /** + * Fires after schedueld deletion of auto-draft orders has been completed. + * + * @since 7.7.0 + */ + do_action( 'woocommerce_scheduled_auto_draft_delete' ); + } + /** * Handle the 'woocommerce_feature_description_tip' filter. * From 4873f7c2c5457e16df8a78f3cf181527d662a202 Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 10 Apr 2023 14:13:22 -0500 Subject: [PATCH 1361/1680] Test auto-draft deletion --- .../Orders/DataSynchronizerTests.php | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php index 6d1ac547a35..9fc3fe77805 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/DataSynchronizerTests.php @@ -28,6 +28,7 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { remove_filter( 'query', array( $this, '_drop_temporary_tables' ) ); OrderHelper::delete_order_custom_tables(); // We need this since non-temporary tables won't drop automatically. OrderHelper::create_order_custom_table_if_not_exist(); + OrderHelper::toggle_cot( false ); $this->sut = wc_get_container()->get( DataSynchronizer::class ); $features_controller = wc_get_container()->get( Featurescontroller::class ); $features_controller->change_feature_enable( 'custom_order_tables', true ); @@ -311,4 +312,43 @@ class DataSynchronizerTests extends WC_Unit_Test_Case { $this->assertEquals( $order2->get_id(), $orders_to_migrate[0] ); $this->assertEquals( $max_id + 1, $orders_to_migrate[1] ); } + + /** + * Tests that auto-draft orders older than 1 week are automatically deleted when WP does the same for posts. + * + * @return void + */ + public function test_auto_draft_deletion(): void { + OrderHelper::toggle_cot( true ); + + $order1 = new \WC_Order(); + $order1->set_status( 'auto-draft' ); + $order1->set_date_created( strtotime( '-10 days' ) ); + $order1->save(); + + $order2 = new \WC_Order(); + $order2->set_status( 'auto-draft' ); + $order2->save(); + + $order3 = new \WC_Order(); + $order3->set_status( 'processing' ); + $order3->save(); + + // Run WP's auto-draft delete. + do_action( 'wp_scheduled_auto_draft_delete' ); // phpcs:ignore WooCommerce.Commenting.CommentHooks.HookCommentWrongStyle + + $orders = wc_get_orders( + array( + 'status' => 'all', + 'limit' => -1, + 'return' => 'ids', + ) + ); + + // Confirm that only $order1 is deleted when the action runs but the other orders remain intact. + $this->assertContains( $order2->get_id(), $orders ); + $this->assertContains( $order3->get_id(), $orders ); + $this->assertNotContains( $order1->get_id(), $orders ); + } + } From 4e16e6117b317b0cff484a025a01abe2775a565a Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 10 Apr 2023 14:13:28 -0500 Subject: [PATCH 1362/1680] Add changelog --- plugins/woocommerce/changelog/fix-36749 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-36749 diff --git a/plugins/woocommerce/changelog/fix-36749 b/plugins/woocommerce/changelog/fix-36749 new file mode 100644 index 00000000000..3dbb28e7f2b --- /dev/null +++ b/plugins/woocommerce/changelog/fix-36749 @@ -0,0 +1,4 @@ +Significance: patch +Type: add + +Create orders as 'auto-draft' by default in admin. From 18d00cadd0e0c851d5a41ec54a76b8f7b5b5647a Mon Sep 17 00:00:00 2001 From: "Jorge A. Torres" Date: Mon, 10 Apr 2023 15:11:03 -0500 Subject: [PATCH 1363/1680] =?UTF-8?q?Consider=20=E2=80=98auto-draft?= =?UTF-8?q?=E2=80=99=20the=20same=20as=20=E2=80=98pending=E2=80=99=20for?= =?UTF-8?q?=20orders?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This for backwards compat with CPT --- plugins/woocommerce/includes/abstracts/abstract-wc-order.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php index 717800b4c4c..e4afa9c5be7 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php @@ -638,7 +638,7 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order { } // If the old status is set but unknown (e.g. draft) assume its pending for action usage. - if ( $old_status && ! in_array( 'wc-' . $old_status, $this->get_valid_statuses(), true ) && ! in_array( $old_status, $status_exceptions, true ) ) { + if ( $old_status && ( ( ! in_array( 'wc-' . $old_status, $this->get_valid_statuses(), true ) && ! in_array( $old_status, $status_exceptions, true ) ) || 'auto-draft' === $old_status ) ) { $old_status = 'pending'; } } From 5d68259480fba10094c242c2e1286c81d79d568a Mon Sep 17 00:00:00 2001 From: Nathan Silveira Date: Mon, 10 Apr 2023 17:44:51 -0300 Subject: [PATCH 1364/1680] Add different confirmation message when attribute is used in a variation (#37527) * Add different confirmation message when attribute is used in a variation * Update logic to only consider checkbox checked value when prompting message --- .../changelog/update-confirm-remove-attr | 4 + .../legacy/js/admin/meta-boxes-product.js | 83 ++++++++++--------- .../includes/admin/class-wc-admin-assets.php | 1 + 3 files changed, 51 insertions(+), 37 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-confirm-remove-attr diff --git a/plugins/woocommerce/changelog/update-confirm-remove-attr b/plugins/woocommerce/changelog/update-confirm-remove-attr new file mode 100644 index 00000000000..6b39ccb9d9a --- /dev/null +++ b/plugins/woocommerce/changelog/update-confirm-remove-attr @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Show different error message when deleting an attribute used in variations diff --git a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js index 859901b27fa..efb439fb50e 100644 --- a/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js +++ b/plugins/woocommerce/client/legacy/js/admin/meta-boxes-product.js @@ -628,47 +628,56 @@ jQuery( function ( $ ) { } ); - $( '.product_attributes' ).on( 'click', '.remove_row', function () { - if ( window.confirm( woocommerce_admin_meta_boxes.remove_attribute ) ) { + $( '#product_attributes' ).on( + 'click', + '.product_attributes .remove_row', + function () { var $parent = $( this ).parent().parent(); + var confirmMessage = $parent + .find( 'input[name^="attribute_variation"]' ) + .is( ':checked' ) + ? woocommerce_admin_meta_boxes.i18n_remove_used_attribute_confirmation_message + : woocommerce_admin_meta_boxes.remove_attribute; - if ( $parent.is( '.taxonomy' ) ) { - $parent.find( 'select, input[type=text]' ).val( '' ); - $parent.hide(); - $( 'select.attribute_taxonomy' ) - .find( - 'option[value="' + $parent.data( 'taxonomy' ) + '"]' - ) - .prop( 'disabled', false ); - selectedAttributes = selectedAttributes.filter( - ( attr ) => attr !== $parent.data( 'taxonomy' ) - ); - $( 'select.wc-attribute-search' ).data( - 'disabled-items', - selectedAttributes - ); - } else { - $parent.find( 'select, input[type=text]' ).val( '' ); - $parent.hide(); - attribute_row_indexes(); + if ( window.confirm( confirmMessage ) ) { + if ( $parent.is( '.taxonomy' ) ) { + $parent.find( 'select, input[type=text]' ).val( '' ); + $parent.hide(); + $( 'select.attribute_taxonomy' ) + .find( + 'option[value="' + $parent.data( 'taxonomy' ) + '"]' + ) + .prop( 'disabled', false ); + selectedAttributes = selectedAttributes.filter( + ( attr ) => attr !== $parent.data( 'taxonomy' ) + ); + $( 'select.wc-attribute-search' ).data( + 'disabled-items', + selectedAttributes + ); + } else { + $parent.find( 'select, input[type=text]' ).val( '' ); + $parent.hide(); + attribute_row_indexes(); + } + + $parent.remove(); + + if ( + ! $( '.woocommerce_attribute_data' ).is( ':visible' ) && + ! $( 'div.add-global-attribute-container' ).hasClass( + 'hidden' + ) && + $( '.product_attributes' ).find( 'input, select, textarea' ) + .length === 0 + ) { + toggle_add_global_attribute_layout(); + } + jQuery.maybe_disable_save_button(); } - - $parent.remove(); - - if ( - ! $( '.woocommerce_attribute_data' ).is( ':visible' ) && - ! $( 'div.add-global-attribute-container' ).hasClass( - 'hidden' - ) && - $( '.product_attributes' ).find( 'input, select, textarea' ) - .length === 0 - ) { - toggle_add_global_attribute_layout(); - } - jQuery.maybe_disable_save_button(); + return false; } - return false; - } ); + ); // Attribute ordering. $( '.product_attributes' ).sortable( { diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index 4c2ba397706..04e9a4b1334 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -432,6 +432,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : 'i18n_save_attribute_variation_tip' => __( 'Make sure you enter the name and values for each attribute.', 'woocommerce' ), /* translators: %1$s: maximum file size */ 'i18n_product_image_tip' => sprintf( __( 'For best results, upload JPEG or PNG files that are 1000 by 1000 pixels or larger. Maximum upload file size: %1$s.', 'woocommerce' ) , size_format( wp_max_upload_size() ) ), + 'i18n_remove_used_attribute_confirmation_message' => __( 'If you remove this attribute, customers will no longer be able to purchase some variations of this product.', 'woocommerce' ), ); wp_localize_script( 'wc-admin-meta-boxes', 'woocommerce_admin_meta_boxes', $params ); From 4cc6644c8badfa07436016bb5ff00aff10225370 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Tue, 11 Apr 2023 14:13:59 +0800 Subject: [PATCH 1365/1680] Add default priority for countries that don't exist in payment recommendation map (#37590) * Add default priority for countries that are not in the payment recommendation map * Add changelog * Add doc * Fix linting --- .../update-default-payment-gateway-priority | 4 ++ .../DefaultPaymentGateways.php | 50 ++++++++++++++++++- 2 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-default-payment-gateway-priority diff --git a/plugins/woocommerce/changelog/update-default-payment-gateway-priority b/plugins/woocommerce/changelog/update-default-payment-gateway-priority new file mode 100644 index 00000000000..1313a944650 --- /dev/null +++ b/plugins/woocommerce/changelog/update-default-payment-gateway-priority @@ -0,0 +1,4 @@ +Significance: patch +Type: update + +Add default priority for countries that are not in the payment recommendation map diff --git a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php index fbe2de7ab01..9f96721ec96 100644 --- a/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php +++ b/plugins/woocommerce/src/Admin/Features/PaymentGatewaySuggestions/DefaultPaymentGateways.php @@ -11,6 +11,38 @@ defined( 'ABSPATH' ) || exit; * Default Payment Gateways */ class DefaultPaymentGateways { + /** + * This is the default priority for countries that are not in the $recommendation_priority_map. + * Priority is used to determine which payment gateway to recommend first. + * The lower the number, the higher the priority. + * + * @var array + */ + private static $recommendation_priority = array( + 'woocommerce_payments' => 1, + 'woocommerce_payments:with-in-person-payments' => 1, + 'woocommerce_payments:without-in-person-payments' => 1, + 'stripe' => 2, + 'woo-mercado-pago-custom' => 3, + // PayPal Payments. + 'ppcp-gateway' => 4, + 'mollie_wc_gateway_banktransfer' => 5, + 'razorpay' => 5, + 'payfast' => 5, + 'payubiz' => 6, + 'square_credit_card' => 6, + 'klarna_payments' => 6, + // Klarna Checkout. + 'kco' => 6, + 'paystack' => 6, + 'eway' => 7, + 'amazon_payments_advanced' => 7, + 'affirm' => 8, + 'afterpay' => 9, + 'zipmoney' => 10, + 'payoneer-checkout' => 11, + ); + /** * Get default specs. * @@ -1126,9 +1158,9 @@ class DefaultPaymentGateways { 'GH' => [ 'paystack', 'ppcp-gateway' ], ); - // If the country code is not in the list, return null. + // If the country code is not in the list, return default priority. if ( ! isset( $recommendation_priority_map[ $country_code ] ) ) { - return null; + return self::get_default_recommendation_priority( $gateway_id ); } $index = array_search( $gateway_id, $recommendation_priority_map[ $country_code ], true ); @@ -1140,4 +1172,18 @@ class DefaultPaymentGateways { return $index; } + + /** + * Get the default recommendation priority for a payment gateway. + * This is used when a country is not in the $recommendation_priority_map array. + * + * @param string $id Payment gateway id. + * @return int Priority. + */ + private static function get_default_recommendation_priority( $id ) { + if ( ! $id || ! array_key_exists( $id, self::$recommendation_priority ) ) { + return null; + } + return self::$recommendation_priority[ $id ]; + } } From 50593c5257d4e7036280201d01cdf73469927706 Mon Sep 17 00:00:00 2001 From: Darren Ethier Date: Tue, 11 Apr 2023 03:27:38 -0400 Subject: [PATCH 1366/1680] Fix issue that breaks the WooCommerce Home Page when Gutenberg 15.5 is active (#37641) Co-authored-by: Ilyas Foo Co-authored-by: Chi-Hsuan Huang Co-authored-by: rjchow --- .../changelog/fix-gutengerg15-5-update-issues | 4 + .../onboarding/with-onboarding-hydration.tsx | 78 +++++++++++-------- packages/js/data/src/settings/index.ts | 4 +- .../src/settings/with-settings-hydration.tsx | 53 ++++++++----- .../client/homescreen/index.tsx | 9 +-- .../client/homescreen/layout.js | 7 -- .../changelog/fix-gutengerg15-5-update-issues | 4 + 7 files changed, 93 insertions(+), 66 deletions(-) create mode 100644 packages/js/data/changelog/fix-gutengerg15-5-update-issues create mode 100644 plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues diff --git a/packages/js/data/changelog/fix-gutengerg15-5-update-issues b/packages/js/data/changelog/fix-gutengerg15-5-update-issues new file mode 100644 index 00000000000..5e9a1834400 --- /dev/null +++ b/packages/js/data/changelog/fix-gutengerg15-5-update-issues @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix incorrect usage of dispatch, useSelect, and setState calls in homescreen along with settings and onboarding package diff --git a/packages/js/data/src/onboarding/with-onboarding-hydration.tsx b/packages/js/data/src/onboarding/with-onboarding-hydration.tsx index 91732717c7e..e29595b5815 100644 --- a/packages/js/data/src/onboarding/with-onboarding-hydration.tsx +++ b/packages/js/data/src/onboarding/with-onboarding-hydration.tsx @@ -2,15 +2,14 @@ * External dependencies */ import { createHigherOrderComponent } from '@wordpress/compose'; -import { useSelect } from '@wordpress/data'; -import { createElement, useRef } from '@wordpress/element'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { createElement, useEffect, useRef } from '@wordpress/element'; /** * Internal dependencies */ import { STORE_NAME } from './constants'; import { ProfileItems } from './types'; -import { OnboardingSelector } from './'; export const withOnboardingHydration = ( data: { profileItems: ProfileItems; @@ -21,39 +20,54 @@ export const withOnboardingHydration = ( data: { ( OriginalComponent ) => ( props ) => { const onboardingRef = useRef( data ); - useSelect( - // @ts-expect-error // @ts-expect-error registry is not defined in the wp.data typings - ( select: ( s: string ) => OnboardingSelector, registry ) => { - if ( ! onboardingRef.current ) { - return; - } - + const { isResolvingGroup, hasFinishedResolutionGroup } = useSelect( + ( select ) => { const { isResolving, hasFinishedResolution } = select( STORE_NAME ); - const { - startResolution, - finishResolution, - setProfileItems, - } = registry.dispatch( STORE_NAME ); - - const { profileItems } = onboardingRef.current; - - if ( - profileItems && - ! hydratedProfileItems && - ! isResolving( 'getProfileItems', [] ) && - ! hasFinishedResolution( 'getProfileItems', [] ) - ) { - startResolution( 'getProfileItems', [] ); - setProfileItems( profileItems, true ); - finishResolution( 'getProfileItems', [] ); - - hydratedProfileItems = true; - } - }, - [] + return { + isResolvingGroup: isResolving( 'getProfileItems', [] ), + hasFinishedResolutionGroup: hasFinishedResolution( + 'getProfileItems', + [] + ), + }; + } ); + const { startResolution, finishResolution, setProfileItems } = + useDispatch( STORE_NAME ); + + useEffect( () => { + if ( ! onboardingRef.current ) { + return; + } + + const { profileItems } = onboardingRef.current; + if ( ! profileItems ) { + return; + } + + if ( + profileItems && + ! hydratedProfileItems && + // Ensure that profile items have finished resolving to prevent race conditions + ! isResolvingGroup && + ! hasFinishedResolutionGroup + ) { + startResolution( 'getProfileItems', [] ); + setProfileItems( profileItems, true ); + finishResolution( 'getProfileItems', [] ); + + hydratedProfileItems = true; + } + }, [ + finishResolution, + setProfileItems, + startResolution, + isResolvingGroup, + hasFinishedResolutionGroup, + ] ); + return ; }, 'withOnboardingHydration' diff --git a/packages/js/data/src/settings/index.ts b/packages/js/data/src/settings/index.ts index f098a3c82eb..cd21446c45c 100644 --- a/packages/js/data/src/settings/index.ts +++ b/packages/js/data/src/settings/index.ts @@ -10,7 +10,7 @@ import { SelectFromMap, DispatchFromMap } from '@automattic/data-stores'; /** * Internal dependencies */ -import { WPDataSelectors } from '../types'; +import { WPDataSelectors, WPDataActions } from '../types'; import { STORE_NAME } from './constants'; import * as selectors from './selectors'; import * as actions from './actions'; @@ -33,7 +33,7 @@ export const SETTINGS_STORE_NAME = STORE_NAME; declare module '@wordpress/data' { function dispatch( key: typeof STORE_NAME - ): DispatchFromMap< typeof actions >; + ): DispatchFromMap< typeof actions > & WPDataActions; function select( key: typeof STORE_NAME ): SelectFromMap< typeof selectors > & WPDataSelectors; diff --git a/packages/js/data/src/settings/with-settings-hydration.tsx b/packages/js/data/src/settings/with-settings-hydration.tsx index 02cb0a49933..6d09addc568 100644 --- a/packages/js/data/src/settings/with-settings-hydration.tsx +++ b/packages/js/data/src/settings/with-settings-hydration.tsx @@ -2,8 +2,8 @@ * External dependencies */ import { createHigherOrderComponent } from '@wordpress/compose'; -import { useSelect, select as wpSelect } from '@wordpress/data'; -import { createElement, useRef } from '@wordpress/element'; +import { useDispatch, useSelect } from '@wordpress/data'; +import { createElement, useRef, useEffect } from '@wordpress/element'; /** * Internal dependencies @@ -16,31 +16,46 @@ export const withSettingsHydration = ( group: string, settings: Settings ) => ( OriginalComponent ) => ( props ) => { const settingsRef = useRef( settings ); - // @ts-expect-error registry is not defined in the wp.data typings - useSelect( ( select: typeof wpSelect, registry ) => { + const { + startResolution, + finishResolution, + updateSettingsForGroup, + clearIsDirty, + } = useDispatch( STORE_NAME ); + const { isResolvingGroup, hasFinishedResolutionGroup } = useSelect( + ( select ) => { + const { isResolving, hasFinishedResolution } = + select( STORE_NAME ); + return { + isResolvingGroup: isResolving( 'getSettings', [ + group, + ] ), + hasFinishedResolutionGroup: hasFinishedResolution( + 'getSettings', + [ group ] + ), + }; + }, + [] + ); + useEffect( () => { if ( ! settingsRef.current ) { return; } - - const { isResolving, hasFinishedResolution } = - select( STORE_NAME ); - const { - startResolution, - finishResolution, - updateSettingsForGroup, - clearIsDirty, - } = registry.dispatch( STORE_NAME ); - - if ( - ! isResolving( 'getSettings', [ group ] ) && - ! hasFinishedResolution( 'getSettings', [ group ] ) - ) { + if ( ! isResolvingGroup && ! hasFinishedResolutionGroup ) { startResolution( 'getSettings', [ group ] ); updateSettingsForGroup( group, settingsRef.current ); clearIsDirty( group ); finishResolution( 'getSettings', [ group ] ); } - }, [] ); + }, [ + isResolvingGroup, + hasFinishedResolutionGroup, + finishResolution, + updateSettingsForGroup, + startResolution, + clearIsDirty, + ] ); return ; }, diff --git a/plugins/woocommerce-admin/client/homescreen/index.tsx b/plugins/woocommerce-admin/client/homescreen/index.tsx index e0199f9cddf..a9d80c505d4 100644 --- a/plugins/woocommerce-admin/client/homescreen/index.tsx +++ b/plugins/woocommerce-admin/client/homescreen/index.tsx @@ -3,7 +3,6 @@ */ import { compose } from '@wordpress/compose'; import { withSelect } from '@wordpress/data'; -import { identity } from 'lodash'; import { ONBOARDING_STORE_NAME, withOnboardingHydration, @@ -50,10 +49,8 @@ const withSelectHandler = ( select: WCDataSelector ) => { }; export default compose( - onboardingData.profile - ? withOnboardingHydration( { - profileItems: onboardingData.profile, - } ) - : identity, + withOnboardingHydration( { + profileItems: onboardingData.profile, + } ), withSelect( withSelectHandler ) )( Homescreen ); diff --git a/plugins/woocommerce-admin/client/homescreen/layout.js b/plugins/woocommerce-admin/client/homescreen/layout.js index 6fc310ebdcd..025c79e9fab 100644 --- a/plugins/woocommerce-admin/client/homescreen/layout.js +++ b/plugins/woocommerce-admin/client/homescreen/layout.js @@ -7,7 +7,6 @@ import { useCallback, useLayoutEffect, useRef, - useState, } from '@wordpress/element'; import { compose } from '@wordpress/compose'; import { withDispatch, withSelect } from '@wordpress/data'; @@ -53,7 +52,6 @@ const Tasks = lazy( () => export const Layout = ( { defaultHomescreenLayout, - isBatchUpdating, query, taskListComplete, hasTaskList, @@ -68,7 +66,6 @@ export const Layout = ( { const shouldShowStoreLinks = taskListComplete || isTaskListHidden; const hasTwoColumnContent = shouldShowStoreLinks || window.wcAdminFeatures.analytics; - const [ showInbox, setShowInbox ] = useState( true ); const isDashboardShown = ! query.task; // ?&task= query param is used to show tasks instead of the homescreen const activeSetupTaskList = useActiveSetupTasklist(); @@ -76,10 +73,6 @@ export const Layout = ( { ( userPrefs.homepage_layout || defaultHomescreenLayout ) === 'two_columns' && hasTwoColumnContent; - if ( isBatchUpdating && ! showInbox ) { - setShowInbox( true ); - } - const isWideViewport = useRef( true ); const maybeToggleColumns = useCallback( () => { isWideViewport.current = window.innerWidth >= 782; diff --git a/plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues b/plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues new file mode 100644 index 00000000000..5e9a1834400 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fix incorrect usage of dispatch, useSelect, and setState calls in homescreen along with settings and onboarding package From fa4dd9040125ee83bdc3d4e3e4f14be4f4239499 Mon Sep 17 00:00:00 2001 From: Nathan Silveira Date: Tue, 11 Apr 2023 11:44:27 -0300 Subject: [PATCH 1367/1680] Change link all variations label (#37632) --- .../src/specs/merchant/wp-admin-product-new.test.js | 2 +- plugins/woocommerce/changelog/tweak-variations-label | 5 +++++ plugins/woocommerce/includes/admin/class-wc-admin-assets.php | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 plugins/woocommerce/changelog/tweak-variations-label diff --git a/packages/js/e2e-core-tests/src/specs/merchant/wp-admin-product-new.test.js b/packages/js/e2e-core-tests/src/specs/merchant/wp-admin-product-new.test.js index 30029f9a06d..c631e52cd97 100644 --- a/packages/js/e2e-core-tests/src/specs/merchant/wp-admin-product-new.test.js +++ b/packages/js/e2e-core-tests/src/specs/merchant/wp-admin-product-new.test.js @@ -222,7 +222,7 @@ const runAddVariableProductTest = () => { ); await expect( firstDialog.message() ).toMatch( - 'Are you sure you want to link all variations?' + 'Do you want to generate all variations?' ); // Set some variation data diff --git a/plugins/woocommerce/changelog/tweak-variations-label b/plugins/woocommerce/changelog/tweak-variations-label new file mode 100644 index 00000000000..bcb141646af --- /dev/null +++ b/plugins/woocommerce/changelog/tweak-variations-label @@ -0,0 +1,5 @@ +Significance: patch +Type: tweak +Comment: Small label change + + diff --git a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php index 04e9a4b1334..1407dac5a2e 100644 --- a/plugins/woocommerce/includes/admin/class-wc-admin-assets.php +++ b/plugins/woocommerce/includes/admin/class-wc-admin-assets.php @@ -287,7 +287,7 @@ if ( ! class_exists( 'WC_Admin_Assets', false ) ) : 'save_variations_nonce' => wp_create_nonce( 'save-variations' ), 'bulk_edit_variations_nonce' => wp_create_nonce( 'bulk-edit-variations' ), /* translators: %d: Number of variations */ - 'i18n_link_all_variations' => esc_js( sprintf( __( 'Are you sure you want to link all variations? This will create a new variation for each and every possible combination of variation attributes (max %d per run).', 'woocommerce' ), Constants::is_defined( 'WC_MAX_LINKED_VARIATIONS' ) ? Constants::get_constant( 'WC_MAX_LINKED_VARIATIONS' ) : 50 ) ), + 'i18n_link_all_variations' => esc_js( sprintf( __( 'Do you want to generate all variations? This will create a new variation for each and every possible combination of variation attributes (max %d per run).', 'woocommerce' ), Constants::is_defined( 'WC_MAX_LINKED_VARIATIONS' ) ? Constants::get_constant( 'WC_MAX_LINKED_VARIATIONS' ) : 50 ) ), 'i18n_enter_a_value' => esc_js( __( 'Enter a value', 'woocommerce' ) ), 'i18n_enter_menu_order' => esc_js( __( 'Variation menu order (determines position in the list of variations)', 'woocommerce' ) ), 'i18n_enter_a_value_fixed_or_percent' => esc_js( __( 'Enter a value (fixed or %)', 'woocommerce' ) ), From 8354ae279215ad7020ef841707625f949f4419f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Tue, 11 Apr 2023 10:53:37 -0400 Subject: [PATCH 1368/1680] Create schedule sale pricing block (#37567) * Create schedule sale pricing block * Add auto show/hide and clean fields depending on the initial values * Add validations to From and To dates fields * Add changelog files * Align block with the figma design * Revert linter replacement in the editor global style.scss file * Fix some words typos * Move and rename schedule sale block to the blocks folder * Load datetime format from @wordpress/date instead of using the woo options datastore * Remove the min difference using by moment to compare dates from 'minute' to undefined * Make sure the dates are normalized for comparison --- .../js/product-editor/changelog/add-37394 | 4 + packages/js/product-editor/package.json | 3 + .../src/blocks/schedule-sale/block.json | 25 + .../src/blocks/schedule-sale/edit.tsx | 151 ++++++ .../src/blocks/schedule-sale/editor.scss | 16 + .../src/blocks/schedule-sale/index.ts | 29 ++ .../src/blocks/schedule-sale/types.ts | 8 + .../src/components/editor/init-blocks.ts | 2 + packages/js/product-editor/src/constants.ts | 2 + packages/js/product-editor/src/style.scss | 1 + plugins/woocommerce/changelog/add-37394 | 4 + .../includes/class-wc-post-types.php | 3 + pnpm-lock.yaml | 438 ++++++++++-------- 13 files changed, 480 insertions(+), 206 deletions(-) create mode 100644 packages/js/product-editor/changelog/add-37394 create mode 100644 packages/js/product-editor/src/blocks/schedule-sale/block.json create mode 100644 packages/js/product-editor/src/blocks/schedule-sale/edit.tsx create mode 100644 packages/js/product-editor/src/blocks/schedule-sale/editor.scss create mode 100644 packages/js/product-editor/src/blocks/schedule-sale/index.ts create mode 100644 packages/js/product-editor/src/blocks/schedule-sale/types.ts create mode 100644 plugins/woocommerce/changelog/add-37394 diff --git a/packages/js/product-editor/changelog/add-37394 b/packages/js/product-editor/changelog/add-37394 new file mode 100644 index 00000000000..f1628ce5381 --- /dev/null +++ b/packages/js/product-editor/changelog/add-37394 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product schedule sale pricing block diff --git a/packages/js/product-editor/package.json b/packages/js/product-editor/package.json index a5e2de6b022..f508c8d9d77 100644 --- a/packages/js/product-editor/package.json +++ b/packages/js/product-editor/package.json @@ -47,6 +47,7 @@ "@wordpress/compose": "wp-6.0", "@wordpress/core-data": "wp-6.0", "@wordpress/data": "wp-6.0", + "@wordpress/date": "wp-6.0", "@wordpress/editor": "wp-6.0", "@wordpress/element": "wp-6.0", "@wordpress/html-entities": "wp-6.0", @@ -60,6 +61,7 @@ "classnames": "^2.3.1", "dompurify": "^2.3.6", "lodash": "^4.17.21", + "moment": "^2.29.4", "prop-types": "^15.8.1", "react-router-dom": "^6.3.0" }, @@ -80,6 +82,7 @@ "@types/wordpress__components": "^19.10.3", "@types/wordpress__core-data": "^2.4.5", "@types/wordpress__data": "^6.0.2", + "@types/wordpress__date": "^3.3.2", "@types/wordpress__editor": "^13.0.0", "@types/wordpress__media-utils": "^3.0.0", "@types/wordpress__plugins": "^3.0.0", diff --git a/packages/js/product-editor/src/blocks/schedule-sale/block.json b/packages/js/product-editor/src/blocks/schedule-sale/block.json new file mode 100644 index 00000000000..73a0afb04a9 --- /dev/null +++ b/packages/js/product-editor/src/blocks/schedule-sale/block.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-schedule-sale-fields", + "title": "Product schedule sale fields", + "category": "woocommerce", + "description": "The product schedule sale fields.", + "keywords": [ "products", "schedule", "sale" ], + "textdomain": "default", + "attributes": { + "name": { + "type": "string", + "__experimentalRole": "content" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": true, + "reusable": false, + "inserter": false, + "lock": false + }, + "editorStyle": "file:./editor.css" +} diff --git a/packages/js/product-editor/src/blocks/schedule-sale/edit.tsx b/packages/js/product-editor/src/blocks/schedule-sale/edit.tsx new file mode 100644 index 00000000000..c54916be426 --- /dev/null +++ b/packages/js/product-editor/src/blocks/schedule-sale/edit.tsx @@ -0,0 +1,151 @@ +/** + * External dependencies + */ +import { DateTimePickerControl } from '@woocommerce/components'; +import { recordEvent } from '@woocommerce/tracks'; +import { useBlockProps } from '@wordpress/block-editor'; +import { BlockEditProps } from '@wordpress/blocks'; +import { ToggleControl } from '@wordpress/components'; +import { useEntityProp } from '@wordpress/core-data'; +import { createElement, useEffect, useState } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import moment from 'moment'; +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore We need this to get the datetime format for the DateTimePickerControl. +// eslint-disable-next-line @woocommerce/dependency-group +import { getSettings } from '@wordpress/date'; + +/** + * Internal dependencies + */ +import { ScheduleSalePricingBlockAttributes } from './types'; +import { useValidation } from '../../hooks/use-validation'; + +export function Edit( {}: BlockEditProps< ScheduleSalePricingBlockAttributes > ) { + const blockProps = useBlockProps( { + className: 'wp-block-woocommerce-product-schedule-sale-fields', + } ); + + const dateTimeFormat = getSettings().formats.datetime; + + const [ showScheduleSale, setShowScheduleSale ] = useState( false ); + + const [ salePrice ] = useEntityProp< string | null >( + 'postType', + 'product', + 'sale_price' + ); + + const isSalePriceGreaterThanZero = + Number.parseFloat( salePrice || '0' ) > 0; + + const [ dateOnSaleFromGmt, setDateOnSaleFromGmt ] = useEntityProp< + string | null + >( 'postType', 'product', 'date_on_sale_from_gmt' ); + + const [ dateOnSaleToGmt, setDateOnSaleToGmt ] = useEntityProp< + string | null + >( 'postType', 'product', 'date_on_sale_to_gmt' ); + + const today = moment().startOf( 'minute' ).toISOString(); + + function handleToggleChange( value: boolean ) { + recordEvent( 'product_pricing_schedule_sale_toggle_click', { + enabled: value, + } ); + + setShowScheduleSale( value ); + + if ( value ) { + setDateOnSaleFromGmt( today ); + setDateOnSaleToGmt( '' ); + } else { + setDateOnSaleFromGmt( '' ); + setDateOnSaleToGmt( '' ); + } + } + + // Hide and clean date fields if the user manually change + // the sale price to zero or less. + useEffect( () => { + if ( ! isSalePriceGreaterThanZero ) { + setShowScheduleSale( false ); + setDateOnSaleFromGmt( '' ); + setDateOnSaleToGmt( '' ); + } + }, [ isSalePriceGreaterThanZero ] ); + + // Automatically show date fields if `from` or `to` dates have + // any value. + useEffect( () => { + if ( dateOnSaleFromGmt || dateOnSaleToGmt ) { + setShowScheduleSale( true ); + } + }, [ dateOnSaleFromGmt, dateOnSaleToGmt ] ); + + const isDateOnSaleToGmtValid = useValidation( + 'product/date_on_sale_to_gmt', + () => + ! showScheduleSale || + ! dateOnSaleToGmt || + moment( dateOnSaleFromGmt ).isBefore( dateOnSaleToGmt ) + ); + + return ( +
    + + + { showScheduleSale && ( +
    +
    + +
    + +
    + + setDateOnSaleToGmt( + moment( value ) + .startOf( 'minute' ) + .toISOString() + ) + } + className={ + isDateOnSaleToGmtValid ? undefined : 'has-error' + } + help={ + isDateOnSaleToGmtValid + ? undefined + : __( + 'To date must be greater than From date.', + 'woocommerce' + ) + } + /> +
    +
    + ) } +
    + ); +} diff --git a/packages/js/product-editor/src/blocks/schedule-sale/editor.scss b/packages/js/product-editor/src/blocks/schedule-sale/editor.scss new file mode 100644 index 00000000000..5abe6c88e80 --- /dev/null +++ b/packages/js/product-editor/src/blocks/schedule-sale/editor.scss @@ -0,0 +1,16 @@ +.wp-block-woocommerce-product-schedule-sale-fields { + .components-toggle-control__label { + display: flex; + align-items: center; + } + + .woocommerce-date-time-picker-control.has-error { + .components-base-control .components-input-control__backdrop { + border-color: $studio-red-50; + } + + .components-base-control__help { + color: $studio-red-50; + } + } +} diff --git a/packages/js/product-editor/src/blocks/schedule-sale/index.ts b/packages/js/product-editor/src/blocks/schedule-sale/index.ts new file mode 100644 index 00000000000..e3893b6f2ac --- /dev/null +++ b/packages/js/product-editor/src/blocks/schedule-sale/index.ts @@ -0,0 +1,29 @@ +/** + * External dependencies + */ +import { createElement } from '@wordpress/element'; +import { BlockConfiguration } from '@wordpress/blocks'; + +/** + * Internal dependencies + */ +import { initBlock } from '../../utils/init-blocks'; +import blockConfiguration from './block.json'; +import { Edit } from './edit'; +import { ScheduleSalePricingBlockAttributes } from './types'; + +const { name, ...metadata } = + blockConfiguration as BlockConfiguration< ScheduleSalePricingBlockAttributes >; + +export { metadata, name }; + +export const settings: Partial< + BlockConfiguration< ScheduleSalePricingBlockAttributes > +> = { + example: {}, + edit: Edit, +}; + +export function init() { + return initBlock( { name, metadata, settings } ); +} diff --git a/packages/js/product-editor/src/blocks/schedule-sale/types.ts b/packages/js/product-editor/src/blocks/schedule-sale/types.ts new file mode 100644 index 00000000000..e8c038493c0 --- /dev/null +++ b/packages/js/product-editor/src/blocks/schedule-sale/types.ts @@ -0,0 +1,8 @@ +/** + * External dependencies + */ +import { BlockAttributes } from '@wordpress/blocks'; + +export interface ScheduleSalePricingBlockAttributes extends BlockAttributes { + name: string; +} diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index 7555c6a2a1f..c81c2aa288a 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -20,6 +20,7 @@ import { init as initSection } from '../section'; import { init as initTab } from '../tab'; import { init as initPricing } from '../pricing-block'; import { init as initCollapsible } from '../collapsible-block'; +import { init as initScheduleSale } from '../../blocks/schedule-sale'; export const initBlocks = () => { const coreBlocks = __experimentalGetCoreBlocks(); @@ -38,4 +39,5 @@ export const initBlocks = () => { initTab(); initPricing(); initCollapsible(); + initScheduleSale(); }; diff --git a/packages/js/product-editor/src/constants.ts b/packages/js/product-editor/src/constants.ts index 8d94a1fc8e4..3afadee6a1a 100644 --- a/packages/js/product-editor/src/constants.ts +++ b/packages/js/product-editor/src/constants.ts @@ -47,3 +47,5 @@ export const VARIANT_SHIPPING_SECTION_BASIC_ID = `variant/${ SHIPPING_SECTION_BA export const VARIANT_SHIPPING_SECTION_DIMENSIONS_ID = `variant/${ SHIPPING_SECTION_DIMENSIONS_ID }`; export const PRODUCT_DETAILS_SLUG = 'product-details'; + +export const PRODUCT_SCHEDULED_SALE_SLUG = 'product-scheduled-sale'; diff --git a/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index 0287d7c8690..7e2107e3fdb 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -1,3 +1,4 @@ +@import 'blocks/schedule-sale/editor.scss'; @import 'components/editor/style.scss'; @import 'components/product-section-layout/style.scss'; @import 'components/edit-product-link-modal/style.scss'; diff --git a/plugins/woocommerce/changelog/add-37394 b/plugins/woocommerce/changelog/add-37394 new file mode 100644 index 00000000000..cd427860cb2 --- /dev/null +++ b/plugins/woocommerce/changelog/add-37394 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product schedule sale pricing block to blocks template definition diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index d2a8a6083e9..19b5093c99e 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -513,6 +513,9 @@ class WC_Post_Types { ), ), ), + array( + 'woocommerce/product-schedule-sale-fields', + ), array( 'woocommerce/product-radio', array( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c258c37ed61..26415e7da7c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1152,7 +1152,7 @@ importers: typescript: ^4.9.5 dependencies: '@testing-library/jest-dom': 5.16.2 - '@testing-library/react': 12.1.4_sfoxds7t5ydpegc3knd667wn6m + '@testing-library/react': 12.1.4_6l5554ty5ajsajah6yazvrjhoe '@wordpress/data': 6.6.1_react@17.0.2 '@wordpress/i18n': 4.6.1 '@wordpress/jest-console': 5.0.2_jest@27.5.1 @@ -1424,6 +1424,7 @@ importers: '@types/wordpress__components': ^19.10.3 '@types/wordpress__core-data': ^2.4.5 '@types/wordpress__data': ^6.0.2 + '@types/wordpress__date': ^3.3.2 '@types/wordpress__editor': ^13.0.0 '@types/wordpress__media-utils': ^3.0.0 '@types/wordpress__plugins': ^3.0.0 @@ -1447,6 +1448,7 @@ importers: '@wordpress/compose': wp-6.0 '@wordpress/core-data': wp-6.0 '@wordpress/data': wp-6.0 + '@wordpress/date': wp-6.0 '@wordpress/editor': wp-6.0 '@wordpress/element': wp-6.0 '@wordpress/html-entities': wp-6.0 @@ -1466,6 +1468,7 @@ importers: jest: ^27.5.1 jest-cli: ^27.5.1 lodash: ^4.17.21 + moment: ^2.29.4 postcss: ^8.4.7 postcss-loader: ^4.3.0 prop-types: ^15.8.1 @@ -1499,6 +1502,7 @@ importers: '@wordpress/compose': 5.4.1_react@17.0.2 '@wordpress/core-data': 4.4.5_react@17.0.2 '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/date': 4.6.1 '@wordpress/editor': 12.5.10_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/element': 4.4.1 '@wordpress/html-entities': 3.6.1 @@ -1512,6 +1516,7 @@ importers: classnames: 2.3.1 dompurify: 2.3.6 lodash: 4.17.21 + moment: 2.29.4 prop-types: 15.8.1 react-router-dom: 6.3.0_sfoxds7t5ydpegc3knd667wn6m devDependencies: @@ -1530,6 +1535,7 @@ importers: '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__core-data': 2.4.5 '@types/wordpress__data': 6.0.2 + '@types/wordpress__date': 3.3.2 '@types/wordpress__editor': 13.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__media-utils': 3.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__plugins': 3.0.0_sfoxds7t5ydpegc3knd667wn6m @@ -3084,9 +3090,9 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 - '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color @@ -3101,9 +3107,9 @@ packages: '@babel/helper-annotate-as-pure': 7.18.6 '@babel/helper-environment-visitor': 7.18.9 '@babel/helper-function-name': 7.21.0 - '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 - '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-replace-supers': 7.19.1 '@babel/helper-split-export-declaration': 7.18.6 transitivePeerDependencies: - supports-color @@ -5102,7 +5108,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.17.8 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.19.0 dev: true /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.21.3: @@ -5111,7 +5117,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.21.3 - '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-plugin-utils': 7.19.0 /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.12.9: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} @@ -6975,8 +6981,8 @@ packages: dependencies: '@babel/core': 7.21.3 '@babel/helper-module-imports': 7.16.0 - '@babel/helper-plugin-utils': 7.14.5 - babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.21.3 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.21.3 babel-plugin-polyfill-corejs3: 0.4.0_@babel+core@7.21.3 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.21.3 semver: 6.3.0 @@ -14034,6 +14040,20 @@ packages: react-error-boundary: 3.1.4_react@17.0.2 dev: true + /@testing-library/react/12.1.4_6l5554ty5ajsajah6yazvrjhoe: + resolution: {integrity: sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==} + engines: {node: '>=12'} + peerDependencies: + react: '*' + react-dom: '*' + dependencies: + '@babel/runtime': 7.21.0 + '@testing-library/dom': 8.11.3 + '@types/react-dom': 17.0.17 + react: 17.0.2 + react-dom: 18.2.0_react@17.0.2 + dev: false + /@testing-library/react/12.1.4_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-jiPKOm7vyUw311Hn/HlNQ9P8/lHNtArAx0PisXyFixDDvfl8DbD6EUdbshK5eqauvBSvzZd19itqQ9j3nferJA==} engines: {node: '>=12'} @@ -14046,6 +14066,7 @@ packages: '@types/react-dom': 17.0.17 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: true /@testing-library/user-event/13.5.0_gzufz4q333be4gqfrvipwvqt6a: resolution: {integrity: sha512-5Kwtbo3Y/NowpkbRuSepbyMFkZmHgD+vPzYB/RJ4oxt5Gj/avFFBYjhw27cqSVPVw/3a67NK1PbiIr9k4Gwmdg==} @@ -14666,7 +14687,7 @@ packages: '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__data': 6.0.2 '@types/wordpress__keycodes': 2.3.1 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 react-autosize-textarea: 7.1.0_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: - react @@ -14680,7 +14701,7 @@ packages: dependencies: '@types/react': 17.0.50 '@types/wordpress__components': 19.10.5_sfoxds7t5ydpegc3knd667wn6m - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -14692,7 +14713,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_prpqlkd37azqwypxturxi7uyci transitivePeerDependencies: @@ -14707,7 +14728,7 @@ packages: '@types/tinycolor2': 1.4.3 '@types/wordpress__notices': 3.5.0 '@types/wordpress__rich-text': 3.4.6 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 downshift: 6.1.12_react@17.0.2 re-resizable: 6.9.5_sfoxds7t5ydpegc3knd667wn6m transitivePeerDependencies: @@ -14746,6 +14767,12 @@ packages: '@types/react': 17.0.50 redux: 4.2.0 + /@types/wordpress__date/3.3.2: + resolution: {integrity: sha512-8ZW580Rn/NMVNC0uTHaPyWEMgtvymBDXybiJY6mufX5PdWGn4TGMik9ev3+nvwSXlOlz4Wsug/6jUwLfGJJH0w==} + dependencies: + moment: 2.29.4 + dev: true + /@types/wordpress__editor/13.0.0_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-hqnO/L82pY90l5XX88nhJjGxHyKAC5Q2k68bQaUPIHduRi28jCoKrWw/s6Wa6DesFBealF/at6Df8ooQY0TZcQ==} dependencies: @@ -14770,7 +14797,7 @@ packages: dependencies: '@types/wordpress__block-editor': 7.0.0_sfoxds7t5ydpegc3knd667wn6m '@types/wordpress__core-data': 2.4.5 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 transitivePeerDependencies: - react - react-dom @@ -15559,8 +15586,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/dom-ready': 3.6.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/dom-ready': 3.28.0 + '@wordpress/i18n': 4.28.0 dev: false /@wordpress/api-fetch/3.23.1_react-native@0.70.0: @@ -15588,8 +15615,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 dev: true /@wordpress/api-fetch/6.25.0: @@ -15605,8 +15632,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/url': 3.29.0 dev: false /@wordpress/autop/3.19.0: @@ -15734,8 +15761,8 @@ packages: '@babel/runtime': 7.21.0 '@wordpress/babel-plugin-import-jsx-pragma': 3.2.0_@babel+core@7.21.3 '@wordpress/browserslist-config': 4.1.3 - '@wordpress/element': 4.4.1 - '@wordpress/warning': 2.6.1 + '@wordpress/element': 4.20.0 + '@wordpress/warning': 2.28.0 browserslist: 4.20.2 core-js: 3.29.1 transitivePeerDependencies: @@ -16327,20 +16354,20 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.4.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/keycodes': 3.28.0 '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/warning': 2.6.1 classnames: 2.3.1 colord: 2.9.2 @@ -16381,21 +16408,21 @@ packages: '@emotion/styled': 11.8.1_6t3indjc5ssefvr44gr3wo2uqu '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -16435,21 +16462,21 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -16489,21 +16516,21 @@ packages: '@emotion/styled': 11.8.1_c2qm47vaialpqni522adyu6za4 '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -16543,21 +16570,21 @@ packages: '@emotion/styled': 11.8.1_hhesyqfwklnojgamcachhyxace '@emotion/utils': 1.0.0 '@use-gesture/react': 10.2.10_react@17.0.2 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/hooks': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/hooks': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 - '@wordpress/primitives': 3.4.1 - '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/warning': 2.6.1 + '@wordpress/keycodes': 3.28.0 + '@wordpress/primitives': 3.26.0 + '@wordpress/rich-text': 5.17.0_react@17.0.2 + '@wordpress/warning': 2.28.0 classnames: 2.3.1 colord: 2.9.2 dom-scroll-into-view: 1.2.1 @@ -16861,11 +16888,11 @@ packages: '@babel/runtime': 7.21.0 '@types/lodash': 4.14.184 '@types/mousetrap': 1.6.9 - '@wordpress/deprecated': 3.6.1 - '@wordpress/dom': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/deprecated': 3.28.0 + '@wordpress/dom': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/keycodes': 3.6.1 + '@wordpress/keycodes': 3.28.0 '@wordpress/priority-queue': 2.28.0 clipboard: 2.0.10 lodash: 4.17.21 @@ -16873,6 +16900,7 @@ packages: react: 17.0.2 react-resize-aware: 3.1.1_react@17.0.2 use-memo-one: 1.1.2_react@17.0.2 + dev: false /@wordpress/compose/6.5.0_react@17.0.2: resolution: {integrity: sha512-gtZwEeFFHGltsr0vqwyrxPbAcA6lVfE36s59mZBh9KHeC/s590q2FPQz+9jSE5Y+uQmnXZCtahCrjvnpnaBIUg==} @@ -16901,15 +16929,15 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/api-fetch': 6.25.0 '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/html-entities': 3.6.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 '@wordpress/is-shallow-equal': 4.28.0 - '@wordpress/url': 3.7.1 + '@wordpress/url': 3.29.0 equivalent-key-map: 0.2.2 lodash: 4.17.21 memize: 1.1.0 @@ -16986,9 +17014,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 react: 17.0.2 dev: false @@ -17043,9 +17071,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 '@wordpress/is-shallow-equal': 4.28.0 '@wordpress/priority-queue': 2.28.0 '@wordpress/redux-routine': 4.28.0_redux@4.2.0 @@ -17158,7 +17186,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 + dev: false /@wordpress/dom-ready/3.28.0: resolution: {integrity: sha512-PFFAnuPUouV0uSDZN6G/B8yksybtxzS/6H53OZJEA3h3EsNCicKRMGSowkumvLwXA23HV0K2Kht6JuS+bDECzA==} @@ -17192,6 +17221,7 @@ packages: dependencies: '@babel/runtime': 7.21.0 lodash: 4.17.21 + dev: false /@wordpress/e2e-test-utils/3.0.0_ddjhsfu4aotkh3cuzmpsln6ywq: resolution: {integrity: sha512-XMdR8DeKyDQRF5jKeUlOzP4pTRtoJuOLsNZRLUFUvnrs9y/7/hH17VmPbWp3TJGvV/eGKzO4+D+wJTsP9nJmIw==} @@ -17238,9 +17268,9 @@ packages: puppeteer-core: '>=11' dependencies: '@babel/runtime': 7.21.0 - '@wordpress/api-fetch': 6.3.1 - '@wordpress/keycodes': 3.6.1 - '@wordpress/url': 3.7.1 + '@wordpress/api-fetch': 6.25.0 + '@wordpress/keycodes': 3.28.0 + '@wordpress/url': 3.29.0 form-data: 4.0.0 jest: 27.5.1 lodash: 4.17.21 @@ -17258,30 +17288,30 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/api-fetch': 6.25.0 '@wordpress/block-editor': 8.6.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/blocks': 11.18.0_react@17.0.2 - '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi - '@wordpress/compose': 5.4.1_react@17.0.2 + '@wordpress/components': 19.12.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/compose': 5.17.0_react@17.0.2 '@wordpress/core-data': 4.4.5_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/date': 4.6.1 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/html-entities': 3.6.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 - '@wordpress/keyboard-shortcuts': 3.4.1_react@17.0.2 - '@wordpress/keycodes': 3.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/date': 4.28.0 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/html-entities': 3.28.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 + '@wordpress/keyboard-shortcuts': 3.17.0_react@17.0.2 + '@wordpress/keycodes': 3.28.0 '@wordpress/media-utils': 3.4.1 - '@wordpress/notices': 3.6.1_react@17.0.2 + '@wordpress/notices': 3.28.0_react@17.0.2 '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/reusable-blocks': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm - '@wordpress/rich-text': 5.4.2_react@17.0.2 + '@wordpress/rich-text': 5.17.0_react@17.0.2 '@wordpress/server-side-render': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm - '@wordpress/url': 3.7.1 + '@wordpress/url': 3.29.0 '@wordpress/wordcount': 3.28.0 classnames: 2.3.1 lodash: 4.17.21 @@ -17349,6 +17379,7 @@ packages: lodash: 4.17.21 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 + dev: false /@wordpress/element/4.8.0: resolution: {integrity: sha512-f2Mb70xvGxZWNWh5pFhOoRgrd+tKs9Xk9hpDgRB7iPel/zbAIxNebr0Jqm5Nt+MDiDl/dogTPc9GyrkYCm9u0g==} @@ -17580,6 +17611,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 + dev: false /@wordpress/html-entities/3.28.0: resolution: {integrity: sha512-UAaU6au8UTrSkowkV33pE/EvdPov2mA9W51vh6t88KsJPzt4171EzIchGnQuzt04HuZLdLyWy2A+7JCOSbfhBA==} @@ -17624,7 +17656,7 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.21.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 @@ -17638,19 +17670,20 @@ packages: hasBin: true dependencies: '@babel/runtime': 7.21.0 - '@wordpress/hooks': 3.6.1 + '@wordpress/hooks': 3.28.0 gettext-parser: 1.4.0 lodash: 4.17.21 memize: 1.1.0 sprintf-js: 1.1.2 tannin: 1.2.0 + dev: false /@wordpress/icons/8.1.0: resolution: {integrity: sha512-fNq0Mnzzf03uxIwKqQeU/G48wElyypwkhcBZWYQRpmwLZrOR231dxUeK9mzPOSGlYbgM+YKK+k3lzysGmrJU0A==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 '@wordpress/primitives': 3.4.1 dev: false @@ -17659,8 +17692,8 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/element': 4.4.1 - '@wordpress/primitives': 3.4.1 + '@wordpress/element': 4.20.0 + '@wordpress/primitives': 3.26.0 dev: false /@wordpress/icons/8.4.0: @@ -17688,17 +17721,17 @@ packages: react-dom: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/components': 19.8.5_eqi5qhcxfphl6j3pngzexvnehi - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/deprecated': 3.6.1 - '@wordpress/element': 4.4.1 - '@wordpress/i18n': 4.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/a11y': 3.28.0 + '@wordpress/components': 19.12.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/deprecated': 3.28.0 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 + '@wordpress/icons': 8.4.0 '@wordpress/plugins': 4.4.3_react@17.0.2 '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi - '@wordpress/viewport': 4.4.1_react@17.0.2 + '@wordpress/viewport': 4.17.0_react@17.0.2 classnames: 2.3.1 lodash: 4.17.21 react: 17.0.2 @@ -17880,9 +17913,9 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/element': 4.4.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/keycodes': 3.28.0 lodash: 4.17.21 react: 17.0.2 rememo: 3.0.0 @@ -17908,7 +17941,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/i18n': 4.6.1 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 dev: false @@ -17917,18 +17950,19 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/i18n': 4.6.1 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 + dev: false /@wordpress/media-utils/3.4.1: resolution: {integrity: sha512-WNAaMqqw6Eqy61KTWBy1NlgXSZH82Cm2SPVbz0v6yhJ4ktJmSRFm7Fd4mTMFS/L7NKTxwo+DFqEHlTGKj3lyzQ==} engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/api-fetch': 6.3.1 + '@wordpress/api-fetch': 6.25.0 '@wordpress/blob': 3.28.0 - '@wordpress/element': 4.4.1 - '@wordpress/i18n': 4.6.1 + '@wordpress/element': 4.20.0 + '@wordpress/i18n': 4.28.0 lodash: 4.17.21 dev: false @@ -17949,8 +17983,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/a11y': 3.28.0 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -17980,10 +18014,10 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/element': 4.4.1 - '@wordpress/hooks': 3.6.1 - '@wordpress/icons': 8.2.3 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/element': 4.20.0 + '@wordpress/hooks': 3.28.0 + '@wordpress/icons': 8.4.0 lodash: 4.17.21 memize: 1.1.0 react: 17.0.2 @@ -18016,7 +18050,7 @@ packages: peerDependencies: postcss: ^8.0.0 dependencies: - '@wordpress/base-styles': 4.3.1 + '@wordpress/base-styles': 4.8.0 autoprefixer: 10.4.4_postcss@8.4.21 postcss: 8.4.21 dev: false @@ -18129,7 +18163,7 @@ packages: engines: {node: '>=12'} dependencies: '@babel/runtime': 7.21.0 - '@wordpress/element': 4.4.1 + '@wordpress/element': 4.20.0 classnames: 2.3.1 dev: false @@ -18275,13 +18309,13 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/a11y': 3.6.1 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 - '@wordpress/element': 4.4.1 + '@wordpress/a11y': 3.28.0 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 + '@wordpress/element': 4.20.0 '@wordpress/escape-html': 2.28.0 - '@wordpress/i18n': 4.6.1 - '@wordpress/keycodes': 3.6.1 + '@wordpress/i18n': 4.28.0 + '@wordpress/keycodes': 3.28.0 lodash: 4.17.21 memize: 1.1.0 react: 17.0.2 @@ -18607,6 +18641,7 @@ packages: dependencies: '@babel/runtime': 7.21.0 lodash: 4.17.21 + dev: false /@wordpress/viewport/4.17.0_react@17.0.2: resolution: {integrity: sha512-5FZCqXjsZjONoyCfjalRgdme//j4XJYHRXYh7ynoJW/qULq3YqZhyLtjFsEM4V+uuuURFSYnGnOD7V+K9wooPA==} @@ -18628,8 +18663,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -18641,8 +18676,8 @@ packages: react: ^17.0.0 dependencies: '@babel/runtime': 7.21.0 - '@wordpress/compose': 5.4.1_react@17.0.2 - '@wordpress/data': 6.6.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 + '@wordpress/data': 6.15.0_react@17.0.2 lodash: 4.17.21 react: 17.0.2 dev: false @@ -18662,6 +18697,7 @@ packages: /@wordpress/warning/2.6.1: resolution: {integrity: sha512-Xs37x0IkvNewPNKs1A8cnw5xLb+AqwUqqCsH4+5Sjat5GDqP86mHgLfRIlE4d6fBYg+q6tO7DVPG49TT3/wzgA==} engines: {node: '>=12'} + dev: false /@wordpress/wordcount/3.19.0: resolution: {integrity: sha512-x5M997RMrglq/XiGi55sO4fIPrGu20bob6h5goc9NKbbq68NTTDPrznfRbhQ+gTLLEV79AtUO/RPK3y9V9Pvkw==} @@ -19491,7 +19527,7 @@ packages: /axios/0.21.4: resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} dependencies: - follow-redirects: 1.14.7 + follow-redirects: 1.14.7_debug@4.3.3 transitivePeerDependencies: - debug @@ -20877,7 +20913,7 @@ packages: resolution: {integrity: sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==} hasBin: true dependencies: - caniuse-lite: 1.0.30001146 + caniuse-lite: 1.0.30001418 electron-to-chromium: 1.4.276 dev: true @@ -21218,13 +21254,14 @@ packages: /caniuse-api/3.0.0: resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} dependencies: - browserslist: 4.19.3 - caniuse-lite: 1.0.30001146 + browserslist: 4.21.4 + caniuse-lite: 1.0.30001418 lodash.memoize: 4.1.2 lodash.uniq: 4.5.0 /caniuse-lite/1.0.30001146: resolution: {integrity: sha512-VAy5RHDfTJhpxnDdp2n40GPPLp3KqNrXz1QqFv4J64HvArKs8nuNMOWkB3ICOaBTU/Aj4rYAo/ytdQDDFF/Pug==} + dev: true /caniuse-lite/1.0.30001352: resolution: {integrity: sha512-GUgH8w6YergqPQDGWhJGt8GDRnY0L/iJVQcU3eJ46GYf52R8tk0Wxp0PymuFVZboJYXGiCqwozAYZNRjVj6IcA==} @@ -24296,9 +24333,9 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.0.4 object.values: 1.1.5 - resolve: 1.22.1 + resolve: 1.20.0 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -24327,9 +24364,9 @@ packages: has: 1.0.3 is-core-module: 2.8.0 is-glob: 4.0.3 - minimatch: 3.1.2 + minimatch: 3.0.4 object.values: 1.1.5 - resolve: 1.22.1 + resolve: 1.20.0 tsconfig-paths: 3.14.0 transitivePeerDependencies: - eslint-import-resolver-typescript @@ -25944,15 +25981,6 @@ packages: debug: optional: true - /follow-redirects/1.14.7: - resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - /follow-redirects/1.14.7_debug@4.3.3: resolution: {integrity: sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==} engines: {node: '>=4.0'} @@ -25963,7 +25991,6 @@ packages: optional: true dependencies: debug: 4.3.3 - dev: true /follow-redirects/1.5.10: resolution: {integrity: sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==} @@ -26112,18 +26139,18 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.9.5 webpack: 5.70.0 @@ -26143,18 +26170,18 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.9.5 webpack: 4.46.0 @@ -26174,19 +26201,19 @@ packages: vue-template-compiler: optional: true dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.16.7 '@types/json-schema': 7.0.9 chalk: 4.1.2 chokidar: 3.5.3 cosmiconfig: 6.0.0 - deepmerge: 4.3.0 + deepmerge: 4.2.2 eslint: 8.32.0 fs-extra: 9.1.0 glob: 7.2.3 memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 - semver: 7.3.8 + semver: 7.3.5 tapable: 1.1.3 typescript: 4.9.5 webpack: 4.46.0_webpack-cli@3.3.12 @@ -27905,7 +27932,7 @@ packages: '@automattic/interpolate-components': 1.2.1_pxzommwrsowkd4kgag6q3sluym '@babel/runtime': 7.21.0 '@tannin/sprintf': 1.2.0 - '@wordpress/compose': 5.4.1_react@17.0.2 + '@wordpress/compose': 5.17.0_react@17.0.2 debug: 4.3.4 events: 3.3.0 hash.js: 1.1.7 @@ -32889,7 +32916,6 @@ packages: resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==} dependencies: brace-expansion: 1.1.11 - dev: true /minimatch/3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -34713,7 +34739,7 @@ packages: resolution: {integrity: sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 color: 3.2.1 has: 1.0.3 postcss: 7.0.39 @@ -34725,7 +34751,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 colord: 2.9.2 postcss: 8.4.12 @@ -34889,7 +34915,7 @@ packages: postcss: 8.4.21 schema-utils: 3.1.1 semver: 7.3.8 - webpack: 5.70.0_webpack-cli@3.3.12 + webpack: 5.70.0 /postcss-loader/4.3.0_twwyhqqim6liv4fz2ggv7g4m5a: resolution: {integrity: sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==} @@ -34965,7 +34991,7 @@ packages: resolution: {integrity: sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-util-same-parent: 4.0.1 postcss: 7.0.39 @@ -34978,7 +35004,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 @@ -35032,7 +35058,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: alphanum-sort: 1.0.2 - browserslist: 4.19.3 + browserslist: 4.21.4 cssnano-util-get-arguments: 4.0.0 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -35044,7 +35070,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 cssnano-utils: 3.1.0_postcss@8.4.12 postcss: 8.4.12 postcss-value-parser: 4.2.0 @@ -35290,7 +35316,7 @@ packages: resolution: {integrity: sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 7.0.39 postcss-value-parser: 3.3.1 @@ -35300,7 +35326,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 8.4.12 postcss-value-parser: 4.2.0 dev: true @@ -35365,7 +35391,7 @@ packages: resolution: {integrity: sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 has: 1.0.3 postcss: 7.0.39 @@ -35376,7 +35402,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 caniuse-api: 3.0.0 postcss: 8.4.12 dev: true @@ -36364,7 +36390,7 @@ packages: is-touch-device: 1.0.1 lodash: 4.17.21 moment: 2.29.4 - object.assign: 4.1.2 + object.assign: 4.1.4 object.values: 1.1.5 prop-types: 15.8.1 raf: 3.4.1 @@ -39264,7 +39290,7 @@ packages: resolution: {integrity: sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==} engines: {node: '>=6.9.0'} dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 7.0.39 postcss-selector-parser: 3.1.2 @@ -39274,7 +39300,7 @@ packages: peerDependencies: postcss: ^8.2.15 dependencies: - browserslist: 4.19.3 + browserslist: 4.21.4 postcss: 8.4.12 postcss-selector-parser: 6.0.9 dev: true From f5591b7c9a610d53d1d9b4959fbce00ca05b71eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maikel=20David=20P=C3=A9rez=20G=C3=B3mez?= Date: Tue, 11 Apr 2023 14:52:20 -0400 Subject: [PATCH 1369/1680] Add track inventory field to inventory section (#37585) --- .../js/product-editor/changelog/add-37400 | 4 + .../src/blocks/track-inventory/block.json | 25 +++++ .../src/blocks/track-inventory/edit.tsx | 103 ++++++++++++++++++ .../src/blocks/track-inventory/editor.scss | 15 +++ .../src/blocks/track-inventory/index.ts | 29 +++++ .../src/blocks/track-inventory/types.ts | 8 ++ .../src/components/editor/init-blocks.ts | 2 + packages/js/product-editor/src/style.scss | 1 + plugins/woocommerce/changelog/add-37400 | 4 + .../includes/class-wc-post-types.php | 6 + 10 files changed, 197 insertions(+) create mode 100644 packages/js/product-editor/changelog/add-37400 create mode 100644 packages/js/product-editor/src/blocks/track-inventory/block.json create mode 100644 packages/js/product-editor/src/blocks/track-inventory/edit.tsx create mode 100644 packages/js/product-editor/src/blocks/track-inventory/editor.scss create mode 100644 packages/js/product-editor/src/blocks/track-inventory/index.ts create mode 100644 packages/js/product-editor/src/blocks/track-inventory/types.ts create mode 100644 plugins/woocommerce/changelog/add-37400 diff --git a/packages/js/product-editor/changelog/add-37400 b/packages/js/product-editor/changelog/add-37400 new file mode 100644 index 00000000000..42330a9fdbf --- /dev/null +++ b/packages/js/product-editor/changelog/add-37400 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add product track inventory block diff --git a/packages/js/product-editor/src/blocks/track-inventory/block.json b/packages/js/product-editor/src/blocks/track-inventory/block.json new file mode 100644 index 00000000000..bee522393cc --- /dev/null +++ b/packages/js/product-editor/src/blocks/track-inventory/block.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-track-inventory-fields", + "title": "Product track inventory fields", + "category": "woocommerce", + "description": "The product track inventory fields.", + "keywords": [ "products", "track", "inventory" ], + "textdomain": "default", + "attributes": { + "name": { + "type": "string", + "__experimentalRole": "content" + } + }, + "supports": { + "align": false, + "html": false, + "multiple": false, + "reusable": false, + "inserter": false, + "lock": false + }, + "editorStyle": "file:./editor.css" +} diff --git a/packages/js/product-editor/src/blocks/track-inventory/edit.tsx b/packages/js/product-editor/src/blocks/track-inventory/edit.tsx new file mode 100644 index 00000000000..a08015ae0c7 --- /dev/null +++ b/packages/js/product-editor/src/blocks/track-inventory/edit.tsx @@ -0,0 +1,103 @@ +/** + * External dependencies + */ +import { BlockEditProps } from '@wordpress/blocks'; +import { useBlockProps } from '@wordpress/block-editor'; +import { useInstanceId } from '@wordpress/compose'; +import { useEntityProp } from '@wordpress/core-data'; +import { createElement, useEffect } from '@wordpress/element'; +import { __ } from '@wordpress/i18n'; +import { + BaseControl, + ToggleControl, + // @ts-expect-error `__experimentalInputControl` does exist. + __experimentalInputControl as InputControl, +} from '@wordpress/components'; + +/** + * Internal dependencies + */ +import { TrackInventoryBlockAttributes } from './types'; +import { useValidation } from '../../hooks/use-validation'; + +export function Edit( {}: BlockEditProps< TrackInventoryBlockAttributes > ) { + const blockProps = useBlockProps( { + className: 'wp-block-woocommerce-product-track-inventory-fields', + } ); + + const [ manageStock, setManageStock ] = useEntityProp< boolean >( + 'postType', + 'product', + 'manage_stock' + ); + + const [ stockQuantity, setStockQuantity ] = useEntityProp< number | null >( + 'postType', + 'product', + 'stock_quantity' + ); + + const stockQuantityId = useInstanceId( BaseControl ) as string; + + const isStockQuantityValid = useValidation( + 'product/stock_quantity', + function stockQuantityValidator() { + if ( ! manageStock ) return true; + return Boolean( stockQuantity && stockQuantity >= 0 ); + } + ); + + useEffect( () => { + if ( manageStock && stockQuantity === null ) { + setStockQuantity( 1 ); + } + }, [ manageStock, stockQuantity ] ); + + return ( +
    + + + { manageStock && ( +
    +
    + + + +
    + +
    +
    + ) } +
    + ); +} diff --git a/packages/js/product-editor/src/blocks/track-inventory/editor.scss b/packages/js/product-editor/src/blocks/track-inventory/editor.scss new file mode 100644 index 00000000000..28ed723ca6b --- /dev/null +++ b/packages/js/product-editor/src/blocks/track-inventory/editor.scss @@ -0,0 +1,15 @@ +.wp-block-woocommerce-product-track-inventory-fields { + .components-toggle-control { + margin-bottom: $gap-large; + } + + .has-error { + .components-base-control .components-input-control__backdrop { + border-color: $studio-red-50; + } + + .components-base-control__help { + color: $studio-red-50; + } + } +} diff --git a/packages/js/product-editor/src/blocks/track-inventory/index.ts b/packages/js/product-editor/src/blocks/track-inventory/index.ts new file mode 100644 index 00000000000..d52ac90ea2f --- /dev/null +++ b/packages/js/product-editor/src/blocks/track-inventory/index.ts @@ -0,0 +1,29 @@ +/** + * External dependencies + */ +import { createElement } from '@wordpress/element'; +import { BlockConfiguration } from '@wordpress/blocks'; + +/** + * Internal dependencies + */ +import { initBlock } from '../../utils/init-blocks'; +import blockConfiguration from './block.json'; +import { Edit } from './edit'; +import { TrackInventoryBlockAttributes } from './types'; + +const { name, ...metadata } = + blockConfiguration as BlockConfiguration< TrackInventoryBlockAttributes >; + +export { metadata, name }; + +export const settings: Partial< + BlockConfiguration< TrackInventoryBlockAttributes > +> = { + example: {}, + edit: Edit, +}; + +export function init() { + return initBlock( { name, metadata, settings } ); +} diff --git a/packages/js/product-editor/src/blocks/track-inventory/types.ts b/packages/js/product-editor/src/blocks/track-inventory/types.ts new file mode 100644 index 00000000000..9e39fa898e3 --- /dev/null +++ b/packages/js/product-editor/src/blocks/track-inventory/types.ts @@ -0,0 +1,8 @@ +/** + * External dependencies + */ +import { BlockAttributes } from '@wordpress/blocks'; + +export interface TrackInventoryBlockAttributes extends BlockAttributes { + name: string; +} diff --git a/packages/js/product-editor/src/components/editor/init-blocks.ts b/packages/js/product-editor/src/components/editor/init-blocks.ts index c81c2aa288a..ea4d0128b1d 100644 --- a/packages/js/product-editor/src/components/editor/init-blocks.ts +++ b/packages/js/product-editor/src/components/editor/init-blocks.ts @@ -21,6 +21,7 @@ import { init as initTab } from '../tab'; import { init as initPricing } from '../pricing-block'; import { init as initCollapsible } from '../collapsible-block'; import { init as initScheduleSale } from '../../blocks/schedule-sale'; +import { init as initTrackInventory } from '../../blocks/track-inventory'; export const initBlocks = () => { const coreBlocks = __experimentalGetCoreBlocks(); @@ -40,4 +41,5 @@ export const initBlocks = () => { initPricing(); initCollapsible(); initScheduleSale(); + initTrackInventory(); }; diff --git a/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index 7e2107e3fdb..be7eb118202 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -1,4 +1,5 @@ @import 'blocks/schedule-sale/editor.scss'; +@import 'blocks/track-inventory/editor.scss'; @import 'components/editor/style.scss'; @import 'components/product-section-layout/style.scss'; @import 'components/edit-product-link-modal/style.scss'; diff --git a/plugins/woocommerce/changelog/add-37400 b/plugins/woocommerce/changelog/add-37400 new file mode 100644 index 00000000000..f4d1ba1232e --- /dev/null +++ b/plugins/woocommerce/changelog/add-37400 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Register product track inventory block diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 19b5093c99e..e2c74e2afe7 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -584,6 +584,12 @@ class WC_Post_Types { 'id' => 'inventory', 'title' => __( 'Inventory', 'woocommerce' ), ), + array( + array( + 'woocommerce/product-track-inventory-fields', + array(), + ), + ), ), array( 'woocommerce/product-tab', From 30536f636ed8b5b2acb57d40ab37c3af8d900084 Mon Sep 17 00:00:00 2001 From: Moon Date: Tue, 11 Apr 2023 12:22:15 -0700 Subject: [PATCH 1370/1680] Check min. WP and PHP versions before suggesting plugins (#37611) * Add min_php_version for google and pinterest extensions * Hide extensions that do not meet the min php version requirement. * Add min_wp_version * Add changelog * Revert code style --- ...ate-16525-check-php-version-for-extensions | 4 +++ .../DefaultFreeExtensions.php | 26 +++++++++++-------- .../EvaluateExtension.php | 9 +++++++ 3 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions diff --git a/plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions b/plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions new file mode 100644 index 00000000000..9cb44346db3 --- /dev/null +++ b/plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Support min_php_version and min_wp_version for the free extensions feed diff --git a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php index 99055062238..e893afd283e 100644 --- a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php +++ b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php @@ -79,17 +79,18 @@ class DefaultFreeExtensions { public static function get_plugin( $slug ) { $plugins = array( 'google-listings-and-ads' => [ - 'name' => __( 'Google Listings & Ads', 'woocommerce' ), - 'description' => sprintf( + 'min_php_version' => '7.4', + 'name' => __( 'Google Listings & Ads', 'woocommerce' ), + 'description' => sprintf( /* translators: 1: opening product link tag. 2: closing link tag */ __( 'Drive sales with %1$sGoogle Listings and Ads%2$s', 'woocommerce' ), '', '' ), - 'image_url' => plugins_url( '/assets/images/onboarding/google.svg', WC_PLUGIN_FILE ), - 'manage_url' => 'admin.php?page=wc-admin&path=%2Fgoogle%2Fstart', - 'is_built_by_wc' => true, - 'is_visible' => [ + 'image_url' => plugins_url( '/assets/images/onboarding/google.svg', WC_PLUGIN_FILE ), + 'manage_url' => 'admin.php?page=wc-admin&path=%2Fgoogle%2Fstart', + 'is_built_by_wc' => true, + 'is_visible' => [ [ 'type' => 'not', 'operand' => [ @@ -125,11 +126,12 @@ class DefaultFreeExtensions { 'is_built_by_wc' => false, ], 'pinterest-for-woocommerce' => [ - 'name' => __( 'Pinterest for WooCommerce', 'woocommerce' ), - 'description' => __( 'Get your products in front of Pinners searching for ideas and things to buy.', 'woocommerce' ), - 'image_url' => plugins_url( '/assets/images/onboarding/pinterest.png', WC_PLUGIN_FILE ), - 'manage_url' => 'admin.php?page=wc-admin&path=%2Fpinterest%2Flanding', - 'is_built_by_wc' => true, + 'name' => __( 'Pinterest for WooCommerce', 'woocommerce' ), + 'description' => __( 'Get your products in front of Pinners searching for ideas and things to buy.', 'woocommerce' ), + 'image_url' => plugins_url( '/assets/images/onboarding/pinterest.png', WC_PLUGIN_FILE ), + 'manage_url' => 'admin.php?page=wc-admin&path=%2Fpinterest%2Flanding', + 'is_built_by_wc' => true, + 'min_php_version' => '7.3', ], 'pinterest-for-woocommerce:alt' => [ 'name' => __( 'Pinterest for WooCommerce', 'woocommerce' ), @@ -349,6 +351,7 @@ class DefaultFreeExtensions { DefaultPaymentGateways::get_rules_for_cbd( false ), ], 'is_built_by_wc' => true, + 'min_wp_version' => '5.9', ], 'woocommerce-services:shipping' => [ 'description' => sprintf( @@ -516,6 +519,7 @@ class DefaultFreeExtensions { ], ], 'is_built_by_wc' => false, + 'min_wp_version' => '6.0', ], 'mailpoet' => [ 'name' => __( 'MailPoet', 'woocommerce' ), diff --git a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php index 100dd94a125..8256be19ce3 100644 --- a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php +++ b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php @@ -21,6 +21,7 @@ class EvaluateExtension { * @return object The evaluated extension. */ public static function evaluate( $extension ) { + global $wp_version; $rule_evaluator = new RuleEvaluator(); if ( isset( $extension->is_visible ) ) { @@ -30,6 +31,14 @@ class EvaluateExtension { $extension->is_visible = true; } + if ( isset( $extension->min_php_version ) ) { + $extension->is_visible = version_compare( PHP_VERSION, $extension->min_php_version, '>=' ); + } + + if ( isset( $extension->min_wp_version ) ) { + $extension->is_visible = version_compare( $wp_version, $extension->min_wp_version, '>=' ); + } + $installed_plugins = PluginsHelper::get_installed_plugin_slugs(); $activated_plugins = PluginsHelper::get_active_plugin_slugs(); $extension->is_installed = in_array( explode( ':', $extension->key )[0], $installed_plugins, true ); From c4a7e9a11b62e9f62fd507f5a0c8ae09740619a0 Mon Sep 17 00:00:00 2001 From: Paul Sealock Date: Wed, 12 Apr 2023 09:26:21 +1200 Subject: [PATCH 1371/1680] Monorepo CLI tooling: Set folder organisation (#37561) --- .github/workflows/pr-highlight-changes.yml | 2 +- package.json | 8 +- pnpm-lock.yaml | 2107 +++++++++++++++-- pnpm-workspace.yaml | 1 + tools/code-analyzer/.eslintrc.js | 2 +- tools/monorepo-utils/.eslintignore | 0 tools/monorepo-utils/.eslintrc.js | 4 + tools/monorepo-utils/.gitignore | 0 tools/monorepo-utils/README.md | 5 + tools/monorepo-utils/jest.config.js | 6 + tools/monorepo-utils/package.json | 35 + .../monorepo-utils/src/code-freeze/README.md | 3 + .../src/code-freeze/commands/index.ts | 15 + .../src/code-freeze/commands/verify-day.ts | 21 + .../src/code-freeze/utils/__tests__/index.ts | 10 + .../src/code-freeze/utils/index.ts | 3 + tools/monorepo-utils/src/index.ts | 17 + tools/monorepo-utils/tsconfig.json | 15 + 18 files changed, 2118 insertions(+), 136 deletions(-) create mode 100644 tools/monorepo-utils/.eslintignore create mode 100644 tools/monorepo-utils/.eslintrc.js create mode 100644 tools/monorepo-utils/.gitignore create mode 100644 tools/monorepo-utils/README.md create mode 100644 tools/monorepo-utils/jest.config.js create mode 100644 tools/monorepo-utils/package.json create mode 100644 tools/monorepo-utils/src/code-freeze/README.md create mode 100644 tools/monorepo-utils/src/code-freeze/commands/index.ts create mode 100644 tools/monorepo-utils/src/code-freeze/commands/verify-day.ts create mode 100644 tools/monorepo-utils/src/code-freeze/utils/__tests__/index.ts create mode 100644 tools/monorepo-utils/src/code-freeze/utils/index.ts create mode 100755 tools/monorepo-utils/src/index.ts create mode 100644 tools/monorepo-utils/tsconfig.json diff --git a/.github/workflows/pr-highlight-changes.yml b/.github/workflows/pr-highlight-changes.yml index b1ecc977f14..ec9d0c28393 100644 --- a/.github/workflows/pr-highlight-changes.yml +++ b/.github/workflows/pr-highlight-changes.yml @@ -22,7 +22,7 @@ jobs: run: | npm install -g pnpm@7 npm -g i @wordpress/env@5.1.0 - pnpm install --filter code-analyzer --filter cli-core + pnpm install --filter monorepo-utils --filter code-analyzer --filter cli-core - name: Run analyzer id: run working-directory: tools/code-analyzer diff --git a/package.json b/package.json index adb2745dd07..378c21602ee 100644 --- a/package.json +++ b/package.json @@ -17,16 +17,20 @@ "bugs": { "url": "https://github.com/woocommerce/woocommerce/issues" }, + "bin": { + "utils": "./tools/monorepo-utils/dist/index.js" + }, "scripts": { "build": "pnpm exec turbo run turbo:build", "test": "pnpm exec turbo run turbo:test", "clean": "pnpm store prune && git clean -fx **/node_modules && pnpm i", "preinstall": "npx only-allow pnpm", - "postinstall": "pnpm git:update-hooks", + "postinstall": "pnpm git:update-hooks && pnpm run --filter='./tools/monorepo-utils' build", "git:update-hooks": "rm -r .git/hooks && mkdir -p .git/hooks && husky install", "create-extension": "node ./tools/create-extension/index.js", "cherry-pick": "node ./tools/cherry-pick/bin/run", - "sync-dependencies": "pnpm exec syncpack -- fix-mismatches" + "sync-dependencies": "pnpm exec syncpack -- fix-mismatches", + "utils": "./tools/monorepo-utils/dist/index.js" }, "devDependencies": { "@babel/preset-env": "^7.20.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 26415e7da7c..5cc26d71320 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -222,7 +222,7 @@ importers: dotenv: 10.0.0 jest: 27.5.1 jest-allure: 0.1.3 - jest-runner-groups: 2.2.0_izd2bb4ook7j3zolwvt7oz6lf4 + jest-runner-groups: 2.2.0_si6aka6xkbrcvhz7vk2qr7go64 postman-collection: 4.1.5 supertest: 6.2.4 devDependencies: @@ -800,7 +800,7 @@ importers: dependencies: '@jest/globals': 27.5.1 '@woocommerce/api': link:../api - '@woocommerce/e2e-utils': 0.1.6_drwlo4y73cla4rzwrrjk6eyf6e + '@woocommerce/e2e-utils': 0.1.6_lwdsu27pg5ztgtejufpr6ijesa '@wordpress/deprecated': 3.6.1 config: 3.3.7 devDependencies: @@ -920,7 +920,7 @@ importers: '@automattic/puppeteer-utils': github.com/Automattic/puppeteer-utils/0f3ec50_react-native@0.70.0 '@woocommerce/api': link:../api '@wordpress/deprecated': 3.6.1 - '@wordpress/e2e-test-utils': 7.2.1_hmvsd4hlimltsdqszkn2ou62si + '@wordpress/e2e-test-utils': 7.2.1_lbgvwpw4gzlmvdk3yuc5tcyftm config: 3.3.7 fishery: 1.4.0 devDependencies: @@ -2254,6 +2254,33 @@ importers: tslib: 2.3.1 typescript: 4.9.5 + tools/monorepo-utils: + specifiers: + '@commander-js/extra-typings': ^0.1.0 + '@types/jest': ^27.4.1 + '@types/node': ^16.18.18 + '@woocommerce/eslint-plugin': workspace:* + chalk: ^4.1.2 + commander: ^9.4.0 + dotenv: ^10.0.0 + eslint: ^8.32.0 + jest: ^29.5.0 + ts-jest: ^29.1.0 + typescript: ^4.9.5 + dependencies: + '@commander-js/extra-typings': 0.1.0_commander@9.4.0 + chalk: 4.1.2 + commander: 9.4.0 + dotenv: 10.0.0 + devDependencies: + '@types/jest': 27.4.1 + '@types/node': 16.18.21 + '@woocommerce/eslint-plugin': link:../../packages/js/eslint-plugin + eslint: 8.32.0 + jest: 29.5.0_@types+node@16.18.21 + ts-jest: 29.1.0_q744lk64cx4tbpg7zn4yr5nesi + typescript: 4.9.5 + tools/package-release: specifiers: '@oclif/core': ^1 @@ -2514,7 +2541,7 @@ packages: qs: 6.10.3 react: 17.0.2 redux: 4.2.0 - tslib: 2.3.1 + tslib: 2.5.0 utility-types: 3.10.0 validator: 13.7.0 transitivePeerDependencies: @@ -2563,13 +2590,13 @@ packages: dependencies: '@automattic/explat-client': 0.0.3 react: 17.0.2 - tslib: 2.3.1 + tslib: 2.5.0 dev: false /@automattic/explat-client/0.0.3: resolution: {integrity: sha512-N2/H9l3JZLZLSIyZJMnHKUWZWFjeakU40vm3k3EHdCHdKh8pu2Mz/BrMbtWImYBzaEJnbUZrHM/fAuhFy4sORg==} dependencies: - tslib: 2.3.1 + tslib: 2.5.0 dev: false /@automattic/format-currency/1.0.0-alpha.0: @@ -2980,6 +3007,32 @@ packages: browserslist: 4.19.3 semver: 6.3.0 + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.12.9 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: + resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.17.8 + '@babel/helper-validator-option': 7.18.6 + browserslist: 4.21.4 + semver: 6.3.0 + dev: true + /@babel/helper-compilation-targets/7.17.7_@babel+core@7.21.3: resolution: {integrity: sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==} engines: {node: '>=6.9.0'} @@ -3045,6 +3098,24 @@ packages: lru-cache: 5.1.1 semver: 6.3.0 + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-member-expression-to-functions': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-replace-supers': 7.20.7 + '@babel/helper-split-export-declaration': 7.18.6 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-create-class-features-plugin/7.17.6_@babel+core@7.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -3569,6 +3640,26 @@ packages: dependencies: '@babel/types': 7.21.3 + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==} engines: {node: '>=6.9.0'} @@ -3608,6 +3699,30 @@ packages: '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.20.2 + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 + dev: true + + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 + dev: true + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==} engines: {node: '>=6.9.0'} @@ -3668,6 +3783,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.12.9 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: + resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.17.8 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.21.3: resolution: {integrity: sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==} engines: {node: '>=6.9.0'} @@ -3737,6 +3880,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==} engines: {node: '>=6.9.0'} @@ -3799,6 +3955,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.12.9: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: + resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.12.0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-class-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.8 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.21.3: resolution: {integrity: sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==} engines: {node: '>=6.9.0'} @@ -3892,6 +4076,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-dynamic-import/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==} engines: {node: '>=6.9.0'} @@ -3976,6 +4182,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-export-namespace-from/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==} engines: {node: '>=6.9.0'} @@ -4029,6 +4257,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-json-strings/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==} engines: {node: '>=6.9.0'} @@ -4082,6 +4332,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-logical-assignment-operators/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==} engines: {node: '>=6.9.0'} @@ -4135,6 +4407,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.12.9 + dev: true + /@babel/plugin-proposal-nullish-coalescing-operator/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==} engines: {node: '>=6.9.0'} @@ -4197,6 +4480,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-numeric-separator/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==} engines: {node: '>=6.9.0'} @@ -4264,6 +4569,20 @@ packages: '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 '@babel/plugin-transform-parameters': 7.16.3_@babel+core@7.12.9 + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.12.9: + resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.12.9 + dev: true + /@babel/plugin-proposal-object-rest-spread/7.17.3_@babel+core@7.17.8: resolution: {integrity: sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==} engines: {node: '>=6.9.0'} @@ -4342,6 +4661,28 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.12.9 + dev: true + + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 + dev: true + /@babel/plugin-proposal-optional-catch-binding/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==} engines: {node: '>=6.9.0'} @@ -4395,6 +4736,18 @@ packages: '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 + dev: true + /@babel/plugin-proposal-optional-chaining/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==} engines: {node: '>=6.9.0'} @@ -4464,6 +4817,19 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.12.9: + resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-methods/7.16.11_@babel+core@7.17.8: resolution: {integrity: sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==} engines: {node: '>=6.9.0'} @@ -4528,6 +4894,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.16.7 + '@babel/helper-create-class-features-plugin': 7.17.6_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-proposal-private-property-in-object/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} engines: {node: '>=6.9.0'} @@ -4612,6 +4993,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} + engines: {node: '>=4'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-proposal-unicode-property-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==} engines: {node: '>=4'} @@ -5270,6 +5673,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-arrow-functions/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==} engines: {node: '>=6.9.0'} @@ -5331,6 +5744,20 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-imports': 7.16.7 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-remap-async-to-generator': 7.16.8 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-async-to-generator/7.16.8_@babel+core@7.17.8: resolution: {integrity: sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==} engines: {node: '>=6.9.0'} @@ -5408,6 +5835,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-block-scoped-functions/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==} engines: {node: '>=6.9.0'} @@ -5455,6 +5902,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-block-scoping/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==} engines: {node: '>=6.9.0'} @@ -5520,6 +5977,25 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-annotate-as-pure': 7.18.6 + '@babel/helper-environment-visitor': 7.18.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-optimise-call-expression': 7.18.6 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + '@babel/helper-split-export-declaration': 7.18.6 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-classes/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==} engines: {node: '>=6.9.0'} @@ -5625,6 +6101,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==} engines: {node: '>=6.9.0'} @@ -5672,6 +6168,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-destructuring/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==} engines: {node: '>=6.9.0'} @@ -5730,6 +6236,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-dotall-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==} engines: {node: '>=6.9.0'} @@ -5781,6 +6309,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==} engines: {node: '>=6.9.0'} @@ -5830,6 +6378,28 @@ packages: '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-exponentiation-operator/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==} engines: {node: '>=6.9.0'} @@ -5911,6 +6481,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-for-of/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==} engines: {node: '>=6.9.0'} @@ -5969,6 +6549,30 @@ packages: '@babel/helper-function-name': 7.19.0 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 + '@babel/helper-function-name': 7.21.0 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-function-name/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==} engines: {node: '>=6.9.0'} @@ -6024,6 +6628,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-literals/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==} engines: {node: '>=6.9.0'} @@ -6071,6 +6695,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-member-expression-literals/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==} engines: {node: '>=6.9.0'} @@ -6122,6 +6766,34 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==} engines: {node: '>=6.9.0'} @@ -6188,6 +6860,21 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.12.9: + resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-simple-access': 7.18.6 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-commonjs/7.17.7_@babel+core@7.17.8: resolution: {integrity: sha512-ITPmR2V7MqioMJyrxUo2onHNC3e+MvfFiFIR0RP21d3PtlVb6sfzoxNKiphSZUOM9hEIdzCcZe83ieX3yoqjUA==} engines: {node: '>=6.9.0'} @@ -6272,6 +6959,38 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.12.9: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: + resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-hoist-variables': 7.18.6 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-validator-identifier': 7.19.1 + babel-plugin-dynamic-import-node: 2.3.3 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.21.3: resolution: {integrity: sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==} engines: {node: '>=6.9.0'} @@ -6344,6 +7063,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-module-transforms': 7.21.2 + '@babel/helper-plugin-utils': 7.20.2 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==} engines: {node: '>=6.9.0'} @@ -6404,6 +7149,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.12.9: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + dev: true + + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.17.8: + resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + dev: true + /@babel/plugin-transform-named-capturing-groups-regex/7.16.8_@babel+core@7.21.3: resolution: {integrity: sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==} engines: {node: '>=6.9.0'} @@ -6454,6 +7219,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==} engines: {node: '>=6.9.0'} @@ -6505,6 +7290,32 @@ packages: transitivePeerDependencies: - supports-color + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-replace-supers': 7.19.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==} engines: {node: '>=6.9.0'} @@ -6564,6 +7375,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-parameters/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==} engines: {node: '>=6.9.0'} @@ -6621,6 +7442,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==} engines: {node: '>=6.9.0'} @@ -6866,6 +7707,26 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + regenerator-transform: 0.14.5 + dev: true + + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + regenerator-transform: 0.14.5 + dev: true + /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==} engines: {node: '>=6.9.0'} @@ -6917,6 +7778,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==} engines: {node: '>=6.9.0'} @@ -7031,6 +7912,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-shorthand-properties/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==} engines: {node: '>=6.9.0'} @@ -7089,6 +7980,17 @@ packages: '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + '@babel/helper-skip-transparent-expression-wrappers': 7.18.9 + dev: true + /@babel/plugin-transform-spread/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==} engines: {node: '>=6.9.0'} @@ -7151,6 +8053,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==} engines: {node: '>=6.9.0'} @@ -7198,6 +8120,16 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-template-literals/7.16.7_@babel+core@7.17.8: resolution: {integrity: sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==} engines: {node: '>=6.9.0'} @@ -7255,6 +8187,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==} engines: {node: '>=6.9.0'} @@ -7355,6 +8307,26 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==} engines: {node: '>=6.9.0'} @@ -7404,6 +8376,28 @@ packages: '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 '@babel/helper-plugin-utils': 7.19.0 + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.12.9: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.12.9 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.17.8: + resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.17.8 + '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-transform-unicode-regex/7.16.7_@babel+core@7.21.3: resolution: {integrity: sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==} engines: {node: '>=6.9.0'} @@ -7535,28 +8529,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.17.7 '@babel/core': 7.12.9 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.12.9 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.12.9 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.12.9 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.12.9 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.12.9 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.12.9 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.12.9 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.12.9 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.12.9 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.12.9 @@ -7571,44 +8565,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.12.9 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.12.9 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.12.9 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.12.9 - '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.12.9 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.12.9 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.12.9 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.12.9 - '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.12.9 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.12.9 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.12.9 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.12.9 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.12.9 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.12.9 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.12.9 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.12.9 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.12.9 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.12.9 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.12.9 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.12.9 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.12.9 '@babel/preset-modules': 0.1.5_@babel+core@7.12.9 - '@babel/types': 7.21.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.12.9 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.12.9 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.12.9 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.12.9 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -7620,28 +8614,28 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.21.0 + '@babel/compat-data': 7.17.7 '@babel/core': 7.17.8 - '@babel/helper-compilation-targets': 7.20.7_@babel+core@7.17.8 - '@babel/helper-plugin-utils': 7.20.2 - '@babel/helper-validator-option': 7.18.6 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-async-generator-functions': 7.20.7_@babel+core@7.17.8 - '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-object-rest-spread': 7.20.7_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.17.8 + '@babel/helper-compilation-targets': 7.17.7_@babel+core@7.17.8 + '@babel/helper-plugin-utils': 7.18.9 + '@babel/helper-validator-option': 7.16.7 + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-async-generator-functions': 7.16.8_@babel+core@7.17.8 + '@babel/plugin-proposal-class-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-class-static-block': 7.17.6_@babel+core@7.17.8 + '@babel/plugin-proposal-dynamic-import': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-export-namespace-from': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-json-strings': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-logical-assignment-operators': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-nullish-coalescing-operator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-numeric-separator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-object-rest-spread': 7.17.3_@babel+core@7.17.8 + '@babel/plugin-proposal-optional-catch-binding': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-optional-chaining': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-private-methods': 7.16.11_@babel+core@7.17.8 + '@babel/plugin-proposal-private-property-in-object': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-proposal-unicode-property-regex': 7.16.7_@babel+core@7.17.8 '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.17.8 '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.17.8 '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.8 @@ -7656,44 +8650,44 @@ packages: '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.17.8 '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.17.8 '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.17.8 - '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-block-scoping': 7.21.0_@babel+core@7.17.8 - '@babel/plugin-transform-classes': 7.21.0_@babel+core@7.17.8 - '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-destructuring': 7.21.3_@babel+core@7.17.8 - '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.17.8 - '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-modules-amd': 7.20.11_@babel+core@7.17.8 - '@babel/plugin-transform-modules-commonjs': 7.21.2_@babel+core@7.17.8 - '@babel/plugin-transform-modules-systemjs': 7.20.11_@babel+core@7.17.8 - '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.17.8 - '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-parameters': 7.21.3_@babel+core@7.17.8 - '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.17.8 - '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.17.8 - '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.17.8 - '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.17.8 - '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.17.8 + '@babel/plugin-transform-arrow-functions': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-async-to-generator': 7.16.8_@babel+core@7.17.8 + '@babel/plugin-transform-block-scoped-functions': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-block-scoping': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-classes': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-computed-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-destructuring': 7.17.7_@babel+core@7.17.8 + '@babel/plugin-transform-dotall-regex': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-duplicate-keys': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-exponentiation-operator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-for-of': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-function-name': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-member-expression-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-amd': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-commonjs': 7.17.7_@babel+core@7.17.8 + '@babel/plugin-transform-modules-systemjs': 7.17.8_@babel+core@7.17.8 + '@babel/plugin-transform-modules-umd': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-named-capturing-groups-regex': 7.16.8_@babel+core@7.17.8 + '@babel/plugin-transform-new-target': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-object-super': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-parameters': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-property-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-regenerator': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-reserved-words': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-shorthand-properties': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-spread': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-sticky-regex': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-template-literals': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-typeof-symbol': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-unicode-escapes': 7.16.7_@babel+core@7.17.8 + '@babel/plugin-transform-unicode-regex': 7.16.7_@babel+core@7.17.8 '@babel/preset-modules': 0.1.5_@babel+core@7.17.8 - '@babel/types': 7.21.3 - babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.17.8 + '@babel/types': 7.17.0 + babel-plugin-polyfill-corejs2: 0.3.0_@babel+core@7.17.8 babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.17.8 babel-plugin-polyfill-regenerator: 0.3.0_@babel+core@7.17.8 - core-js-compat: 3.25.5 + core-js-compat: 3.21.1 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -9017,6 +10011,17 @@ packages: jest-util: 27.5.1 slash: 3.0.0 + /@jest/console/29.5.0: + resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + chalk: 4.1.2 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + slash: 3.0.0 + /@jest/core/24.9.0: resolution: {integrity: sha512-Fogg3s4wlAr1VX7q+rhV9RVnUv5tD7VuWfYy1+whMiWUrvl7U3QJSJyWcDio9Lq2prqYsZaeTv2Rz24pWGkJ2A==} engines: {node: '>= 6'} @@ -9178,6 +10183,47 @@ packages: - ts-node - utf-8-validate + /@jest/core/29.5.0: + resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.5.0 + '@jest/reporters': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.2.0 + exit: 0.1.2 + graceful-fs: 4.2.9 + jest-changed-files: 29.5.0 + jest-config: 29.5.0_@types+node@16.18.21 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-resolve-dependencies: 29.5.0 + jest-runner: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + jest-watcher: 29.5.0 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - supports-color + - ts-node + /@jest/create-cache-key-function/27.5.1: resolution: {integrity: sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -9224,6 +10270,30 @@ packages: '@types/node': 16.18.21 jest-mock: 27.5.1 + /@jest/environment/29.5.0: + resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + jest-mock: 29.5.0 + + /@jest/expect-utils/29.5.0: + resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + + /@jest/expect/29.5.0: + resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.5.0 + jest-snapshot: 29.5.0 + transitivePeerDependencies: + - supports-color + /@jest/fake-timers/24.9.0: resolution: {integrity: sha512-eWQcNa2YSwzXWIMC5KufBh3oWRIijrQFROsIqt6v/NS9Io/gknw1jsAC9c+ih/RQX4A3O7SeWAhQeN0goKhT9A==} engines: {node: '>= 6'} @@ -9269,6 +10339,17 @@ packages: jest-mock: 27.5.1 jest-util: 27.5.1 + /@jest/fake-timers/29.5.0: + resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@sinonjs/fake-timers': 10.0.2 + '@types/node': 16.18.21 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-util: 29.5.0 + /@jest/globals/25.5.2: resolution: {integrity: sha512-AgAS/Ny7Q2RCIj5kZ+0MuKM1wbF0WMLxbCVl/GOMoCNbODRdJ541IxJ98xnZdVSZXivKpJlNPIWa3QmY0l4CXA==} engines: {node: '>= 8.3'} @@ -9295,6 +10376,17 @@ packages: '@jest/types': 27.5.1 expect: 27.5.1 + /@jest/globals/29.5.0: + resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/types': 29.5.0 + jest-mock: 29.5.0 + transitivePeerDependencies: + - supports-color + /@jest/reporters/24.9.0: resolution: {integrity: sha512-mu4X0yjaHrffOsWmVLzitKmmmWSQ3GGuefgNscUSWNiUNcEOSEQk9k3pERKEQVBb0Cnn88+UESIsZEMH3o88Gw==} engines: {node: '>= 6'} @@ -9431,6 +10523,48 @@ packages: transitivePeerDependencies: - supports-color + /@jest/reporters/29.5.0: + resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.17 + '@types/node': 16.18.21 + chalk: 4.1.2 + collect-v8-coverage: 1.0.1 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.9 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.1.0 + istanbul-lib-report: 3.0.0 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.4 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + jest-worker: 29.5.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.1.0 + transitivePeerDependencies: + - supports-color + + /@jest/schemas/29.4.3: + resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.25.24 + /@jest/source-map/24.9.0: resolution: {integrity: sha512-/Xw7xGlsZb4MJzNDgB7PW5crou5JqWiBQaz6xyPd3ArOg2nfn/PunV8+olXbbEZzNl591o5rWKE9BRDaFAuIBg==} engines: {node: '>= 6'} @@ -9466,6 +10600,14 @@ packages: graceful-fs: 4.2.9 source-map: 0.6.1 + /@jest/source-map/29.4.3: + resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + callsites: 3.1.0 + graceful-fs: 4.2.9 + /@jest/test-result/24.9.0: resolution: {integrity: sha512-XEFrHbBonBJ8dGp2JmF8kP/nQI/ImPpygKHwQ/SY+es59Z3L5PI4Qb9TQQMAEeYsThG1xF0k6tmG0tIKATNiiA==} engines: {node: '>= 6'} @@ -9504,6 +10646,15 @@ packages: '@types/istanbul-lib-coverage': 2.0.3 collect-v8-coverage: 1.0.1 + /@jest/test-result/29.5.0: + resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.5.0 + '@jest/types': 29.5.0 + '@types/istanbul-lib-coverage': 2.0.3 + collect-v8-coverage: 1.0.1 + /@jest/test-sequencer/24.9.0: resolution: {integrity: sha512-6qqsU4o0kW1dvA95qfNog8v8gkRN9ph6Lz7r96IvZpHdNipP2cBcb07J1Z45mz/VIS01OHJ3pY8T5fUY38tg4A==} engines: {node: '>= 6'} @@ -9562,6 +10713,15 @@ packages: transitivePeerDependencies: - supports-color + /@jest/test-sequencer/29.5.0: + resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.5.0 + graceful-fs: 4.2.9 + jest-haste-map: 29.5.0 + slash: 3.0.0 + /@jest/transform/24.9.0: resolution: {integrity: sha512-TcQUmyNRxV94S0QpMOnZl0++6RMiqpbH/ZMccFB/amku6Uwvyb1cjYX7xkp5nGNkbX4QPH/FcB6q1HBTHynLmQ==} engines: {node: '>= 6'} @@ -9654,6 +10814,28 @@ packages: transitivePeerDependencies: - supports-color + /@jest/transform/29.5.0: + resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.21.3 + '@jest/types': 29.5.0 + '@jridgewell/trace-mapping': 0.3.17 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.9 + jest-haste-map: 29.5.0 + jest-regex-util: 29.4.3 + jest-util: 29.5.0 + micromatch: 4.0.5 + pirates: 4.0.5 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + /@jest/types/24.9.0: resolution: {integrity: sha512-XKK7ze1apu5JWQ5eZjHITP66AX+QsLlbaJRBGYr8pNzwcAE2JVkwnf0yqjHTsDRcjR0mujy/NmZMXw5kl+kGBw==} engines: {node: '>= 6'} @@ -9693,6 +10875,17 @@ packages: '@types/yargs': 16.0.4 chalk: 4.1.2 + /@jest/types/29.5.0: + resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + '@types/istanbul-lib-coverage': 2.0.3 + '@types/istanbul-reports': 3.0.1 + '@types/node': 16.18.21 + '@types/yargs': 17.0.24 + chalk: 4.1.2 + /@jridgewell/gen-mapping/0.1.1: resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==} engines: {node: '>=6.0.0'} @@ -10052,7 +11245,7 @@ packages: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.2.0 - tslib: 2.3.1 + tslib: 2.5.0 widest-line: 3.1.0 wrap-ansi: 7.0.0 @@ -10122,7 +11315,7 @@ packages: load-json-file: 5.3.0 npm-run-path: 4.0.1 semver: 7.3.7 - tslib: 2.3.1 + tslib: 2.5.0 yarn: 1.22.19 transitivePeerDependencies: - supports-color @@ -10766,6 +11959,9 @@ packages: /@sideway/pinpoint/2.0.0: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + /@sinclair/typebox/0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + /@sindresorhus/is/2.1.1: resolution: {integrity: sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==} engines: {node: '>=10'} @@ -10781,6 +11977,16 @@ packages: dependencies: type-detect: 4.0.8 + /@sinonjs/commons/2.0.0: + resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} + dependencies: + type-detect: 4.0.8 + + /@sinonjs/fake-timers/10.0.2: + resolution: {integrity: sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==} + dependencies: + '@sinonjs/commons': 2.0.0 + /@sinonjs/fake-timers/6.0.1: resolution: {integrity: sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==} dependencies: @@ -14863,6 +16069,11 @@ packages: dependencies: '@types/yargs-parser': 20.2.1 + /@types/yargs/17.0.24: + resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==} + dependencies: + '@types/yargs-parser': 20.2.1 + /@types/yauzl/2.9.2: resolution: {integrity: sha512-8uALY5LTvSuHgloDVUvWP3pIauILm+8/0pDMokuDYIoNsOkSwd5AiHBTSEJjKTDcZr5z8UpgOWZkxBF4iJftoA==} requiresBuild: true @@ -15537,14 +16748,14 @@ packages: prop-types: 15.8.1 react: 17.0.2 - /@woocommerce/e2e-utils/0.1.6_drwlo4y73cla4rzwrrjk6eyf6e: + /@woocommerce/e2e-utils/0.1.6_lwdsu27pg5ztgtejufpr6ijesa: resolution: {integrity: sha512-gWSEgFIjMqaqiiIyrpa1epIHkmBBAfk6WfRojva1f5ZmffSJCc0VbX2jQQRdFm1BuEYr8KGCCYo+q8NIjlMZ7g==} peerDependencies: '@woocommerce/api': ^0.2.0 dependencies: '@woocommerce/api': link:packages/js/api '@wordpress/deprecated': 2.12.3 - '@wordpress/e2e-test-utils': 4.16.1_eod7vs2qyqnfu2oldnxglnszkq + '@wordpress/e2e-test-utils': 4.16.1_d2bihccpwwyuin5554pd3vha7i config: 3.3.3 faker: 5.5.3 fishery: 1.4.0 @@ -17241,6 +18452,25 @@ packages: - react-native dev: false + /@wordpress/e2e-test-utils/4.16.1_d2bihccpwwyuin5554pd3vha7i: + resolution: {integrity: sha512-Dpsq5m0VSvjIhro2MjACSzkOkOf1jGEryzgEMW1ikbT6YI+motspHfGtisKXgYhZJOnjV4PwuEg+9lPVnd971g==} + engines: {node: '>=8'} + peerDependencies: + jest: '>=24' + puppeteer: '>=1.19.0' + dependencies: + '@babel/runtime': 7.21.0 + '@wordpress/keycodes': 2.19.3 + '@wordpress/url': 2.22.2_react-native@0.70.0 + jest: 29.5.0 + lodash: 4.17.21 + node-fetch: 2.6.7 + puppeteer: 2.1.1 + transitivePeerDependencies: + - encoding + - react-native + dev: false + /@wordpress/e2e-test-utils/4.16.1_eod7vs2qyqnfu2oldnxglnszkq: resolution: {integrity: sha512-Dpsq5m0VSvjIhro2MjACSzkOkOf1jGEryzgEMW1ikbT6YI+motspHfGtisKXgYhZJOnjV4PwuEg+9lPVnd971g==} engines: {node: '>=8'} @@ -17260,7 +18490,7 @@ packages: - react-native dev: false - /@wordpress/e2e-test-utils/7.2.1_hmvsd4hlimltsdqszkn2ou62si: + /@wordpress/e2e-test-utils/7.2.1_lbgvwpw4gzlmvdk3yuc5tcyftm: resolution: {integrity: sha512-eqo4quzgGFArZLLocC5sPfdCLiiS9zMTCRs+Kn4Tl4lLDOLhTk9I1MZcBkvJJ0Qd75FEcdeLaqNaSYNCu6rgyw==} engines: {node: '>=12'} peerDependencies: @@ -17272,7 +18502,7 @@ packages: '@wordpress/keycodes': 3.28.0 '@wordpress/url': 3.29.0 form-data: 4.0.0 - jest: 27.5.1 + jest: 29.5.0 lodash: 4.17.21 node-fetch: 2.6.7 puppeteer-core: 19.7.3_typescript@4.9.5 @@ -19763,6 +20993,23 @@ packages: transitivePeerDependencies: - supports-color + /babel-jest/29.5.0_@babel+core@7.21.3: + resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.21.3 + '@jest/transform': 29.5.0 + '@types/babel__core': 7.1.16 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.5.0_@babel+core@7.21.3 + chalk: 4.1.2 + graceful-fs: 4.2.9 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + /babel-loader/8.2.3_7kihywspc3gmje7ccze4zrmvoq: resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} engines: {node: '>= 8.9'} @@ -19942,6 +21189,15 @@ packages: '@types/babel__core': 7.1.16 '@types/babel__traverse': 7.14.2 + /babel-plugin-jest-hoist/29.5.0: + resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.20.7 + '@babel/types': 7.21.3 + '@types/babel__core': 7.1.16 + '@types/babel__traverse': 7.14.2 + /babel-plugin-macros/2.8.0: resolution: {integrity: sha512-SEP5kJpfGYqYKpBrj5XU3ahw5p5GOHJ0U5ssOSQ/WBVdwkD2Dzlce95exQTs3jOVWPPKLBN2rlEWkCK7dSmLvg==} dependencies: @@ -19987,6 +21243,19 @@ packages: - supports-color dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: + resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/compat-data': 7.21.0 + '@babel/core': 7.17.8 + '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 + semver: 6.3.0 + transitivePeerDependencies: + - supports-color + dev: true + /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.21.3: resolution: {integrity: sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==} peerDependencies: @@ -20502,6 +21771,16 @@ packages: babel-plugin-jest-hoist: 27.5.1 babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 + /babel-preset-jest/29.5.0_@babel+core@7.21.3: + resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.21.3 + babel-plugin-jest-hoist: 29.5.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 + /babel-runtime/6.26.0: resolution: {integrity: sha1-llxwWGaOgrVde/4E/yM3vItWR/4=} dependencies: @@ -20651,7 +21930,7 @@ packages: npm-normalize-package-bin: 2.0.0 read-cmd-shim: 3.0.1 rimraf: 3.0.2 - write-file-atomic: 4.0.1 + write-file-atomic: 4.0.2 dev: true /binary-extensions/1.13.1: @@ -22219,6 +23498,9 @@ packages: dependencies: safe-buffer: 5.1.2 + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + /cookie-signature/1.0.6: resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} @@ -23422,6 +24704,10 @@ packages: resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /diff-sequences/29.4.3: + resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /diff/3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} @@ -23715,6 +25001,10 @@ packages: minimalistic-crypto-utils: 1.0.1 dev: true + /emittery/0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + /emittery/0.7.2: resolution: {integrity: sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==} engines: {node: '>=10'} @@ -25370,6 +26660,16 @@ packages: jest-matcher-utils: 27.5.1 jest-message-util: 27.5.1 + /expect/29.5.0: + resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + /expose-loader/3.1.0_webpack@5.70.0: resolution: {integrity: sha512-2RExSo0yJiqP+xiUue13jQa2IHE8kLDzTI7b6kn+vUlBVvlzNSiLDzo4e5Pp5J039usvTUnxZ8sUOhv0Kg15NA==} engines: {node: '>= 12.13.0'} @@ -29098,6 +30398,13 @@ packages: execa: 5.1.1 throat: 6.0.1 + /jest-changed-files/29.5.0: + resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + p-limit: 3.1.0 + /jest-circus/26.6.3: resolution: {integrity: sha512-ACrpWZGcQMpbv13XbzRzpytEJlilP/Su0JtNCi5r/xLpOUhnaIJr8leYYpLEMgPFURZISEHrnnpmB54Q/UziPw==} engines: {node: '>= 10.14.2'} @@ -29157,6 +30464,33 @@ packages: transitivePeerDependencies: - supports-color + /jest-circus/29.5.0: + resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/expect': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + is-generator-fn: 2.1.0 + jest-each: 29.5.0 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-runtime: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + p-limit: 3.1.0 + pretty-format: 29.5.0 + pure-rand: 6.0.1 + slash: 3.0.0 + stack-utils: 2.0.5 + transitivePeerDependencies: + - supports-color + /jest-cli/24.9.0: resolution: {integrity: sha512-+VLRKyitT3BWoMeSUIHRxV/2g8y9gw91Jh5z2UmXZzkZKpbC08CSehVxgHUwTpy+HwGcns/tqafQDJW7imYvGg==} engines: {node: '>= 6'} @@ -29262,6 +30596,62 @@ packages: - ts-node - utf-8-validate + /jest-cli/29.5.0: + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.9 + import-local: 3.0.3 + jest-config: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + prompts: 2.4.2 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: false + + /jest-cli/29.5.0_@types+node@16.18.21: + resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.9 + import-local: 3.0.3 + jest-config: 29.5.0_@types+node@16.18.21 + jest-util: 29.5.0 + jest-validate: 29.5.0 + prompts: 2.4.2 + yargs: 17.5.1 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jest-config/24.9.0: resolution: {integrity: sha512-RATtQJtVYQrp7fvWg6f5y3pEFj9I+H8sWw4aKxnDZ96mob5i5SD6ZEGWgMLXQ4LE8UurrjbdlLWdUeo+28QpfQ==} engines: {node: '>= 6'} @@ -29392,6 +30782,82 @@ packages: - supports-color - utf-8-validate + /jest-config/29.5.0: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + babel-jest: 29.5.0_@babel+core@7.21.3 + chalk: 4.1.2 + ci-info: 3.2.0 + deepmerge: 4.3.0 + glob: 7.2.3 + graceful-fs: 4.2.9 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: false + + /jest-config/29.5.0_@types+node@16.18.21: + resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.21.3 + '@jest/test-sequencer': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + babel-jest: 29.5.0_@babel+core@7.21.3 + chalk: 4.1.2 + ci-info: 3.2.0 + deepmerge: 4.3.0 + glob: 7.2.3 + graceful-fs: 4.2.9 + jest-circus: 29.5.0 + jest-environment-node: 29.5.0 + jest-get-type: 29.4.3 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-runner: 29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.5.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + /jest-dev-server/4.4.0: resolution: {integrity: sha512-STEHJ3iPSC8HbrQ3TME0ozGX2KT28lbT4XopPxUm2WimsX3fcB3YOptRh12YphQisMhfqNSNTZUmWyT3HEXS2A==} dependencies: @@ -29458,6 +30924,15 @@ packages: jest-get-type: 27.5.1 pretty-format: 27.5.1 + /jest-diff/29.5.0: + resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.4.3 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + /jest-docblock/24.9.0: resolution: {integrity: sha512-F1DjdpDMJMA1cN6He0FNYNZlo3yYmOtRUnktrT9Q37njYzC5WEaDdmbynIgy0L/IvXvvgsG8OsqhLPXTpfmZAA==} engines: {node: '>= 6'} @@ -29485,6 +30960,12 @@ packages: dependencies: detect-newline: 3.1.0 + /jest-docblock/29.4.3: + resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + /jest-each/24.9.0: resolution: {integrity: sha512-ONi0R4BvW45cw8s2Lrx8YgbeXL1oCQ/wIDwmsM3CqM/nlblNCPmnC3IPQlMbRFZu3wKdQ2U8BqM6lh3LJ5Bsog==} engines: {node: '>= 6'} @@ -29530,6 +31011,16 @@ packages: jest-util: 27.5.1 pretty-format: 27.5.1 + /jest-each/29.5.0: + resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + chalk: 4.1.2 + jest-get-type: 29.4.3 + jest-util: 29.5.0 + pretty-format: 29.5.0 + /jest-environment-jsdom/24.9.0: resolution: {integrity: sha512-Zv9FV9NBRzLuALXjvRijO2351DRQeLYXtpD4xNvfoVFw21IOKNhZAEUKcbiEtjTkm2GsJ3boMVgkaR7rN8qetA==} engines: {node: '>= 6'} @@ -29645,6 +31136,17 @@ packages: jest-mock: 27.5.1 jest-util: 27.5.1 + /jest-environment-node/29.5.0: + resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + jest-mock: 29.5.0 + jest-util: 29.5.0 + /jest-environment-puppeteer/4.4.0: resolution: {integrity: sha512-iV8S8+6qkdTM6OBR/M9gKywEk8GDSOe05hspCs5D8qKSwtmlUfdtHfB4cakdc68lC6YfK3AUsLirpfgodCHjzQ==} dependencies: @@ -29687,6 +31189,10 @@ packages: resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /jest-get-type/29.4.3: + resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-haste-map/24.9.0: resolution: {integrity: sha512-kfVFmsuWui2Sj1Rp1AJ4D9HqJwE4uwTlS/vO+eRUaMmd54BFpli2XhMQnPC2k4cHFVbB2Q2C+jtI1AGLgEnCjQ==} engines: {node: '>= 6'} @@ -29771,6 +31277,24 @@ packages: optionalDependencies: fsevents: 2.3.2 + /jest-haste-map/29.5.0: + resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/graceful-fs': 4.1.5 + '@types/node': 16.18.21 + anymatch: 3.1.2 + fb-watchman: 2.0.1 + graceful-fs: 4.2.9 + jest-regex-util: 29.4.3 + jest-util: 29.5.0 + jest-worker: 29.5.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.2 + /jest-jasmine2/24.9.0: resolution: {integrity: sha512-Cq7vkAgaYKp+PsX+2/JbTarrk0DmNhsEtqBXNwUHkdlbrTBLtMJINADf2mf5FkowNsq8evbPc07/qFO0AdKTzw==} engines: {node: '>= 6'} @@ -29908,6 +31432,13 @@ packages: jest-get-type: 27.5.1 pretty-format: 27.5.1 + /jest-leak-detector/29.5.0: + resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + /jest-matcher-utils/24.9.0: resolution: {integrity: sha512-OZz2IXsu6eaiMAwe67c1T+5tUAtQyQx27/EMEkbFAGiw52tB9em+uGbzpcgYVpA8wl0hlxKPZxrly4CXU/GjHA==} engines: {node: '>= 6'} @@ -29946,6 +31477,15 @@ packages: jest-get-type: 27.5.1 pretty-format: 27.5.1 + /jest-matcher-utils/29.5.0: + resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + pretty-format: 29.5.0 + /jest-message-util/24.9.0: resolution: {integrity: sha512-oCj8FiZ3U0hTP4aSui87P4L4jC37BtQwUMqk+zk/b11FR19BJDeZsZAvIHutWnmtw7r85UmR3CEWZ0HWU2mAlw==} engines: {node: '>= 6'} @@ -30005,6 +31545,20 @@ packages: slash: 3.0.0 stack-utils: 2.0.5 + /jest-message-util/29.5.0: + resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.18.6 + '@jest/types': 29.5.0 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.9 + micromatch: 4.0.5 + pretty-format: 29.5.0 + slash: 3.0.0 + stack-utils: 2.0.5 + /jest-mock-extended/1.0.18_cnngzrja2umb46xxazlucyx2qu: resolution: {integrity: sha512-qf1n7lIa2dTxxPIBr+FlXrbj3hnV1sG9DPZsrr2H/8W+Jw0wt6OmeOQsPcjRuW8EXIECC9pDXsSIfEdn+HP7JQ==} peerDependencies: @@ -30045,6 +31599,14 @@ packages: '@jest/types': 27.5.1 '@types/node': 16.18.21 + /jest-mock/29.5.0: + resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + jest-util: 29.5.0 + /jest-pnp-resolver/1.2.2_jest-resolve@24.9.0: resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} engines: {node: '>=6'} @@ -30092,6 +31654,17 @@ packages: dependencies: jest-resolve: 27.5.1 + /jest-pnp-resolver/1.2.2_jest-resolve@29.5.0: + resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.5.0 + /jest-puppeteer/4.4.0_puppeteer-core@3.0.0: resolution: {integrity: sha512-ZaiCTlPZ07B9HW0erAWNX6cyzBqbXMM7d2ugai4epBDKpKvRDpItlRQC6XjERoJELKZsPziFGS0OhhUvTvQAXA==} peerDependencies: @@ -30135,6 +31708,10 @@ packages: resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + /jest-regex-util/29.4.3: + resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + /jest-resolve-dependencies/24.9.0: resolution: {integrity: sha512-Fm7b6AlWnYhT0BXy4hXpactHIqER7erNgIsIozDXWl5dVm+k8XdGVe1oTg1JyaFnOxarMEbax3wyRJqGP2Pq+g==} engines: {node: '>= 6'} @@ -30176,6 +31753,15 @@ packages: transitivePeerDependencies: - supports-color + /jest-resolve-dependencies/29.5.0: + resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.4.3 + jest-snapshot: 29.5.0 + transitivePeerDependencies: + - supports-color + /jest-resolve/24.9.0: resolution: {integrity: sha512-TaLeLVL1l08YFZAt3zaPtjiVvyy4oSA6CRe+0AFPPVX3Q/VI0giIWWoAvoS5L96vj9Dqxj4fB5p2qrHCmTU/MQ==} engines: {node: '>= 6'} @@ -30231,15 +31817,29 @@ packages: resolve.exports: 1.1.0 slash: 3.0.0 - /jest-runner-groups/2.2.0_izd2bb4ook7j3zolwvt7oz6lf4: + /jest-resolve/29.5.0: + resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.9 + jest-haste-map: 29.5.0 + jest-pnp-resolver: 1.2.2_jest-resolve@29.5.0 + jest-util: 29.5.0 + jest-validate: 29.5.0 + resolve: 1.22.1 + resolve.exports: 2.0.2 + slash: 3.0.0 + + /jest-runner-groups/2.2.0_si6aka6xkbrcvhz7vk2qr7go64: resolution: {integrity: sha512-Sp/B9ZX0CDAKa9dIkgH0sGyl2eDuScV4SVvOxqhBMxqWpsNAkmol/C58aTFmPWZj+C0ZTW1r1BSu66MTCN+voA==} engines: {node: '>= 10.14.2'} peerDependencies: jest-docblock: '>= 24' jest-runner: '>= 24' dependencies: - jest-docblock: 27.5.1 - jest-runner: 27.5.1 + jest-docblock: 29.4.3 + jest-runner: 29.5.0 dev: false /jest-runner/24.9.0: @@ -30364,6 +31964,34 @@ packages: - supports-color - utf-8-validate + /jest-runner/29.5.0: + resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.5.0 + '@jest/environment': 29.5.0 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.9 + jest-docblock: 29.4.3 + jest-environment-node: 29.5.0 + jest-haste-map: 29.5.0 + jest-leak-detector: 29.5.0 + jest-message-util: 29.5.0 + jest-resolve: 29.5.0 + jest-runtime: 29.5.0 + jest-util: 29.5.0 + jest-watcher: 29.5.0 + jest-worker: 29.5.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + /jest-runtime/24.9.0: resolution: {integrity: sha512-8oNqgnmF3v2J6PVRM2Jfuj8oX3syKmaynlDMMKQ4iyzbQzIG6th5ub/lM2bCMTmoTKM3ykcUYI2Pw9xwNtjMnw==} engines: {node: '>= 6'} @@ -30505,6 +32133,35 @@ packages: transitivePeerDependencies: - supports-color + /jest-runtime/29.5.0: + resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.5.0 + '@jest/fake-timers': 29.5.0 + '@jest/globals': 29.5.0 + '@jest/source-map': 29.4.3 + '@jest/test-result': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + chalk: 4.1.2 + cjs-module-lexer: 1.2.2 + collect-v8-coverage: 1.0.1 + glob: 7.2.3 + graceful-fs: 4.2.9 + jest-haste-map: 29.5.0 + jest-message-util: 29.5.0 + jest-mock: 29.5.0 + jest-regex-util: 29.4.3 + jest-resolve: 29.5.0 + jest-snapshot: 29.5.0 + jest-util: 29.5.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + /jest-serializer/24.9.0: resolution: {integrity: sha512-DxYipDr8OvfrKH3Kel6NdED3OXxjvxXZ1uIY2I9OFbGg+vUkkg7AGvi65qbhbWNPvDckXmzMPbK3u3HaDO49bQ==} engines: {node: '>= 6'} @@ -30626,6 +32283,36 @@ packages: transitivePeerDependencies: - supports-color + /jest-snapshot/29.5.0: + resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.21.3 + '@babel/generator': 7.21.3 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.3 + '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.21.3 + '@babel/traverse': 7.21.3 + '@babel/types': 7.21.3 + '@jest/expect-utils': 29.5.0 + '@jest/transform': 29.5.0 + '@jest/types': 29.5.0 + '@types/babel__traverse': 7.14.2 + '@types/prettier': 2.4.2 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.3 + chalk: 4.1.2 + expect: 29.5.0 + graceful-fs: 4.2.9 + jest-diff: 29.5.0 + jest-get-type: 29.4.3 + jest-matcher-utils: 29.5.0 + jest-message-util: 29.5.0 + jest-util: 29.5.0 + natural-compare: 1.4.0 + pretty-format: 29.5.0 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + /jest-util/24.9.0: resolution: {integrity: sha512-x+cZU8VRmOJxbA1K5oDBdxQmdq0OIdADarLxk0Mq+3XS4jgvhG/oKGWcIDCtPG0HgjxOYvF+ilPJQsAyXfbNOg==} engines: {node: '>= 6'} @@ -30679,6 +32366,17 @@ packages: graceful-fs: 4.2.9 picomatch: 2.3.0 + /jest-util/29.5.0: + resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + chalk: 4.1.2 + ci-info: 3.2.0 + graceful-fs: 4.2.9 + picomatch: 2.3.1 + /jest-validate/24.9.0: resolution: {integrity: sha512-HPIt6C5ACwiqSiwi+OfSSHbK8sG7akG8eATl+IPKaeIjtPOeBUd/g3J7DghugzxrGjI93qS/+RPKe1H6PqvhRQ==} engines: {node: '>= 6'} @@ -30725,6 +32423,17 @@ packages: leven: 3.1.0 pretty-format: 27.5.1 + /jest-validate/29.5.0: + resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.5.0 + camelcase: 6.2.1 + chalk: 4.1.2 + jest-get-type: 29.4.3 + leven: 3.1.0 + pretty-format: 29.5.0 + /jest-watcher/24.9.0: resolution: {integrity: sha512-+/fLOfKPXXYJDYlks62/4R4GoT+GU1tYZed99JSCOsmzkkF7727RqKrjNAxtfO4YpGv11wybgRvCjR73lK2GZw==} engines: {node: '>= 6'} @@ -30777,6 +32486,19 @@ packages: jest-util: 27.5.1 string-length: 4.0.2 + /jest-watcher/29.5.0: + resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.5.0 + '@jest/types': 29.5.0 + '@types/node': 16.18.21 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.5.0 + string-length: 4.0.2 + /jest-worker/24.9.0: resolution: {integrity: sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==} engines: {node: '>= 6'} @@ -30809,6 +32531,15 @@ packages: merge-stream: 2.0.0 supports-color: 8.1.1 + /jest-worker/29.5.0: + resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 16.18.21 + jest-util: 29.5.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + /jest/24.9.0: resolution: {integrity: sha512-YvkBL1Zm7d2B1+h5fHEOdyjCG+sGMz4f8D86/0HiqJ6MB4MnDc8FgP5vdWsGnemOQro7lnYo8UakZ3+5A0jxGw==} engines: {node: '>= 6'} @@ -30873,6 +32604,46 @@ packages: - ts-node - utf-8-validate + /jest/29.5.0: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0 + '@jest/types': 29.5.0 + import-local: 3.0.3 + jest-cli: 29.5.0 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: false + + /jest/29.5.0_@types+node@16.18.21: + resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.5.0 + '@jest/types': 29.5.0 + import-local: 3.0.3 + jest-cli: 29.5.0_@types+node@16.18.21 + transitivePeerDependencies: + - '@types/node' + - supports-color + - ts-node + dev: true + /jmespath/0.16.0: resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} engines: {node: '>= 0.6.0'} @@ -33919,7 +35690,7 @@ packages: normalize-package-data: 3.0.3 qqjs: 0.3.11 semver: 7.3.7 - tslib: 2.3.1 + tslib: 2.5.0 yeoman-environment: 3.10.0_7yoz4vugw4qcykie6sit5r22dm yeoman-generator: 5.7.0_yeoman-environment@3.10.0 yosay: 2.0.2 @@ -35734,6 +37505,14 @@ packages: ansi-styles: 5.2.0 react-is: 17.0.2 + /pretty-format/29.5.0: + resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.4.3 + ansi-styles: 5.2.0 + react-is: 18.2.0 + /pretty-hrtime/1.0.3: resolution: {integrity: sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=} engines: {node: '>= 0.8'} @@ -36053,6 +37832,9 @@ packages: - supports-color - utf-8-validate + /pure-rand/6.0.1: + resolution: {integrity: sha512-t+x1zEHDjBwkDGY5v5ApnZ/utcd4XYDiJsaQQoptTXgUXX95sDg1elCdJghzicm7n2mbCBJ3uYWr6M22SO19rg==} + /q/1.5.1: resolution: {integrity: sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=} engines: {node: '>=0.6.0', teleport: '>=0.2.0'} @@ -36572,6 +38354,9 @@ packages: /react-is/17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + /react-is/18.2.0: + resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + /react-lifecycles-compat/3.0.4: resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==} @@ -36880,7 +38665,7 @@ packages: dependencies: object-assign: 4.1.1 react: 18.1.0 - react-is: 17.0.2 + react-is: 18.2.0 /react-sizeme/3.0.2: resolution: {integrity: sha512-xOIAOqqSSmKlKFJLO3inBQBdymzDuXx4iuwkNcJmC96jeiOg5ojByvL+g3MW9LPEsojLbC6pf68zOfobK8IPlw==} @@ -37792,6 +39577,10 @@ packages: resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==} engines: {node: '>=10'} + /resolve.exports/2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + /resolve/1.1.7: resolution: {integrity: sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==} @@ -38771,6 +40560,12 @@ packages: atob: 2.1.2 decode-uri-component: 0.2.0 + /source-map-support/0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + /source-map-support/0.5.20: resolution: {integrity: sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==} dependencies: @@ -40649,6 +42444,40 @@ packages: yargs-parser: 20.2.9 dev: true + /ts-jest/29.1.0_q744lk64cx4tbpg7zn4yr5nesi: + resolution: {integrity: sha512-ZhNr7Z4PcYa+JjMl62ir+zPiNJfXJN6E8hSLnaUKhOgqcn8vb3e537cpkd0FuAfRK3sR1LSqM1MOhliXNgOFPA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.21.3 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.5.0_@types+node@16.18.21 + jest-util: 29.5.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.8 + typescript: 4.9.5 + yargs-parser: 21.1.1 + dev: true + /ts-loader/9.4.1_t37drsge5fnqkss6ynqsf64hyi: resolution: {integrity: sha512-384TYAqGs70rn9F0VBnh6BPTfhga7yFNdC5gXbQpDrBj9/KsT4iRkGqKXhziofHOlE2j6YEaiTYVGKKvPhGWvw==} engines: {node: '>=12.0.0'} @@ -40722,6 +42551,7 @@ packages: /tslib/2.3.1: resolution: {integrity: sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==} + dev: true /tslib/2.5.0: resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} @@ -41598,6 +43428,14 @@ packages: convert-source-map: 1.8.0 source-map: 0.7.3 + /v8-to-istanbul/9.1.0: + resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.17 + '@types/istanbul-lib-coverage': 2.0.3 + convert-source-map: 1.8.0 + /v8flags/3.1.3: resolution: {integrity: sha512-amh9CCg3ZxkzQ48Mhcb8iX7xpAfYJgePHxWMQCBWECpOSqJUXgY26ncA61UTV0BkPqfhcy6mzwCIoP4ygxpW8w==} engines: {node: '>= 0.10'} @@ -42828,6 +44666,13 @@ packages: signal-exit: 3.0.7 dev: true + /write-file-atomic/4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + /write-json-file/4.3.0: resolution: {integrity: sha512-PxiShnxf0IlnQuMYOPPhPkhExoCQuTUNPOa/2JWCYTmBquU9njyyDuwRKN26IZBlp4yn1nt+Agh2HOOBl+55HQ==} engines: {node: '>=8.3'} @@ -43040,7 +44885,6 @@ packages: /yargs-parser/21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} - dev: true /yargs-unparser/1.6.0: resolution: {integrity: sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==} @@ -43119,7 +44963,6 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 21.1.1 - dev: true /yargs/4.8.1: resolution: {integrity: sha1-wMQpJMpKqmsObaFznfshZDn53cA=} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 39e5ac30da4..040f0c3699f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -11,3 +11,4 @@ packages: - 'tools/cli-core' - 'tools/version-bump' - 'tools/storybook' + - 'tools/monorepo-utils' diff --git a/tools/code-analyzer/.eslintrc.js b/tools/code-analyzer/.eslintrc.js index b1b0859966c..e4d185d8cd1 100644 --- a/tools/code-analyzer/.eslintrc.js +++ b/tools/code-analyzer/.eslintrc.js @@ -1,4 +1,4 @@ module.exports = { - extends: ['plugin:@woocommerce/eslint-plugin/recommended'], + extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ], root: true, }; diff --git a/tools/monorepo-utils/.eslintignore b/tools/monorepo-utils/.eslintignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/monorepo-utils/.eslintrc.js b/tools/monorepo-utils/.eslintrc.js new file mode 100644 index 00000000000..e4d185d8cd1 --- /dev/null +++ b/tools/monorepo-utils/.eslintrc.js @@ -0,0 +1,4 @@ +module.exports = { + extends: [ 'plugin:@woocommerce/eslint-plugin/recommended' ], + root: true, +}; diff --git a/tools/monorepo-utils/.gitignore b/tools/monorepo-utils/.gitignore new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tools/monorepo-utils/README.md b/tools/monorepo-utils/README.md new file mode 100644 index 00000000000..bb3bfa3b665 --- /dev/null +++ b/tools/monorepo-utils/README.md @@ -0,0 +1,5 @@ +# Monorepo Utils + +## Description + +Monorepo utilities and tooling. diff --git a/tools/monorepo-utils/jest.config.js b/tools/monorepo-utils/jest.config.js new file mode 100644 index 00000000000..da5d4c982ec --- /dev/null +++ b/tools/monorepo-utils/jest.config.js @@ -0,0 +1,6 @@ +/** @type {import('ts-jest').JestConfigWithTsJest} */ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testPathIgnorePatterns: [ '/dist/', '/node_modules/' ], +}; diff --git a/tools/monorepo-utils/package.json b/tools/monorepo-utils/package.json new file mode 100644 index 00000000000..64116d6a361 --- /dev/null +++ b/tools/monorepo-utils/package.json @@ -0,0 +1,35 @@ +{ + "name": "@woocommerce/monorepo-utils", + "version": "0.0.1", + "description": "WooCommerce Monorepo utility tooling.", + "author": "Automattic", + "homepage": "https://github.com/woocommerce/woocommerce", + "license": "GPLv2", + "repository": "woocommerce/woocommerce", + "dependencies": { + "chalk": "^4.1.2", + "commander": "^9.4.0", + "@commander-js/extra-typings": "^0.1.0", + "dotenv": "^10.0.0" + }, + "devDependencies": { + "@types/jest": "^27.4.1", + "@types/node": "^16.18.18", + "@woocommerce/eslint-plugin": "workspace:*", + "eslint": "^8.32.0", + "jest": "^29.5.0", + "ts-jest": "^29.1.0", + "typescript": "^4.9.5" + }, + "scripts": { + "build": "tsc", + "start": "tsc --watch", + "lint": "eslint . --ext .ts", + "test": "jest" + }, + "engines": { + "node": "^16.13.1", + "pnpm": "^7.13.3" + }, + "types": "dist/index.d.ts" +} diff --git a/tools/monorepo-utils/src/code-freeze/README.md b/tools/monorepo-utils/src/code-freeze/README.md new file mode 100644 index 00000000000..89b8d9c0e03 --- /dev/null +++ b/tools/monorepo-utils/src/code-freeze/README.md @@ -0,0 +1,3 @@ +# Code Freeze CLI Utility + +CLI for performing Monorepo utilities relating to Code Freeze diff --git a/tools/monorepo-utils/src/code-freeze/commands/index.ts b/tools/monorepo-utils/src/code-freeze/commands/index.ts new file mode 100644 index 00000000000..ae036598b46 --- /dev/null +++ b/tools/monorepo-utils/src/code-freeze/commands/index.ts @@ -0,0 +1,15 @@ +/** + * External dependencies + */ +import { Command } from '@commander-js/extra-typings'; + +/** + * Internal dependencies + */ +import { verifyDayCommand } from './verify-day'; + +const program = new Command( 'code-freeze' ) + .description( 'Code freeze utilities' ) + .addCommand( verifyDayCommand ); + +export default program; diff --git a/tools/monorepo-utils/src/code-freeze/commands/verify-day.ts b/tools/monorepo-utils/src/code-freeze/commands/verify-day.ts new file mode 100644 index 00000000000..c307ab06814 --- /dev/null +++ b/tools/monorepo-utils/src/code-freeze/commands/verify-day.ts @@ -0,0 +1,21 @@ +/** + * External dependencies + */ +import { Command } from '@commander-js/extra-typings'; + +/** + * Internal dependencies + */ +import { verifyDay } from '../utils/index'; + +export const verifyDayCommand = new Command( 'verify-day' ) + .description( 'Verify if today is the code freeze day' ) + .option( + '-o, --override ', + "Time Override: The time to use in checking whether the action should run (default: 'now')." + ) + .action( () => { + console.log( verifyDay() ); + + process.exit( 0 ); + } ); diff --git a/tools/monorepo-utils/src/code-freeze/utils/__tests__/index.ts b/tools/monorepo-utils/src/code-freeze/utils/__tests__/index.ts new file mode 100644 index 00000000000..f4ac07061de --- /dev/null +++ b/tools/monorepo-utils/src/code-freeze/utils/__tests__/index.ts @@ -0,0 +1,10 @@ +/** + * Internal dependencies + */ +import { verifyDay } from '../index'; + +describe( 'verifyDay', () => { + it( 'should return a string', () => { + expect( verifyDay() ).toBe( 'Today is a good day to code freeze!' ); + } ); +} ); diff --git a/tools/monorepo-utils/src/code-freeze/utils/index.ts b/tools/monorepo-utils/src/code-freeze/utils/index.ts new file mode 100644 index 00000000000..b06bc3469a2 --- /dev/null +++ b/tools/monorepo-utils/src/code-freeze/utils/index.ts @@ -0,0 +1,3 @@ +export const verifyDay = () => { + return 'Today is a good day to code freeze!'; +}; diff --git a/tools/monorepo-utils/src/index.ts b/tools/monorepo-utils/src/index.ts new file mode 100755 index 00000000000..2fb352fc639 --- /dev/null +++ b/tools/monorepo-utils/src/index.ts @@ -0,0 +1,17 @@ +#! /usr/bin/env node +/** + * External dependencies + */ +import { Command } from '@commander-js/extra-typings'; + +/** + * Internal dependencies + */ +import CodeFreeze from './code-freeze/commands'; + +const program = new Command() + .name( 'utils' ) + .description( 'Monorepo utilities' ) + .addCommand( CodeFreeze ); + +program.parse( process.argv ); diff --git a/tools/monorepo-utils/tsconfig.json b/tools/monorepo-utils/tsconfig.json new file mode 100644 index 00000000000..71ea5a3fd96 --- /dev/null +++ b/tools/monorepo-utils/tsconfig.json @@ -0,0 +1,15 @@ +{ + "compilerOptions": { + "rootDir": "src", + "outDir": "dist", + "target": "es6", + "module": "commonjs", + "esModuleInterop": true, + "moduleResolution": "node", + "typeRoots": [ + "./typings", + "./node_modules/@types", + "./node_modules/@commander-js" + ] + } +} From 7fe96ac988e44f2b9ec5481199f909d0cf6f696b Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Tue, 11 Apr 2023 14:36:32 -0700 Subject: [PATCH 1372/1680] Don't hardcode table prefixes --- .../tests/php/src/Utilities/OrderUtilTest.php | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php b/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php index a1726b28992..02a004be351 100644 --- a/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php +++ b/plugins/woocommerce/tests/php/src/Utilities/OrderUtilTest.php @@ -38,39 +38,47 @@ class OrderUtilTest extends \WC_Unit_Test_Case { * @testdox `get_table_for_orders` should return the name of the posts table when HPOS is not in use. */ public function test_get_table_for_orders_posts() { + global $wpdb; + OrderHelper::toggle_cot( false ); $table_name = OrderUtil::get_table_for_orders(); - $this->assertEquals( 'wptests_posts', $table_name ); + $this->assertEquals( $wpdb->posts, $table_name ); } /** * @testdox `get_table_for_orders` should return the name of the orders table when HPOS is in use. */ public function test_get_table_for_orders_hpos() { + global $wpdb; + OrderHelper::toggle_cot( true ); $table_name = OrderUtil::get_table_for_orders(); - $this->assertEquals( 'wptests_wc_orders', $table_name ); + $this->assertEquals( "{$wpdb->prefix}wc_orders", $table_name ); } /** * @testdox `get_table_for_order_meta` should return the name of the postmeta table when HPOS is not in use. */ public function test_get_table_for_order_meta_posts() { + global $wpdb; + OrderHelper::toggle_cot( false ); $table_name = OrderUtil::get_table_for_order_meta(); - $this->assertEquals( 'wptests_postmeta', $table_name ); + $this->assertEquals( $wpdb->postmeta, $table_name ); } /** * @testdox `get_table_for_order_meta` should return the name of the orders meta table when HPOS is in use. */ public function test_get_table_for_order_meta_hpos() { + global $wpdb; + OrderHelper::toggle_cot( true ); $table_name = OrderUtil::get_table_for_order_meta(); - $this->assertEquals( 'wptests_wc_orders_meta', $table_name ); + $this->assertEquals( "{$wpdb->prefix}wc_orders_meta", $table_name ); } } From d4d375e8742f3a95aa565b3d8c50f7bed16271c0 Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Tue, 11 Apr 2023 15:51:38 -0700 Subject: [PATCH 1373/1680] WC_Data: Add method `delete_matched_meta_data` Brings the CRUD layer's meta data handling closer to parity with WP by allowing for selectively deleting meta entries with a specific key only if they contain a specific value. Fixes #37650 --- .../includes/abstracts/abstract-wc-data.php | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-data.php b/plugins/woocommerce/includes/abstracts/abstract-wc-data.php index 863db390320..2f19cb6d1f0 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-data.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-data.php @@ -506,6 +506,26 @@ abstract class WC_Data { } } + /** + * Delete meta data. + * + * @since 7.7.0 + * @param string $key Meta key. + * @param mixed $value Meta value. Entries will only be removed that match the value. + */ + public function delete_matched_meta_data( $key, $value ) { + $this->maybe_read_meta_data(); + $array_keys = array_keys( wp_list_pluck( $this->meta_data, 'key' ), $key, true ); + + if ( $array_keys ) { + foreach ( $array_keys as $array_key ) { + if ( $value === $this->meta_data[ $array_key ]->value ) { + $this->meta_data[ $array_key ]->value = null; + } + } + } + } + /** * Delete meta data. * From d8ec0490cb534505d1c4003af76648756cc72e94 Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Tue, 11 Apr 2023 15:55:27 -0700 Subject: [PATCH 1374/1680] Add unit test --- .../tests/legacy/unit-tests/crud/data.php | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/plugins/woocommerce/tests/legacy/unit-tests/crud/data.php b/plugins/woocommerce/tests/legacy/unit-tests/crud/data.php index e4a4c4ce33b..dd1c2c6bcc2 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/crud/data.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/crud/data.php @@ -325,6 +325,30 @@ class WC_Tests_CRUD_Data extends WC_Unit_Test_Case { $this->assertEmpty( $object->get_meta( 'test_meta_key' ) ); } + /** + * Test deleting meta selectively. + */ + public function test_delete_matched_meta_data() { + $object = $this->create_test_post(); + $object_id = $object->get_id(); + add_metadata( 'post', $object_id, 'test_meta_key', 'val1' ); + add_metadata( 'post', $object_id, 'test_meta_key', 'val2' ); + add_metadata( 'post', $object_id, 'test_meta_key', array( 'foo', 'bar' ) ); + $object = new WC_Mock_WC_Data( $object_id ); + + $this->assertCount( 3, $object->get_meta( 'test_meta_key', false ) ); + + $object->delete_matched_meta_data( 'test_meta_key', 'val1' ); + $this->assertCount( 2, $object->get_meta( 'test_meta_key', false ) ); + + $object->delete_matched_meta_data( 'test_meta_key', array( 'bar', 'baz' ) ); + $this->assertCount( 2, $object->get_meta( 'test_meta_key', false ) ); + + $object->delete_matched_meta_data( 'test_meta_key', array( 'foo', 'bar' ) ); + $this->assertCount( 1, $object->get_meta( 'test_meta_key', false ) ); + + $this->assertEquals( 'val2', $object->get_meta( 'test_meta_key' ) ); + } /** * Test saving metadata (Actually making sure changes are written to DB). From b389a4e8aef1e3e0ee7863470b70be1746abc5b1 Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Tue, 11 Apr 2023 15:58:27 -0700 Subject: [PATCH 1375/1680] Add changelog file --- plugins/woocommerce/changelog/fix-37650-delete-meta-data | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-37650-delete-meta-data diff --git a/plugins/woocommerce/changelog/fix-37650-delete-meta-data b/plugins/woocommerce/changelog/fix-37650-delete-meta-data new file mode 100644 index 00000000000..a9c72a79091 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-37650-delete-meta-data @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add method delete_matched_meta_data to WC_Data objects From 3c64b953a0b3d3b32deaa663074092b28026ecc9 Mon Sep 17 00:00:00 2001 From: Corey McKrill <916023+coreymckrill@users.noreply.github.com> Date: Tue, 11 Apr 2023 16:02:01 -0700 Subject: [PATCH 1376/1680] Update doc block --- plugins/woocommerce/includes/abstracts/abstract-wc-data.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-data.php b/plugins/woocommerce/includes/abstracts/abstract-wc-data.php index 2f19cb6d1f0..06ac6cc11ae 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-data.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-data.php @@ -507,7 +507,7 @@ abstract class WC_Data { } /** - * Delete meta data. + * Delete meta data with a matching value. * * @since 7.7.0 * @param string $key Meta key. From a7401265644d72ed30c4abef14bb1449eb252761 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 12 Apr 2023 08:59:53 +0200 Subject: [PATCH 1377/1680] Delete changelog files based on PR 37641 (#37653) Delete changelog files for 37641 Co-authored-by: WooCommerce Bot --- plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues diff --git a/plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues b/plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues deleted file mode 100644 index 5e9a1834400..00000000000 --- a/plugins/woocommerce/changelog/fix-gutengerg15-5-update-issues +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix incorrect usage of dispatch, useSelect, and setState calls in homescreen along with settings and onboarding package From dd138a394f3a84ae4204fbb6f1dd48b8f4709ee3 Mon Sep 17 00:00:00 2001 From: rodelgc Date: Wed, 12 Apr 2023 15:35:27 +0800 Subject: [PATCH 1378/1680] Remove unnecessary concatenation --- plugins/woocommerce/tests/e2e-pw/utils/wordpress.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js b/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js index 7904302dbed..018382e7e19 100644 --- a/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js +++ b/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js @@ -25,12 +25,6 @@ const getPreviousTwoVersions = async () => { continue; } - const hasNoPatchNumber = thisVersion.split( '.' ).length === 2; - - if ( hasNoPatchNumber ) { - thisVersion = thisVersion.concat( '.0' ); - } - prevTwo.push( thisVersion ); if ( prevTwo.length === 2 ) { From 60a02f2edf76844d42393e131f187bd2f02111df Mon Sep 17 00:00:00 2001 From: rodelgc Date: Wed, 12 Apr 2023 15:50:48 +0800 Subject: [PATCH 1379/1680] Fix WP L-2 version retrieval --- .../tests/e2e-pw/utils/wordpress.js | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js b/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js index 018382e7e19..ef193635474 100644 --- a/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js +++ b/plugins/woocommerce/tests/e2e-pw/utils/wordpress.js @@ -14,33 +14,35 @@ const getPreviousTwoVersions = async () => { .filter( ( version ) => body[ version ] === 'outdated' ) .sort() .reverse(); - const latestMinorVersion = allVersions + const latestMajorAndMinorNumbers = allVersions .find( ( version ) => body[ version ] === 'latest' ) .match( /^\d+.\d+/ )[ 0 ]; - const prevTwo = []; + const latestMinus1 = previousStableVersions.find( + ( version ) => ! version.startsWith( latestMajorAndMinorNumbers ) + ); - for ( let thisVersion of previousStableVersions ) { - if ( thisVersion.startsWith( latestMinorVersion ) ) { - continue; - } + const latestMinus1MajorAndMinorNumbers = latestMinus1.match( + /^\d+.\d+/ + )[ 0 ]; - prevTwo.push( thisVersion ); - - if ( prevTwo.length === 2 ) { - break; - } - } + const latestMinus2 = previousStableVersions.find( + ( version ) => + ! ( + version.startsWith( latestMajorAndMinorNumbers ) || + version.startsWith( latestMinus1MajorAndMinorNumbers ) + ) + ); const matrix = { version: [ { - number: prevTwo[ 0 ], + number: latestMinus1, description: 'WP Latest-1', env_description: 'wp-latest-1', }, { - number: prevTwo[ 1 ], + number: latestMinus2, description: 'WP Latest-2', env_description: 'wp-latest-2', }, From 61da4c6161dfc5ba6a1dfbb78ce22934aab27ec3 Mon Sep 17 00:00:00 2001 From: Chris Greys Date: Wed, 12 Apr 2023 16:52:18 +0900 Subject: [PATCH 1380/1680] Dev - Allow to filter wc_help_tip output (#37485) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Néstor Soriano --- plugins/woocommerce/changelog/fix-36543 | 4 ++++ .../woocommerce/includes/wc-core-functions.php | 18 +++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) create mode 100644 plugins/woocommerce/changelog/fix-36543 diff --git a/plugins/woocommerce/changelog/fix-36543 b/plugins/woocommerce/changelog/fix-36543 new file mode 100644 index 00000000000..483efbe86c4 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-36543 @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Dev - Allow to filter wc_help_tip diff --git a/plugins/woocommerce/includes/wc-core-functions.php b/plugins/woocommerce/includes/wc-core-functions.php index 68d88a6ec12..9c1d0a57248 100644 --- a/plugins/woocommerce/includes/wc-core-functions.php +++ b/plugins/woocommerce/includes/wc-core-functions.php @@ -1593,12 +1593,24 @@ function wc_back_link( $label, $url ) { */ function wc_help_tip( $tip, $allow_html = false ) { if ( $allow_html ) { - $tip = wc_sanitize_tooltip( $tip ); + $sanitized_tip = wc_sanitize_tooltip( $tip ); } else { - $tip = esc_attr( $tip ); + $sanitized_tip = esc_attr( $tip ); } - return ''; + /** + * Filter the help tip. + * + * @since 7.7.0 + * + * @param string $tip_html Help tip HTML. + * @param string $sanitized_tip Sanitized help tip text. + * @param string $tip Original help tip text. + * @param bool $allow_html Allow sanitized HTML if true or escape. + * + * @return string + */ + return apply_filters( 'wc_help_tip', '', $sanitized_tip, $tip, $allow_html ); } /** From e8c8581a4ec4b2bde461835e702e14ebbffb6965 Mon Sep 17 00:00:00 2001 From: Chris Lilitsas Date: Wed, 12 Apr 2023 10:54:58 +0300 Subject: [PATCH 1381/1680] Fix TT2 styles and typography in the single product's attributes table (#37639) --- .../changelog/fix-37636-attributes-table | 4 ++++ .../client/legacy/css/twenty-twenty-two.scss | 22 ++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 plugins/woocommerce/changelog/fix-37636-attributes-table diff --git a/plugins/woocommerce/changelog/fix-37636-attributes-table b/plugins/woocommerce/changelog/fix-37636-attributes-table new file mode 100644 index 00000000000..547c8a21564 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-37636-attributes-table @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Fixed the attributes table styling in TT2 tabs content area diff --git a/plugins/woocommerce/client/legacy/css/twenty-twenty-two.scss b/plugins/woocommerce/client/legacy/css/twenty-twenty-two.scss index be8519c50e1..dfd10c6d8f7 100644 --- a/plugins/woocommerce/client/legacy/css/twenty-twenty-two.scss +++ b/plugins/woocommerce/client/legacy/css/twenty-twenty-two.scss @@ -594,9 +594,29 @@ ul.wc-tabs { font-size: var(--wp--preset--font-size--small); margin-left: 1em; - h2 { + // Hide repeated heading. + h2:first-of-type { display: none; } + + // Attributes table styles. + table.woocommerce-product-attributes { + tbody { + + td, th { + padding: 0.2rem 0.2rem 0.2rem 0; + + p { + margin: 0; + } + } + + th { + text-align: left; + padding-right: 1rem; + } + } + } } /** From b4540f61d5e4cccb75090230b712abf28a1dfd1b Mon Sep 17 00:00:00 2001 From: rodelgc Date: Wed, 12 Apr 2023 15:56:20 +0800 Subject: [PATCH 1382/1680] Add changelog --- plugins/woocommerce/changelog/e2e-fix-wp-l-2-retrieval | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/e2e-fix-wp-l-2-retrieval diff --git a/plugins/woocommerce/changelog/e2e-fix-wp-l-2-retrieval b/plugins/woocommerce/changelog/e2e-fix-wp-l-2-retrieval new file mode 100644 index 00000000000..0eb4eaba23a --- /dev/null +++ b/plugins/woocommerce/changelog/e2e-fix-wp-l-2-retrieval @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Fix WP latest-2 version retrieval in the "Smoke test release" workflow. From 77bdd24aa8a3c8314bd65e7cab123d456bc91607 Mon Sep 17 00:00:00 2001 From: Chi-Hsuan Huang Date: Wed, 12 Apr 2023 16:46:21 +0800 Subject: [PATCH 1383/1680] Revert "Check min. WP and PHP versions before suggesting plugins" (#37674) Revert "Check min. WP and PHP versions before suggesting plugins (#37611)" This reverts commit 30536f636ed8b5b2acb57d40ab37c3af8d900084. --- ...ate-16525-check-php-version-for-extensions | 4 --- .../DefaultFreeExtensions.php | 26 ++++++++----------- .../EvaluateExtension.php | 9 ------- 3 files changed, 11 insertions(+), 28 deletions(-) delete mode 100644 plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions diff --git a/plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions b/plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions deleted file mode 100644 index 9cb44346db3..00000000000 --- a/plugins/woocommerce/changelog/update-16525-check-php-version-for-extensions +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Support min_php_version and min_wp_version for the free extensions feed diff --git a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php index e893afd283e..99055062238 100644 --- a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php +++ b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/DefaultFreeExtensions.php @@ -79,18 +79,17 @@ class DefaultFreeExtensions { public static function get_plugin( $slug ) { $plugins = array( 'google-listings-and-ads' => [ - 'min_php_version' => '7.4', - 'name' => __( 'Google Listings & Ads', 'woocommerce' ), - 'description' => sprintf( + 'name' => __( 'Google Listings & Ads', 'woocommerce' ), + 'description' => sprintf( /* translators: 1: opening product link tag. 2: closing link tag */ __( 'Drive sales with %1$sGoogle Listings and Ads%2$s', 'woocommerce' ), '', '' ), - 'image_url' => plugins_url( '/assets/images/onboarding/google.svg', WC_PLUGIN_FILE ), - 'manage_url' => 'admin.php?page=wc-admin&path=%2Fgoogle%2Fstart', - 'is_built_by_wc' => true, - 'is_visible' => [ + 'image_url' => plugins_url( '/assets/images/onboarding/google.svg', WC_PLUGIN_FILE ), + 'manage_url' => 'admin.php?page=wc-admin&path=%2Fgoogle%2Fstart', + 'is_built_by_wc' => true, + 'is_visible' => [ [ 'type' => 'not', 'operand' => [ @@ -126,12 +125,11 @@ class DefaultFreeExtensions { 'is_built_by_wc' => false, ], 'pinterest-for-woocommerce' => [ - 'name' => __( 'Pinterest for WooCommerce', 'woocommerce' ), - 'description' => __( 'Get your products in front of Pinners searching for ideas and things to buy.', 'woocommerce' ), - 'image_url' => plugins_url( '/assets/images/onboarding/pinterest.png', WC_PLUGIN_FILE ), - 'manage_url' => 'admin.php?page=wc-admin&path=%2Fpinterest%2Flanding', - 'is_built_by_wc' => true, - 'min_php_version' => '7.3', + 'name' => __( 'Pinterest for WooCommerce', 'woocommerce' ), + 'description' => __( 'Get your products in front of Pinners searching for ideas and things to buy.', 'woocommerce' ), + 'image_url' => plugins_url( '/assets/images/onboarding/pinterest.png', WC_PLUGIN_FILE ), + 'manage_url' => 'admin.php?page=wc-admin&path=%2Fpinterest%2Flanding', + 'is_built_by_wc' => true, ], 'pinterest-for-woocommerce:alt' => [ 'name' => __( 'Pinterest for WooCommerce', 'woocommerce' ), @@ -351,7 +349,6 @@ class DefaultFreeExtensions { DefaultPaymentGateways::get_rules_for_cbd( false ), ], 'is_built_by_wc' => true, - 'min_wp_version' => '5.9', ], 'woocommerce-services:shipping' => [ 'description' => sprintf( @@ -519,7 +516,6 @@ class DefaultFreeExtensions { ], ], 'is_built_by_wc' => false, - 'min_wp_version' => '6.0', ], 'mailpoet' => [ 'name' => __( 'MailPoet', 'woocommerce' ), diff --git a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php index 8256be19ce3..100dd94a125 100644 --- a/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php +++ b/plugins/woocommerce/src/Internal/Admin/RemoteFreeExtensions/EvaluateExtension.php @@ -21,7 +21,6 @@ class EvaluateExtension { * @return object The evaluated extension. */ public static function evaluate( $extension ) { - global $wp_version; $rule_evaluator = new RuleEvaluator(); if ( isset( $extension->is_visible ) ) { @@ -31,14 +30,6 @@ class EvaluateExtension { $extension->is_visible = true; } - if ( isset( $extension->min_php_version ) ) { - $extension->is_visible = version_compare( PHP_VERSION, $extension->min_php_version, '>=' ); - } - - if ( isset( $extension->min_wp_version ) ) { - $extension->is_visible = version_compare( $wp_version, $extension->min_wp_version, '>=' ); - } - $installed_plugins = PluginsHelper::get_installed_plugin_slugs(); $activated_plugins = PluginsHelper::get_active_plugin_slugs(); $extension->is_installed = in_array( explode( ':', $extension->key )[0], $installed_plugins, true ); From 55e07451ce99a0a3438a233dfc67695d25ea9bfc Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 12 Apr 2023 15:33:23 +0530 Subject: [PATCH 1384/1680] Add unit test for asserting that first meta is migrated. --- .../PostsToOrdersMigrationControllerTest.php | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php b/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php index 1670e5444c3..22b2fbbccaa 100644 --- a/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php +++ b/plugins/woocommerce/tests/php/src/Database/Migrations/CustomOrderTable/PostsToOrdersMigrationControllerTest.php @@ -746,4 +746,33 @@ WHERE order_id = {$order_id} AND meta_key = 'non_unique_key_1' AND meta_value in $this->assertEmpty( $errors ); } + + /** + * @testDox When there are mutli meta values for a supposed unique meta key, the first one is picked. + */ + public function test_first_value_is_picked_when_multi_value() { + global $wpdb; + $order = wc_get_order( OrderHelper::create_complex_wp_post_order() ); + $original_order_key = $order->get_order_key(); + + $this->assertNotEmpty( $original_order_key ); + + // Add a second order key. + add_post_meta( $order->get_id(), '_order_key', 'second_order_key_should_be_ignored' ); + + $this->sut->migrate_order( $order->get_id() ); + + $migrated_order_key = $wpdb->get_var( + $wpdb->prepare( + "SELECT order_key FROM {$wpdb->prefix}wc_order_operational_data WHERE order_id = %d", + $order->get_id() + ) + ); + + $this->assertEquals( $original_order_key, $migrated_order_key ); + + $errors = $this->sut->verify_migrated_orders( array( $order->get_id() ) ); + + $this->assertEmpty( $errors ); + } } From d5211bbaa65fda427503cefc11c90e94dd872177 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 12 Apr 2023 15:38:58 +0530 Subject: [PATCH 1385/1680] Use first meta value instead of last to be consistent with WP_Post. --- .../src/Database/Migrations/MetaToCustomTableMigrator.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php index 71b0d3022a4..c72ab967a3a 100644 --- a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php @@ -543,7 +543,11 @@ WHERE private function processs_and_sanitize_meta_data( array &$sanitized_entity_data, array &$error_records, array $meta_data ): void { foreach ( $meta_data as $datum ) { $column_schema = $this->meta_column_mapping[ $datum->meta_key ]; - $value = $this->validate_data( $datum->meta_value, $column_schema['type'] ); + if ( isset( $sanitized_entity_data[ $datum->entity_id ][ $column_schema['destination'] ] ) ) { + // We pick only the first meta if there are duplicates for a flat column, to be consistent with WP core behavior in handing duplicate meta which are marked as unique. + continue; + } + $value = $this->validate_data( $datum->meta_value, $column_schema['type'] ); if ( is_wp_error( $value ) ) { $error_records[ $datum->entity_id ][ $column_schema['destination'] ] = "{$value->get_error_code()}: {$value->get_error_message()}"; } else { From 2147d2abcf2a27ac30f8770a2fb7e444c711fb93 Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 12 Apr 2023 15:39:44 +0530 Subject: [PATCH 1386/1680] Add changelog. --- plugins/woocommerce/changelog/fix-37660 | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 plugins/woocommerce/changelog/fix-37660 diff --git a/plugins/woocommerce/changelog/fix-37660 b/plugins/woocommerce/changelog/fix-37660 new file mode 100644 index 00000000000..19479c9b9bf --- /dev/null +++ b/plugins/woocommerce/changelog/fix-37660 @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Use first meta value for HPOS migration when there are duplicates for flat column. From 4a5db60c2af550576f99e1b284c6e5438bae4d6c Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 12 Apr 2023 18:08:22 +0530 Subject: [PATCH 1387/1680] Adjust verification so that it only checks the first meta value. --- .../PostMetaToOrderMetaMigrator.php | 1 + .../PostToOrderAddressTableMigrator.php | 1 + .../PostToOrderOpTableMigrator.php | 1 + .../PostToOrderTableMigrator.php | 1 + .../Migrations/MetaToCustomTableMigrator.php | 80 +++++++++++++++---- 5 files changed, 67 insertions(+), 17 deletions(-) diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostMetaToOrderMetaMigrator.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostMetaToOrderMetaMigrator.php index a10720d2b4f..85a8ea5555f 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostMetaToOrderMetaMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostMetaToOrderMetaMigrator.php @@ -52,6 +52,7 @@ class PostMetaToOrderMetaMigrator extends MetaToMetaTableMigrator { 'meta' => array( 'table_name' => $wpdb->postmeta, 'entity_id_column' => 'post_id', + 'meta_id_column' => 'meta_id', 'meta_key_column' => 'meta_key', 'meta_value_column' => 'meta_value', ), diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderAddressTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderAddressTableMigrator.php index a9aba4bf6dd..526bd0a7da0 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderAddressTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderAddressTableMigrator.php @@ -56,6 +56,7 @@ class PostToOrderAddressTableMigrator extends MetaToCustomTableMigrator { ), 'meta' => array( 'table_name' => $wpdb->postmeta, + 'meta_id_column' => 'meta_id', 'meta_key_column' => 'meta_key', 'meta_value_column' => 'meta_value', 'entity_id_column' => 'post_id', diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderOpTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderOpTableMigrator.php index 05f22f6d1d0..995540baaf8 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderOpTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderOpTableMigrator.php @@ -40,6 +40,7 @@ class PostToOrderOpTableMigrator extends MetaToCustomTableMigrator { ), 'meta' => array( 'table_name' => $wpdb->postmeta, + 'meta_id_column' => 'meta_id', 'meta_key_column' => 'meta_key', 'meta_value_column' => 'meta_value', 'entity_id_column' => 'post_id', diff --git a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderTableMigrator.php index e21085c62ba..8635eb36f7b 100644 --- a/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/CustomOrderTable/PostToOrderTableMigrator.php @@ -39,6 +39,7 @@ class PostToOrderTableMigrator extends MetaToCustomTableMigrator { ), 'meta' => array( 'table_name' => $wpdb->postmeta, + 'meta_id_column' => 'meta_id', 'meta_key_column' => 'meta_key', 'meta_value_column' => 'meta_value', 'entity_id_column' => 'post_id', diff --git a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php index c72ab967a3a..35829eef75e 100644 --- a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php @@ -614,7 +614,7 @@ WHERE $query = $this->build_verification_query( $source_ids ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- $query should already be prepared. $results = $wpdb->get_results( $query, ARRAY_A ); - + $results = $this->fill_source_metadata( $results, $source_ids ); return $this->verify_data( $results ); } @@ -627,19 +627,13 @@ WHERE */ protected function build_verification_query( $source_ids ) { $source_table = $this->schema_config['source']['entity']['table_name']; - $meta_table = $this->schema_config['source']['meta']['table_name']; $destination_table = $this->schema_config['destination']['table_name']; - $meta_entity_id_column = $this->schema_config['source']['meta']['entity_id_column']; - $meta_key_column = $this->schema_config['source']['meta']['meta_key_column']; - $meta_value_column = $this->schema_config['source']['meta']['meta_value_column']; $destination_source_rel_column = $this->schema_config['destination']['source_rel_column']; $source_destination_rel_column = $this->schema_config['source']['entity']['destination_rel_column']; - $source_meta_rel_column = $this->schema_config['source']['entity']['meta_rel_column']; $source_destination_join_clause = "$destination_table ON $destination_table.$destination_source_rel_column = $source_table.$source_destination_rel_column"; $meta_select_clauses = array(); - $meta_join_clauses = array(); $source_select_clauses = array(); $destination_select_clauses = array(); @@ -650,19 +644,11 @@ WHERE } foreach ( $this->meta_column_mapping as $meta_key => $schema ) { - $meta_table_alias = "meta_source_{$schema['destination']}"; - $meta_select_clauses[] = "$meta_table_alias.$meta_value_column AS $meta_table_alias"; - $meta_join_clauses[] = " -$meta_table $meta_table_alias ON - $meta_table_alias.$meta_entity_id_column = $source_table.$source_meta_rel_column AND - $meta_table_alias.$meta_key_column = '$meta_key' -"; $destination_select_clauses[] = "$destination_table.{$schema['destination']} as {$destination_table}_{$schema['destination']}"; } $select_clause = implode( ', ', array_merge( $source_select_clauses, $meta_select_clauses, $destination_select_clauses ) ); - $meta_join_clause = implode( ' LEFT JOIN ', $meta_join_clauses ); $where_clause = $this->get_where_clause_for_verification( $source_ids ); @@ -670,11 +656,71 @@ $meta_table $meta_table_alias ON SELECT $select_clause FROM $source_table LEFT JOIN $source_destination_join_clause - LEFT JOIN $meta_join_clause WHERE $where_clause "; } + /** + * Fill source metadata for given IDS for verification. + * + * @param array $source_ids List of source IDs. + * + * @return array List of source metadata. This will be in the following format: + * [ + * { + * $source_table_$source_column: $value, + * ..., + * $destination_table_$destination_column: $value, + * ... + * meta_source_{$destination_column_name1}: $meta_value, + * ... + * }, + * ... + * ] + */ + private function fill_source_metadata( $results, $source_ids ) { + global $wpdb; + $meta_table = $this->schema_config['source']['meta']['table_name']; + $meta_entity_id_column = $this->schema_config['source']['meta']['entity_id_column']; + $meta_key_column = $this->schema_config['source']['meta']['meta_key_column']; + $meta_value_column = $this->schema_config['source']['meta']['meta_value_column']; + $meta_id_column = $this->schema_config['source']['meta']['meta_id_column']; + $meta_columns = array_keys( $this->meta_column_mapping ); + + $meta_columns_placeholder = implode( ', ', array_fill( 0, count( $meta_columns ), '%s' ) ); + $source_ids_placeholder = implode( ', ', array_fill( 0, count( $source_ids ), '%d' ) ); + + $query = $wpdb->prepare( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare + "SELECT $meta_entity_id_column as entity_id, $meta_key_column as meta_key, $meta_value_column as meta_value + FROM $meta_table + WHERE $meta_entity_id_column IN ($source_ids_placeholder) + AND $meta_key_column IN ($meta_columns_placeholder) + ORDER BY $meta_id_column ASC", + array_merge( $source_ids, $meta_columns ) + ); + + $meta_data = $wpdb->get_results( $query, ARRAY_A ); + $source_metadata_rows = array(); + foreach ( $meta_data as $meta_datum ) { + if ( ! isset( $source_metadata_rows[ $meta_datum['entity_id'] ] ) ) { + $source_metadata_rows[ $meta_datum['entity_id'] ] = array(); + } + $destination_column = $this->meta_column_mapping[ $meta_datum['meta_key'] ]['destination']; + $alias = "meta_source_{$destination_column}"; + if ( isset( $source_metadata_rows[ $meta_datum['entity_id'] ][ $alias ] ) ) { + // Only process first value, duplicate values mapping to flat columns are ignored to be consistent with WP core. + continue; + } + $source_metadata_rows[ $meta_datum['entity_id'] ][ $alias ] = $meta_datum['meta_value']; + } + foreach ( $results as $index => $result_row ) { + $source_id = $result_row[ $this->schema_config['source']['entity']['table_name'] . '_' . $this->schema_config['source']['entity']['primary_key'] ]; + $results[ $index ] = array_merge( $result_row, $source_metadata_rows[ $source_id ] ); + } + return $results; + } + /** * Helper function to generate where clause for fetching data for verification. * @@ -802,7 +848,7 @@ WHERE $where_clause $row[ $destination_alias ] = null; } } - if ( is_null( $row[ $alias ] ) ) { + if ( ! isset( $row[ $alias ] ) ) { $row[ $alias ] = $this->get_type_defaults( $schema['type'] ); } From e8363828f7a6a74b166caa55f94ef63e38116dcd Mon Sep 17 00:00:00 2001 From: Vedanshu Jain Date: Wed, 12 Apr 2023 18:40:19 +0530 Subject: [PATCH 1388/1680] Fixup to handle null data. --- .../src/Database/Migrations/MetaToCustomTableMigrator.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php index 35829eef75e..ee38fc669c5 100644 --- a/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php +++ b/plugins/woocommerce/src/Database/Migrations/MetaToCustomTableMigrator.php @@ -827,6 +827,9 @@ WHERE $where_clause * @return array Processed row. */ private function pre_process_row( $row, $schema, $alias, $destination_alias ) { + if ( ! isset( $row[ $alias ] ) ) { + $row[ $alias ] = $this->get_type_defaults( $schema['type'] ); + } if ( in_array( $schema['type'], array( 'int', 'decimal' ), true ) ) { if ( '' === $row[ $alias ] || null === $row[ $alias ] ) { $row[ $alias ] = 0; // $wpdb->prepare forces empty values to 0. @@ -848,10 +851,6 @@ WHERE $where_clause $row[ $destination_alias ] = null; } } - if ( ! isset( $row[ $alias ] ) ) { - $row[ $alias ] = $this->get_type_defaults( $schema['type'] ); - } - return $row; } From c8fcc51a5747f30a3d041398f278933ba0ed9245 Mon Sep 17 00:00:00 2001 From: Barry Hughes <3594411+barryhughes@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:29:16 -0700 Subject: [PATCH 1389/1680] Add links to the main project README.md and DEVELOPMENT.md guides. Related internal discussion: p1681316323858719/1681312857.759079-slack-C04US2XTBM3 --- .github/CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 03c09011544..df2c01a88bf 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -21,6 +21,8 @@ If you have questions about the process to contribute code or want to discuss de ## Getting started +Please take a moment to review the [project readme](https://github.com/woocommerce/woocommerce/blob/trunk/README.md) and our [development notes](https://github.com/woocommerce/woocommerce/blob/trunk/DEVELOPMENT.md), which cover the basics needed to start working on this project. You may also be interested in the following resources: + - [How to set up WooCommerce development environment](https://github.com/woocommerce/woocommerce/wiki/How-to-set-up-WooCommerce-development-environment) - [Git Flow](https://github.com/woocommerce/woocommerce/wiki/WooCommerce-Git-Flow) - [Minification of SCSS and JS](https://github.com/woocommerce/woocommerce/wiki/Minification-of-SCSS-and-JS) From 1f4f485e2b785efe967c78a4b321ef78cc4a2ac3 Mon Sep 17 00:00:00 2001 From: barryhughes <3594411+barryhughes@users.noreply.github.com> Date: Wed, 12 Apr 2023 09:34:50 -0700 Subject: [PATCH 1390/1680] No changelog needed. --- plugins/woocommerce/changelog/update-contributor-notes | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 plugins/woocommerce/changelog/update-contributor-notes diff --git a/plugins/woocommerce/changelog/update-contributor-notes b/plugins/woocommerce/changelog/update-contributor-notes new file mode 100644 index 00000000000..c3da78ce7ce --- /dev/null +++ b/plugins/woocommerce/changelog/update-contributor-notes @@ -0,0 +1,5 @@ +Significance: patch +Type: tweak +Comment: This updates a document targeting developers, but there are no functional changes and a changelog entry is not required. + + From 2722ef4763d0fab378be0ac6f7e03af2f848b421 Mon Sep 17 00:00:00 2001 From: Fernando Marichal Date: Wed, 12 Apr 2023 14:30:15 -0300 Subject: [PATCH 1391/1680] Item controls for attribute creation are always visible (#37620) * Fix dropdown menu style * Move items * Add changelog * Remove class `select` --------- Co-authored-by: Fernando Marichal --- ...37159_item_controls_for_attribute_always_visible | 4 ++++ plugins/woocommerce/client/legacy/css/admin.scss | 13 +++---------- .../meta-boxes/views/html-product-attribute.php | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) create mode 100644 plugins/woocommerce/changelog/dev-37159_item_controls_for_attribute_always_visible diff --git a/plugins/woocommerce/changelog/dev-37159_item_controls_for_attribute_always_visible b/plugins/woocommerce/changelog/dev-37159_item_controls_for_attribute_always_visible new file mode 100644 index 00000000000..07536bf189a --- /dev/null +++ b/plugins/woocommerce/changelog/dev-37159_item_controls_for_attribute_always_visible @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Item controls for attribute creation are always visible diff --git a/plugins/woocommerce/client/legacy/css/admin.scss b/plugins/woocommerce/client/legacy/css/admin.scss index ad9a3e3d1cf..5548210a923 100644 --- a/plugins/woocommerce/client/legacy/css/admin.scss +++ b/plugins/woocommerce/client/legacy/css/admin.scss @@ -1130,6 +1130,7 @@ $default-line-height: 18px; } .toolbar-top { .button, + .attribute_taxonomy, .select2-container { margin: 1px; } @@ -5620,6 +5621,7 @@ img.help_tip { a.delete, a.edit { float: right; + margin-right: 12px; } a.delete { @@ -5655,7 +5657,7 @@ img.help_tip { .handlediv { background-position: 6px 5px !important; - visibility: hidden; + margin: 4px 0 -1px !important; height: 26px; } @@ -5671,7 +5673,6 @@ img.help_tip { a.delete, a.edit, - .handlediv, .sort { margin-top: 0.25em; } @@ -5684,14 +5685,6 @@ img.help_tip { } } - h3:hover, - &.ui-sortable-helper { - a.delete, - .handlediv { - visibility: visible; - } - } - table { width: 100%; position: relative; diff --git a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-attribute.php b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-attribute.php index 50efad423aa..80587895b71 100644 --- a/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-attribute.php +++ b/plugins/woocommerce/includes/admin/meta-boxes/views/html-product-attribute.php @@ -5,9 +5,9 @@ if ( ! defined( 'ABSPATH' ) ) { ?>

    -
    + get_name() !== '' ? wc_attribute_label( $attribute->get_name() ) : __( 'Custom attribute', 'woocommerce' ) ); ?>