diff --git a/.github/actions/tests/run-api-tests/action.yml b/.github/actions/tests/run-api-tests/action.yml new file mode 100644 index 00000000000..c1dd9383a72 --- /dev/null +++ b/.github/actions/tests/run-api-tests/action.yml @@ -0,0 +1,37 @@ +name: Run API tests +description: Runs the WooCommerce Core API tests and generates Allure report. +permissions: {} + +inputs: + report-name: + description: Name of Allure report to be generated. + required: true + +runs: + using: composite + steps: + - name: Run API tests. + id: run-api-tests + working-directory: plugins/woocommerce + shell: bash + env: + BASE_URL: http://localhost:8086 + USER_KEY: admin + USER_SECRET: password + run: pnpm exec playwright test --config=tests/api-core-tests/playwright.config.js + + - name: Generate Test report. + if: success() || ( failure() && steps.run-api-tests.conclusion == 'failure' ) + working-directory: plugins/woocommerce + shell: bash + run: pnpm exec allure generate --clean ${{ env.ALLURE_RESULTS_DIR }} --output ${{ env.ALLURE_REPORT_DIR }} + + - name: Archive test report + if: success() || ( failure() && steps.run-api-tests.conclusion == 'failure' ) + uses: actions/upload-artifact@v3 + with: + name: ${{ inputs.report-name }} + path: | + ${{ env.ALLURE_RESULTS_DIR }} + ${{ env.ALLURE_REPORT_DIR }} + retention-days: 20 diff --git a/.github/actions/tests/run-e2e-tests/action.yml b/.github/actions/tests/run-e2e-tests/action.yml new file mode 100644 index 00000000000..7c7a974ed53 --- /dev/null +++ b/.github/actions/tests/run-e2e-tests/action.yml @@ -0,0 +1,41 @@ +name: Run E2E tests +description: Runs the WooCommerce Core E2E tests and generates Allure report. +permissions: {} + +inputs: + report-name: + description: Name of Allure report to be generated. + required: true + +runs: + using: composite + steps: + - name: Download and install Chromium browser. + working-directory: plugins/woocommerce + shell: bash + run: pnpm exec playwright install chromium + + - name: Run E2E tests. + id: run-e2e-tests + env: + FORCE_COLOR: 1 + USE_WP_ENV: 1 + working-directory: plugins/woocommerce + shell: bash + run: pnpm exec playwright test --config=tests/e2e-pw/playwright.config.js + + - name: Generate Test report. + if: success() || ( failure() && steps.run-e2e-tests.conclusion == 'failure' ) + working-directory: plugins/woocommerce + shell: bash + run: pnpm exec allure generate --clean ${{ env.ALLURE_RESULTS_DIR }} --output ${{ env.ALLURE_REPORT_DIR }} + + - name: Archive test report + if: success() || ( failure() && steps.run-e2e-tests.conclusion == 'failure' ) + uses: actions/upload-artifact@v3 + with: + name: ${{ inputs.report-name }} + path: | + ${{ env.ALLURE_RESULTS_DIR }} + ${{ env.ALLURE_REPORT_DIR }} + retention-days: 20 diff --git a/.github/actions/tests/run-k6-tests/action.yml b/.github/actions/tests/run-k6-tests/action.yml new file mode 100644 index 00000000000..fbf67c7f9f6 --- /dev/null +++ b/.github/actions/tests/run-k6-tests/action.yml @@ -0,0 +1,17 @@ +name: Run k6 performance tests +description: Runs the WooCommerce Core k6 performance tests. +permissions: {} + +runs: + using: composite + steps: + - name: Install k6 + shell: bash + run: | + curl https://github.com/grafana/k6/releases/download/v0.33.0/k6-v0.33.0-linux-amd64.tar.gz -L | tar xvz --strip-components 1 + + - name: Run k6 performance tests + id: run-k6-tests + shell: bash + run: | + ./k6 run plugins/woocommerce/tests/performance/tests/gh-action-pr-requests.js diff --git a/.github/actions/tests/setup-local-test-environment/action.yml b/.github/actions/tests/setup-local-test-environment/action.yml new file mode 100644 index 00000000000..c5386a32c77 --- /dev/null +++ b/.github/actions/tests/setup-local-test-environment/action.yml @@ -0,0 +1,29 @@ +name: Setup local test environment +description: Set up a wp-env testing environment +permissions: {} + +inputs: + test-type: + required: true + type: choice + options: + - e2e + - api + - k6 + +runs: + using: composite + steps: + - name: Load docker images and start containers for E2E or API tests + if: ( inputs.test-type == 'e2e' ) || ( inputs.test-type == 'api' ) + working-directory: plugins/woocommerce + shell: bash + run: pnpm run env:test + + - name: Load docker images and start containers for k6 performance tests + if: inputs.test-type == 'k6' + working-directory: plugins/woocommerce + shell: bash + run: | + pnpm env:dev --filter=woocommerce + pnpm env:performance-init --filter=woocommerce diff --git a/.github/actions/tests/slack-alert-on-pr-merge/action.yml b/.github/actions/tests/slack-alert-on-pr-merge/action.yml new file mode 100644 index 00000000000..6fbc11ab62a --- /dev/null +++ b/.github/actions/tests/slack-alert-on-pr-merge/action.yml @@ -0,0 +1,41 @@ +name: Send Slack alert on PR merge test failure +description: Send a Slack alert when automated tests failed on trunk after PR merge. +permissions: {} + +inputs: + slack-bot-token: + required: true + channel-id: + required: true + test-type: + required: true + type: choice + options: + - E2E + - API + - k6 + +runs: + using: composite + steps: + - name: Compose Slack message + id: compose-slack-message + uses: actions/github-script@v6 + env: + PR_NUMBER: ${{ github.event.pull_request.number }} + PR_TITLE: ${{ github.event.pull_request.title }} + SHA: ${{ github.event.pull_request.merge_commit_sha }} + TEST_TYPE: ${{ inputs.test-type }} + with: + script: | + const script = require('./.github/actions/tests/slack-alert-on-pr-merge/scripts/compose-slack-message.js') + const slackMessage = script() + core.setOutput('slack-message', slackMessage) + + - name: Send Slack alert + uses: slackapi/slack-github-action@v1.23.0 + env: + SLACK_BOT_TOKEN: ${{ inputs.slack-bot-token }} + with: + channel-id: ${{ inputs.channel-id }} + payload: ${{ steps.compose-slack-message.outputs.slack-message }} diff --git a/.github/actions/tests/slack-alert-on-pr-merge/scripts/compose-slack-message.js b/.github/actions/tests/slack-alert-on-pr-merge/scripts/compose-slack-message.js new file mode 100644 index 00000000000..ca194507547 --- /dev/null +++ b/.github/actions/tests/slack-alert-on-pr-merge/scripts/compose-slack-message.js @@ -0,0 +1,114 @@ +module.exports = () => { + const { + GITHUB_BASE_REF, + GITHUB_RUN_ID, + PR_NUMBER, + PR_TITLE, + SHA, + TEST_TYPE, + } = process.env; + + // Slack message blocks + const blocks = []; + const dividerBlock = { + type: 'divider', + }; + const introBlock = { + type: 'section', + text: { + type: 'mrkdwn', + text: `${ TEST_TYPE } tests failed on \`${ GITHUB_BASE_REF }\` after merging PR `, + }, + }; + const prTitleBlock = { + type: 'header', + text: { + type: 'plain_text', + text: PR_TITLE, + emoji: true, + }, + }; + const prButtonBlock = { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'View pull request :pr-merged:', + emoji: true, + }, + value: 'view_pr', + url: `https://github.com/woocommerce/woocommerce/pull/${ PR_NUMBER }`, + action_id: 'view-pr', + }, + ], + }; + const mergeCommitBlock = { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: `View merge commit ${ SHA.substring( + 0, + 7 + ) } :alphabet-yellow-hash:`, + emoji: true, + }, + value: 'view_commit', + url: `https://github.com/woocommerce/woocommerce/commit/${ SHA }`, + action_id: 'view-commit', + }, + ], + }; + const githubBlock = { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'View GitHub run log :github:', + emoji: true, + }, + value: 'view_github', + url: `https://github.com/woocommerce/woocommerce/actions/runs/${ GITHUB_RUN_ID }`, + action_id: 'view-github', + }, + ], + }; + const reportBlock = { + type: 'actions', + elements: [ + { + type: 'button', + text: { + type: 'plain_text', + text: 'View test report :colorful-bar-chart:', + emoji: true, + }, + value: 'view_report', + url: `https://woocommerce.github.io/woocommerce-test-reports/pr-merge/${ PR_NUMBER }/${ TEST_TYPE.toLowerCase() }`, + action_id: 'view-report', + }, + ], + }; + + // Assemble blocks + blocks.push( dividerBlock ); + blocks.push( introBlock ); + blocks.push( prTitleBlock ); + blocks.push( prButtonBlock ); + blocks.push( mergeCommitBlock ); + blocks.push( githubBlock ); + + if ( [ 'e2e', 'api' ].includes( TEST_TYPE.toLowerCase() ) ) { + blocks.push( reportBlock ); + } + + blocks.push( dividerBlock ); + + return { blocks }; +}; diff --git a/.github/actions/tests/upload-allure-files-to-bucket/action.yml b/.github/actions/tests/upload-allure-files-to-bucket/action.yml new file mode 100644 index 00000000000..ad745b990e8 --- /dev/null +++ b/.github/actions/tests/upload-allure-files-to-bucket/action.yml @@ -0,0 +1,47 @@ +name: Upload Allure files to bucket +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. + required: true + aws-region: + required: true + aws-access-key-id: + required: true + aws-secret-access-key: + required: true + s3-bucket: + required: true + include-allure-results: + dafault: true + +runs: + using: composite + steps: + - name: Configure AWS credentials + uses: aws-actions/configure-aws-credentials@v1-node16 + with: + aws-region: ${{ inputs.aws-region }} + aws-access-key-id: ${{ inputs.aws-access-key-id }} + aws-secret-access-key: ${{ inputs.aws-secret-access-key }} + + - name: Upload 'allure-results' folder + if: inputs.include-allure-results == true + shell: bash + run: | + echo "Uploading allure-results folder..." + aws s3 sync ${{ env.ALLURE_RESULTS_DIR }} \ + ${{ inputs.s3-bucket }}/artifacts/${{ github.run_id }}/${{ inputs.destination-dir }}/allure-results \ + --quiet + echo "Done" + + - name: Upload 'allure-report' folder + shell: bash + run: | + echo "Uploading allure-report folder..." + aws s3 sync ${{ env.ALLURE_REPORT_DIR }} \ + ${{ inputs.s3-bucket }}/artifacts/${{ github.run_id }}/${{ inputs.destination-dir }}/allure-report \ + --quiet + echo "Done" 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/.github/workflows/pr-unit-tests.yml b/.github/workflows/pr-unit-tests.yml index e328e50edcf..a5fcc87bcf0 100644 --- a/.github/workflows/pr-unit-tests.yml +++ b/.github/workflows/pr-unit-tests.yml @@ -15,12 +15,14 @@ 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 }} + name: PHP ${{ matrix.php }} WP ${{ matrix.wp }} ${{ matrix.hpos && 'HPOS' || '' }} timeout-minutes: 30 runs-on: ubuntu-20.04 permissions: contents: read continue-on-error: ${{ matrix.wp == 'nightly' }} + env: + HPOS: ${{ matrix.hpos }} strategy: fail-fast: false matrix: @@ -33,6 +35,9 @@ jobs: php: 7.4 - wp: '5.9' php: 7.4 + - wp: 'latest' + php: '7.4' + hpos: true services: database: image: mysql:5.6 diff --git a/.github/workflows/smoke-test-pr-merge.yml b/.github/workflows/smoke-test-pr-merge.yml new file mode 100644 index 00000000000..3b3562f3004 --- /dev/null +++ b/.github/workflows/smoke-test-pr-merge.yml @@ -0,0 +1,168 @@ +name: Run tests against trunk after PR merge +on: + pull_request: + types: + - closed +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true +permissions: {} + +jobs: + api: + name: Run API tests + runs-on: ubuntu-20.04 + if: (github.event.pull_request.merged == true) && (github.event.pull_request.base.ref == 'trunk') + permissions: + contents: read + env: + ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/test-results/allure-results + ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/api-core-tests/test-results/allure-report + ARTIFACT_NAME: api-pr-merge-${{ github.event.pull_request.number }}-run-${{ github.run_number }} + steps: + - name: Checkout merge commit on trunk + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.merge_commit_sha }} + + - name: Setup WooCommerce Monorepo + uses: ./.github/actions/setup-woocommerce-monorepo + with: + build-filters: woocommerce + + - name: Setup local test environment + uses: ./.github/actions/tests/setup-local-test-environment + with: + test-type: api + + - name: Run API tests + id: run-api-composite-action + uses: ./.github/actions/tests/run-api-tests + with: + report-name: ${{ env.ARTIFACT_NAME }} + + - 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 + 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 Allure report + if: success() || ( failure() && steps.run-api-composite-action.conclusion == 'failure' ) + env: + GITHUB_TOKEN: ${{ secrets.REPORTS_TOKEN }} + run: | + gh workflow run publish-test-reports-trunk-merge.yml \ + -f run_id=${{ github.run_id }} \ + -f artifact=${{ env.ARTIFACT_NAME }} \ + -f pr_number=${{ github.event.pull_request.number }} \ + -f test_type="api" \ + --repo woocommerce/woocommerce-test-reports + + - name: Send Slack alert on test failure + if: failure() && steps.run-api-composite-action.conclusion == 'failure' + uses: ./.github/actions/tests/slack-alert-on-pr-merge + with: + slack-bot-token: ${{ secrets.E2E_SLACK_TOKEN }} + channel-id: ${{ secrets.E2E_TRUNK_SLACK_CHANNEL }} + test-type: API + + e2e: + name: Run E2E tests + needs: [api] + runs-on: ubuntu-20.04 + permissions: + contents: read + env: + ALLURE_RESULTS_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/allure-results + ALLURE_REPORT_DIR: ${{ github.workspace }}/plugins/woocommerce/tests/e2e-pw/test-results/allure-report + ARTIFACT_NAME: e2e-pr-merge-${{ github.event.pull_request.number }}-run-${{ github.run_number }} + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.merge_commit_sha }} + + - name: Setup WooCommerce Monorepo + uses: ./.github/actions/setup-woocommerce-monorepo + with: + build-filters: woocommerce + + - name: Setup local test environment + uses: ./.github/actions/tests/setup-local-test-environment + with: + test-type: e2e + + - name: Run E2E tests + id: run-e2e-composite-action + timeout-minutes: 60 + uses: ./.github/actions/tests/run-e2e-tests + env: + E2E_MAX_FAILURES: 15 + with: + report-name: ${{ env.ARTIFACT_NAME }} + + - 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 + 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 }} + include-allure-results: false + + - name: Publish 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-trunk-merge.yml \ + -f run_id=${{ github.run_id }} \ + -f artifact=${{ env.ARTIFACT_NAME }} \ + -f pr_number=${{ github.event.pull_request.number }} \ + -f test_type="e2e" \ + --repo woocommerce/woocommerce-test-reports + + - name: Send Slack alert on test failure + if: failure() && steps.run-e2e-composite-action.conclusion == 'failure' + uses: ./.github/actions/tests/slack-alert-on-pr-merge + with: + slack-bot-token: ${{ secrets.E2E_SLACK_TOKEN }} + channel-id: ${{ secrets.E2E_TRUNK_SLACK_CHANNEL }} + test-type: E2E + + k6: + name: Run k6 Performance tests + needs: [api] + runs-on: ubuntu-20.04 + permissions: + contents: read + steps: + - uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.merge_commit_sha }} + + - name: Setup WooCommerce Monorepo + uses: ./.github/actions/setup-woocommerce-monorepo + + - name: Setup local test environment + uses: ./.github/actions/tests/setup-local-test-environment + with: + test-type: k6 + + - name: Run k6 performance tests + id: run-k6-composite-action + uses: './.github/actions/tests/run-k6-tests' + + - name: Send Slack alert on test failure + if: failure() && steps.run-k6-composite-action.conclusion == 'failure' + uses: ./.github/actions/tests/slack-alert-on-pr-merge + with: + slack-bot-token: ${{ secrets.E2E_SLACK_TOKEN }} + channel-id: ${{ secrets.E2E_TRUNK_SLACK_CHANNEL }} + test-type: k6 diff --git a/changelog.txt b/changelog.txt index ab4640efbf2..30d4a66ac9e 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,5 +1,78 @@ == Changelog == += 7.5.1 2023-03-21 = + +**WooCommerce** + +* Fix - Fix no enforcing of min/max limits in quantity selector of variable products. [#36871](https://github.com/woocommerce/woocommerce/pull/36871) +* Dev - Update column definitions with synonymous types to prevent dbDelta from trying to ALTER them on each install. [#37277](https://github.com/woocommerce/woocommerce/pull/37277) +* Update - Update WooCommerce Blocks to 9.6.6. [#37298](https://github.com/woocommerce/woocommerce/pull/37298) + += 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** 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/customer-effort-score/changelog/update-move-remaining-ces-to-package b/packages/js/customer-effort-score/changelog/update-move-remaining-ces-to-package new file mode 100644 index 00000000000..9795fb06a03 --- /dev/null +++ b/packages/js/customer-effort-score/changelog/update-move-remaining-ces-to-package @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Move additional components to @woocommerce/customer-effort-score. diff --git a/packages/js/customer-effort-score/package.json b/packages/js/customer-effort-score/package.json index c40f56aed5a..3dae30da83b 100644 --- a/packages/js/customer-effort-score/package.json +++ b/packages/js/customer-effort-score/package.json @@ -51,6 +51,7 @@ "@woocommerce/eslint-plugin": "workspace:*", "@woocommerce/internal-style-build": "workspace:*", "@woocommerce/navigation": "workspace:*", + "@woocommerce/tracks": "workspace:*", "@wordpress/browserslist-config": "wp-6.0", "concurrently": "^7.0.0", "css-loader": "^3.6.0", diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-modal-container.tsx b/packages/js/customer-effort-score/src/components/customer-effort-score-modal-container/index.tsx similarity index 90% rename from plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-modal-container.tsx rename to packages/js/customer-effort-score/src/components/customer-effort-score-modal-container/index.tsx index 33b3c9f009c..042b868b481 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-modal-container.tsx +++ b/packages/js/customer-effort-score/src/components/customer-effort-score-modal-container/index.tsx @@ -3,18 +3,17 @@ */ import { __ } from '@wordpress/i18n'; import { useDispatch, useSelect } from '@wordpress/data'; -import { - CustomerFeedbackModal, - STORE_KEY, -} from '@woocommerce/customer-effort-score'; -import { recordEvent } from '@woocommerce/tracks'; import { OPTIONS_STORE_NAME } from '@woocommerce/data'; +import { createElement } from '@wordpress/element'; +import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies */ -import { getStoreAgeInWeeks } from './utils'; -import { ADMIN_INSTALL_TIMESTAMP_OPTION_NAME } from './constants'; +import { CustomerFeedbackModal } from '../'; +import { getStoreAgeInWeeks } from '../../utils'; +import { STORE_KEY } from '../../store'; +import { ADMIN_INSTALL_TIMESTAMP_OPTION_NAME } from '../../constants'; export const PRODUCT_MVP_CES_ACTION_OPTION_NAME = 'woocommerce_ces_product_mvp_ces_action'; diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js b/packages/js/customer-effort-score/src/components/customer-effort-score-tracks-container/index.js similarity index 87% rename from plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js rename to packages/js/customer-effort-score/src/components/customer-effort-score-tracks-container/index.js index b1b2b84e297..46c8ce38afd 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks-container.js +++ b/packages/js/customer-effort-score/src/components/customer-effort-score-tracks-container/index.js @@ -4,17 +4,15 @@ import { useEffect } from 'react'; import { compose } from '@wordpress/compose'; import { withDispatch, withSelect } from '@wordpress/data'; -import { - QUEUE_OPTION_NAME, - STORE_KEY, -} from '@woocommerce/customer-effort-score'; +import { createElement, Fragment } from '@wordpress/element'; import { OPTIONS_STORE_NAME } from '@woocommerce/data'; import PropTypes from 'prop-types'; /** * Internal dependencies */ -import CustomerEffortScoreTracks from './customer-effort-score-tracks'; +import { CustomerEffortScoreTracks } from '../'; +import { QUEUE_OPTION_NAME, STORE_KEY } from '../../store'; /** * Maps the queue of CES tracks surveys to CustomerEffortScoreTracks @@ -27,7 +25,7 @@ import CustomerEffortScoreTracks from './customer-effort-score-tracks'; * @param {boolean} props.resolving Whether the queue is resolving. * @param {Function} props.clearQueue Sets up clearing of the queue on the next page load. */ -function CustomerEffortScoreTracksContainer( { +function _CustomerEffortScoreTracksContainer( { queue, resolving, clearQueue, @@ -67,7 +65,7 @@ function CustomerEffortScoreTracksContainer( { ); } -CustomerEffortScoreTracksContainer.propTypes = { +_CustomerEffortScoreTracksContainer.propTypes = { /** * The queue of CES tracks surveys to display. */ @@ -82,7 +80,7 @@ CustomerEffortScoreTracksContainer.propTypes = { clearQueue: PropTypes.func, }; -export default compose( +export const CustomerEffortScoreTracksContainer = compose( withSelect( ( select ) => { const { getCesSurveyQueue, isResolving } = select( STORE_KEY ); const queue = getCesSurveyQueue(); @@ -109,4 +107,4 @@ export default compose( }, }; } ) -)( CustomerEffortScoreTracksContainer ); +)( _CustomerEffortScoreTracksContainer ); diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js b/packages/js/customer-effort-score/src/components/customer-effort-score-tracks/index.js similarity index 95% rename from plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js rename to packages/js/customer-effort-score/src/components/customer-effort-score-tracks/index.js index 295f32c3a53..b1506ffb5e1 100644 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/customer-effort-score-tracks.js +++ b/packages/js/customer-effort-score/src/components/customer-effort-score-tracks/index.js @@ -1,26 +1,24 @@ /** * External dependencies */ -import { useState } from '@wordpress/element'; import PropTypes from 'prop-types'; -import { recordEvent } from '@woocommerce/tracks'; -import { - ALLOW_TRACKING_OPTION_NAME, - CustomerEffortScore, -} from '@woocommerce/customer-effort-score'; import { compose } from '@wordpress/compose'; import { withSelect, withDispatch } from '@wordpress/data'; +import { createElement, useState } from '@wordpress/element'; import { OPTIONS_STORE_NAME } from '@woocommerce/data'; import { __ } from '@wordpress/i18n'; +import { recordEvent } from '@woocommerce/tracks'; /** * Internal dependencies */ +import { CustomerEffortScore } from '../'; import { - SHOWN_FOR_ACTIONS_OPTION_NAME, ADMIN_INSTALL_TIMESTAMP_OPTION_NAME, -} from './constants'; -import { getStoreAgeInWeeks } from './utils'; + ALLOW_TRACKING_OPTION_NAME, + SHOWN_FOR_ACTIONS_OPTION_NAME, +} from '../../constants'; +import { getStoreAgeInWeeks } from '../../utils'; /** * A CustomerEffortScore wrapper that uses tracks to track the selected @@ -43,7 +41,7 @@ import { getStoreAgeInWeeks } from './utils'; * @param {Function} props.updateOptions Function to update options. * @param {Function} props.createNotice Function to create a snackbar. */ -function CustomerEffortScoreTracks( { +function _CustomerEffortScoreTracks( { action, trackProps, title, @@ -176,7 +174,7 @@ function CustomerEffortScoreTracks( { ); } -CustomerEffortScoreTracks.propTypes = { +_CustomerEffortScoreTracks.propTypes = { /** * The action name sent to Tracks. */ @@ -219,7 +217,7 @@ CustomerEffortScoreTracks.propTypes = { createNotice: PropTypes.func, }; -export default compose( +export const CustomerEffortScoreTracks = compose( withSelect( ( select ) => { const { getOption, hasFinishedResolution } = select( OPTIONS_STORE_NAME ); @@ -262,4 +260,4 @@ export default compose( createNotice, }; } ) -)( CustomerEffortScoreTracks ); +)( _CustomerEffortScoreTracks ); diff --git a/packages/js/customer-effort-score/src/components/index.ts b/packages/js/customer-effort-score/src/components/index.ts new file mode 100644 index 00000000000..81ae0d67dfe --- /dev/null +++ b/packages/js/customer-effort-score/src/components/index.ts @@ -0,0 +1,8 @@ +export * from './customer-effort-score'; +export * from './customer-effort-score-modal-container'; +export * from './customer-effort-score-tracks'; +export * from './customer-effort-score-tracks-container'; +export * from './customer-feedback-simple'; +export * from './customer-feedback-modal'; +export * from './product-mvp-feedback-modal'; +export * from './feedback-modal'; diff --git a/packages/js/customer-effort-score/src/constants.js b/packages/js/customer-effort-score/src/constants.js index 498d982940a..d2914cd46ca 100644 --- a/packages/js/customer-effort-score/src/constants.js +++ b/packages/js/customer-effort-score/src/constants.js @@ -1 +1,7 @@ +export const ADMIN_INSTALL_TIMESTAMP_OPTION_NAME = + 'woocommerce_admin_install_timestamp'; + export const ALLOW_TRACKING_OPTION_NAME = 'woocommerce_allow_tracking'; + +export const SHOWN_FOR_ACTIONS_OPTION_NAME = + 'woocommerce_ces_shown_for_actions'; diff --git a/packages/js/customer-effort-score/src/hooks/index.ts b/packages/js/customer-effort-score/src/hooks/index.ts new file mode 100644 index 00000000000..e65c8eb7746 --- /dev/null +++ b/packages/js/customer-effort-score/src/hooks/index.ts @@ -0,0 +1 @@ +export * from './use-customer-effort-score-exit-page-tracker'; diff --git a/packages/js/customer-effort-score/src/index.ts b/packages/js/customer-effort-score/src/index.ts index d6ef2e56087..de54752495a 100644 --- a/packages/js/customer-effort-score/src/index.ts +++ b/packages/js/customer-effort-score/src/index.ts @@ -1,9 +1,5 @@ -export * from './components/customer-effort-score'; -export * from './components/customer-feedback-simple'; -export * from './components/customer-feedback-modal'; -export * from './components/product-mvp-feedback-modal'; -export * from './components/feedback-modal'; -export * from './hooks/use-customer-effort-score-exit-page-tracker'; -export * from './store'; -export * from './utils/customer-effort-score-exit-page'; +export * from './components'; export * from './constants'; +export * from './hooks'; +export * from './store'; +export * from './utils'; diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/utils.ts b/packages/js/customer-effort-score/src/utils/get-store-age-in-weeks.ts similarity index 100% rename from plugins/woocommerce-admin/client/customer-effort-score-tracks/utils.ts rename to packages/js/customer-effort-score/src/utils/get-store-age-in-weeks.ts diff --git a/packages/js/customer-effort-score/src/utils/index.ts b/packages/js/customer-effort-score/src/utils/index.ts new file mode 100644 index 00000000000..db394918df5 --- /dev/null +++ b/packages/js/customer-effort-score/src/utils/index.ts @@ -0,0 +1,2 @@ +export * from './customer-effort-score-exit-page'; +export * from './get-store-age-in-weeks'; 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/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/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/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/changelog/add-37103 b/packages/js/product-editor/changelog/add-37103 new file mode 100644 index 00000000000..b555a67c8ae --- /dev/null +++ b/packages/js/product-editor/changelog/add-37103 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add summary block 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/changelog/update-product-page-add-hook-37281 b/packages/js/product-editor/changelog/update-product-page-add-hook-37281 new file mode 100644 index 00000000000..0be0cab8030 --- /dev/null +++ b/packages/js/product-editor/changelog/update-product-page-add-hook-37281 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Fix issue were template was not re-synced when switching between products. 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 677e915c674..cf58e1f8a63 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", @@ -57,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", @@ -90,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/block-editor/block-editor.tsx b/packages/js/product-editor/src/components/block-editor/block-editor.tsx index aa127422e94..b25a6c9059b 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 @@ -94,7 +94,7 @@ export function BlockEditor( { synchronizeBlocksWithTemplate( [], _settings?.template ), {} ); - }, [] ); + }, [ product.id ] ); if ( ! blocks ) { return null; 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..43b3aabdc22 --- /dev/null +++ b/packages/js/product-editor/src/components/collapsible-block/index.ts @@ -0,0 +1,18 @@ +/** + * 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/details-name-block/index.ts b/packages/js/product-editor/src/components/details-name-block/index.ts index f0c73e48b2b..59d35906a12 100644 --- a/packages/js/product-editor/src/components/details-name-block/index.ts +++ b/packages/js/product-editor/src/components/details-name-block/index.ts @@ -14,4 +14,9 @@ export const settings = { edit: Edit, }; -export const init = () => initBlock( { name, metadata, settings } ); +export const init = () => + initBlock( { + name, + metadata: metadata as never, + settings, + } ); 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 new file mode 100644 index 00000000000..003cd6841e9 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/block.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 2, + "name": "woocommerce/product-summary", + "title": "Product summary", + "category": "widgets", + "description": "The product summary.", + "keywords": [ "products", "summary", "excerpt" ], + "textdomain": "default", + "attributes": { + "align": { + "type": "string" + }, + "direction": { + "type": "string", + "enum": [ "ltr", "rtl" ] + }, + "label": { + "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-summary-block/constants.ts b/packages/js/product-editor/src/components/details-summary-block/constants.ts new file mode 100644 index 00000000000..68dcf773353 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/constants.ts @@ -0,0 +1,33 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { + alignCenter, + alignJustify, + alignLeft, + alignRight, +} from '@wordpress/icons'; + +export const ALIGNMENT_CONTROLS = [ + { + icon: alignLeft, + title: __( 'Align text left', 'woocommerce' ), + align: 'left', + }, + { + icon: alignCenter, + title: __( 'Align text center', 'woocommerce' ), + align: 'center', + }, + { + icon: alignRight, + title: __( 'Align text right', 'woocommerce' ), + align: 'right', + }, + { + icon: alignJustify, + title: __( 'Align text justify', 'woocommerce' ), + align: 'justify', + }, +]; diff --git a/packages/js/product-editor/src/components/details-summary-block/edit.tsx b/packages/js/product-editor/src/components/details-summary-block/edit.tsx new file mode 100644 index 00000000000..7490bbb4343 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/edit.tsx @@ -0,0 +1,90 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { createElement } from '@wordpress/element'; +import { BlockEditProps } from '@wordpress/blocks'; +import { BaseControl } from '@wordpress/components'; +import { useEntityProp } from '@wordpress/core-data'; +import uniqueId from 'lodash/uniqueId'; +import classNames from 'classnames'; +import { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore No types for this exist yet. + AlignmentControl, + BlockControls, + RichText, + useBlockProps, +} from '@wordpress/block-editor'; + +/** + * Internal dependencies + */ +import { ParagraphRTLControl } from './paragraph-rtl-control'; +import { SummaryAttributes } from './types'; +import { ALIGNMENT_CONTROLS } from './constants'; + +export function Edit( { + attributes, + setAttributes, +}: BlockEditProps< SummaryAttributes > ) { + const { align, direction, label } = attributes; + const blockProps = useBlockProps( { + style: { direction }, + } ); + const id = uniqueId(); + const [ summary, setSummary ] = useEntityProp< string >( + 'postType', + 'product', + 'short_description' + ); + + function handleAlignmentChange( value: SummaryAttributes[ 'align' ] ) { + setAttributes( { align: value } ); + } + + function handleDirectionChange( value: SummaryAttributes[ 'direction' ] ) { + setAttributes( { direction: value } ); + } + + return ( +
+ { /* eslint-disable-next-line @typescript-eslint/ban-ts-comment */ } + { /* @ts-ignore No types for this exist yet. */ } + + + + + + + + + +
+ ); +} diff --git a/packages/js/product-editor/src/components/details-summary-block/index.ts b/packages/js/product-editor/src/components/details-summary-block/index.ts new file mode 100644 index 00000000000..aa9e35a168c --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/index.ts @@ -0,0 +1,30 @@ +/** + * External dependencies + */ +import { BlockConfiguration } from '@wordpress/blocks'; + +/** + * Internal dependencies + */ +import { initBlock } from '../../utils'; +import blockConfiguration from './block.json'; +import { Edit } from './edit'; +import { SummaryAttributes } from './types'; + +const { name, ...metadata } = + blockConfiguration as BlockConfiguration< SummaryAttributes >; + +export { name, metadata }; + +export const settings = { + example: {}, + edit: Edit, +}; + +export function init() { + return initBlock< SummaryAttributes >( { + name, + metadata, + settings, + } ); +} diff --git a/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/index.ts b/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/index.ts new file mode 100644 index 00000000000..122d0571e26 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/index.ts @@ -0,0 +1,2 @@ +export * from './paragraph-rtl-control'; +export * from './types'; diff --git a/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/paragraph-rtl-control.tsx b/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/paragraph-rtl-control.tsx new file mode 100644 index 00000000000..40a731244f4 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/paragraph-rtl-control.tsx @@ -0,0 +1,40 @@ +/** + * External dependencies + */ +import { createElement, Fragment } from '@wordpress/element'; +import { ToolbarButton } from '@wordpress/components'; +import { _x, isRTL } from '@wordpress/i18n'; +import { formatLtr } from '@wordpress/icons'; + +/** + * Internal dependencies + */ +import { ParagraphRTLControlProps } from './types'; + +export function ParagraphRTLControl( { + direction, + onChange, +}: ParagraphRTLControlProps ) { + function handleClick() { + if ( typeof onChange === 'function' ) { + onChange( direction === 'ltr' ? undefined : 'ltr' ); + } + } + + return ( + <> + { isRTL() && ( + + ) } + + ); +} diff --git a/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/types.ts b/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/types.ts new file mode 100644 index 00000000000..4a5f8bf0fa2 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/paragraph-rtl-control/types.ts @@ -0,0 +1,11 @@ +/** + * Internal dependencies + */ +import { SummaryAttributes } from '../types'; + +export type ParagraphRTLControlProps = Pick< + SummaryAttributes, + 'direction' +> & { + onChange( direction?: SummaryAttributes[ 'direction' ] ): void; +}; diff --git a/packages/js/product-editor/src/components/details-summary-block/style.scss b/packages/js/product-editor/src/components/details-summary-block/style.scss new file mode 100644 index 00000000000..54ccfea0942 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/style.scss @@ -0,0 +1,6 @@ +// This alignment class does not exists in +// https://github.com/WordPress/gutenberg/blob/trunk/packages/block-library/src/common.scss +.has-text-align-justify { + /*rtl:ignore*/ + text-align: justify; +} diff --git a/packages/js/product-editor/src/components/details-summary-block/types.ts b/packages/js/product-editor/src/components/details-summary-block/types.ts new file mode 100644 index 00000000000..9d20d494fb4 --- /dev/null +++ b/packages/js/product-editor/src/components/details-summary-block/types.ts @@ -0,0 +1,5 @@ +export type SummaryAttributes = { + align: 'left' | 'center' | 'right' | 'justify'; + direction: 'ltr' | 'rtl'; + label: string; +}; 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/components/editor/editor.tsx b/packages/js/product-editor/src/components/editor/editor.tsx index b789f2539bf..2f93b69b7b2 100644 --- a/packages/js/product-editor/src/components/editor/editor.tsx +++ b/packages/js/product-editor/src/components/editor/editor.tsx @@ -6,7 +6,7 @@ import { EditorSettings, EditorBlockListSettings, } from '@wordpress/block-editor'; -import { SlotFillProvider } from '@wordpress/components'; +import { Popover, 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. @@ -60,6 +60,8 @@ export function Editor( { product, settings }: EditorProps ) { /> } /> + + 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..f55760f5fce 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,24 @@ +/** + * External dependencies + */ +import { registerCoreBlocks } from '@wordpress/block-library'; + /** * Internal dependencies */ import { init as initName } from '../details-name-block'; +import { init as initSummary } from '../details-summary-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(); initName(); + initSummary(); initSection(); initTab(); + initPricing(); + initCollapsible(); }; 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..59d35906a12 --- /dev/null +++ b/packages/js/product-editor/src/components/pricing-block/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/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/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/packages/js/product-editor/src/style.scss b/packages/js/product-editor/src/style.scss index 99f2ce949ee..508d0edf477 100644 --- a/packages/js/product-editor/src/style.scss +++ b/packages/js/product-editor/src/style.scss @@ -8,3 +8,4 @@ @import 'components/section/style.scss'; @import 'components/tab/style.scss'; @import 'components/tabs/style.scss'; +@import 'components/details-summary-block/style.scss'; 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/src/utils/init-blocks.ts b/packages/js/product-editor/src/utils/init-blocks.ts index b8dc4118138..06404008120 100644 --- a/packages/js/product-editor/src/utils/init-blocks.ts +++ b/packages/js/product-editor/src/utils/init-blocks.ts @@ -1,26 +1,31 @@ /** * External dependencies */ -import { BlockConfiguration, registerBlockType } from '@wordpress/blocks'; +import { + Block, + BlockConfiguration, + registerBlockType, +} from '@wordpress/blocks'; -interface BlockRepresentation { - name: string; - metadata: BlockConfiguration; - settings: Partial< BlockConfiguration >; +interface BlockRepresentation< T extends Record< string, object > > { + name?: string; + metadata: BlockConfiguration< T >; + settings: Partial< BlockConfiguration< T > >; } /** * 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`. + * @param block The block to be registered. + * @return The block, if it has been successfully registered; otherwise `undefined`. */ -export const initBlock = ( block: BlockRepresentation ) => { +export function initBlock< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + T extends Record< string, any > = Record< string, any > +>( block: BlockRepresentation< T > ): Block< T > | undefined { if ( ! block ) { return; } const { metadata, settings, name } = block; - return registerBlockType( { name, ...metadata }, settings ); -}; + return registerBlockType< T >( { name, ...metadata }, settings ); +} 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/customer-effort-score-tracks/constants.ts b/plugins/woocommerce-admin/client/customer-effort-score-tracks/constants.ts deleted file mode 100644 index 4a7ee0b3609..00000000000 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const SHOWN_FOR_ACTIONS_OPTION_NAME = - 'woocommerce_ces_shown_for_actions'; -export const ADMIN_INSTALL_TIMESTAMP_OPTION_NAME = - 'woocommerce_admin_install_timestamp'; diff --git a/plugins/woocommerce-admin/client/customer-effort-score-tracks/index.js b/plugins/woocommerce-admin/client/customer-effort-score-tracks/index.js deleted file mode 100644 index bd9b84cbbe4..00000000000 --- a/plugins/woocommerce-admin/client/customer-effort-score-tracks/index.js +++ /dev/null @@ -1,3 +0,0 @@ -export { default as CustomerEffortScoreTracks } from './customer-effort-score-tracks'; -export { default as CustomerEffortScoreTracksContainer } from './customer-effort-score-tracks-container'; -export * from './customer-effort-score-modal-container.tsx'; 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 c9814047216..453022a2ae8 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 @@ -9,6 +9,7 @@ import { WooFooterItem } from '@woocommerce/admin-layout'; import { Pill } from '@woocommerce/components'; import { ALLOW_TRACKING_OPTION_NAME, + SHOWN_FOR_ACTIONS_OPTION_NAME, STORE_KEY, } from '@woocommerce/customer-effort-score'; import { OPTIONS_STORE_NAME } from '@woocommerce/data'; @@ -17,7 +18,6 @@ import { OPTIONS_STORE_NAME } from '@woocommerce/data'; * Internal dependencies */ import './product-mvp-ces-footer.scss'; -import { SHOWN_FOR_ACTIONS_OPTION_NAME } from './constants'; export const PRODUCT_MVP_CES_ACTION_OPTION_NAME = 'woocommerce_ces_product_mvp_ces_action'; diff --git a/plugins/woocommerce-admin/client/homescreen/constants.js b/plugins/woocommerce-admin/client/homescreen/constants.js index b0b7575df8f..335e1bea6fe 100644 --- a/plugins/woocommerce-admin/client/homescreen/constants.js +++ b/plugins/woocommerce-admin/client/homescreen/constants.js @@ -9,9 +9,3 @@ export const WELCOME_MODAL_DISMISSED_OPTION_NAME = */ export const WELCOME_FROM_CALYPSO_MODAL_DISMISSED_OPTION_NAME = 'woocommerce_welcome_from_calypso_modal_dismissed'; - -/** - * WooCommerce Admin installation timestamp option name. - */ -export const WOOCOMMERCE_ADMIN_INSTALL_TIMESTAMP_OPTION_NAME = - 'woocommerce_admin_install_timestamp'; diff --git a/plugins/woocommerce-admin/client/index.js b/plugins/woocommerce-admin/client/index.js index 41a0866a6d8..67173157a26 100644 --- a/plugins/woocommerce-admin/client/index.js +++ b/plugins/woocommerce-admin/client/index.js @@ -3,6 +3,7 @@ */ import '@wordpress/notices'; import { render } from '@wordpress/element'; +import { CustomerEffortScoreTracksContainer } from '@woocommerce/customer-effort-score'; import { withCurrentUserHydration, withSettingsHydration, @@ -14,7 +15,6 @@ import { import './stylesheets/_index.scss'; import { getAdminSetting } from '~/utils/admin-settings'; import { PageLayout, EmbedLayout, PrimaryLayout as NoticeArea } from './layout'; -import { CustomerEffortScoreTracksContainer } from './customer-effort-score-tracks'; import { EmbeddedBodyLayout } from './embedded-body-layout'; import { WcAdminPaymentsGatewaysBannerSlot } from './payments/payments-settings-banner-slotfill'; import { WcAdminConflictErrorSlot } from './settings/conflict-error-slotfill.js'; diff --git a/plugins/woocommerce-admin/client/layout/index.js b/plugins/woocommerce-admin/client/layout/index.js index b3321181ad3..9a6344e09b0 100644 --- a/plugins/woocommerce-admin/client/layout/index.js +++ b/plugins/woocommerce-admin/client/layout/index.js @@ -17,7 +17,10 @@ import { Children, cloneElement } from 'react'; import PropTypes from 'prop-types'; import { get, isFunction, identity, memoize } from 'lodash'; import { parse } from 'qs'; -import { triggerExitPageCesSurvey } from '@woocommerce/customer-effort-score'; +import { + CustomerEffortScoreModalContainer, + triggerExitPageCesSurvey, +} from '@woocommerce/customer-effort-score'; import { getHistory, getQuery } from '@woocommerce/navigation'; import { PLUGINS_STORE_NAME, @@ -38,7 +41,6 @@ import { Header } from '../header'; import { Footer } from './footer'; import Notices from './notices'; import TransientNotices from './transient-notices'; -import { CustomerEffortScoreModalContainer } from '../customer-effort-score-tracks'; import { getAdminSetting } from '~/utils/admin-settings'; import '~/activity-panel'; import '~/mobile-banner'; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.scss b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.scss similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.scss rename to plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.scss diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx rename to plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.test.tsx diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/CreateNewCampaignModal.tsx rename to plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/CreateNewCampaignModal.tsx diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/index.ts b/plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/index.ts similarity index 100% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/CreateNewCampaignModal/index.ts rename to plugins/woocommerce-admin/client/marketing/components/CreateNewCampaignModal/index.ts diff --git a/plugins/woocommerce-admin/client/marketing/components/index.js b/plugins/woocommerce-admin/client/marketing/components/index.js index dc971c75160..5d1c1014754 100644 --- a/plugins/woocommerce-admin/client/marketing/components/index.js +++ b/plugins/woocommerce-admin/client/marketing/components/index.js @@ -8,3 +8,4 @@ export { PluginCardBody, SmartPluginCardBody } from './PluginCardBody'; export { CardHeaderTitle } from './CardHeaderTitle'; export { CardHeaderDescription } from './CardHeaderDescription'; export { CenteredSpinner } from './CenteredSpinner'; +export { CreateNewCampaignModal } from './CreateNewCampaignModal'; diff --git a/plugins/woocommerce-admin/client/marketing/hooks/index.ts b/plugins/woocommerce-admin/client/marketing/hooks/index.ts index a61a1a28ec7..6a6b6e6f971 100644 --- a/plugins/woocommerce-admin/client/marketing/hooks/index.ts +++ b/plugins/woocommerce-admin/client/marketing/hooks/index.ts @@ -1,4 +1,6 @@ -export { useInstalledPlugins } from './useInstalledPlugins'; +export { useIntroductionBanner } from './useIntroductionBanner'; +export { useInstalledPluginsWithoutChannels } from './useInstalledPluginsWithoutChannels'; 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 92% rename from plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/useCampaigns.ts rename to plugins/woocommerce-admin/client/marketing/hooks/useCampaigns.ts index 01765b61b62..6b1672142b6 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/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( diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts deleted file mode 100644 index 88c39ac3e68..00000000000 --- a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPlugins.ts +++ /dev/null @@ -1,41 +0,0 @@ -/** - * External dependencies - */ -import { useSelect, useDispatch } from '@wordpress/data'; - -/** - * Internal dependencies - */ -import { STORE_KEY } from '~/marketing/data/constants'; -import { InstalledPlugin } from '~/marketing/types'; - -export type UseInstalledPlugins = { - installedPlugins: InstalledPlugin[]; - activatingPlugins: string[]; - activateInstalledPlugin: ( slug: string ) => void; - loadInstalledPluginsAfterActivation: ( slug: string ) => void; -}; - -/** - * 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 ); - - return { - installedPlugins: getInstalledPlugins(), - activatingPlugins: getActivatingPlugins(), - }; - }, [] ); - const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } = - useDispatch( STORE_KEY ); - - return { - installedPlugins, - activatingPlugins, - activateInstalledPlugin, - loadInstalledPluginsAfterActivation, - }; -}; diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPluginsWithoutChannels.ts b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPluginsWithoutChannels.ts new file mode 100644 index 00000000000..6605c900d6e --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/hooks/useInstalledPluginsWithoutChannels.ts @@ -0,0 +1,72 @@ +/** + * 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 UseInstalledPluginsWithoutChannels = { + data: InstalledPlugin[]; + activatingPlugins: string[]; + activateInstalledPlugin: ( slug: string ) => void; + loadInstalledPluginsAfterActivation: ( slug: string ) => void; +}; + +/** + * Hook to return plugins and methods for "Installed extensions" card. + * The list of installed plugins does not include registered and recommended marketing channels. + */ +export const useInstalledPluginsWithoutChannels = + (): UseInstalledPluginsWithoutChannels => { + const { installedPlugins, activatingPlugins } = useSelect( + ( select ) => { + const { getInstalledPlugins, getActivatingPlugins } = + select( STORE_KEY ); + + return { + installedPlugins: + getInstalledPlugins< InstalledPlugin[] >(), + activatingPlugins: getActivatingPlugins(), + }; + }, + [] + ); + + const { + loading: loadingRegisteredChannels, + data: dataRegisteredChannels, + } = useRegisteredChannels(); + const { + loading: loadingRecommendedChannels, + data: dataRecommendedChannels, + } = useRecommendedChannels(); + + const { activateInstalledPlugin, loadInstalledPluginsAfterActivation } = + useDispatch( STORE_KEY ); + + const loading = loadingRegisteredChannels || loadingRecommendedChannels; + const installedPluginsWithoutChannels = chain( installedPlugins ) + .differenceWith( + dataRegisteredChannels || [], + ( a, b ) => a.slug === b.slug + ) + .differenceWith( + dataRecommendedChannels || [], + ( a, b ) => a.slug === b.product + ) + .value(); + + return { + data: loading ? [] : installedPluginsWithoutChannels, + activatingPlugins, + activateInstalledPlugin, + loadInstalledPluginsAfterActivation, + }; + }; diff --git a/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts new file mode 100644 index 00000000000..0eebcb471a1 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/hooks/useIntroductionBanner.ts @@ -0,0 +1,45 @@ +/** + * External dependencies + */ +import { useDispatch, useSelect } from '@wordpress/data'; +import { OPTIONS_STORE_NAME } from '@woocommerce/data'; +import { recordEvent } from '@woocommerce/tracks'; + +type UseIntroductionBanner = { + loading: boolean; + isIntroductionBannerDismissed: boolean; + dismissIntroductionBanner: () => void; +}; + +const OPTION_NAME_BANNER_DISMISSED = + 'woocommerce_marketing_overview_multichannel_banner_dismissed'; +const OPTION_VALUE_YES = 'yes'; + +export const useIntroductionBanner = (): UseIntroductionBanner => { + const { updateOptions } = useDispatch( OPTIONS_STORE_NAME ); + + const dismissIntroductionBanner = () => { + updateOptions( { + [ OPTION_NAME_BANNER_DISMISSED ]: OPTION_VALUE_YES, + } ); + recordEvent( 'marketing_multichannel_banner_dismissed', {} ); + }; + + const { loading, data } = useSelect( ( select ) => { + const { getOption, hasFinishedResolution } = + select( OPTIONS_STORE_NAME ); + + return { + loading: ! hasFinishedResolution( 'getOption', [ + OPTION_NAME_BANNER_DISMISSED, + ] ), + data: getOption( OPTION_NAME_BANNER_DISMISSED ), + }; + }, [] ); + + return { + loading, + isIntroductionBannerDismissed: data === OPTION_VALUE_YES, + dismissIntroductionBanner, + }; +}; 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 66513850819..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,21 +7,23 @@ 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(), } ) ); -jest.mock( './CreateNewCampaignModal', () => ( { - CreateNewCampaignModal: () =>
Mocked CreateNewCampaignModal
, -} ) ); +jest.mock( '~/marketing/components', () => { + const originalModule = jest.requireActual( '~/marketing/components' ); + + return { + __esModule: true, + ...originalModule, + CreateNewCampaignModal: () =>
Mocked CreateNewCampaignModal
, + }; +} ); /** * Create a test campaign data object. 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 2861c79a5d9..d3fdcf71bca 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/Campaigns/Campaigns.tsx @@ -24,9 +24,11 @@ import { /** * Internal dependencies */ -import { CardHeaderTitle } from '~/marketing/components'; -import { useCampaigns } from './useCampaigns'; -import { CreateNewCampaignModal } from './CreateNewCampaignModal'; +import { + CardHeaderTitle, + CreateNewCampaignModal, +} from '~/marketing/components'; +import { useCampaigns } from '~/marketing/hooks'; import './Campaigns.scss'; const tableCaption = __( 'Campaigns', 'woocommerce' ); 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 3d3f7ddc6ea..bd6e0563d36 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, @@ -32,72 +38,97 @@ type ChannelsProps = { onInstalledAndActivated?: ( pluginSlug: string ) => void; }; -export const Channels: React.FC< ChannelsProps > = ( { - 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( { + block: 'center', + } ); + }, + } ), + [] + ); + + 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/DiscoverTools/DiscoverTools.test.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.test.tsx index 568b353147f..18ada3a3c24 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,8 +6,7 @@ import { render, screen } from '@testing-library/react'; /** * Internal dependencies */ -import { useInstalledPlugins } from '../../hooks'; -import { useRecommendedPlugins } from './useRecommendedPlugins'; +import { useRecommendedPluginsWithoutChannels } from './useRecommendedPluginsWithoutChannels'; import { DiscoverTools } from './DiscoverTools'; jest.mock( '@woocommerce/components', () => { @@ -20,23 +19,20 @@ jest.mock( '@woocommerce/components', () => { }; } ); -jest.mock( './useRecommendedPlugins', () => ( { - useRecommendedPlugins: jest.fn(), +jest.mock( './useRecommendedPluginsWithoutChannels', () => ( { + useRecommendedPluginsWithoutChannels: jest.fn(), } ) ); -jest.mock( '../../hooks', () => ( { - useInstalledPlugins: jest.fn(), +jest.mock( '~/marketing/hooks', () => ( { + useInstalledPluginsWithoutChannels: jest.fn( () => ( {} ) ), } ) ); describe( 'DiscoverTools component', () => { it( 'should render a Spinner when loading is in progress', () => { - ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + ( useRecommendedPluginsWithoutChannels as jest.Mock ).mockReturnValue( { isInitializing: true, isLoading: true, - plugins: [], - } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), + data: [], } ); render( ); @@ -44,13 +40,10 @@ describe( 'DiscoverTools component', () => { } ); it( 'should render message and link when loading is finish and there are no plugins', () => { - ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + ( useRecommendedPluginsWithoutChannels as jest.Mock ).mockReturnValue( { isInitializing: false, isLoading: false, - plugins: [], - } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), + data: [], } ); render( ); @@ -66,10 +59,12 @@ describe( 'DiscoverTools component', () => { describe( 'With plugins loaded', () => { it( 'should render `direct_install: true` plugins with "Install plugin" button', () => { - ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + ( + useRecommendedPluginsWithoutChannels as jest.Mock + ).mockReturnValue( { isInitializing: false, isLoading: false, - plugins: [ + data: [ { title: 'Google Listings and Ads', description: @@ -95,9 +90,6 @@ describe( 'DiscoverTools component', () => { }, ], } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), - } ); render( ); // Assert that we have the "Sales channels" tab, the plugin name, the "Built by WooCommerce" pill, and the "Install plugin" button. @@ -112,10 +104,12 @@ describe( 'DiscoverTools component', () => { } ); it( 'should render `direct_install: false` plugins with "View details" button', () => { - ( useRecommendedPlugins as jest.Mock ).mockReturnValue( { + ( + useRecommendedPluginsWithoutChannels as jest.Mock + ).mockReturnValue( { isInitializing: false, isLoading: false, - plugins: [ + data: [ { title: 'WooCommerce Zapier', description: @@ -136,9 +130,6 @@ describe( 'DiscoverTools component', () => { }, ], } ); - ( useInstalledPlugins as jest.Mock ).mockReturnValue( { - loadInstalledPluginsAfterActivation: jest.fn(), - } ); render( ); // Assert that we have the CRM tab, plugin name, and "View details" button. 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 a116640fbe0..bfade3d9f0d 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/DiscoverTools.tsx @@ -14,13 +14,13 @@ import { CardBody, CenteredSpinner, } from '~/marketing/components'; -import { useRecommendedPlugins } from './useRecommendedPlugins'; +import { useRecommendedPluginsWithoutChannels } from './useRecommendedPluginsWithoutChannels'; import { PluginsTabPanel } from './PluginsTabPanel'; import './DiscoverTools.scss'; export const DiscoverTools = () => { - const { isInitializing, isLoading, plugins, installAndActivate } = - useRecommendedPlugins(); + const { isInitializing, isLoading, data, installAndActivate } = + useRecommendedPluginsWithoutChannels(); /** * Renders card body. @@ -38,7 +38,7 @@ export const DiscoverTools = () => { ); } - if ( plugins.length === 0 ) { + if ( data.length === 0 ) { return ( @@ -66,7 +66,7 @@ export const DiscoverTools = () => { return ( 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..902bbc8a02e 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 { useInstalledPluginsWithoutChannels } from '~/marketing/hooks'; import { RecommendedPlugin } from '~/marketing/types'; import { getInAppPurchaseUrl } from '~/lib/in-app-purchase'; import { createNoticesFromResponse } from '~/lib/notices'; @@ -60,7 +60,8 @@ export const PluginsTabPanel = ( { null ); const { installAndActivatePlugins } = useDispatch( PLUGINS_STORE_NAME ); - const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); + const { loadInstalledPluginsAfterActivation } = + useInstalledPluginsWithoutChannels(); /** * Install and activate a plugin. diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts deleted file mode 100644 index e8865fd4888..00000000000 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPlugins.ts +++ /dev/null @@ -1,38 +0,0 @@ -/** - * External dependencies - */ -import { useSelect, useDispatch } from '@wordpress/data'; - -/** - * Internal dependencies - */ -import { STORE_KEY } from '~/marketing/data/constants'; -import { RecommendedPlugin } from '~/marketing/types'; - -const selector = 'getRecommendedPlugins'; -const category = 'marketing'; - -export const useRecommendedPlugins = () => { - const { invalidateResolution, installAndActivateRecommendedPlugin } = - useDispatch( STORE_KEY ); - - const installAndActivate = ( plugin: string ) => { - installAndActivateRecommendedPlugin( plugin, category ); - invalidateResolution( selector, [ category ] ); - }; - - return 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, - }; - }, [] ); -}; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPluginsWithoutChannels.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPluginsWithoutChannels.ts new file mode 100644 index 00000000000..ef10efb9e8d --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/DiscoverTools/useRecommendedPluginsWithoutChannels.ts @@ -0,0 +1,92 @@ +/** + * 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'; + +type UseRecommendedPluginsWithoutChannels = { + /** + * Boolean indicating whether it is initializing. + */ + isInitializing: boolean; + + /** + * Boolean indicating whether it is loading. + * + * This will be true when data is being refetched + * after `invalidateResolution` is called in the `installAndActivate` method. + */ + isLoading: boolean; + + /** + * An array of recommended marketing plugins without marketing channels. + */ + data: RecommendedPlugin[]; + + /** + * Install and activate a plugin. + */ + installAndActivate: ( slug: string ) => void; +}; + +const selector = 'getRecommendedPlugins'; +const category = 'marketing'; + +/** + * A hook to return a list of recommended plugins without marketing channels, + * and related methods, to be used with the `DiscoverTools` component. + */ +export const useRecommendedPluginsWithoutChannels = + (): UseRecommendedPluginsWithoutChannels => { + const { + loading: loadingRecommendedPlugins, + data: dataRecommendedPlugins, + } = useSelect( ( select ) => { + const { getRecommendedPlugins, hasFinishedResolution } = + select( STORE_KEY ); + + return { + loading: ! hasFinishedResolution( selector, [ category ] ), + data: getRecommendedPlugins< RecommendedPlugin[] >( category ), + }; + }, [] ); + + const { + loading: loadingRecommendedChannels, + data: dataRecommendedChannels, + } = useRecommendedChannels(); + + const { invalidateResolution, installAndActivateRecommendedPlugin } = + useDispatch( STORE_KEY ); + + const isInitializing = + ( loadingRecommendedPlugins && ! dataRecommendedPlugins.length ) || + ( loadingRecommendedChannels && ! dataRecommendedChannels ); + + const loading = loadingRecommendedPlugins || loadingRecommendedChannels; + + const recommendedPluginsWithoutChannels = differenceWith( + dataRecommendedPlugins, + dataRecommendedChannels || [], + ( a, b ) => a.product === b.product + ); + + const installAndActivate = ( slug: string ) => { + installAndActivateRecommendedPlugin( slug, category ); + invalidateResolution( selector, [ category ] ); + }; + + return { + isInitializing, + isLoading: loading, + data: isInitializing ? [] : recommendedPluginsWithoutChannels, + 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 f445fa7a69b..cee200843c2 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,13 @@ import { PluginCardBody, } from '~/marketing/components'; import { InstalledPlugin } from '~/marketing/types'; -import { useInstalledPlugins } from '~/marketing/hooks'; +import { useInstalledPluginsWithoutChannels } from '~/marketing/hooks'; export const InstalledExtensions = () => { - const { installedPlugins, activatingPlugins, activateInstalledPlugin } = - useInstalledPlugins(); + const { data, activatingPlugins, activateInstalledPlugin } = + useInstalledPluginsWithoutChannels(); - if ( installedPlugins.length === 0 ) { + if ( data.length === 0 ) { return null; } @@ -81,7 +81,7 @@ export const InstalledExtensions = () => { return ( - { installedPlugins.map( ( el, idx ) => { + { data.map( ( el, idx ) => { return ( { description={ el.description } button={ getButton( el ) } /> - { idx !== installedPlugins.length - 1 && ( - - ) } + { idx !== data.length - 1 && } ); } ) } diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss new file mode 100644 index 00000000000..99ac6dc8ad4 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.scss @@ -0,0 +1,54 @@ +.woocommerce-marketing-introduction-banner { + & > div { + display: flex; + flex-wrap: wrap; + } + + .woocommerce-marketing-introduction-banner-content { + flex: 1 0; + margin: 32px 20px 32px 40px; + + .woocommerce-marketing-introduction-banner-title { + font-size: 20px; + line-height: 28px; + margin-bottom: $gap-smaller; + } + + .woocommerce-marketing-introduction-banner-features { + color: $gray-700; + + svg { + fill: $studio-woocommerce-purple-50; + } + } + + .woocommerce-marketing-introduction-banner-buttons { + margin-top: $gap; + } + } + + .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%), + 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; + top: $gap-small; + right: $gap; + padding: 0; + } + + img { + display: block; + width: 100%; + height: 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 new file mode 100644 index 00000000000..829152f03dd --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/IntroductionBanner.tsx @@ -0,0 +1,152 @@ +/** + * External dependencies + */ +import { __ } from '@wordpress/i18n'; +import { useState } from '@wordpress/element'; +import { Card, Flex, FlexItem, FlexBlock, Button } from '@wordpress/components'; +import { Icon, trendingUp, megaphone, closeSmall } from '@wordpress/icons'; + +/** + * Internal dependencies + */ +import { CreateNewCampaignModal } from '~/marketing/components'; +import { + useRegisteredChannels, + useRecommendedChannels, +} from '~/marketing/hooks'; +import './IntroductionBanner.scss'; +import wooIconUrl from './woo.svg'; +import illustrationUrl from './illustration.svg'; + +type IntroductionBannerProps = { + onDismissClick: () => void; + onAddChannelsClick: () => void; +}; + +export const IntroductionBanner = ( { + onDismissClick, + onAddChannelsClick, +}: IntroductionBannerProps ) => { + const [ isModalOpen, setModalOpen ] = useState( false ); + const { data: dataRegistered } = useRegisteredChannels(); + const { data: dataRecommended } = useRecommendedChannels(); + + const showCreateCampaignButton = !! dataRegistered?.length; + + /** + * Boolean to display the "Add channels" button in the introduction banner. + * + * This depends on the number of registered channels, + * because if there are no registered channels, + * the Channels card will not have the "Add channels" toggle button, + * and it does not make sense to display the "Add channels" button in this introduction banner + * that will do nothing upon click. + * + * If there are registered channels and recommended channels, + * the Channels card will display the "Add channels" toggle button, + * and clicking on the "Add channels" button in this introduction banner + * will scroll to the button in Channels card. + */ + const showAddChannelsButton = + !! dataRegistered?.length && !! dataRecommended?.length; + + return ( + +
+
+ { __( + 'Reach new customers and increase sales without leaving WooCommerce', + 'woocommerce' + ) } +
+ + + + + + { __( + 'Reach customers on other sales channels', + 'woocommerce' + ) } + + + + + + + + { __( + 'Advertise with marketing campaigns', + 'woocommerce' + ) } + + + + + + { + + { __( 'Built by WooCommerce', 'woocommerce' ) } + + + + + { ( showCreateCampaignButton || showAddChannelsButton ) && ( + + { showCreateCampaignButton && ( + + ) } + { showAddChannelsButton && ( + + ) } + + ) } + { isModalOpen && ( + setModalOpen( false ) } + /> + ) } +
+
+ +
+
+ + ); +}; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg new file mode 100644 index 00000000000..3a00d63416c --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/illustration.svg @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/index.ts b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/index.ts new file mode 100644 index 00000000000..8ae35a6ca33 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/index.ts @@ -0,0 +1 @@ +export { IntroductionBanner } from './IntroductionBanner'; diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/woo.svg b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/woo.svg new file mode 100644 index 00000000000..fb4a4205043 --- /dev/null +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/IntroductionBanner/woo.svg @@ -0,0 +1,15 @@ + + +WooCommerce Logo + + + +image/svg+xml + + + + + + + + diff --git a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx index 54f01596ca6..da01976d796 100644 --- a/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx +++ b/plugins/woocommerce-admin/client/marketing/overview-multichannel/MarketingOverviewMultichannel.tsx @@ -1,6 +1,7 @@ /** * External dependencies */ +import { useRef } from '@wordpress/element'; import { useUser } from '@woocommerce/data'; /** @@ -10,20 +11,29 @@ import '~/marketing/data'; import '~/marketing/data-multichannel'; import { CenteredSpinner } from '~/marketing/components'; import { + useIntroductionBanner, + useCampaigns, useRegisteredChannels, useRecommendedChannels, useCampaignTypes, useInstalledPlugins, } from '~/marketing/hooks'; 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'; import './MarketingOverviewMultichannel.scss'; export const MarketingOverviewMultichannel: React.FC = () => { + const { + loading: loadingIntroductionBanner, + isIntroductionBannerDismissed, + dismissIntroductionBanner, + } = useIntroductionBanner(); + const { loading: loadingCampaigns, meta: metaCampaigns } = useCampaigns(); const { loading: loadingCampaignTypes, data: dataCampaignTypes, @@ -38,8 +48,11 @@ export const MarketingOverviewMultichannel: React.FC = () => { useRecommendedChannels(); const { loadInstalledPluginsAfterActivation } = useInstalledPlugins(); const { currentUserCan } = useUser(); + const channelsRef = useRef< ChannelsRef >( null ); if ( + loadingIntroductionBanner || + ( loadingCampaigns && metaCampaigns?.total === undefined ) || ( loadingCampaignTypes && ! dataCampaignTypes ) || ( loadingRegistered && ! dataRegistered ) || ( loadingRecommended && ! dataRecommended ) @@ -47,6 +60,11 @@ export const MarketingOverviewMultichannel: React.FC = () => { return ; } + const shouldShowCampaigns = !! ( + dataRegistered?.length && + ( isIntroductionBannerDismissed || metaCampaigns?.total ) + ); + const shouldShowExtensions = getAdminSetting( 'allowMarketplaceSuggestions', false ) && currentUserCan( 'install_plugins' ); @@ -59,10 +77,19 @@ export const MarketingOverviewMultichannel: React.FC = () => { return (
- { !! dataRegistered?.length && } + { ! isIntroductionBannerDismissed && ( + { + channelsRef.current?.scrollIntoAddChannels(); + } } + /> + ) } + { shouldShowCampaigns && } { !! ( dataRegistered && dataRecommended ) && !! ( dataRegistered.length || dataRecommended.length ) && ( ( + undefined + ); + + useEffect( () => { + const getRecordPromise: Promise< Product > = productId + ? resolveSelect( 'core' ).getEntityRecord< Product >( + 'postType', + 'product', + Number.parseInt( productId, 10 ) + ) + : // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore Incorrect types. + ( saveEntityRecord( 'postType', 'product', { + title: AUTO_DRAFT_NAME, + status: 'auto-draft', + } ) as Promise< Product > ); + getRecordPromise + .then( ( autoDraftProduct: Product ) => { + setProduct( autoDraftProduct ); + } ) + .catch( ( e ) => { + setProduct( undefined ); + throw e; + } ); + }, [ productId ] ); + + return product; +} 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..f24be5be5e1 --- /dev/null +++ b/plugins/woocommerce-admin/client/products/product-block-page.scss @@ -0,0 +1,66 @@ +.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; + } + } + + .components-summary-control { + width: 100%; + min-height: calc($gap-larger * 3); + background-color: $white; + box-sizing: border-box; + border: 1px solid #757575; + border-radius: 2px; + padding: $gap-smaller; + margin: 0; + appearance: textarea; + resize: vertical; + overflow: hidden; + + &:focus { + box-shadow: inset 0 0 0 1px var(--wp-admin-theme-color-darker-10, --wp-admin-theme-color); + border-color: var(--wp-admin-theme-color-darker-10, --wp-admin-theme-color); + } + } + + .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..ed004455594 100644 --- a/plugins/woocommerce-admin/client/products/product-page.tsx +++ b/plugins/woocommerce-admin/client/products/product-page.tsx @@ -3,25 +3,27 @@ */ 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'; -import { useEffect, useState } from '@wordpress/element'; + import { Spinner } from '@wordpress/components'; import { useParams } from 'react-router-dom'; /** * Internal dependencies */ +import { useProductEntityRecord } from './hooks/use-product-entity-record'; + import './product-page.scss'; +import './product-block-page.scss'; declare const productBlockEditorSettings: ProductEditorSettings; -const ProductEditor: React.FC< { product: Product | undefined } > = ( { - product, -} ) => { +export default function ProductPage() { + const { productId } = useParams(); + + const product = useProductEntityRecord( productId ); + if ( ! product?.id ) { return ; } @@ -32,57 +34,4 @@ const ProductEditor: React.FC< { product: Product | undefined } > = ( { settings={ productBlockEditorSettings || {} } /> ); -}; - -const EditProductEditor: React.FC< { productId: number } > = ( { - productId, -} ) => { - const { product } = useSelect( - ( select: typeof WPSelect ) => { - const { getEntityRecord } = select( 'core' ); - - return { - product: getEntityRecord( - 'postType', - 'product', - productId - ) as 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() { - const { productId } = useParams(); - - if ( productId ) { - return ( - - ); - } - - return ; } 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-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-admin/client/two-column-tasks/completed-header.tsx b/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx index 91e7623b723..a3e94b33d2c 100644 --- a/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx +++ b/plugins/woocommerce-admin/client/two-column-tasks/completed-header.tsx @@ -10,8 +10,11 @@ import { OPTIONS_STORE_NAME, WCDataSelector, WEEK } from '@woocommerce/data'; import { Button, Card, CardHeader } from '@wordpress/components'; import { Text } from '@woocommerce/experimental'; import { + ADMIN_INSTALL_TIMESTAMP_OPTION_NAME, + ALLOW_TRACKING_OPTION_NAME, CustomerFeedbackModal, CustomerFeedbackSimple, + SHOWN_FOR_ACTIONS_OPTION_NAME, } from '@woocommerce/customer-effort-score'; import { __ } from '@wordpress/i18n'; @@ -27,11 +30,7 @@ type TaskListCompletedHeaderProps = { customerEffortScore: boolean; }; -const ADMIN_INSTALL_TIMESTAMP_OPTION_NAME = - 'woocommerce_admin_install_timestamp'; -const SHOWN_FOR_ACTIONS_OPTION_NAME = 'woocommerce_ces_shown_for_actions'; const CUSTOMER_EFFORT_SCORE_ACTION = 'store_setup'; -const ALLOW_TRACKING_OPTION_NAME = 'woocommerce_allow_tracking'; function getStoreAgeInWeeks( adminInstallTimestamp: number ) { if ( adminInstallTimestamp === 0 ) { 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/36257-redux b/plugins/woocommerce/changelog/36257-redux deleted file mode 100644 index 84a77791f36..00000000000 --- a/plugins/woocommerce/changelog/36257-redux +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Allow sorting by menu_order in products widget. diff --git a/plugins/woocommerce/changelog/add-35851-tree-control-selection b/plugins/woocommerce/changelog/add-35851-tree-control-selection deleted file mode 100644 index 8ec6ebea260..00000000000 --- a/plugins/woocommerce/changelog/add-35851-tree-control-selection +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix unit test snapshots due to a dependency version change diff --git a/plugins/woocommerce/changelog/add-36413-support-for-cart-checkout-in-declare-compatibility b/plugins/woocommerce/changelog/add-36413-support-for-cart-checkout-in-declare-compatibility deleted file mode 100644 index 7724faa14f5..00000000000 --- a/plugins/woocommerce/changelog/add-36413-support-for-cart-checkout-in-declare-compatibility +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: enhancement - -Add the support for the C&C Blocks in declaring compatibility feature diff --git a/plugins/woocommerce/changelog/add-36661_existing_attribute_layout b/plugins/woocommerce/changelog/add-36661_existing_attribute_layout deleted file mode 100644 index 7ea6d84a2e2..00000000000 --- a/plugins/woocommerce/changelog/add-36661_existing_attribute_layout +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Add existing global attribute layout #36944 diff --git a/plugins/woocommerce/changelog/add-36991 b/plugins/woocommerce/changelog/add-36991 deleted file mode 100644 index 710c3b98efc..00000000000 --- a/plugins/woocommerce/changelog/add-36991 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Create editor skeleton on add/edit product pages diff --git a/plugins/woocommerce/changelog/add-37005 b/plugins/woocommerce/changelog/add-37005 deleted file mode 100644 index 3b84f6b28ff..00000000000 --- a/plugins/woocommerce/changelog/add-37005 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: tweak - -Add productId dependency when getting the product by id in ProductPage diff --git a/plugins/woocommerce/changelog/add-37096 b/plugins/woocommerce/changelog/add-37096 deleted file mode 100644 index 9644a87c81e..00000000000 --- a/plugins/woocommerce/changelog/add-37096 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Add tabs and sections placeholders in product blocks template diff --git a/plugins/woocommerce/changelog/add-37103 b/plugins/woocommerce/changelog/add-37103 new file mode 100644 index 00000000000..b555a67c8ae --- /dev/null +++ b/plugins/woocommerce/changelog/add-37103 @@ -0,0 +1,4 @@ +Significance: minor +Type: add + +Add summary block diff --git a/plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings b/plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings deleted file mode 100644 index 8bf592e2794..00000000000 --- a/plugins/woocommerce/changelog/add-37120_hydrate_product_editor_settings +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add productBlockEditorSettings script to be used for the Product Block Editor. diff --git a/plugins/woocommerce/changelog/add-37128 b/plugins/woocommerce/changelog/add-37128 deleted file mode 100644 index ad668d22778..00000000000 --- a/plugins/woocommerce/changelog/add-37128 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add new feature flag for the product edit blocks experience diff --git a/plugins/woocommerce/changelog/add-admin-layout-package b/plugins/woocommerce/changelog/add-admin-layout-package deleted file mode 100644 index ec1bd147634..00000000000 --- a/plugins/woocommerce/changelog/add-admin-layout-package +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Add @woocommerce/admin-layout package. diff --git a/plugins/woocommerce/changelog/add-encoding-selector-to-product-importer b/plugins/woocommerce/changelog/add-encoding-selector-to-product-importer deleted file mode 100644 index 7d2631b3da9..00000000000 --- a/plugins/woocommerce/changelog/add-encoding-selector-to-product-importer +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add an encoding selector to the product importer diff --git a/plugins/woocommerce/changelog/add-initial-product-draft-37003 b/plugins/woocommerce/changelog/add-initial-product-draft-37003 deleted file mode 100644 index 5ac217f5914..00000000000 --- a/plugins/woocommerce/changelog/add-initial-product-draft-37003 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Creating product entity in auto-draft status, and adding support for retrieving preexisting products. diff --git a/plugins/woocommerce/changelog/add-k6-regression-test b/plugins/woocommerce/changelog/add-k6-regression-test deleted file mode 100644 index bec84721135..00000000000 --- a/plugins/woocommerce/changelog/add-k6-regression-test +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: add -Comment: Perf test not included in release - - diff --git a/plugins/woocommerce/changelog/add-marketing-trackers b/plugins/woocommerce/changelog/add-marketing-trackers deleted file mode 100644 index 44debd914aa..00000000000 --- a/plugins/woocommerce/changelog/add-marketing-trackers +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: add - -Add marketplace suggestions and multichannel marketing information to WC Tracker. diff --git a/plugins/woocommerce/changelog/add-name-block-37007 b/plugins/woocommerce/changelog/add-name-block-37007 deleted file mode 100644 index 8785c8ec87c..00000000000 --- a/plugins/woocommerce/changelog/add-name-block-37007 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Update template of product type to include product name block. diff --git a/plugins/woocommerce/changelog/add-new-countries-for-wcpay b/plugins/woocommerce/changelog/add-new-countries-for-wcpay deleted file mode 100644 index 31484387070..00000000000 --- a/plugins/woocommerce/changelog/add-new-countries-for-wcpay +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add support for new countries in WCPay diff --git a/plugins/woocommerce/changelog/add-new-product-editor-e2e b/plugins/woocommerce/changelog/add-new-product-editor-e2e deleted file mode 100644 index 04695b5933f..00000000000 --- a/plugins/woocommerce/changelog/add-new-product-editor-e2e +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Initial e2e tests for new product editor. diff --git a/plugins/woocommerce/changelog/add-order_cache b/plugins/woocommerce/changelog/add-order_cache deleted file mode 100644 index 1b800aff214..00000000000 --- a/plugins/woocommerce/changelog/add-order_cache +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add a cache for orders, to use when custom order tables are enabled diff --git a/plugins/woocommerce/changelog/add-payment-recommendations-images b/plugins/woocommerce/changelog/add-payment-recommendations-images deleted file mode 100644 index 69dce25d360..00000000000 --- a/plugins/woocommerce/changelog/add-payment-recommendations-images +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Added images support for the payment recommendations transaction processors diff --git a/plugins/woocommerce/changelog/add-product-inventory-tracks b/plugins/woocommerce/changelog/add-product-inventory-tracks deleted file mode 100644 index 3b17caa8cdd..00000000000 --- a/plugins/woocommerce/changelog/add-product-inventory-tracks +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: tweak - -Add Tracks events for product inventory tab interactions. diff --git a/plugins/woocommerce/changelog/add-tracking-for-loca-pickup b/plugins/woocommerce/changelog/add-tracking-for-loca-pickup deleted file mode 100644 index 20ccbdbeb1f..00000000000 --- a/plugins/woocommerce/changelog/add-tracking-for-loca-pickup +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: tweak - -Add tracking for local pickup method in Checkout diff --git a/plugins/woocommerce/changelog/add-turn-get-tax-location-public b/plugins/woocommerce/changelog/add-turn-get-tax-location-public deleted file mode 100644 index c15b487c25d..00000000000 --- a/plugins/woocommerce/changelog/add-turn-get-tax-location-public +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Make WC_Order::get_tax_location accessible publicly through a wrapper function. diff --git a/plugins/woocommerce/changelog/dev-37117_set_default_quantity_value b/plugins/woocommerce/changelog/dev-37117_set_default_quantity_value new file mode 100644 index 00000000000..131462c4f1d --- /dev/null +++ b/plugins/woocommerce/changelog/dev-37117_set_default_quantity_value @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Set quantity value when stock tracking is enabled diff --git a/plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products b/plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products deleted file mode 100644 index 859ac60349f..00000000000 --- a/plugins/woocommerce/changelog/dev-37119_show_message_for_variable_products +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Show a message for variable products diff --git a/plugins/woocommerce/changelog/dev-clean-analytics-classes b/plugins/woocommerce/changelog/dev-clean-analytics-classes deleted file mode 100644 index fdd8860a366..00000000000 --- a/plugins/woocommerce/changelog/dev-clean-analytics-classes +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: dev -Comment: This is just a dev maintenance, removing duplicated code. - - diff --git a/plugins/woocommerce/changelog/dev-pin-wp-deps-6 b/plugins/woocommerce/changelog/dev-pin-wp-deps-6 deleted file mode 100644 index 551e0919dac..00000000000 --- a/plugins/woocommerce/changelog/dev-pin-wp-deps-6 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Sync @wordpress package versions via syncpack. diff --git a/plugins/woocommerce/changelog/dev-react-fast-fresh b/plugins/woocommerce/changelog/dev-react-fast-fresh deleted file mode 100644 index 7c523caf634..00000000000 --- a/plugins/woocommerce/changelog/dev-react-fast-fresh +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Set up React Fast Refresh in woocommerce-admin diff --git a/plugins/woocommerce/changelog/dev-update-eslint-plugin b/plugins/woocommerce/changelog/dev-update-eslint-plugin deleted file mode 100644 index 47894ec9c6c..00000000000 --- a/plugins/woocommerce/changelog/dev-update-eslint-plugin +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Fix lint issues diff --git a/plugins/woocommerce/changelog/dev-update-webpack-config b/plugins/woocommerce/changelog/dev-update-webpack-config deleted file mode 100644 index d2f975eba32..00000000000 --- a/plugins/woocommerce/changelog/dev-update-webpack-config +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: dev -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. - - diff --git a/plugins/woocommerce/changelog/e2e-fix-daily-k6-workflow-env-var b/plugins/woocommerce/changelog/e2e-fix-daily-k6-workflow-env-var deleted file mode 100644 index 65522dd597d..00000000000 --- a/plugins/woocommerce/changelog/e2e-fix-daily-k6-workflow-env-var +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: dev - -Fix the value of `UPDATE_WC` environment variable in the daily k6 performance tests. 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/changelog/e2e-release-include-drafts b/plugins/woocommerce/changelog/e2e-release-include-drafts deleted file mode 100644 index a2a4d56118d..00000000000 --- a/plugins/woocommerce/changelog/e2e-release-include-drafts +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: dev - -Support E2E testing of draft releases. diff --git a/plugins/woocommerce/changelog/e2e-trunk-merge b/plugins/woocommerce/changelog/e2e-trunk-merge new file mode 100644 index 00000000000..0ada563b534 --- /dev/null +++ b/plugins/woocommerce/changelog/e2e-trunk-merge @@ -0,0 +1,4 @@ +Significance: patch +Type: dev + +Run E2E tests on PR merge to trunk. diff --git a/plugins/woocommerce/changelog/e2e-update-release-e2e-testing b/plugins/woocommerce/changelog/e2e-update-release-e2e-testing deleted file mode 100644 index 6f907635c94..00000000000 --- a/plugins/woocommerce/changelog/e2e-update-release-e2e-testing +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Updates automated release testing workflow to use Playwright diff --git a/plugins/woocommerce/changelog/feature-34905-marketing-campaigns-card b/plugins/woocommerce/changelog/feature-34905-marketing-campaigns-card deleted file mode 100644 index d578a5a71e9..00000000000 --- a/plugins/woocommerce/changelog/feature-34905-marketing-campaigns-card +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add Campaigns card into Multichannel Marketing page. 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. diff --git a/plugins/woocommerce/changelog/feature-34909-marketing-create-campaign-modal b/plugins/woocommerce/changelog/feature-34909-marketing-create-campaign-modal deleted file mode 100644 index 00be5a2596f..00000000000 --- a/plugins/woocommerce/changelog/feature-34909-marketing-create-campaign-modal +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Add "Create a new campaign" modal in Campaigns card in Multichannel Marketing page. diff --git a/plugins/woocommerce/changelog/feature-37175-react-render-boolean-expression b/plugins/woocommerce/changelog/feature-37175-react-render-boolean-expression deleted file mode 100644 index f0a0495b646..00000000000 --- a/plugins/woocommerce/changelog/feature-37175-react-render-boolean-expression +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix React rendering falsy value in marketing page. diff --git a/plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args b/plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args deleted file mode 100644 index 2224143fc8e..00000000000 --- a/plugins/woocommerce/changelog/feature-37176-specify-wp-data-resolution-args +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix WP data resolution (`invalidateResolution`) not working with WP 5.9 in marketing page. diff --git a/plugins/woocommerce/changelog/fix-#34200-need-to-add-space-between-author-image-and-meta b/plugins/woocommerce/changelog/fix-#34200-need-to-add-space-between-author-image-and-meta deleted file mode 100644 index 962ff56149f..00000000000 --- a/plugins/woocommerce/changelog/fix-#34200-need-to-add-space-between-author-image-and-meta +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: fix -Comment: Make Reviews table CSS match other list tables. - - diff --git a/plugins/woocommerce/changelog/fix-28969-modify-order-on-refund b/plugins/woocommerce/changelog/fix-28969-modify-order-on-refund deleted file mode 100644 index 57a4c3c9806..00000000000 --- a/plugins/woocommerce/changelog/fix-28969-modify-order-on-refund +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Update the date modified field for an order when a refund for it is successfully processed. diff --git a/plugins/woocommerce/changelog/fix-32717 b/plugins/woocommerce/changelog/fix-32717 deleted file mode 100644 index 7203612332a..00000000000 --- a/plugins/woocommerce/changelog/fix-32717 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: tweak - -Prevent 'woocommerce_ajax_order_items_removed' from generating PHP warnings. diff --git a/plugins/woocommerce/changelog/fix-34391 b/plugins/woocommerce/changelog/fix-34391 deleted file mode 100644 index afbb07ece83..00000000000 --- a/plugins/woocommerce/changelog/fix-34391 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: tweak - -Make sure 'safe_text' settings are rendered as 'text' inputs for compatibility. diff --git a/plugins/woocommerce/changelog/fix-35543 b/plugins/woocommerce/changelog/fix-35543 deleted file mode 100644 index a427c9577b6..00000000000 --- a/plugins/woocommerce/changelog/fix-35543 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Prevent possible warning arising from use of woocommerce_wp_* family of functions. diff --git a/plugins/woocommerce/changelog/fix-36618-product-import b/plugins/woocommerce/changelog/fix-36618-product-import deleted file mode 100644 index 67560ceed4c..00000000000 --- a/plugins/woocommerce/changelog/fix-36618-product-import +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Ensure product importer imports all lines in a CSV file. diff --git a/plugins/woocommerce/changelog/fix-36711-obw-blank-screen-wp5_9 b/plugins/woocommerce/changelog/fix-36711-obw-blank-screen-wp5_9 deleted file mode 100644 index 4f39fe3029a..00000000000 --- a/plugins/woocommerce/changelog/fix-36711-obw-blank-screen-wp5_9 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix blank screen is displayed during OBW when using WP5.9 diff --git a/plugins/woocommerce/changelog/fix-36890_create_wc_extension_script b/plugins/woocommerce/changelog/fix-36890_create_wc_extension_script deleted file mode 100644 index 253dcf4a315..00000000000 --- a/plugins/woocommerce/changelog/fix-36890_create_wc_extension_script +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Update create-wc-extension script within woocommerce-admin. diff --git a/plugins/woocommerce/changelog/fix-37020_duplicated_global_attribute b/plugins/woocommerce/changelog/fix-37020_duplicated_global_attribute deleted file mode 100644 index a698ac0c2d5..00000000000 --- a/plugins/woocommerce/changelog/fix-37020_duplicated_global_attribute +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: fix - -Fix duplicated global attribute diff --git a/plugins/woocommerce/changelog/fix-37021_add_validation_when_saving_attributes b/plugins/woocommerce/changelog/fix-37021_add_validation_when_saving_attributes deleted file mode 100644 index 81560990d51..00000000000 --- a/plugins/woocommerce/changelog/fix-37021_add_validation_when_saving_attributes +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Add validation when saving attributes and variations diff --git a/plugins/woocommerce/changelog/fix-37083-page_displays_0_for_empty_recommended_channels b/plugins/woocommerce/changelog/fix-37083-page_displays_0_for_empty_recommended_channels deleted file mode 100644 index 4e690c01a3a..00000000000 --- a/plugins/woocommerce/changelog/fix-37083-page_displays_0_for_empty_recommended_channels +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix 0 rendered on short-circuit evaluation. diff --git a/plugins/woocommerce/changelog/fix-arrayutil_get_value_or_default b/plugins/woocommerce/changelog/fix-arrayutil_get_value_or_default deleted file mode 100644 index 0c8dd965fab..00000000000 --- a/plugins/woocommerce/changelog/fix-arrayutil_get_value_or_default +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix ArrayUtil::get_value_or_default method not behaving as documented for null array values diff --git a/plugins/woocommerce/changelog/fix-cant-apply-coupon-0 b/plugins/woocommerce/changelog/fix-cant-apply-coupon-0 deleted file mode 100644 index d9066b3f2a1..00000000000 --- a/plugins/woocommerce/changelog/fix-cant-apply-coupon-0 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix the inability to apply a coupon whose code is "0" diff --git a/plugins/woocommerce/changelog/fix-import-of-draft-variations b/plugins/woocommerce/changelog/fix-import-of-draft-variations deleted file mode 100644 index 00f56b8dba5..00000000000 --- a/plugins/woocommerce/changelog/fix-import-of-draft-variations +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Fix variations exported as draft being imported as draft (and thus remaining invisible) diff --git a/plugins/woocommerce/changelog/fix-k6-baseline-imports b/plugins/woocommerce/changelog/fix-k6-baseline-imports deleted file mode 100644 index c6a3c6e2630..00000000000 --- a/plugins/woocommerce/changelog/fix-k6-baseline-imports +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: dev - -add wpLogin import to wc-baseline-load.js diff --git a/plugins/woocommerce/changelog/fix-load-theme-specific-stylesheet-in-site-editor b/plugins/woocommerce/changelog/fix-load-theme-specific-stylesheet-in-site-editor deleted file mode 100644 index b8d8e0f9c99..00000000000 --- a/plugins/woocommerce/changelog/fix-load-theme-specific-stylesheet-in-site-editor +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: fix - -Load same stylesheets in the Site Editor as in the frontend diff --git a/plugins/woocommerce/changelog/fix-mobile-app-connection-owner-bug b/plugins/woocommerce/changelog/fix-mobile-app-connection-owner-bug deleted file mode 100644 index b3f987f0f3e..00000000000 --- a/plugins/woocommerce/changelog/fix-mobile-app-connection-owner-bug +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: fix - -fixed bug where jetpack connection owner field was assumed to be username when its actually display name diff --git a/plugins/woocommerce/changelog/fix-order-cache-duplicate b/plugins/woocommerce/changelog/fix-order-cache-duplicate new file mode 100644 index 00000000000..1fb3ace0c40 --- /dev/null +++ b/plugins/woocommerce/changelog/fix-order-cache-duplicate @@ -0,0 +1,4 @@ +Significance: patch +Type: fix + +Overwrite clone method to prevent duplicate datq when saving a clone. diff --git a/plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image b/plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image deleted file mode 100644 index c13c27b0db3..00000000000 --- a/plugins/woocommerce/changelog/fix-payment-recommendations-wrong-image +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: fix - -Fixed payments recommendations pane in WooCommerce Payment Settings using the wrong image prop diff --git a/plugins/woocommerce/changelog/fix-react-dependency-versions b/plugins/woocommerce/changelog/fix-react-dependency-versions deleted file mode 100644 index 026a7cd5b70..00000000000 --- a/plugins/woocommerce/changelog/fix-react-dependency-versions +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: fix - -Override react version to 17.0.2 diff --git a/plugins/woocommerce/changelog/fix-toggled_checkboxes_in_settings_tracks b/plugins/woocommerce/changelog/fix-toggled_checkboxes_in_settings_tracks deleted file mode 100644 index a0ecd2eeb94..00000000000 --- a/plugins/woocommerce/changelog/fix-toggled_checkboxes_in_settings_tracks +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: fix - -Record values for toggled checkboxes/features in settings diff --git a/plugins/woocommerce/changelog/fix-tt2-wp60-missing-padding-in-some-buttons b/plugins/woocommerce/changelog/fix-tt2-wp60-missing-padding-in-some-buttons deleted file mode 100644 index e4e172c8cf5..00000000000 --- a/plugins/woocommerce/changelog/fix-tt2-wp60-missing-padding-in-some-buttons +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Add default button padding to TT2 stylesheet to fix some visual issues in WP 5.9 and 6.0 diff --git a/plugins/woocommerce/changelog/fix-update-customer-after-user-edit b/plugins/woocommerce/changelog/fix-update-customer-after-user-edit deleted file mode 100644 index a03bc532599..00000000000 --- a/plugins/woocommerce/changelog/fix-update-customer-after-user-edit +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Update Customers report with latest user data after editing user. diff --git a/plugins/woocommerce/changelog/fix-use-dbdelta-and-truncate-to-manage-attribute-lookup-tables b/plugins/woocommerce/changelog/fix-use-dbdelta-and-truncate-to-manage-attribute-lookup-tables deleted file mode 100644 index 5401b5ad760..00000000000 --- a/plugins/woocommerce/changelog/fix-use-dbdelta-and-truncate-to-manage-attribute-lookup-tables +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: performance - -Switch wc_product_attributes_lookup table management to use truncate and dbDelta over drop table diff --git a/plugins/woocommerce/changelog/fix-variations-dom-events b/plugins/woocommerce/changelog/fix-variations-dom-events deleted file mode 100644 index 1545c761283..00000000000 --- a/plugins/woocommerce/changelog/fix-variations-dom-events +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: fix -Comment: This fixes a bug which was introduced in a recent PR - - diff --git a/plugins/woocommerce/changelog/fix-wc_add_number_precision-not-supporting-null b/plugins/woocommerce/changelog/fix-wc_add_number_precision-not-supporting-null deleted file mode 100644 index e7b9ce5c13c..00000000000 --- a/plugins/woocommerce/changelog/fix-wc_add_number_precision-not-supporting-null +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Add support for null inputs to pnpm wc_add_number_precision diff --git a/plugins/woocommerce/changelog/fix-wca-run-packages-cmd b/plugins/woocommerce/changelog/fix-wca-run-packages-cmd deleted file mode 100644 index a8e2884b420..00000000000 --- a/plugins/woocommerce/changelog/fix-wca-run-packages-cmd +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: dev -Comment: Fix woocommerce-admin run packages commands - - diff --git a/plugins/woocommerce/changelog/improved_wc_price_to_display b/plugins/woocommerce/changelog/improved_wc_price_to_display deleted file mode 100644 index eb6339b83ab..00000000000 --- a/plugins/woocommerce/changelog/improved_wc_price_to_display +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: enhancement - -Add 'display_context' argument to wc_get_price_to_display(). diff --git a/plugins/woocommerce/changelog/issue-30104 b/plugins/woocommerce/changelog/issue-30104 deleted file mode 100644 index ac9273945ad..00000000000 --- a/plugins/woocommerce/changelog/issue-30104 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Log to order notes when coupons are removed or applied. diff --git a/plugins/woocommerce/changelog/issues-35004-attributes-saved-trigger b/plugins/woocommerce/changelog/issues-35004-attributes-saved-trigger deleted file mode 100644 index 7e4e46cc8a5..00000000000 --- a/plugins/woocommerce/changelog/issues-35004-attributes-saved-trigger +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: tweak - -Trigger event `woocommerce_attributes_saved` following successful product meta box ajax update. diff --git a/plugins/woocommerce/changelog/pr-36705 b/plugins/woocommerce/changelog/pr-36705 deleted file mode 100644 index c8308e99213..00000000000 --- a/plugins/woocommerce/changelog/pr-36705 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Added `woocommerce_widget_layered_nav_filters_start/end` hooks around layered nav filters widget \ No newline at end of file diff --git a/plugins/woocommerce/changelog/pr-37052 b/plugins/woocommerce/changelog/pr-37052 deleted file mode 100644 index c137f14ef99..00000000000 --- a/plugins/woocommerce/changelog/pr-37052 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Corrects a class reference in the ProductDownloadsServiceProvider. \ No newline at end of file diff --git a/plugins/woocommerce/changelog/pr-37056 b/plugins/woocommerce/changelog/pr-37056 deleted file mode 100644 index 569c062225f..00000000000 --- a/plugins/woocommerce/changelog/pr-37056 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Corrects class namespaces in Onboarding. It was missed during last restructuring. diff --git a/plugins/woocommerce/changelog/pr-37057 b/plugins/woocommerce/changelog/pr-37057 deleted file mode 100644 index 29c071af96e..00000000000 --- a/plugins/woocommerce/changelog/pr-37057 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Corrects a variable name in Reports\Stock\Stats. It was missed during the last name change. diff --git a/plugins/woocommerce/changelog/pr-37058 b/plugins/woocommerce/changelog/pr-37058 deleted file mode 100644 index 526d0042221..00000000000 --- a/plugins/woocommerce/changelog/pr-37058 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: fix - -Corrects imported classes. Class names should not begin with a backslash. diff --git a/plugins/woocommerce/changelog/remove-wcpay-accordion b/plugins/woocommerce/changelog/remove-wcpay-accordion deleted file mode 100644 index f409fb94f29..00000000000 --- a/plugins/woocommerce/changelog/remove-wcpay-accordion +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Remove accordion from "Other payment providers" in payment task diff --git a/plugins/woocommerce/changelog/pr-36759 b/plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run similarity index 55% rename from plugins/woocommerce/changelog/pr-36759 rename to plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run index 5e9cda49931..c48f20c0c5b 100644 --- a/plugins/woocommerce/changelog/pr-36759 +++ b/plugins/woocommerce/changelog/revert-36768-fix-36767-woocommerce_run_on_woocommerce_admin_updated-does-not-run @@ -1,4 +1,5 @@ Significance: patch Type: fix +Comment: Revert #36768 + -fix typo in variable name \ No newline at end of file diff --git a/plugins/woocommerce/changelog/try-remove-e2e-waits b/plugins/woocommerce/changelog/try-remove-e2e-waits new file mode 100644 index 00000000000..8e07a999db3 --- /dev/null +++ b/plugins/woocommerce/changelog/try-remove-e2e-waits @@ -0,0 +1,4 @@ +Significance: patch +Type: tweak + +Remove timeouts in e2e tests for variable products and analytics. diff --git a/plugins/woocommerce/changelog/update-35887_spotlight_on_analytics_revenue b/plugins/woocommerce/changelog/update-35887_spotlight_on_analytics_revenue deleted file mode 100644 index 49596b65370..00000000000 --- a/plugins/woocommerce/changelog/update-35887_spotlight_on_analytics_revenue +++ /dev/null @@ -1,4 +0,0 @@ -Significance: major -Type: update - -Change the default date used on Revenue and Orders report to 'date_paid' and create spotlight on both reports diff --git a/plugins/woocommerce/changelog/update-36355_product_editor_package b/plugins/woocommerce/changelog/update-36355_product_editor_package deleted file mode 100644 index f78ff8529ce..00000000000 --- a/plugins/woocommerce/changelog/update-36355_product_editor_package +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Update imports of product slot fills to new @woocommerce/product-editor library diff --git a/plugins/woocommerce/changelog/update-36395-move-product-fields b/plugins/woocommerce/changelog/update-36395-move-product-fields deleted file mode 100644 index 82ab9e78887..00000000000 --- a/plugins/woocommerce/changelog/update-36395-move-product-fields +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Moving some components out of core and into product-editor package. diff --git a/plugins/woocommerce/changelog/update-36719 b/plugins/woocommerce/changelog/update-36719 deleted file mode 100644 index 896dc558a69..00000000000 --- a/plugins/woocommerce/changelog/update-36719 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Move product utils into product editor package diff --git a/plugins/woocommerce/changelog/update-36723 b/plugins/woocommerce/changelog/update-36723 deleted file mode 100644 index c78abe8297a..00000000000 --- a/plugins/woocommerce/changelog/update-36723 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Move hook to confirm unsaved form changes to navigation package diff --git a/plugins/woocommerce/changelog/update-36746-update-avalara-cta-copy b/plugins/woocommerce/changelog/update-36746-update-avalara-cta-copy deleted file mode 100644 index 5d00e4f782b..00000000000 --- a/plugins/woocommerce/changelog/update-36746-update-avalara-cta-copy +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: tweak - -Change Avalara CTA copy in tax task to Download diff --git a/plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates b/plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates deleted file mode 100644 index 51208715e95..00000000000 --- a/plugins/woocommerce/changelog/update-bypass-actions-for-customer-updates +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: performance - -Bypass Action Scheduler for customer updates. diff --git a/plugins/woocommerce/changelog/update-ci-workflow-remove-wp-5-8 b/plugins/woocommerce/changelog/update-ci-workflow-remove-wp-5-8 deleted file mode 100644 index 49609065bb3..00000000000 --- a/plugins/woocommerce/changelog/update-ci-workflow-remove-wp-5-8 +++ /dev/null @@ -1,5 +0,0 @@ -Significance: patch -Type: update -Comment: workflow update. not part of release zip - - diff --git a/plugins/woocommerce/changelog/update-entity-store-endpoint-36990 b/plugins/woocommerce/changelog/update-entity-store-endpoint-36990 deleted file mode 100644 index d6f53eea345..00000000000 --- a/plugins/woocommerce/changelog/update-entity-store-endpoint-36990 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Updating rest namespace for product posttype to version 3. diff --git a/plugins/woocommerce/changelog/update-manage-stock-disabled b/plugins/woocommerce/changelog/update-manage-stock-disabled deleted file mode 100644 index 54bbac5922e..00000000000 --- a/plugins/woocommerce/changelog/update-manage-stock-disabled +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Show link to store settings when stock management is disabled. diff --git a/plugins/woocommerce/changelog/update-manage-stock-label b/plugins/woocommerce/changelog/update-manage-stock-label deleted file mode 100644 index 046a681b500..00000000000 --- a/plugins/woocommerce/changelog/update-manage-stock-label +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: tweak - -Rename "Manage stock?" label to "Stock management". diff --git a/plugins/woocommerce/changelog/update-move-ces-data-store b/plugins/woocommerce/changelog/update-move-ces-data-store deleted file mode 100644 index b85fbb8d362..00000000000 --- a/plugins/woocommerce/changelog/update-move-ces-data-store +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Add CES data store to @woocommerce/customer-effort-score diff --git a/plugins/woocommerce/changelog/update-move-ces-to-package b/plugins/woocommerce/changelog/update-move-ces-to-package deleted file mode 100644 index ca5584e0fec..00000000000 --- a/plugins/woocommerce/changelog/update-move-ces-to-package +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: dev - -Move CES components and utilities to @woocommerce/customer-effort-score diff --git a/plugins/woocommerce/changelog/update-move-product-hooks b/plugins/woocommerce/changelog/update-move-product-hooks deleted file mode 100644 index 5dbc28e2162..00000000000 --- a/plugins/woocommerce/changelog/update-move-product-hooks +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Moving use-product-helper and related product hooks to product editor package. diff --git a/plugins/woocommerce/changelog/update-move-remaining-ces-to-package b/plugins/woocommerce/changelog/update-move-remaining-ces-to-package new file mode 100644 index 00000000000..7bd3509065d --- /dev/null +++ b/plugins/woocommerce/changelog/update-move-remaining-ces-to-package @@ -0,0 +1,4 @@ +Significance: minor +Type: dev + +Move additional CES-related components to @woocommerce/customer-effort-score. diff --git a/plugins/woocommerce/changelog/update-payment-gateways b/plugins/woocommerce/changelog/update-payment-gateways deleted file mode 100644 index 7bb1e74a1c5..00000000000 --- a/plugins/woocommerce/changelog/update-payment-gateways +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update obw payment gateways diff --git a/plugins/woocommerce/changelog/update-product-page-add-hook-37281 b/plugins/woocommerce/changelog/update-product-page-add-hook-37281 new file mode 100644 index 00000000000..22f43052aba --- /dev/null +++ b/plugins/woocommerce/changelog/update-product-page-add-hook-37281 @@ -0,0 +1,4 @@ +Significance: minor +Type: update + +Replacing multiple components on the block product page with a single hook. diff --git a/plugins/woocommerce/changelog/update-product_rest_config b/plugins/woocommerce/changelog/update-product_rest_config deleted file mode 100644 index ee0d9c7fa68..00000000000 --- a/plugins/woocommerce/changelog/update-product_rest_config +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: add - -Update product post rest config when block editor feature is enabled. diff --git a/plugins/woocommerce/changelog/update-refactor-currency-context b/plugins/woocommerce/changelog/update-refactor-currency-context deleted file mode 100644 index 542b256874c..00000000000 --- a/plugins/woocommerce/changelog/update-refactor-currency-context +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Moving currencyContext to relevant package, and updating all references. diff --git a/plugins/woocommerce/changelog/update-remove-cart2cart b/plugins/woocommerce/changelog/update-remove-cart2cart deleted file mode 100644 index fe5b3f56305..00000000000 --- a/plugins/woocommerce/changelog/update-remove-cart2cart +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Remove Cart2Cart option from add product task diff --git a/plugins/woocommerce/changelog/update-stable-tag b/plugins/woocommerce/changelog/update-stable-tag deleted file mode 100644 index e5ee8f7e111..00000000000 --- a/plugins/woocommerce/changelog/update-stable-tag +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: dev -Comment: This PR updates the stable tag. No changelog entry is required. - diff --git a/plugins/woocommerce/changelog/update-stable-tag-7-5-1 b/plugins/woocommerce/changelog/update-stable-tag-7-5-1 new file mode 100644 index 00000000000..993c5ee05ab --- /dev/null +++ b/plugins/woocommerce/changelog/update-stable-tag-7-5-1 @@ -0,0 +1,4 @@ +Significance: patch +Type: dev +Comment: This PR updates stable tag, no changelog entry is required. + diff --git a/plugins/woocommerce/changelog/update-use-theme-color-for-completed-task-strikethrough b/plugins/woocommerce/changelog/update-use-theme-color-for-completed-task-strikethrough deleted file mode 100644 index 26d3972b2a4..00000000000 --- a/plugins/woocommerce/changelog/update-use-theme-color-for-completed-task-strikethrough +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Use the currently activated theme color for completed tasks strikethough diff --git a/plugins/woocommerce/changelog/update-variations-form b/plugins/woocommerce/changelog/update-variations-form deleted file mode 100644 index 15de2b48117..00000000000 --- a/plugins/woocommerce/changelog/update-variations-form +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Change Variations form shown in Variations tab when there are no variations created 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 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 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.0 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.0 deleted file mode 100644 index 6bcd9bc8231..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.0 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: update - -Update WooCommerce BLocks to 9.8.0 diff --git a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.1 b/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.1 deleted file mode 100644 index 9d8b1e6c9eb..00000000000 --- a/plugins/woocommerce/changelog/update-woocommerce-blocks-9.8.1 +++ /dev/null @@ -1,4 +0,0 @@ -Significance: patch -Type: update - -Update WooCommerce Blocks to 9.8.1 diff --git a/plugins/woocommerce/changelog/woocommerce-reduce-order-item-stock b/plugins/woocommerce/changelog/woocommerce-reduce-order-item-stock deleted file mode 100644 index 5c46be6f864..00000000000 --- a/plugins/woocommerce/changelog/woocommerce-reduce-order-item-stock +++ /dev/null @@ -1,4 +0,0 @@ -Significance: minor -Type: enhancement - -Added woocommerce_reduce_order_item_stock action hook diff --git a/plugins/woocommerce/composer.json b/plugins/woocommerce/composer.json index a45995f8cab..2ed1a3bd2a8 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.6.0", + "version": "7.7.0", "type": "wordpress-plugin", "license": "GPL-3.0-or-later", "prefer-stable": true, diff --git a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php index 951cb4dfab1..cab8f59eaab 100644 --- a/plugins/woocommerce/includes/abstracts/abstract-wc-order.php +++ b/plugins/woocommerce/includes/abstracts/abstract-wc-order.php @@ -131,6 +131,17 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order { } } + /** + * This method overwrites the base class's clone method to make it a no-op. In base class WC_Data, we are unsetting the meta_id to clone. + * It seems like this was done to avoid conflicting the metadata when duplicating products. However, doing that does not seems necessary for orders. + * In-fact, when we do that for orders, we lose the capability to clone orders with custom meta data by caching plugins. This is because, when we clone an order object for caching, it will clone the metadata without the ID. Unfortunately, when this cached object with nulled meta ID is retreived, WC_Data will consider it as a new meta and will insert it as a new meta-data causing duplicates. + * + * Eventually, we should move away from overwriting the __clone method in base class itself, since it's easily possible to still duplicate the product without having to hook into the __clone method. + * + * @since 7.6.0 + */ + public function __clone() {} + /** * Get internal type. * 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..7b4c9674778 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 @@ -50,8 +50,8 @@ if ( ! defined( 'ABSPATH' ) ) { woocommerce_wp_text_input( array( 'id' => '_stock', - 'value' => wc_stock_amount( $product_object->get_stock_quantity( 'edit' ) ), - 'label' => __( 'Stock quantity', 'woocommerce' ), + 'value' => wc_stock_amount( $product_object->get_stock_quantity( 'edit' ) ?? 1 ), + 'label' => __( 'Quantity', 'woocommerce' ), 'desc_tip' => true, 'description' => __( 'Stock quantity. If this is a variable product this value will be used to control stock for all variations, unless you define stock at variation level.', 'woocommerce' ), 'type' => 'number', @@ -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,18 +126,31 @@ 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 ); + $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' ), ); + /** + * 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( $stock_status_args ); + } else { + woocommerce_wp_select( $stock_status_args ); + } + do_action( 'woocommerce_product_options_stock_status' ); ?>
diff --git a/plugins/woocommerce/includes/class-wc-order-factory.php b/plugins/woocommerce/includes/class-wc-order-factory.php index 3851a048f49..acce3cfcf8d 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() ); } - 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; } /** diff --git a/plugins/woocommerce/includes/class-wc-post-data.php b/plugins/woocommerce/includes/class-wc-post-data.php index b27cfe47db8..c1e3aa6b5f0 100644 --- a/plugins/woocommerce/includes/class-wc-post-data.php +++ b/plugins/woocommerce/includes/class-wc-post-data.php @@ -54,6 +54,7 @@ class WC_Post_Data { add_action( 'wp_trash_post', array( __CLASS__, 'trash_post' ) ); add_action( 'untrashed_post', array( __CLASS__, 'untrash_post' ) ); add_action( 'before_delete_post', array( __CLASS__, 'before_delete_order' ) ); + add_action( 'woocommerce_before_delete_order', array( __CLASS__, 'before_delete_order' ) ); // Meta cache flushing. add_action( 'updated_post_meta', array( __CLASS__, 'flush_object_meta_cache' ), 10, 4 ); diff --git a/plugins/woocommerce/includes/class-wc-post-types.php b/plugins/woocommerce/includes/class-wc-post-types.php index 326102f9788..5fcb68552a5 100644 --- a/plugins/woocommerce/includes/class-wc-post-types.php +++ b/plugins/woocommerce/includes/class-wc-post-types.php @@ -387,6 +387,46 @@ class WC_Post_Types { 'name' => 'Product name', ), ), + array( + 'woocommerce/product-summary', + ), + 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/plugins/woocommerce/includes/class-wc-webhook.php b/plugins/woocommerce/includes/class-wc-webhook.php index 16d98af9ad3..3200b989057 100644 --- a/plugins/woocommerce/includes/class-wc-webhook.php +++ b/plugins/woocommerce/includes/class-wc-webhook.php @@ -274,21 +274,25 @@ class WC_Webhook extends WC_Legacy_Webhook { private function is_valid_resource( $arg ) { $resource = $this->get_resource(); - if ( in_array( $resource, array( 'order', 'product', 'coupon' ), true ) ) { + if ( in_array( $resource, array( 'product', 'coupon' ), true ) ) { $status = get_post_status( absint( $arg ) ); // Ignore auto drafts for all resources. if ( in_array( $status, array( 'auto-draft', 'new' ), true ) ) { return false; } + } - // Ignore standard drafts for orders. - if ( 'order' === $resource && 'draft' === $status ) { + if ( 'order' === $resource ) { + // Check registered order types for order types args. + if ( ! OrderUtil::is_order( absint( $arg ), wc_get_order_types( 'order-webhooks' ) ) ) { return false; } - // Check registered order types for order types args. - if ( 'order' === $resource && ! OrderUtil::is_order( absint( $arg ), wc_get_order_types( 'order-webhooks' ) ) ) { + $order = wc_get_order( absint( $arg ) ); + + // Ignore standard drafts for orders. + if ( in_array( $order->get_status(), array( 'draft', 'auto-draft', 'new' ), true ) ) { return false; } } diff --git a/plugins/woocommerce/includes/class-woocommerce.php b/plugins/woocommerce/includes/class-woocommerce.php index 5ae2b3aa4fd..1ed57dc4cea 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.6.0'; + public $version = '7.7.0'; /** * WooCommerce Schema version. 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 fad3a54eca4..b26a0875462 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 @@ -413,6 +413,89 @@ abstract class Abstract_WC_Order_Data_Store_CPT extends WC_Data_Store_WP impleme return $items; } + /** + * Return the order type of a given item which belongs to WC_Order. + * + * @since 3.2.0 + * @param WC_Order $order Order Object. + * @param int $order_item_id Order item id. + * @return string Order Item type + */ + public function get_order_item_type( $order, $order_item_id ) { + global $wpdb; + return $wpdb->get_var( $wpdb->prepare( "SELECT DISTINCT order_item_type FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id = %d and order_item_id = %d;", $order->get_id(), $order_item_id ) ); + } + + /** + * Prime following caches: + * 1. item-$order_item_id For individual items. + * 2. order-items-$order-id For fetching items associated with an order. + * 3. order-item meta. + * + * @param array $order_ids Order Ids to prime cache for. + * @param array $query_vars Query vars for the query. + */ + protected function prime_order_item_caches_for_orders( $order_ids, $query_vars ) { + global $wpdb; + if ( isset( $query_vars['fields'] ) && 'all' !== $query_vars['fields'] ) { + $line_items = array( + 'line_items', + 'shipping_lines', + 'fee_lines', + 'coupon_lines', + ); + + if ( is_array( $query_vars['fields'] ) && 0 === count( array_intersect( $line_items, $query_vars['fields'] ) ) ) { + return; + } + } + $cache_keys = array_map( + function ( $order_id ) { + return 'order-items-' . $order_id; + }, + $order_ids + ); + $cache_values = wc_cache_get_multiple( $cache_keys, 'orders' ); + $non_cached_ids = array(); + foreach ( $order_ids as $order_id ) { + if ( false === $cache_values[ 'order-items-' . $order_id ] ) { + $non_cached_ids[] = $order_id; + } + } + if ( empty( $non_cached_ids ) ) { + return; + } + + $non_cached_ids = esc_sql( $non_cached_ids ); + $non_cached_ids_string = implode( ',', $non_cached_ids ); + $order_items = $wpdb->get_results( + // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + "SELECT order_item_type, order_item_id, order_id, order_item_name FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id in ( $non_cached_ids_string ) ORDER BY order_item_id;" + ); + if ( empty( $order_items ) ) { + return; + } + + $order_items_for_all_orders = array_reduce( + $order_items, + function ( $order_items_collection, $order_item ) { + if ( ! isset( $order_items_collection[ $order_item->order_id ] ) ) { + $order_items_collection[ $order_item->order_id ] = array(); + } + $order_items_collection[ $order_item->order_id ][] = $order_item; + return $order_items_collection; + } + ); + foreach ( $order_items_for_all_orders as $order_id => $items ) { + wp_cache_set( 'order-items-' . $order_id, $items, 'orders' ); + } + foreach ( $order_items as $item ) { + wp_cache_set( 'item-' . $item->order_item_id, $item, 'order-items' ); + } + $order_item_ids = wp_list_pluck( $order_items, 'order_item_id' ); + update_meta_cache( 'order_item', $order_item_ids ); + } + /** * Remove all line items (products, coupons, shipping, taxes) from the order. * diff --git a/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php b/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php index b8e26142e44..a8982de92ee 100644 --- a/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php +++ b/plugins/woocommerce/includes/data-stores/class-wc-order-data-store-cpt.php @@ -1118,76 +1118,6 @@ class WC_Order_Data_Store_CPT extends Abstract_WC_Order_Data_Store_CPT implement } } - /** - * Prime following caches: - * 1. item-$order_item_id For individual items. - * 2. order-items-$order-id For fetching items associated with an order. - * 3. order-item meta. - * - * @param array $order_ids Order Ids to prime cache for. - * @param array $query_vars Query vars for the query. - */ - private function prime_order_item_caches_for_orders( $order_ids, $query_vars ) { - global $wpdb; - if ( isset( $query_vars['fields'] ) && 'all' !== $query_vars['fields'] ) { - $line_items = array( - 'line_items', - 'shipping_lines', - 'fee_lines', - 'coupon_lines', - ); - - if ( is_array( $query_vars['fields'] ) && 0 === count( array_intersect( $line_items, $query_vars['fields'] ) ) ) { - return; - } - } - $cache_keys = array_map( - function ( $order_id ) { - return 'order-items-' . $order_id; - }, - $order_ids - ); - $cache_values = wc_cache_get_multiple( $cache_keys, 'orders' ); - $non_cached_ids = array(); - foreach ( $order_ids as $order_id ) { - if ( false === $cache_values[ 'order-items-' . $order_id ] ) { - $non_cached_ids[] = $order_id; - } - } - if ( empty( $non_cached_ids ) ) { - return; - } - - $non_cached_ids = esc_sql( $non_cached_ids ); - $non_cached_ids_string = implode( ',', $non_cached_ids ); - $order_items = $wpdb->get_results( - // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared - "SELECT order_item_type, order_item_id, order_id, order_item_name FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id in ( $non_cached_ids_string ) ORDER BY order_item_id;" - ); - if ( empty( $order_items ) ) { - return; - } - - $order_items_for_all_orders = array_reduce( - $order_items, - function ( $order_items_collection, $order_item ) { - if ( ! isset( $order_items_collection[ $order_item->order_id ] ) ) { - $order_items_collection[ $order_item->order_id ] = array(); - } - $order_items_collection[ $order_item->order_id ][] = $order_item; - return $order_items_collection; - } - ); - foreach ( $order_items_for_all_orders as $order_id => $items ) { - wp_cache_set( 'order-items-' . $order_id, $items, 'orders' ); - } - foreach ( $order_items as $item ) { - wp_cache_set( 'item-' . $item->order_item_id, $item, 'order-items' ); - } - $order_item_ids = wp_list_pluck( $order_items, 'order_item_id' ); - update_meta_cache( 'order_item', $order_item_ids ); - } - /** * Prime cache for raw meta data for orders in bulk. Difference between this and WP built-in metadata is that this method also fetches `meta_id` field which we use and cache it. * @@ -1240,17 +1170,4 @@ class WC_Order_Data_Store_CPT extends Abstract_WC_Order_Data_Store_CPT implement ); WC_Order::prime_raw_meta_data_cache( $raw_meta_data_collection, 'orders' ); } - - /** - * Return the order type of a given item which belongs to WC_Order. - * - * @since 3.2.0 - * @param WC_Order $order Order Object. - * @param int $order_item_id Order item id. - * @return string Order Item type - */ - public function get_order_item_type( $order, $order_item_id ) { - global $wpdb; - return $wpdb->get_var( $wpdb->prepare( "SELECT DISTINCT order_item_type FROM {$wpdb->prefix}woocommerce_order_items WHERE order_id = %d and order_item_id = %d;", $order->get_id(), $order_item_id ) ); - } } diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller.php index abbe84d47c9..c7060844fef 100644 --- a/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller.php +++ b/plugins/woocommerce/includes/rest-api/Controllers/Version2/class-wc-rest-orders-v2-controller.php @@ -327,6 +327,29 @@ class WC_REST_Orders_V2_Controller extends WC_REST_CRUD_Controller { return $result; } + /** + * With HPOS, few internal meta keys such as _billing_address_index, _shipping_address_index are not considered internal anymore (since most internal keys were flattened into dedicated columns). + * + * This function helps in filtering out any remaining internal meta keys with HPOS is enabled. + * + * @param array $meta_data Order meta data. + * + * @return array Filtered order meta data. + */ + private function filter_internal_meta_keys( $meta_data ) { + if ( ! OrderUtil::custom_orders_table_usage_is_enabled() ) { + return $meta_data; + } + $cpt_hidden_keys = ( new \WC_Order_Data_Store_CPT() )->get_internal_meta_keys(); + $meta_data = array_filter( + $meta_data, + function ( $meta ) use ( $cpt_hidden_keys ) { + return ! in_array( $meta->key, $cpt_hidden_keys, true ); + } + ); + return array_values( $meta_data ); + } + /** * Get formatted item data. * @@ -371,6 +394,7 @@ class WC_REST_Orders_V2_Controller extends WC_REST_CRUD_Controller { case 'meta_data': $meta_data = $order->get_meta_data(); $data['meta_data'] = $this->get_meta_data_for_response( $this->request, $meta_data ); + $data['meta_data'] = $this->filter_internal_meta_keys( $data['meta_data'] ); break; case 'line_items': $data['line_items'] = $order->get_items( 'line_item' ); diff --git a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-orders-controller.php b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-orders-controller.php index 106dac9a77f..27f979b244d 100644 --- a/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-orders-controller.php +++ b/plugins/woocommerce/includes/rest-api/Controllers/Version3/class-wc-rest-orders-controller.php @@ -238,33 +238,6 @@ class WC_REST_Orders_Controller extends WC_REST_Orders_V2_Controller { } } - /** - * Get formatted item data. - * - * @param WC_Order $order WC_Data instance. - * @return array - */ - protected function get_formatted_item_data( $order ) { - $item_data = parent::get_formatted_item_data( $order ); - $cpt_hidden_keys = array(); - - if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { - $cpt_hidden_keys = ( new \WC_Order_Data_Store_CPT() )->get_internal_meta_keys(); - } - - // XXX: This might be removed once we finalize the design for internal keys vs meta vs props in COT. - if ( ! empty( $item_data['meta_data'] ) ) { - $item_data['meta_data'] = array_filter( - $item_data['meta_data'], - function( $meta ) use ( $cpt_hidden_keys ) { - return ! in_array( $meta->key, $cpt_hidden_keys, true ); - } - ); - } - - return $item_data; - } - /** * Prepare objects query. * 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; } 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/includes/wc-user-functions.php b/plugins/woocommerce/includes/wc-user-functions.php index 6b98a8a8df0..7b53871b454 100644 --- a/plugins/woocommerce/includes/wc-user-functions.php +++ b/plugins/woocommerce/includes/wc-user-functions.php @@ -714,16 +714,40 @@ function wc_get_customer_order_count( $user_id ) { function wc_reset_order_customer_id_on_deleted_user( $user_id ) { global $wpdb; - $wpdb->update( - $wpdb->postmeta, - array( - 'meta_value' => 0, - ), - array( - 'meta_key' => '_customer_user', - 'meta_value' => $user_id, - ) - ); // WPCS: slow query ok. + if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { + $order_table_ds = wc_get_container()->get( OrdersTableDataStore::class ); + $order_table = $order_table_ds::get_orders_table_name(); + $wpdb->update( + $order_table, + array( + 'customer_id' => 0, + 'date_updated_gmt' => current_time( 'mysql', true ), + ), + array( + 'customer_id' => $user_id, + ), + array( + '%d', + '%s', + ), + array( + '%d', + ) + ); + } + + if ( ! OrderUtil::custom_orders_table_usage_is_enabled() || OrderUtil::is_custom_order_tables_in_sync() ) { + $wpdb->update( + $wpdb->postmeta, + array( + 'meta_value' => 0, //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value + ), + array( + 'meta_key' => '_customer_user', //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_key + 'meta_value' => $user_id, //phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_value + ) + ); + } } add_action( 'deleted_user', 'wc_reset_order_customer_id_on_deleted_user' ); diff --git a/plugins/woocommerce/package.json b/plugins/woocommerce/package.json index 48fb5ce4db4..11639ea1bb9 100644 --- a/plugins/woocommerce/package.json +++ b/plugins/woocommerce/package.json @@ -1,7 +1,7 @@ { "name": "woocommerce", "title": "WooCommerce", - "version": "7.6.0", + "version": "7.7.0", "homepage": "https://woocommerce.com/", "repository": { "type": "git", diff --git a/plugins/woocommerce/readme.txt b/plugins/woocommerce/readme.txt index 7614651e0b0..efff28109f1 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.1 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.6.0 2023-XX-XX = += 7.7.0 2023-XX-XX = [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce/trunk/changelog.txt). 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/Orders.php b/plugins/woocommerce/src/Admin/API/Orders.php index e85bec04c10..64138466a65 100644 --- a/plugins/woocommerce/src/Admin/API/Orders.php +++ b/plugins/woocommerce/src/Admin/API/Orders.php @@ -10,6 +10,8 @@ namespace Automattic\WooCommerce\Admin\API; defined( 'ABSPATH' ) || exit; use Automattic\WooCommerce\Admin\API\Reports\Controller as ReportsController; +use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore; +use Automattic\WooCommerce\Utilities\OrderUtil; /** * Orders controller. @@ -54,30 +56,61 @@ class Orders extends \WC_REST_Orders_Controller { * @return array */ protected function prepare_objects_query( $request ) { - global $wpdb; $args = parent::prepare_objects_query( $request ); - // Search by partial order number. if ( ! empty( $request['number'] ) ) { - $partial_number = trim( $request['number'] ); - $limit = intval( $args['posts_per_page'] ); - $order_ids = $wpdb->get_col( + $args = $this->search_partial_order_number( $request['number'], $args ); + } + + return $args; + } + + /** + * Helper method to allow searching by partial order number. + * + * @param int $number Partial order number match. + * @param array $args List of arguments for the request. + * + * @return array Modified args with partial order search included. + */ + private function search_partial_order_number( $number, $args ) { + global $wpdb; + + $partial_number = trim( $number ); + $limit = intval( $args['posts_per_page'] ); + if ( OrderUtil::custom_orders_table_usage_is_enabled() ) { + $order_table_name = OrdersTableDataStore::get_orders_table_name(); + // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $orders_table_name is hardcoded. + $order_ids = $wpdb->get_col( $wpdb->prepare( - "SELECT ID - FROM {$wpdb->prefix}posts - WHERE post_type = 'shop_order' - AND ID LIKE %s + "SELECT id + FROM $order_table_name + WHERE type = 'shop_order' + AND id LIKE %s LIMIT %d", $wpdb->esc_like( absint( $partial_number ) ) . '%', $limit ) ); - - // Force WP_Query return empty if don't found any order. - $order_ids = empty( $order_ids ) ? array( 0 ) : $order_ids; - $args['post__in'] = $order_ids; + // phpcs:enable + } else { + $order_ids = $wpdb->get_col( + $wpdb->prepare( + "SELECT ID + FROM {$wpdb->prefix}posts + WHERE post_type = 'shop_order' + AND ID LIKE %s + LIMIT %d", + $wpdb->esc_like( absint( $partial_number ) ) . '%', + $limit + ) + ); } + // Force WP_Query return empty if don't found any order. + $order_ids = empty( $order_ids ) ? array( 0 ) : $order_ids; + $args['post__in'] = $order_ids; + return $args; } 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..897d5ce44df 100644 --- a/plugins/woocommerce/src/Admin/API/Reports/Orders/Stats/DataStore.php +++ b/plugins/woocommerce/src/Admin/API/Reports/Orders/Stats/DataStore.php @@ -113,6 +113,7 @@ class DataStore extends ReportsDataStore implements DataStoreInterface { * Set up all the hooks for maintaining and populating table data. */ public static function init() { + add_action( 'woocommerce_before_delete_order', array( __CLASS__, 'delete_order' ) ); add_action( 'delete_post', array( __CLASS__, 'delete_order' ) ); } @@ -208,7 +209,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. 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 @@ +queue()->schedule_single( time(), 'woocommerce_run_on_woocommerce_admin_updated', diff --git a/plugins/woocommerce/src/Caches/OrderCache.php b/plugins/woocommerce/src/Caches/OrderCache.php index 6f49fa308dd..fed5b0be0d7 100644 --- a/plugins/woocommerce/src/Caches/OrderCache.php +++ b/plugins/woocommerce/src/Caches/OrderCache.php @@ -2,6 +2,7 @@ namespace Automattic\WooCommerce\Caches; +use Automattic\WooCommerce\Caching\CacheException; use Automattic\WooCommerce\Caching\ObjectCache; /** 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(); + } + } } 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. * diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php index f78db3c4b5a..72dda5adbec 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableDataStore.php @@ -181,6 +181,8 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements /** * Get the names of all the tables involved in the custom orders table feature. * + * See also : get_all_table_names_with_id. + * * @return string[] */ public function get_all_table_names() { @@ -192,6 +194,22 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements ); } + /** + * Similar to get_all_table_names, but also returns the table name along with the items table. + * + * @return array Names of the tables. + */ + public static function get_all_table_names_with_id() { + global $wpdb; + return array( + 'orders' => self::get_orders_table_name(), + 'addresses' => self::get_addresses_table_name(), + 'operational_data' => self::get_operational_data_table_name(), + 'meta' => self::get_meta_table_name(), + 'items' => $wpdb->prefix . 'woocommerce_order_items', + ); + } + /** * Table column to WC_Order mapping for wc_orders table. * @@ -555,7 +573,8 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements * @return bool Whether permissions are granted. */ public function get_download_permissions_granted( $order ) { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; + $order_id = is_int( $order ) ? $order : $order->get_id(); + $order = wc_get_order( $order_id ); return $order->get_download_permissions_granted(); } @@ -581,7 +600,8 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements * @return bool Whether sales are recorded. */ public function get_recorded_sales( $order ) { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; + $order_id = is_int( $order ) ? $order : $order->get_id(); + $order = wc_get_order( $order_id ); return $order->get_recorded_sales(); } @@ -607,7 +627,8 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements * @return bool Whether coupon counts were updated. */ public function get_recorded_coupon_usage_counts( $order ) { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; + $order_id = is_int( $order ) ? $order : $order->get_id(); + $order = wc_get_order( $order_id ); return $order->get_recorded_coupon_usage_counts(); } @@ -633,7 +654,8 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements * @return bool Whether email is sent. */ public function get_email_sent( $order ) { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; + $order_id = is_int( $order ) ? $order : $order->get_id(); + $order = wc_get_order( $order_id ); return $order->get_new_order_email_sent(); } @@ -659,8 +681,7 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements * @return bool Whether email was sent. */ public function get_new_order_email_sent( $order ) { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; - return $order->get_new_order_email_sent(); + return $this->get_email_sent( $order ); } /** @@ -685,7 +706,8 @@ class OrdersTableDataStore extends \Abstract_WC_Order_Data_Store_CPT implements * @return bool Whether stock was reduced. */ public function get_stock_reduced( $order ) { - $order = is_int( $order ) ? wc_get_order( $order ) : $order; + $order_id = is_int( $order ) ? $order : $order->get_id(); + $order = wc_get_order( $order_id ); return $order->get_order_stock_reduced(); } @@ -1768,9 +1790,14 @@ 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. 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 ) { + 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 ); diff --git a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php index b6ff8f91be6..92148b218c6 100644 --- a/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php +++ b/plugins/woocommerce/src/Internal/DataStores/Orders/OrdersTableQuery.php @@ -164,6 +164,12 @@ class OrdersTableQuery { */ private $date_query = null; + /** + * Instance of the OrdersTableDataStore class. + * + * @var OrdersTableDataStore + */ + private $order_datastore = null; /** * Sets up and runs the query after processing arguments. @@ -171,19 +177,11 @@ class OrdersTableQuery { * @param array $args Array of query vars. */ public function __construct( $args = array() ) { - global $wpdb; + // Note that ideally we would inject this dependency via constructor, but that's not possible since this class needs to be backward compatible with WC_Order_Query class. + $this->order_datastore = wc_get_container()->get( OrdersTableDataStore::class ); - $datastore = wc_get_container()->get( OrdersTableDataStore::class ); - - // TODO: maybe OrdersTableDataStore::get_all_table_names() could return these keys/indices instead. - $this->tables = array( - 'orders' => $datastore::get_orders_table_name(), - 'addresses' => $datastore::get_addresses_table_name(), - 'operational_data' => $datastore::get_operational_data_table_name(), - 'meta' => $datastore::get_meta_table_name(), - 'items' => $wpdb->prefix . 'woocommerce_order_items', - ); - $this->mappings = $datastore->get_all_order_column_mappings(); + $this->tables = $this->order_datastore::get_all_table_names_with_id(); + $this->mappings = $this->order_datastore->get_all_order_column_mappings(); $this->args = $args; @@ -202,13 +200,13 @@ class OrdersTableQuery { private function maybe_remap_args(): void { $mapping = array( // WP_Query legacy. - 'post_date' => 'date_created_gmt', + 'post_date' => 'date_created', 'post_date_gmt' => 'date_created_gmt', - 'post_modified' => 'date_modified_gmt', + 'post_modified' => 'date_updated', 'post_modified_gmt' => 'date_updated_gmt', 'post_status' => 'status', - '_date_completed' => 'date_completed_gmt', - '_date_paid' => 'date_paid_gmt', + '_date_completed' => 'date_completed', + '_date_paid' => 'date_paid', 'paged' => 'page', 'post_parent' => 'parent_order_id', 'post_parent__in' => 'parent_order_id', @@ -231,12 +229,8 @@ class OrdersTableQuery { // Translate from WC_Order_Query to table structure. 'version' => 'woocommerce_version', - 'date_created' => 'date_created_gmt', - 'date_modified' => 'date_updated_gmt', + 'date_modified' => 'date_updated', 'date_modified_gmt' => 'date_updated_gmt', - 'date_completed' => 'date_completed_gmt', - 'date_completed_gmt' => 'date_completed_gmt', - 'date_paid' => 'date_paid_gmt', 'discount_total' => 'discount_total_amount', 'discount_tax' => 'discount_tax_amount', 'shipping_total' => 'shipping_total_amount', @@ -276,16 +270,26 @@ class OrdersTableQuery { $this->args['meta_query'] = array( $shortcut_meta_query ); // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query } } + + // Date query. + if ( isset( $this->args['date_query'] ) && is_array( $this->args['date_query'] ) ) { + foreach ( $this->args['date_query'] as $index => $query ) { + if ( isset( $query['column'] ) && isset( $mapping[ $query['column'] ] ) ) { + $this->args['date_query'][ $index ]['column'] = $mapping[ $query['column'] ]; + } + } + } } /** * Generates a `WP_Date_Query` compatible query from a given date. * YYYY-MM-DD queries have 'day' precision for backwards compatibility. * - * @param mixed $date The date. Can be a {@see \WC_DateTime}, a timestamp or a string. + * @param mixed $date The date. Can be a {@see \WC_DateTime}, a timestamp or a string. + * @param string $timezone The timezone to use for the date. * @return array An array with keys 'year', 'month', 'day' and possibly 'hour', 'minute' and 'second'. */ - private function date_to_date_query_arg( $date ): array { + private function date_to_date_query_arg( $date, $timezone ): array { $result = array( 'year' => '', 'month' => '', @@ -294,7 +298,7 @@ class OrdersTableQuery { $precision = 'second'; if ( is_numeric( $date ) ) { - $date = new \WC_DateTime( "@{$date}", new \DateTimeZone( 'UTC' ) ); + $date = new \WC_DateTime( "@{$date}", new \DateTimeZone( $timezone ) ); } elseif ( ! is_a( $date, 'WC_DateTime' ) ) { // YYYY-MM-DD queries have 'day' precision for backwards compat. $date = wc_string_to_datetime( $date ); @@ -321,30 +325,54 @@ class OrdersTableQuery { * @throws \Exception When date args are invalid. */ private function process_date_args(): void { - $valid_operators = array( '>', '>=', '=', '<=', '<', '...' ); - $date_queries = array(); - $gmt_date_keys = array( - 'date_created_gmt', - 'date_updated_gmt', - 'date_paid_gmt', - 'date_completed_gmt', + $valid_operators = array( '>', '>=', '=', '<=', '<', '...' ); + $date_queries = array(); + $local_to_gmt_date_keys = array( + 'date_created' => 'date_created_gmt', + 'date_updated' => 'date_updated_gmt', + 'date_paid' => 'date_paid_gmt', + 'date_completed' => 'date_completed_gmt', ); + $gmt_date_keys = array_values( $local_to_gmt_date_keys ); + $local_date_keys = array_keys( $local_to_gmt_date_keys ); - foreach ( array_filter( $gmt_date_keys, array( $this, 'arg_isset' ) ) as $date_key ) { + $valid_date_keys = array_merge( $gmt_date_keys, $local_date_keys ); + $date_keys = array_filter( $valid_date_keys, array( $this, 'arg_isset' ) ); + + // Process already passed date queries args. + if ( $this->arg_isset( 'date_query' ) && is_array( $this->args['date_query'] ) ) { + foreach ( $this->args['date_query'] as $index => $query ) { + if ( ! isset( $query['column'] ) || ! in_array( $query['column'], $valid_date_keys, true ) ) { + unset( $this->args['date_query'][ $index ] ); + continue; + } + // Convert any local dates to GMT. + if ( isset( $local_to_gmt_date_keys[ $query['column'] ] ) ) { + $this->args['date_query'][ $index ]['column'] = $local_to_gmt_date_keys[ $query['column'] ]; + $op = isset( $query['after'] ) ? 'after' : 'before'; + $date_value_local = $query[ $op ]; + $date_value_gmt = wc_string_to_timestamp( get_gmt_from_date( wc_string_to_datetime( $date_value_local ) ) ); + $this->args['date_query'][ $index ][ $op ] = $this->date_to_date_query_arg( $date_value_gmt, 'UTC' ); + } + } + } + + foreach ( $date_keys as $date_key ) { $date_value = $this->args[ $date_key ]; $operator = '='; $dates = array(); + $timezone = in_array( $date_key, $gmt_date_keys, true ) ? '+0000' : wc_timezone_string(); if ( is_string( $date_value ) && preg_match( self::REGEX_SHORTHAND_DATES, $date_value, $matches ) ) { $operator = in_array( $matches[2], $valid_operators, true ) ? $matches[2] : ''; if ( ! empty( $matches[1] ) ) { - $dates[] = $this->date_to_date_query_arg( $matches[1] ); + $dates[] = $this->date_to_date_query_arg( $matches[1], $timezone ); } - $dates[] = $this->date_to_date_query_arg( $matches[3] ); + $dates[] = $this->date_to_date_query_arg( $matches[3], $timezone ); } else { - $dates[] = $this->date_to_date_query_arg( $date_value ); + $dates[] = $this->date_to_date_query_arg( $date_value, $timezone ); } if ( empty( $dates ) || ! $operator || ( '...' === $operator && count( $dates ) < 2 ) ) { @@ -361,6 +389,7 @@ class OrdersTableQuery { $operator_to_keys[] = 'before'; } + $date_key = in_array( $date_key, $local_date_keys, true ) ? $local_to_gmt_date_keys[ $date_key ] : $date_key; $date_queries[] = array_merge( array( 'column' => $date_key, @@ -874,6 +903,9 @@ class OrdersTableQuery { $ids[] = absint( $value ); } elseif ( is_string( $value ) && is_email( $value ) ) { $emails[] = sanitize_email( $value ); + } else { + // Invalid query. + $pieces[] = '1=0'; } } 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 }, 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"); 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( diff --git a/plugins/woocommerce/tests/e2e-pw/tests/admin-analytics/analytics-overview.spec.js b/plugins/woocommerce/tests/e2e-pw/tests/admin-analytics/analytics-overview.spec.js index 9c1e273bcb3..1fc2dab43a5 100644 --- a/plugins/woocommerce/tests/e2e-pw/tests/admin-analytics/analytics-overview.spec.js +++ b/plugins/woocommerce/tests/e2e-pw/tests/admin-analytics/analytics-overview.spec.js @@ -36,7 +36,13 @@ test.describe( 'Analytics pages', () => { '//button[@title="Choose which analytics to display and the section name"]' ); await page.click( 'text=Move up' ); - await page.waitForTimeout( 1000 ); + + // wait for the changes to be saved + await page.waitForResponse( + ( response ) => + response.url().includes( '/users/' ) && + response.status() === 200 + ); } } ); 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..ab8d0a00af6 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,18 +55,28 @@ 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 }` - ); - await page.fill( - `textarea[name="attribute_values[${ i }]"]`, - 'val1 | val2' - ); + + await page + .locator( + `.woocommerce_attribute_data input[name="attribute_names[${ i }]"]` + ) + .fill( `attr #${ i + 1 }` ); + await page + .locator( + `.woocommerce_attribute_data textarea[name="attribute_values[${ i }]"]` + ) + .fill( 'val1 | val2' ); } await page.keyboard.press( 'ArrowUp' ); await page.click( 'text=Save attributes' ); + // wait for the attributes to be saved + await page.waitForResponse( + ( response ) => + response.url().includes( '/post.php?post=' ) && + response.status() === 200 + ); + // 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,23 +215,28 @@ 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 }` - ); - await page.fill( - `textarea[name="attribute_values[${ i }]"]`, - 'val1 | val2' - ); + + await page + .locator( + `.woocommerce_attribute_data input[name="attribute_names[${ i }]"]` + ) + .fill( `attr #${ i + 1 }` ); + await page + .locator( + `.woocommerce_attribute_data textarea[name="attribute_values[${ i }]"]` + ) + .fill( 'val1 | val2' ); await page.keyboard.press( 'ArrowUp' ); await page.click( 'text=Save attributes' ); - await expect( - page - .locator( '.woocommerce_attribute.closed' ) - .filter( { hasText: `attr #${ i + 1 }` } ) - ).toBeVisible(); } + // wait for the attributes to be saved + await page.waitForResponse( + ( response ) => + response.url().includes( '/post.php?post=' ) && + response.status() === 200 + ); + // 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( diff --git a/plugins/woocommerce/tests/legacy/bootstrap.php b/plugins/woocommerce/tests/legacy/bootstrap.php index 01aef6f2c19..7463227d793 100644 --- a/plugins/woocommerce/tests/legacy/bootstrap.php +++ b/plugins/woocommerce/tests/legacy/bootstrap.php @@ -89,6 +89,10 @@ class WC_Unit_Tests_Bootstrap { // re-initialize dependency injection, this needs to be the last operation after everything else is in place. $this->initialize_dependency_injection(); + if ( getenv( 'HPOS' ) ) { + $this->initialize_hpos(); + } + error_reporting(error_reporting() & ~E_DEPRECATED); } @@ -140,6 +144,17 @@ class WC_Unit_Tests_Bootstrap { CodeHacker::enable(); } + /** + * Initialize HPOS if tests need to run in HPOS context. + * + * @return void + */ + private function initialize_hpos() { + \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::delete_order_custom_tables(); + \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_order_custom_table_if_not_exist(); + \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::toggle_cot( true ); + } + /** * Re-initialize the dependency injection engine. * 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 56b0e4cd6ca..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 @@ -37,6 +37,7 @@ class WC_Tests_Admin_Dashboard extends WC_Unit_Test_Case { * Test: get_status_widget */ public function test_status_widget() { + $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' ); @@ -58,6 +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() { + $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' ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-admin-report.php b/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-admin-report.php index 480af399bdc..4b21d058eb3 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-admin-report.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-admin-report.php @@ -18,6 +18,16 @@ class WC_Tests_Admin_Report extends WC_Unit_Test_Case { include_once WC_Unit_Tests_Bootstrap::instance()->plugin_dir . '/includes/admin/reports/class-wc-admin-report.php'; } + /** + * Set up the test. + */ + public function setUp(): void { + parent::setUp(); + if ( \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) { + $this->markTestSkipped( 'This test is not compatible with the custom orders table.' ); + } + } + /** * Clear cached report data. * diff --git a/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-report-sales-by-date.php b/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-report-sales-by-date.php index 8f3364deb11..b7e602e0c56 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-report-sales-by-date.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/admin/reports/class-wc-tests-report-sales-by-date.php @@ -18,6 +18,16 @@ class WC_Tests_Report_Sales_By_Date extends WC_Unit_Test_Case { include_once WC_Unit_Tests_Bootstrap::instance()->plugin_dir . '/includes/admin/reports/class-wc-report-sales-by-date.php'; } + /** + * Set up the test. + */ + public function setUp(): void { + parent::setUp(); + if ( \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) { + $this->markTestSkipped( 'This test is not compatible with the custom orders table.' ); + } + } + /** * Clear cached report data. * diff --git a/plugins/woocommerce/tests/legacy/unit-tests/crud/meta.php b/plugins/woocommerce/tests/legacy/unit-tests/crud/meta.php index 3bcc8da38d8..00c34fd5eac 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/crud/meta.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/crud/meta.php @@ -1,4 +1,7 @@ assertCount( 1, $order->get_meta_data() ); $this->assertTrue( in_array( 'random', wp_list_pluck( $order->get_meta_data(), 'key' ) ) ); - // The new $order should have 3 items of meta since it's freshly loaded. - $this->assertCount( 3, $new_order->get_meta_data() ); + $expected_count = OrderUtil::custom_orders_table_usage_is_enabled() ? 2 : 3; + // The new $order should have 3 items (or 2 in case of HPOS since direct post updates are not read) of meta since it's freshly loaded. + $this->assertCount( $expected_count, $new_order->get_meta_data() ); $this->assertTrue( in_array( 'random', wp_list_pluck( $new_order->get_meta_data(), 'key' ) ) ); $this->assertTrue( in_array( 'random_other', wp_list_pluck( $new_order->get_meta_data(), 'key' ) ) ); - $this->assertTrue( in_array( 'random_other_pre_crud', wp_list_pluck( $new_order->get_meta_data(), 'key' ) ) ); + if ( ! OrderUtil::custom_orders_table_usage_is_enabled() ) { + $this->assertTrue( in_array( 'random_other_pre_crud', wp_list_pluck( $new_order->get_meta_data(), 'key' ), true ) ); + } } /** diff --git a/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php b/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php index 1d6a917bc02..e85e8f0fe50 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-crud-orders.php @@ -5,6 +5,8 @@ * @package WooCommerce\Tests\CRUD */ +use Automattic\WooCommerce\Utilities\OrderUtil; + /** * Meta * @@ -882,10 +884,10 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case { $object = new WC_Order(); // Save + create. - $save_id = $object->save(); - $post = get_post( $save_id ); - $this->assertEquals( 'shop_order', $post->post_type ); - $this->assertEquals( 'shop_order', $post->post_type ); + $save_id = $object->save(); + $post = get_post( $save_id ); + $expected_post_type = OrderUtil::custom_orders_table_usage_is_enabled() ? 'shop_order_placehold' : 'shop_order'; + $this->assertEquals( $expected_post_type, $post->post_type ); // Update. $update_id = $object->save(); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-order-functions.php b/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-order-functions.php index 56d3965f06f..b79ef79f688 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-order-functions.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/order/class-wc-tests-order-functions.php @@ -109,15 +109,19 @@ class WC_Tests_Order_Functions extends WC_Unit_Test_Case { ->will( $this->returnValueMap( $test_counts[ $order_type ] ) ); } - $add_mock_datastores = function( $stores ) use ( $mock_datastores ) { + $add_mock_datastores = function ( $stores ) use ( $mock_datastores ) { return array_merge( $stores, $mock_datastores ); }; - $add_mock_order_type = function( $order_types ) use ( $mock_datastores ) { + $add_mock_order_type = function ( $order_types ) use ( $mock_datastores ) { return array( 'shop_order', 'order-fake-type' ); }; + $return_mock_order_data_store = function ( $stores ) use ( $mock_datastores ) { + return $mock_datastores['order']; + }; add_filter( 'woocommerce_data_stores', $add_mock_datastores ); add_filter( 'wc_order_types', $add_mock_order_type ); + add_filter( 'woocommerce_order_data_store', $return_mock_order_data_store, 1000, 2 ); // Check counts for specific order types. $this->assertEquals( 2, wc_orders_count( 'on-hold', 'shop_order' ) ); @@ -131,6 +135,7 @@ class WC_Tests_Order_Functions extends WC_Unit_Test_Case { remove_filter( 'woocommerce_data_stores', $add_mock_datastores ); remove_filter( 'wc_order_types', $add_mock_order_type ); + remove_filter( 'woocommerce_order_data_store', $return_mock_order_data_store, 1000 ); // Confirm that everything's back to normal. wp_cache_flush(); @@ -190,7 +195,8 @@ class WC_Tests_Order_Functions extends WC_Unit_Test_Case { // Assert the return when $the_order args is false. $this->assertFalse( wc_get_order( false ) ); - $post = get_post( $order->get_id() ); + $post = get_post( $order->get_id() ); + $theorder = $order; $this->assertInstanceOf( 'WC_Order', wc_get_order(), diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Helpers/OrderHelper.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Helpers/OrderHelper.php index 10bea7dcbdc..0c8a35af80f 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Helpers/OrderHelper.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Helpers/OrderHelper.php @@ -14,6 +14,7 @@ use Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableControlle use Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer; use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore; use Automattic\WooCommerce\Internal\Features\FeaturesController; +use Automattic\WooCommerce\Utilities\OrderUtil; use WC_Data_Store; use WC_Mock_Payment_Gateway; use WC_Order; @@ -151,6 +152,23 @@ class OrderHelper { } } + /** + * Enables or disables the custom orders table across WP temporarily. + * + * @param boolean $enabled TRUE to enable COT or FALSE to disable. + * @return void + */ + public static function toggle_cot( bool $enabled ) { + $features_controller = wc_get_container()->get( Featurescontroller::class ); + $features_controller->change_feature_enable( 'custom_order_tables', $enabled ); + + update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, wc_bool_to_string( $enabled ) ); + + // Confirm things are really correct. + $wc_data_store = WC_Data_Store::load( 'order' ); + assert( is_a( $wc_data_store->get_current_class_name(), OrdersTableDataStore::class, true ) === $enabled ); + } + /** * Helper method to create custom tables if not present. */ @@ -170,6 +188,8 @@ class OrderHelper { * @return int Order ID */ public static function create_complex_wp_post_order() { + $current_cot_state = OrderUtil::custom_orders_table_usage_is_enabled(); + self::toggle_cot( false ); update_option( 'woocommerce_prices_include_tax', 'yes' ); update_option( 'woocommerce_calc_taxes', 'yes' ); $uniq_cust_id = wp_generate_password( 10, false ); @@ -239,6 +259,8 @@ class OrderHelper { $order->save(); $order->save_meta_data(); + self::toggle_cot( $current_cot_state ); + return $order->get_id(); } diff --git a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/date-filtering.php b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/date-filtering.php index 2a513e41dc4..b18c201cb44 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/date-filtering.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/rest-api/Tests/Version3/date-filtering.php @@ -10,6 +10,9 @@ * @package WooCommerce\Tests\API */ +use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore; +use Automattic\WooCommerce\Utilities\OrderUtil; + /** * Trait for testing the date filtering on controllers that inherit from WC_REST_CRUD_Controller. */ @@ -34,18 +37,34 @@ trait DateFilteringForCrudControllers { public function test_filter_by_creation_or_modification_date( $param_name, $filter_by_gmt, $expected_to_be_returned ) { global $wpdb; + $timezone_string_option = get_option( 'timezone_string' ); + update_option( 'timezone_string', 'Africa/Blantyre', true ); // +02:00 wp_set_current_user( $this->user ); - $item_id = $this->get_item_for_date_filtering_tests()->get_id(); + $item = $this->get_item_for_date_filtering_tests(); + $item_id = $item->get_id(); - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared - $wpdb->query( - 'UPDATE ' . $wpdb->prefix . "posts SET + if ( $item instanceof WC_Abstract_Order && OrderUtil::custom_orders_table_usage_is_enabled() ) { + $wpdb->update( + OrdersTableDataStore::get_orders_table_name(), + array( + 'date_created_gmt' => '2000-01-01T10:00:00', + 'date_updated_gmt' => '2000-02-01T10:00:00', + ), + array( + 'id' => $item->get_id(), + ) + ); + } else { + // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( + 'UPDATE ' . $wpdb->prefix . "posts SET post_date = '2000-01-01T12:00:00', post_date_gmt = '2000-01-01T10:00:00', post_modified = '2000-02-01T12:00:00', post_modified_gmt = '2000-02-01T10:00:00' WHERE ID = " . $item_id - ); + ); + } // phpcs:enable WordPress.DB.PreparedSQL.NotPrepared $request = new WP_REST_Request( 'GET', $this->get_endpoint_for_date_filtering_tests() ); @@ -60,6 +79,7 @@ trait DateFilteringForCrudControllers { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( $expected_to_be_returned ? 1 : 0, count( $response_items ) ); + update_option( 'timezone_string', $timezone_string_option ); } /** @@ -80,19 +100,35 @@ trait DateFilteringForCrudControllers { public function test_can_filter_by_more_than_one_date( $first_param_name, $first_param_value, $second_param_name, $second_param_value, $filter_by_gmt, $expected_to_be_returned ) { global $wpdb; + $timezone_string_option = get_option( 'timezone_string' ); + update_option( 'timezone_string', 'Africa/Blantyre', true ); // +02:00 wp_set_current_user( $this->user ); - $item_id = $this->get_item_for_date_filtering_tests()->get_id(); + $item = $this->get_item_for_date_filtering_tests(); + $item_id = $item->get_id(); - // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared - $wpdb->query( - 'UPDATE ' . $wpdb->prefix . "posts SET + if ( $item instanceof WC_Abstract_Order && OrderUtil::custom_orders_table_usage_is_enabled() ) { + $wpdb->update( + OrdersTableDataStore::get_orders_table_name(), + array( + 'date_created_gmt' => '2000-01-01T10:00:00', + 'date_updated_gmt' => '2000-02-01T10:00:00', + ), + array( + 'id' => $item->get_id(), + ) + ); + } else { + // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared + $wpdb->query( + 'UPDATE ' . $wpdb->prefix . "posts SET post_date = '2000-01-01T12:00:00', post_date_gmt = '2000-01-01T10:00:00', post_modified = '2000-02-01T12:00:00', post_modified_gmt = '2000-02-01T10:00:00' WHERE ID = " . $item_id - ); - // phpcs:enable WordPress.DB.PreparedSQL.NotPrepared + ); + // phpcs:enable WordPress.DB.PreparedSQL.NotPrepared + } $request = new WP_REST_Request( 'GET', $this->get_endpoint_for_date_filtering_tests() ); $request->set_query_params( @@ -107,5 +143,6 @@ trait DateFilteringForCrudControllers { $this->assertEquals( 200, $response->get_status() ); $this->assertEquals( $expected_to_be_returned ? 1 : 0, count( $response_items ) ); + update_option( 'timezone_string', $timezone_string_option ); } } 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 8aac4611d0b..b70e973b83f 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 @@ -321,13 +321,8 @@ class WC_Admin_Tests_API_Reports_Import extends WC_REST_Unit_Test_Case { // Create 1 draft order - to be excluded from totals. $order = WC_Helper_Order::create_order( $this->customer, $product ); $order->set_date_created( time() - ( 5 * DAY_IN_SECONDS ) ); + $order->set_status( 'auto-draft' ); $order->save(); - wp_update_post( - array( - 'ID' => $order->get_id(), - 'post_status' => 'auto-draft', - ) - ); // Test totals and total params. $request = new WP_REST_Request( 'GET', $this->endpoint . '/totals' ); diff --git a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/field.php b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/field.php index 8fb257ee73a..ddcb3e0013a 100644 --- a/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/field.php +++ b/plugins/woocommerce/tests/legacy/unit-tests/woocommerce-admin/product-form/field.php @@ -21,7 +21,7 @@ class WC_Admin_Tests_ProductForm_Field extends WC_Unit_Test_Case { new Field( 'id', 'woocommerce', - array(), + array() ); } } diff --git a/plugins/woocommerce/tests/php/helpers/HPOSToggleTrait.php b/plugins/woocommerce/tests/php/helpers/HPOSToggleTrait.php index 3cda5b546b4..4531a3eb28d 100644 --- a/plugins/woocommerce/tests/php/helpers/HPOSToggleTrait.php +++ b/plugins/woocommerce/tests/php/helpers/HPOSToggleTrait.php @@ -49,14 +49,7 @@ trait HPOSToggleTrait { * @return void */ private function toggle_cot( bool $enabled ): void { - $features_controller = wc_get_container()->get( Featurescontroller::class ); - $features_controller->change_feature_enable( 'custom_order_tables', $enabled ); - - update_option( CustomOrdersTableController::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, wc_bool_to_string( $enabled ) ); - - // Confirm things are really correct. - $wc_data_store = WC_Data_Store::load( 'order' ); - assert( is_a( $wc_data_store->get_current_class_name(), OrdersTableDataStore::class, true ) === $enabled ); + OrderHelper::toggle_cot( $enabled ); } /** 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 e3af7d32052..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,16 +1,48 @@ cot_state = \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled(); + OrderHelper::toggle_cot( false ); + } + + /** + * Restore COT state after the test. + * + * @return void + */ + public function tearDown(): void { + parent::tearDown(); + wp_cache_flush(); + OrderHelper::toggle_cot( $this->cot_state ); + } + /** * @testDox get_orders should be able to return multiple orders of different types. */ public function test_get_orders_with_multiple_order_type() { - $order1 = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_complex_wp_post_order(); - $order2 = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_complex_wp_post_order(); + $order1 = OrderHelper::create_complex_wp_post_order(); + $order2 = OrderHelper::create_complex_wp_post_order(); assert( $order1 > 0 ); assert( $order2 > 0 ); @@ -45,4 +77,23 @@ class WC_Order_Factory_Test extends WC_Unit_Test_Case { $this->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 ); + } + } diff --git a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-customer-data-store-session-test.php b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-customer-data-store-session-test.php index 75ef103b8e0..126d1b055a5 100644 --- a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-customer-data-store-session-test.php +++ b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-customer-data-store-session-test.php @@ -11,11 +11,12 @@ class WC_Customer_Data_Store_Session_Test extends WC_Unit_Test_Case { * @see https://github.com/woocommerce/woocommerce/issues/28759 * @dataProvider provide_customers_with_different_addresses * - * @param WC_Customer $customer The customer object being tested. - * @param bool $states_should_match If the billing and shipping states should match. - * @param bool $countries_should_match If the billing and shipping countries should match. + * @param Closure $customer_closure The customer object being tested. + * @param bool $states_should_match If the billing and shipping states should match. + * @param bool $countries_should_match If the billing and shipping countries should match. */ - public function test_setting_default_address_fields( WC_Customer $customer, bool $states_should_match, bool $countries_should_match ) { + public function test_setting_default_address_fields( Closure $customer_closure, bool $states_should_match, bool $countries_should_match ) { + $customer = $customer_closure(); $session_data = new WC_Customer_Data_Store_Session(); $session_data->read( $customer ); @@ -46,66 +47,78 @@ class WC_Customer_Data_Store_Session_Test extends WC_Unit_Test_Case { * @return array[] */ public function provide_customers_with_different_addresses() { - $has_billing_address_only = new WC_Customer(); - $has_billing_address_only->set_email( 'wc-customer-test-01@test.user' ); - $has_billing_address_only->set_billing_address( '1234 Quality Lane' ); - $has_billing_address_only->set_billing_city( 'Testville' ); - $has_billing_address_only->set_billing_country( 'US' ); - $has_billing_address_only->set_billing_state( 'CA' ); - $has_billing_address_only->set_billing_postcode( '90123' ); - $has_billing_address_only->save(); + $cust1_closure = function () { + $has_billing_address_only = new WC_Customer(); + $has_billing_address_only->set_email( 'wc-customer-test-01@test.user' ); + $has_billing_address_only->set_billing_address( '1234 Quality Lane' ); + $has_billing_address_only->set_billing_city( 'Testville' ); + $has_billing_address_only->set_billing_country( 'US' ); + $has_billing_address_only->set_billing_state( 'CA' ); + $has_billing_address_only->set_billing_postcode( '90123' ); + $has_billing_address_only->save(); + return $has_billing_address_only; + }; - $separate_billing_and_shipping_state_and_country = new WC_Customer(); - $separate_billing_and_shipping_state_and_country->set_email( 'wc-customer-test-02@test.user' ); - $separate_billing_and_shipping_state_and_country->set_billing_address( '4567 Scenario Street' ); - $separate_billing_and_shipping_state_and_country->set_billing_city( 'Unitly' ); - $separate_billing_and_shipping_state_and_country->set_billing_country( 'UK' ); - $separate_billing_and_shipping_state_and_country->set_billing_state( 'Computershire' ); - $separate_billing_and_shipping_state_and_country->set_billing_postcode( 'ZX1 2PQ' ); - $separate_billing_and_shipping_state_and_country->set_shipping_address( '8901 Situation Court' ); - $separate_billing_and_shipping_state_and_country->set_shipping_city( 'Endtoendly' ); - $separate_billing_and_shipping_state_and_country->set_shipping_country( 'CA' ); - $separate_billing_and_shipping_state_and_country->set_shipping_state( 'BC' ); - $separate_billing_and_shipping_state_and_country->set_shipping_postcode( 'A1B 2C3' ); - $separate_billing_and_shipping_state_and_country->save(); + $cust2_closure = function () { + $separate_billing_and_shipping_state_and_country = new WC_Customer(); + $separate_billing_and_shipping_state_and_country->set_email( 'wc-customer-test-02@test.user' ); + $separate_billing_and_shipping_state_and_country->set_billing_address( '4567 Scenario Street' ); + $separate_billing_and_shipping_state_and_country->set_billing_city( 'Unitly' ); + $separate_billing_and_shipping_state_and_country->set_billing_country( 'UK' ); + $separate_billing_and_shipping_state_and_country->set_billing_state( 'Computershire' ); + $separate_billing_and_shipping_state_and_country->set_billing_postcode( 'ZX1 2PQ' ); + $separate_billing_and_shipping_state_and_country->set_shipping_address( '8901 Situation Court' ); + $separate_billing_and_shipping_state_and_country->set_shipping_city( 'Endtoendly' ); + $separate_billing_and_shipping_state_and_country->set_shipping_country( 'CA' ); + $separate_billing_and_shipping_state_and_country->set_shipping_state( 'BC' ); + $separate_billing_and_shipping_state_and_country->set_shipping_postcode( 'A1B 2C3' ); + $separate_billing_and_shipping_state_and_country->save(); + return $separate_billing_and_shipping_state_and_country; + }; - $separate_billing_state_same_country = new WC_Customer(); - $separate_billing_state_same_country->set_email( 'wc-customer-test-03@test.user' ); - $separate_billing_state_same_country->set_billing_address( '4567 Scenario Street' ); - $separate_billing_state_same_country->set_billing_city( 'Unitly' ); - $separate_billing_state_same_country->set_billing_country( 'UK' ); - $separate_billing_state_same_country->set_billing_state( 'Computershire' ); - $separate_billing_state_same_country->set_billing_postcode( 'ZX1 2PQ' ); - $separate_billing_state_same_country->set_shipping_address( '8901 Situation Court' ); - $separate_billing_state_same_country->set_shipping_city( 'Endtoendly' ); - $separate_billing_state_same_country->set_shipping_country( 'UK' ); - $separate_billing_state_same_country->set_shipping_state( 'Byteshire' ); - $separate_billing_state_same_country->set_shipping_postcode( 'RS1 2TU' ); - $separate_billing_state_same_country->save(); + $cust3_closure = function () { + $separate_billing_state_same_country = new WC_Customer(); + $separate_billing_state_same_country->set_email( 'wc-customer-test-03@test.user' ); + $separate_billing_state_same_country->set_billing_address( '4567 Scenario Street' ); + $separate_billing_state_same_country->set_billing_city( 'Unitly' ); + $separate_billing_state_same_country->set_billing_country( 'UK' ); + $separate_billing_state_same_country->set_billing_state( 'Computershire' ); + $separate_billing_state_same_country->set_billing_postcode( 'ZX1 2PQ' ); + $separate_billing_state_same_country->set_shipping_address( '8901 Situation Court' ); + $separate_billing_state_same_country->set_shipping_city( 'Endtoendly' ); + $separate_billing_state_same_country->set_shipping_country( 'UK' ); + $separate_billing_state_same_country->set_shipping_state( 'Byteshire' ); + $separate_billing_state_same_country->set_shipping_postcode( 'RS1 2TU' ); + $separate_billing_state_same_country->save(); + return $separate_billing_state_same_country; + }; - $shipping_address_is_effectively_empty = new WC_Customer(); - $shipping_address_is_effectively_empty->set_email( 'wc-customer-test-04@test.user' ); - $shipping_address_is_effectively_empty->set_shipping_address( ' ' ); - $shipping_address_is_effectively_empty->save(); + $cust4_closure = function () { + $shipping_address_is_effectively_empty = new WC_Customer(); + $shipping_address_is_effectively_empty->set_email( 'wc-customer-test-04@test.user' ); + $shipping_address_is_effectively_empty->set_shipping_address( ' ' ); + $shipping_address_is_effectively_empty->save(); + return $shipping_address_is_effectively_empty; + }; return array( 'has_billing_address_only' => array( - $has_billing_address_only, + $cust1_closure, true, true, ), 'separate_billing_and_shipping_state_and_country' => array( - $separate_billing_and_shipping_state_and_country, + $cust2_closure, false, false, ), 'separate_billing_state_same_country' => array( - $separate_billing_state_same_country, + $cust3_closure, false, true, ), 'shipping_address_is_effectively_empty' => array( - $shipping_address_is_effectively_empty, + $cust4_closure, true, true, ), diff --git a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php index 011a0bdf776..4fb6bd7132c 100644 --- a/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php +++ b/plugins/woocommerce/tests/php/includes/data-stores/class-wc-order-data-store-cpt-test.php @@ -1,9 +1,40 @@ prev_cot_state = OrderUtil::custom_orders_table_usage_is_enabled(); + OrderHelper::toggle_cot( false ); + } + + /** + * Restore the COT state after the test. + * + * @return void + */ + public function tearDown(): void { + OrderHelper::toggle_cot( $this->prev_cot_state ); + parent::tearDown(); + } /** * Test that refund cache are invalidated correctly when refund is deleted. @@ -131,7 +162,7 @@ class WC_Order_Data_Store_CPT_Test extends WC_Unit_Test_Case { * Legacy getters and setters for props migrated from data stores should be set/reset properly. */ public function test_legacy_getters_setters() { - $order_id = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_complex_wp_post_order(); + $order_id = OrderHelper::create_complex_wp_post_order(); $order = wc_get_order( $order_id ); $bool_props = array( '_download_permissions_granted' => 'download_permissions_granted', diff --git a/plugins/woocommerce/tests/php/includes/gateways/paypal/class-wc-gateway-paypal-test.php b/plugins/woocommerce/tests/php/includes/gateways/paypal/class-wc-gateway-paypal-test.php index 7f319dc4181..4f26bdfad79 100644 --- a/plugins/woocommerce/tests/php/includes/gateways/paypal/class-wc-gateway-paypal-test.php +++ b/plugins/woocommerce/tests/php/includes/gateways/paypal/class-wc-gateway-paypal-test.php @@ -29,8 +29,8 @@ class WC_Gateway_Paypal_Test extends \WC_Unit_Test_Case { $order = WC_Helper_Order::create_order(); $order->save(); - update_post_meta( $order->get_id(), '_paypal_status', 'pending' ); - update_post_meta( $order->get_id(), '_transaction_id', $this->transaction_id_26960 ); + $order->update_meta_data( '_paypal_status', 'pending' ); + $order->set_transaction_id( $this->transaction_id_26960 ); $order->set_payment_method( 'paypal' ); $order->save(); @@ -56,8 +56,8 @@ class WC_Gateway_Paypal_Test extends \WC_Unit_Test_Case { $order = WC_Helper_Order::create_order(); $order->save(); - update_post_meta( $order->get_id(), '_paypal_status', 'pending' ); - update_post_meta( $order->get_id(), '_transaction_id', $this->transaction_id_26960 ); + $order->update_meta_data( '_paypal_status', 'pending' ); + $order->set_transaction_id( $this->transaction_id_26960 ); $order->set_payment_method( 'paypal' ); $order->save(); 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' ); + } + } } diff --git a/plugins/woocommerce/tests/php/src/Caching/OrderCacheTest.php b/plugins/woocommerce/tests/php/src/Caching/OrderCacheTest.php new file mode 100644 index 00000000000..cd165a223a3 --- /dev/null +++ b/plugins/woocommerce/tests/php/src/Caching/OrderCacheTest.php @@ -0,0 +1,51 @@ +sut = new OrderCache(); + } + + /** + * Test that the order cache does not cause duplicate data storage. + */ + public function test_meta_is_not_duplicated_when_cached() { + global $wpdb; + if ( ! OrderUtil::orders_cache_usage_is_enabled() ) { + // tip: add HPOS=1 env variable to run this test. + $this->markTestSkipped( 'HPOS based caching is not enabled.' ); + } + $order = WC_Helper_Order::create_order(); + $order->add_meta_data( 'test', 'test' ); + $order->save_meta_data(); + + $order = wc_get_order( $order->get_id() ); + $this->assertTrue( $this->sut->is_cached( $order->get_id() ), 'Order was not cached, but it was expected to be cached. Are you sure that HPOS based caching is enabled.' ); + + $order2 = wc_get_order( $order->get_id() ); + $order2->save_meta_data(); + + $orders_meta_table = OrdersTableDataStore::get_meta_table_name(); + $query = $wpdb->prepare( "SELECT id FROM $orders_meta_table WHERE order_id = %d AND meta_key = %s", $order->get_id(), 'test' ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared + $this->assertEquals( 1, count( $wpdb->get_col( $query ) ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Already prepared query. + } + +} diff --git a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php index 47538063371..913f40bc591 100644 --- a/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php +++ b/plugins/woocommerce/tests/php/src/Internal/DataStores/Orders/OrdersTableDataStoreTests.php @@ -7,6 +7,7 @@ use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore; use Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableQuery; use Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper; use Automattic\WooCommerce\RestApi\UnitTests\HPOSToggleTrait; +use Automattic\WooCommerce\Utilities\OrderUtil; require_once __DIR__ . '/../../../../helpers/HPOSToggleTrait.php'; @@ -39,6 +40,12 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { */ private $cpt_data_store; + /** + * Whether COT was enabled before the test. + * @var bool + */ + private $cot_state; + /** * Initializes system under test. */ @@ -49,6 +56,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { parent::setUp(); // Remove the Test Suite’s use of temporary tables https://wordpress.stackexchange.com/a/220308. $this->setup_cot(); + $this->cot_state = OrderUtil::custom_orders_table_usage_is_enabled(); $this->toggle_cot( false ); $this->sut = wc_get_container()->get( OrdersTableDataStore::class ); $this->migrator = wc_get_container()->get( PostsToOrdersMigrationController::class ); @@ -61,6 +69,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { public function tearDown(): void { //phpcs:ignore WordPress.DateTime.RestrictedFunctions.timezone_change_date_default_timezone_set -- We need to change the timezone to test the date sync fields. update_option( 'timezone_string', $this->original_time_zone ); + $this->toggle_cot( $this->cot_state ); $this->clean_up_cot_setup(); parent::tearDown(); } @@ -207,6 +216,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { wp_cache_flush(); $order = new WC_Order(); $order->set_id( $post_order->get_id() ); + $this->toggle_cot( true ); $this->switch_data_store( $order, $this->sut ); $this->sut->read( $order ); @@ -241,6 +251,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { foreach ( $datastore_updates as $prop => $value ) { $this->assertEquals( $value, $this->sut->{"get_$prop"}( $order ), "Unable to match prop $prop" ); } + $this->toggle_cot( false ); } /** @@ -1769,6 +1780,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { * Ideally, this should be possible only from getters and setters for objects, but for backward compatibility, earlier ways are also supported. */ public function test_internal_ds_getters_and_setters() { + $this->toggle_cot( true ); $props_to_test = array( '_download_permissions_granted', '_recorded_sales', @@ -1815,6 +1827,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { $order->save(); } $this->assert_get_prop_via_ds_object_and_metadata( $props_to_test, $order, false, $ds_getter_setter_names ); + $this->toggle_cot( false ); } /** @@ -1857,7 +1870,8 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { * @testDox Legacy getters and setters for props migrated from data stores should be set/reset properly. */ public function test_legacy_getters_setters() { - $order_id = \Automattic\WooCommerce\RestApi\UnitTests\Helpers\OrderHelper::create_complex_wp_post_order(); + $this->toggle_cot( true ); + $order_id = OrderHelper::create_complex_data_store_order( $this->sut ); $order = wc_get_order( $order_id ); $this->switch_data_store( $order, $this->sut ); $bool_props = array( @@ -1889,7 +1903,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { $this->assert_props_value_via_data_store( $order, $bool_props, true ); $this->assert_props_value_via_order_object( $order, $bool_props, true ); - + $this->toggle_cot( false ); } /** @@ -1986,8 +2000,9 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { */ public function test_read_multiple_dont_sync_again_for_same_order() { $this->toggle_cot( true ); - $this->enable_cot_sync(); $order = $this->create_complex_cot_order(); + $this->sut->backfill_post_record( $order ); + $this->enable_cot_sync(); $order_id = $order->get_id(); @@ -2001,6 +2016,7 @@ class OrdersTableDataStoreTests extends WC_Unit_Test_Case { $this->assertTrue( $should_sync_callable->call( $this->sut, $order ) ); $this->sut->read_multiple( $orders ); $this->assertFalse( $should_sync_callable->call( $this->sut, $order ) ); + $this->toggle_cot( false ); } /** diff --git a/plugins/woocommerce/woocommerce.php b/plugins/woocommerce/woocommerce.php index 5fb548b0296..5ad4922ff91 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.6.0-dev + * Version: 7.7.0-dev * Author: Automattic * Author URI: https://woocommerce.com * Text Domain: woocommerce diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc2c32e5e75..18ea03d060e 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: @@ -523,6 +523,7 @@ importers: '@woocommerce/experimental': workspace:* '@woocommerce/internal-style-build': workspace:* '@woocommerce/navigation': workspace:* + '@woocommerce/tracks': workspace:* '@wordpress/browserslist-config': wp-6.0 '@wordpress/components': wp-6.0 '@wordpress/compose': wp-6.0 @@ -573,6 +574,7 @@ importers: '@woocommerce/eslint-plugin': link:../eslint-plugin '@woocommerce/internal-style-build': link:../internal-style-build '@woocommerce/navigation': link:../navigation + '@woocommerce/tracks': link:../tracks '@wordpress/browserslist-config': 4.1.3 concurrently: 7.0.0 css-loader: 3.6.0_webpack@5.70.0 @@ -608,6 +610,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 +638,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 @@ -1361,9 +1365,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 @@ -1379,6 +1390,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,19 +1436,20 @@ 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/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 @@ -1444,8 +1457,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 @@ -1468,7 +1488,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 @@ -1980,12 +2000,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 @@ -2002,7 +2022,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 @@ -2271,10 +2291,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 @@ -2291,7 +2311,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 @@ -2345,7 +2365,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==} @@ -2648,6 +2675,28 @@ packages: optionalDependencies: '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 chokidar: 3.5.3 + dev: true + + /@babel/cli/7.17.6_@babel+core@7.21.3: + resolution: {integrity: sha512-l4w608nsDNlxZhiJ5tE3DbNmr61fIKMZ6fTBo171VEFuFMIYuJ3mHRhTLEkKKyvx2Mizkkv/0a8OJOnZqkKYNA==} + engines: {node: '>=6.9.0'} + hasBin: true + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.21.3 + '@jridgewell/trace-mapping': 0.3.16 + commander: 4.1.1 + convert-source-map: 1.8.0 + fs-readdir-recursive: 1.1.0 + glob: 7.2.0 + make-dir: 2.1.0 + slash: 2.0.0 + source-map: 0.5.7 + optionalDependencies: + '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3 + chokidar: 3.5.3 + dev: false /@babel/code-frame/7.12.11: resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==} @@ -2680,6 +2729,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'} @@ -2708,18 +2761,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: @@ -2748,6 +2801,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} @@ -2776,14 +2851,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 @@ -2802,35 +2877,44 @@ 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 dev: true /@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==} @@ -2844,56 +2928,85 @@ packages: browserslist: 4.19.3 semver: 6.3.0 - /@babel/helper-compilation-targets/7.17.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/compat-data': 7.21.0 + '@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/core': 7.12.9 - '@babel/helper-validator-option': 7.18.6 - browserslist: 4.21.4 - semver: 6.3.0 - - /@babel/helper-compilation-targets/7.19.3_@babel+core@7.16.12: - resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} - 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.19.3_@babel+core@7.17.8: 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.17.8 '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 semver: 6.3.0 + /@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 + dev: true + + /@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.17.8: resolution: {integrity: sha512-SogLLSxXm2OkBbSsHZMM4tUi8fUzjs63AT/d0YQIzr6GSd8Hxsbk2KYDX0k0DweAzGMj/YWeiCsorIdtdcW8Eg==} engines: {node: '>=6.9.0'} @@ -2903,7 +3016,7 @@ 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-member-expression-to-functions': 7.18.9 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-replace-supers': 7.19.1 @@ -2911,6 +3024,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.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.19.0_@babel+core@7.12.9: resolution: {integrity: sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==} engines: {node: '>=6.9.0'} @@ -2920,7 +3051,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 @@ -2937,7 +3068,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 @@ -2955,6 +3086,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 @@ -2993,6 +3141,17 @@ packages: '@babel/core': 7.17.8 '@babel/helper-annotate-as-pure': 7.18.6 regexpu-core: 5.2.1 + dev: true + + /@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==} @@ -3000,10 +3159,28 @@ 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-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 @@ -3018,7 +3195,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 @@ -3033,7 +3210,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 @@ -3049,7 +3226,23 @@ 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 + dev: true + + /@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 @@ -3066,45 +3259,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==} @@ -3115,9 +3315,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 @@ -3130,9 +3330,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 @@ -3140,7 +3355,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==} @@ -3164,7 +3379,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 @@ -3174,7 +3389,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 dev: true @@ -3189,7 +3404,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 @@ -3203,7 +3418,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 @@ -3218,7 +3433,22 @@ 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: true + + /@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 @@ -3229,8 +3459,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 @@ -3238,24 +3468,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'} @@ -3276,10 +3516,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 @@ -3287,9 +3527,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 @@ -3313,15 +3563,22 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.19.3 + '@babel/types': 7.21.3 - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.16.7_@babel+core@7.17.8: + /@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.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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -3353,17 +3610,27 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.16.7_@babel+core@7.17.8: + /@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.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.17.8 + '@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.17.8 + '@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: @@ -3400,6 +3667,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: 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'} + 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==} @@ -3414,16 +3693,16 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-proposal-async-generator-functions/7.16.8_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@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 + '@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 @@ -3470,6 +3749,21 @@ packages: '@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'} + 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==} @@ -3495,6 +3789,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.19.0 + 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'} @@ -3531,17 +3838,30 @@ packages: '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color + dev: true - /@babel/plugin-proposal-class-static-block/7.17.6_@babel+core@7.17.8: + /@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.21.3: 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/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.17.8 + '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.21.3 transitivePeerDependencies: - supports-color dev: true @@ -3586,6 +3906,20 @@ packages: '@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.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==} @@ -3601,6 +3935,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'} @@ -3611,15 +3959,15 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 + '@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: @@ -3653,6 +4001,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: 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'} + 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==} @@ -3673,6 +4032,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==} @@ -3684,15 +4054,15 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 + '@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: @@ -3726,6 +4096,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: 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'} + 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==} @@ -3737,15 +4118,15 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 + '@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: @@ -3779,6 +4160,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: 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'} + 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==} @@ -3790,15 +4182,15 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 + '@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: @@ -3832,6 +4224,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: 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'} + 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==} @@ -3853,6 +4256,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'} @@ -3883,6 +4297,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: 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'} + 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==} @@ -3894,15 +4319,15 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 + '@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: @@ -3936,6 +4361,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: 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'} + 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==} @@ -3967,23 +4403,37 @@ 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: 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.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 + 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 @@ -3994,9 +4444,9 @@ 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-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 '@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 @@ -4008,12 +4458,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: 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'} + 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==} @@ -4025,15 +4489,15 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.17.8 + '@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: @@ -4066,6 +4530,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: 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'} + 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==} @@ -4089,6 +4564,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'} @@ -4122,6 +4609,18 @@ packages: '@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.17.8 + dev: true + + /@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==} @@ -4148,6 +4647,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.12.9: resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} engines: {node: '>=6.9.0'} @@ -4185,6 +4697,19 @@ packages: '@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'} + 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.17.8: resolution: {integrity: sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==} @@ -4201,6 +4726,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.12.9: resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==} engines: {node: '>=6.9.0'} @@ -4244,6 +4784,21 @@ packages: '@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'} + 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==} @@ -4255,14 +4810,14 @@ 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.17.8: + /@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.17.8 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@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 @@ -4296,6 +4851,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: true + + /@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==} @@ -4321,6 +4887,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4338,6 +4913,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==} @@ -4363,6 +4947,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4392,6 +4985,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4403,6 +5006,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: @@ -4427,6 +5040,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4445,6 +5067,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==} @@ -4470,6 +5102,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4489,13 +5130,22 @@ packages: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-syntax-import-assertions/7.18.6_@babel+core@7.17.8: + /@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.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.17.8 + '@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: @@ -4514,6 +5164,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==} @@ -4539,6 +5198,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4597,6 +5265,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: @@ -4621,6 +5298,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4647,6 +5333,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: @@ -4671,6 +5365,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4696,6 +5399,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4721,6 +5433,15 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4747,6 +5468,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'} @@ -4775,6 +5504,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4803,6 +5542,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -4823,6 +5572,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'} @@ -4832,13 +5590,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: @@ -4860,6 +5618,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'} @@ -4887,6 +5655,16 @@ packages: 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'} + 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==} @@ -4915,6 +5693,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'} @@ -4954,6 +5746,20 @@ packages: '@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'} + 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==} @@ -4964,13 +5770,13 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5001,6 +5807,16 @@ packages: 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'} + 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==} @@ -5021,6 +5837,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'} @@ -5048,6 +5874,16 @@ packages: 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'} + 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==} @@ -5075,7 +5911,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 @@ -5093,9 +5948,9 @@ 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-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 @@ -5112,9 +5967,9 @@ packages: 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-compilation-targets': 7.20.7_@babel+core@7.16.12 '@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 @@ -5132,9 +5987,29 @@ 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.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.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.21.0 '@babel/helper-optimise-call-expression': 7.18.6 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-replace-supers': 7.19.1 @@ -5152,13 +6027,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-computed-properties/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5189,6 +6064,16 @@ packages: 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'} + 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==} @@ -5209,6 +6094,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'} @@ -5236,6 +6131,16 @@ packages: 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'} + 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==} @@ -5247,14 +6152,14 @@ 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.17.8: + /@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.17.8 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@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 @@ -5288,6 +6193,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: true + + /@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==} @@ -5298,13 +6214,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-duplicate-keys/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5336,6 +6252,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@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'} + 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==} @@ -5347,13 +6273,13 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5388,6 +6314,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: 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'} + 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==} @@ -5409,6 +6346,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'} @@ -5428,6 +6375,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'} @@ -5455,6 +6412,16 @@ packages: 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'} + 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==} @@ -5466,15 +6433,15 @@ 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.17.8: + /@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.17.8 - '@babel/helper-compilation-targets': 7.19.3_@babel+core@7.17.8 - '@babel/helper-function-name': 7.19.0 + '@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 @@ -5485,8 +6452,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.16.12: @@ -5496,8 +6463,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 @@ -5508,8 +6475,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.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: @@ -5521,13 +6500,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-literals/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5558,6 +6537,16 @@ packages: 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'} + 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==} @@ -5568,13 +6557,13 @@ 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.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5605,6 +6594,16 @@ packages: 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'} + 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==} @@ -5613,20 +6612,20 @@ 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: - supports-color - /@babel/plugin-transform-modules-amd/7.16.7_@babel+core@7.17.8: + /@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.17.8 - '@babel/helper-module-transforms': 7.19.0 + '@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: @@ -5640,7 +6639,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: @@ -5654,7 +6653,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 babel-plugin-dynamic-import-node: 2.3.3 transitivePeerDependencies: @@ -5668,7 +6667,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: 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'} + 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: @@ -5681,7 +6694,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 @@ -5695,13 +6708,28 @@ 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-plugin-dynamic-import-node: 2.3.3 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.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.12.9: resolution: {integrity: sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==} engines: {node: '>=6.9.0'} @@ -5709,7 +6737,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 @@ -5723,7 +6751,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 '@babel/helper-simple-access': 7.18.6 babel-plugin-dynamic-import-node: 2.3.3 @@ -5738,7 +6766,22 @@ 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-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'} + 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.18.6 babel-plugin-dynamic-import-node: 2.3.3 @@ -5753,22 +6796,22 @@ 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 transitivePeerDependencies: - supports-color - /@babel/plugin-transform-modules-systemjs/7.17.8_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@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 @@ -5784,7 +6827,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 @@ -5800,7 +6843,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 @@ -5816,7 +6859,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.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 @@ -5830,19 +6889,19 @@ 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 - /@babel/plugin-transform-modules-umd/7.16.7_@babel+core@7.17.8: + /@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.17.8 - '@babel/helper-module-transforms': 7.19.0 + '@babel/core': 7.21.3 + '@babel/helper-module-transforms': 7.21.2 '@babel/helper-plugin-utils': 7.19.0 transitivePeerDependencies: - supports-color @@ -5855,7 +6914,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 @@ -5868,7 +6927,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 @@ -5881,7 +6940,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.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 @@ -5895,14 +6967,14 @@ 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.17.8: + /@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.17.8 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@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: @@ -5935,6 +7007,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: 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'} + 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==} @@ -5945,13 +7028,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-new-target/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -5983,6 +7066,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@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'} + 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==} @@ -5996,13 +7089,13 @@ packages: transitivePeerDependencies: - supports-color - /@babel/plugin-transform-object-super/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 '@babel/helper-replace-supers': 7.19.1 transitivePeerDependencies: @@ -6045,6 +7138,19 @@ packages: '@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'} + 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==} @@ -6065,6 +7171,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'} @@ -6092,6 +7208,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true + + /@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==} @@ -6102,13 +7228,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-property-literals/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -6139,14 +7265,24 @@ packages: dependencies: '@babel/core': 7.17.8 '@babel/helper-plugin-utils': 7.19.0 + dev: true - /@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 @@ -6167,6 +7303,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==} @@ -6178,6 +7324,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'} @@ -6187,13 +7343,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: @@ -6205,13 +7361,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: @@ -6256,6 +7412,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.18.6_@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'} @@ -6267,7 +7437,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==} @@ -6280,7 +7450,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==} @@ -6293,6 +7477,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'} @@ -6302,13 +7497,13 @@ packages: '@babel/core': 7.12.9 regenerator-transform: 0.14.5 - /@babel/plugin-transform-regenerator/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 regenerator-transform: 0.14.5 dev: true @@ -6343,6 +7538,17 @@ packages: '@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'} + 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==} @@ -6353,13 +7559,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-reserved-words/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -6391,6 +7597,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@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'} + 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==} @@ -6416,9 +7632,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 @@ -6426,18 +7642,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/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 + '@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-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 @@ -6459,18 +7675,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 @@ -6494,6 +7710,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'} @@ -6521,6 +7747,16 @@ packages: 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'} + 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==} @@ -6543,6 +7779,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'} @@ -6573,6 +7820,17 @@ packages: '@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'} + 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==} @@ -6583,13 +7841,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-sticky-regex/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -6620,6 +7878,16 @@ packages: 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'} + 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==} @@ -6640,6 +7908,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'} @@ -6667,6 +7945,16 @@ packages: 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'} + 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==} @@ -6677,13 +7965,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-typeof-symbol/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -6715,6 +8003,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@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'} + 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==} @@ -6743,6 +8041,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'} @@ -6756,16 +8067,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 @@ -6778,13 +8089,13 @@ packages: '@babel/core': 7.12.9 '@babel/helper-plugin-utils': 7.19.0 - /@babel/plugin-transform-unicode-escapes/7.16.7_@babel+core@7.17.8: + /@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.17.8 + '@babel/core': 7.21.3 '@babel/helper-plugin-utils': 7.19.0 dev: true @@ -6816,6 +8127,16 @@ packages: dependencies: '@babel/core': 7.17.8 '@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'} + 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==} @@ -6827,14 +8148,14 @@ 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.17.8: + /@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.17.8 - '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.17.8 + '@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 @@ -6868,6 +8189,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: 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'} + 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==} @@ -6958,9 +8290,9 @@ packages: 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/helper-validator-option': 7.18.6 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.12.9 @@ -7027,7 +8359,7 @@ packages: '@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.19.3 + '@babel/types': 7.21.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 @@ -7043,9 +8375,9 @@ 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-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 '@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 @@ -7112,7 +8444,7 @@ packages: '@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.19.3 + '@babel/types': 7.21.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 @@ -7128,94 +8460,9 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.17.7 + '@babel/compat-data': 7.21.0 '@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 - '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.17.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.17.8 - '@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-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.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.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.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/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 @@ -7240,7 +8487,6 @@ packages: '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.17.8 '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.17.8 '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.17.8 - '@babel/plugin-syntax-import-assertions': 7.18.6_@babel+core@7.17.8 '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.17.8 '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.17.8 '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.17.8 @@ -7283,10 +8529,181 @@ 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 + 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 + semver: 6.3.0 + transitivePeerDependencies: + - 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.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: @@ -7303,6 +8720,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: @@ -7312,7 +8741,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: @@ -7324,7 +8753,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 @@ -7337,7 +8766,20 @@ 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 + dev: true + + /@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: @@ -7355,6 +8797,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'} @@ -7376,22 +8833,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 @@ -7421,6 +8891,27 @@ 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: + 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'} @@ -7445,29 +8936,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: @@ -7478,13 +8977,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: @@ -7512,6 +9028,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 @@ -7572,6 +9096,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: @@ -7637,6 +9181,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==} @@ -7711,6 +9271,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: @@ -7773,6 +9358,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: @@ -8690,7 +10299,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 @@ -8714,7 +10323,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 @@ -8738,7 +10347,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 @@ -8760,7 +10369,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 @@ -8817,13 +10426,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==} @@ -8842,6 +10458,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: @@ -10214,7 +11836,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 @@ -10553,27 +12175,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 @@ -10593,9 +12215,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 @@ -10646,27 +12268,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 @@ -10686,9 +12308,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 @@ -10739,27 +12361,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 @@ -10779,9 +12401,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 @@ -10832,27 +12454,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 @@ -10872,9 +12494,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 @@ -10925,27 +12547,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 @@ -10965,9 +12587,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 @@ -11253,7 +12875,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 +12953,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 +12992,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 @@ -11396,34 +13018,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 @@ -11434,7 +13056,7 @@ packages: glob: 7.2.0 handlebars: 4.7.7 interpret: 2.2.0 - json5: 2.2.0 + json5: 2.2.3 lazy-universal-dotenv: 3.0.1 picomatch: 2.3.0 pkg-dir: 5.0.0 @@ -11466,34 +13088,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 @@ -11504,7 +13126,7 @@ packages: glob: 7.2.0 handlebars: 4.7.7 interpret: 2.2.0 - json5: 2.2.0 + json5: 2.2.3 lazy-universal-dotenv: 3.0.1 picomatch: 2.3.0 pkg-dir: 5.0.0 @@ -12091,13 +13713,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 @@ -12128,9 +13750,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 @@ -12139,7 +13761,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 @@ -12189,9 +13811,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 @@ -12200,7 +13822,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 @@ -12250,9 +13872,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 @@ -12261,7 +13883,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 @@ -12311,9 +13933,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 @@ -12322,7 +13944,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 @@ -12372,9 +13994,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 @@ -12383,7 +14005,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 @@ -12544,71 +14166,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'} @@ -12674,6 +14231,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'} @@ -12922,7 +14544,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: @@ -13013,14 +14635,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 @@ -13041,10 +14663,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 @@ -13210,8 +14832,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 @@ -13219,18 +14841,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==} @@ -14646,6 +16268,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'} @@ -14743,13 +16371,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: @@ -14770,31 +16398,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: @@ -14820,12 +16448,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 @@ -14838,13 +16466,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 @@ -14878,13 +16506,13 @@ 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 @@ -14898,13 +16526,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 @@ -14937,6 +16565,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'} @@ -14995,7 +16681,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: @@ -15008,7 +16694,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 @@ -15048,6 +16734,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'} @@ -15075,7 +16815,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 @@ -15128,7 +16868,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 @@ -15244,6 +16984,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'} @@ -15352,6 +17146,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.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/escape-html': 2.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.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 + 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'} @@ -15514,6 +17362,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'} @@ -15568,6 +17471,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'} @@ -15709,7 +17673,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==} @@ -15918,7 +17881,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==} @@ -16068,7 +18030,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: @@ -16078,9 +18040,9 @@ packages: '@babel/runtime': 7.19.0 '@wordpress/a11y': 3.6.1 '@wordpress/api-fetch': 6.3.1 - '@wordpress/block-editor': 8.6.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/block-editor': 8.6.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/blocks': 11.18.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 @@ -16095,10 +18057,10 @@ packages: '@wordpress/keycodes': 3.6.1 '@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/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi + '@wordpress/reusable-blocks': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm '@wordpress/rich-text': 5.4.2_react@17.0.2 - '@wordpress/server-side-render': 3.17.0_vcke6catv4iqpjdw24uwvlzyyi + '@wordpress/server-side-render': 3.17.0_mtk4wljkd5jimhszw4p7nnxuzm '@wordpress/url': 3.7.1 '@wordpress/wordcount': 3.28.0 classnames: 2.3.1 @@ -16347,7 +18309,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: @@ -16357,7 +18319,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 @@ -16498,7 +18460,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: @@ -16507,7 +18469,7 @@ packages: dependencies: '@babel/runtime': 7.19.0 '@wordpress/a11y': 3.6.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/deprecated': 3.6.1 @@ -16515,7 +18477,7 @@ packages: '@wordpress/i18n': 4.6.1 '@wordpress/icons': 8.2.3 '@wordpress/plugins': 4.4.3_react@17.0.2 - '@wordpress/preferences': 1.3.0_tufdcic6wklrwyy3rhbsbktylu + '@wordpress/preferences': 1.3.0_eqi5qhcxfphl6j3pngzexvnehi '@wordpress/viewport': 4.4.1_react@17.0.2 classnames: 2.3.1 lodash: 4.17.21 @@ -16618,7 +18580,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: @@ -16626,7 +18588,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 @@ -16750,17 +18712,6 @@ 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'} @@ -16770,7 +18721,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==} @@ -16854,7 +18804,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 @@ -16869,7 +18819,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: @@ -16878,7 +18828,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 @@ -16976,7 +18926,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==} @@ -17009,6 +18958,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'} @@ -17143,7 +19121,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 @@ -17152,14 +19130,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 @@ -17227,6 +19205,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'} @@ -18283,9 +20291,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 @@ -18343,18 +20351,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: @@ -18380,6 +20388,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'} @@ -18399,18 +20426,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 @@ -18435,6 +20462,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==} @@ -18481,6 +20527,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: @@ -18562,8 +20638,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 @@ -18571,8 +20647,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 @@ -18580,8 +20656,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 @@ -18609,12 +20685,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 @@ -18622,14 +20706,27 @@ packages: - supports-color dev: true - /babel-plugin-polyfill-corejs2/0.3.0_@babel+core@7.17.8: + /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.17.8 - '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.17.8 + '@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 + transitivePeerDependencies: + - supports-color + dev: false + + /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.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 @@ -18640,7 +20737,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.12.9 '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.12.9 semver: 6.3.0 @@ -18652,7 +20749,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 @@ -18665,12 +20762,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: true + + /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==} @@ -18684,6 +20794,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: @@ -18708,13 +20830,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 @@ -18756,6 +20878,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: @@ -18767,13 +20901,13 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.17.8: + /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.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 @@ -18811,6 +20945,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: @@ -18821,13 +20966,13 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.17.8: + /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.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 transitivePeerDependencies: - supports-color @@ -18888,6 +21033,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: @@ -18926,6 +21090,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==} @@ -18963,50 +21147,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 @@ -19021,6 +21205,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'} @@ -19032,15 +21227,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: @@ -19052,6 +21247,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=} @@ -20681,7 +22887,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: @@ -20854,7 +23060,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==} @@ -21210,7 +23415,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==} @@ -23606,8 +25811,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 @@ -24604,10 +26809,10 @@ 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.4.13 + memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.8 @@ -24667,11 +26872,11 @@ 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 - memfs: 3.4.13 + memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.8 @@ -24699,10 +26904,10 @@ 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.4.13 + memfs: 3.3.0 minimatch: 3.1.2 schema-utils: 2.7.0 semver: 7.3.8 @@ -26637,7 +28842,7 @@ packages: mute-stream: 0.0.8 ora: 5.4.1 run-async: 2.4.1 - rxjs: 7.5.5 + rxjs: 7.8.0 string-width: 4.2.3 strip-ansi: 6.0.1 through: 2.3.8 @@ -27358,11 +29563,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: @@ -27373,7 +29578,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 @@ -27385,8 +29590,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 @@ -27561,7 +29766,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 @@ -27755,10 +29960,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 @@ -27782,10 +29987,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 @@ -27817,10 +30022,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 @@ -27851,10 +30056,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 @@ -28264,7 +30469,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 @@ -28288,7 +30493,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 @@ -28316,7 +30521,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 @@ -29024,7 +31229,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 @@ -29045,7 +31250,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 @@ -29066,7 +31271,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 @@ -29090,16 +31295,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 @@ -29501,7 +31706,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 @@ -29724,6 +31929,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 @@ -30078,7 +32288,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: @@ -30087,7 +32297,7 @@ packages: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.0 + json5: 2.2.3 /loader-utils/2.0.4: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} @@ -30095,7 +32305,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: @@ -30349,7 +32559,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==} @@ -30873,7 +33082,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 @@ -30883,7 +33092,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 @@ -31003,54 +33212,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 @@ -31090,8 +33299,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 @@ -31104,8 +33313,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 @@ -31146,10 +33355,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 @@ -31157,11 +33366,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 @@ -31181,12 +33390,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 @@ -31212,7 +33421,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 @@ -33365,7 +35574,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 @@ -34801,7 +37010,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 @@ -34837,8 +37046,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 @@ -35020,7 +37229,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 @@ -36362,12 +38571,6 @@ packages: dependencies: tslib: 1.14.1 - /rxjs/7.5.5: - resolution: {integrity: sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==} - dependencies: - tslib: 2.5.0 - dev: true - /rxjs/7.8.0: resolution: {integrity: sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==} dependencies: @@ -38785,6 +40988,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} @@ -40543,7 +42815,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 @@ -40582,7 +42854,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 @@ -40663,7 +42935,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 @@ -41133,7 +43405,6 @@ packages: /yallist/3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -41408,9 +43679,9 @@ packages: version: 0.0.1 requiresBuild: true dependencies: - '@babel/cli': 7.17.6_@babel+core@7.17.8 - '@babel/core': 7.17.8 - '@babel/preset-env': 7.19.3_@babel+core@7.17.8 + '@babel/cli': 7.17.6_@babel+core@7.21.3 + '@babel/core': 7.21.3 + '@babel/preset-env': 7.19.3_@babel+core@7.21.3 '@slack/web-api': 5.15.0 '@wordpress/e2e-test-utils': 3.0.0_ddjhsfu4aotkh3cuzmpsln6ywq config: 3.3.7 diff --git a/tools/code-analyzer/README.md b/tools/code-analyzer/README.md index cb07a057b0a..6d81997288e 100644 --- a/tools/code-analyzer/README.md +++ b/tools/code-analyzer/README.md @@ -6,7 +6,7 @@ ## Commands -Currently there are just 2 commands: +Currently there are 3 commands: 1. `lint`. Analyzer is used as a linter for PRs to check if hook/template/db changes were introduced. It produces output either directly on CI or via setting output variables in GH actions. @@ -29,3 +29,11 @@ writing the main file in this particular branch reports `6.8.1` so the output of This command is particularly useful combined with the analyzer, allowing you to determine the last major/minor.0 version of a branch or ref before passing that as the version argument to `analyzer`. + +3. `scan`. Scan is like `lint` but lets you scan for a specific change type. e.g. you can scan just for hook changes if you wish. + +Here is an example of the `scan` command run to look for hook changes: + +`pnpm analyzer scan hooks "release/6.8" "release/6.7" --since "6.8.0"` +\ +In this command we compare the `release/6.7` and `release/6.8` branches to find hook changes, and we're looking for changes introduced since `6.8.0` (using the `@since` tag). diff --git a/tools/code-analyzer/src/commands/analyzer/analyzer-scan.ts b/tools/code-analyzer/src/commands/analyzer/analyzer-scan.ts new file mode 100644 index 00000000000..2bca09a3844 --- /dev/null +++ b/tools/code-analyzer/src/commands/analyzer/analyzer-scan.ts @@ -0,0 +1,155 @@ +/** + * External dependencies + */ +import { Command } from '@commander-js/extra-typings'; +import { Logger } from 'cli-core/src/logger'; +import { join } from 'path'; + +/** + * Internal dependencies + */ +import { + scanChangesForDB, + scanChangesForHooks, + scanChangesForSchema, + scanChangesForTemplates, + ScanType, +} from '../../lib/scan-changes'; +import { + printDatabaseUpdates, + printHookResults, + printSchemaChange, + printTemplateResults, +} from '../../print'; + +const printEmptyNotice = ( scanType: ScanType ) => { + Logger.notice( `\n\n## ${ scanType.toUpperCase() } CHANGES` ); + Logger.notice( '---------------------------------------------------' ); + Logger.notice( `No ${ scanType } changes found.` ); + Logger.notice( '---------------------------------------------------' ); +}; + +const program = new Command() + .command( 'scan' ) + .argument( + '', + 'Type of change to scan for. Options: templates, hooks, database, schema.' + ) + .argument( + '', + 'GitHub branch/tag/commit hash to compare against the base branch/tag/commit hash.' + ) + .argument( + '[base]', + 'Base branch to compare against. Defaults to trunk.', + 'trunk' + ) + .option( + '-s, --since ', + 'Specify the version used to determine which changes are included (version listed in @since code doc). Only needed for hook, template, schema changes.' + ) + .option( + '-src, --source ', + 'Git repo url or local path to a git repo.', + join( process.cwd(), '../../' ) + ) + .option( + '-o, --outputStyle ', + 'Output style for the results. Options: github, cli. Github output will set the results as an output variable for Github actions.', + 'cli' + ) + .action( async ( scanType, compare, base, options ) => { + const { since: sinceVersion, source, outputStyle } = options; + + if ( + ( scanType === 'hooks' || + scanType === 'templates' || + scanType === 'schema' ) && + ! sinceVersion + ) { + throw new Error( + `To scan for ${ scanType } changes you must provide the since argument.` + ); + } + + switch ( scanType ) { + case 'hooks': + // We know sinceVersion will exist but TS can't infer that here. + if ( sinceVersion ) { + const hookChanges = await scanChangesForHooks( + compare, + sinceVersion, + base, + source + ); + + if ( hookChanges.length ) { + printHookResults( + hookChanges, + outputStyle, + 'HOOKS', + Logger.notice + ); + } else { + printEmptyNotice( 'hooks' ); + } + } + break; + case 'templates': + // We know sinceVersion will exist but TS can't infer that here. + if ( sinceVersion ) { + const templateChanges = await scanChangesForTemplates( + compare, + sinceVersion, + base, + source + ); + if ( templateChanges && templateChanges.length ) { + printTemplateResults( + templateChanges, + outputStyle, + 'TEMPLATES', + Logger.notice + ); + } else { + printEmptyNotice( 'templates' ); + } + } + break; + case 'database': + const dbChanges = await scanChangesForDB( + compare, + base, + source + ); + if ( dbChanges ) { + printDatabaseUpdates( dbChanges, 'cli', Logger.notice ); + } else { + printEmptyNotice( 'database' ); + } + break; + case 'schema': + const schemaChanges = await scanChangesForSchema( + compare, + base, + source + ); + if ( schemaChanges && schemaChanges.length && sinceVersion ) { + printSchemaChange( + schemaChanges, + sinceVersion, + 'cli', + Logger.notice + ); + } else { + printEmptyNotice( 'schema' ); + } + break; + default: + throw new Error( + 'Invalid scan type. Options: templates, hooks, database, schema.' + ); + } + } ); + +program.parse( process.argv ); diff --git a/tools/code-analyzer/src/commands/analyzer/index.ts b/tools/code-analyzer/src/commands/analyzer/index.ts index ed81360a9ea..87ff2a6ce95 100644 --- a/tools/code-analyzer/src/commands/analyzer/index.ts +++ b/tools/code-analyzer/src/commands/analyzer/index.ts @@ -10,6 +10,7 @@ program .name( 'analyzer' ) .version( '0.0.1' ) .command( 'lint', 'Lint changes', { isDefault: true } ) - .command( 'major-minor', 'Determine major/minor version of a plugin' ); + .command( 'major-minor', 'Determine major/minor version of a plugin' ) + .command( 'scan', 'Detect changes between plugin versions' ); program.parse( process.argv ); diff --git a/tools/code-analyzer/src/lib/scan-changes.ts b/tools/code-analyzer/src/lib/scan-changes.ts index a21804c002d..e03ea723903 100644 --- a/tools/code-analyzer/src/lib/scan-changes.ts +++ b/tools/code-analyzer/src/lib/scan-changes.ts @@ -15,6 +15,121 @@ import { scanForDBChanges } from './db-changes'; import { scanForHookChanges } from './hook-changes'; import { scanForTemplateChanges } from './template-changes'; import { SchemaDiff, generateSchemaDiff } from '../git'; +import { scanForSchemaChanges } from './schema-changes'; + +export type ScanType = 'schema' | 'db' | 'hooks' | 'templates' | string; + +const generateVersionDiff = async ( + compareVersion: string, + base: string, + source: string, + clonedPath?: string +) => { + Logger.startTask( `Making temporary clone of ${ source }...` ); + + const tmpRepoPath = + typeof clonedPath !== 'undefined' + ? clonedPath + : await cloneRepo( source ); + + Logger.endTask(); + + Logger.notice( + `Temporary clone of ${ source } created at ${ tmpRepoPath }` + ); + + Logger.notice( + `Temporary clone of ${ source } created at ${ tmpRepoPath }` + ); + + const diff = await generateDiff( + tmpRepoPath, + base, + compareVersion, + Logger.error, + [ 'tools' ] + ); + + return { diff, tmpRepoPath }; +}; + +export const scanChangesForDB = async ( + compareVersion: string, + base: string, + source: string, + clonedPath?: string +) => { + const { diff } = await generateVersionDiff( + compareVersion, + base, + source, + clonedPath + ); + + return scanForDBChanges( diff ); +}; + +export const scanChangesForHooks = async ( + compareVersion: string, + sinceVersion: string, + base: string, + source: string, + clonedPath?: string +) => { + const { diff, tmpRepoPath } = await generateVersionDiff( + compareVersion, + base, + source, + clonedPath + ); + + const hookChanges = await scanForHookChanges( + diff, + sinceVersion, + tmpRepoPath + ); + + return Array.from( hookChanges.values() ); +}; + +export const scanChangesForTemplates = async ( + compareVersion: string, + sinceVersion: string, + base: string, + source: string, + clonedPath?: string +) => { + const { diff, tmpRepoPath } = await generateVersionDiff( + compareVersion, + base, + source, + clonedPath + ); + + const templateChanges = await scanForTemplateChanges( + diff, + sinceVersion, + tmpRepoPath + ); + + return Array.from( templateChanges.values() ); +}; + +export const scanChangesForSchema = async ( + compareVersion: string, + base: string, + source: string, + clonedPath?: string +) => { + const { tmpRepoPath } = await generateVersionDiff( + compareVersion, + base, + source, + clonedPath + ); + + return scanForSchemaChanges( compareVersion, base, tmpRepoPath ); +}; export const scanForChanges = async ( compareVersion: string, diff --git a/tools/code-analyzer/src/lib/schema-changes.ts b/tools/code-analyzer/src/lib/schema-changes.ts new file mode 100644 index 00000000000..43f56458d44 --- /dev/null +++ b/tools/code-analyzer/src/lib/schema-changes.ts @@ -0,0 +1,60 @@ +/** + * External dependencies + */ +import { Logger } from 'cli-core/src/logger'; +import { readFile } from 'fs/promises'; +import { join } from 'path'; + +/** + * Internal dependencies + */ +import { generateSchemaDiff } from '../git'; +import { execAsync } from '../utils'; + +export const scanForSchemaChanges = async ( + compareVersion: string, + base: string, + tmpRepoPath: string +) => { + const pluginPath = join( tmpRepoPath, 'plugins/woocommerce' ); + + const build = async () => { + const fileStr = await readFile( + join( pluginPath, 'package.json' ), + 'utf-8' + ); + 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 }`, { + cwd: pluginPath, + } ); + } + + // Note doing the minimal work to get a DB scan to work, avoiding full build for speed. + await execAsync( 'composer install', { cwd: pluginPath } ); + await execAsync( 'pnpm run --filter=woocommerce build:feature-config', { + cwd: pluginPath, + } ); + }; + + Logger.startTask( 'Generating schema diff...' ); + + const schemaDiff = await generateSchemaDiff( + tmpRepoPath, + compareVersion, + base, + build, + Logger.error + ); + + // Restore the previously saved PNPM version + await execAsync( `npm i -g pnpm@"$tmpgPNPM"` ); + + Logger.endTask(); + + return schemaDiff; +};