diff --git a/.github/workflows/e2e-js.yml b/.github/workflows/e2e-js.yml index c52dcd97f..d0ea39888 100644 --- a/.github/workflows/e2e-js.yml +++ b/.github/workflows/e2e-js.yml @@ -2,7 +2,7 @@ name: Test e2e for JS on: pull_request: - types: [ opened, synchronize, ready_for_review ] + types: [opened, synchronize, ready_for_review] branches-ignore: - "update_dependencies" @@ -64,18 +64,15 @@ jobs: - name: Playwright Blocks run: | - npm run test:e2e:playwright + npm run test:e2e:playwright && echo "PLAYWRIGHT_SUCCESS=true" >> $GITHUB_ENV || echo "PLAYWRIGHT_SUCCESS=false" >> $GITHUB_EN + continue-on-error: true - # run the node.js puppeteer script (which takes the screenshots and controls chrome) - name: Performance check run: | - npm run test:e2e:performance + npm run test:performance + cat artifacts/post-editor.performance-results.json - - name: Block ID reliability - run: | - npm run test:e2e:blockId - - - name: Upload video files + - name: Upload tests artifacts if: always() uses: actions/upload-artifact@v2 with: @@ -85,27 +82,18 @@ jobs: - name: Print the results run: | - echo "::set-output name=TYPING_AVG::$(jq '.summary.type.average' ./artifacts/performance.spec.performance-results.json)" - echo "::set-output name=TYPING_SD::$(jq '.summary.type.standardDeviation' ./artifacts/performance.spec.performance-results.json)" - echo "::set-output name=TYPING_MD::$(jq '.summary.type.median' ./artifacts/performance.spec.performance-results.json)" - echo "::set-output name=TYPING_QR60::$(jq '.summary.type.quantileRank60' ./artifacts/performance.spec.performance-results.json)" - echo "::set-output name=TYPING_ABOVE_60::$(jq -c '.summary.type.above60' ./artifacts/performance.spec.performance-results.json)" - echo "::set-output name=TYPING_QR80::$(jq '.summary.type.quantileRank80' ./artifacts/performance.spec.performance-results.json)" + RESULTS=$(jq -r 'to_entries|map("\(.key): \(.value)")|join(", ")' artifacts/post-editor.performance-results.json) + FLAKY_TEST_STATUS="Playwright Test Status: $PLAYWRIGHT_SUCCESS" + echo "::set-output name=PERFORMANCE_OUTPUT::$RESULTS" + echo "::set-output name=FLAKY_TEST_STATUS::$FLAKY_TEST_STATUS" id: summary - name: Comment - uses: NejcZdovc/comment-pr@v1 + uses: NejcZdovc/comment-pr@v2 with: - file: 'e2e-summary.md' + file: "e2e-summary.md" identifier: "GITHUB_E2E_SUMMARY" env: GITHUB_TOKEN: ${{ secrets.BOT_TOKEN }} - TYPING_AVG: ${{ steps.summary.outputs.TYPING_AVG }} - TYPING_SD: ${{ steps.summary.outputs.TYPING_SD }} - TYPING_MD: ${{ steps.summary.outputs.TYPING_MD }} - TYPING_QR60: ${{ steps.summary.outputs.TYPING_QR60 }} - TYPING_QR80: ${{ steps.summary.outputs.TYPING_QR80 }} - TYPING_ABOVE_60: ${{ steps.summary.outputs.TYPING_ABOVE_60 }} - - - + PERFORMANCE_OUTPUT: ${{ steps.summary.outputs.PERFORMANCE_OUTPUT }} + FLAKY_TEST_STATUS: ${{ steps.summary.outputs.FLAKY_TEST_STATUS }} diff --git a/.github/workflows/e2e-summary.md b/.github/workflows/e2e-summary.md index cc1ea8f9e..b862b582f 100644 --- a/.github/workflows/e2e-summary.md +++ b/.github/workflows/e2e-summary.md @@ -1,12 +1,8 @@ -## E2E Summary +## E2E Tests -### Typing - -| Test | Average Time (ms) | Standard Deviation (ms) | Median Time (ms) | Quantile for soft limit (%) | Quantile for hard limit (%) | -| -----: | :---------------: | :---------------------: | :---------------: | :-------------------: | :-------------------: | -| Typing | {TYPING_AVG} | {TYPING_SD} | {TYPING_MD} | {TYPING_QR60} (60ms) | {TYPING_QR80} (80ms) | +{FLAKY_TEST_STATUS}
- Values above 60ms - {TYPING_ABOVE_60} -
+ Performance Results + {PERFORMANCE_OUTPUT} + \ No newline at end of file diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml index 05a8b9eb6..3fdd05842 100644 --- a/.github/workflows/test-php.yml +++ b/.github/workflows/test-php.yml @@ -33,30 +33,18 @@ jobs: - name: Run PHPCS run: composer run lint - phpunit: - name: Phpunit + phpstan: + name: PHPStan runs-on: ubuntu-latest if: github.event.pull_request.draft == false && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name - services: - mysql: - image: mysql:5.7 - env: - MYSQL_ROOT_PASSWORD: root - ports: - - 3306/tcp - options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - name: Setup PHP version - uses: shivammathur/setup-php@v1 + uses: shivammathur/setup-php@v2 with: - php-version: '7.2' + php-version: '7.4' extensions: simplexml, mysql - tools: phpunit:7.5.15 - name: Checkout source code uses: actions/checkout@v2 - - name: Install WordPress Test Suite - run: | - bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:${{ job.services.mysql.ports['3306'] }} - name: Get Composer Cache Directory id: composer-cache run: | @@ -70,33 +58,55 @@ jobs: ${{ runner.os }}-composer- - name: Install composer run: composer install --prefer-dist --no-progress --no-suggest - - name: Run phpunit - run: phpunit + - name: PHPStan Static Analysis + run: composer phpstan - phpstan: - name: PHPStan + unit: + name: UnitTests runs-on: ubuntu-latest if: github.event.pull_request.draft == false && github.event.pull_request.head.repo.full_name == github.event.pull_request.base.repo.full_name steps: - - name: Setup PHP version - uses: shivammathur/setup-php@v2 - with: - php-version: '7.4' - extensions: simplexml, mysql - - name: Checkout source code - uses: actions/checkout@v2 + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - uses: actions/checkout@v2 + - name: Get Composer Cache Directory id: composer-cache run: | echo "::set-output name=dir::$(composer config cache-files-dir)" - - name: Setup Composer cache - uses: actions/cache@v1 + + # setup the composer cache (vendor) with github actions cache and the cache dir defined in the previous step + - uses: actions/cache@v1 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} restore-keys: | ${{ runner.os }}-composer- + + # run composer install - name: Install composer run: composer install --prefer-dist --no-progress --no-suggest - - name: PHPStan Static Analysis - run: composer phpstan + + - name: Create License File + run: | + printf "{\"key\":\"${{ secrets.OTTER_PRO_LICENSE }}\"}" > license.json + + # setup the node cache (node_modules) with github actions cache + - name: Cache Node - npm + uses: actions/cache@v1 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-cache- + + - name: npm ci + run: | + npm ci + + - name: Setup WP Env + run: | + npm run test:unit:php:setup + + - name: Run PHP Unit Tests + run: | + npm run test:unit:php:base diff --git a/.gitignore b/.gitignore index 01f932c40..b9b0f397c 100644 --- a/.gitignore +++ b/.gitignore @@ -12,4 +12,5 @@ artifacts *.results.json trace.json license.json +.phpunit.result.cache .fleet diff --git a/.phpunit.result.cache b/.phpunit.result.cache new file mode 100644 index 000000000..7480da8ec --- /dev/null +++ b/.phpunit.result.cache @@ -0,0 +1 @@ +{"version":1,"defects":{"TestBlockConditions::test_hide_css_desktop_condition":3},"times":{"TestBlockConditions::test_logged_in_user_on_login":0.034,"TestBlockConditions::test_logged_in_user_on_logout":0.023,"TestBlockConditions::test_logged_out_user_on_login":0.028,"TestBlockConditions::test_logged_out_user_on_logout":0.028,"TestBlockConditions::test_user_roles_has_role":0.028,"TestBlockConditions::test_user_roles_does_not_have_role":0.028,"TestBlockConditions::test_post_type":0.028,"TestBlockConditions::test_post_type_on_invalid":0.028,"TestBlockConditions::test_post_category":0.028,"TestBlockConditions::test_post_category_on_invalid":0.028,"TestBlockConditions::test_logged_in_user_meta":0.028,"TestBlockConditions::test_logged_in_user_meta_invalid":0.03,"TestBlockConditions::test_post_meta":0.029,"TestBlockConditions::test_post_meta_invalid":0.029,"TestBlockConditions::test_date_range":0.029,"TestBlockConditions::test_date_range_invalid":0.029,"TestBlockConditions::test_date_recurring":0.029,"TestBlockConditions::test_multiple_conditions":0.03,"TestBlockConditions::test_multiple_conditions__with_one_invalid":0.029,"TestBlockConditions::test_multiple_conditions_with_all_invalid":0.029,"TestBlockConditions::test_or_collection":0.029,"TestBlockConditions::test_or_collection_invalid":0.03,"TestBlockConditions::test_hide_css_desktop_condition":0.03,"TestCSS::test_css_simple":0,"TestCSS::test_css_defaults":0,"TestCSS::test_css_format":0,"TestCSS::test_css_condition":0.002,"TestCSS::test_css_pattern":0,"TestCSS::test_render_box":0,"TestDynamicContent::test_post_id":0.029,"TestDynamicContent::test_post_type":0.026,"TestDynamicContent::test_post_title":0.025,"TestDynamicContent::test_post_status":0.028,"TestDynamicContent::test_post_content":0.028,"TestDynamicContent::test_post_excerpt":0.028,"TestDynamicContent::test_post_date":0.032,"TestDynamicContent::test_post_time":0.032,"TestDynamicContent::test_post_terms":0.028,"TestDynamicContent::test_post_meta":0.029,"TestDynamicContent::test_acf":0.028,"TestDynamicContent::test_site_title":0.028,"TestDynamicContent::test_site_tagline":0.029,"TestDynamicContent::test_author_name":0.028,"TestDynamicContent::test_author_description":0.029,"TestDynamicContent::test_author_meta":0.028,"TestDynamicContent::test_logged_in_user_name":0.029,"TestDynamicContent::test_logged_in_user_description":0.028,"TestDynamicContent::test_logged_in_user_email":0.028,"TestDynamicContent::test_logged_in_user_meta":0.028,"TestDynamicContent::test_archive_title":0.028,"TestDynamicContent::test_archive_description":0.029,"TestDynamicContent::test_date":0.028,"TestDynamicContent::test_time":0.028,"TestDynamicContent::test_query_string":0.028,"TestDynamicContent::test_country":0.028,"TestDynamicContent::test_post_id_evaluation":0.028,"TestDynamicContent::test_post_type_evaluation":0.029,"TestDynamicContent::test_post_title_evaluation":0.03,"TestDynamicContent::test_post_status_evaluation":0.035,"TestDynamicContent::test_post_content_evaluation":0.033,"TestDynamicContent::test_post_excerpt_evaluation":0.029,"TestDynamicContent::test_logged_in_user_name_evaluation":0.028,"TestDynamicContent::test_logged_in_user_description_evaluation":0.027,"TestDynamicContent::test_logged_in_user_email_evaluation":0.029,"TestDynamicContent::test_date_evaluation":0.028,"TestDynamicContent::test_time_evaluation":0.027,"TestDynamicContent::test_author_name_evaluation":0.028,"TestDynamicContent::test_author_description_evaluation":0.029,"TestDynamicContent::test_multiple_dynamic_content_queries":0.03,"TestDynamicContent::test_multiple_dynamic_content_queries_on_long_content":0.05,"TestPatterns::test_fetch_patterns":0.475,"TestStripeAPI::test_retrieve_products":0.053,"TestStripeAPI::test_retrieve_prices":0.002,"TestStripeAPI::test_retrieve_product":0.001,"TestStripeAPI::test_retrieve_price":0.001,"TestStripeAPI::test_retrieve_session_email":0.001,"TestStripeAPI::test_user_purchase":0.001,"TestStripeAPI::test_status_for_price_id":0.001,"TestBlockConditions::test_hide_css_tablet_condition":0.028,"TestBlockConditions::test_hide_css_mobile_condition":0.029,"TestBlockConditions::test_hide_css_all_condition":0.028,"TestBlockConditions::test_get_css_hide_condition":0.03,"TestBlockConditions::test_get_css_hide_condition_no_hide":0.028}} \ No newline at end of file diff --git a/.wp-env.override.json b/.wp-env.override.json index 2bbde377f..52901bf61 100644 --- a/.wp-env.override.json +++ b/.wp-env.override.json @@ -18,10 +18,13 @@ "plugins": [ "." ], + "themes": [ "./test/emptytheme" ], "mappings": { - "wp-content/mu-plugins": "./node_modules/@wordpress/e2e-tests/mu-plugins", - "wp-content/plugins/gutenberg-test-plugins": "./node_modules/@wordpress/e2e-tests/plugins", - "wp-content/themes/gutenberg-test-themes/twentytwentythree": "https://downloads.wordpress.org/theme/twentytwentythree.1.0.zip" + "wp-content/mu-plugins": "./packages/e2e-tests/mu-plugins", + "wp-content/plugins/gutenberg-test-plugins": "./packages/e2e-tests/plugins", + "wp-content/themes/gutenberg-test-themes": "./test/gutenberg-test-themes", + "wp-content/themes/gutenberg-test-themes/twentytwentyone": "https://downloads.wordpress.org/theme/twentytwentyone.1.7.zip", + "wp-content/themes/gutenberg-test-themes/twentytwentythree": "https://downloads.wordpress.org/theme/twentytwentythree.1.0.zip" } } } diff --git a/composer.json b/composer.json index b4c47f856..227bd16c2 100644 --- a/composer.json +++ b/composer.json @@ -62,6 +62,6 @@ "tubalmartin/cssmin": "^4.1", "wptt/webfont-loader": "^1.1", "sabberworm/php-css-parser": "^8.4", - "stripe/stripe-php": "^12.1" + "stripe/stripe-php": "^13.1" } } diff --git a/composer.lock b/composer.lock index aa7b44ea2..4917054f5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,20 +4,20 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "37c7bba284025871d7134809613f51a9", + "content-hash": "7478f8817a565a128a8751be2934b019", "packages": [ { "name": "codeinwp/themeisle-sdk", - "version": "3.3.6", + "version": "3.3.9", "source": { "type": "git", "url": "https://github.com/Codeinwp/themeisle-sdk.git", - "reference": "bf61570bb8d700098fbcf44e2f4258fd3f2ec5c2" + "reference": "d960c559b643f468d16ffc5379e83efdb1526224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/bf61570bb8d700098fbcf44e2f4258fd3f2ec5c2", - "reference": "bf61570bb8d700098fbcf44e2f4258fd3f2ec5c2", + "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/d960c559b643f468d16ffc5379e83efdb1526224", + "reference": "d960c559b643f468d16ffc5379e83efdb1526224", "shasum": "" }, "require-dev": { @@ -42,9 +42,9 @@ ], "support": { "issues": "https://github.com/Codeinwp/themeisle-sdk/issues", - "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.6" + "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.9" }, - "time": "2023-10-05T07:53:06+00:00" + "time": "2023-11-16T15:27:37+00:00" }, { "name": "masterminds/html5", @@ -168,16 +168,16 @@ }, { "name": "stripe/stripe-php", - "version": "v12.5.0", + "version": "v13.3.0", "source": { "type": "git", "url": "https://github.com/stripe/stripe-php.git", - "reference": "a4249b4a90437844f6c35e8701f8c68acd206f56" + "reference": "58d0e126670d43808ef4a814b40a2864bca788e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/stripe/stripe-php/zipball/a4249b4a90437844f6c35e8701f8c68acd206f56", - "reference": "a4249b4a90437844f6c35e8701f8c68acd206f56", + "url": "https://api.github.com/repos/stripe/stripe-php/zipball/58d0e126670d43808ef4a814b40a2864bca788e5", + "reference": "58d0e126670d43808ef4a814b40a2864bca788e5", "shasum": "" }, "require": { @@ -188,7 +188,6 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "3.5.0", - "php-coveralls/php-coveralls": "^2.5", "phpstan/phpstan": "^1.2", "phpunit/phpunit": "^5.7 || ^9.0" }, @@ -222,9 +221,9 @@ ], "support": { "issues": "https://github.com/stripe/stripe-php/issues", - "source": "https://github.com/stripe/stripe-php/tree/v12.5.0" + "source": "https://github.com/stripe/stripe-php/tree/v13.3.0" }, - "time": "2023-09-28T23:06:27+00:00" + "time": "2023-11-09T21:21:22+00:00" }, { "name": "tubalmartin/cssmin", @@ -793,16 +792,16 @@ }, { "name": "php-stubs/woocommerce-stubs", - "version": "v8.1.0", + "version": "v8.2.2", "source": { "type": "git", "url": "https://github.com/php-stubs/woocommerce-stubs.git", - "reference": "f5a8621ca0a28c93b37b827ef92e7b49ad3d1923" + "reference": "e183e3b9aa9c049b6d08f3bb48b48490a40e9145" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/woocommerce-stubs/zipball/f5a8621ca0a28c93b37b827ef92e7b49ad3d1923", - "reference": "f5a8621ca0a28c93b37b827ef92e7b49ad3d1923", + "url": "https://api.github.com/repos/php-stubs/woocommerce-stubs/zipball/e183e3b9aa9c049b6d08f3bb48b48490a40e9145", + "reference": "e183e3b9aa9c049b6d08f3bb48b48490a40e9145", "shasum": "" }, "require": { @@ -831,34 +830,37 @@ ], "support": { "issues": "https://github.com/php-stubs/woocommerce-stubs/issues", - "source": "https://github.com/php-stubs/woocommerce-stubs/tree/v8.1.0" + "source": "https://github.com/php-stubs/woocommerce-stubs/tree/v8.2.2" }, - "time": "2023-09-12T20:25:04+00:00" + "time": "2023-11-08T20:23:29+00:00" }, { "name": "php-stubs/wordpress-stubs", - "version": "v6.3.0", + "version": "v6.4.1", "source": { "type": "git", "url": "https://github.com/php-stubs/wordpress-stubs.git", - "reference": "adda7609e71d5f4dc7b87c74f8ec9e3437d2e92c" + "reference": "6d6063cf9464a306ca2a0529705d41312b08500b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/adda7609e71d5f4dc7b87c74f8ec9e3437d2e92c", - "reference": "adda7609e71d5f4dc7b87c74f8ec9e3437d2e92c", + "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/6d6063cf9464a306ca2a0529705d41312b08500b", + "reference": "6d6063cf9464a306ca2a0529705d41312b08500b", "shasum": "" }, "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", "nikic/php-parser": "^4.13", "php": "^7.4 || ~8.0.0", "php-stubs/generator": "^0.8.3", "phpdocumentor/reflection-docblock": "^5.3", "phpstan/phpstan": "^1.10.12", - "phpunit/phpunit": "^9.5" + "phpunit/phpunit": "^9.5", + "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^0.8" }, "suggest": { "paragonie/sodium_compat": "Pure PHP implementation of libsodium", + "symfony/polyfill-php80": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan" }, "type": "library", @@ -875,9 +877,9 @@ ], "support": { "issues": "https://github.com/php-stubs/wordpress-stubs/issues", - "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.3.0" + "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.4.1" }, - "time": "2023-08-10T16:34:11+00:00" + "time": "2023-11-10T00:33:47+00:00" }, { "name": "phpcompatibility/php-compatibility", @@ -943,16 +945,16 @@ }, { "name": "phpstan/phpstan", - "version": "1.10.36", + "version": "1.10.41", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan.git", - "reference": "ffa3089511121a672e62969404e4fddc753f9b15" + "reference": "c6174523c2a69231df55bdc65b61655e72876d76" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ffa3089511121a672e62969404e4fddc753f9b15", - "reference": "ffa3089511121a672e62969404e4fddc753f9b15", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/c6174523c2a69231df55bdc65b61655e72876d76", + "reference": "c6174523c2a69231df55bdc65b61655e72876d76", "shasum": "" }, "require": { @@ -1001,7 +1003,7 @@ "type": "tidelift" } ], - "time": "2023-09-29T14:07:45+00:00" + "time": "2023-11-05T12:57:57+00:00" }, { "name": "phpunit/php-code-coverage", @@ -2508,16 +2510,16 @@ }, { "name": "symfony/polyfill-php73", - "version": "v1.27.0", + "version": "v1.28.0", "source": { "type": "git", "url": "https://github.com/symfony/polyfill-php73.git", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9" + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/9e8ecb5f92152187c4799efd3c96b78ccab18ff9", - "reference": "9e8ecb5f92152187c4799efd3c96b78ccab18ff9", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/fe2f306d1d9d346a7fee353d0d5012e401e984b5", + "reference": "fe2f306d1d9d346a7fee353d0d5012e401e984b5", "shasum": "" }, "require": { @@ -2526,7 +2528,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "1.27-dev" + "dev-main": "1.28-dev" }, "thanks": { "name": "symfony/polyfill", @@ -2567,7 +2569,7 @@ "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php73/tree/v1.27.0" + "source": "https://github.com/symfony/polyfill-php73/tree/v1.28.0" }, "funding": [ { @@ -2583,26 +2585,26 @@ "type": "tidelift" } ], - "time": "2022-11-03T14:55:06+00:00" + "time": "2023-01-26T09:26:14+00:00" }, { "name": "szepeviktor/phpstan-wordpress", - "version": "v1.3.0", + "version": "v1.3.2", "source": { "type": "git", "url": "https://github.com/szepeviktor/phpstan-wordpress.git", - "reference": "5b5cc77ed51fdaf64efe3f00b5aae4b709d2cfa9" + "reference": "b8516ed6bab7ec50aae981698ce3f67f1be2e45a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/5b5cc77ed51fdaf64efe3f00b5aae4b709d2cfa9", - "reference": "5b5cc77ed51fdaf64efe3f00b5aae4b709d2cfa9", + "url": "https://api.github.com/repos/szepeviktor/phpstan-wordpress/zipball/b8516ed6bab7ec50aae981698ce3f67f1be2e45a", + "reference": "b8516ed6bab7ec50aae981698ce3f67f1be2e45a", "shasum": "" }, "require": { "php": "^7.2 || ^8.0", "php-stubs/wordpress-stubs": "^4.7 || ^5.0 || ^6.0", - "phpstan/phpstan": "^1.10.0", + "phpstan/phpstan": "^1.10.30", "symfony/polyfill-php73": "^1.12.0" }, "require-dev": { @@ -2613,6 +2615,9 @@ "phpunit/phpunit": "^8.0 || ^9.0", "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^0.8" }, + "suggest": { + "swissspidy/phpstan-no-private": "Detect usage of internal core functions, classes and methods" + }, "type": "phpstan-extension", "extra": { "phpstan": { @@ -2640,9 +2645,9 @@ ], "support": { "issues": "https://github.com/szepeviktor/phpstan-wordpress/issues", - "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v1.3.0" + "source": "https://github.com/szepeviktor/phpstan-wordpress/tree/v1.3.2" }, - "time": "2023-04-23T06:15:06+00:00" + "time": "2023-10-16T17:23:56+00:00" }, { "name": "theseer/tokenizer", @@ -2813,5 +2818,5 @@ "platform-overrides": { "php": "7.4" }, - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/inc/Tracker.php b/inc/Tracker.php new file mode 100644 index 000000000..81f62afcd --- /dev/null +++ b/inc/Tracker.php @@ -0,0 +1,74 @@ + $events Data to track. + * @param array $options Options. + * @return void + */ + public static function track( $events, $options = array() ) { + + if ( ! self::has_consent() && ( ! isset( $options['hasConsent'] ) || ! $options['hasConsent'] ) ) { + return; + } + + try { + $payload = array(); + + $license = apply_filters( 'product_otter_license_key', 'free' ); + + if ( 'free' !== $license ) { + $license = wp_hash( $license ); + } + + foreach ( $events as $event ) { + $payload[] = array( + 'slug' => 'otter', + 'site' => get_site_url(), + 'license' => $license, + 'data' => $event, + ); + } + + $args = array( + 'headers' => array( + 'Content-Type' => 'application/json', + ), + 'body' => wp_json_encode( $payload ), + ); + + wp_remote_post( self::$track_url, $args ); + } finally { + return; + } + } + + /** + * Check if the user has consented to tracking. + * + * @return bool + */ + public static function has_consent() { + return (bool) get_option( 'otter_blocks_logger_flag', false ); + } +} diff --git a/inc/class-blocks-animation.php b/inc/class-blocks-animation.php index 32e4c053e..d9064833c 100644 --- a/inc/class-blocks-animation.php +++ b/inc/class-blocks-animation.php @@ -166,7 +166,7 @@ public function frontend_load( $block_content, $block ) { wp_script_add_data( 'otter-animation-frontend', 'async', true ); - add_action( 'wp_head', array( $this, 'add_fontend_anim_inline_style' ), 10 ); + add_action( 'wp_footer', array( $this, 'add_frontend_anim_inline_style' ), 10 ); self::$scripts_loaded['animation'] = true; } @@ -208,10 +208,11 @@ public function frontend_load( $block_content, $block ) { * @access public * @since 2.0.14 */ - public static function add_fontend_anim_inline_style() { + public static function add_frontend_anim_inline_style() { echo ' '; } diff --git a/inc/class-registration.php b/inc/class-registration.php index b2b197f4e..6d54ac9e6 100644 --- a/inc/class-registration.php +++ b/inc/class-registration.php @@ -49,18 +49,19 @@ class Registration { * @var array */ public static $scripts_loaded = array( - 'circle-counter' => false, - 'countdown' => false, - 'form' => false, - 'google-map' => false, - 'leaflet-map' => false, - 'lottie' => false, - 'slider' => false, - 'sticky' => false, - 'tabs' => false, - 'popup' => false, - 'progress-bar' => false, - 'accordion' => false, + 'circle-counter' => false, + 'countdown' => false, + 'form' => false, + 'google-map' => false, + 'leaflet-map' => false, + 'lottie' => false, + 'slider' => false, + 'sticky' => false, + 'tabs' => false, + 'popup' => false, + 'progress-bar' => false, + 'accordion' => false, + 'condition_hide_on' => false, ); /** @@ -90,6 +91,7 @@ public function init() { add_filter( 'render_block', array( $this, 'load_sticky' ), 900, 2 ); add_filter( 'render_block', array( $this, 'subscribe_fa' ), 10, 2 ); add_filter( 'dynamic_sidebar_params', array( $this, 'watch_used_widgets' ), 9999 ); + add_filter( 'render_block', array( $this, 'load_condition_hide_on_styles' ), 10, 2 ); add_action( 'wp_footer', @@ -242,7 +244,7 @@ public function enqueue_block_editor_assets() { } global $wp_roles; - + wp_localize_script( 'otter-blocks', 'themeisleGutenberg', @@ -327,6 +329,8 @@ public function enqueue_block_assets() { return; } + + if ( is_singular() ) { $this->enqueue_dependencies(); } else { @@ -358,6 +362,7 @@ function ( $content ) { } if ( $has_widgets ) { + add_filter( 'wp_footer', function ( $content ) { @@ -970,7 +975,7 @@ public function load_sticky( $block_content, $block ) { } /** - * Add styles for sticky blocks. + * Get styles for sticky blocks. * * @static * @since 2.0.14 @@ -980,6 +985,58 @@ public static function sticky_style() { echo ''; } + /** + * Load the Hide on condition styles. + * + * @param string $block_content The block content. + * @param array $block The block data. + * @return string + */ + public function load_condition_hide_on_styles( $block_content, $block ) { + if ( self::$scripts_loaded['condition_hide_on'] ) { + return $block_content; + } + + if ( empty( $block['attrs']['otterConditions'] ) || ! is_array( $block['attrs']['otterConditions'] ) ) { + return $block_content; + } + + $has_condition = false; + + foreach ( $block['attrs']['otterConditions'] as $group ) { + foreach ( $group as $condition ) { + if ( 'screenSize' === $condition['type'] && isset( $condition['screen_sizes'] ) && is_array( $condition['screen_sizes'] ) ) { + $has_condition = true; + break; + } + } + + if ( $has_condition ) { + break; + } + } + + if ( ! $has_condition ) { + return $block_content; + } + + add_action( 'wp_footer', array( $this, 'condition_hide_on_style' ) ); + self::$scripts_loaded['condition_hide_on'] = true; + + return $block_content; + } + + /** + * Get the styles for Hide on condition. + * + * @static + * @since 2.4 + * @access public + */ + public static function condition_hide_on_style() { + echo ''; + } + /** * Get the content of all active widgets. * @@ -1009,8 +1066,6 @@ public static function get_active_widgets_content() { } } - self::$widget_used = array(); - foreach ( $valid_widgets as $widget ) { if ( isset( $widget->content ) ) { $content .= $widget->content; diff --git a/inc/css/blocks/class-advanced-heading-css.php b/inc/css/blocks/class-advanced-heading-css.php index 4484c2c22..a585f3cbf 100644 --- a/inc/css/blocks/class-advanced-heading-css.php +++ b/inc/css/blocks/class-advanced-heading-css.php @@ -75,7 +75,11 @@ public function render_css( $block ) { return isset( $attrs['lineHeight'] ) && is_numeric( $attrs['lineHeight'] ); }, 'format' => function( $value ) { - return 3 < $value ? $value . 'px' : $value; + if ( is_numeric( $value ) && ! is_string( $value ) ) { + return 3 < $value ? $value . 'px' : $value; + } + + return $value; }, ), array( diff --git a/inc/css/blocks/class-posts-css.php b/inc/css/blocks/class-posts-css.php index b8be68e22..481a1c638 100644 --- a/inc/css/blocks/class-posts-css.php +++ b/inc/css/blocks/class-posts-css.php @@ -313,6 +313,84 @@ public function render_css( $block ) { 'property' => '--content-gap', 'value' => 'contentGap', ), + array( + 'property' => '--pag-gap', + 'value' => 'pagGap', + ), + array( + 'property' => '--pag-color', + 'value' => 'pagColor', + ), + array( + 'property' => '--pag-bg-color', + 'value' => 'pagBgColor', + ), + array( + 'property' => '--pag-color-hover', + 'value' => 'pagColorHover', + ), + array( + 'property' => '--pag-bg-color-hover', + 'value' => 'pagBgColorHover', + ), + array( + 'property' => '--pag-color-active', + 'value' => 'pagColorActive', + ), + array( + 'property' => '--pag-bg-color-active', + 'value' => 'pagBgColorActive', + ), + array( + 'property' => '--pag-border-color', + 'value' => 'pagBorderColor', + ), + array( + 'property' => '--pag-border-color-hover', + 'value' => 'pagBorderColorHover', + ), + array( + 'property' => '--pag-border-color-active', + 'value' => 'pagBorderColorActive', + ), + array( + 'property' => '--pag-size', + 'value' => 'pagSize', + ), + array( + 'property' => '--pag-border-radius', + 'value' => 'pagBorderRadius', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( $value ); + }, + ), + array( + 'property' => '--pag-border-width', + 'value' => 'pagBorderWidth', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( $value ); + }, + ), + array( + 'property' => '--pag-padding', + 'value' => 'pagPadding', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( $value ); + }, + ), + array( + 'property' => '--pag-cont-margin', + 'value' => 'pagContMargin', + 'format' => function( $value, $attrs ) { + return CSS_Utility::box_values( + $value, + array( + 'top' => '10px', + 'bottom' => '30px', + ) + ); + }, + ), ), ) ); diff --git a/inc/css/class-css-utility.php b/inc/css/class-css-utility.php index c7e2a90c0..0a4dd4fb0 100644 --- a/inc/css/class-css-utility.php +++ b/inc/css/class-css-utility.php @@ -371,7 +371,7 @@ public static function merge_views( ...$views ) { $views, function( $view ) { return isset( $view ) && is_array( $view ); - } + } ); foreach ( $valid as $arr ) { diff --git a/inc/integrations/class-form-utils.php b/inc/integrations/class-form-utils.php index 611308b9c..058eb33bc 100644 --- a/inc/integrations/class-form-utils.php +++ b/inc/integrations/class-form-utils.php @@ -72,7 +72,7 @@ public static function is_file_field( $field ) { * @since 2.2.3 */ public static function is_file_field_valid( $field ) { - return isset( $field['metadata']['name'] ) && isset( $field['metadata']['size'] ) && isset( $field['metadata']['data'] ) && is_string( $field['metadata']['name'] ) && is_numeric( $field['metadata']['size'] ) && is_string( $field['metadata']['data'] ) && self::is_base64_string( $field['metadata']['data'] ); + return isset( $field['metadata']['name'] ) && isset( $field['metadata']['size'] ) && isset( $field['metadata']['data'] ) && is_string( $field['metadata']['name'] ) && is_numeric( $field['metadata']['size'] ) && is_string( $field['metadata']['data'] ); } /** @@ -140,17 +140,4 @@ public static function generate_file_name( $original_name ) { return $hash_code . '_' . $original_name; } - - /** - * Check if a string is a valid base64 string. - * - * @param string $data String to check. - * @return boolean - * @since 2.2.3 - */ - public static function is_base64_string( $data ) { - // Separate out the headers from the data. - $parts = explode( ';base64,', $data ); - return preg_match( '%^[a-zA-Z0-9/+]*={0,2}$%', $parts[1] ); - } } diff --git a/inc/plugins/class-block-conditions.php b/inc/plugins/class-block-conditions.php index 146cd6008..b735e64ec 100644 --- a/inc/plugins/class-block-conditions.php +++ b/inc/plugins/class-block-conditions.php @@ -42,38 +42,78 @@ public function init() { */ public function render_blocks( $block_content, $block ) { if ( ! is_admin() && ! ( defined( 'REST_REQUEST' ) && REST_REQUEST ) && isset( $block['attrs']['otterConditions'] ) ) { - $display = true; + + $display = $this->evaluate_condition_collection( $block['attrs']['otterConditions'] ); - foreach ( $block['attrs']['otterConditions'] as $group ) { - if ( 0 === count( $group ) ) { - continue; - } + if ( false === $display ) { + return; + } - $visibility = true; + $enhanced_content = $this->should_add_hide_css_class( $this->get_hide_css_condition( $block['attrs']['otterConditions'] ), $block_content ); - foreach ( $group as $condition ) { - if ( ! $this->evaluate_condition( $condition ) ) { - $visibility = false; - } - } + if ( false !== $enhanced_content ) { + return $enhanced_content; + } + } - if ( true === $visibility ) { - $display = true; - break; - } + return $block_content; + } + + /** + * Evaluate conditions + * + * @param array $collection The conditions collection to evaluate. + * @return bool Whether the conditions are met. + */ + public function evaluate_condition_collection( $collection ) { + $display = true; + foreach ( $collection as $group ) { + if ( 0 === count( $group ) ) { + continue; + } + + $visibility = true; - if ( false === $visibility ) { - $display = false; + foreach ( $group as $condition ) { + if ( ! $this->evaluate_condition( $condition ) ) { + $visibility = false; } } - if ( false === $display ) { - return; + if ( true === $visibility ) { + $display = true; + break; + } + + if ( false === $visibility ) { + $display = false; } } + + return $display; + } - return $block_content; + /** + * Get the hide CSS condition. + * + * @param array $collection The conditions collection to evaluate. + * @return array|bool The hide CSS condition, or false if none is found. + */ + public function get_hide_css_condition( $collection ) { + foreach ( $collection as $group ) { + if ( 0 === count( $group ) ) { + continue; + } + + foreach ( $group as $condition ) { + if ( ! empty( $condition['type'] ) && ! empty( $condition['screen_sizes'] ) ) { + return $condition; + } + } + } + + return false; } /** @@ -164,6 +204,10 @@ public function evaluate_condition( $condition ) { } } + if ( 'screenSize' === $condition['type'] ) { + return true; + } + if ( 'stripePurchaseHistory' === $condition['type'] ) { if ( isset( $condition['product'] ) && Stripe_API::has_keys() ) { if ( $visibility ) { @@ -263,6 +307,71 @@ public function has_stripe_product( $product ) { return $stripe->check_purchase( $product ); } + /** + * If the block has a hide condition, add the appropriate CSS class. + * + * @param array $condition Condition. + * @param string $block_content Reference to block content. + * @return string|bool + */ + public function should_add_hide_css_class( $condition, $block_content ) { + + if ( empty( $condition['type'] ) || empty( $condition['screen_sizes'] ) ) { + return false; + } + + $screen_sizes = $condition['screen_sizes']; + $hide_css_classes = ''; + + if ( in_array( 'mobile', $screen_sizes ) ) { + $hide_css_classes .= ' o-hide-on-mobile'; + } + + if ( in_array( 'tablet', $screen_sizes ) ) { + $hide_css_classes .= ' o-hide-on-tablet'; + } + + if ( in_array( 'desktop', $screen_sizes ) ) { + $hide_css_classes .= ' o-hide-on-desktop'; + } + + if ( empty( $hide_css_classes ) ) { + return false; + } + + // Get the parent node. + $html_nodes_matches = array(); + preg_match( '/<[^>]+>/', $block_content, $html_nodes_matches, PREG_OFFSET_CAPTURE ); + + // If we have not match, then the content might not be a valid HTML element. + if ( empty( $html_nodes_matches ) ) { + return false; + } + + $parent_node = $html_nodes_matches[0][0]; + $hide_css_classes = ltrim( $hide_css_classes, ' ' ); + + // If we have a class attribute, append the CSS class to it. Otherwise, add the class attribute. + if ( false !== strpos( $parent_node, 'class="' ) ) { + $before_class = strstr( $block_content, 'class="', true ); + $after_class = strstr( $block_content, 'class="' ); + $after_class = substr( $after_class, strlen( 'class="' ) ); + $block_content = $before_class . 'class="' . $hide_css_classes . ' ' . $after_class; + } elseif ( false !== strpos( $parent_node, "class='" ) ) { + // Special case with single quotes. + $before_class = strstr( $block_content, "class='", true ); + $after_class = strstr( $block_content, "class='" ); + $after_class = substr( $after_class, strlen( "class='" ) ); + $block_content = $before_class . "class='" . $hide_css_classes . ' ' . $after_class; + } else { + $class_attribute_string = ' class="' . $hide_css_classes . '"'; + $enhanced_parent_node = preg_replace( '/>$/', $class_attribute_string . '>', $parent_node ); + $block_content = str_replace( $parent_node, $enhanced_parent_node, $block_content ); + } + + return $block_content; + } + /** * The instance method for the static class. * Defines and returns the instance of the static class. diff --git a/inc/plugins/class-dashboard.php b/inc/plugins/class-dashboard.php index ef3854bed..a19647b91 100644 --- a/inc/plugins/class-dashboard.php +++ b/inc/plugins/class-dashboard.php @@ -55,6 +55,11 @@ public function register_menu_page() { add_action( "admin_print_scripts-$page_hook_suffix", array( $this, 'enqueue_options_assets' ) ); + /** + * Add shortcut to the Blocks tab in Dashboard. + */ + + add_submenu_page( 'otter', __( 'Settings', 'otter-blocks' ), @@ -72,6 +77,18 @@ public function register_menu_page() { array( $this, 'form_submissions_callback' ), 10 ); + + add_submenu_page( + 'otter', + __( 'Blocks', 'otter-blocks' ), + __( 'Blocks', 'otter-blocks' ), + 'manage_options', + 'otter-blocks-toggle', + function() { + echo '

Redirecting...

+ '; + } + ); } /** @@ -255,27 +272,71 @@ private function the_otter_banner() { flex-wrap: wrap; align-content: center; width: 100%; - margin-left: 10px + margin-left: 10px; + align-items: center; } .otter-banner__version { align-self: center; + font-size: 11px; } /* Hide the "Add New" button for Multisite WP. Second part is for Elementor */ a.page-title-action:first-of-type, #e-admin-top-bar-root:not(.e-admin-top-bar--active)~#wpbody .wrap a.page-title-action:first-of-type { display: none; } + + #export-submissions { + font-size: 14px; + max-height: 35px; + }
<?php esc_attr_e( 'Otter Blocks', 'otter-blocks' ); ?>
-

- +

+ +

+
+ apply_data( $match ); + $string_to_replace = $match[0]; + $position = strstr( $content, $string_to_replace, true ); + + if ( false === $position ) { + continue; + } + + $position = strlen( $position ); + $content = substr_replace( $content, $replacement, $position, strlen( $string_to_replace ) ); + } + + return $content; + } + + /** + * Get the Dynamic Content regex. + * + * @return string + */ + public static function dynamic_content_regex() { // Todo: Improve this Regex, it can't go on for like this. Soon it will be longer than the available space in the universe!!! - $re = '/[^"\'<>]+)["\']|data-id=["\'](?P[^"\'<>]+)["\']|data-before=["\'](?P[^"\'<>]+)["\']|data-after=["\'](?P[^"\'<>]+)["\']|data-length=["\'](?P[^"\'<>]+)["\']|data-date-type=["\'](?P[^"\'<>]+)["\']|data-date-format=["\'](?P[^"\'<>]+)["\']|data-date-custom=["\'](?P[^"\'<>]+)["\']|data-time-type=["\'](?P[^"\'<>]+)["\']|data-time-format=["\'](?P[^"\'<>]+)["\']|data-time-custom=["\'](?P[^"\'<>]+)["\']|data-term-type=["\'](?P[^"\'<>]+)["\']|data-term-separator=["\'](?P[^"\'<>]+)["\']|data-meta-key=["\'](?P[^"\'<>]+)["\']|data-parameter=["\'](?P[^"\'<>]+)["\']|data-format=["\'](?P[^"\'<>]+)["\']|data-context=["\'](?P[^"\'<>]+)["\']|data-taxonomy=["\'](?P[^"\'<>]+)["\']|[a-zA-Z-]+=["\'][^"\'<>]+["\']))*\s*>(?[^ $].*?)<\s*\/\s*o-dynamic>/'; + return '/[^"\'<>]+)["\']|data-id=["\'](?P[^"\'<>]+)["\']|data-before=["\'](?P[^"\'<>]+)["\']|data-after=["\'](?P[^"\'<>]+)["\']|data-length=["\'](?P[^"\'<>]+)["\']|data-date-type=["\'](?P[^"\'<>]+)["\']|data-date-format=["\'](?P[^"\'<>]+)["\']|data-date-custom=["\'](?P[^"\'<>]+)["\']|data-time-type=["\'](?P[^"\'<>]+)["\']|data-time-format=["\'](?P[^"\'<>]+)["\']|data-time-custom=["\'](?P[^"\'<>]+)["\']|data-term-type=["\'](?P[^"\'<>]+)["\']|data-term-separator=["\'](?P[^"\'<>]+)["\']|data-meta-key=["\'](?P[^"\'<>]+)["\']|data-parameter=["\'](?P[^"\'<>]+)["\']|data-format=["\'](?P[^"\'<>]+)["\']|data-context=["\'](?P[^"\'<>]+)["\']|data-taxonomy=["\'](?P[^"\'<>]+)["\']|[a-zA-Z-]+=["\'][^"\'<>]+["\']))*\s*>(?[^ $].*?)<\s*\/\s*o-dynamic>/'; + } - return preg_replace_callback( $re, array( $this, 'apply_data' ), $content ); + /** + * Parse dynamic content query. + * + * @param string $content The content to parse. + * @param array $matches The matches. + * @return mixed + */ + public static function parse_dynamic_content_query( $content, &$matches ) { + $re = self::dynamic_content_regex(); + return preg_match_all( $re, $content, $matches, PREG_SET_ORDER, 0 ); } /** diff --git a/inc/plugins/class-options-settings.php b/inc/plugins/class-options-settings.php index a39659b1d..a42b62991 100644 --- a/inc/plugins/class-options-settings.php +++ b/inc/plugins/class-options-settings.php @@ -691,6 +691,27 @@ function ( $item ) { 'default' => array(), ) ); + + register_setting( + 'themeisle_blocks_settings', + 'themeisle_disabled_blocks', + array( + 'type' => 'array', + 'description' => __( 'The disabled blocks that will no longer be shown in Inserter.', 'otter-blocks' ), + 'sanitize_callback' => function( $array ) { + return array_map( 'sanitize_text_field', $array ); + }, + 'default' => array(), + 'show_in_rest' => array( + 'schema' => array( + 'type' => 'array', + 'items' => array( + 'type' => 'string', + ), + ), + ), + ) + ); } /** diff --git a/inc/plugins/class-stripe-api.php b/inc/plugins/class-stripe-api.php index 6fcb73de8..7babe4236 100644 --- a/inc/plugins/class-stripe-api.php +++ b/inc/plugins/class-stripe-api.php @@ -7,6 +7,7 @@ namespace ThemeIsle\GutenbergBlocks\Plugins; +use Stripe\Collection; use Stripe\StripeClient; /** @@ -108,7 +109,7 @@ public function build_error_response( $error ) { * @param string $path Request path. * @param array|string $args Request arguments. * - * @return mixed + * @return mixed|\WP_Error|Collection * @access public */ public function create_request( $path, $args = array() ) { @@ -237,7 +238,7 @@ public function save_customer_data( $session_id ) { array_push( $data, $object ); - if ( defined( 'COOKIEPATH' ) && defined( 'COOKIE_DOMAIN' ) && ! $user_id ) { + if ( defined( 'COOKIEPATH' ) && defined( 'COOKIE_DOMAIN' ) && ! headers_sent() && ! $user_id ) { setcookie( 'o_stripe_data', wp_json_encode( $data ), strtotime( '+1 week' ), COOKIEPATH, COOKIE_DOMAIN, false ); // phpcs:ignore WordPressVIPMinimum.Functions.RestrictedFunctions.cookies_setcookie return; } diff --git a/inc/render/class-form-multiple-choice.php b/inc/render/class-form-multiple-choice.php index 46809f755..22663b1df 100644 --- a/inc/render/class-form-multiple-choice.php +++ b/inc/render/class-form-multiple-choice.php @@ -23,35 +23,41 @@ class Form_Multiple_Choice_Block { */ public function render( $attributes ) { - $class_names = 'wp-block-themeisle-blocks-form-multiple-choice ' . ( isset( $attributes['className'] ) ? $attributes['className'] : '' ); - $id = isset( $attributes['id'] ) ? $attributes['id'] : ''; - $options = isset( $attributes['options'] ) ? $attributes['options'] : ''; - $field_type = isset( $attributes['type'] ) ? $attributes['type'] : 'checkbox'; - $label = isset( $attributes['label'] ) ? $attributes['label'] : __( 'Select option', 'otter-blocks' ); - $help_text = isset( $attributes['helpText'] ) ? $attributes['helpText'] : ''; - $options_array = explode( "\n", $options ); + $class_names = 'wp-block-themeisle-blocks-form-multiple-choice ' . ( isset( $attributes['className'] ) ? $attributes['className'] : '' ); + $id = isset( $attributes['id'] ) ? $attributes['id'] : ''; + $options = isset( $attributes['options'] ) ? $attributes['options'] : array(); + $field_type = isset( $attributes['type'] ) ? $attributes['type'] : 'checkbox'; + $label = isset( $attributes['label'] ) ? $attributes['label'] : __( 'Select option', 'otter-blocks' ); + $help_text = isset( $attributes['helpText'] ) ? $attributes['helpText'] : ''; + $is_required = isset( $attributes['isRequired'] ) ? boolval( $attributes['isRequired'] ) : false; $has_multiple_selection = isset( $attributes['multipleSelection'] ) ? boolval( $attributes['multipleSelection'] ) : false; $mapped_name = isset( $attributes['mappedName'] ) ? $attributes['mappedName'] : $id; $output = '
'; + // Compatibility with the old version of the block. + if ( ! empty( $options ) && is_string( $options ) ) { + $options = explode( "\n", $options ); + } + if ( 'select' === $field_type ) { - $output .= $this->render_select_field( $label, $options_array, $id, $mapped_name, $has_multiple_selection, $is_required ); + $output .= $this->render_select_field( $label, $options, $id, $mapped_name, $has_multiple_selection, $is_required ); } else { $output .= ''; $output .= '
'; - foreach ( $options_array as $field_label ) { - if ( empty( $field_label ) ) { + foreach ( $options as $choice ) { + if ( empty( $choice['content'] ) ) { continue; } - $field_value = implode( '_', explode( ' ', sanitize_title( $field_label ) ) ); + $field_value = implode( '_', explode( ' ', sanitize_title( $choice['content'] ) ) ); $field_id = 'field-' . $field_value; + $checked = isset( $choice['isDefault'] ) && $choice['isDefault']; - $output .= $this->render_field( $field_type, $field_label, $field_value, $mapped_name, $field_id, $is_required ); + $output .= $this->render_field( $field_type, $choice['content'], $field_value, $mapped_name, $field_id, $checked, $is_required ); } $output .= '
'; @@ -71,13 +77,14 @@ public function render( $attributes ) { * @param string $value The value of the field. * @param string $name The name of the field. * @param string $id The id of the field. + * @param bool $checked The checked status of the field. * @param bool $is_required The required status of the field. * @return string */ - public function render_field( $type, $label, $value, $name, $id, $is_required = false ) { + public function render_field( $type, $label, $value, $name, $id, $checked = false, $is_required = false ) { $output = '
'; - $output .= ''; + $output .= ''; $output .= ''; $output .= '
'; @@ -100,14 +107,16 @@ public function render_select_field( $label, $options_array, $id, $name, $is_mul $output = ''; $output .= ''; diff --git a/inc/render/class-posts-grid-block.php b/inc/render/class-posts-grid-block.php index 3f330e3b5..da3f76cee 100644 --- a/inc/render/class-posts-grid-block.php +++ b/inc/render/class-posts-grid-block.php @@ -19,65 +19,21 @@ class Posts_Grid_Block { * the server side output of the block. * * @param array $attributes Blocks attrs. - * @return mixed|string + * @return string */ public function render( $attributes ) { - $categories = 0; - if ( isset( $attributes['categories'] ) ) { - $cats = array(); + $has_pagination = isset( $attributes['hasPagination'] ) && $attributes['hasPagination']; + $page_number = 1; - foreach ( $attributes['categories'] as $category ) { - array_push( $cats, $category['id'] ); + if ( $has_pagination ) { + if ( ! empty( get_query_var( 'page' ) ) || ! empty( get_query_var( 'paged' ) ) ) { + $page_number = is_front_page() ? get_query_var( 'page' ) : get_query_var( 'paged' ); } - - $categories = join( ', ', $cats ); } - $get_custom_post_types_posts = function ( $post_type ) use ( $attributes, $categories ) { - - if ( 'product' === $post_type && isset( $attributes['categories'] ) ) { - $categories = array(); - foreach ( $attributes['categories'] as $category ) { - if ( isset( $category['slug'] ) ) { - array_push( $categories, $category['slug'] ); - } - } - } - - return $this->get_posts( - apply_filters( - 'themeisle_gutenberg_posts_block_query', - array( - 'post_type' => $post_type, - 'numberposts' => $attributes['postsToShow'], - 'post_status' => 'publish', - 'order' => $attributes['order'], - 'orderby' => $attributes['orderBy'], - 'offset' => $attributes['offset'], - 'category' => $categories, - 'suppress_filters' => false, - ), - $attributes - ) - ); - }; - - $recent_posts = ( isset( $attributes['postTypes'] ) && 0 < count( $attributes['postTypes'] ) ) ? array_merge( ...array_map( $get_custom_post_types_posts, $attributes['postTypes'] ) ) : $this->get_posts( - apply_filters( - 'themeisle_gutenberg_posts_block_query', - array( - 'numberposts' => $attributes['postsToShow'], - 'post_status' => 'publish', - 'order' => $attributes['order'], - 'orderby' => $attributes['orderBy'], - 'offset' => $attributes['offset'], - 'category' => $categories, - 'suppress_filters' => false, - ), - $attributes - ) - ); + $total_posts = 0; + $recent_posts = $this->retrieve_posts( $attributes, $has_pagination, $page_number, $total_posts ); if ( isset( $attributes['featuredPostOrder'] ) && 'sticky-first' === $attributes['featuredPostOrder'] ) { @@ -159,12 +115,13 @@ function ( $x ) use ( $sticky_posts_id ) { $wrapper_attributes = get_block_wrapper_attributes(); $block_content = sprintf( - '
%3$s
%5$s
', + '
%3$s
%5$s
%6$s
', $wrapper_attributes, isset( $attributes['id'] ) ? $attributes['id'] : '', isset( $attributes['enableFeaturedPost'] ) && $attributes['enableFeaturedPost'] && isset( $recent_posts[0] ) ? $this->render_featured_post( $recent_posts[0], $attributes ) : '', trim( $class ), - $list_items_markup + $list_items_markup, + $has_pagination ? $this->render_pagination( $page_number, $total_posts ) : '' ); return $block_content; @@ -350,26 +307,105 @@ protected function render_featured_post( $post, $attributes ) { /** * Get posts to display. * - * @param array $args Query args. - * @return array|array[]|int[]|null[]|\WP_Post[] Posts. + * @param array $attributes Blocks attrs. + * @param bool $count_posts Enable post count. + * @param int $page_number Page number. + * @param int $total_posts Total posts. + * @return array|int[]|null[]|\WP_Post[] Posts. */ - protected function get_posts( $args ) { - if ( isset( $args['post_type'] ) && 'product' === $args['post_type'] && function_exists( 'wc_get_products' ) ) { + protected function retrieve_posts( $attributes, $count_posts, $page_number, &$total_posts ) { - // drop the post_type arg, as wc_get_products() doesn't support it. - unset( $args['post_type'] ); + $offset = ! empty( $attributes['offset'] ) ? $attributes['offset'] : 0; - $products = wc_get_products( $args ); + $categories = 0; - // convert to array of post objects since the rest of the code expects that. - return array_map( - function( $product ) { - return $product->get_id(); - }, - $products - ); + if ( isset( $attributes['categories'] ) ) { + $cats = array(); + + foreach ( $attributes['categories'] as $category ) { + $cats[] = $category['id']; + } + + $categories = join( ', ', $cats ); } - return get_posts( $args ); + $args = array( + 'post_type' => $attributes['postTypes'], + 'posts_per_page' => $attributes['postsToShow'], + 'post_status' => 'publish', + 'order' => $attributes['order'], + 'orderby' => $attributes['orderBy'], + 'offset' => $offset, + 'category' => $categories, + 'suppress_filters' => false, + 'no_found_rows' => true, + ); + + if ( $count_posts ) { + $args['offset'] = $args['posts_per_page'] * ( $page_number - 1 ) + $args['offset']; + $args['no_found_rows'] = false; + $args['paged'] = $page_number; + } + + // Handle the case when the post type is a WooCommerce product. + if ( isset( $args['post_type'] ) && in_array( 'product', $args['post_type'] ) && function_exists( 'wc_get_products' ) ) { + + if ( isset( $attributes['categories'] ) ) { + + // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_tax_query + $args['tax_query'] = array(); + foreach ( $attributes['categories'] as $category ) { + if ( isset( $category['slug'] ) ) { + $args['tax_query'][] = array( + 'taxonomy' => 'product_cat', + 'field' => 'slug', + 'terms' => $category['slug'], + ); + } + } + $args['tax_query']['relation'] = 'OR'; + } + } + + $args = apply_filters( + 'themeisle_gutenberg_posts_block_query', + $args, + $attributes + ); + + $query = new \WP_Query( $args ); + + if ( $count_posts ) { + $total_posts += $query->max_num_pages; + } + + return $query->posts; + } + + /** + * Render the pagination. + * + * @param int $page_number The page number. + * @param int $total_pages The total pages. + * @return string + */ + protected function render_pagination( $page_number, $total_pages ) { + $big = 9999999; + $base = str_replace( strval( $big ), '%#%', esc_url( get_pagenum_link( $big ) ) ); + + $output = '
'; + $output .= paginate_links( + array( + 'base' => $base, + 'format' => '?paged=%#%', + 'current' => $page_number, + 'total' => $total_pages, + 'prev_text' => __( 'Prev', 'otter-blocks' ), + 'next_text' => __( 'Next', 'otter-blocks' ), + ) + ); + $output .= '
'; + + return $output; } } diff --git a/inc/server/class-dashboard-server.php b/inc/server/class-dashboard-server.php index a6798a7c1..d6351c42e 100644 --- a/inc/server/class-dashboard-server.php +++ b/inc/server/class-dashboard-server.php @@ -7,6 +7,8 @@ namespace ThemeIsle\GutenbergBlocks\Server; +use ThemeIsle\GutenbergBlocks\Tracker; + /** * Class Dashboard_Server */ @@ -38,7 +40,7 @@ class Dashboard_Server { */ public function init() { add_action( 'rest_api_init', array( $this, 'register_routes' ) ); - add_action( 'after_switch_theme', array( $this, 'regenerate_styles_on_theme_change' ) ); + add_action( 'after_switch_theme', array( $this, 'regenerate_styles_on_theme_change' ), 10, 2 ); } /** @@ -77,10 +79,24 @@ public function rest_regenerate_styles( \WP_REST_Request $request ) { /** * Regenerate styles on theme change. + * + * @param string $new_name New theme name. + * @param string $new_theme New theme object. * * @since 2.3 */ - public function regenerate_styles_on_theme_change() { + public function regenerate_styles_on_theme_change( $new_name, $new_theme ) { + + Tracker::track( + array( + array( + 'feature' => 'system', + 'featureComponent' => 'theme-change', + 'featureValue' => $new_name, + ), + ) + ); + self::regenerate_styles(); } diff --git a/inc/server/class-form-server.php b/inc/server/class-form-server.php index 434765282..522a4e9af 100644 --- a/inc/server/class-form-server.php +++ b/inc/server/class-form-server.php @@ -572,9 +572,12 @@ public function after_submit( $form_data ) { // Send also an email to the form editor/owner with the data alongside the subscription. if ( - 'submit-subscribe' === $form_data->get_wp_options()->get_action() && $form_data->get_wp_options()->has_provider() && - 'default' !== $form_data->get_wp_options()->get_provider() + $form_data->get_wp_options()->has_list_id() && + ( + empty( $form_data->get_wp_options()->get_action() ) || + 'submit-subscribe' === $form_data->get_wp_options()->get_action() + ) ) { $this->send_default_email( $form_data ); } diff --git a/otter-blocks.php b/otter-blocks.php index 042d40372..35da295e3 100644 --- a/otter-blocks.php +++ b/otter-blocks.php @@ -71,3 +71,34 @@ function( $links ) { return $links; } ); + +add_filter( 'themeisle_sdk_enable_telemetry', '__return_true' ); + +add_filter( + 'themeisle_sdk_telemetry_products', + function( $products ) { + $already_registered = false; + + $license = apply_filters( 'product_otter_license_key', 'free' ); + $track_hash = 'free' === $license ? 'free' : wp_hash( $license ); + + foreach ( $products as &$product ) { + if ( strstr( $product['slug'], 'otter' ) !== false ) { + $already_registered = true; + $product['trackHash'] = $track_hash; + } + } + + if ( $already_registered ) { + return $products; + } + + // Add Otter Blocks to the list of products to track the usage of AI Block. + $products[] = array( + 'slug' => 'otter', + 'consent' => false, + 'trackHash' => $track_hash, + ); + return $products; + } +); diff --git a/package-lock.json b/package-lock.json index 0fd0dfde3..10755be1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,10 +6,10 @@ "packages": { "": { "name": "otter-blocks", - "version": "2.4.0", + "version": "2.4.1", "license": "GPL-2.0+", "dependencies": { - "@wordpress/icons": "^9.33.0", + "@wordpress/icons": "^9.35.0", "array-move": "^3.0.1", "classnames": "^2.3.1", "currency-symbol-map": "^5.0.1", @@ -22,7 +22,7 @@ }, "devDependencies": { "@automattic/babel-plugin-replace-textdomain": "^1.0.26", - "@playwright/test": "^1.36.1", + "@playwright/test": "^1.32.0", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", @@ -30,21 +30,22 @@ "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.5.1", + "@types/object-hash": "^3.0.4", "@types/wordpress__block-editor": "^11.5.1", "@types/wordpress__components": "^23.0.1", "@typescript-eslint/parser": "^6.3.0", - "@wordpress/block-editor": "^12.9.0", + "@wordpress/block-editor": "^12.12.0", "@wordpress/components": "^25.9.0", "@wordpress/compose": "^6.15.0", - "@wordpress/data": "^9.12.0", + "@wordpress/data": "^9.14.0", "@wordpress/dom-ready": "^3.43.0", "@wordpress/e2e-test-utils": "^10.4.0", - "@wordpress/e2e-test-utils-playwright": "^0.9.0", + "@wordpress/e2e-test-utils-playwright": "^0.11.0", "@wordpress/e2e-tests": "^7.9.0", "@wordpress/element": "^5.20.0", - "@wordpress/env": "^8.7.0", - "@wordpress/scripts": "^26.9.0", - "conventional-changelog-simple-preset": "^1.0.20", + "@wordpress/env": "^8.9.0", + "@wordpress/scripts": "^26.14.0", + "conventional-changelog-simple-preset": "^1.0.24", "eslint-config-wordpress": "^2.0.0", "filemanager-webpack-plugin": "^6.1.7", "grunt": "^1.4.0", @@ -56,7 +57,7 @@ "lodash": "^4.17.21", "npm-run-all": "^4.1.5", "puppeteer-screen-recorder": "^2.1.2", - "replace-in-file": "^6.3.1", + "replace-in-file": "^7.0.2", "semantic-release": "^19.0.5", "semantic-release-slack-bot": "^3.5.2", "simple-statistics": "^7.8.3", @@ -148,21 +149,93 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", - "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.20.tgz", + "integrity": "sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -208,9 +281,9 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.9.tgz", - "integrity": "sha512-xdMkt39/nviO/4vpVdrEYPwXCsYIXSSAr6mC7WQsNIlGnuxKyKE7GZjalcnbSWiC4OXGNNN3UQPeHfjSC6sTDA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz", + "integrity": "sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg==", "dev": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", @@ -221,7 +294,7 @@ "node": "^10.13.0 || ^12.13.0 || >=14.0.0" }, "peerDependencies": { - "@babel/core": ">=7.11.0", + "@babel/core": "^7.11.0", "eslint": "^7.5.0 || ^8.0.0" } }, @@ -259,46 +332,43 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", - "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { "@babel/compat-data": "^7.22.9", - "@babel/helper-validator-option": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", "browserslist": "^4.21.9", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { @@ -311,20 +381,20 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -334,23 +404,23 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -360,124 +430,114 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", - "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -493,15 +553,14 @@ } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -511,53 +570,53 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -573,33 +632,32 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", - "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" @@ -620,13 +678,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -705,9 +763,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", - "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -717,12 +775,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -732,14 +790,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -748,17 +806,11 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - }, "engines": { "node": ">=6.9.0" }, @@ -766,63 +818,49 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { - "@babel/core": "^7.12.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -831,46 +869,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -879,14 +908,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -895,50 +923,37 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -947,60 +962,46 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" + "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1009,10 +1010,10 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-bigint": { + "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" @@ -1021,22 +1022,22 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" + "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { + "node_modules/@babel/plugin-syntax-private-property-in-object": { "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" @@ -1048,76 +1049,94 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1126,85 +1145,131 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz", + "integrity": "sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz", + "integrity": "sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1213,13 +1278,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1228,13 +1293,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1243,13 +1309,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1258,15 +1325,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1275,13 +1341,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1290,13 +1356,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1305,21 +1373,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1328,14 +1389,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1344,13 +1404,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1359,14 +1420,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1375,13 +1435,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz", + "integrity": "sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1390,14 +1451,15 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz", + "integrity": "sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1406,13 +1468,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz", + "integrity": "sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1421,15 +1486,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1438,13 +1502,29 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1453,13 +1533,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1468,14 +1549,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1484,15 +1565,17 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1501,16 +1584,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1519,14 +1600,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1535,29 +1616,30 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz", + "integrity": "sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0" + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1566,14 +1648,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1582,13 +1664,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1598,12 +1683,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1613,12 +1698,12 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.21.3.tgz", - "integrity": "sha512-4DVcFeWe/yDYBLp0kBmOGFJ6N2UYg7coGid1gdxb4co62dy/xISDMaYBXBVXEDhfgMk7qkbcYiGtwd5Q/hwDDQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", + "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1628,12 +1713,12 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", - "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1643,16 +1728,16 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.21.5.tgz", - "integrity": "sha512-ELdlq61FpoEkHO6gFRpfj0kUgSwQTGoaEU8eMRoS8Dv3v6e7BjEAj5WMtIBRdHUeAioMhKP5HyxNzNnP+heKbA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz", + "integrity": "sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/types": "^7.21.5" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1662,12 +1747,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", - "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", "dev": true, "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.18.6" + "@babel/plugin-transform-react-jsx": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1677,13 +1762,13 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", - "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1693,13 +1778,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1709,12 +1794,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1724,16 +1809,16 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", - "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", + "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", "@babel/helper-plugin-utils": "^7.22.5", - "babel-plugin-polyfill-corejs2": "^0.4.4", - "babel-plugin-polyfill-corejs3": "^0.8.2", - "babel-plugin-polyfill-regenerator": "^0.5.1", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", "semver": "^6.3.1" }, "engines": { @@ -1743,61 +1828,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", - "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", - "dev": true, - "dependencies": { - "@babel/helper-compilation-targets": "^7.22.6", - "@babel/helper-plugin-utils": "^7.22.5", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", - "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.4.2", - "semver": "^6.3.1" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", - "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2", - "core-js-compat": "^3.31.0" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, - "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", - "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", - "dev": true, - "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.2" - }, - "peerDependencies": { - "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" - } - }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1808,12 +1838,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1823,13 +1853,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1839,12 +1869,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1854,12 +1884,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1869,12 +1899,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1884,15 +1914,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1902,12 +1932,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1917,13 +1963,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1932,39 +1978,42 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.20.tgz", + "integrity": "sha512-11MY04gGC4kSzlPHRfvVkNAZhUxOvm7DCJ37hPDnUENwe06npjIRAfInEMTGSb4LZK5ZgDFkv5hw0lGebHeTyg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/compat-data": "^7.22.20", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1975,45 +2024,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.19", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2023,42 +2089,40 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-react": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", - "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz", + "integrity": "sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-transform-react-display-name": "^7.18.6", - "@babel/plugin-transform-react-jsx": "^7.18.6", - "@babel/plugin-transform-react-jsx-development": "^7.18.6", - "@babel/plugin-transform-react-pure-annotations": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2068,16 +2132,16 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", - "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.23.0.tgz", + "integrity": "sha512-6P6VVa/NM/VlAYj5s2Aq/gdVg8FSENCg3wlZ6Qau9AcPaoF5LbN1nyGlR9DTRIw9PpxI94e+ReydsJHcjwAweg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-typescript": "^7.21.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.23.0", + "@babel/plugin-transform-typescript": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -2104,14 +2168,14 @@ } }, "node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -2139,13 +2203,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", - "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -2353,17 +2417,17 @@ "dev": true }, "node_modules/@es-joy/jsdoccomment": { - "version": "0.36.1", - "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.36.1.tgz", - "integrity": "sha512-922xqFsTpHs6D0BUiG4toiyPOMc8/jafnWKxz1KWgS4XzKPy2qXf1Pe6UFuNSCQqt6tOuhAWXBNuuyUhJmw9Vg==", + "version": "0.40.1", + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz", + "integrity": "sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg==", "dev": true, "dependencies": { - "comment-parser": "1.3.1", - "esquery": "^1.4.0", - "jsdoc-type-pratt-parser": "~3.1.0" + "comment-parser": "1.4.0", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19" + "node": ">=16" } }, "node_modules/@eslint-community/eslint-utils": { @@ -2767,16 +2831,16 @@ } }, "node_modules/@jest/console": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.5.0.tgz", - "integrity": "sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -2784,37 +2848,37 @@ } }, "node_modules/@jest/core": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.5.0.tgz", - "integrity": "sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/reporters": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/reporters": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", - "jest-changed-files": "^29.5.0", - "jest-config": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-resolve-dependencies": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "jest-watcher": "^29.5.0", + "jest-changed-files": "^29.7.0", + "jest-config": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-resolve-dependencies": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, @@ -2843,12 +2907,12 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -2863,89 +2927,89 @@ "dev": true }, "node_modules/@jest/environment": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.5.0.tgz", - "integrity": "sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", + "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "dependencies": { - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0" + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "dependencies": { - "expect": "^29.5.0", - "jest-snapshot": "^29.5.0" + "expect": "^29.7.0", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.5.0.tgz", - "integrity": "sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3" + "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.5.0.tgz", - "integrity": "sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", + "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.5.0.tgz", - "integrity": "sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/types": "^29.5.0", - "jest-mock": "^29.5.0" + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/types": "^29.6.3", + "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.5.0.tgz", - "integrity": "sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/console": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", @@ -2953,13 +3017,13 @@ "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", @@ -2977,25 +3041,41 @@ } } }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", + "integrity": "sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@jest/schemas": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.3.tgz", - "integrity": "sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.4.3.tgz", - "integrity": "sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.15", + "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, @@ -3004,13 +3084,13 @@ } }, "node_modules/@jest/test-result": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.5.0.tgz", - "integrity": "sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, @@ -3019,14 +3099,14 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.5.0.tgz", - "integrity": "sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", + "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { @@ -3034,22 +3114,22 @@ } }, "node_modules/@jest/transform": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.5.0.tgz", - "integrity": "sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", + "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/types": "^29.5.0", - "@jridgewell/trace-mapping": "^0.3.15", + "@jest/types": "^29.6.3", + "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", @@ -3066,12 +3146,12 @@ "dev": true }, "node_modules/@jest/types": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.5.0.tgz", - "integrity": "sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -3335,81 +3415,181 @@ "@octokit/core": ">=3" } }, - "node_modules/@octokit/request": { - "version": "6.2.5", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", - "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", + "node_modules/@octokit/request": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.5.tgz", + "integrity": "sha512-z83E8UIlPNaJUsXpjD8E0V5o/5f+vJJNbNcBwVZsX3/vC650U41cOkTLjq4PKk9BYonQGOnx7N17gvLyNjgGcQ==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.11", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", + "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "node_modules/@octokit/types": { + "version": "9.2.3", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", + "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^17.2.0" + } + }, + "node_modules/@pkgr/utils": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", + "integrity": "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "fast-glob": "^3.3.0", + "is-glob": "^4.0.3", + "open": "^9.1.0", + "picocolors": "^1.0.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@pkgr/utils/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/utils/node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@pkgr/utils/node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", "dev": true, "dependencies": { - "@octokit/endpoint": "^7.0.0", - "@octokit/request-error": "^3.0.0", - "@octokit/types": "^9.0.0", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", - "universal-user-agent": "^6.0.0" + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" }, "engines": { - "node": ">= 14" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@octokit/request-error": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", - "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "node_modules/@pkgr/utils/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { - "@octokit/types": "^9.0.0", - "deprecation": "^2.0.0", - "once": "^1.4.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/@octokit/rest": { - "version": "19.0.11", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.11.tgz", - "integrity": "sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw==", + "node_modules/@pkgr/utils/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "dependencies": { - "@octokit/core": "^4.2.1", - "@octokit/plugin-paginate-rest": "^6.1.2", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^7.1.2" - }, "engines": { - "node": ">= 14" + "node": ">=8" } }, - "node_modules/@octokit/tsconfig": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", - "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", - "dev": true - }, - "node_modules/@octokit/types": { - "version": "9.2.3", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.2.3.tgz", - "integrity": "sha512-MMeLdHyFIALioycq+LFcA71v0S2xpQUX2cw6pPbHQjaibcHYwLnmK/kMZaWuGfGfjBJZ3wRUq+dOaWsvrPJVvA==", + "node_modules/@pkgr/utils/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { - "@octokit/openapi-types": "^17.2.0" + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/@playwright/test": { - "version": "1.36.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.1.tgz", - "integrity": "sha512-YK7yGWK0N3C2QInPU6iaf/L3N95dlGdbsezLya4n0ZCh3IL7VgPGxC6Gnznh9ApWdOmkJeleT2kMTcWPRZvzqg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.32.0.tgz", + "integrity": "sha512-zOdGloaF0jeec7hqoLqM5S3L2rR4WxMJs6lgiAeR70JlH7Ml54ZPoIIf3X7cvnKde3Q9jJ/gaxkFh8fYI9s1rg==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.36.1" + "playwright-core": "1.32.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=14" }, "optionalDependencies": { "fsevents": "2.3.2" @@ -3430,9 +3610,9 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", - "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz", + "integrity": "sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ==", "dev": true, "dependencies": { "ansi-html-community": "^0.0.8", @@ -3452,7 +3632,7 @@ "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <4.0.0", + "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", "webpack-dev-server": "3.x || 4.x", "webpack-hot-middleware": "2.x", @@ -3530,9 +3710,9 @@ } }, "node_modules/@polka/url": { - "version": "1.0.0-next.21", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", - "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==", + "version": "1.0.0-next.23", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz", + "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==", "dev": true }, "node_modules/@popperjs/core": { @@ -4452,6 +4632,130 @@ "semantic-release": ">=18.0.0-beta.1" } }, + "node_modules/@sentry/core": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", + "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "dev": true, + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/minimal": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/hub": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", + "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "dev": true, + "dependencies": { + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/hub/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/minimal": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", + "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "dev": true, + "dependencies": { + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/minimal/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/node": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", + "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", + "dev": true, + "dependencies": { + "@sentry/core": "6.19.7", + "@sentry/hub": "6.19.7", + "@sentry/types": "6.19.7", + "@sentry/utils": "6.19.7", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/node/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@sentry/node/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@sentry/types": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", + "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils": { + "version": "6.19.7", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", + "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "dev": true, + "dependencies": { + "@sentry/types": "6.19.7", + "tslib": "^1.9.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@sentry/utils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -4474,9 +4778,9 @@ "dev": true }, "node_modules/@sinclair/typebox": { - "version": "0.25.24", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.24.tgz", - "integrity": "sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/is": { @@ -4501,21 +4805,21 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.2.0.tgz", - "integrity": "sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@svgr/babel-plugin-add-jsx-attribute": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz", - "integrity": "sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4558,12 +4862,12 @@ } }, "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz", - "integrity": "sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4574,12 +4878,12 @@ } }, "node_modules/@svgr/babel-plugin-svg-dynamic-title": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz", - "integrity": "sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4590,12 +4894,12 @@ } }, "node_modules/@svgr/babel-plugin-svg-em-dimensions": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz", - "integrity": "sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4606,12 +4910,12 @@ } }, "node_modules/@svgr/babel-plugin-transform-react-native-svg": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz", - "integrity": "sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4622,9 +4926,9 @@ } }, "node_modules/@svgr/babel-plugin-transform-svg-component": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz", - "integrity": "sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", "dev": true, "engines": { "node": ">=12" @@ -4638,22 +4942,22 @@ } }, "node_modules/@svgr/babel-preset": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz", - "integrity": "sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", "dev": true, "dependencies": { - "@svgr/babel-plugin-add-jsx-attribute": "^6.5.1", - "@svgr/babel-plugin-remove-jsx-attribute": "*", - "@svgr/babel-plugin-remove-jsx-empty-expression": "*", - "@svgr/babel-plugin-replace-jsx-attribute-value": "^6.5.1", - "@svgr/babel-plugin-svg-dynamic-title": "^6.5.1", - "@svgr/babel-plugin-svg-em-dimensions": "^6.5.1", - "@svgr/babel-plugin-transform-react-native-svg": "^6.5.1", - "@svgr/babel-plugin-transform-svg-component": "^6.5.1" + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4664,36 +4968,80 @@ } }, "node_modules/@svgr/core": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz", - "integrity": "sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "dev": true, "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", "camelcase": "^6.2.0", - "cosmiconfig": "^7.0.1" + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@svgr/core/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@svgr/core/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/core/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@svgr/hast-util-to-babel-ast": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz", - "integrity": "sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0", + "@babel/types": "^7.21.3", "entities": "^4.4.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4701,39 +5049,39 @@ } }, "node_modules/@svgr/plugin-jsx": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz", - "integrity": "sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, "dependencies": { - "@babel/core": "^7.19.6", - "@svgr/babel-preset": "^6.5.1", - "@svgr/hast-util-to-babel-ast": "^6.5.1", + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", "svg-parser": "^2.0.4" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", "url": "https://github.com/sponsors/gregberge" }, "peerDependencies": { - "@svgr/core": "^6.0.0" + "@svgr/core": "*" } }, "node_modules/@svgr/plugin-svgo": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz", - "integrity": "sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dev": true, "dependencies": { - "cosmiconfig": "^7.0.1", - "deepmerge": "^4.2.2", - "svgo": "^2.8.0" + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4743,23 +5091,67 @@ "@svgr/core": "*" } }, + "node_modules/@svgr/plugin-svgo/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@svgr/webpack": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz", - "integrity": "sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dev": true, "dependencies": { - "@babel/core": "^7.19.6", - "@babel/plugin-transform-react-constant-elements": "^7.18.12", - "@babel/preset-env": "^7.19.4", + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", - "@svgr/core": "^6.5.1", - "@svgr/plugin-jsx": "^6.5.1", - "@svgr/plugin-svgo": "^6.5.1" + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" }, "engines": { - "node": ">=10" + "node": ">=14" }, "funding": { "type": "github", @@ -4903,6 +5295,12 @@ "node": ">= 10" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, "node_modules/@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", @@ -4928,9 +5326,9 @@ "dev": true }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.2.tgz", + "integrity": "sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -4941,18 +5339,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.5", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.5.tgz", + "integrity": "sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.2.tgz", + "integrity": "sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -4969,9 +5367,9 @@ } }, "node_modules/@types/body-parser": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", - "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "version": "1.19.3", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.3.tgz", + "integrity": "sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==", "dev": true, "dependencies": { "@types/connect": "*", @@ -4979,9 +5377,9 @@ } }, "node_modules/@types/bonjour": { - "version": "3.5.10", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", - "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "version": "3.5.11", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.11.tgz", + "integrity": "sha512-isGhjmBtLIxdHBDl2xGwUzEM8AOyOvWsADWq7rqirdi/ZQoHnLWErHvsThcEzTX8juDRiZtzp2Qkv5bgNh6mAg==", "dev": true, "dependencies": { "@types/node": "*" @@ -5000,18 +5398,18 @@ } }, "node_modules/@types/connect": { - "version": "3.4.35", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", - "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "version": "3.4.36", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz", + "integrity": "sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz", + "integrity": "sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw==", "dev": true, "dependencies": { "@types/express-serve-static-core": "*", @@ -5045,9 +5443,9 @@ "dev": true }, "node_modules/@types/express": { - "version": "4.17.17", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", - "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "version": "4.17.18", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.18.tgz", + "integrity": "sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==", "dev": true, "dependencies": { "@types/body-parser": "*", @@ -5057,9 +5455,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.35", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", - "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "version": "4.17.37", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.37.tgz", + "integrity": "sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==", "dev": true, "dependencies": { "@types/node": "*", @@ -5079,9 +5477,9 @@ } }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.7.tgz", + "integrity": "sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==", "dev": true, "dependencies": { "@types/node": "*" @@ -5105,10 +5503,16 @@ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", "dev": true }, + "node_modules/@types/http-errors": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.2.tgz", + "integrity": "sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==", + "dev": true + }, "node_modules/@types/http-proxy": { - "version": "1.17.11", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", - "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "version": "1.17.12", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.12.tgz", + "integrity": "sha512-kQtujO08dVtQ2wXAuSFfk9ASy3sug4+ogFR8Kd8UgP8PEuc1/G/8yjYRmp//PcDNJEUKOza/MrQu15bouEUCiw==", "dev": true, "dependencies": { "@types/node": "*" @@ -5192,9 +5596,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/json5": { @@ -5222,9 +5626,9 @@ } }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", "dev": true }, "node_modules/@types/minimatch": { @@ -5257,33 +5661,33 @@ "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", "dev": true }, + "node_modules/@types/object-hash": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/object-hash/-/object-hash-3.0.4.tgz", + "integrity": "sha512-w4fEy2suq1bepUxHoJRCBHJz0vS5DPAYpSbcgNwOahljxwyJsiKmi8qyes2/TJc+4Avd7fsgP+ZgUuXZjPvdug==", + "dev": true + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", "dev": true }, - "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", - "dev": true - }, "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/qs": { - "version": "6.9.7", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "version": "6.9.8", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz", + "integrity": "sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==", "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", "dev": true }, "node_modules/@types/react": { @@ -5334,15 +5738,15 @@ "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", - "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.2.tgz", + "integrity": "sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==", "dev": true, "dependencies": { "@types/mime": "^1", @@ -5350,28 +5754,29 @@ } }, "node_modules/@types/serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.2.tgz", + "integrity": "sha512-asaEIoc6J+DbBKXtO7p2shWUpKacZOoMBEGBgPG91P8xhO53ohzHWGCs4ScZo5pQMf5ukQzVT9fhX1WzpHihig==", "dev": true, "dependencies": { "@types/express": "*" } }, "node_modules/@types/serve-static": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.1.tgz", - "integrity": "sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.3.tgz", + "integrity": "sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==", "dev": true, "dependencies": { + "@types/http-errors": "*", "@types/mime": "*", "@types/node": "*" } }, "node_modules/@types/sockjs": { - "version": "0.3.33", - "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", - "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "version": "0.3.34", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.34.tgz", + "integrity": "sha512-R+n7qBFnm/6jinlteC9DBL5dGiDGjWAvjo4viUanpnc/dG1y7uDoacXPIQ/PQEg1fI912SMHIa014ZjRpvDw4g==", "dev": true, "dependencies": { "@types/node": "*" @@ -5411,9 +5816,9 @@ "dev": true }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/uglify-js": { @@ -5725,9 +6130,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.6.tgz", + "integrity": "sha512-8B5EO9jLVCy+B58PLHvLDuOD8DRVMgQzq8d55SjLCOn9kqGyqOvy27exVaTio1q1nX5zLu8/6N0n2ThSxOM6tg==", "dev": true, "dependencies": { "@types/node": "*" @@ -5758,16 +6163,98 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.4", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.3.0.tgz", - "integrity": "sha512-ibP+y2Gr6p0qsUkhs7InMdXrwldjxZw66wpcQq9/PzAroM45wdwyu81T+7RibNCh8oc0AgrsyCwJByncY0Ongg==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.3.tgz", + "integrity": "sha512-TlutE+iep2o7R8Lf+yoer3zU6/0EAUc8QIBB3GYBc1KGz4c4TRm83xwXUZVPlZ6YCLss4r77jbu6j3sendJoiQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.3.0", - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/typescript-estree": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/scope-manager": "6.7.3", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/typescript-estree": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4" }, "engines": { @@ -5786,14 +6273,14 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.3.0.tgz", - "integrity": "sha512-WlNFgBEuGu74ahrXzgefiz/QlVb+qg8KDTpknKwR7hMH+lQygWyx0CQFoUmMn1zDkQjTBBIn75IxtWss77iBIQ==", + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.3.tgz", + "integrity": "sha512-wOlo0QnEou9cHO2TdkJmzF7DFGvAKEnB82PuPNHpT8ZKKaZu6Bm63ugOTn9fXNJtvuDPanBc78lGUGGytJoVzQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0" + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -5803,27 +6290,54 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.3.0.tgz", - "integrity": "sha512-K6TZOvfVyc7MO9j60MkRNWyFSf86IbOatTKGrpTQnzarDZPYPVy0oe3myTMq7VjhfsUAbNUW8I5s+2lZvtx1gg==", + "node_modules/@typescript-eslint/type-utils": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, "engines": { "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.3.0.tgz", - "integrity": "sha512-Xh4NVDaC4eYKY4O3QGPuQNp5NxBAlEvNQYOqJquR2MePNxO11E5K3t5x4M4Mx53IZvtpW+mBxIT0s274fLUocg==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", - "@typescript-eslint/visitor-keys": "6.3.0", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -5843,13 +6357,13 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.3.0.tgz", - "integrity": "sha512-kEhRRj7HnvaSjux1J9+7dBen15CdWmDnwrpyiHsFX6Qx2iW5LOBUgNefOFeh2PjWPlNwN8TOn6+4eBU3J/gupw==", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.3.0", + "@typescript-eslint/types": "6.7.4", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -5860,79 +6374,117 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", - "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "node_modules/@typescript-eslint/types": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.3.tgz", + "integrity": "sha512-4g+de6roB2NFcfkZb439tigpAMnvEIg3rIjWQ+EM7IBaYt/CdJt6em9BJ4h4UpdgaBWdmx2iWsafHTrqmgIPNw==", "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", - "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.3.tgz", + "integrity": "sha512-YLQ3tJoS4VxLFYHTw21oe1/vIZPRqAO91z6Uv0Ss2BKm/Ag7/RVQBcXTGcXhgJMdA4U+HrKuY5gWlJlvoaKZ5g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.62.0", - "@typescript-eslint/utils": "5.62.0", + "@typescript-eslint/types": "6.7.3", + "@typescript-eslint/visitor-keys": "6.7.3", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, - "peerDependencies": { - "eslint": "*" - }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, - "node_modules/@typescript-eslint/types": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", - "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "node_modules/@typescript-eslint/utils": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "semver": "^7.5.4" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", - "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/visitor-keys": "5.62.0", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -5944,43 +6496,34 @@ } } }, - "node_modules/@typescript-eslint/utils": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", - "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@typescript-eslint/types": "6.7.4", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", - "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.3.tgz", + "integrity": "sha512-HEVXkU9IB+nk9o63CeICMHxFWbHWr3E1mpilIQBe9+7L/lH97rleFLVtYsfnWB+JVMaiFnEaxvknvmIzX+CqVg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.62.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.7.3", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -6152,34 +6695,42 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, - "dependencies": { - "envinfo": "^7.7.3" + "engines": { + "node": ">=14.15.0" }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" } }, "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, + "engines": { + "node": ">=14.15.0" + }, "peerDependencies": { - "webpack-cli": "4.x.x" + "webpack": "5.x.x", + "webpack-cli": "5.x.x" }, "peerDependenciesMeta": { "webpack-dev-server": { @@ -6188,37 +6739,37 @@ } }, "node_modules/@wordpress/a11y": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.43.0.tgz", - "integrity": "sha512-jtBGQnjabqRIPyXSSjP2YXXD5qCY3FW2742hQo2yBrKWCwGrP2t7sdR6P6nAlRDKPMMrecK+RsyW3KKTgNgFzQ==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.44.0.tgz", + "integrity": "sha512-bPPHobqz3s9F4aoToHAVxOtYlJ+KvG9Cf4Llitd1Iy39gOPO+hIYGSBibq6QuHWQckhkwqI3PcnVSrDmPwd2gw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/dom-ready": "^3.43.0", - "@wordpress/i18n": "^4.43.0" + "@wordpress/dom-ready": "^3.44.0", + "@wordpress/i18n": "^4.44.0" }, "engines": { "node": ">=12" } }, "node_modules/@wordpress/api-fetch": { - "version": "6.38.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-6.38.0.tgz", - "integrity": "sha512-EY5+9hxUDFOKCrIBFokUFuF2bPnWjtOlc8yQcB1SmJv5JULdFZF+pgAKXqTPFwWR8wcNjv2hypemV8j82Rq4MA==", + "version": "6.41.0", + "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-6.41.0.tgz", + "integrity": "sha512-IrwfTrdKFz+fwPbhd5RedaR3aGNVJIshWhKkL2Six8Mcc+h257RFIzESghywyk5YJ8HDIKElTO05Vge+rBPK3Q==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^4.41.0", - "@wordpress/url": "^3.42.0" + "@wordpress/i18n": "^4.44.0", + "@wordpress/url": "^3.45.0" }, "engines": { "node": ">=12" } }, "node_modules/@wordpress/autop": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-3.41.0.tgz", - "integrity": "sha512-oaGwox3PKg6/a4nFul7js4k/wXazgtL0t6v8Epg3IotMUFXBN3rCAqH/zmCl/669LA9gG0TaT0VoqjF3iFuLtQ==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-3.44.0.tgz", + "integrity": "sha512-bDdmzR/KBsqGA+x7GTH/jNl4R5k/T/trbMFYAHDWhvBNaDNPgiIMHxQFTvyREQcw2O5C3qf8jJ2UNJq4SM6eOQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -6228,9 +6779,9 @@ } }, "node_modules/@wordpress/babel-plugin-import-jsx-pragma": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.21.0.tgz", - "integrity": "sha512-mEnR5Zc8dYfNkyCb3NbVf+i6cWSrfIglRCyUzpryGUsyE/bMsrKeapZa1UbgwKpfLqgZNRbA2i7hKmurCVIPag==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.26.0.tgz", + "integrity": "sha512-XZCTBqEmOlM87/6wkgtHhnHaj8cJPOY5avyjKtMDwoBbcXAmHUknbphZG7KEWIiVIilyxKyHnsTxjTplkqTtCQ==", "dev": true, "engines": { "node": ">=14" @@ -6240,9 +6791,9 @@ } }, "node_modules/@wordpress/babel-preset-default": { - "version": "7.22.0", - "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.22.0.tgz", - "integrity": "sha512-dcLD8oCBIbRr6wAVIGAIr/CwjqVR/36yTBaPlqMebCGPk1L3ktNpdKjYaFYsdo1eP/WkPCKd1uoWUYuiRKhGuA==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.27.0.tgz", + "integrity": "sha512-/BGW/7oQvQdXehF7gLI7alSk1v1/ipbckkQ0q+mF+T381wKvqFQzJoix+aufFDq1GowX4Oj75GIA0bGFLTdF2g==", "dev": true, "dependencies": { "@babel/core": "^7.16.0", @@ -6251,27 +6802,27 @@ "@babel/preset-env": "^7.16.0", "@babel/preset-typescript": "^7.16.0", "@babel/runtime": "^7.16.0", - "@wordpress/babel-plugin-import-jsx-pragma": "^4.21.0", - "@wordpress/browserslist-config": "^5.21.0", - "@wordpress/element": "^5.15.0", - "@wordpress/warning": "^2.38.0", - "browserslist": "^4.21.9", - "core-js": "^3.31.0" + "@wordpress/babel-plugin-import-jsx-pragma": "^4.26.0", + "@wordpress/browserslist-config": "^5.26.0", + "@wordpress/warning": "^2.43.0", + "browserslist": "^4.21.10", + "core-js": "^3.31.0", + "react": "^18.2.0" }, "engines": { "node": ">=14" } }, "node_modules/@wordpress/base-styles": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.29.0.tgz", - "integrity": "sha512-2oYk4M6F+os9Mw0mxWZaEmt9sj5mB2TeMDp99/g23JZpQVzOV5qeDOePnH77qViARBno7lFe40nuaHNf5Sd/fA==", + "version": "4.34.0", + "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.34.0.tgz", + "integrity": "sha512-LYiNFWl+6yJDVQ7hSNJu2kVuM1p3C3aTB769lXnMSxi3gubzxqjZqz9i9XQ3UjO9EFiDSvgbOXa8YhvTUfNnkQ==", "dev": true }, "node_modules/@wordpress/blob": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-3.41.0.tgz", - "integrity": "sha512-osBcD1IpN/YT96ArGqf7Cdon/Z8gHMC8sWPUAQ1OPLNrxlFLomaCPOoC9UeAgbEh338epoYfqmi7rTwUMCBS3Q==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-3.44.0.tgz", + "integrity": "sha512-f/U7Dd0KLpvGeiwsWDSI0QCJoPPYmYaoih2CoAaE2+9vM7vDpCP0Sx8t4QD+JBwG7ZjQ33fIPdlFCQGJxc6YVg==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -6281,45 +6832,44 @@ } }, "node_modules/@wordpress/block-editor": { - "version": "12.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-12.9.0.tgz", - "integrity": "sha512-x8fUoP2T6PtuEXm62VGkJSLokDU8EKmh+5sFeVIj2Vbh7av4i0+OWzf/LhP4rCi1bRujZSk8Gn1uzRfJglNMHQ==", + "version": "12.12.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-12.12.0.tgz", + "integrity": "sha512-8G6kqkxT0z+XyLCNwyMPz8RxZiIpGGmEK9/byOENhNF2sKmiKA6PFzBzo9NWQbY8iBdQNRrrr70crPhFCO7d0Q==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", "@emotion/react": "^11.7.1", "@emotion/styled": "^11.6.0", "@react-spring/web": "^9.4.5", - "@wordpress/a11y": "^3.41.0", - "@wordpress/api-fetch": "^6.38.0", - "@wordpress/blob": "^3.41.0", - "@wordpress/blocks": "^12.18.0", - "@wordpress/commands": "^0.12.0", - "@wordpress/components": "^25.7.0", - "@wordpress/compose": "^6.18.0", - "@wordpress/data": "^9.11.0", - "@wordpress/date": "^4.41.0", - "@wordpress/deprecated": "^3.41.0", - "@wordpress/dom": "^3.41.0", - "@wordpress/element": "^5.18.0", - "@wordpress/escape-html": "^2.41.0", - "@wordpress/hooks": "^3.41.0", - "@wordpress/html-entities": "^3.41.0", - "@wordpress/i18n": "^4.41.0", - "@wordpress/icons": "^9.32.0", - "@wordpress/is-shallow-equal": "^4.41.0", - "@wordpress/keyboard-shortcuts": "^4.18.0", - "@wordpress/keycodes": "^3.41.0", - "@wordpress/notices": "^4.9.0", - "@wordpress/preferences": "^3.18.0", - "@wordpress/private-apis": "^0.23.0", - "@wordpress/rich-text": "^6.18.0", - "@wordpress/shortcode": "^3.41.0", - "@wordpress/style-engine": "^1.24.0", - "@wordpress/token-list": "^2.41.0", - "@wordpress/url": "^3.42.0", - "@wordpress/warning": "^2.41.0", - "@wordpress/wordcount": "^3.41.0", + "@wordpress/a11y": "^3.44.0", + "@wordpress/api-fetch": "^6.41.0", + "@wordpress/blob": "^3.44.0", + "@wordpress/blocks": "^12.21.0", + "@wordpress/commands": "^0.15.0", + "@wordpress/components": "^25.10.0", + "@wordpress/compose": "^6.21.0", + "@wordpress/data": "^9.14.0", + "@wordpress/date": "^4.44.0", + "@wordpress/deprecated": "^3.44.0", + "@wordpress/dom": "^3.44.0", + "@wordpress/element": "^5.21.0", + "@wordpress/escape-html": "^2.44.0", + "@wordpress/hooks": "^3.44.0", + "@wordpress/html-entities": "^3.44.0", + "@wordpress/i18n": "^4.44.0", + "@wordpress/icons": "^9.35.0", + "@wordpress/is-shallow-equal": "^4.44.0", + "@wordpress/keyboard-shortcuts": "^4.21.0", + "@wordpress/keycodes": "^3.44.0", + "@wordpress/notices": "^4.12.0", + "@wordpress/preferences": "^3.21.0", + "@wordpress/private-apis": "^0.26.0", + "@wordpress/rich-text": "^6.21.0", + "@wordpress/style-engine": "^1.27.0", + "@wordpress/token-list": "^2.44.0", + "@wordpress/url": "^3.45.0", + "@wordpress/warning": "^2.44.0", + "@wordpress/wordcount": "^3.44.0", "change-case": "^4.1.2", "classnames": "^2.3.1", "colord": "^2.7.0", @@ -6343,9 +6893,9 @@ } }, "node_modules/@wordpress/block-serialization-default-parser": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.41.0.tgz", - "integrity": "sha512-/bHeVewOO2GSm3y6fSoOlt0ZNweP2jua8G+CTZG3XKrwX1eTXWFQtJTJQPUuerXeWEqMTD58lILxneqyw28hcg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.44.0.tgz", + "integrity": "sha512-GI0lPuVGdjj433zS5D4UXsewarKmXL6xpY/J42oZT5dKhjneKgzpABQcRf8sLoYCB+9pe+xi9Nm+V65SRNWKGw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -6355,26 +6905,26 @@ } }, "node_modules/@wordpress/blocks": { - "version": "12.18.0", - "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-12.18.0.tgz", - "integrity": "sha512-JS2g4k95GPNdO2hOLBbppz3kTBUdKIoFXJ5w5tn11TGYep4dmEHh8ugGCW9XweOCkz3g4HDT+vansRAz4JF1yQ==", + "version": "12.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-12.21.0.tgz", + "integrity": "sha512-4nyqtM6LCymQrB39MrBs2h5IhEeSN5nrfxGTbr0+RpeMgVwwT8oc86BxnRGuuaGgxwFYESSkq+n550qzUyGZ5w==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/autop": "^3.41.0", - "@wordpress/blob": "^3.41.0", - "@wordpress/block-serialization-default-parser": "^4.41.0", - "@wordpress/compose": "^6.18.0", - "@wordpress/data": "^9.11.0", - "@wordpress/deprecated": "^3.41.0", - "@wordpress/dom": "^3.41.0", - "@wordpress/element": "^5.18.0", - "@wordpress/hooks": "^3.41.0", - "@wordpress/html-entities": "^3.41.0", - "@wordpress/i18n": "^4.41.0", - "@wordpress/is-shallow-equal": "^4.41.0", - "@wordpress/private-apis": "^0.23.0", - "@wordpress/shortcode": "^3.41.0", + "@wordpress/autop": "^3.44.0", + "@wordpress/blob": "^3.44.0", + "@wordpress/block-serialization-default-parser": "^4.44.0", + "@wordpress/compose": "^6.21.0", + "@wordpress/data": "^9.14.0", + "@wordpress/deprecated": "^3.44.0", + "@wordpress/dom": "^3.44.0", + "@wordpress/element": "^5.21.0", + "@wordpress/hooks": "^3.44.0", + "@wordpress/html-entities": "^3.44.0", + "@wordpress/i18n": "^4.44.0", + "@wordpress/is-shallow-equal": "^4.44.0", + "@wordpress/private-apis": "^0.26.0", + "@wordpress/shortcode": "^3.44.0", "change-case": "^4.1.2", "colord": "^2.7.0", "deepmerge": "^4.3.0", @@ -6386,7 +6936,7 @@ "remove-accents": "^0.5.0", "showdown": "^1.9.1", "simple-html-tokenizer": "^0.5.7", - "uuid": "^8.3.0" + "uuid": "^9.0.1" }, "engines": { "node": ">=12" @@ -6395,38 +6945,29 @@ "react": "^18.0.0" } }, - "node_modules/@wordpress/blocks/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/@wordpress/browserslist-config": { - "version": "5.21.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.21.0.tgz", - "integrity": "sha512-it0w94H5lXEK605QWAWK+jIYwpaes1xm6dPx8/ekoWJQi/5+kEqPLmpLwRo68d41CSMbZClxgYo35f0OiZE22A==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.26.0.tgz", + "integrity": "sha512-rpkxAnPOc4HuxKZBwZ1iV1oC0Rd21azzBDyS8OoVUW6V8DAv4eYfHNFGkyds7Z+nI6dI15Rl7xJYJhHJKVaJvg==", "dev": true, "engines": { "node": ">=14" } }, "node_modules/@wordpress/commands": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-0.12.0.tgz", - "integrity": "sha512-yeFZ2BCDh9i8+XhcwAjwREXE8WUl9hv4YL5/b2Dh6eUqld/TGH4lUtxIHMxsnlzLqR29ZRaChobU44ji4rZf9g==", + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-0.15.0.tgz", + "integrity": "sha512-QDO4uyvPHOuGAcvsJl7ySNysMOOf9GVcC9bMUl4DMJLZiK55RfzinK9zMk0oShVwsq4j7WlU+0w5Rc3IfCz9OQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/components": "^25.7.0", - "@wordpress/data": "^9.11.0", - "@wordpress/element": "^5.18.0", - "@wordpress/i18n": "^4.41.0", - "@wordpress/icons": "^9.32.0", - "@wordpress/keyboard-shortcuts": "^4.18.0", - "@wordpress/private-apis": "^0.23.0", + "@wordpress/components": "^25.10.0", + "@wordpress/data": "^9.14.0", + "@wordpress/element": "^5.21.0", + "@wordpress/i18n": "^4.44.0", + "@wordpress/icons": "^9.35.0", + "@wordpress/keyboard-shortcuts": "^4.21.0", + "@wordpress/private-apis": "^0.26.0", "classnames": "^2.3.1", "cmdk": "^0.2.0", "rememo": "^4.0.2" @@ -6440,9 +6981,9 @@ } }, "node_modules/@wordpress/components": { - "version": "25.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-25.9.0.tgz", - "integrity": "sha512-UA7oxtxoM0POdHwFbtlwotABGXeXB8Xy/5cAElga+MjVGRNGL6nrpkQgBUwXALvR39she25t1TJKM+OwxQ5ogg==", + "version": "25.10.0", + "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-25.10.0.tgz", + "integrity": "sha512-8qqhXq++gCRKzn39w01dvLfpyrBEBGMIM/p7zU+9eBZjdq1NM7BQUKCvG0+3KgPxde+xDOnVW8OGKfIrozC2ig==", "dev": true, "dependencies": { "@ariakit/react": "^0.3.3", @@ -6458,23 +6999,23 @@ "@types/gradient-parser": "0.1.3", "@types/highlight-words-core": "1.2.1", "@use-gesture/react": "^10.2.24", - "@wordpress/a11y": "^3.43.0", - "@wordpress/compose": "^6.20.0", - "@wordpress/date": "^4.43.0", - "@wordpress/deprecated": "^3.43.0", - "@wordpress/dom": "^3.43.0", - "@wordpress/element": "^5.20.0", - "@wordpress/escape-html": "^2.43.0", - "@wordpress/hooks": "^3.43.0", - "@wordpress/html-entities": "^3.43.0", - "@wordpress/i18n": "^4.43.0", - "@wordpress/icons": "^9.34.0", - "@wordpress/is-shallow-equal": "^4.43.0", - "@wordpress/keycodes": "^3.43.0", - "@wordpress/primitives": "^3.41.0", - "@wordpress/private-apis": "^0.25.0", - "@wordpress/rich-text": "^6.20.0", - "@wordpress/warning": "^2.43.0", + "@wordpress/a11y": "^3.44.0", + "@wordpress/compose": "^6.21.0", + "@wordpress/date": "^4.44.0", + "@wordpress/deprecated": "^3.44.0", + "@wordpress/dom": "^3.44.0", + "@wordpress/element": "^5.21.0", + "@wordpress/escape-html": "^2.44.0", + "@wordpress/hooks": "^3.44.0", + "@wordpress/html-entities": "^3.44.0", + "@wordpress/i18n": "^4.44.0", + "@wordpress/icons": "^9.35.0", + "@wordpress/is-shallow-equal": "^4.44.0", + "@wordpress/keycodes": "^3.44.0", + "@wordpress/primitives": "^3.42.0", + "@wordpress/private-apis": "^0.26.0", + "@wordpress/rich-text": "^6.21.0", + "@wordpress/warning": "^2.44.0", "change-case": "^4.1.2", "classnames": "^2.3.1", "colord": "^2.7.0", @@ -6505,33 +7046,21 @@ "react-dom": "^18.0.0" } }, - "node_modules/@wordpress/components/node_modules/@wordpress/private-apis": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-0.25.0.tgz", - "integrity": "sha512-y1+U+wAwcjQ5QTDEDGvJbcc0VhyFx0tJh61i6eeBYy2mFXRGJDHyQVjp3agO8YXQdyHeAusVVOKTMT7mZdzUMw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@wordpress/compose": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-6.20.0.tgz", - "integrity": "sha512-9BOECyaz9HN7v98Lz6sAJxemcR6rnUZS2DAoGVJHxUPqYiyIRIMEax5SR6MVI/Qr1n7rFouK/0lUP7ZGRzQauA==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-6.21.0.tgz", + "integrity": "sha512-YqbmZBqS+deq1PfOi019GUOloh43nXNeru3iFzWgogiWvHxVWPLKxfFFNJ2kOup1UvRrvpgBn81J8KxCd2aNLw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", "@types/mousetrap": "^1.6.8", - "@wordpress/deprecated": "^3.43.0", - "@wordpress/dom": "^3.43.0", - "@wordpress/element": "^5.20.0", - "@wordpress/is-shallow-equal": "^4.43.0", - "@wordpress/keycodes": "^3.43.0", - "@wordpress/priority-queue": "^2.43.0", - "@wordpress/undo-manager": "^0.3.0", + "@wordpress/deprecated": "^3.44.0", + "@wordpress/dom": "^3.44.0", + "@wordpress/element": "^5.21.0", + "@wordpress/is-shallow-equal": "^4.44.0", + "@wordpress/keycodes": "^3.44.0", + "@wordpress/priority-queue": "^2.44.0", + "@wordpress/undo-manager": "^0.4.0", "change-case": "^4.1.2", "clipboard": "^2.0.8", "mousetrap": "^1.6.5", @@ -6545,19 +7074,19 @@ } }, "node_modules/@wordpress/data": { - "version": "9.13.0", - "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-9.13.0.tgz", - "integrity": "sha512-SayS6JsOFL2SBKIk4NFlmGLYvH7ocqOf6iuMq2aJ8E04VuExLEDqnDjxXkdOgLrrie6dOLG21EvNRk7Vc7QDOA==", + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-9.14.0.tgz", + "integrity": "sha512-xwdDHIMrq5rISElBTAgswY+G7os7kamM/bVe0HV6abcNxQgo22Urtp+XscTgR9sStBVkbBRPUy++mOI6TkFjbQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/compose": "^6.20.0", - "@wordpress/deprecated": "^3.43.0", - "@wordpress/element": "^5.20.0", - "@wordpress/is-shallow-equal": "^4.43.0", - "@wordpress/priority-queue": "^2.43.0", - "@wordpress/private-apis": "^0.25.0", - "@wordpress/redux-routine": "^4.43.0", + "@wordpress/compose": "^6.21.0", + "@wordpress/deprecated": "^3.44.0", + "@wordpress/element": "^5.21.0", + "@wordpress/is-shallow-equal": "^4.44.0", + "@wordpress/priority-queue": "^2.44.0", + "@wordpress/private-apis": "^0.26.0", + "@wordpress/redux-routine": "^4.44.0", "deepmerge": "^4.3.0", "equivalent-key-map": "^0.2.2", "is-plain-object": "^5.0.0", @@ -6569,30 +7098,18 @@ "engines": { "node": ">=12" }, - "peerDependencies": { - "react": "^18.0.0" - } - }, - "node_modules/@wordpress/data/node_modules/@wordpress/private-apis": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-0.25.0.tgz", - "integrity": "sha512-y1+U+wAwcjQ5QTDEDGvJbcc0VhyFx0tJh61i6eeBYy2mFXRGJDHyQVjp3agO8YXQdyHeAusVVOKTMT7mZdzUMw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0" - }, - "engines": { - "node": ">=12" + "peerDependencies": { + "react": "^18.0.0" } }, "node_modules/@wordpress/date": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.43.0.tgz", - "integrity": "sha512-fXHXewPYogPGsQSzy1z9WIUluWof2vPkRc4KXE5vgmWaUbl5xvPEiRX4ZJcofYmKzk0ioDYrq56eDKvEgKoF+A==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.44.0.tgz", + "integrity": "sha512-WrSAg+gbRN5YB/YZhQnJMNKj80efc+6taVYq3VjSzp27CPxh75qTE5N56TJWGKZbB8mqCIEWy6eOXhIoBW19mQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/deprecated": "^3.43.0", + "@wordpress/deprecated": "^3.44.0", "moment": "^2.29.4", "moment-timezone": "^0.5.40" }, @@ -6601,9 +7118,9 @@ } }, "node_modules/@wordpress/dependency-extraction-webpack-plugin": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-4.21.0.tgz", - "integrity": "sha512-YLsopatpixhc0MlbH9Nt5Tutw8QA+zt8uAEy4MpHl6J9h4/xqiROh0QsA0qHrCD5Tn6gi3gLx9RdMTU/pLWQUQ==", + "version": "4.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-4.26.0.tgz", + "integrity": "sha512-enZwezdSuR9IETqCM+i1Iez9jvKUMI7dL+BOluTijQW1zbo6/3HiU8qFWqsF1lhUrYp1OmQRldtmxs+YZYm36g==", "dev": true, "dependencies": { "json2php": "^0.0.7", @@ -6617,35 +7134,35 @@ } }, "node_modules/@wordpress/deprecated": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.43.0.tgz", - "integrity": "sha512-rmnehCKUEvZBH1VbQiK7YV9Yh5EQPcOO0kaf7UIGXUrH/pEpUn1PW+5Yox4ZyVNvqCQj2mbs6sqSNiIsjRWpAA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.44.0.tgz", + "integrity": "sha512-UDOMPelGmNUr5Qx75P4TFB/kcpggoIM0Oo4yG9Tc9ykordWvOPHeRujltSmNl+yjjEj68C+zq0xAgrfPeBPgMg==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^3.43.0" + "@wordpress/hooks": "^3.44.0" }, "engines": { "node": ">=12" } }, "node_modules/@wordpress/dom": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.43.0.tgz", - "integrity": "sha512-fTaZvTG/0En5r+ArMOGiBUomhbpJJf2RYMMu2ok39E/alwIawZHz/qeL3706BlT4r2QPCfK/tUOHQSh13+3ocg==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.44.0.tgz", + "integrity": "sha512-s1IQZHIplfTsI/hwoFbTlDD+uto8H0RZMXGLjPxyvpOIvh5ujxTxWGgzYdRecKzjoVGtq+BOAWlT8eoEhRiamQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/deprecated": "^3.43.0" + "@wordpress/deprecated": "^3.44.0" }, "engines": { "node": ">=12" } }, "node_modules/@wordpress/dom-ready": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.43.0.tgz", - "integrity": "sha512-XNlkKi9BwsvyUgTFWZbwywknagc26UmdeqaDHP1l+M3ztKw7V9FCZxyXgM9M+i0jNReREzK3EzjjG+nNzFb0+Q==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.44.0.tgz", + "integrity": "sha512-i4IUNJZgKiULv2y3q7lKuPLwDxpHjhwpnmmHHDlgj9V4LNAf/Iiq5biuQsCYU47oAGg2dR0XJxHXwqFfgRCOlA==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -6677,16 +7194,18 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-0.9.0.tgz", - "integrity": "sha512-AMhMnEOxe1vR8ekK6GKEDUo2GbdI4Z+uIQA2MMkLJiTESEOVh4Y6Jxsj617pSomZisatZIsMl53rqdTh8+Ry3A==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-0.11.0.tgz", + "integrity": "sha512-UxDkVvm24FJdi4nkn5+n9XirYxdJ1QDZgnHotdrgGRel8NOvlEOlhmT/xpuAPQrVwo+yynxEKeb1Y2AT6jX9og==", "dev": true, "dependencies": { - "@wordpress/api-fetch": "^6.38.0", - "@wordpress/keycodes": "^3.41.0", - "@wordpress/url": "^3.42.0", + "@wordpress/api-fetch": "^6.40.0", + "@wordpress/keycodes": "^3.43.0", + "@wordpress/url": "^3.44.0", "change-case": "^4.1.2", "form-data": "^4.0.0", + "get-port": "^5.1.1", + "lighthouse": "^10.4.0", "mime": "^3.0.0" }, "engines": { @@ -6735,14 +7254,14 @@ } }, "node_modules/@wordpress/element": { - "version": "5.20.0", - "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-5.20.0.tgz", - "integrity": "sha512-EO2cXUTrACQJ0JG+nuQnnaKu/qJbnBPmTgy6HCfU90um1G3kdG/iHh+T1YCi/WqxW+6UrL7I8FbxPfcEJvvONA==", + "version": "5.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-5.21.0.tgz", + "integrity": "sha512-iHuVj5gVGLqGtegfMtQp7pUqBksMDhF4Zt3sN4uMWEOewjAhdO18jOQjVrP5aKh7SrdBAzQeGpnsrNUvA7Aj1g==", "dependencies": { "@babel/runtime": "^7.16.0", "@types/react": "^18.0.21", "@types/react-dom": "^18.0.6", - "@wordpress/escape-html": "^2.43.0", + "@wordpress/escape-html": "^2.44.0", "change-case": "^4.1.2", "is-plain-object": "^5.0.0", "react": "^18.2.0", @@ -6753,9 +7272,9 @@ } }, "node_modules/@wordpress/env": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-8.7.0.tgz", - "integrity": "sha512-cqjDjFFLZ8691mzsuPaakoNbUJ5d6DNNRMyN6UZefLGKhthlqmyK5DqzXZUzCr9cgF/kdc//v3ZmBy9nywBYSA==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-8.9.0.tgz", + "integrity": "sha512-f3W1OMcUubZVC4OH9MTG2XE2OWwZH3Y2pKgrXSXP7rUiiCCIknotbUKtq7vF9uoUOB+f5kF2zGRRCJBu7n8PYg==", "dev": true, "dependencies": { "chalk": "^4.0.0", @@ -6776,9 +7295,9 @@ } }, "node_modules/@wordpress/escape-html": { - "version": "2.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.43.0.tgz", - "integrity": "sha512-+hLbsx4PXGnziUSS/7W9B47xgh2VUg11rSbe3Q3bTMCFWaYqk0cvAk5C74Re99Hiekct99HmpnmyVq+we8bkUQ==", + "version": "2.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.44.0.tgz", + "integrity": "sha512-FZkljTE+cnc0zS+NWy1c/LH+IEa2NA7DZAJYs0zy/RBGS/qe26AYFRzbyqxxHg1SiKwQUcw+VppLo4bFs5432g==", "dependencies": { "@babel/runtime": "^7.16.0" }, @@ -6787,23 +7306,24 @@ } }, "node_modules/@wordpress/eslint-plugin": { - "version": "14.11.0", - "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-14.11.0.tgz", - "integrity": "sha512-N4lWFR1s6gY+f+x2gzhdyNkDub4wrNy5trmxluyR2a1McloFiMNbhfAzoTLSBbUvQWWdSfYQeFThA5Q2C2m5wA==", + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-17.0.0.tgz", + "integrity": "sha512-pxb0UQN92oK0N20E1XtuAyZAmXcE6Pj/pR96ZXWYVTIJkLFsJBxdiqTmhfcaieVI5JbmWggxJXV8Lwp1vzlRNw==", "dev": true, "dependencies": { "@babel/eslint-parser": "^7.16.0", - "@typescript-eslint/eslint-plugin": "^5.3.0", - "@typescript-eslint/parser": "^5.3.0", - "@wordpress/babel-preset-default": "^7.22.0", - "@wordpress/prettier-config": "^2.21.0", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/parser": "^6.4.1", + "@wordpress/babel-preset-default": "^7.27.0", + "@wordpress/prettier-config": "^3.0.0", "cosmiconfig": "^7.0.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-jest": "^27.2.1", - "eslint-plugin-jsdoc": "^39.6.9", + "eslint-plugin-jest": "^27.2.3", + "eslint-plugin-jsdoc": "^46.4.6", "eslint-plugin-jsx-a11y": "^6.5.1", - "eslint-plugin-prettier": "^3.3.0", + "eslint-plugin-playwright": "^0.15.3", + "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.27.0", "eslint-plugin-react-hooks": "^4.3.0", "globals": "^13.12.0", @@ -6816,7 +7336,7 @@ "peerDependencies": { "@babel/core": ">=7", "eslint": ">=8", - "prettier": ">=2", + "prettier": ">=3", "typescript": ">=4" }, "peerDependenciesMeta": { @@ -6828,96 +7348,10 @@ } } }, - "node_modules/@wordpress/eslint-plugin/node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", - "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/type-utils": "5.62.0", - "@typescript-eslint/utils": "5.62.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wordpress/eslint-plugin/node_modules/@typescript-eslint/parser": { - "version": "5.62.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", - "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.62.0", - "@typescript-eslint/types": "5.62.0", - "@typescript-eslint/typescript-estree": "5.62.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@wordpress/eslint-plugin/node_modules/eslint-plugin-jest": { - "version": "27.2.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz", - "integrity": "sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/utils": "^5.10.0" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - }, - "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", - "eslint": "^7.0.0 || ^8.0.0", - "jest": "*" - }, - "peerDependenciesMeta": { - "@typescript-eslint/eslint-plugin": { - "optional": true - }, - "jest": { - "optional": true - } - } - }, "node_modules/@wordpress/eslint-plugin/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6942,9 +7376,9 @@ } }, "node_modules/@wordpress/hooks": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.43.0.tgz", - "integrity": "sha512-SHSiyFUEsggihl0pDvY1l72q+fHMDyFHtIR3GCt0uV2ifctvoa/PIYdVwrxpGQaGdNEV25XCZ4kNldqJmfTddw==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.44.0.tgz", + "integrity": "sha512-rWYI98Nu2S8D0bfHeoc8Lj43vZr59lFn3tGuDMnr0dZ1vDZXOiNSIPMn7qncmCuErFxWBbyXkax6mnam7Ds6jw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -6954,9 +7388,9 @@ } }, "node_modules/@wordpress/html-entities": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.43.0.tgz", - "integrity": "sha512-e7OJU2DRa2Z6TxLq5y2/jKVjlqdVJDwwR0yNp4ajyrtGIMNJw+7PXvdgSoroD5M6UjWRuLT57crcgVT4M53nRA==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.44.0.tgz", + "integrity": "sha512-qE1Bv9b2k6KNnDHzd9Yr6Bw2kfb20dz/tXuPUWYqzdfo1QyjJxK6X1x1y3LdA3g5FQSw/vQYK/xTEI6AMkuzPg==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -6966,13 +7400,13 @@ } }, "node_modules/@wordpress/i18n": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.43.0.tgz", - "integrity": "sha512-XHU/vGgI+pgjJU9WzWDHke1u948z8i3OPpKUNdxc/gMcTkKaKM4D8DW1+VMSQHyU6pneP8+ph7EF+1RIehP3lQ==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.44.0.tgz", + "integrity": "sha512-90SY4//QgqoKLf3HK0vNk+D/PGwK+0KOMuIwnkwKDKBw+Vr/Vusg6qiEngVc/BETfuG9ssDtAiNEBSMm8+YGYA==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^3.43.0", + "@wordpress/hooks": "^3.44.0", "gettext-parser": "^1.3.1", "memize": "^2.1.0", "sprintf-js": "^1.1.1", @@ -6986,22 +7420,22 @@ } }, "node_modules/@wordpress/icons": { - "version": "9.34.0", - "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.34.0.tgz", - "integrity": "sha512-yJWfvgnWnPBd/Co7VjdbCj3o2HJdP4npblJCj7LR+KcnCTPYZWMc4GU3OuzmxMByALuAndfIxgm1YDSHt/F4Wg==", + "version": "9.35.0", + "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-9.35.0.tgz", + "integrity": "sha512-Lm7B/2YlBUHjIQIGMbptdpB3is4+EYktITrNmZi4rZ7mveSVon32NzMsVb23nLx0iKyghLfJ4C4t+K2+wLFGJA==", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^5.20.0", - "@wordpress/primitives": "^3.41.0" + "@wordpress/element": "^5.21.0", + "@wordpress/primitives": "^3.42.0" }, "engines": { "node": ">=12" } }, "node_modules/@wordpress/is-shallow-equal": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.43.0.tgz", - "integrity": "sha512-KhEvz2V9gjq+C8v/YEYMRetOg2YI/Ik8cc8dWlOMHp7GbZAPHACplR4ZeEF8Ef2LZ8JnNL6IqW8zZzUhSOxlqg==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.44.0.tgz", + "integrity": "sha512-EpICMN8epLKI3X1whB9F1UEHBtKqkSKiOK9J15rtw4si+iveYYINN3tkIrHOx6uv4TW94F7AskGdCIsZs9v8Uw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -7011,13 +7445,13 @@ } }, "node_modules/@wordpress/jest-console": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-7.9.0.tgz", - "integrity": "sha512-gxh9jUgS79080GOBp8vzoZB7bGIKQOGFCsa4jtwPmXnDJ5gjC9b1mLynjke4nVTivxhSuUeUEJ6ZHUQ6nmVQIw==", + "version": "7.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-7.14.0.tgz", + "integrity": "sha512-o7EZZ+StfLg/qgTRn47O0WY2V1I+xNJCiN13a/fHZtXdRgPJ9qajf7tkDYz+MKPf8MhdMfHhgIr9sQrWhLCzDA==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "jest-matcher-utils": "^29.5.0" + "jest-matcher-utils": "^29.6.2" }, "engines": { "node": ">=14" @@ -7027,13 +7461,13 @@ } }, "node_modules/@wordpress/jest-preset-default": { - "version": "11.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-11.9.0.tgz", - "integrity": "sha512-MkOGqShiJBKaegG+OSHaegSh3SUCWFEAwFfRLk3For4SJswFCUW2F04oZAB0Kd+QohPPpM69vGKs6GL22cj/ng==", + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-11.14.0.tgz", + "integrity": "sha512-eGenm5xUpPcsgWMSFXYWg+RQlcAZa6zo7sT9bBK8HVIGqORTr3TTtWeHVGFL48UooL5PibUc+GxQdlW97YOwlQ==", "dev": true, "dependencies": { - "@wordpress/jest-console": "^7.9.0", - "babel-jest": "^29.5.0" + "@wordpress/jest-console": "^7.14.0", + "babel-jest": "^29.6.2" }, "engines": { "node": ">=14" @@ -7066,15 +7500,15 @@ } }, "node_modules/@wordpress/keyboard-shortcuts": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-4.18.0.tgz", - "integrity": "sha512-3q3Kmzzu6PTsx3abce4t/FHFuyN1jn7oukViNA17lIIFTfIL8Eu6ZfKy+UyPgAoCCXohEjCmaaB801qnsLsooQ==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-4.21.0.tgz", + "integrity": "sha512-7Sstgq7h4uWwhhp9m7qhwD0gKNEs6/UkmNYwps5aVyKmQcBh3KTGs9PEm9Dywf2MK8eRO8VLw0wx515UuxSWRg==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/data": "^9.11.0", - "@wordpress/element": "^5.18.0", - "@wordpress/keycodes": "^3.41.0", + "@wordpress/data": "^9.14.0", + "@wordpress/element": "^5.21.0", + "@wordpress/keycodes": "^3.44.0", "rememo": "^4.0.2" }, "engines": { @@ -7085,13 +7519,13 @@ } }, "node_modules/@wordpress/keycodes": { - "version": "3.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.43.0.tgz", - "integrity": "sha512-B6rYPiKFdQTlnJfm93R+usQnjEODUX/K4+hMvY5ZZOinvxe7KyU/xyFGz7gRrS8WmIEYcJowqSmAlGgVs4XwKQ==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.44.0.tgz", + "integrity": "sha512-nY/LF9BWdhGEGRZQB09c/2ZRTkXgM00NWmJHaZEX7gESzbFdQJ2HsOy/yGavViYEAJMGPHQvTtGi1qcUWT5Ymw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^4.43.0", + "@wordpress/i18n": "^4.44.0", "change-case": "^4.1.2" }, "engines": { @@ -7099,14 +7533,14 @@ } }, "node_modules/@wordpress/notices": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-4.9.0.tgz", - "integrity": "sha512-X7LfAJy6jYBq6d7lbW32lrt1DxkdNOg/VpOyiv8klwn30AKSPws/vBSrTPNDpp9phleuIuRr3tDcpS9/p+jRIw==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-4.12.0.tgz", + "integrity": "sha512-f5AvWgCfet55xiTWQt0UrcWqUpuu5qJXCzzfytTdC1U66H8XrRQLhHdpuP7zd+tjkgj6wZIbXyBKwUIuWTCVsA==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.41.0", - "@wordpress/data": "^9.11.0" + "@wordpress/a11y": "^3.44.0", + "@wordpress/data": "^9.14.0" }, "engines": { "node": ">=12" @@ -7116,24 +7550,24 @@ } }, "node_modules/@wordpress/npm-package-json-lint-config": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.23.0.tgz", - "integrity": "sha512-uWTwQOtEjZincms6ZFGG6E3mZUh/uA1pa3hLECtxkVIBRiK3lnYKhFvl3sxJfCmVAUFWDAM+M7Tff0oyCFhuVg==", + "version": "4.28.0", + "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.28.0.tgz", + "integrity": "sha512-lxrs1F4scwDuF8AJLK+SHtLWuhRVjzvl8EW/++ZQWRt7op99m41QQUqUwwCQC09cDcYlGddXeAczRijx5eLREg==", "dev": true, "engines": { "node": ">=14" }, "peerDependencies": { - "npm-package-json-lint": ">=3.6.0" + "npm-package-json-lint": ">=6.0.0" } }, "node_modules/@wordpress/postcss-plugins-preset": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-4.22.0.tgz", - "integrity": "sha512-xkDbfmLr7M8KLoOMl51pGA5xgc8hy8JsEN1u0y0G3jEkTGvUVDjjJT7EvjkM16Oh9NzfYmcBpJ5HLmZ7+ckhIA==", + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-4.27.0.tgz", + "integrity": "sha512-4hk8UWfJvv21u/Et0NypfR1r22LVWGXMit3QM0MD7d6XQ4dNNbzqW2c9TfM36SdcR9KY5PZ8d5V1IrkheNUb/w==", "dev": true, "dependencies": { - "@wordpress/base-styles": "^4.29.0", + "@wordpress/base-styles": "^4.34.0", "autoprefixer": "^10.2.5" }, "engines": { @@ -7144,18 +7578,18 @@ } }, "node_modules/@wordpress/preferences": { - "version": "3.18.0", - "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-3.18.0.tgz", - "integrity": "sha512-S7eDEKvUIIJMWpiO+0j/iLDqspyhNdKR2N39HNkkrAA2mdr4LMvs5bOr/+m6xTpiik+8I29hwI/OuJOomqJ7PQ==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-3.21.0.tgz", + "integrity": "sha512-V8BP/lf4Iyv6F7Hn8vVrVGwyZuQsZ//OpPhGu6hKp/PcQ4UJcHcHWe8hWSPiuAycBsYu8O9SDRDK2YPTiTDy/Q==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.41.0", - "@wordpress/components": "^25.7.0", - "@wordpress/data": "^9.11.0", - "@wordpress/element": "^5.18.0", - "@wordpress/i18n": "^4.41.0", - "@wordpress/icons": "^9.32.0", + "@wordpress/a11y": "^3.44.0", + "@wordpress/components": "^25.10.0", + "@wordpress/data": "^9.14.0", + "@wordpress/element": "^5.21.0", + "@wordpress/i18n": "^4.44.0", + "@wordpress/icons": "^9.35.0", "classnames": "^2.3.1" }, "engines": { @@ -7167,24 +7601,24 @@ } }, "node_modules/@wordpress/prettier-config": { - "version": "2.21.0", - "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.21.0.tgz", - "integrity": "sha512-Oasi7PiZSp5LtTmMkISgn6UIb0pSv9uQsW5jlnrzhBZvF/J15jQ9V6xPcir0j2GllINVUNS2LCtsxwkJriV5lg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-3.0.0.tgz", + "integrity": "sha512-A2pOt3W2DwBvTPqAC8G6riOAIJvMUPuYV2lg2+zFHWcaWUdtEpi+iwoiI0yugspi+x83w9h6sXGqkC2q+Hfxlg==", "dev": true, "engines": { "node": ">=14" }, "peerDependencies": { - "prettier": ">=2" + "prettier": ">=3" } }, "node_modules/@wordpress/primitives": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.41.0.tgz", - "integrity": "sha512-md+4T5VWkWOLSa0p7rBPnKppa30EgYYAdfvqDXLzZTcaO1ZNJAJM3VtLkQPN2qsvLjy3ToT1ZmGF0jsoCP2bAg==", + "version": "3.42.0", + "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.42.0.tgz", + "integrity": "sha512-xK2nCDmJMNwzOV52YVTc4Atd48LFKfixMbO4NFdh990qSjBjMyJNykSXcnidOtmcrpXnqWNRIZomWJkqPvaPkQ==", "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/element": "^5.20.0", + "@wordpress/element": "^5.21.0", "classnames": "^2.3.1" }, "engines": { @@ -7192,9 +7626,9 @@ } }, "node_modules/@wordpress/priority-queue": { - "version": "2.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.43.0.tgz", - "integrity": "sha512-jDsiF+3rMm6jme61AUHxHEIF1gfkCptO/MUdzh7uzyd5ZFnYG8kz+0zU2VX2bXlbqWHYmTsYr446rxTl7nkqRQ==", + "version": "2.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.44.0.tgz", + "integrity": "sha512-hRxkKS1KeRWJO6iVfIMELzRzjGSB4hvdGLpfxqqqpM5BVW9Pvg3gHX0VUbCPjk39W1YX1ZYARWIqZa53mf48xQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", @@ -7205,9 +7639,9 @@ } }, "node_modules/@wordpress/private-apis": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-0.23.0.tgz", - "integrity": "sha512-Z/mAnPF+IcN13S0k7F55lA5J0ducNB+IYDGtujErx4fjnYsBIoF9VeQ5pRc+SPDCx5yYDtR7yL8unLbVbztVBQ==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-0.26.0.tgz", + "integrity": "sha512-/1+J1rtq5CwJw+uCqdSBl24+aDX33L0deUkeaRo2DQ2BB9Pont2wM0imXKekWyRK1wSWaD72LhuQXVeRjNM4HA==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -7217,9 +7651,9 @@ } }, "node_modules/@wordpress/redux-routine": { - "version": "4.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.43.0.tgz", - "integrity": "sha512-Tc7Q2QgHm+KrWKWCATX+FlaZGaTK/xTFY1m51iWoAJFzvlIoiFOfoVH2FHDppxnxCrvNrRdu2FTagoxx9UzpLw==", + "version": "4.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.44.0.tgz", + "integrity": "sha512-9pqYXZCYAO4GNQ53QkMRbt1hX1CHVcCMoSUNiv+uWpWTR095ggfmWzMduur56tyMaNFmuutHpGsKi1EyVFRIMQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", @@ -7235,20 +7669,20 @@ } }, "node_modules/@wordpress/rich-text": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-6.20.0.tgz", - "integrity": "sha512-MRjSVm6OE4xkgQRIXx+PJUZk9FKJbFVfpSRQDyhjppMDTIxaxPYyiGIkTa3yxTmk1OZu8yfF5eE6oxzxoN1vjg==", + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-6.21.0.tgz", + "integrity": "sha512-Z+bJ2w742vlzhUVfZHXkyCfK5vCtFtb0Hmen8tPIf4Af+4HfeAXWHp76flr43yyoWNLI25jagpksn1hiUztG4g==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/a11y": "^3.43.0", - "@wordpress/compose": "^6.20.0", - "@wordpress/data": "^9.13.0", - "@wordpress/deprecated": "^3.43.0", - "@wordpress/element": "^5.20.0", - "@wordpress/escape-html": "^2.43.0", - "@wordpress/i18n": "^4.43.0", - "@wordpress/keycodes": "^3.43.0", + "@wordpress/a11y": "^3.44.0", + "@wordpress/compose": "^6.21.0", + "@wordpress/data": "^9.14.0", + "@wordpress/deprecated": "^3.44.0", + "@wordpress/element": "^5.21.0", + "@wordpress/escape-html": "^2.44.0", + "@wordpress/i18n": "^4.44.0", + "@wordpress/keycodes": "^3.44.0", "memize": "^2.1.0", "rememo": "^4.0.2" }, @@ -7260,55 +7694,57 @@ } }, "node_modules/@wordpress/scripts": { - "version": "26.9.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-26.9.0.tgz", - "integrity": "sha512-slSP0imDAtLsat7GU93t0SFfsSCPfCi9lVX740IJJ56g7l6wBn+X1M7vp++eZSasGdUXEaxsS/uQW3pFSthPgg==", + "version": "26.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-26.14.0.tgz", + "integrity": "sha512-tD0f8I/LYfpUchJ/T2Ea1335j7wOq48bSy13ei8qDmgpYMVMtU7SvHTP6vv2n7ST85tB+kZ909lPpP131jjEEg==", "dev": true, "dependencies": { "@babel/core": "^7.16.0", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.2", - "@svgr/webpack": "^6.2.1", - "@wordpress/babel-preset-default": "^7.22.0", - "@wordpress/browserslist-config": "^5.21.0", - "@wordpress/dependency-extraction-webpack-plugin": "^4.21.0", - "@wordpress/eslint-plugin": "^14.11.0", - "@wordpress/jest-preset-default": "^11.9.0", - "@wordpress/npm-package-json-lint-config": "^4.23.0", - "@wordpress/postcss-plugins-preset": "^4.22.0", - "@wordpress/prettier-config": "^2.21.0", - "@wordpress/stylelint-config": "^21.21.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@svgr/webpack": "^8.0.1", + "@wordpress/babel-preset-default": "^7.27.0", + "@wordpress/browserslist-config": "^5.26.0", + "@wordpress/dependency-extraction-webpack-plugin": "^4.26.0", + "@wordpress/e2e-test-utils-playwright": "^0.11.0", + "@wordpress/eslint-plugin": "^17.0.0", + "@wordpress/jest-preset-default": "^11.14.0", + "@wordpress/npm-package-json-lint-config": "^4.28.0", + "@wordpress/postcss-plugins-preset": "^4.27.0", + "@wordpress/prettier-config": "^3.0.0", + "@wordpress/stylelint-config": "^21.26.0", "adm-zip": "^0.5.9", - "babel-jest": "^29.5.0", + "babel-jest": "^29.6.2", "babel-loader": "^8.2.3", - "browserslist": "^4.21.9", + "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", "cross-spawn": "^5.1.0", "css-loader": "^6.2.0", - "cssnano": "^5.0.7", + "cssnano": "^6.0.1", "cwd": "^0.10.0", "dir-glob": "^3.0.1", "eslint": "^8.3.0", "expect-puppeteer": "^4.4.0", "fast-glob": "^3.2.7", "filenamify": "^4.2.0", - "jest": "^29.5.0", + "jest": "^29.6.2", "jest-dev-server": "^6.0.2", - "jest-environment-jsdom": "^29.5.0", - "jest-environment-node": "^29.5.0", + "jest-environment-jsdom": "^29.6.2", + "jest-environment-node": "^29.6.2", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", "mini-css-extract-plugin": "^2.5.1", "minimist": "^1.2.0", - "npm-package-json-lint": "^5.0.0", + "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", + "playwright-core": "1.32.0", "postcss": "^8.4.5", "postcss-loader": "^6.2.1", - "prettier": "npm:wp-prettier@2.8.5", + "prettier": "npm:wp-prettier@3.0.3", "puppeteer-core": "^13.2.0", - "react-refresh": "^0.10.0", + "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", "sass": "^1.35.2", @@ -7317,10 +7753,10 @@ "stylelint": "^14.2.0", "terser-webpack-plugin": "^5.3.9", "url-loader": "^4.1.1", - "webpack": "^5.47.1", - "webpack-bundle-analyzer": "^4.4.2", - "webpack-cli": "^4.9.1", - "webpack-dev-server": "^4.4.0" + "webpack": "^5.88.2", + "webpack-bundle-analyzer": "^4.9.1", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" }, "bin": { "wp-scripts": "bin/wp-scripts.js" @@ -7330,6 +7766,7 @@ "npm": ">=6.14.4" }, "peerDependencies": { + "@playwright/test": "^1.32.0", "react": "^18.0.0", "react-dom": "^18.0.0" } @@ -7471,9 +7908,9 @@ } }, "node_modules/@wordpress/shortcode": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-3.41.0.tgz", - "integrity": "sha512-pJuFIQbGwn8tMpPf5vtKZqQmXVm2+UnQZXVyyQGXUCBnvyGmGnbKv7lbx0NGUDBZ1AVo8/PAdssd7P/QUn7Cxg==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-3.44.0.tgz", + "integrity": "sha512-TrA0ru8lUTPyX+YhncdKyxPo9H5gNGsQUQ1bgX9yFDDH+dbuoSaEB7xSR2ViruVbMl2AeWF5xNeNpYwsIJtwSQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", @@ -7484,9 +7921,9 @@ } }, "node_modules/@wordpress/style-engine": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-1.24.0.tgz", - "integrity": "sha512-1qXkNwbuLeliQZ0yjdjjy2kJzWtvm56k0xUtFsF/0thMQ04EV0JJHwWDI6EOUCIVVFnJO6xdj2UK/KtnxGYfVw==", + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-1.27.0.tgz", + "integrity": "sha512-44wH81MqGoHH8oOZ4VBQQP4198EhuqVf8MDDgp2LO3rEmYjQWxdvBUc0rEF7mMILhXB9sBvaiVmUyGhWnyYcKA==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", @@ -7497,9 +7934,9 @@ } }, "node_modules/@wordpress/stylelint-config": { - "version": "21.21.0", - "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-21.21.0.tgz", - "integrity": "sha512-5AP38zP/yUUwbfi0Gx9rcrOGzgxH172Ea9McXrE1iWKj3t9pU+zzB3NeI1PLdGeOLJzGMTsVof22NyNwsMCADw==", + "version": "21.26.0", + "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-21.26.0.tgz", + "integrity": "sha512-xTnvoNk9aCdRl1ntBxnmhdmghwzRNurp5Y9LjUCwrYutxnj8t/CCKhPyjgIgHxz+RwKgnpGKupKLVvuHxu1CzQ==", "dev": true, "dependencies": { "stylelint-config-recommended": "^6.0.0", @@ -7513,9 +7950,9 @@ } }, "node_modules/@wordpress/token-list": { - "version": "2.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-2.41.0.tgz", - "integrity": "sha512-GeGPzyoVshaifYiz11KqBwkUDqAbMVVkHn5ccpqLVbn+Yc7Ur3tRJ5ikgqNikSq0EyvnHdy8XdivdLJq2xcduA==", + "version": "2.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-2.44.0.tgz", + "integrity": "sha512-fwbfZ5KLUYPBJCHKVWkN6fJWphOTXkZH3zsN3FCHIVlpA09sujF2GMibVnOBjNuhi/7Wb7UA/OG9dG/YI1rYcQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -7525,22 +7962,22 @@ } }, "node_modules/@wordpress/undo-manager": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-0.3.0.tgz", - "integrity": "sha512-buZRSisLRgQKJrhr7c1FSydrWgHEH/0AxlEJ9gqIjsUHsG6D39Cx6RcZYX5eW5NBL3nTDVeVD4STNyHGNA+ZdQ==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-0.4.0.tgz", + "integrity": "sha512-uolgz0oN+zV4p/aVrZk9Ba9h1zjBRwQlJ2JlI3dihaiFs9i7KfUK8wSN2AJ9f12sLLyYsJ4cjYTI/nutlkvL0w==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", - "@wordpress/is-shallow-equal": "^4.43.0" + "@wordpress/is-shallow-equal": "^4.44.0" }, "engines": { "node": ">=12" } }, "node_modules/@wordpress/url": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.42.0.tgz", - "integrity": "sha512-Q1eZAkgnq/Ji3UDdBPxj2mBiBusGoTkcUH2XnJDGyPIezJjC7fY/9GXE6Jj0bm37CkEH3bP6G4Yrh+YpDwMn6Q==", + "version": "3.45.0", + "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.45.0.tgz", + "integrity": "sha512-SYVFNuhotfxpDloGXcut4XvXYHtqhTDJT7UZ/LvXBwVFFxtXyey+Ej8h7FuDqnakbkWauUp0cmD0iDHMhtb9sw==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0", @@ -7551,18 +7988,18 @@ } }, "node_modules/@wordpress/warning": { - "version": "2.43.0", - "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.43.0.tgz", - "integrity": "sha512-LPTc3Vf3Vy9DpL1foC49PCeGKnid9JdahPoaZhFX/WMG1VLelLBEwSLln/x7cq6c+8e8xbbex02t5IhbtLiEIw==", + "version": "2.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.44.0.tgz", + "integrity": "sha512-ZtLmd0NbPoXAMgB356ERTULx6LhHfkhyWai4/u9I3pZdt8cbhRHBXV7lBB580+wN7otyD1IHiC3dzYlg/9ByyA==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/@wordpress/wordcount": { - "version": "3.41.0", - "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-3.41.0.tgz", - "integrity": "sha512-1GjIVx+JIeYl7mmRZf9AA5e/YhmGm043dt1/3Zto1k7/MLIpI5ValPPXlHWBA2GU1lfHdfMkSzSC5CLzBQM2ow==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-3.44.0.tgz", + "integrity": "sha512-hQRh0hjwA+GCBlLX2J6cx7Q9jogfQS2jsQUzxXFyr4Kv0WxVLYxZ6XMNnFyh4VOVVBLkycEf6ALykwJEfbsGng==", "dev": true, "dependencies": { "@babel/runtime": "^7.16.0" @@ -7764,6 +8201,15 @@ "ajv": "^6.9.1" } }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", @@ -7887,6 +8333,15 @@ "node": ">= 6" } }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz", + "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==", + "dev": true, + "engines": { + "node": ">=14" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -7991,15 +8446,15 @@ "dev": true }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -8057,16 +8512,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -8076,14 +8531,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -8094,14 +8549,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -8112,16 +8567,37 @@ } }, "node_modules/array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz", + "integrity": "sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arrify": { @@ -8142,6 +8618,18 @@ "node": ">=0.10.0" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -8163,6 +8651,15 @@ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", "dev": true }, + "node_modules/asynciterator.prototype": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz", + "integrity": "sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.3" + } + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -8182,9 +8679,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.14", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", - "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", "dev": true, "funding": [ { @@ -8194,12 +8691,16 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "browserslist": "^4.21.5", - "caniuse-lite": "^1.0.30001464", - "fraction.js": "^4.2.0", + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" @@ -8259,16 +8760,22 @@ "dequal": "^2.0.3" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, "node_modules/babel-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.5.0.tgz", - "integrity": "sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", + "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "dependencies": { - "@jest/transform": "^29.5.0", + "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", - "babel-preset-jest": "^29.5.0", + "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" @@ -8334,9 +8841,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.5.0.tgz", - "integrity": "sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", + "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "dependencies": { "@babel/template": "^7.3.3", @@ -8364,51 +8871,51 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.4.tgz", + "integrity": "sha512-9l//BZZsPR+5XjyJMPtZSK4jv0BsTO1zDac2GC6ygx9WLGlcsnRd1Co0B2zT5fF5Ic6BZy+9m3HNZ3QcOeDKfg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.32.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-preset-current-node-syntax": { @@ -8435,12 +8942,12 @@ } }, "node_modules/babel-preset-jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.5.0.tgz", - "integrity": "sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", + "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "dependencies": { - "babel-plugin-jest-hoist": "^29.5.0", + "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { @@ -8516,6 +9023,15 @@ } ] }, + "node_modules/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -8528,6 +9044,15 @@ "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", "dev": true }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -8703,6 +9228,18 @@ "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==", "dev": true }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8805,6 +9342,42 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bytes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", @@ -8970,9 +9543,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001518", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001518.tgz", - "integrity": "sha512-rup09/e3I0BKjncL+FesTayKtPrdwKhUufQFd3riFw1hHg8JmIFoInYfB102cFcY/pPgGmdyl/iy+jgiDi2vdA==", + "version": "1.0.30001540", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001540.tgz", + "integrity": "sha512-9JL38jscuTJBTcuETxm8QLsFr/F6v0CYYTEU6r5+qSM98P2Q0Hmu0eG1dTG5GBUmywU3UlcVOUSIJYY47rdFSw==", "dev": true, "funding": [ { @@ -9189,6 +9762,24 @@ "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "node_modules/chrome-launcher": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", + "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "dev": true, + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^1.0.0" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -9227,9 +9818,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/class-utils": { @@ -9483,9 +10074,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/collection-visit": { @@ -9568,9 +10159,9 @@ } }, "node_modules/comment-parser": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.3.1.tgz", - "integrity": "sha512-B52sN2VNghyq5ofvUsqZjmk6YkihBX5vMSChmSK9v4ShjKf3Vk5Xcmgpw4o+iIgtrnM/u5FiMpz9VKb8lpBveA==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz", + "integrity": "sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw==", "dev": true, "engines": { "node": ">= 12.0.0" @@ -9736,6 +10327,56 @@ "proto-list": "~1.2.1" } }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dev": true, + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, "node_modules/connect-history-api-fallback": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", @@ -9827,9 +10468,9 @@ } }, "node_modules/conventional-changelog-simple-preset": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/conventional-changelog-simple-preset/-/conventional-changelog-simple-preset-1.0.23.tgz", - "integrity": "sha512-jgz1QUv0dzzcGEYcVWCtRQKwC3etIShvWO5bujzAwHMAo2+428eA5Z3BrvT/ZM4m/uIK8jwh8gs2PTGFKa5f9g==", + "version": "1.0.24", + "resolved": "https://registry.npmjs.org/conventional-changelog-simple-preset/-/conventional-changelog-simple-preset-1.0.24.tgz", + "integrity": "sha512-bocRAENpHnUP73xFvu9Syap/aB3Owwu2YN4ebItpSTudTsbEhoTUad/ZLfnuHaEbtlKOeI6JK7LqdARYD+Mohg==", "dev": true, "dependencies": { "compare-func": "^1.3.1", @@ -9977,15 +10618,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/conventional-changelog-writer/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/conventional-commits-filter": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.7.tgz", @@ -10101,15 +10733,6 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, - "node_modules/conventional-commits-parser/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/convert-source-map": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", @@ -10268,9 +10891,9 @@ } }, "node_modules/core-js": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.0.tgz", - "integrity": "sha512-rd4rYZNlF3WuoYuRIDEmbR/ga9CeuWX9U05umAvgrrZoHY4Z++cp/xwPQMvUpBB4Ag6J8KfD80G0zwCyaSxDww==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.33.0.tgz", + "integrity": "sha512-HoZr92+ZjFEKar5HS6MC776gYslNOKHt75mEBKWKnPeFDpZ6nH5OeF3S6HFT1mUAUZKrzkez05VboaX8myjSuw==", "dev": true, "hasInstallScript": true, "funding": { @@ -10279,12 +10902,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.0.tgz", - "integrity": "sha512-7a9a3D1k4UCVKnLhrgALyFcP7YCsLOQIxPd0dKjf/6GuPcgyiGP70ewWdCGrSK7evyhymi0qO4EqCmSJofDeYw==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { - "browserslist": "^4.21.9" + "browserslist": "^4.21.10" }, "funding": { "type": "opencollective", @@ -10292,9 +10915,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.33.0.tgz", + "integrity": "sha512-FKSIDtJnds/YFIEaZ4HszRX7hkxGpNKM7FC9aJ9WLJbSd3lD4vOltFuVIBLR8asSx9frkTSqL0dw90SKQxgKrg==", "dev": true, "hasInstallScript": true, "funding": { @@ -10673,6 +11296,27 @@ "node": ">= 6" } }, + "node_modules/create-jest": { + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", + "dev": true, + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "prompts": "^2.0.1" + }, + "bin": { + "create-jest": "bin/create-jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/cross-fetch": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.6.tgz", @@ -10719,10 +11363,16 @@ "node": ">=8" } }, + "node_modules/csp_evaluator": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", + "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==", + "dev": true + }, "node_modules/css-declaration-sorter": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", - "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz", + "integrity": "sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g==", "dev": true, "engines": { "node": "^10 || ^12 || >=14" @@ -10767,15 +11417,15 @@ } }, "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -10783,25 +11433,16 @@ } }, "node_modules/css-tree": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", - "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", "dev": true, "dependencies": { - "mdn-data": "2.0.14", - "source-map": "^0.6.1" + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" }, "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/css-tree/node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/css-what": { @@ -10835,17 +11476,16 @@ } }, "node_modules/cssnano": { - "version": "5.1.15", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", - "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz", + "integrity": "sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==", "dev": true, "dependencies": { - "cssnano-preset-default": "^5.2.14", - "lilconfig": "^2.0.3", - "yaml": "^1.10.2" + "cssnano-preset-default": "^6.0.1", + "lilconfig": "^2.1.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "funding": { "type": "opencollective", @@ -10856,72 +11496,93 @@ } }, "node_modules/cssnano-preset-default": { - "version": "5.2.14", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", - "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz", + "integrity": "sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ==", "dev": true, "dependencies": { "css-declaration-sorter": "^6.3.1", - "cssnano-utils": "^3.1.0", - "postcss-calc": "^8.2.3", - "postcss-colormin": "^5.3.1", - "postcss-convert-values": "^5.1.3", - "postcss-discard-comments": "^5.1.2", - "postcss-discard-duplicates": "^5.1.0", - "postcss-discard-empty": "^5.1.1", - "postcss-discard-overridden": "^5.1.0", - "postcss-merge-longhand": "^5.1.7", - "postcss-merge-rules": "^5.1.4", - "postcss-minify-font-values": "^5.1.0", - "postcss-minify-gradients": "^5.1.1", - "postcss-minify-params": "^5.1.4", - "postcss-minify-selectors": "^5.2.1", - "postcss-normalize-charset": "^5.1.0", - "postcss-normalize-display-values": "^5.1.0", - "postcss-normalize-positions": "^5.1.1", - "postcss-normalize-repeat-style": "^5.1.1", - "postcss-normalize-string": "^5.1.0", - "postcss-normalize-timing-functions": "^5.1.0", - "postcss-normalize-unicode": "^5.1.1", - "postcss-normalize-url": "^5.1.0", - "postcss-normalize-whitespace": "^5.1.1", - "postcss-ordered-values": "^5.1.3", - "postcss-reduce-initial": "^5.1.2", - "postcss-reduce-transforms": "^5.1.0", - "postcss-svgo": "^5.1.0", - "postcss-unique-selectors": "^5.1.1" - }, - "engines": { - "node": "^10 || ^12 || >=14.0" + "cssnano-utils": "^4.0.0", + "postcss-calc": "^9.0.0", + "postcss-colormin": "^6.0.0", + "postcss-convert-values": "^6.0.0", + "postcss-discard-comments": "^6.0.0", + "postcss-discard-duplicates": "^6.0.0", + "postcss-discard-empty": "^6.0.0", + "postcss-discard-overridden": "^6.0.0", + "postcss-merge-longhand": "^6.0.0", + "postcss-merge-rules": "^6.0.1", + "postcss-minify-font-values": "^6.0.0", + "postcss-minify-gradients": "^6.0.0", + "postcss-minify-params": "^6.0.0", + "postcss-minify-selectors": "^6.0.0", + "postcss-normalize-charset": "^6.0.0", + "postcss-normalize-display-values": "^6.0.0", + "postcss-normalize-positions": "^6.0.0", + "postcss-normalize-repeat-style": "^6.0.0", + "postcss-normalize-string": "^6.0.0", + "postcss-normalize-timing-functions": "^6.0.0", + "postcss-normalize-unicode": "^6.0.0", + "postcss-normalize-url": "^6.0.0", + "postcss-normalize-whitespace": "^6.0.0", + "postcss-ordered-values": "^6.0.0", + "postcss-reduce-initial": "^6.0.0", + "postcss-reduce-transforms": "^6.0.0", + "postcss-svgo": "^6.0.0", + "postcss-unique-selectors": "^6.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/cssnano-utils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", - "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz", + "integrity": "sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/csso": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", - "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", "dev": true, "dependencies": { - "css-tree": "^1.1.2" + "css-tree": "~2.2.0" }, "engines": { - "node": ">=8.0.0" + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" } }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true + }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", @@ -10984,6 +11645,15 @@ "node": ">=6" } }, + "node_modules/data-uri-to-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", @@ -11117,10 +11787,18 @@ } }, "node_modules/dedent": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", - "dev": true + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz", + "integrity": "sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==", + "dev": true, + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } }, "node_modules/deep-equal": { "version": "2.2.1", @@ -11151,27 +11829,221 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/default-browser/node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/default-browser/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser/node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-browser/node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=4.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "node_modules/default-browser/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 8" } }, "node_modules/default-gateway": { @@ -11207,6 +12079,20 @@ "node": ">=10" } }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", @@ -11217,11 +12103,12 @@ } }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -11245,6 +12132,20 @@ "node": ">=0.10.0" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -11408,9 +12309,9 @@ } }, "node_modules/diff-sequences": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", - "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -11435,9 +12336,9 @@ "dev": true }, "node_modules/dns-packet": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", - "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", + "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" @@ -11480,28 +12381,19 @@ "dev": true }, "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" } }, - "node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", @@ -11527,12 +12419,12 @@ } }, "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -11542,14 +12434,14 @@ } }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" @@ -11674,9 +12566,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -11686,6 +12578,19 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -11713,9 +12618,9 @@ } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz", + "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -11758,18 +12663,19 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -11784,19 +12690,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -11825,6 +12735,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-iterator-helpers": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz", + "integrity": "sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g==", + "dev": true, + "dependencies": { + "asynciterator.prototype": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.1", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "iterator.prototype": "^1.1.2", + "safe-array-concat": "^1.0.1" + } + }, "node_modules/es-module-lexer": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", @@ -11899,15 +12831,14 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -11920,45 +12851,6 @@ "source-map": "~0.6.1" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -11969,18 +12861,6 @@ "node": ">=0.10.0" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { "version": "8.41.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", @@ -12038,9 +12918,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.9.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.9.0.tgz", - "integrity": "sha512-+sbni7NfVXnOpnRadUA8S28AUlsZt9GjgFvABIRL9Hkn8KqNzOp+7Lw4QWtrwn20KzU3wqu1QoOj2m+7rKRqkA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -12060,14 +12940,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -12079,6 +12959,23 @@ "ms": "^2.1.1" } }, + "node_modules/eslint-import-resolver-node/node_modules/resolve": { + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/eslint-module-utils": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", @@ -12106,9 +13003,9 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", - "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "dependencies": { "array-includes": "^3.1.6", @@ -12120,13 +13017,12 @@ "eslint-import-resolver-node": "^0.3.7", "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.12.1", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.6", "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.3", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -12158,48 +13054,158 @@ "node": ">=0.10.0" } }, - "node_modules/eslint-plugin-import/node_modules/resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.4.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.4.2.tgz", + "integrity": "sha512-3Nfvv3wbq2+PZlRTf2oaAWXWwbdBejFRBR2O8tAO67o+P8zno+QGbcDYaAXODlreXVg+9gvWhKKmG2rgfb8GEg==", "dev": true, "dependencies": { - "is-core-module": "^2.12.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@typescript-eslint/utils": "^5.10.0" }, - "bin": { - "resolve": "bin/resolve" + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0", + "eslint": "^7.0.0 || ^8.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, - "bin": { - "semver": "bin/semver.js" + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/eslint-plugin-jsdoc": { - "version": "39.9.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-39.9.1.tgz", - "integrity": "sha512-Rq2QY6BZP2meNIs48aZ3GlIlJgBqFCmR55+UBvaDkA3ZNQ0SvQXOs2QKkubakEijV8UbIVbVZKsOVN8G3MuqZw==", + "version": "46.8.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.2.tgz", + "integrity": "sha512-5TSnD018f3tUJNne4s4gDWQflbsgOycIKEUBoCLn6XtBMgNHxQFmV8vVxUtiPxAQq8lrX85OaSG/2gnctxw9uQ==", "dev": true, "dependencies": { - "@es-joy/jsdoccomment": "~0.36.1", - "comment-parser": "1.3.1", + "@es-joy/jsdoccomment": "~0.40.1", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.0", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "esquery": "^1.4.0", - "semver": "^7.3.8", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.5.4", "spdx-expression-parse": "^3.0.1" }, "engines": { - "node": "^14 || ^16 || ^17 || ^18 || ^19" + "node": ">=16" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" @@ -12244,37 +13250,61 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-playwright": { + "version": "0.15.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.3.tgz", + "integrity": "sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g==", + "dev": true, + "peerDependencies": { + "eslint": ">=7", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, "node_modules/eslint-plugin-prettier": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz", - "integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.0.tgz", + "integrity": "sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==", "dev": true, "dependencies": { - "prettier-linter-helpers": "^1.0.0" + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.8.5" }, "engines": { - "node": ">=6.0.0" + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/prettier" }, "peerDependencies": { - "eslint": ">=5.0.0", - "prettier": ">=1.13.0" + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "prettier": ">=3.0.0" }, "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, "eslint-config-prettier": { "optional": true } } }, "node_modules/eslint-plugin-react": { - "version": "7.33.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.1.tgz", - "integrity": "sha512-L093k0WAMvr6VhNwReB8VgOq5s2LesZmrpPdKz/kZElQDzqS7G7+DnKoqT+w4JwuiGeAhAvHO0fvy0Eyk4ejDA==", + "version": "7.33.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz", + "integrity": "sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==", "dev": true, "dependencies": { "array-includes": "^3.1.6", "array.prototype.flatmap": "^1.3.1", "array.prototype.tosorted": "^1.1.1", "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.0.12", "estraverse": "^5.3.0", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", @@ -12790,16 +13820,16 @@ } }, "node_modules/expect": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-29.5.0.tgz", - "integrity": "sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "dependencies": { - "@jest/expect-utils": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0" + "@jest/expect-utils": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -13049,10 +14079,16 @@ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true + }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -13616,16 +14652,16 @@ } }, "node_modules/fraction.js": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", - "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", "dev": true, "engines": { "node": "*" }, "funding": { "type": "patreon", - "url": "https://www.patreon.com/infusion" + "url": "https://github.com/sponsors/rawify" } }, "node_modules/fragment-cache": { @@ -13750,9 +14786,9 @@ } }, "node_modules/fs-monkey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", + "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", "dev": true }, "node_modules/fs.realpath": { @@ -13781,15 +14817,15 @@ "dev": true }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -13870,6 +14906,18 @@ "node": ">=8.0.0" } }, + "node_modules/get-port": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz", + "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-stdin": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz", @@ -13910,6 +14958,53 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -14897,10 +15992,20 @@ } }, "node_modules/html-entities": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] }, "node_modules/html-escaper": { "version": "2.0.2", @@ -14948,6 +16053,15 @@ "node": ">= 0.8" } }, + "node_modules/http-link-header": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.1.tgz", + "integrity": "sha512-mW3N/rTYpCn99s1do0zx6nzFZSwLH9HGfUM4ZqLWJ16ylmYaC2v5eYGqrNTQlByx8AzUgGI+V/32gXPugs1+Sw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", @@ -15106,6 +16220,12 @@ "node": ">=10" } }, + "node_modules/image-ssim": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", + "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", + "dev": true + }, "node_modules/immutable": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.0.tgz", @@ -15261,6 +16381,22 @@ "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", "dev": true }, + "node_modules/intl-messageformat": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", + "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "dev": true, + "dependencies": { + "intl-messageformat-parser": "^1.8.1" + } + }, + "node_modules/intl-messageformat-parser": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", + "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", + "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", + "dev": true + }, "node_modules/into-stream": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-6.0.0.tgz", @@ -15285,10 +16421,16 @@ "loose-envify": "^1.0.0" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "node_modules/ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", "dev": true, "engines": { "node": ">= 10" @@ -15397,6 +16539,21 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-bigint": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", @@ -15443,6 +16600,21 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", + "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", + "dev": true, + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -15456,9 +16628,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -15569,6 +16741,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-finalizationregistry": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz", + "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -15587,6 +16771,21 @@ "node": ">=6" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -15609,6 +16808,39 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-inside-container/node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -15850,16 +17082,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -15868,6 +17096,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, "node_modules/is-unc-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", @@ -16019,17 +17253,32 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-lib-source-maps": { @@ -16056,9 +17305,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -16068,6 +17317,19 @@ "node": ">=8" } }, + "node_modules/iterator.prototype": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.2.tgz", + "integrity": "sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==", + "dev": true, + "dependencies": { + "define-properties": "^1.2.1", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "reflect.getprototypeof": "^1.0.4", + "set-function-name": "^2.0.1" + } + }, "node_modules/java-properties": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/java-properties/-/java-properties-1.0.2.tgz", @@ -16078,15 +17340,15 @@ } }, "node_modules/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", "import-local": "^3.0.2", - "jest-cli": "^29.5.0" + "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" @@ -16104,12 +17366,13 @@ } }, "node_modules/jest-changed-files": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.5.0.tgz", - "integrity": "sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "dependencies": { "execa": "^5.0.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { @@ -16117,28 +17380,28 @@ } }, "node_modules/jest-circus": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.5.0.tgz", - "integrity": "sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/expect": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/expect": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", - "dedent": "^0.7.0", + "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", - "jest-each": "^29.5.0", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-each": "^29.7.0", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "p-limit": "^3.1.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" @@ -16160,12 +17423,12 @@ } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16180,22 +17443,21 @@ "dev": true }, "node_modules/jest-cli": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.5.0.tgz", - "integrity": "sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "dependencies": { - "@jest/core": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/core": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", + "create-jest": "^29.7.0", "exit": "^0.1.2", - "graceful-fs": "^4.2.9", "import-local": "^3.0.2", - "jest-config": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", - "prompts": "^2.0.1", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { @@ -16214,31 +17476,31 @@ } }, "node_modules/jest-config": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.5.0.tgz", - "integrity": "sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", - "@jest/test-sequencer": "^29.5.0", - "@jest/types": "^29.5.0", - "babel-jest": "^29.5.0", + "@jest/test-sequencer": "^29.7.0", + "@jest/types": "^29.6.3", + "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-circus": "^29.5.0", - "jest-environment-node": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-runner": "^29.5.0", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-circus": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-runner": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -16271,12 +17533,12 @@ } }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16306,15 +17568,15 @@ } }, "node_modules/jest-diff": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.5.0.tgz", - "integrity": "sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.3", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16333,12 +17595,12 @@ } }, "node_modules/jest-diff/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16353,9 +17615,9 @@ "dev": true }, "node_modules/jest-docblock": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.4.3.tgz", - "integrity": "sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "dependencies": { "detect-newline": "^3.0.0" @@ -16365,16 +17627,16 @@ } }, "node_modules/jest-each": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.5.0.tgz", - "integrity": "sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", - "jest-util": "^29.5.0", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "jest-util": "^29.7.0", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16393,12 +17655,12 @@ } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16413,18 +17675,18 @@ "dev": true }, "node_modules/jest-environment-jsdom": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.5.0.tgz", - "integrity": "sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { @@ -16440,46 +17702,46 @@ } }, "node_modules/jest-environment-node": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.5.0.tgz", - "integrity": "sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", + "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-mock": "^29.5.0", - "jest-util": "^29.5.0" + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.5.0.tgz", - "integrity": "sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", + "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", - "jest-regex-util": "^29.4.3", - "jest-util": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-regex-util": "^29.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, @@ -16491,13 +17753,13 @@ } }, "node_modules/jest-leak-detector": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.5.0.tgz", - "integrity": "sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "dependencies": { - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16516,12 +17778,12 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16536,15 +17798,15 @@ "dev": true }, "node_modules/jest-matcher-utils": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.5.0.tgz", - "integrity": "sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "pretty-format": "^29.5.0" + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16563,12 +17825,12 @@ } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16583,18 +17845,18 @@ "dev": true }, "node_modules/jest-message-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.5.0.tgz", - "integrity": "sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", + "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^29.5.0", + "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -16615,12 +17877,12 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16635,14 +17897,14 @@ "dev": true }, "node_modules/jest-mock": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.5.0.tgz", - "integrity": "sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", + "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", - "jest-util": "^29.5.0" + "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16666,26 +17928,26 @@ } }, "node_modules/jest-regex-util": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.4.3.tgz", - "integrity": "sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", + "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.5.0.tgz", - "integrity": "sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", + "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", - "jest-util": "^29.5.0", - "jest-validate": "^29.5.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" @@ -16695,43 +17957,43 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.5.0.tgz", - "integrity": "sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "dependencies": { - "jest-regex-util": "^29.4.3", - "jest-snapshot": "^29.5.0" + "jest-regex-util": "^29.6.3", + "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.5.0.tgz", - "integrity": "sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "dependencies": { - "@jest/console": "^29.5.0", - "@jest/environment": "^29.5.0", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/console": "^29.7.0", + "@jest/environment": "^29.7.0", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", - "jest-docblock": "^29.4.3", - "jest-environment-node": "^29.5.0", - "jest-haste-map": "^29.5.0", - "jest-leak-detector": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-resolve": "^29.5.0", - "jest-runtime": "^29.5.0", - "jest-util": "^29.5.0", - "jest-watcher": "^29.5.0", - "jest-worker": "^29.5.0", + "jest-docblock": "^29.7.0", + "jest-environment-node": "^29.7.0", + "jest-haste-map": "^29.7.0", + "jest-leak-detector": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-resolve": "^29.7.0", + "jest-runtime": "^29.7.0", + "jest-util": "^29.7.0", + "jest-watcher": "^29.7.0", + "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -16740,31 +18002,31 @@ } }, "node_modules/jest-runtime": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.5.0.tgz", - "integrity": "sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==", - "dev": true, - "dependencies": { - "@jest/environment": "^29.5.0", - "@jest/fake-timers": "^29.5.0", - "@jest/globals": "^29.5.0", - "@jest/source-map": "^29.4.3", - "@jest/test-result": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", + "dev": true, + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/globals": "^29.7.0", + "@jest/source-map": "^29.6.3", + "@jest/test-result": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", - "jest-haste-map": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-mock": "^29.5.0", - "jest-regex-util": "^29.4.3", - "jest-resolve": "^29.5.0", - "jest-snapshot": "^29.5.0", - "jest-util": "^29.5.0", + "jest-haste-map": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-mock": "^29.7.0", + "jest-regex-util": "^29.6.3", + "jest-resolve": "^29.7.0", + "jest-snapshot": "^29.7.0", + "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -16773,34 +18035,31 @@ } }, "node_modules/jest-snapshot": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.5.0.tgz", - "integrity": "sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", - "@babel/traverse": "^7.7.2", "@babel/types": "^7.3.3", - "@jest/expect-utils": "^29.5.0", - "@jest/transform": "^29.5.0", - "@jest/types": "^29.5.0", - "@types/babel__traverse": "^7.0.6", - "@types/prettier": "^2.1.5", + "@jest/expect-utils": "^29.7.0", + "@jest/transform": "^29.7.0", + "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", - "expect": "^29.5.0", + "expect": "^29.7.0", "graceful-fs": "^4.2.9", - "jest-diff": "^29.5.0", - "jest-get-type": "^29.4.3", - "jest-matcher-utils": "^29.5.0", - "jest-message-util": "^29.5.0", - "jest-util": "^29.5.0", + "jest-diff": "^29.7.0", + "jest-get-type": "^29.6.3", + "jest-matcher-utils": "^29.7.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", "natural-compare": "^1.4.0", - "pretty-format": "^29.5.0", - "semver": "^7.3.5" + "pretty-format": "^29.7.0", + "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16819,12 +18078,12 @@ } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16839,12 +18098,12 @@ "dev": true }, "node_modules/jest-util": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.5.0.tgz", - "integrity": "sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", + "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", @@ -16856,17 +18115,17 @@ } }, "node_modules/jest-validate": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.5.0.tgz", - "integrity": "sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", + "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "dependencies": { - "@jest/types": "^29.5.0", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.5.0" + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -16885,12 +18144,12 @@ } }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.5.0.tgz", - "integrity": "sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.3", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -16905,18 +18164,18 @@ "dev": true }, "node_modules/jest-watcher": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.5.0.tgz", - "integrity": "sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "dependencies": { - "@jest/test-result": "^29.5.0", - "@jest/types": "^29.5.0", + "@jest/test-result": "^29.7.0", + "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { @@ -16924,13 +18183,13 @@ } }, "node_modules/jest-worker": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.5.0.tgz", - "integrity": "sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", + "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "dependencies": { "@types/node": "*", - "jest-util": "^29.5.0", + "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, @@ -16966,6 +18225,21 @@ "@sideway/pinpoint": "^2.0.0" } }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", + "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", + "dev": true + }, + "node_modules/js-library-detector": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", + "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -16985,9 +18259,9 @@ } }, "node_modules/jsdoc-type-pratt-parser": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-3.1.0.tgz", - "integrity": "sha512-MgtD0ZiCDk9B+eI73BextfRrVQl0oyzRG8B2BjORts6jbunj4ScKPcyXGTbB6eXL4y9TzxCm6hyeLq/2ASzNdw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz", + "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==", "dev": true, "engines": { "node": ">=12.0.0" @@ -17232,13 +18506,13 @@ } }, "node_modules/launch-editor": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", - "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", + "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", "dev": true, "dependencies": { "picocolors": "^1.0.0", - "shell-quote": "^1.7.3" + "shell-quote": "^1.8.1" } }, "node_modules/lazy-cache": { @@ -17284,93 +18558,389 @@ "node": ">= 0.8.0" } }, - "node_modules/liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "node_modules/liftup": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", + "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", + "dev": true, + "dependencies": { + "extend": "^3.0.2", + "findup-sync": "^4.0.0", + "fined": "^1.2.0", + "flagged-respawn": "^1.0.1", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.1", + "rechoir": "^0.7.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/liftup/node_modules/findup-sync": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", + "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "dev": true, + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^4.0.2", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/liftup/node_modules/global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "dependencies": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup/node_modules/global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/liftup/node_modules/resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "dev": true, + "dependencies": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lighthouse": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", + "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "dev": true, + "dependencies": { + "@sentry/node": "^6.17.4", + "axe-core": "4.7.2", + "chrome-launcher": "^0.15.2", + "configstore": "^5.0.1", + "csp_evaluator": "1.1.1", + "devtools-protocol": "0.0.1155343", + "enquirer": "^2.3.6", + "http-link-header": "^1.1.1", + "intl-messageformat": "^4.4.0", + "jpeg-js": "^0.4.4", + "js-library-detector": "^6.6.0", + "lighthouse-logger": "^1.4.1", + "lighthouse-stack-packs": "1.11.0", + "lodash": "^4.17.21", + "lookup-closest-locale": "6.2.0", + "metaviewport-parser": "0.3.0", + "open": "^8.4.0", + "parse-cache-control": "1.0.1", + "ps-list": "^8.0.0", + "puppeteer-core": "^20.8.0", + "robots-parser": "^3.0.0", + "semver": "^5.3.0", + "speedline-core": "^1.4.3", + "third-party-web": "^0.23.3", + "ws": "^7.0.0", + "yargs": "^17.3.1", + "yargs-parser": "^21.0.0" + }, + "bin": { + "chrome-debug": "core/scripts/manual-chrome-launcher.js", + "lighthouse": "cli/index.js", + "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" + }, + "engines": { + "node": ">=16.16" + } + }, + "node_modules/lighthouse-logger": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", + "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "dev": true, + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/lighthouse-stack-packs": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", + "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", + "dev": true + }, + "node_modules/lighthouse/node_modules/@puppeteer/browsers": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", + "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "dev": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/chromium-bidi": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", + "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "dev": true, + "dependencies": { + "mitt": "3.0.0" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/lighthouse/node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/lighthouse/node_modules/devtools-protocol": { + "version": "0.0.1155343", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", + "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", + "dev": true + }, + "node_modules/lighthouse/node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/lighthouse/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core": { + "version": "20.9.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", + "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "1.4.6", + "chromium-bidi": "0.4.16", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + }, + "peerDependencies": { + "typescript": ">= 4.7.4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", + "dev": true + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/lighthouse/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10" + "bin": { + "semver": "bin/semver" } }, - "node_modules/liftup/node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", + "node_modules/lighthouse/node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "dev": true, "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" } }, - "node_modules/liftup/node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "node_modules/lighthouse/node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", "dev": true, "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, - "node_modules/liftup/node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", + "node_modules/lighthouse/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "dev": true, - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, "engines": { - "node": ">=0.10.0" + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, - "node_modules/liftup/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "node_modules/lighthouse/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dev": true, "dependencies": { - "isobject": "^3.0.1" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/liftup/node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", + "node_modules/lighthouse/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, "node_modules/lilconfig": { @@ -17529,6 +19099,12 @@ "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", "dev": true }, + "node_modules/lodash.escape": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz", + "integrity": "sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw==", + "dev": true + }, "node_modules/lodash.escaperegexp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", @@ -17541,6 +19117,12 @@ "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", "dev": true }, + "node_modules/lodash.invokemap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz", + "integrity": "sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w==", + "dev": true + }, "node_modules/lodash.ismatch": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", @@ -17571,6 +19153,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.pullall": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz", + "integrity": "sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg==", + "dev": true + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -17621,6 +19209,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/lookup-closest-locale": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", + "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", + "dev": true + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -17649,6 +19243,12 @@ "node": ">=8" } }, + "node_modules/lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", + "dev": true + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -17956,6 +19556,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/marky": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", + "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", + "dev": true + }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", @@ -18099,9 +19705,9 @@ } }, "node_modules/mdn-data": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", "dev": true }, "node_modules/mdurl": { @@ -18120,12 +19726,12 @@ } }, "node_modules/memfs": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.1.tgz", - "integrity": "sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", "dev": true, "dependencies": { - "fs-monkey": "^1.0.3" + "fs-monkey": "^1.0.4" }, "engines": { "node": ">= 4.0.0" @@ -18147,34 +19753,74 @@ } }, "node_modules/meow": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/meow/-/meow-6.1.1.tgz", - "integrity": "sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", "decamelize-keys": "^1.1.0", "hard-rejection": "^2.1.0", - "minimist-options": "^4.0.2", - "normalize-package-data": "^2.5.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", "read-pkg-up": "^7.0.1", "redent": "^3.0.0", "trim-newlines": "^3.0.0", - "type-fest": "^0.13.1", - "yargs-parser": "^18.1.3" + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/meow/node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/meow/node_modules/type-fest": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", - "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, "engines": { "node": ">=10" @@ -18183,6 +19829,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/meow/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/merge-deep": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", @@ -18218,6 +19870,12 @@ "node": ">= 8" } }, + "node_modules/metaviewport-parser": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz", + "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", + "dev": true + }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -18544,8 +20202,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -18749,12 +20406,6 @@ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -18782,6 +20433,15 @@ "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -18807,9 +20467,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -19097,53 +20757,117 @@ "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-json-lint": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-6.4.0.tgz", + "integrity": "sha512-cuXAJJB1Rdqz0UO6w524matlBqDBjcNt7Ru+RDIu4y6RI1gVqiWBnylrK8sPRk81gGBA0X8hJbDXolVOoTc+sA==", + "dev": true, + "dependencies": { + "ajv": "^6.12.6", + "ajv-errors": "^1.0.1", + "chalk": "^4.1.2", + "cosmiconfig": "^8.0.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "ignore": "^5.2.0", + "is-plain-obj": "^3.0.0", + "jsonc-parser": "^3.2.0", + "log-symbols": "^4.1.0", + "meow": "^9.0.0", + "plur": "^4.0.0", + "semver": "^7.3.8", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1", + "type-fest": "^3.2.0", + "validate-npm-package-name": "^5.0.0" + }, + "bin": { + "npmPkgJsonLint": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0", + "npm": ">=6.0.0" + } + }, + "node_modules/npm-package-json-lint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/npm-package-json-lint/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, - "node_modules/npm-bundled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", - "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "node_modules/npm-package-json-lint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, "dependencies": { - "npm-normalize-package-bin": "^1.0.1" + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "node_modules/npm-package-json-lint/node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "dev": true }, - "node_modules/npm-package-json-lint": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.4.2.tgz", - "integrity": "sha512-DH1MSvYvm+cuQFXcPehIIu/WiYzMYs7BOxlhOOFHaH2SNrA+P2uDtTEe5LOG90Ci7PTwgF/dCmSKM2HWTgWXNA==", + "node_modules/npm-package-json-lint/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, - "dependencies": { - "ajv": "^6.12.6", - "ajv-errors": "^1.0.1", - "chalk": "^4.1.2", - "cosmiconfig": "^7.0.1", - "debug": "^4.3.2", - "globby": "^11.0.4", - "ignore": "^5.1.9", - "is-plain-obj": "^3.0.0", - "jsonc-parser": "^3.0.0", - "log-symbols": "^4.1.0", - "meow": "^6.1.1", - "plur": "^4.0.0", - "semver": "^7.3.5", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "bin": { - "npmPkgJsonLint": "src/cli.js" - }, "engines": { - "node": ">=10.0.0", - "npm": ">=6.0.0" + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-packlist": { @@ -21722,9 +23446,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/object-assign": { @@ -21914,28 +23638,28 @@ } }, "node_modules/object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz", + "integrity": "sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -21945,25 +23669,25 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "node_modules/object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz", + "integrity": "sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==", "dev": true, "dependencies": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -22007,14 +23731,14 @@ } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -22423,6 +24147,77 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -22444,6 +24239,12 @@ "node": ">=6" } }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", + "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==", + "dev": true + }, "node_modules/parse-entities": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", @@ -22852,15 +24653,15 @@ } }, "node_modules/playwright-core": { - "version": "1.36.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz", - "integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==", + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.0.tgz", + "integrity": "sha512-Z9Ij17X5Z3bjpp6XKujGBp9Gv4eViESac9aDmwgQFUEJBW0K80T21m/Z+XJQlu4cNsvPygw33b6V1Va6Bda5zQ==", "dev": true, "bin": { - "playwright-core": "cli.js" + "playwright": "cli.js" }, "engines": { - "node": ">=16" + "node": ">=14" } }, "node_modules/plur": { @@ -22888,9 +24689,9 @@ } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.30", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.30.tgz", + "integrity": "sha512-7ZEao1g4kd68l97aWG/etQKPKq07us0ieSZ2TnFDk11i0ZfDW2AwKHYU8qv4MZKqN2fdBfg+7q0ES06UA73C1g==", "dev": true, "funding": [ { @@ -22916,22 +24717,25 @@ } }, "node_modules/postcss-calc": { - "version": "8.2.4", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", - "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", + "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.9", + "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0" }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, "peerDependencies": { "postcss": "^8.2.2" } }, "node_modules/postcss-colormin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", - "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz", + "integrity": "sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", @@ -22940,71 +24744,71 @@ "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-convert-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", - "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz", + "integrity": "sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-comments": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", - "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz", + "integrity": "sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-duplicates": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", - "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz", + "integrity": "sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-empty": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", - "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz", + "integrity": "sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-discard-overridden": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", - "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz", + "integrity": "sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -23039,98 +24843,98 @@ "dev": true }, "node_modules/postcss-merge-longhand": { - "version": "5.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", - "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz", + "integrity": "sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^5.1.1" + "stylehacks": "^6.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-merge-rules": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", - "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz", + "integrity": "sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-font-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", - "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz", + "integrity": "sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-gradients": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", - "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz", + "integrity": "sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA==", "dev": true, "dependencies": { "colord": "^2.9.1", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-params": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", - "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz", + "integrity": "sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ==", "dev": true, "dependencies": { "browserslist": "^4.21.4", - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-minify-selectors": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", - "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz", + "integrity": "sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -23196,181 +25000,180 @@ } }, "node_modules/postcss-normalize-charset": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", - "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz", + "integrity": "sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ==", "dev": true, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-display-values": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", - "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz", + "integrity": "sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-positions": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", - "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz", + "integrity": "sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-repeat-style": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", - "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz", + "integrity": "sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-string": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", - "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz", + "integrity": "sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-timing-functions": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", - "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz", + "integrity": "sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-unicode": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", - "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz", + "integrity": "sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", - "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz", + "integrity": "sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw==", "dev": true, "dependencies": { - "normalize-url": "^6.0.1", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-normalize-whitespace": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", - "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz", + "integrity": "sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-ordered-values": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", - "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz", + "integrity": "sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg==", "dev": true, "dependencies": { - "cssnano-utils": "^3.1.0", + "cssnano-utils": "^4.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-initial": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", - "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz", + "integrity": "sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "caniuse-api": "^3.0.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-reduce-transforms": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", - "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz", + "integrity": "sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -23399,9 +25202,9 @@ } }, "node_modules/postcss-scss": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.6.tgz", - "integrity": "sha512-rLDPhJY4z/i4nVFZ27j9GqLxj1pwxE80eAzUNRMXtcpipFYIeowerzBgG3yJhMtObGEXidtIgbUpQ3eLDsf5OQ==", + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", "dev": true, "funding": [ { @@ -23411,13 +25214,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "engines": { "node": ">=12.0" }, "peerDependencies": { - "postcss": "^8.4.19" + "postcss": "^8.4.29" } }, "node_modules/postcss-selector-parser": { @@ -23434,31 +25241,31 @@ } }, "node_modules/postcss-svgo": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", - "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz", + "integrity": "sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "svgo": "^2.7.0" + "svgo": "^3.0.2" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >= 18" }, "peerDependencies": { "postcss": "^8.2.15" } }, "node_modules/postcss-unique-selectors": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", - "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz", + "integrity": "sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.5" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -23481,15 +25288,15 @@ }, "node_modules/prettier": { "name": "wp-prettier", - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.8.5.tgz", - "integrity": "sha512-gkphzYtVksWV6D7/V530bTehKkhrABUru/Gy4reOLOHJoKH4i9lcE1SxqU2VDxC3gCOx/Nk9alZmWk6xL/IBCw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz", + "integrity": "sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA==", "dev": true, "bin": { - "prettier": "bin-prettier.js" + "prettier": "bin/prettier.cjs" }, "engines": { - "node": ">=10.13.0" + "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" @@ -23604,6 +25411,72 @@ "node": ">= 0.10" } }, + "node_modules/proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/proxy-compare": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.3.0.tgz", @@ -23616,6 +25489,18 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, + "node_modules/ps-list": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", + "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -23829,9 +25714,9 @@ } }, "node_modules/pure-rand": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.2.tgz", - "integrity": "sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz", + "integrity": "sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w==", "dev": true, "funding": [ { @@ -23895,6 +25780,12 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, "node_modules/quick-lru": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", @@ -24055,9 +25946,9 @@ "dev": true }, "node_modules/react-refresh": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz", - "integrity": "sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -24465,6 +26356,26 @@ "@babel/runtime": "^7.9.2" } }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz", + "integrity": "sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "globalthis": "^1.0.3", + "which-builtin-type": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -24472,9 +26383,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -24489,9 +26400,9 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -24511,14 +26422,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -24648,14 +26559,14 @@ } }, "node_modules/replace-in-file": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-6.3.5.tgz", - "integrity": "sha512-arB9d3ENdKva2fxRnSjwBEXfK1npgyci7ZZuwysgAp7ORjHSyxz6oqIjTEv8R0Ydl4Ll7uOAZXL4vbkhGIizCg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/replace-in-file/-/replace-in-file-7.0.2.tgz", + "integrity": "sha512-tPG+Qmqf+x2Rf1WVdb/9B5tFIf6KJ5hs3fgxh1OTzPRUugPPvyAva7NvCJtnSpmyq6r+ABYcuUOqZkm6yzGSUw==", "dev": true, "dependencies": { "chalk": "^4.1.2", - "glob": "^7.2.0", - "yargs": "^17.2.1" + "glob": "^8.1.0", + "yargs": "^17.7.2" }, "bin": { "replace-in-file": "bin/cli.js" @@ -24664,6 +26575,46 @@ "node": ">=10" } }, + "node_modules/replace-in-file/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/replace-in-file/node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/replace-in-file/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/requestidlecallback": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz", @@ -24871,6 +26822,30 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/robots-parser": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", + "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -24951,6 +26926,24 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -25262,15 +27255,6 @@ "node": ">=10" } }, - "node_modules/semantic-release/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/semver": { "version": "7.5.4", "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", @@ -25512,6 +27496,20 @@ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -25990,14 +27988,14 @@ } }, "node_modules/sirv": { - "version": "1.0.19", - "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz", - "integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz", + "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==", "dev": true, "dependencies": { "@polka/url": "^1.0.0-next.20", "mrmime": "^1.0.0", - "totalist": "^1.0.0" + "totalist": "^3.0.0" }, "engines": { "node": ">= 10" @@ -26050,6 +28048,16 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, "node_modules/snake-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", @@ -26225,6 +28233,52 @@ "node": ">=0.8.0" } }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "node_modules/sockjs/node_modules/uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", @@ -26406,6 +28460,20 @@ "node": ">= 6" } }, + "node_modules/speedline-core": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", + "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", + "dev": true, + "dependencies": { + "@types/node": "*", + "image-ssim": "^0.2.0", + "jpeg-js": "^0.4.1" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/split": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", @@ -26459,13 +28527,6 @@ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", "dev": true }, - "node_modules/stable": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -26596,6 +28657,16 @@ "readable-stream": "^2.0.2" } }, + "node_modules/streamx": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz", + "integrity": "sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -26651,18 +28722,19 @@ "dev": true }, "node_modules/string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz", + "integrity": "sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", + "internal-slot": "^1.0.5", + "regexp.prototype.flags": "^1.5.0", + "set-function-name": "^2.0.0", "side-channel": "^1.0.4" }, "funding": { @@ -26687,14 +28759,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -26704,28 +28776,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -26813,16 +28885,16 @@ "dev": true }, "node_modules/stylehacks": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", - "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz", + "integrity": "sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw==", "dev": true, "dependencies": { "browserslist": "^4.21.4", "postcss-selector-parser": "^6.0.4" }, "engines": { - "node": "^10 || ^12 || >=14.0" + "node": "^14 || ^16 || >=18.0" }, "peerDependencies": { "postcss": "^8.2.15" @@ -26912,147 +28984,55 @@ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz", "integrity": "sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg==", "dev": true, - "dependencies": { - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.0.11", - "postcss-value-parser": "^4.2.0" - }, - "peerDependencies": { - "stylelint": "^14.5.1 || ^15.0.0" - } - }, - "node_modules/stylelint/node_modules/balanced-match": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", - "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true - }, - "node_modules/stylelint/node_modules/global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "dependencies": { - "global-prefix": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stylelint/node_modules/global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "dependencies": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/stylelint/node_modules/hosted-git-info": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", - "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stylelint/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stylelint/node_modules/meow": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", - "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", - "dev": true, - "dependencies": { - "@types/minimist": "^1.2.0", - "camelcase-keys": "^6.2.2", - "decamelize": "^1.2.0", - "decamelize-keys": "^1.1.0", - "hard-rejection": "^2.1.0", - "minimist-options": "4.1.0", - "normalize-package-data": "^3.0.0", - "read-pkg-up": "^7.0.1", - "redent": "^3.0.0", - "trim-newlines": "^3.0.0", - "type-fest": "^0.18.0", - "yargs-parser": "^20.2.3" - }, - "engines": { - "node": ">=10" + "dependencies": { + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "stylelint": "^14.5.1 || ^15.0.0" } }, - "node_modules/stylelint/node_modules/normalize-package-data": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", - "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true + }, + "node_modules/stylelint/node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" + "global-prefix": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=6" } }, - "node_modules/stylelint/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "node_modules/stylelint/node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, - "node_modules/stylelint/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/stylelint/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "node_modules/stylelint/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, "node_modules/stylis": { @@ -27111,24 +29091,27 @@ "dev": true }, "node_modules/svgo": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", - "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz", + "integrity": "sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ==", "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", - "css-select": "^4.1.3", - "css-tree": "^1.1.3", - "csso": "^4.2.0", - "picocolors": "^1.0.0", - "stable": "^0.1.8" + "css-select": "^5.1.0", + "css-tree": "^2.2.1", + "csso": "^5.0.5", + "picocolors": "^1.0.0" }, "bin": { "svgo": "bin/svgo" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" } }, "node_modules/svgo/node_modules/commander": { @@ -27146,6 +29129,22 @@ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, + "node_modules/synckit": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz", + "integrity": "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==", + "dev": true, + "dependencies": { + "@pkgr/utils": "^2.3.1", + "tslib": "^2.5.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, "node_modules/table": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", @@ -27472,6 +29471,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/third-party-web": { + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", + "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -27536,6 +29541,18 @@ "ms": "^2.1.1" } }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -27612,18 +29629,18 @@ } }, "node_modules/totalist": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", - "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -27760,9 +29777,9 @@ } }, "node_modules/tslib": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.2.tgz", - "integrity": "sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -27837,6 +29854,57 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -27857,6 +29925,15 @@ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, "node_modules/typescript": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", @@ -28196,6 +30273,15 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", @@ -28426,9 +30512,9 @@ } }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/v8-to-istanbul": { @@ -28467,6 +30553,18 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/validate-npm-package-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", + "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "dev": true, + "dependencies": { + "builtins": "^5.0.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/valtio": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/valtio/-/valtio-1.7.0.tgz", @@ -28660,9 +30758,9 @@ } }, "node_modules/webpack": { - "version": "5.83.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.83.1.tgz", - "integrity": "sha512-TNsG9jDScbNuB+Lb/3+vYolPplCS3bbEaJf+Bj0Gw4DhP3ioAflBb1flcRt9zsWITyvOhM96wMQNRWlSX52DgA==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -28671,10 +30769,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -28684,7 +30782,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -28707,20 +30805,27 @@ } }, "node_modules/webpack-bundle-analyzer": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.8.0.tgz", - "integrity": "sha512-ZzoSBePshOKhr+hd8u6oCkZVwpVaXgpw23ScGLFpR6SjYI7+7iIWYarjN6OEYOfRt8o7ZyZZQk0DuMizJ+LEIg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz", + "integrity": "sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "0.5.7", "acorn": "^8.0.4", "acorn-walk": "^8.0.0", - "chalk": "^4.1.0", "commander": "^7.2.0", + "escape-string-regexp": "^4.0.0", "gzip-size": "^6.0.0", - "lodash": "^4.17.20", + "is-plain-object": "^5.0.0", + "lodash.debounce": "^4.0.8", + "lodash.escape": "^4.0.1", + "lodash.flatten": "^4.4.0", + "lodash.invokemap": "^4.6.0", + "lodash.pullall": "^4.2.0", + "lodash.uniqby": "^4.7.0", "opener": "^1.5.2", - "sirv": "^1.0.7", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", "ws": "^7.3.1" }, "bin": { @@ -28761,44 +30866,42 @@ } }, "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", "colorette": "^2.0.14", - "commander": "^7.0.0", + "commander": "^10.0.1", "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", "fastest-levenshtein": "^1.0.12", "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", "webpack-merge": "^5.7.3" }, "bin": { "webpack-cli": "bin/cli.js" }, "engines": { - "node": ">=10.13.0" + "node": ">=14.15.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "webpack": "4.x.x || 5.x.x" + "webpack": "5.x.x" }, "peerDependenciesMeta": { "@webpack-cli/generators": { "optional": true }, - "@webpack-cli/migrate": { - "optional": true - }, "webpack-bundle-analyzer": { "optional": true }, @@ -28808,12 +30911,12 @@ } }, "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", + "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true, "engines": { - "node": ">= 10" + "node": ">=14" } }, "node_modules/webpack-cli/node_modules/cross-spawn": { @@ -28831,12 +30934,24 @@ } }, "node_modules/webpack-cli/node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" + } + }, + "node_modules/webpack-cli/node_modules/rechoir": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "dev": true, + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" } }, "node_modules/webpack-cli/node_modules/shebang-command": { @@ -28933,9 +31048,9 @@ "dev": true }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -28952,9 +31067,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -28963,7 +31078,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -29045,9 +31160,9 @@ "dev": true }, "node_modules/webpack-dev-server/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", @@ -29132,6 +31247,24 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -29217,6 +31350,32 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-builtin-type": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz", + "integrity": "sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==", + "dev": true, + "dependencies": { + "function.prototype.name": "^1.1.5", + "has-tostringtag": "^1.0.0", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.0.2", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-collection": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", @@ -29239,17 +31398,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -29336,6 +31494,15 @@ } } }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", @@ -29403,25 +31570,12 @@ } }, "node_modules/yargs-parser": { - "version": "18.1.3", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", - "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/yargs-parser/node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, "engines": { - "node": ">=6" + "node": ">=10" } }, "node_modules/yargs/node_modules/yargs-parser": { diff --git a/package.json b/package.json index 5ae5f13be..b852b4e11 100644 --- a/package.json +++ b/package.json @@ -24,14 +24,23 @@ "test:unit:help": "wp-scripts test-unit-js --help", "test:unit:watch": "wp-scripts test-unit-js --watch", "test:unit:debug": "wp-scripts --inspect-brk test-unit-js --runInBand --no-cache", - "test:e2e": "wp-scripts test-e2e", - "test:e2e:help": "wp-scripts test-e2e --help", - "test:e2e:debug": "wp-scripts --inspect-brk test-e2e --puppeteer-devtools", - "test:e2e:interactive": "wp-scripts test-e2e -- --puppeteer-interactive", - "test:e2e:performance": "wp-scripts test-e2e performance.spec.js", "test:e2e:blockId": "wp-scripts test-e2e uniq-id-checking.spec.js", "test:e2e:playwright": "npx playwright test --config src/blocks/test/e2e/playwright.config.js", "test:e2e:playwright-ui": "npx playwright test --config src/blocks/test/e2e/playwright.config.js --ui", + "test:performance": "wp-scripts test-playwright --config src/blocks/test/performance/playwright.config.ts", + "test:performance:debug": "wp-scripts test-playwright --config src/blocks/test/performance/playwright.config.ts --debug", + "test:unit:php:setup": "wp-env start", + "test:unit:php:setup:debug": "wp-env start --xdebug", + "test:unit:php:base": "wp-env run --env-cwd='wp-content/plugins/otter-blocks' tests-wordpress vendor/bin/phpunit -c phpunit.xml --verbose", + "test:unit:php": "npm-run-all test:unit:php:setup test:unit:php:base", + "test:unit:php:debug": "npm-run-all test:unit:php:setup:debug test:unit:php:base", + "test:unit:php:multisite:base": "wp-env run --env-cwd='wp-content/plugins/otter-blocks' tests-wordpress vendor/bin/phpunit -c phpunit/multisite.xml --verbose", + "test:unit:php:multisite": "npm-run-all test:unit:php:setup test:unit:php:multisite:base", + "test:unit:php:multisite:debug": "npm-run-all test:unit:php:setup:debug test:unit:php:multisite:base", + "test:php": "npm-run-all lint:php test:unit:php", + "test:php:watch": "wp-env run --env-cwd='wp-content/plugins/otter-blocks' tests-cli composer run-script test:watch", + "lint:php": "wp-env run --env-cwd='wp-content/plugins/otter-blocks' cli composer run-script lint", + "format:php": "wp-env run --env-cwd='wp-content/plugins/otter-blocks' cli composer run-script format", "wp-env": "wp-env" }, "repository": { @@ -54,7 +63,7 @@ "lasttranslator": "Themeisle Translate Team " }, "dependencies": { - "@wordpress/icons": "^9.33.0", + "@wordpress/icons": "^9.35.0", "array-move": "^3.0.1", "classnames": "^2.3.1", "currency-symbol-map": "^5.0.1", @@ -67,7 +76,7 @@ }, "devDependencies": { "@automattic/babel-plugin-replace-textdomain": "^1.0.26", - "@playwright/test": "^1.36.1", + "@playwright/test": "^1.32.0", "@semantic-release/changelog": "^6.0.3", "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", @@ -75,21 +84,22 @@ "@testing-library/react": "^14.0.0", "@testing-library/user-event": "^14.4.3", "@types/jest": "^29.5.1", + "@types/object-hash": "^3.0.4", "@types/wordpress__block-editor": "^11.5.1", "@types/wordpress__components": "^23.0.1", "@typescript-eslint/parser": "^6.3.0", - "@wordpress/block-editor": "^12.9.0", + "@wordpress/block-editor": "^12.12.0", "@wordpress/components": "^25.9.0", "@wordpress/compose": "^6.15.0", - "@wordpress/data": "^9.12.0", + "@wordpress/data": "^9.14.0", "@wordpress/dom-ready": "^3.43.0", "@wordpress/e2e-test-utils": "^10.4.0", - "@wordpress/e2e-test-utils-playwright": "^0.9.0", + "@wordpress/e2e-test-utils-playwright": "^0.11.0", "@wordpress/e2e-tests": "^7.9.0", "@wordpress/element": "^5.20.0", - "@wordpress/env": "^8.7.0", - "@wordpress/scripts": "^26.9.0", - "conventional-changelog-simple-preset": "^1.0.20", + "@wordpress/env": "^8.9.0", + "@wordpress/scripts": "^26.14.0", + "conventional-changelog-simple-preset": "^1.0.24", "eslint-config-wordpress": "^2.0.0", "filemanager-webpack-plugin": "^6.1.7", "grunt": "^1.4.0", @@ -101,7 +111,7 @@ "lodash": "^4.17.21", "npm-run-all": "^4.1.5", "puppeteer-screen-recorder": "^2.1.2", - "replace-in-file": "^6.3.1", + "replace-in-file": "^7.0.2", "semantic-release": "^19.0.5", "semantic-release-slack-bot": "^3.5.2", "simple-statistics": "^7.8.3", diff --git a/plugins/blocks-animation/readme.md b/plugins/blocks-animation/readme.md index 5c7296159..cdedddc66 100644 --- a/plugins/blocks-animation/readme.md +++ b/plugins/blocks-animation/readme.md @@ -2,7 +2,7 @@ **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle/), [hardeepasrani](https://profiles.wordpress.org/hardeepasrani/), [mariamunteanu1](https://profiles.wordpress.org/mariamunteanu1/) **Tags:** gutenberg, block, block editor, editor, animation, animations, animate, styles, block animations **Requires at least:** 5.9 -**Tested up to:** 6.3 +**Tested up to:** 6.4 **Requires PHP:** 5.4 **Stable tag:** trunk **License:** GPLv3 diff --git a/plugins/blocks-animation/readme.txt b/plugins/blocks-animation/readme.txt index 0255ef3d8..ec12d1e2a 100644 --- a/plugins/blocks-animation/readme.txt +++ b/plugins/blocks-animation/readme.txt @@ -2,7 +2,7 @@ Contributors: themeisle, hardeepasrani, mariamunteanu1 Tags: gutenberg, block, block editor, editor, animation, animations, animate, styles, block animations Requires at least: 5.9 -Tested up to: 6.3 +Tested up to: 6.4 Requires PHP: 5.4 Stable tag: trunk License: GPLv3 diff --git a/plugins/blocks-css/readme.md b/plugins/blocks-css/readme.md index 8a4be41d3..94e8a6870 100644 --- a/plugins/blocks-css/readme.md +++ b/plugins/blocks-css/readme.md @@ -2,7 +2,7 @@ **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle/), [hardeepasrani](https://profiles.wordpress.org/hardeepasrani/) **Tags:** gutenberg, block, css, css editor, blocks css **Requires at least:** 5.9 -**Tested up to:** 6.3 +**Tested up to:** 6.4 **Requires PHP:** 5.4 **Stable tag:** trunk **License:** GPLv3 diff --git a/plugins/blocks-css/readme.txt b/plugins/blocks-css/readme.txt index 95221b3b0..403b63c28 100644 --- a/plugins/blocks-css/readme.txt +++ b/plugins/blocks-css/readme.txt @@ -2,7 +2,7 @@ Contributors: themeisle, hardeepasrani Tags: gutenberg, block, css, css editor, blocks css Requires at least: 5.9 -Tested up to: 6.3 +Tested up to: 6.4 Requires PHP: 5.4 Stable tag: trunk License: GPLv3 diff --git a/plugins/blocks-export-import/readme.md b/plugins/blocks-export-import/readme.md index 9e43b5cf8..6c8ea9b12 100644 --- a/plugins/blocks-export-import/readme.md +++ b/plugins/blocks-export-import/readme.md @@ -2,7 +2,7 @@ **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle/), [hardeepasrani](https://profiles.wordpress.org/hardeepasrani/) **Tags:** gutenberg, block, blocks, export, import, exporter, importer, block exporter, block export, block import, block importer **Requires at least:** 5.9 -**Tested up to:** 6.3 +**Tested up to:** 6.4 **Requires PHP:** 5.4 **Stable tag:** trunk **License:** GPLv3 diff --git a/plugins/blocks-export-import/readme.txt b/plugins/blocks-export-import/readme.txt index a03335c59..b413e7fd8 100644 --- a/plugins/blocks-export-import/readme.txt +++ b/plugins/blocks-export-import/readme.txt @@ -2,7 +2,7 @@ Contributors: themeisle, hardeepasrani Tags: gutenberg, block, blocks, export, import, exporter, importer, block exporter, block export, block import, block importer Requires at least: 5.9 -Tested up to: 6.3 +Tested up to: 6.4 Requires PHP: 5.4 Stable tag: trunk License: GPLv3 diff --git a/plugins/otter-pro/inc/plugins/class-form-emails-storing.php b/plugins/otter-pro/inc/plugins/class-form-emails-storing.php index f69dfa984..e6c6d2787 100644 --- a/plugins/otter-pro/inc/plugins/class-form-emails-storing.php +++ b/plugins/otter-pro/inc/plugins/class-form-emails-storing.php @@ -78,6 +78,8 @@ public function init() { add_action( 'otter_form_update_record_meta_dump', array( $this, 'update_submission_dump_data' ), 10, 2 ); add_action( 'otter_form_automatic_confirmation', array( $this, 'move_old_stripe_draft_sessions_to_unread' ) ); add_action( 'wp', array( $this, 'schedule_automatic_confirmation' ) ); + + add_action( 'wp_ajax_otter_form_submissions', array( $this, 'export_submissions' ) ); } /** @@ -1325,6 +1327,25 @@ public function schedule_automatic_confirmation() { } } + /** + * Export submissions with ajax. + */ + public function export_submissions() { + $nonce = isset( $_POST['_nonce'] ) ? sanitize_text_field( $_POST['_nonce'] ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.NoNonceVerification + if ( ! wp_verify_nonce( $nonce, 'otter_form_export_submissions' ) ) { + wp_die( esc_html( __( 'Invalid nonce.', 'otter-blocks' ) ) ); + } + + // Export submissions. + require_once ABSPATH . 'wp-admin/includes/export.php'; + ob_start(); + export_wp( array( 'content' => self::FORM_RECORD_TYPE ) ); + $export = ob_get_clean(); + + echo ent2ncr( $export ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + wp_die(); + } + /** * The instance method for the static class. * Defines and returns the instance of the static class. diff --git a/plugins/otter-pro/inc/plugins/class-stripe-pro-features.php b/plugins/otter-pro/inc/plugins/class-stripe-pro-features.php index 729c7f53b..243c1cb08 100644 --- a/plugins/otter-pro/inc/plugins/class-stripe-pro-features.php +++ b/plugins/otter-pro/inc/plugins/class-stripe-pro-features.php @@ -7,6 +7,8 @@ namespace ThemeIsle\OtterPro\Plugins; +use ThemeIsle\GutenbergBlocks\Tracker; + /** * Class Stripe_Pro_Features */ diff --git a/plugins/otter-pro/inc/render/class-form-hidden-block.php b/plugins/otter-pro/inc/render/class-form-hidden-block.php index ecb27849a..4c6e2e7a2 100644 --- a/plugins/otter-pro/inc/render/class-form-hidden-block.php +++ b/plugins/otter-pro/inc/render/class-form-hidden-block.php @@ -29,11 +29,12 @@ public function render( $attributes ) { return ''; } - $class_names = 'wp-block-themeisle-blocks-form-hidden-field ' . ( isset( $attributes['className'] ) ? $attributes['className'] : '' ); - $id = isset( $attributes['id'] ) ? $attributes['id'] : ''; - $label = isset( $attributes['label'] ) ? $attributes['label'] : __( 'Hidden Field', 'otter-blocks' ); - $param_name = isset( $attributes['paramName'] ) ? $attributes['paramName'] : ''; - $mapped_name = isset( $attributes['mappedName'] ) ? $attributes['mappedName'] : 'field-' . $id; + $class_names = 'wp-block-themeisle-blocks-form-hidden-field ' . ( isset( $attributes['className'] ) ? $attributes['className'] : '' ); + $id = isset( $attributes['id'] ) ? $attributes['id'] : ''; + $label = isset( $attributes['label'] ) ? $attributes['label'] : __( 'Hidden Field', 'otter-blocks' ); + $param_name = isset( $attributes['paramName'] ) ? $attributes['paramName'] : ''; + $mapped_name = isset( $attributes['mappedName'] ) ? $attributes['mappedName'] : 'field-' . $id; + $default_value = isset( $attributes['defaultValue'] ) ? $attributes['defaultValue'] : ''; $output = ''; diff --git a/readme.md b/readme.md index 01c08a6c8..850f3a1a8 100644 --- a/readme.md +++ b/readme.md @@ -2,7 +2,7 @@ **Contributors:** [themeisle](https://profiles.wordpress.org/themeisle/), [hardeepasrani](https://profiles.wordpress.org/hardeepasrani/), [soarerobertdaniel7](https://profiles.wordpress.org/soarerobertdaniel7/), [mariamunteanu1](https://profiles.wordpress.org/mariamunteanu1/), [arinat](https://profiles.wordpress.org/arinat/), [uriahs-victor](https://profiles.wordpress.org/uriahs-victor/), [john_pixle](https://profiles.wordpress.org/john_pixle/), [wildmisha](https://profiles.wordpress.org/wildmisha/), [irinelenache](https://profiles.wordpress.org/irinelenache/) **Tags:** block, blocks, gutenberg, gutenberg blocks, wordPress blocks, editor, block Editor, page Builder, post blocks, post grids **Requires at least:** 5.9 -**Tested up to:** 6.3 +**Tested up to:** 6.4 **Requires PHP:** 5.6 **Stable tag:** trunk **License:** GPLv3 diff --git a/src/animation/count/inline-controls.js b/src/animation/count/inline-controls.js index c7e1e8c4a..22b012ff4 100644 --- a/src/animation/count/inline-controls.js +++ b/src/animation/count/inline-controls.js @@ -35,6 +35,9 @@ import { format as settings } from './index.js'; import { updateAnimConfig } from '../editor.js'; +const delayListInline = delayList.filter( ( i ) => 'o-anim-custom-delay' !== i.value ); +const speedListInline = speedList.filter( ( i ) => 'o-anim-custom-speed' !== i.value ); + const InlineControls = ({ value, contentRef @@ -46,11 +49,11 @@ const InlineControls = ({ classes = attributes.className; classes = classes.split( ' ' ); - const countDelayClass = Array.from( delayList ).find( ( i ) => { + const countDelayClass = Array.from( delayListInline ).find( ( i ) => { return classes.find( ( o ) => o === `o-count-${ i.value }` ); }); - const countSpeedClass = Array.from( speedList ).find( ( i ) => { + const countSpeedClass = Array.from( speedListInline ).find( ( i ) => { return classes.find( ( o ) => o === `o-count-${ i.value }` ); }); @@ -98,15 +101,15 @@ const InlineControls = ({ updateAnimConfig( 'count', countDelay, value, () => setCountDelay( value ) ), attributes, setAttributes } + options={ delayListInline } + onChange={ value => updateAnimConfig( 'count', countDelay, value, () => setCountDelay( value ), attributes, setAttributes ) } /> updateAnimConfig( 'count', countSpeed, value, () => setTypingSpeed( value ) ), attributes, setAttributes } + options={ speedListInline } + onChange={ value => updateAnimConfig( 'count', countSpeed, value, () => setCountSpeed( value ), attributes, setAttributes ) } /> { applyFilters( 'otter.poweredBy', '' ) } diff --git a/src/animation/data.js b/src/animation/data.js index 696d03455..b1987d3a6 100644 --- a/src/animation/data.js +++ b/src/animation/data.js @@ -353,6 +353,10 @@ export const delayList = [ { label: __( 'Five Second', 'otter-blocks' ), value: 'delay-5s' + }, + { + label: __( 'Custom', 'otter-blocks' ), + value: 'o-anim-custom-delay' } ]; @@ -376,5 +380,9 @@ export const speedList = [ { label: __( 'Faster', 'otter-blocks' ), value: 'faster' + }, + { + label: __( 'Custom', 'otter-blocks' ), + value: 'o-anim-custom-speed' } ]; diff --git a/src/animation/editor.js b/src/animation/editor.js index 231faa3ba..c66843523 100644 --- a/src/animation/editor.js +++ b/src/animation/editor.js @@ -6,7 +6,8 @@ import { __ } from '@wordpress/i18n'; import { Button, PanelBody, - SelectControl + SelectControl, + ToggleControl } from '@wordpress/components'; import { @@ -17,6 +18,8 @@ import { import { applyFilters } from '@wordpress/hooks'; +import { __experimentalUnitControl as UnitControl } from '@wordpress/components'; + /** * Internal dependencies. */ @@ -42,7 +45,18 @@ const AnimationType = { }; import { memo } from '@wordpress/element'; +import { useCSSNode } from '../blocks/helpers/block-utility.js'; +/** + * Update the animation config. + * + * @param {string} type The type of animation. (e.g. count, typing, default) + * @param {string|undefined} oldValue The old value of the animation. + * @param {string|undefined} newValue The new value of the animation. + * @param {Function|undefined} callback The callback function which will be called after the animation is updated. + * @param {Object} attributes The attributes of the block. + * @param {(x: Object) => void} setAttributes The setAttributes function of the block. + */ export const updateAnimConfig = ( type, oldValue, newValue, callback, attributes, setAttributes ) => { let template; switch ( type ) { @@ -57,6 +71,7 @@ export const updateAnimConfig = ( type, oldValue, newValue, callback, attributes break; } + oldValue ??= ''; const oldClassName = template + oldValue; const newClassName = 'none' !== newValue ? template + newValue : ''; let classes; @@ -64,7 +79,20 @@ export const updateAnimConfig = ( type, oldValue, newValue, callback, attributes if ( attributes.className ) { classes = attributes.className; classes = classes.split( ' ' ); - const exists = classes.find( ( i ) => i === oldClassName ); + const exists = classes.find( ( i ) => i === oldClassName ); + + if ( oldValue.startsWith( 'o-anim-value-delay-' ) || oldValue.startsWith( 'o-anim-value-speed-' ) || oldValue.startsWith( 'o-anim-offset-' ) ) { + + // Remove the old custom value. + classes = classes.filter( ( i ) => ! i.includes( oldValue ) ); + } + + if ( 'o-anim-custom-delay' === oldValue || 'o-anim-custom-speed' === oldValue ) { + const cssKey = 'o-anim-custom-delay' === oldValue ? 'o-anim-value-delay-' : 'o-anim-value-speed-'; + + // Remove the old custom value. + classes = classes.filter( ( i ) => ! i.includes( cssKey ) ); + } if ( exists ) { classes = classes.join( ' ' ).replace( oldClassName, newClassName ); @@ -91,39 +119,20 @@ function AnimationControls({ attributes, setAttributes }) { - useEffect( () => { - let classes; - - if ( attributes.className ) { - classes = attributes.className; - classes = classes.split( ' ' ); - - let animationClass = Array.from( animationsList ).find( ( i ) => { - return classes.find( ( o ) => o === i.value ); - }); - - const delayClass = Array.from( delayList ).find( ( i ) => { - return classes.find( ( o ) => o === i.value ); - }); - - const speedClass = Array.from( speedList ).find( ( i ) => { - return classes.find( ( o ) => o === i.value ); - }); - - setAnimation( animationClass ? animationClass.value : 'none' ); - setDelay( delayClass ? delayClass.value : 'none' ); - setSpeed( speedClass ? speedClass.value : 'none' ); - setCurrentAnimationLabel( - animationClass ? animationClass.label : 'none' - ); - } - - }, []); const [ animation, setAnimation ] = useState( 'none' ); const [ delay, setDelay ] = useState( 'none' ); const [ speed, setSpeed ] = useState( 'none' ); const [ currentAnimationLabel, setCurrentAnimationLabel ] = useState( __( 'None', 'otter-blocks' ) ); + const [ customDelayValue, setCustomDelayValue ] = useState( 0 ); + const [ customSpeedValue, setCustomSpeedValue ] = useState( 0 ); + const [ playOnHover, setPlayOnHover ] = useState( false ); + const [ triggerOffset, setTriggerOffset ] = useState( '' ); + const [ triggerOffsetValue, setTriggerOffsetValue ] = useState( '0px' ); + const [ cssNode, setNodeCSS ] = useCSSNode({ + selector: 'animated', + appendToRoot: true + }); const updateAnimation = ( e ) => { let classes; @@ -189,12 +198,6 @@ function AnimationControls({ } }; - useEffect( () => { - if ( undefined !== window?.blocksAnimation ) { - window.blocksAnimation.removeAnimation = () => updateAnimation( 'none' ); - } - }, []); - const replayAnimation = () => { let classes = attributes.className; classes = classes.replace( animation, 'o-replay' ); @@ -204,6 +207,113 @@ function AnimationControls({ setTimeout( () => setAttributes({ className: classes.replace( 'o-replay', animation ) }), 100 ); }; + useEffect( () => { + if ( undefined !== window?.blocksAnimation ) { + window.blocksAnimation.removeAnimation = () => updateAnimation( 'none' ); + } + }, []); + + useEffect( () => { + setNodeCSS( + attributes.className + ?.split( ' ' ) + .map( ( i ) => { + if ( i.includes( 'o-anim-value-delay-' ) ) { + return `.${ i } { animation-delay: ${ i.replace( 'o-anim-value-delay-', '' ) }; --webkit-animation-delay: ${ i.replace( 'o-anim-value-delay-', '' ) }; }`; + } else if ( i.includes( 'o-anim-value-speed-' ) ) { + return `.${ i } { animation-duration: ${ i.replace( 'o-anim-value-speed-', '' ) }; --webkit-animation-duration: ${ i.replace( 'o-anim-value-speed-', '' ) }; }`; + } + return ''; + }) + .filter( ( i ) => i ) ?? '' + ); + + }, [ attributes.className ]); + + useEffect( () => { + let classes; + + if ( attributes.className ) { + classes = attributes.className; + classes = classes.split( ' ' ); + + const animationClass = Array.from( animationsList ).find( ( i ) => { + return classes.find( ( o ) => o === i.value ); + }); + + const delayClass = Array.from( delayList ).find( ( i ) => { + return classes.find( ( o ) => o === i.value ); + }); + + const speedClass = Array.from( speedList ).find( ( i ) => { + return classes.find( ( o ) => o === i.value ); + }); + + let customDelay = classes.find( ( i ) => i.includes( 'o-anim-value-delay' ) ); + if ( customDelay ) { + customDelay = customDelay.replace( 'o-anim-value-delay-', '' ); + + // The string must start with a number and end with s or ms. + if ( ! customDelay.match( /^[0-9]+(ms|s)$/ ) ) { + customDelay = undefined; + } + } + + let customSpeed = classes.find( ( i ) => i.includes( 'o-anim-value-speed' ) ); + if ( customSpeed ) { + customSpeed = customSpeed.replace( 'o-anim-value-speed-', '' ); + + // The string must start with a number and end with s or ms. + if ( ! customSpeed.match( /^[0-9]+(ms|s)$/ ) ) { + customSpeed = undefined; + } + } + + let triggerOffsetValue = classes.find( ( i ) => i.includes( 'o-anim-offset-' ) ); + if ( triggerOffsetValue ) { + triggerOffsetValue = triggerOffsetValue.replace( 'o-anim-offset-', '' ); + + // The string must start with a number and end with px or %. + if ( ! triggerOffsetValue.match( /^[0-9]+(px|%)$/ ) ) { + triggerOffsetValue = '0px'; + } + } + + const playOnHover = classes.find( ( i ) => i.includes( 'o-anim-hover' ) ); + + setAnimation( animationClass ? animationClass.value : 'none' ); + setDelay( delayClass ? delayClass.value : 'none' ); + setSpeed( speedClass ? speedClass.value : 'none' ); + setCustomDelayValue( customDelay || 0 ); + setCustomSpeedValue( customSpeed || 0 ); + setPlayOnHover( playOnHover ? true : false ); + setCurrentAnimationLabel( + animationClass ? animationClass.label : 'none' + ); + + setTriggerOffset( triggerOffsetValue ? `o-anim-offset-${triggerOffsetValue}` : '' ); + setTriggerOffsetValue( triggerOffsetValue || '0px' ); + } + + }, []); + + useEffect( () => { + + if ( ! triggerOffset ) { + return; + } + + if ( ! triggerOffsetValue ) { + return; + } + + if ( triggerOffset === `o-anim-offset-${triggerOffsetValue}` ) { + return; + } + + updateAnimConfig( AnimationType.default, 'o-anim-offset-', triggerOffsetValue ? `o-anim-offset-${triggerOffsetValue}` : '', () => setTriggerOffset( `o-anim-offset-${triggerOffsetValue}` ), attributes, setAttributes ); + }, [ triggerOffsetValue, triggerOffset ]); + return ( updateAnimConfig( AnimationType.default, delay, value, () => setDelay( value ), attributes, setAttributes ) } /> + { + 'o-anim-custom-delay' === delay && ( + updateAnimConfig( AnimationType.default, 'o-anim-value-delay-', value ? `o-anim-value-delay-${value}` : undefined, () => setCustomDelayValue( value ), attributes, setAttributes ) } + min={ 0 } + step={ 0.1 } + allowReset + units={ + [ + { + label: __( 'S', 'otter-blocks' ), + value: 's' + }, + { + label: __( 'MS', 'otter-blocks' ), + value: 'ms' + } + ] + } + /> + ) + } + updateAnimConfig( AnimationType.default, speed, value, () => setSpeed( value ), attributes, setAttributes ) } /> + { + 'o-anim-custom-speed' === speed && ( + updateAnimConfig( AnimationType.default, 'o-anim-value-speed-', `o-anim-value-speed-${value}`, () => setCustomSpeedValue( value ), attributes, setAttributes ) } + min={ 0 } + step={ 0.1 } + allowReset + units={ + [ + { + label: __( 'S', 'otter-blocks' ), + value: 's' + }, + { + label: __( 'MS', 'otter-blocks' ), + value: 'ms' + } + ] + } + /> + ) + } + + updateAnimConfig( AnimationType.default, 'o-anim-hover', value ? 'o-anim-hover' : '', () => setPlayOnHover( value ), attributes, setAttributes ) } + + /> + + updateAnimConfig( + AnimationType.default, + 'o-anim-offset-0px', value ? 'o-anim-offset-0px' : '', + () => { + setTriggerOffset( value ? 'o-anim-offset-0px' : '' ); + setTriggerOffsetValue( value ? 'o-anim-offset-0px' : '' ); + }, + attributes, + setAttributes + ) + } + help={ __( 'This will offset the trigger of animation relative to the screen.', 'otter-blocks' ) } + /> + + { + Boolean( triggerOffset ) && ( + + ) + } + + + + ); + } } }; @@ -218,7 +252,6 @@ const ContentGenerator = ({ />
- { attributes.promptID === undefined ? ( { @@ -82,6 +87,7 @@ export type FormInputCommonProps = { mappedName: string labelColor: string helpText: string + defaultValue: string } export const fieldTypesOptions = () => ([ @@ -233,4 +239,55 @@ export const mappedNameInfo = ( ); -export default { switchFormFieldTo, HideFieldLabelToggle, FieldInputWidth }; +const DragHandle = SortableHandle( () => { + return ( +
+ +
+ ); +}); + +export const SortableChoiceItem = SortableElement( ( props ) => { + return ( + +
+ { + props?.useRadio ? ( + +
+ +
+
+ ) : ( + + ) + } + + + + + +
+
+ ); +}); + +export default { switchFormFieldTo, HideFieldLabelToggle, FieldInputWidth, SortableChoiceItem }; diff --git a/src/blocks/blocks/form/edit.js b/src/blocks/blocks/form/edit.js index c7fa34897..780e7c119 100644 --- a/src/blocks/blocks/form/edit.js +++ b/src/blocks/blocks/form/edit.js @@ -292,7 +292,7 @@ const Edit = ({ } } - if ( formOptions.autoresponder || formOptions.action ) { + if ( formOptions.autoresponder || formOptions.provider || formOptions.listId || formOptions.action ) { const emailFields = findInnerBlocks( children, block => { @@ -340,7 +340,7 @@ const Edit = ({ setShowDuplicatedMappedName( hasDuplicateMappedNames ); } - }, [ children, formOptions.autoresponder, formOptions.action, formOptions.webhookId ]); + }, [ children, formOptions.autoresponder, formOptions.provider, formOptions.listId, formOptions.action, formOptions.webhookId ]); /** * Get the data from the WP Options for the current form. @@ -434,21 +434,31 @@ const Edit = ({ }); try { - ( new DeferredWpOptionsSave() ).save( 'form_options', data, ( res, error ) => { - if ( error ) { - setLoading({ formOptions: 'error' }); - } else { - setLoading({ formOptions: 'done' }); - createNotice( - 'info', - __( 'Form options have been saved.', 'otter-blocks' ), - { - isDismissible: true, - type: 'snackbar' - } - ); - } - }); + ( new DeferredWpOptionsSave() ).save( + 'form_options', + oldValue => { + if ( null === oldValue ) { + return data; + } + Object.keys( data ).forEach( k => { + oldValue[k] = data[k]; + }); + return oldValue; + }, ( res, error ) => { + if ( error ) { + setLoading({ formOptions: 'error' }); + } else { + setLoading({ formOptions: 'done' }); + createNotice( + 'info', + __( 'Form options have been saved.', 'otter-blocks' ), + { + isDismissible: true, + type: 'snackbar' + } + ); + } + }); } catch ( e ) { setLoading({ formOptions: 'error' }); } @@ -475,7 +485,6 @@ const Edit = ({ let isMissing = true; let hasUpdated = false; - emails?.forEach( ({ form }, index ) => { if ( form === attributes.optionName ) { if ( ! emails[index]?.integration ) { @@ -519,22 +528,22 @@ const Edit = ({ const formOptions = extractDataFromWpOptions( response.themeisle_blocks_form_emails ); if ( formOptions ) { parseDataFormOptions( formOptions ); - setSavedFormOptions( formOptions ); + setAttributes({ action: formOptions?.integration?.action }); } setLoading({ formIntegration: 'done' }); - if ( hasUpdated ) { - createNotice( - 'info', - __( 'Integration details have been saved.', 'otter-blocks' ), - { - isDismissible: true, - type: 'snackbar' - } - ); - } + + createNotice( + 'info', + __( 'Integration details have been saved.', 'otter-blocks' ), + { + isDismissible: true, + type: 'snackbar' + } + ); + }).catch( e => { console.error( e ); setLoading({ formIntegration: 'error' }); @@ -1091,6 +1100,7 @@ const Edit = ({ variations={ variations } onSelect={ ( nextVariation = defaultVariation ) => { if ( nextVariation ) { + window.oTrk?.add({ feature: 'form', featureComponent: 'variant', featureValue: nextVariation.name }); replaceInnerBlocks( clientId, createBlocksFromInnerBlocksTemplate( diff --git a/src/blocks/blocks/form/hidden-field/block.json b/src/blocks/blocks/form/hidden-field/block.json index eee94f6ba..add4ac236 100644 --- a/src/blocks/blocks/form/hidden-field/block.json +++ b/src/blocks/blocks/form/hidden-field/block.json @@ -23,6 +23,9 @@ }, "inputWidth": { "type": "number" + }, + "defaultValue": { + "type": "string" } }, "supports": { diff --git a/src/blocks/blocks/form/input/block.json b/src/blocks/blocks/form/input/block.json index f58c7c8ae..23c28796b 100644 --- a/src/blocks/blocks/form/input/block.json +++ b/src/blocks/blocks/form/input/block.json @@ -36,6 +36,12 @@ }, "helpText": { "type": "string" + }, + "defaultValue": { + "type": "string", + "source": "attribute", + "selector": "input.otter-form-input", + "attribute": "value" } }, "supports": { diff --git a/src/blocks/blocks/form/input/edit.js b/src/blocks/blocks/form/input/edit.js index 2446d97ab..945238aae 100644 --- a/src/blocks/blocks/form/input/edit.js +++ b/src/blocks/blocks/form/input/edit.js @@ -81,6 +81,7 @@ const Edit = ({ required={ attributes.isRequired } disabled className="otter-form-input components-text-control__input" + value={ attributes?.defaultValue } /> { attributes.helpText && ( diff --git a/src/blocks/blocks/form/input/inspector.js b/src/blocks/blocks/form/input/inspector.js index 882666ec5..c77ea273d 100644 --- a/src/blocks/blocks/form/input/inspector.js +++ b/src/blocks/blocks/form/input/inspector.js @@ -101,6 +101,12 @@ const Inspector = ({ onChange={ isRequired => setAttributes({ isRequired }) } /> + setAttributes({ defaultValue }) } + /> + { attributes.helpText && ( diff --git a/src/blocks/blocks/form/inspector.js b/src/blocks/blocks/form/inspector.js index 15fa8e5cf..fbe8d5372 100644 --- a/src/blocks/blocks/form/inspector.js +++ b/src/blocks/blocks/form/inspector.js @@ -485,7 +485,8 @@ const Inspector = ({ />, formOptions, setFormOption, - useContext( FormContext ) + useContext( FormContext ), + attributes ) } ) @@ -500,13 +501,6 @@ const Inspector = ({

- { 'loading' === loadingState?.formIntegration && ( -
- - { __( 'Fetching data from server. Please wait.', 'otter-blocks' ) } -
- ) } - { __( 'You need to have at least one email field in your form. For multiple email fields, only the first will be used.', 'otter-blocks' ) } { + window.oTrk?.add({ feature: 'marketing', featureComponent: 'provider', featureValue: provider, groupID: attributes.id }); setFormOption({ provider, listId: '', apiKey: '' }); } } /> @@ -553,6 +548,7 @@ const Inspector = ({ help={ __( 'You can find the key in the provider\'s website', 'otter-blocks' ) } value={ formOptions.apiKey ? `*************************${formOptions.apiKey.slice( -8 )}` : '' } onChange={ apiKey => { + window.oTrk?.add({ feature: 'marketing', featureComponent: 'api-key', groupID: attributes.id }); setListIDOptions([]); setFormOption({ listId: '', @@ -593,7 +589,10 @@ const Inspector = ({ label={ __( 'Contact List', 'otter-blocks' ) } value={ formOptions.listId } options={ listIDOptions } - onChange={ listId => setFormOption({ listId }) } + onChange={ listId => { + window.oTrk?.set( `${attributes.id}_list`, { feature: 'marketing', featureComponent: 'contact-list', groupID: attributes.id }); + setFormOption({ listId }); + } } /> { 1 >= listIDOptions?.length &&

{ __( 'No Contact list found. Please create a list in your provider interface or check if the API key is correct.', 'otter-blocks' ) }

} @@ -601,21 +600,40 @@ const Inspector = ({ { 2 <= listIDOptions?.length && formOptions.listId && ( setFormOption({ action }) } + onChange={ action => { + window.oTrk?.set( `${attributes.id}_action`, { feature: 'marketing', featureComponent: 'action', featureValue: action, groupID: attributes.id }); + setFormOption({ action }); + } } /> - { 'submit-subscribe' === formOptions.action && ( + { ( ! formOptions.action || 'submit-subscribe' === formOptions.action ) && (
- { __( 'This action will add the client to the contact list and send a separate email with the form data to administrator or to the email mentioned in \'Form to\' field. A checkbox for data-sharing consent with third-party will be added on form.', 'otter-blocks' ) } + { __( 'Adds the client to your contact list and emails form data to the specified \'Form to\' address or the admin. Includes a checkbox for third-party data-sharing consent.', 'otter-blocks' ) }
) } + + { 'subscribe' === formOptions.action && ( +
+ { __( 'Add users to the contact list and skip email alerts for each submission. Ideal for news letter sign-up forms.', 'otter-blocks' ) } +
+ ) } + + { + 'subscribe' === formOptions.action && + ( 'email' === formOptions.submissionsSaveLocation || ! Boolean( window?.otterPro?.isActive ) ) && + ( +
+ { __( 'By skipping the email alerts you will lose the data from other fields. If this is a problem, we recommend switching to Database saving or using Submit & Subscribe Action', 'otter-blocks' ) } +
+ ) + }
) } @@ -623,6 +641,13 @@ const Inspector = ({ ) } + { 'loading' === loadingState?.formIntegration && ( +
+ + { __( 'Fetching data from server. Please wait.', 'otter-blocks' ) } +
+ ) } +
{ +const Field = ({ fieldType, label, position, attributes, checked, onChange }) => { const id = `${attributes.id ?? ''}-field-${position}`; const value = label?.toLowerCase().replace( / /g, '_' ); - const onChangeLabel = label => { - const options = attributes.options?.split( '\n' ) ?? []; - if ( options.length < position ) { - return; - } - - options[ position ] = label; - setAttributes({ options: options.join( '\n' ) }); - }; - return (
- + @@ -58,17 +49,18 @@ const Field = ({ fieldType, label, setAttributes, position, attributes }) => { ); }; -const SelectField = ({ attributes }) => { +const SelectField = ({ attributes, options }) => { return ( @@ -92,6 +84,8 @@ const Edit = ({ const blockProps = useBlockProps(); + const options = ( isString( attributes.options ) ? attributes.options?.split( '\n' )?.map( x => ({ isDefault: false, content: x }) ) : attributes.options ) ?? []; + return ( { - 'select' === attributes?.type ? : ( + 'select' === attributes?.type ? : (
{ - ( attributes?.options ?? '' )?.split( '\n' )?.map( ( label, index ) => { + options?.map( ( c, index ) => { return { + const o = [ ...options ]; + o[index] = { ...o[index], content: label }; + setAttributes({ options: o }); + }} />; }) } diff --git a/src/blocks/blocks/form/multiple-choice/inspector.js b/src/blocks/blocks/form/multiple-choice/inspector.js index e4d9c3b1b..c210f7205 100644 --- a/src/blocks/blocks/form/multiple-choice/inspector.js +++ b/src/blocks/blocks/form/multiple-choice/inspector.js @@ -9,6 +9,7 @@ import { } from '@wordpress/block-editor'; import { + BaseControl, Button, PanelBody, SelectControl, @@ -21,10 +22,19 @@ import { Fragment, useContext } from '@wordpress/element'; /** * Internal dependencies */ -import { getActiveStyle, changeActiveStyle } from '../../../helpers/helper-functions.js'; -import { fieldTypesOptions, HideFieldLabelToggle, mappedNameInfo, switchFormFieldTo } from '../common'; +import { getActiveStyle, changeActiveStyle, buildResponsiveSetAttributes } from '../../../helpers/helper-functions.js'; +import { + fieldTypesOptions, + HideFieldLabelToggle, + mappedNameInfo, SortableChoiceItem, + SortableChoiceList, + switchFormFieldTo +} from '../common'; import { FormContext } from '../edit.js'; import { HTMLAnchorControl } from '../../../components'; +import { debounce, isString } from 'lodash'; +import { SortableContainer } from 'react-sortable-hoc'; +import arrayMove from 'array-move'; const styles = [ { @@ -48,6 +58,56 @@ const Inspector = ({ selectForm } = useContext( FormContext ); + const options = ( isString( attributes.options ) ? attributes.options?.split( '\n' )?.map( x => ({ isDefault: false, content: x }) ) : attributes.options ) ?? []; + + // Without debouncing, the RichText will lose focus on every keypress. + const debouncedSet = debounce( setAttributes, 800 ); + + const ChoiceList = SortableContainer( ( props ) => { + return ( +
+ { + props.options?.map( + ( tab, index ) => ( + { + const updatedOptions = options.map( ( item, i ) => { + let updatedItem = { ...item }; + if ( + ( 'select' === attributes.type || 'radio' === attributes.type ) && + i !== index + ) { + updatedItem.isDefault = false; + } + if ( i === index ) { + updatedItem.isDefault = ! Boolean( item.isDefault ); + } + return updatedItem; + }); + + setAttributes({ options: updatedOptions }); + }} + deleteTab={() => { + const o = [ ...options ]; + o.splice( index, 1 ); + setAttributes({ options: o }); + }} + onLabelChange={( value ) => { + const o = [ ...options ]; + o[index] = { ...o[index], content: value }; + debouncedSet({ options: o }); + }} + useRadio={'select' === attributes.type || 'radio' === attributes.type} + /> + ) ) + } +
+ ); + }); + return ( @@ -68,7 +128,17 @@ const Inspector = ({ options={ fieldTypesOptions() } onChange={ type => { if ( 'radio' === type || 'checkbox' === type || 'select' === type ) { - setAttributes({ type }); + + + if ( 'checkbox' === attributes.type ) { + + // Remove all the default values. + const o = options?.map( item => ({ ...item, isDefault: false }) ); + setAttributes({ type, options: o }); + } else { + setAttributes({ type }); + } + return; } switchFormFieldTo( type, clientId, attributes ); @@ -83,12 +153,37 @@ const Inspector = ({ - setAttributes({ options }) } - /> + > + { + let o = [ ...options ]; + o = arrayMove( o, oldIndex, newIndex ); + setAttributes({ options: o }); + } } + /> + + + + multipleSelection: boolean } export type FormMultipleChoiceInputProps = BlockProps diff --git a/src/blocks/blocks/form/textarea/block.json b/src/blocks/blocks/form/textarea/block.json index f7236be57..f23cc88e2 100644 --- a/src/blocks/blocks/form/textarea/block.json +++ b/src/blocks/blocks/form/textarea/block.json @@ -32,6 +32,11 @@ }, "helpText": { "type": "string" + }, + "defaultValue": { + "type": "string", + "source": "text", + "selector": "textarea.otter-form-textarea-input" } }, "supports": { diff --git a/src/blocks/blocks/form/textarea/edit.js b/src/blocks/blocks/form/textarea/edit.js index ce17d5df5..58539f7db 100644 --- a/src/blocks/blocks/form/textarea/edit.js +++ b/src/blocks/blocks/form/textarea/edit.js @@ -78,9 +78,12 @@ const Edit = ({ name={ attributes.id } id={ attributes.id ? attributes.id + '-input' : '' } required={ attributes.isRequired } - disabled rows={ 10 } className="otter-form-textarea-input components-textarea-control__input" + onChange={ e => { + setAttributes({ defaultValue: e.target.value }); + } } + value={ attributes.defaultValue } > { diff --git a/src/blocks/blocks/form/textarea/inspector.js b/src/blocks/blocks/form/textarea/inspector.js index 42188c15a..4c5a02a46 100644 --- a/src/blocks/blocks/form/textarea/inspector.js +++ b/src/blocks/blocks/form/textarea/inspector.js @@ -8,7 +8,7 @@ import { InspectorControls } from '@wordpress/block-editor'; import { Button, PanelBody, - SelectControl, + SelectControl, TextareaControl, TextControl, ToggleControl } from '@wordpress/components'; @@ -21,6 +21,11 @@ import { FieldInputWidth, fieldTypesOptions, HideFieldLabelToggle, mappedNameInf import { FormContext } from '../edit'; import { HTMLAnchorControl } from '../../../components'; +/** + * + * @param {import('./types').FormTextareaProps} props + * @returns {JSX.Element} + */ const Inspector = ({ attributes, setAttributes, @@ -86,6 +91,12 @@ const Inspector = ({ onChange={ isRequired => setAttributes({ isRequired }) } /> + setAttributes({ defaultValue }) } + /> + + { + attributes.defaultValue + } { attributes.helpText && ( diff --git a/src/blocks/blocks/posts/block.json b/src/blocks/blocks/posts/block.json index d8e633208..473cc64a3 100644 --- a/src/blocks/blocks/posts/block.json +++ b/src/blocks/blocks/posts/block.json @@ -231,6 +231,111 @@ }, "featuredPostOrder": { "type": "string" + }, + "hasPagination": { + "type": "boolean", + "default": false + }, + "pagColor": { + "type": "string" + }, + "pagBgColor": { + "type": "string" + }, + "pagColorHover": { + "type": "string" + }, + "pagBgColorHover": { + "type": "string" + }, + "pagColorActive": { + "type": "string" + }, + "pagBgColorActive": { + "type": "string" + }, + "pagBorderColor": { + "type": "string" + }, + "pagBorderColorHover": { + "type": "string" + }, + "pagBorderColorActive": { + "type": "string" + }, + "pagGap": { + "type": "string" + }, + "pagBorderRadius": { + "type": "object", + "properties": { + "top": { + "type": "string" + }, + "left": { + "type": "string" + }, + "right": { + "type": "string" + }, + "bottom": { + "type": "string" + } + } + }, + "pagBorderWidth": { + "type": "object", + "properties": { + "top": { + "type": "string" + }, + "left": { + "type": "string" + }, + "right": { + "type": "string" + }, + "bottom": { + "type": "string" + } + } + }, + "pagPadding": { + "type": "object", + "properties": { + "top": { + "type": "string" + }, + "left": { + "type": "string" + }, + "right": { + "type": "string" + }, + "bottom": { + "type": "string" + } + } + }, + "pagContMargin": { + "type": "object", + "properties": { + "top": { + "type": "string" + }, + "left": { + "type": "string" + }, + "right": { + "type": "string" + }, + "bottom": { + "type": "string" + } + } + }, + "pagSize": { + "type": "string" } }, "supports": { diff --git a/src/blocks/blocks/posts/components/layout/index.js b/src/blocks/blocks/posts/components/layout/index.js index 5fbc2130a..b3352dce8 100644 --- a/src/blocks/blocks/posts/components/layout/index.js +++ b/src/blocks/blocks/posts/components/layout/index.js @@ -187,4 +187,42 @@ export const PostsDescription = ({ attributes, element, post }) => { return ''; }; +export const PaginationPreview = () => ( + +); + export default Layout; diff --git a/src/blocks/blocks/posts/edit.js b/src/blocks/blocks/posts/edit.js index b0374ee3e..2fa13c64e 100644 --- a/src/blocks/blocks/posts/edit.js +++ b/src/blocks/blocks/posts/edit.js @@ -43,7 +43,7 @@ import { blockInit, getDefaultValueByField } from '../../helpers/block-utility.js'; -import Layout from './components/layout/index.js'; +import Layout, { PaginationPreview } from './components/layout/index.js'; import { _align, _px, @@ -261,7 +261,22 @@ const Edit = ({ '--row-gap-mobile': attributes.rowGapMobile, '--content-padding': responsiveGetAttributes([ attributes.padding, attributes.paddingTablet, attributes.paddingMobile ]), '--content-padding-tablet': attributes.paddingTablet, - '--content-padding-mobile': attributes.paddingMobile + '--content-padding-mobile': attributes.paddingMobile, + '--pag-color': attributes.pagColor, + '--pag-bg-color': attributes.pagBgColor, + '--pag-color-hover': attributes.pagColorHover, + '--pag-bg-color-hover': attributes.pagBgColorHover, + '--pag-color-active': attributes.pagColorActive, + '--pag-bg-color-active': attributes.pagBgColorActive, + '--pag-border-color': attributes.pagBorderColor, + '--pag-border-color-hover': attributes.pagBorderColorHover, + '--pag-border-color-active': attributes.pagBorderColorActive, + '--pag-border-radius': boxValues( attributes.pagBorderRadius ), + '--pag-border-width': boxValues( attributes.pagBorderWidth ), + '--pag-padding': boxValues( attributes.pagPadding, { top: '5px', right: '15px', bottom: '5px', left: '15px' }), + '--pag-gap': attributes.pagGap, + '--pag-size': attributes.pagSize, + '--pag-cont-margin': boxValues( attributes.pagContMargin, { top: '10px', bottom: '30px' }) }; const blockProps = useBlockProps(); @@ -313,7 +328,11 @@ const Edit = ({ categoriesList={ categoriesList } authors={ authors } /> + + { + attributes.hasPagination && + }
); }; @@ -354,13 +373,14 @@ domReady( () => { let maxTries = 10; const init = () => { - window.wp.hooks.addFilter( 'rank_math_content', 'rank-math', () => { + + window.wp.hooks.addFilter( 'rank_math_content', 'rank-math', ( content ) => { /** * @type {NodeListOf} postsHtml - The HTML nodes which contain the relevent post content for RankMath. */ const postsHtml = document.querySelectorAll( '.o-posts-grid-post-body' ); - return Array.from( postsHtml ).map( ( post ) => post.innerHTML ).join( '' ); + return ( content ?? '' ) + ( Array.from( postsHtml )?.map( ( post ) => post.innerHTML )?.join( '' ) ?? '' ); }); window?.rankMathEditor?.refresh( 'content' ); diff --git a/src/blocks/blocks/posts/inspector.js b/src/blocks/blocks/posts/inspector.js index 56b34dfaf..87cf498ce 100644 --- a/src/blocks/blocks/posts/inspector.js +++ b/src/blocks/blocks/posts/inspector.js @@ -50,6 +50,7 @@ import { } from '../../helpers/helper-functions.js'; import { useResponsiveAttributes } from '../../helpers/utility-hooks.js'; import { useTabSwitch } from '../../helpers/block-utility'; +import { makeBox } from '../../plugins/copy-paste/utils'; const styles = [ { @@ -93,7 +94,7 @@ const defaultFontSizes = [ /** * - * @param {import('../popup/types.js').PopupInspectorProps} props + * @param {import('./types.js').PostInspectorProps} props * @returns */ const Inspector = ({ @@ -301,7 +302,7 @@ const Inspector = ({ setAttributes({ enableFeaturedPost })} + onChange={ () => setAttributes({ enableFeaturedPost: ! Boolean( attributes.enableFeaturedPost ), hasPagination: undefined })} /> { @@ -318,6 +319,12 @@ const Inspector = ({ ) } + setAttributes({ hasPagination: ! Boolean( attributes.hasPagination ), enableFeaturedPost: undefined, featuredPostOrder: undefined }) } + /> + responsiveSetAttributes( value, [ 'customMetaFontSize', 'customMetaFontSizeTablet', 'customMetaFontSizeMobile' ]) } /> + + { + attributes.hasPagination && ( + + setAttributes({ pagSize }) } + /> + + ) + } setAttributes({ borderColor }), label: __( 'Border', 'otter-blocks' ), isShownByDefault: false - } + }, + ...( attributes.hasPagination ? [ + { + value: attributes.pagColor, + onChange: pagColor => setAttributes({ pagColor }), + label: __( 'Pagination Link', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagBgColor, + onChange: pagBgColor => setAttributes({ pagBgColor }), + label: __( 'Pagination Background', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagBorderColor, + onChange: pagBorderColor => setAttributes({ pagBorderColor }), + label: __( 'Pagination Border', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagColorActive, + onChange: pagColorActive => setAttributes({ pagColorActive }), + label: __( 'Pagination Active Link', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagBgColorActive, + onChange: pagBgColorActive => setAttributes({ pagBgColorActive }), + label: __( 'Pagination Active Background', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagColorHover, + onChange: pagColorHover => setAttributes({ pagColorHover }), + label: __( 'Pagination Hover Link', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagBgColorHover, + onChange: pagBgColorHover => setAttributes({ pagBgColorHover }), + label: __( 'Pagination Hover Background', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagBorderColorHover, + onChange: pagBorderColorHover => setAttributes({ pagBorderColorHover }), + label: __( 'Pagination Hover Border', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.pagBorderColorActive, + onChange: pagBorderColorActive => setAttributes({ pagBorderColorActive }), + label: __( 'Pagination Active Border', 'otter-blocks' ), + isShownByDefault: false + } + ] : []) ] } /> @@ -467,7 +546,7 @@ const Inspector = ({ label={ __( 'Column Gap', 'otter-blocks' ) } > responsiveSetAttributes( value, [ 'columnGap', 'columnGapTablet', 'columnGapMobile' ]) } /> @@ -482,7 +561,7 @@ const Inspector = ({ label={ __( 'Row Gap', 'otter-blocks' ) } > responsiveSetAttributes( value, [ 'rowGap', 'rowGapTablet', 'rowGapMobile' ]) } /> @@ -516,6 +595,33 @@ const Inspector = ({ onChange={ contentGap => setAttributes({ contentGap }) } /> + + { + attributes.hasPagination && ( + + setAttributes({ pagGap: pagGap + 'px' }) } + min={ 0 } + max={ 50 } + /> + setAttributes({ pagPadding }) } + allowReset + /> + setAttributes({ pagContMargin }) } + sides={[ 'top', 'bottom' ]} + allowReset + /> + + ) + } setAttributes({ borderWidth }) } /> @@ -535,11 +641,31 @@ const Inspector = ({ setAttributes({ cardBorderRadius }) } id="o-border-raduis-box" /> + { + attributes.hasPagination && ( + + setAttributes({ pagBorderRadius }) } + id="o-border-raduis-box" + allowReset + /> + setAttributes({ pagBorderWidth }) } + allowReset + /> + + ) + } + changeBoxShadow( 'boxShadow', data ) } diff --git a/src/blocks/blocks/posts/style.scss b/src/blocks/blocks/posts/style.scss index 34866dbd1..a49f5c14c 100644 --- a/src/blocks/blocks/posts/style.scss +++ b/src/blocks/blocks/posts/style.scss @@ -39,6 +39,24 @@ --content-padding-tablet: var( --content-padding ); --content-padding-mobile: var( --content-padding-tablet ); + --pag-size: 16px; + --pag-color: inherit; + --pag-bg-color: transparent; + --pag-color-hover: var(--pag-color); + --pag-bg-color-hover: rgba(0,0,0,0.5); + --pag-color-active: var(--pag-color); + --pag-bg-color-active: rgba(0,0,0,0.1); + + --pag-border-color: transparent; + --pag-border-color-hover: var(--pag-border-color); // TODO: add handles for this. + --pag-border-color-active: var(--pag-border-color); + + --pag-border-radius: 0; + --pag-border-width: 0; + --pag-padding: 5px 15px; + --pag-gap: 5px; + --pag-cont-margin: 10px 0 0 0; + border: none; &.has-dark-bg { @@ -238,17 +256,60 @@ background-color: var( --background-color ); box-shadow: var( --box-shadow ); margin-bottom: var( --row-gap ); - + .o-posts-grid-post-image a { width: 100%; - + img { width: 100%; height: 250px; object-fit: cover; } } - + + } + } + + .o-posts-grid-pag { + display: flex; + flex-direction: row; + flex-wrap: wrap; + justify-content: center; + align-items: baseline; + width: 100%; + + gap: var(--pag-gap); + color: var(--pag-color); + font-size: var(--pag-size); + margin: var(--pag-cont-margin); + + .page-numbers:not(.dots) { + background-color: var(--pag-bg-color); + border-color: var(--pag-border-color); + border-radius: var(--pag-border-radius); + border-width: var(--pag-border-width); + padding: var(--pag-padding); + + text-decoration: none; + color: inherit; + border-style: solid; + box-sizing: border-box; + text-align: center; + margin: 0; + + &:hover { + background-color: var(--pag-bg-color-hover); + border-color: var(--pag-border-color-hover); + + color: var(--pag-color-hover); + } + + &[aria-current="page"] { + background-color: var(--pag-bg-color-active); + border-color: var(--pag-border-color-active); + + color: var(--pag-color-active); + } } } } @@ -275,7 +336,7 @@ a { width: var( --img-width-tablet ); } - + img { width: var( --img-width-tablet ); } @@ -297,7 +358,7 @@ .o-posts-grid-post-category { font-size: var( --meta-text-size-tablet ); } - + .o-posts-grid-post-meta { font-size: var( --meta-text-size-tablet ); } @@ -312,7 +373,7 @@ p { font-size: var( --description-text-size-tablet ); } - + .read-more { font-size: var( --description-text-size-tablet ); } @@ -363,7 +424,7 @@ a { width: var( --img-width-mobile ); } - + img { width: var( --img-width-mobile ); } @@ -385,7 +446,7 @@ .o-posts-grid-post-category { font-size: var( --meta-text-size-mobile ); } - + .o-posts-grid-post-meta { font-size: var( --meta-text-size-mobile ); } @@ -400,7 +461,7 @@ p { font-size: var( --description-text-size-mobile ); } - + .read-more { font-size: var( --description-text-size-mobile ); } diff --git a/src/blocks/blocks/posts/types.d.ts b/src/blocks/blocks/posts/types.d.ts index aa1330aa1..37895f475 100644 --- a/src/blocks/blocks/posts/types.d.ts +++ b/src/blocks/blocks/posts/types.d.ts @@ -1,4 +1,5 @@ -import { BlockProps, InspectorProps, BoxShadow } from '../../helpers/blocks'; +import { BlockProps, InspectorProps, BoxShadow, BoxType } from '../../helpers/blocks'; +import { BoxBorder, BoxPadding } from '../../common'; type Attributes = { id: string @@ -54,6 +55,22 @@ type Attributes = { paddingMobile: string contentGap: string featuredPostOrder: string + hasPagination: boolean + pagColor: string + pagBgColor: string + pagColorHover: string + pagBgHoverColor: string + pagColorActive: string + pagBgColorActive: string + pagPadding: BoxPadding + pagGap: string + pagBorderRadius: BoxBorder + pagBorderWidth: BoxBorder + pagBorderColor: string + pagBorderColorHover: string + pagBorderColorActive: string + pagSize: string + pagContMargin: BoxType } export type PostProps = BlockProps diff --git a/src/blocks/blocks/stripe-checkout/edit.tsx b/src/blocks/blocks/stripe-checkout/edit.tsx index 1289ef227..5b3697831 100644 --- a/src/blocks/blocks/stripe-checkout/edit.tsx +++ b/src/blocks/blocks/stripe-checkout/edit.tsx @@ -231,7 +231,10 @@ const Edit = ({ @@ -266,7 +269,10 @@ const Edit = ({ }, ...productsList ] } - onChange={ ( product: string ) => setAttributes({ product: 'none' !== product ? product : undefined }) } + onChange={ ( product: string ) =>{ + window.oTrk?.add({ feature: 'stripe-checkout', featureComponent: 'product-changed' }); + setAttributes({ product: 'none' !== product ? product : undefined }); + } } /> ) } @@ -281,7 +287,10 @@ const Edit = ({ }, ...pricesList ] } - onChange={ ( price: string ) => setAttributes({ price: 'none' !== price ? price : undefined }) } + onChange={ ( price: string ) => { + window.oTrk?.add({ feature: 'stripe-checkout', featureComponent: 'price-changed' }); + setAttributes({ price: 'none' !== price ? price : undefined }); + } } /> ) } diff --git a/src/blocks/blocks/stripe-checkout/inspector.js b/src/blocks/blocks/stripe-checkout/inspector.js index 6e2497e1e..a0fb820b0 100644 --- a/src/blocks/blocks/stripe-checkout/inspector.js +++ b/src/blocks/blocks/stripe-checkout/inspector.js @@ -111,6 +111,7 @@ const Inspector = ({ ...productsList ] } onChange={ product => { + window.oTrk?.add({ feature: 'stripe-checkout', featureComponent: 'product-changed' }); setAttributes({ product: 'none' !== product ? product : undefined, price: undefined @@ -130,7 +131,10 @@ const Inspector = ({ }, ...pricesList ] } - onChange={ price => setAttributes({ price: 'none' !== price ? price : undefined }) } + onChange={ price => { + window.oTrk?.add({ feature: 'stripe-checkout', featureComponent: 'price-changed' }); + setAttributes({ price: 'none' !== price ? price : undefined }); + } } /> ) } diff --git a/src/blocks/blocks/tabs/editor.scss b/src/blocks/blocks/tabs/editor.scss index 568d1c90a..99427e897 100644 --- a/src/blocks/blocks/tabs/editor.scss +++ b/src/blocks/blocks/tabs/editor.scss @@ -254,6 +254,19 @@ margin: 2px; } } + + .components-checkbox-control { + margin: 0 0 0 8px !important; + + .components-base-control__field { + margin: 0; + padding: 0; + + .components-checkbox-control__input-container { + margin: 0; + } + } + } } .wp-block-themeisle-blocks-tabs-inspector-add-tab { diff --git a/src/blocks/components/prompt/editor.scss b/src/blocks/components/prompt/editor.scss index b939833b2..d45020e6c 100644 --- a/src/blocks/components/prompt/editor.scss +++ b/src/blocks/components/prompt/editor.scss @@ -1,5 +1,5 @@ .prompt-placeholder { - fieldset { + fieldset, .components-placeholder__fieldset { display: flex; flex-direction: column; } @@ -81,13 +81,12 @@ display: flex; flex-direction: column; gap: 10px; - margin-top: 10px; background-color: white; border-radius: 2px; border: 1px solid #1E1E1E; - width: 100%; - max-width: 800px; + width: auto; + max-width: 1200px; padding: 10px; .prompt-result__header { diff --git a/src/blocks/components/prompt/index.tsx b/src/blocks/components/prompt/index.tsx index a16e31fb3..cb2c0c1e9 100644 --- a/src/blocks/components/prompt/index.tsx +++ b/src/blocks/components/prompt/index.tsx @@ -14,8 +14,10 @@ import { Fragment, useEffect, useState } from '@wordpress/element'; import useSettings from '../../helpers/use-settings'; import { + PromptConversation, PromptsData, injectActionIntoPrompt, + injectConversationIntoPrompt, retrieveEmbeddedPrompt, sendPromptToOpenAI, sendPromptToOpenAIWithRegenerate } from '../../helpers/prompt'; @@ -123,42 +125,12 @@ const PromptBlockEditor = ( ); }; -const TrackingConsentToggle = ( props: {onToggle: ( value: boolean ) => void, value: boolean, onClose: () => void}) => { - return ( -
-
- { - props.onToggle( event.target.checked ); - }} - name="o-tracking-consent-toggle" - /> -
- -
-
-
- ); -}; - const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { const { title, value, onValueChange, promptID } = props; const [ getOption, updateOption, status ] = useSettings(); const [ apiKey, setApiKey ] = useState( null ); - const [ showTrackingConsent, setShowTrackingConsent ] = useState( false ); - const [ trackingConsent, setTrackingConsent ] = useState( false ); - const [ generationStatus, setGenerationStatus ] = useState<'loading' | 'loaded' | 'error'>( 'loaded' ); const [ apiKeyStatus, setApiKeyStatus ] = useState<'checking' | 'missing' | 'present' | 'error'>( window.themeisleGutenberg?.hasOpenAiKey ? 'present' : 'checking' ); @@ -174,28 +146,6 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { const [ errorMessage, setErrorMessage ] = useState( '' ); const [ tokenUsageDescription, setTokenUsageDescription ] = useState( '' ); - const onSuccessActions = { - clearHistory: () => { - setResult( undefined ); - setResultHistory([]); - setResultHistoryIndex( 0 ); - } - }; - - const onToggleTrackingConsent = ( value: boolean ) => { - updateOption( 'otter_blocks_logger_flag', value ? 'yes' : '', __( 'Tracking consent saved.', 'otter-blocks' ), 'o-tracking-consent', () => { - if ( value ) { - setShowTrackingConsent( false ); - } - }); - - setTrackingConsent( value ); - }; - - useEffect( () => { - setShowTrackingConsent( ! Boolean( localStorage.getItem( 'o-tracking-consent' ) ) ); - }, []); - useEffect( () => { const getEmbeddedPrompt = async() => { retrieveEmbeddedPrompt( promptID ).then( ( promptServer ) => { @@ -218,11 +168,6 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { } else { setApiKeyStatus( 'missing' ); } - - if ( window.themeisleGutenberg?.canTrack ) { - setTrackingConsent( true ); - setShowTrackingConsent( false ); - } } if ( 'error' === status ) { @@ -254,7 +199,7 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { let embeddedPrompt = embeddedPrompts?.find( ( prompt ) => prompt.otter_name === promptID ); - if ( ! embeddedPrompt ) { + if ( undefined === embeddedPrompt ) { setShowError( true ); setErrorMessage( __( 'Prompt not found. Reload the page. If the error still persist the server might be down.', 'otter-blocks' ) ); return; @@ -266,6 +211,18 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { embeddedPrompt = injectActionIntoPrompt( embeddedPrompt, action ); } + if ( 'patternsPicker' === promptID && window.themeisleGutenberg?.hasPro ) { + + // Add the Pro patterns to the prompt. + const addon: PromptConversation[] = embeddedPrompt?.['otter_pro_addon'] ?? []; + + addon?.forEach( ( conversation ) => { + if ( embeddedPrompt ) { + embeddedPrompt = injectConversationIntoPrompt( embeddedPrompt, conversation ); + } + }); + } + if ( 'present' !== apiKeyStatus ) { setShowError( true ); setErrorMessage( __( 'API Key not found. Please add your API Key in the settings page.', 'otter-blocks' ) ); @@ -276,6 +233,8 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { const sendPrompt = regenerate ? sendPromptToOpenAIWithRegenerate : sendPromptToOpenAI; + window.oTrk?.add({ feature: 'ai-generation', featureComponent: 'prompt', featureValue: value }, { consent: true }); + sendPrompt?.( value, embeddedPrompt, { 'otter_used_action': 'textTransformation' === promptID ? 'textTransformation::otter_action_prompt' : ( promptID ?? '' ), 'otter_user_content': value @@ -329,7 +288,7 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { return ( { 'checking' === apiKeyStatus && ( @@ -401,7 +360,7 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { } return ( -
+ { ( 0 < resultHistory?.length ) ? ( { placeholder={ props.promptPlaceholder } /> - {/*{*/} - {/* showTrackingConsent && (*/} - {/* {*/} - {/* setShowTrackingConsent( false );*/} - {/* localStorage.setItem( 'o-tracking-consent', 'true' );*/} - {/* }}*/} - {/* />*/} - {/* )*/} - {/*}*/} - {props.children} ) : ( @@ -477,8 +423,7 @@ const PromptPlaceholder = ( props: PromptPlaceholderProps ) => { ) } -
- +
); }; diff --git a/src/blocks/components/typography-selector-control/editor.scss b/src/blocks/components/typography-selector-control/editor.scss index 4010e349e..c462947a8 100644 --- a/src/blocks/components/typography-selector-control/editor.scss +++ b/src/blocks/components/typography-selector-control/editor.scss @@ -35,6 +35,12 @@ } } +.o-responsive-control ~ .o-typo-component { + .o-typo-header { + padding-top: 0; + } +} + .o-options-global-defaults-modal .o-typo-component .o-two-column-components { margin-bottom: 25px; } diff --git a/src/blocks/frontend/form/index.js b/src/blocks/frontend/form/index.js index 609da443a..6a1d55347 100644 --- a/src/blocks/frontend/form/index.js +++ b/src/blocks/frontend/form/index.js @@ -125,9 +125,17 @@ const extractFormFields = async( form ) => { const paramName = hiddenInput?.dataset?.paramName; mappedName = hiddenInput?.name; + // Extract the value from the URL. if ( paramName ) { const urlParams = new URLSearchParams( window.location.search ); - value = urlParams.get( paramName ); + if ( urlParams.has( paramName ) ) { + hiddenInput.value = urlParams.get( paramName ); + } + } + + if ( hiddenInput?.value ) { + // eslint-disable-next-line prefer-destructuring + value = hiddenInput.value; fieldType = 'hidden'; } } else if ( stripeField ) { diff --git a/src/blocks/frontend/leaflet-map/leaflet-gesture-handling.js b/src/blocks/frontend/leaflet-map/leaflet-gesture-handling.js index ec4e8f49b..ed7582eea 100644 --- a/src/blocks/frontend/leaflet-map/leaflet-gesture-handling.js +++ b/src/blocks/frontend/leaflet-map/leaflet-gesture-handling.js @@ -150,9 +150,6 @@ const t = setInterval( () => { } if ( ! languageContent ) { - - // If still nothing, default to English - // console.log("No lang found for", lang); lang = 'en'; languageContent = LanguageContent[lang]; } diff --git a/src/blocks/frontend/live-search/index.ts b/src/blocks/frontend/live-search/index.ts index 63f93a81d..1a823da10 100644 --- a/src/blocks/frontend/live-search/index.ts +++ b/src/blocks/frontend/live-search/index.ts @@ -17,6 +17,11 @@ type ResultsEntry = { type ResultsContainer = Element | null | undefined; +/** + * Returns an icon component based on the post type. + * @param type - The post type. + * @returns The icon component. + */ const getPostIcon = ( type: string ) => { switch ( type ) { case 'post': return post(); @@ -26,6 +31,11 @@ const getPostIcon = ( type: string ) => { } }; +/** + * Returns a div element containing meta information for a given ResultsEntry object. + * @param entry - The ResultsEntry object to generate meta information for. + * @returns A div element containing the meta information. + */ const getMeta = ( entry: ResultsEntry ) => { const meta = document.createElement( 'div' ); @@ -56,6 +66,13 @@ domReady( () => { const liveSearch = document.querySelectorAll( '.o-live-search' ); const loadingIcon = ''; + /** + * Get the post search from our endpoint. + * + * @param search - The search query string. + * @param postTypes - An array of post types to search in. + * @returns A Promise that resolves to the JSON response from the REST API. + */ const requestData = async( search: string, postTypes: Array ) => { const options = { method: 'GET', @@ -78,20 +95,30 @@ domReady( () => { return response.json(); }; - const handleLiveSearch = ( element: Element ) => { + const initializeLiveSearch = ( element: Element ) => { const inputElement = element.querySelector( 'input.wp-block-search__input' ) as HTMLInputElement; if ( ! inputElement ) { return; } + inputElement.value = ''; + inputElement.setAttribute( 'autocomplete', 'off' ); + const form = element.querySelector( 'form' ); const block = element.querySelector( '.wp-block-search__inside-wrapper' ); + // Create this variable to cache the results + let resultsContainer: ResultsContainer; + + const { postTypes } = ( element as HTMLElement ).dataset; + const postTypesArray: Array = postTypes ? JSON.parse( postTypes ) : []; + const inputStyle = getComputedStyle( inputElement ); const parentStyle = inputElement.parentElement ? getComputedStyle( inputElement.parentElement ) : null; - inputElement.value = ''; - + /** + * Create result search area. + */ const wrap = document.createElement( 'div' ); wrap.classList.add( 'container-wrap' ); wrap.style.width = inputElement.offsetWidth + 'px'; @@ -110,15 +137,10 @@ domReady( () => { wrap.style.maxHeight = Math.min( 500, inputEdgeDistance - 20 ) + 'px'; - // Create this variable to cache the results - let resultsContainer: ResultsContainer; - - const { postTypes } = ( element as HTMLElement ).dataset; - const postTypesArray: Array = postTypes ? JSON.parse( postTypes ) : []; - - inputElement.setAttribute( 'autocomplete', 'off' ); - - const debouncedRequest = debounce( ( searchValue: string ) => { + /** + * Request data from the server. Debounce the request to avoid flooding the server. + */ + const debouncedSearchRequest = debounce( ( searchValue: string ) => { addLoadingIcon( resultsContainer ); requestData( searchValue, postTypesArray ).then( r => { removeLoadingIcon( block ); @@ -161,7 +183,7 @@ domReady( () => { resultsContainer = createResultsContainer( wrap, resultsContainer, block, inputStyle ); } - debouncedRequest( searchValue ); + debouncedSearchRequest( searchValue ); }); // Open the results container when the input is focused @@ -171,11 +193,12 @@ domReady( () => { resultsContainer = createResultsContainer( wrap, resultsContainer, block, inputStyle ); if ( resultsContainer && ! resultsContainer.querySelector( '.search-results > :not(.spinner-container):not(.no-results)' ) ) { - debouncedRequest( ( inputElement as HTMLInputElement ).value ); + debouncedSearchRequest( ( inputElement as HTMLInputElement ).value ); } } }); + // Navigate through the results with the arrow keys. inputElement.addEventListener( 'keydown', ( event: Event ) => { if ( ! resultsContainer || ! resultsContainer.parentElement ) { return; @@ -234,8 +257,28 @@ domReady( () => { }); }; - liveSearch.forEach( handleLiveSearch ); - + // Initialize the live search for each block on the page when it becomes visible. + let observer = new IntersectionObserver( ( entries, observer ) => { + entries.forEach( entry => { + if ( entry.isIntersecting ) { + initializeLiveSearch( entry.target ); + observer.unobserve( entry.target ); + } + }); + }); + + liveSearch.forEach( element => observer.observe( element ) ); + + /** + * Creates a container for search results and appends it to the provided wrap element. + * If a resultsContainer is provided and a search_results element is not found in the block, the resultsContainer is appended to the wrap element. + * Otherwise, a new container is created and appended to the wrap element. + * @param wrap - The element to which the results container will be appended. + * @param resultsContainer - The pre-existing results container to be appended to the wrap element if a search_results element is not found in the block. + * @param block - The block element to which the wrap element will be appended. + * @param inputStyle - The CSSStyleDeclaration object containing the style properties of the input element. + * @returns The created results container. + */ const createResultsContainer = ( wrap: Element, resultsContainer: ResultsContainer, block: Element | null, inputStyle: CSSStyleDeclaration ) => { wrap.innerHTML = ''; @@ -260,6 +303,14 @@ domReady( () => { return container; }; + /** + * Removes the results container from the given block element. + * + * @param block - The block element to remove the results container from. + * @param resultsContainer - The results container to remove. + * @param cache - Whether to cache the removed container for later use. + * @returns The removed container if `cache` is `true`, otherwise `null`. + */ const removeResultsContainer = ( block: Element | null, resultsContainer: ResultsContainer, cache = true ) => { const tmpResultsContainer = block?.querySelector( '.container-wrap' ); if ( ! tmpResultsContainer ) { @@ -275,6 +326,14 @@ domReady( () => { return null; }; + /** + * Updates the search results in the specified block with the given search value and results. + * + * @param searchValue - The search value to use for filtering the results. + * @param block - The block element to update the results in. + * @param results - The array of results to display. + * @param inputElement - The input element used for the search. + */ const updateResults = ( searchValue: string, block: Element | null, results: Array, inputElement: Element ) => { const container = block?.querySelector( `.${CONTAINER_CLASS}` ); if ( ! container ) { @@ -310,6 +369,11 @@ domReady( () => { }); }; + /** + * Adds a loading icon to the specified results container. + * + * @param container - The container to add the loading icon to. + */ const addLoadingIcon = ( container: ResultsContainer ) => { if ( ! container || container.querySelector( '.spinner-container' ) ) { return; @@ -323,6 +387,11 @@ domReady( () => { container?.appendChild( loading ); }; + /** + * Removes the loading icon from the specified block element. + * + * @param block - The block element to remove the loading icon from. + */ const removeLoadingIcon = ( block: Element | null ) => { const container = block?.querySelector( `.${CONTAINER_CLASS}` ); if ( ! container ) { @@ -335,6 +404,11 @@ domReady( () => { } }; + /** + * Highlights the given element with a background color based on the input element's background color. + * @param element - The element to highlight. + * @param input - The input element to get the background color from. + */ const highlight = ( element: HTMLElement, input: Element ) => { // Determine the background color for a light/dark theme @@ -346,11 +420,22 @@ domReady( () => { element.style.backgroundColor = isDark ? 'rgba(255, 255, 255, 0.12)' : 'rgba(49, 50, 51, 0.12)'; }; + /** + * Removes the 'highlight' class and 'style' attribute from the given element. + * @param element - The element to remove the 'highlight' class and 'style' attribute from. + */ const removeHighlight = ( element: Element ) => { element.classList.remove( 'highlight' ); element.removeAttribute( 'style' ); }; + /** + * Returns a DOM element representing a search result. + * @param entry - The search result entry. + * @param index - The index of the search result. + * @param inputElement - The input element used for the search. + * @returns A DOM element representing the search result. + */ const getResultElement = ( entry: ResultsEntry, index: number, inputElement: Element ) => { const optionWrap = document.createElement( 'div' ); const option = document.createElement( 'a' ); diff --git a/src/blocks/frontend/sticky/index.ts b/src/blocks/frontend/sticky/index.ts index d640561e5..ec19c1281 100644 --- a/src/blocks/frontend/sticky/index.ts +++ b/src/blocks/frontend/sticky/index.ts @@ -766,7 +766,6 @@ domReady( () => { // create an Observer instance const resizeObserver = new ResizeObserver( entries => { - console.log( 'Body height changed:', entries?.[0]?.target.clientHeight ); if ( entries?.[0]?.target.clientHeight ) { runner.updateTriggers(); } diff --git a/src/blocks/global.d.ts b/src/blocks/global.d.ts index ca4317afd..da2f3b16c 100644 --- a/src/blocks/global.d.ts +++ b/src/blocks/global.d.ts @@ -1,3 +1,49 @@ +type TrackingData = { + block?: string; + env?: string; + action?: 'block-created' | 'block-updated' | 'block-deleted'; + feature?: string; + groupID?: string; + featureComponent?: string; + featureValue?: string; + hasOpenAIKey?: boolean; + usedTheme?: string; +}; + +type EventResponse = { + error?: string; + success?: boolean; + response?: any; +}; + +type EventOptions = { + directSave?: boolean; + consent?: boolean; + refreshTimer?: boolean; + sendNow?: boolean; + ignoreLimit?: boolean; +}; + +interface EventTrackingAccumulatorWithPlugin { + add: ( data: TrackingData, options?: EventOptions ) => string; + set: ( key: string, data: TrackingData, options?: EventOptions ) => void; + base: EventTrackingAccumulator; +} + +interface EventTrackingAccumulator { + subscribe( callback: ( response: EventResponse ) => void ): () => void; + hasConsent(): boolean; + sendBulkTracking( payload: Array ): Promise; + trkMetadata( data: TrackingData ): TrackingData; + with( pluginSlug: string ): EventTrackingAccumulatorWithPlugin; + uploadEvents(): Promise; + sendIfLimitReached(): Promise | undefined; + start(): void; + stop(): void; + refreshTimer(): void; + clone(): EventTrackingAccumulator; +} + declare global { interface Window { themeisleGutenberg?: { @@ -103,7 +149,9 @@ declare global { }, oSavedStates?: { [key: string]: any - } + }, + oTrk?: EventTrackingAccumulatorWithPlugin + tiTrk?: EventTrackingAccumulator } } diff --git a/src/blocks/helpers/block-utility.js b/src/blocks/helpers/block-utility.js index 9002de069..10b7b74f7 100644 --- a/src/blocks/helpers/block-utility.js +++ b/src/blocks/helpers/block-utility.js @@ -299,8 +299,8 @@ export const blockInit = ( clientId, defaultAttributes ) => { /** * Create a Style node for handling `head` Node change when working in a Tablet, Mobile mode or in FSE Editor. * - * @param {OtterNodeCSSOptions } options The options. - * @returns {OtterNodeCSSReturn} The name of the node and function handler. + * @param {import('./blocks.js').OtterNodeCSSOptions } options The options. + * @returns {import('./blocks.js').OtterNodeCSSReturn} The name of the node and function handler. */ export const useCSSNode = ( options = {}) => { const [ cssList, setCSSProps ] = useState({ @@ -392,9 +392,9 @@ export const useCSSNode = ( options = {}) => { .map( x => { const [ css, media ] = x; if ( media ) { - return `${media} { \n\t .${settings.cssNodeName} ${css} }`; + return `${media} { \n\t .${settings.cssNodeName}${options?.appendToRoot ? '' : ' '}${css} }`; } - return `.${settings.cssNodeName} ${css}`; + return `.${settings.cssNodeName}${options?.appendToRoot ? '' : ' '}${css}`; }) .join( '\n' ) || ''; settings.node.textContent = text; @@ -574,4 +574,22 @@ export function useTabSwitch( key, defaultValue ) { return [ tab, setTab ]; } +/** + * Get all registered patterns. + * + * @returns {Array.<{name: string, title: string, content: string, categories: string[], source: string | undefined, blockTypes: string[]|undefined}>} + */ +export function pullPatterns() { + return select( 'core' )?.getBlockPatterns() ?? []; +} + +/** + * Get all registered patterns that are part of the Otter Blocks category. + * + * @returns {{name: string, title: string, content: string, categories: string[], source: (string|undefined), blockTypes: (string[]|undefined)}[]} + */ +export function pullOtterPatterns() { + return pullPatterns().filter( pattern => pattern?.name?.startsWith( 'otter-blocks/' ) || pattern?.name?.startsWith( 'otter-pro/' ) ); +} + diff --git a/src/blocks/helpers/blocks.d.ts b/src/blocks/helpers/blocks.d.ts index 5c778cd8c..c409314d2 100644 --- a/src/blocks/helpers/blocks.d.ts +++ b/src/blocks/helpers/blocks.d.ts @@ -49,7 +49,8 @@ export type BoxShadow = { } export type OtterNodeCSSOptions = { - selector: string + selector?: string + appendToRoot?: boolean } export type OtterSetNodeCSS = ( css: string[], media?: string[]) => void; diff --git a/src/blocks/helpers/defered-wp-options-save.js b/src/blocks/helpers/defered-wp-options-save.js index 8f6976107..2a2e82ef2 100644 --- a/src/blocks/helpers/defered-wp-options-save.js +++ b/src/blocks/helpers/defered-wp-options-save.js @@ -1,5 +1,5 @@ import api from '@wordpress/api'; -import { pick } from 'lodash'; +import { isFunction, isObject, isObjectLike, pick } from 'lodash'; class DeferredWpOptionsSave { constructor() { @@ -23,10 +23,20 @@ class DeferredWpOptionsSave { return this; } + /** + * Create a new instance of the Settings model that can fetch the WP Options. + * @returns {api.models.Settings} + */ createSettings() { return ( new api.models.Settings() ); } + /** + * Save the option to the server. + * @param {string} optionType - The option type to save. Internal identifier. + * @param {string|number|array|object|((currentValue: any) => any)} value - The value to save. It can be a function that receives the current value and returns the new value. If it does not exists, it will receive null. + * @param {(options: Object, error: any|null) => void} callback - The callback to call after the save is done. It will receive the response from the server and the error if any. + */ save( optionType, value, callback = () => {}) { this.changes.push({ optionType, value, callback }); @@ -47,9 +57,24 @@ class DeferredWpOptionsSave { signal: this.abort.signal }).done( ( response ) => { + // Get the WP options. this.wpOptions = response; + + /** + * We will store the options that changed in a Set. + * @type {Set} + */ const optionsChanged = new Set(); + + /** + * Apply the changes to the options. + */ this.changes.forEach( ( change ) => { + const payload = isFunction( change.value ) ? change.value( null ) : change.value; + + /** + * Options related to individual fields. + */ if ( 'field_options' === change.optionType && this.wpOptions['themeisle_blocks_form_fields_option']) { const fieldOptions = this.wpOptions['themeisle_blocks_form_fields_option']; @@ -58,20 +83,21 @@ class DeferredWpOptionsSave { } const fieldIndex = fieldOptions.findIndex( ( field ) => { - - // console.log( field.fieldOptionName, change.value.fieldOptionName ); - return field.fieldOptionName === change.value.fieldOptionName; + return field.fieldOptionName === payload.fieldOptionName; }); if ( -1 !== fieldIndex ) { - fieldOptions[fieldIndex] = change.value; + fieldOptions[fieldIndex] = isFunction( change.value ) ? change.value( fieldOptions[fieldIndex]) : payload; } else { - fieldOptions.push( change.value ); + fieldOptions.push( payload ); } optionsChanged.add( 'themeisle_blocks_form_fields_option' ); } + /** + * Options related to the form. + */ if ( 'form_options' === change.optionType && this.wpOptions['themeisle_blocks_form_emails']) { const formOptions = this.wpOptions['themeisle_blocks_form_emails']; @@ -79,22 +105,22 @@ class DeferredWpOptionsSave { return; } - const formIndex = formOptions.findIndex( ({ form }) => form === change.value.form ); + const formIndex = formOptions.findIndex( ({ form }) => form === payload.form ); if ( -1 !== formIndex ) { - formOptions[formIndex] = change.value; + formOptions[formIndex] = isFunction( change.value ) ? change.value( formOptions[formIndex]) : payload; } else { - formOptions.push( change.value ); + formOptions.push( payload ); } optionsChanged.add( 'themeisle_blocks_form_emails' ); } }); + // Pick only the options that changed. const dataToSave = pick( this.wpOptions, Array.from( optionsChanged ) ); - console.log( 'Data send', { data: dataToSave }); // TODO: Remove after QA - + // Save the options. ( new api.models.Settings( dataToSave ) ) .save( ) .then( ( response ) => { diff --git a/src/blocks/helpers/helper-functions.js b/src/blocks/helpers/helper-functions.js index c203d1a8a..eeabef5d5 100644 --- a/src/blocks/helpers/helper-functions.js +++ b/src/blocks/helpers/helper-functions.js @@ -369,6 +369,7 @@ export const lightnessFromColor = color => { * @return {string} */ export const boxValues = ( box = {}, defaultBox = {}) => { + box ??= {}; return `${ box?.top ?? defaultBox?.top ?? '0px' } ${ box?.right ?? defaultBox?.right ?? '0px' } ${ box?.bottom ?? defaultBox?.bottom ?? '0px' } ${ box?.left ?? defaultBox?.left ?? '0px' }`; }; diff --git a/src/blocks/helpers/icons.js b/src/blocks/helpers/icons.js index 37168c5b0..57bab4c96 100644 --- a/src/blocks/helpers/icons.js +++ b/src/blocks/helpers/icons.js @@ -658,7 +658,7 @@ export const popupWithImageAndText = ( ); export const aiGeneration = ( - + @@ -755,3 +755,94 @@ export const formAiGeneration = ( ); + +export const contentAiGenerationIcon = ( props = {}) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export const aiLayoutGeneratorIcon = ( props = {}) => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export const comparisonTableIcon = ( props = {}) => ( + + + + + + + + + + + + + + + + + + + +); diff --git a/src/blocks/helpers/index.js b/src/blocks/helpers/index.js index 39dc84803..bc82a1dfc 100644 --- a/src/blocks/helpers/index.js +++ b/src/blocks/helpers/index.js @@ -1,6 +1,7 @@ /** * Internal dependencies */ +import domReady from '@wordpress/dom-ready'; import { blockInit } from './block-utility.js'; import * as icons from './icons.js'; @@ -12,3 +13,7 @@ window.otterUtils = {}; window.otterUtils.blockInit = blockInit; window.otterUtils.icons = icons; window.otterUtils.useSettings = useSettings; + +domReady( () => { + window.oTrk = window?.tiTrk?.with( 'otter' ); +}); diff --git a/src/blocks/helpers/prompt.ts b/src/blocks/helpers/prompt.ts index 97dfb550d..0ea046b48 100644 --- a/src/blocks/helpers/prompt.ts +++ b/src/blocks/helpers/prompt.ts @@ -2,11 +2,6 @@ import { createBlock } from '@wordpress/blocks'; import apiFetch from '@wordpress/api-fetch'; import { addQueryArgs } from '@wordpress/url'; -type PromptResponse = { - result: string - error?: string -} - type OpenAiSettings = { model?: string temperature?: number @@ -61,13 +56,15 @@ type FormResponse = { }[] } +export type PromptConversation = { + role: string + content: string +} + export type PromptData = { otter_name: string model: string - messages: { - role: string - content: string - }[] + messages: PromptConversation[] functions: { name: string description: string @@ -76,7 +73,8 @@ export type PromptData = { function_call: { [key: string]: string } -} & Record + [key: `otter_${string}`]: any +} export type PromptsData = PromptData[] @@ -99,6 +97,7 @@ function promptRequestBuilder( settings?: OpenAiSettings ) { // TODO: remove the apiKey from the function definition. return async( prompt: string, embeddedPrompt: PromptData, metadata: Record ) => { + const body = { ...embeddedPrompt, messages: embeddedPrompt.messages.map( ( message ) => { @@ -177,26 +176,13 @@ const fieldMapping = { }; -export function parseToDisplayPromptResponse( promptResponse: string ) { - const response = tryParseResponse( promptResponse ) as FormResponse|undefined; - - if ( ! response ) { - return []; - } - - return response?.fields.map( ( field ) => { - return { - label: field?.label, - type: field?.type, - placeholder: field?.placeholder, - helpText: field?.helpText, - options: field?.choices?.join( '\n' ), - allowedFileTypes: field?.allowedFileTypes - }; - }).filter( Boolean ); -} - -function tryParseResponse( promptResponse: string ) { +/** + * Small helper to try to parse a prompt response without throwing an error. + * + * @param promptResponse - The prompt response to parse. + * @returns - The parsed response or undefined. + */ +export function tryParseResponse( promptResponse: string ) { try { return JSON.parse( promptResponse ); } catch ( e ) { @@ -204,6 +190,12 @@ function tryParseResponse( promptResponse: string ) { } } +/** + * Create a block from a form prompt response. + * + * @param promptResponse - The prompt response to parse. + * @returns - An array of blocks Form field blocks. + */ export function parseFormPromptResponseToBlocks( promptResponse: string ) { if ( ! promptResponse ) { return []; @@ -231,6 +223,12 @@ export function parseFormPromptResponseToBlocks( promptResponse: string ) { }).filter( Boolean ); } +/** + * Retrieves an embedded prompt from the server. + * + * @param promptName - The name of the prompt to retrieve. If not provided, the default prompt is retrieved. + * @returns - A promise that resolves to the server's response. + */ export function retrieveEmbeddedPrompt( promptName ?: string ) { return apiFetch({ path: addQueryArgs( '/otter/v1/prompt', { @@ -240,6 +238,13 @@ export function retrieveEmbeddedPrompt( promptName ?: string ) { }); } +/** + * This function injects an action into an existing prompt. + * + * @param embeddedPrompt - The existing prompt data. + * @param actionPrompt - The action to be injected. + * @returns - The updated prompt data with the action injected. + */ export function injectActionIntoPrompt( embeddedPrompt: PromptData, actionPrompt: string ): PromptData { return { ...embeddedPrompt, @@ -255,3 +260,29 @@ export function injectActionIntoPrompt( embeddedPrompt: PromptData, actionPrompt }) } as PromptData; } + +/** + * This function injects a conversation into an existing prompt. + * + * @param embeddedPrompt - The existing prompt data. + * @param conversation - The conversation to be injected. + * @returns - The updated prompt data with the conversation injected. + */ +export function injectConversationIntoPrompt( embeddedPrompt: PromptData, conversation: PromptConversation ): PromptData { + + const { messages } = embeddedPrompt; + const lastUserMessageIndex = messages.map( ( message ) => message.role ).lastIndexOf( 'user' ); + + if ( -1 === lastUserMessageIndex ) { + return embeddedPrompt; + } + + return { + ...embeddedPrompt, + messages: [ + ...messages.slice( 0, lastUserMessageIndex ), + conversation, + ...messages.slice( lastUserMessageIndex ) + ] + }; +} diff --git a/src/blocks/index.js b/src/blocks/index.js index 41f66b3b2..210801eaa 100644 --- a/src/blocks/index.js +++ b/src/blocks/index.js @@ -7,7 +7,7 @@ import { updateCategory } from '@wordpress/blocks'; import { Icon } from '@wordpress/components'; -import { dispatch } from '@wordpress/data'; +import { dispatch, select } from '@wordpress/data'; import domReady from '@wordpress/dom-ready'; @@ -15,6 +15,8 @@ import { render } from '@wordpress/element'; import { addFilter } from '@wordpress/hooks'; +import apiFetch from '@wordpress/api-fetch'; + /** * Internal dependencies */ @@ -88,7 +90,54 @@ if ( Boolean( window.themeisleGutenberg.should_show_upsell ) ) { ); } +/** + * Hide blocks in inserter based on the `themeisle_disabled_blocks` setting. + */ +const hideBlocksInInserter = () => { + + /** + * Since some variations are based on core blocks, they need to be unregistered and registered again with an empty scope. + */ + + const variationsMap = { + 'themeisle-gutenberg/masonry': 'core/gallery', + 'themeisle-gutenberg/live-search': 'core/search' + }; + + /** + * Check if the block is a variation. + * @param blockSlug The block slug. + * @returns {boolean} True if the block is a variation. + */ + const isVariation = ( blockSlug ) => { + return variationsMap.hasOwnProperty( blockSlug ); + }; + + const hiddenBlocks = select( 'core/preferences' )?.get( 'core/edit-post', 'hiddenBlockTypes' ) || []; + + hiddenBlocks.forEach( blockName => { + if ( isVariation( blockName ) ) { + const parentBlockName = variationsMap[blockName]; + const blockVariations = wp?.blocks?.getBlockVariations( parentBlockName ); + const blockRegistration = blockVariations.find( block => block.name === blockName ); + + if ( ! blockRegistration ) { + return; + } + + wp?.blocks?.unregisterBlockVariation( parentBlockName, blockName ); + blockRegistration.scope = []; + wp?.blocks?.registerBlockVariation( parentBlockName, blockRegistration ); + } + }); +}; + domReady( () => { + + setTimeout( () => { + hideBlocksInInserter(); + }, 500 ); + if ( document.querySelector( 'svg.o-icon-gradient' ) ) { return; } diff --git a/src/blocks/plugins/ai-content/index.tsx b/src/blocks/plugins/ai-content/index.tsx index 654a7f90b..b4fd6a280 100644 --- a/src/blocks/plugins/ai-content/index.tsx +++ b/src/blocks/plugins/ai-content/index.tsx @@ -87,14 +87,17 @@ const withConditions = createHigherOrderComponent( BlockEdit => { const { isMultipleSelection, areValidBlocks, - selectedBlocks + selectedBlocks, + isHidden } = useSelect( ( select ) => { const selectedBlocks = select( 'core/block-editor' ).getMultiSelectedBlocks(); + const hiddenBlocks = select( 'core/preferences' )?.get( 'core/edit-post', 'hiddenBlockTypes' ) || []; return { isMultipleSelection: 1 < selectedBlocks.length, areValidBlocks: selectedBlocks.every( ( block ) => isValidBlock( block.name ) ), - selectedBlocks + selectedBlocks, + isHidden: hiddenBlocks.find( ( blockName: string ) => 'themeisle-blocks/content-generator' === blockName ) ?? false }; }, []); @@ -158,6 +161,9 @@ const withConditions = createHigherOrderComponent( BlockEdit => { } setIsProcessing( prevState => ({ ...prevState, [ actionKey ]: true }) ); + + window.oTrk?.add({ feature: 'ai-generation', featureComponent: 'ai-toolbar', featureValue: actionKey }, { consent: true }); + sendPromptToOpenAI( content, injectActionIntoPrompt( @@ -227,8 +233,13 @@ const withConditions = createHigherOrderComponent( BlockEdit => { return ( - {( - ( isValidBlock( props.name ) && props.isSelected ) || ( areValidBlocks && isMultipleSelection ) ) && + { + ( + ! isHidden && + ( + ( isValidBlock( props.name ) && props.isSelected ) || ( areValidBlocks && isMultipleSelection ) + ) + ) && ( diff --git a/src/blocks/plugins/conditions/edit.js b/src/blocks/plugins/conditions/edit.js index 83fe53b43..e754b94da 100644 --- a/src/blocks/plugins/conditions/edit.js +++ b/src/blocks/plugins/conditions/edit.js @@ -13,7 +13,7 @@ import { PanelBody, SelectControl, Spinner, - Placeholder + Placeholder, ToggleControl } from '@wordpress/components'; import { useSelect } from '@wordpress/data'; @@ -118,6 +118,12 @@ const defaultConditions = { 'advance': { label: __( 'Advance', 'otter-blocks' ), conditions: [ + { + value: 'screenSize', + label: __( 'Screen Size', 'otter-blocks' ), + help: __( 'The selected block will be invisible based on the screen size.' ), + toggleVisibility: true + }, { value: 'queryString', label: __( 'Query String (Pro)', 'otter-blocks' ), @@ -261,7 +267,8 @@ const Separator = ({ label }) => { const Edit = ({ attributes, - setAttributes: _setAttributes + setAttributes: _setAttributes, + name }) => { const [ buffer, setBuffer ] = useState( null ); const [ conditions, setConditions ] = useState({}); @@ -359,6 +366,8 @@ const Edit = ({ }; const changeCondition = ( value, index, key ) => { + window.oTrk?.set( `condition-type_${attributes?.id ?? name}_${index}_${key}`, { groupID: attributes?.id ?? name, feature: 'condition', featureComponent: 'condition-type', featureValue: value }); + const otterConditions = [ ...attributes.otterConditions ]; const attrs = applyFilters( 'otter.blockConditions.defaults', {}, value ); @@ -367,6 +376,10 @@ const Edit = ({ attrs.visibility = true; } + if ( 'screenSize' === value ) { + attrs['screen_sizes'] = []; + } + if ( 'none' === value ) { otterConditions[ index ][ key ] = {}; } else { @@ -379,6 +392,14 @@ const Edit = ({ setAttributes({ otterConditions }); }; + /** + * Change the value of the condition in the nested array. + * + * @param {any} value The value to set. + * @param {number} index The index of the group. + * @param {number} key The index of the condition. + * @param {string} type The type of the condition. + */ const changeArrayValue = ( value, index, key, type ) => { const otterConditions = [ ...attributes.otterConditions ]; otterConditions[ index ][ key ][ type ] = value; @@ -401,6 +422,24 @@ const Edit = ({ setAttributes({ otterConditions }); }; + /** + * Toggle the value of the condition in the nested array. + * + * @param {any} value The value to set. + * @param {number} index The index of the group. + * @param {number} key The index of the condition. + * @param {string} type The type of the condition. + */ + const toggleValueInArray = ( value, index, key, type ) => { + const otterConditions = [ ...attributes.otterConditions ]; + if ( otterConditions[ index ][ key ][ type ]?.includes( value ) ) { + otterConditions[ index ][ key ][ type ] = otterConditions[ index ][ key ][ type ].filter( v => v !== value ); + } else { + otterConditions[ index ][ key ][ type ]?.push( value ); + } + setAttributes({ otterConditions }); + }; + return ( removeGroup( index ) } > - { group && group.map( ( i, n ) => ( - + { group && group.map( ( condObj, condIdx ) => ( + condition.value === ( i.type || 'none' ) )?.help } - id={ `o-conditions-${ index }-${ n }` } + help={ flatConditions.find( condition => condition.value === ( condObj.type || 'none' ) )?.help } + id={ `o-conditions-${ index }-${ condIdx }` } > - { 'userRoles' === i.type && ( + { 'userRoles' === condObj.type && ( changeArrayValue( roles, index, n, 'roles' ) } + onChange={ roles => changeArrayValue( roles, index, condIdx, 'roles' ) } __experimentalExpandOnFocus={ true } __experimentalValidateInput={ newValue => Object.keys( window.themeisleGutenberg.userRoles ).includes( newValue ) } /> ) } - { 'postAuthor' === i.type && ( + { 'postAuthor' === condObj.type && ( changeArrayValue( authors, index, n, 'authors' ) } + value={ condObj.authors } + onChange={ authors => changeArrayValue( authors, index, condIdx, 'authors' ) } /> ) } - { 'postCategory' === i.type && ( + { 'postCategory' === condObj.type && ( changeArrayValue( categories, index, n, 'categories' ) } + value={ condObj.categories } + onChange={ categories => changeArrayValue( categories, index, condIdx, 'categories' ) } /> ) } - { 'postType' === i.type && ( + { 'postType' === condObj.type && ( changeArrayValue( types, index, n, 'post_types' ) } + onChange={ types => changeArrayValue( types, index, condIdx, 'post_types' ) } __experimentalExpandOnFocus={ true } __experimentalValidateInput={ newValue => postTypes.includes( newValue ) } /> ) } - { 'stripePurchaseHistory' === i.type && ( + { 'screenSize' === condObj.type && ( + + toggleValueInArray( 'mobile', index, condIdx, 'screen_sizes' )} + /> + toggleValueInArray( 'tablet', index, condIdx, 'screen_sizes' )} + /> + toggleValueInArray( 'desktop', index, condIdx, 'screen_sizes' )} + /> + + ) } + + { 'stripePurchaseHistory' === condObj.type && ( { Boolean( window.themeisleGutenberg.hasStripeAPI ) && ( changeValue( product, index, n, 'product' ) } + product={ condObj.product } + onChange={ product => changeValue( product, index, condIdx, 'product' ) } /> ) } @@ -499,9 +558,9 @@ const Edit = ({ ) } - { applyFilters( 'otter.blockConditions.controls', '', index, n, i, attributes.otterConditions, setAttributes, changeValue ) } + { applyFilters( 'otter.blockConditions.controls', '', index, condIdx, condObj, attributes.otterConditions, setAttributes, changeValue ) } - { toggleVisibility.includes( i.type ) && ( + { toggleVisibility.includes( condObj.type ) && ( changeVisibility( e, index, n ) } + value={ condObj.visibility } + onChange={ e => changeVisibility( e, index, condIdx ) } /> ) } - { ( 1 < group.length && n !== group.length - 1 ) && ( + { ( 1 < group.length && condIdx !== group.length - 1 ) && ( ) } diff --git a/src/blocks/plugins/css-handler/index.js b/src/blocks/plugins/css-handler/index.js index f5811c312..0b0a18681 100644 --- a/src/blocks/plugins/css-handler/index.js +++ b/src/blocks/plugins/css-handler/index.js @@ -141,6 +141,7 @@ subscribe( () => { }); if ( ( isPublishing || ( postPublished && isSaving ) ) && ! isAutoSaving && ! isSavingCSS ) { + window.oTrk?.base.uploadEvents(); isSavingCSS = true; savePostMeta(); } diff --git a/src/blocks/plugins/dynamic-content/link/fields.js b/src/blocks/plugins/dynamic-content/link/fields.js index 4bfa0b01c..004c31727 100644 --- a/src/blocks/plugins/dynamic-content/link/fields.js +++ b/src/blocks/plugins/dynamic-content/link/fields.js @@ -62,7 +62,10 @@ const Fields = ({ > { __( 'Deselect', 'otter-blocks' ) } diff --git a/src/blocks/plugins/feedback/index.js b/src/blocks/plugins/feedback/index.js index 935be9144..a7a981b60 100644 --- a/src/blocks/plugins/feedback/index.js +++ b/src/blocks/plugins/feedback/index.js @@ -102,7 +102,10 @@ const FeedbackModal = ( isLink={ 'link' === variant } isSecondary={ 'secondary' === variant } isPrimary={ 'primary' === variant } - onClick={() => setIsOpen( ! isOpen )} + onClick={() => { + window.oTrk?.add({ feature: 'feedback', featureComponent: 'open-button' }); + setIsOpen( ! isOpen ); + }} > { text } diff --git a/src/blocks/plugins/options/editor.scss b/src/blocks/plugins/options/editor.scss index ef13e0e77..b399ef9d9 100644 --- a/src/blocks/plugins/options/editor.scss +++ b/src/blocks/plugins/options/editor.scss @@ -156,9 +156,12 @@ } } - .components-base-control, - .o-responsive-control { - padding: 10px; + :is( + .components-unit-control-wrapper, + .components-base-control, + .o-responsive-control + ) { + padding-left: 10px; margin: 0; } @@ -174,19 +177,28 @@ margin-bottom: 1em; } - .components-base-control { + :is(.components-base-control, .components-font-size-picker__header ) { padding: 0; } + } - .components-font-size-picker__header { - padding: 0; - } + :is( + .o-typo-header, + .o-control-panel-control, + .components-font-size-picker__header, + .component-box-control__header, + .component-box-control__header-control-wrapper + ) { + padding-left: 10px; } - .components-font-size-picker__header, - .component-box-control__header, - .component-box-control__header-control-wrapper { - padding: 0 10px; + .o-responsive-control :is( + .components-base-control, + .component-box-control__header, + .components-font-size-picker__header, + .component-box-control__header-control-wrapper + ) { + padding: 0; } .components-font-size-picker__controls { diff --git a/src/blocks/plugins/options/global-defaults/controls/heading.js b/src/blocks/plugins/options/global-defaults/controls/heading.js new file mode 100644 index 000000000..f03629170 --- /dev/null +++ b/src/blocks/plugins/options/global-defaults/controls/heading.js @@ -0,0 +1,299 @@ +/** + * WordPress dependencies + */ +import { __ } from '@wordpress/i18n'; + +import { + __experimentalColorGradientControl as ColorGradientControl, + PanelColorSettings +} from '@wordpress/block-editor'; + +import { + PanelBody, + RangeControl, + ToggleControl, + __experimentalBoxControl as BoxControl +} from '@wordpress/components'; + +import { + Fragment +} from '@wordpress/element'; + +import { + isObjectLike +} from 'lodash'; + +import { _px, compactObject } from '../../../../helpers/helper-functions'; +import { useResponsiveAttributes } from '../../../../helpers/utility-hooks'; +import { ControlPanelControl, ResponsiveControl } from '../../../../components'; +import { makeBox } from '../../../copy-paste/utils'; +import TypographySelectorControl from '../../../../components/typography-selector-control'; + +const Heading = ({ + blockName, + defaults: attributes, + changeConfig +}) => { + + const setAttributes = x => { + changeConfig( blockName, x ); + }; + + const { responsiveGetAttributes } = useResponsiveAttributes( setAttributes ); + + const oldPaddingDesktop = 'unlinked' === attributes.paddingType ? ({ + top: _px( attributes.paddingTop ) ?? '0px', + bottom: _px( attributes.paddingBottom ) ?? '0px', + right: _px( attributes.paddingRight ) ?? '0px', + left: _px( attributes.paddingLeft ) ?? '0px' + }) : ( isFinite( attributes.padding ) ? makeBox( _px( attributes.padding ) ) : { + top: '0px', + bottom: '0px', + right: '0px', + left: '0px' + }); + + const oldPaddingTablet = 'unlinked' === attributes.paddingTypeTablet ? ({ + top: _px( attributes.paddingTopTablet ) ?? '0px', + bottom: _px( attributes.paddingBottomTablet ) ?? '0px', + right: _px( attributes.paddingRightTablet ) ?? '0px', + left: _px( attributes.paddingLeftTablet ) ?? '0px' + }) : ( isFinite( attributes.paddingTablet ) ? makeBox( _px( attributes.paddingTablet ) ) : undefined ); + + const oldPaddingMobile = 'unlinked' === attributes.paddingTypeMobile ? ({ + top: _px( attributes.paddingTopMobile ) ?? '0px', + bottom: _px( attributes.paddingBottomMobile ) ?? '0px', + right: _px( attributes.paddingRightMobile ) ?? '0px', + left: _px( attributes.paddingLeftMobile ) ?? '0px' + }) : ( isFinite( attributes.paddingMobile ) ? makeBox( _px( attributes.paddingMobile ) ) : undefined ); + + const oldMarginDesktop = undefined === attributes.marginType ? ({ + top: _px( attributes.marginTop ) ?? '0px', + bottom: _px( attributes.marginBottom ) ?? '25px' + }) : ( isFinite( attributes.margin ) ? makeBox( _px( attributes.margin ) ) : undefined ); + + const oldMarginTablet = undefined === attributes.marginTypeTablet ? ({ + top: _px( attributes.marginTopTablet ) ?? '0px', + bottom: _px( attributes.marginBottomTablet ) ?? '0px' + }) : ( isFinite( attributes.marginTablet ) ? makeBox( _px( attributes.marginTablet ) ) : undefined ) ; + + const oldMarginMobile = undefined === attributes.marginTypeMobile ? ({ + top: _px( attributes.marginTopMobile ) ?? '0px', + bottom: _px( attributes.marginBottomMobile ) ?? '0px' + }) : ( isFinite( attributes.marginMobile ) ? makeBox( _px( attributes.marginMobile ) ) : undefined ); + + return ( + + + + + { + setAttributes({ + fontFamily: values.fontFamily, + lineHeight: values.lineHeight, + fontStyle: values.appearance, + textTransform: values.letterCase, + letterSpacing: values.spacing, + [responsiveGetAttributes([ 'fontSize', 'fontSizeTablet', 'fontSizeMobile' ]) ?? 'fontSize']: values.fontSize, + fontVariant: values.variant + }); + } } + + onReset={ field => { + if ( 'fontSize' === field ) { + setAttributes({ + [responsiveGetAttributes([ 'fontSize', 'fontSizeTablet', 'fontSizeMobile' ])]: undefined + }); + } else { + setAttributes({ + [fieldMapping[field]]: undefined + }); + } + }} + + allowVariants={true} + /> + + + + setAttributes({ headingColor }), + label: __( 'Text', 'otter-blocks' ), + isShownByDefault: true + }, + { + value: attributes.backgroundColor, + onChange: backgroundColor => setAttributes({ backgroundColor }), + label: __( 'Background', 'otter-blocks' ), + isShownByDefault: true + }, + { + value: attributes.linkColor, + onChange: linkColor => setAttributes({ linkColor }), + label: __( 'Link', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.linkHoverColor, + onChange: linkHoverColor => setAttributes({ linkHoverColor }), + label: __( 'Link Hover', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.highlightColor, + onChange: highlightColor => setAttributes({ highlightColor }), + label: __( 'Highlight Text', 'otter-blocks' ), + isShownByDefault: false + }, + { + value: attributes.highlightBackground, + onChange: highlightBackground => setAttributes({ highlightBackground }), + label: __( 'Highlight Background', 'otter-blocks' ), + isShownByDefault: false + } + ] } + /> + + + + { + setAttributes({ + [ responsiveGetAttributes([ 'padding', 'paddingTablet', 'paddingMobile' ]) ?? 'padding' ]: value + }); + } } + /> + + { + setAttributes({ + [ responsiveGetAttributes([ 'margin', 'marginTablet', 'marginMobile' ]) ?? 'margin' ]: value + }); + } } + sides={ [ 'top', 'bottom' ] } + /> + + + + + setAttributes({ textShadow }) } + /> + + { attributes.textShadow && ( + + setAttributes({ textShadowColor }) } + /> + + + setAttributes({ textShadowColorOpacity }) } + min={ 0 } + max={ 100 } + /> + + setAttributes({ textShadowBlur }) } + min={ 0 } + max={ 100 } + /> + + setAttributes({ textShadowHorizontal }) } + min={ -100 } + max={ 100 } + /> + + setAttributes({ textShadowVertical }) } + min={ -100 } + max={ 100 } + /> + + + + ) } + + + + ); +}; + +export default Heading; diff --git a/src/blocks/plugins/options/global-defaults/defaults.js b/src/blocks/plugins/options/global-defaults/defaults.js index 58015de2f..2471d23f9 100644 --- a/src/blocks/plugins/options/global-defaults/defaults.js +++ b/src/blocks/plugins/options/global-defaults/defaults.js @@ -9,7 +9,8 @@ const defaultsAttrs = { features: [] }, 'themeisle-blocks/form': {}, - 'themeisle-blocks/tabs': {} + 'themeisle-blocks/tabs': {}, + 'themeisle-blocks/advanced-heading': {} }; export default defaultsAttrs; diff --git a/src/blocks/plugins/options/index.js b/src/blocks/plugins/options/index.js index 4cb02a9e1..8d20a02a0 100644 --- a/src/blocks/plugins/options/index.js +++ b/src/blocks/plugins/options/index.js @@ -61,6 +61,7 @@ import SectionColumns from './global-defaults/controls/section-columns.js'; import SectionColumn from './global-defaults/controls/section-column.js'; import ReviewControl from './global-defaults/controls/review.js'; import Form from './global-defaults/controls/form.js'; +import Heading from './global-defaults/controls/heading.js'; import { otterIconColored } from '../../helpers/icons.js'; import Tabs from './global-defaults/controls/tabs'; import useSettings from '../../helpers/use-settings'; @@ -185,6 +186,8 @@ const Options = () => { for ( const option in object ) { defaultValues[ block ][ option ] = object[ option ]; } + + window.oTrk?.add({ feature: 'global-defaults', featureComponent: 'block', featureValue: block }); setBlockDefaults( defaultValues ); }; @@ -238,6 +241,10 @@ const Options = () => { name: 'themeisle-blocks/font-awesome-icons', control: FontAwesomeIcons }, + { + name: 'themeisle-blocks/advanced-heading', + control: Heading + }, { name: 'themeisle-blocks/review', control: ReviewControl diff --git a/src/blocks/test/e2e/assets/large-otter-post.html b/src/blocks/test/e2e/assets/large-otter-post.html deleted file mode 100644 index 50583eaeb..000000000 --- a/src/blocks/test/e2e/assets/large-otter-post.html +++ /dev/null @@ -1,7944 +0,0 @@ - -
-
- - - -
- - - - - -
- -
- - - -
- - - -
- - - -
- -
- - - -
-
-
- -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- -
- - - -
- -
-
- -
- -
-
- - - -
- -
- - - -
- - - -
- - - -
- -
- -
- - - -
-
-
Pills 錠剤
-
65
-
-
- - - -
- - - - - - - -
-
-
Skill
-
-
- 50%
-
-
- - - -
-
Skill
-
-
- - - -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- - - -
- -
- -
dfd
-
-
- -

sdfdsfsd

- -
-
- -
- - - -
-
- -
-
Untitled Tab
-
- -

hey hey

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
- - - -
- - - - - - - - - - - -
- - - -
-
-
- -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean - sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit - iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet - dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; - tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. - Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus - egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra - gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam - malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean - sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit - iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet - dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; - tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. - Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus - egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra - gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam - malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

- -
- - - -
- -
-
- https://www.youtube.com/watch?v=67tT2PbiWcI -
-
- -
- -
-
- - - -
- -
-
Skill
-
-
- - - -
- -
- -
Circle
-
-
- -
-
Skill
-
-
- -
-
- -
- - - -
-
-
- -
- -
-
Skill
-
-
- -
- - - -
- -
-
Skill
-
-
- -
- - - -
- -
-
Skill
-
-
- -
- -
-
- - - -
-
- -
-
Test 1
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor - facilisis non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu - sociosqu interdum.

- -
-
- - - -
-
Circle
-
- -
-
Skill
-
-
- -
-
- -
-
- -
- - - -
-
- -
- - - -
- - - -
- - - -
- - - -
-
- - - -

You agree to receive email communication from us by submitting this form - and understand that your contact information will be stored with us.

- - - -
-
-
- - - -
- -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

Block Text - Different languages

- - - -

- Lorem ipsum odor amet, consectetuer adipiscing elit. Cursus dignissim ultricies - fusce fermentum feugiat, morbi ex nunc. Molestie mattis finibus morbi magnis semper. In orci - varius est inceptos congue. Facilisi metus est vulputate parturient pellentesque. Egestas - quis habitant vel nostra per. Potenti penatibus augue magnis cubilia etiam maximus lacinia. - -

- - - -

- Lorem ipsum odor amet, consectetuer adipiscing elit. Mauris sagittis posuere fringilla integer - tristique dolor. Nascetur dapibus ipsum fusce euismod himenaeos. Sociosqu tellus lacinia dolor. Donec hac - velit donec vitae justo congue. Rutrum fames aptent convallis, nibh habitant vulputate. Integer nec accumsan - lacus ut nostra habitasse risus. Mauris integer curae feugiat malesuada tellus congue dis. Maecenas mattis - sociosqu nibh. Varius phasellus phasellus fringilla torquent! Tempus iaculis aenean ante sodales. Porta - potenti curabitur ex pulvinar eu rhoncus. -

- - - -

前ホタ初室モコ払対10女へ投能作ゃ産療質ドぎるお曜計カム嫉他わひごき徹下ヘセ浮直くほめだ式直にろそト提紙おぽは報対ミ崩際タ棋花政エシ向掲ラ図費高壌ろんだ。 - 情ざつご目整ネワエス言出ヘヨレフ者授ま車56西区ゅぜで融通ざるイひ被見山さラとス争味ぐこづ場合ネカ惑堂ロ転熱か男見ねで全返トぱそ直断伐だほぴず。 -

- - - -

Лорем ипсум долор сит амет, цу вим поссе фиерент сцаевола, ат дуо видерер адмодум дигниссим. Яуо татион инвидунт - глориатур цу. Проприае рецусабо алияуандо ет хис. Луцилиус хендрерит диссентиет сит еу, денияуе - алияуандо еу ест. Ат менандри праесент еос. -

- - - -

전인 광야에서 보내는 봄바람이다, 과실이 대중을 오직 황금시대다. 수 끓는 때까지 거친 이성은 같지 우리는 것이다. 피부가 넣는 - 얼음에 것은 하였으며, 아름다우냐? 이는 인류의 열락의 내려온 약동하다. 이상의 되려니와. 우리는 우리 바이며. 가는 이것은 인간의 이상 것이다. -

- - - -

Λορεμ ιπσθμ δολορ σιτ αμετ, περcιπιτθρ vολθπτατιβθσ ναμ θτ, νε μει ηαβεο νοvθμ σεμπερ. - Ιδ σεμπερ μανδαμθσ σεα. Ποστεα cονστιτθαμ πρι ει. Αν εστ ερατ πριμα. Περτιναξ cονσθλατθ γλοριατθρ - ηασ εθ, cετερο νοστρθδ ιραcθνδια ατ εστ, εξ ναμ μαλισ περcιπιτθρ. Qθοτ σινγθλισ νε πρι, τε vελ qθανδο - πονδερθμ εφφιcιαντθρ, παρτεμ γραεcο εθ σεα. -

- - - -

--- ·--· ····· -- ··· ··-· ·--· -· -- ···-- ····- ·-· -·- - ····- ----· --- ·--· ···- ····- ·· - -·-· --·- -· --· ·---- ·-·-·- -·- · --- - ·-·· ··--·· -· ··· -·· ·-·· ·-·-·- ·--- -··- ----- -· -·- -· ·---- - ··--- ··--·· ·-- ··· - --·- -··- -

- - - -

करती खरिदने मानसिक यन्त्रालय शीघ्र हुआआदी कार्यसिधान्तो मजबुत जाने पासपाई अर्थपुर्ण - जानते काम ढांचा उनका उसीएक् मुश्किले आंतरकार्यक्षमता चुनने संभव एकत्रित पहोचाना आंतरकार्यक्षमता - देते विशेष भोगोलिक वार्तालाप कार्यसिधान्तो समजते है।अभी पहोचाना सुना -

- - - -

For Arabic the text must go fom right to left

- - - -

بقسوة السيء وباستثناء في لكل, من وقد الأجل الشمال حاملات. أمدها تحرّك أفريقيا ثم لكل, إبّان طوكيو - وحلفاؤها لان في. ٣٠ هامش الطرفين جهة, ومن مئات مرمى في, ٣٠ ضرب دارت لهذه. تعد تم إستعمل لليابان, لدحر - سليمان، تم حتى, على أهّل تكبّد المشتّتون هو. لكل الجو الإطلاق أن. حتى القادة الشرق، إذ, به، - وبدأت التاريخ، عل.

- -
- - - -
- -

- 10.000 -

- - - -

- 30,00 -

- - - -

-20 -

- - - -

- 1,000,000 -

- - - -

- 1,000,000.23 -

- - - -

+32.3%

- - - -

-33.28$

- -
- - - -
- -
-
Skill
-
-
- - - -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- - - - - - - - - -
-
- -
-
-
-
-
-
- - - -
-
-
Skill
-
-
- 50%
-
-
- - - -
-
- -
-
Untitled Tab
-
- -

- -
-
- -
-
- - - - - - - -
- -
- - - -
-
Skill
-
-
- - - -
- -
- -
Title1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet cubilia - sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti vivamus non lectus - hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis elementum vivamus aliquet morbi - nam faucibus cubilia.

- -
-
- - - -
- -
Title 2
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci - sagittis laoreet cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus - potenti vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Title 3
-
-
- -
- -
- -
Sub Title 1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Sub Title 2
-
-
- -

No more dogs to pet.

- -
-
- -
- -
-
- - - -
- -
Title 4
-
-
- -
- -
- -
Sub Title 1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Sub Title 2
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- -
- -
-
- -
- - - -
-
-
-
-
0
-
Day
-
-
-
:
-
sep
-
-
-
0
-
Hour
-
-
-
:
-
sep
-
-
-
0
-
Minute
-
-
-
:
-
sep
-
-
-
0
-
Second
-
-
-
-
- - - -
-
- -
-
Title 1
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- -
-
- - - -
-
Title 2
-
- -

- -
-
- - - -
-
Title 3
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- -
-
- -
-
- - - - - -
- -
-
-
- -
- -

- This is an overline

- - - -

- An amazing Hero Title

- - - - - - - -

This is a description for the hero section. Synergestic actionables. - Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? -

- - - -
- - - - - - - -
- -
- -
-
- - - -
-
-
- -
- -
- This is an overline
- - - -

- Amazing hero titleadsfasdf

- - - - - - - -
-
-
-
-

adfasdf

-

sadfasdf

-
-
-
- -

dasfdsafadsfasdf

- -
-
-
- - - -

This is a description for the hero section. Synergestic actionables. - Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? -

- - - -
- - - -
- -
- - - -
- -
-
- -
-
T1
-
- -

asdfasdf

- -
-
- - - -
-
T2
-
- -

dafasdfasdfasdf

- -
-
- -
-
- -
- -
-
- -
- - - - - -
-
- -
Test
- - - -
Test
- - - -
Test
- - - -
Test
- - - -
Лорем ипсум долор сит амет, нец пробо епицуреи
- - - -
結ソアヤキ経日ノ面争ードひぐ空
- - - -
सहयोग किया क्षमता जानकारी ढांचामात्रुभाषा रचना
- - - -
ببعض الصينية بعض قد, مع دنو وحتّى حاملات. هو الا - والكوري الانجليزية. ما ببعض لبولندا، استطاعوا لها, لم هاربر كانتا والتي بلا. به، مع لهذه الإثنان, و لغات - أملاً دول, تُصب وشعار وصافرات ثم قبل.
- - - -
- Help Text
- - - -

You agree to receive email communication from us by submitting this form - and understand that your contact information will be stored with us.

- - - -
-
-
- - - -

Nice to meet - you | はじめまして | Rất vui được gặp bạn

- - - -
-
-
Bussines Hours | Öffnungszeiten
-
- -
-
Monday
-
09:00 AM - 01:00 PM
-
- - - -
-
Tuesday
-
09:00 AM - 03:00 PM
-
- - - -
-
Wednesday | der Mittwoch
-
09:00 AM - 04:00 PM
-
- - - -
-
Thursday
-
09:00 AM - 05:00 PM
-
- - - -
-
Friday
-
09:00 AM - 06:00 PM
-
- - - -
-
Saturday
-
Closed
-
- - - -
-
Sunday
-
Closed
-
- -
-
-
- - - -
-
-
- -
- -
-
-
-
- - - - - -

- Urban & Civil

- - - -

Our Urban design studio offering a full range of - urban design solutions for solutions for urban development projects.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Workplace

- - - -

We focus on strategically masterplanning cities. - Around the world, our multidisciplinary teams help to re-imagine urban environments for future - generations and work with governments to implement forward thinking strategic planning - strategies.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Hospitality

- - - -

With offices in North America, Africa, - South-East Asia and Australia, we are passionate about creating environments that address local - issues and contribute to a better world.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Residential

- - - -

From masterplans to remodels, we deliver an - exceptional customer experience with every step of the design process.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Interiors

- - - -

A building is more than just a structure. It's - an experience, it's recreation, it's a reflection of the community around it and its - inhabitants. We have developed a design process that combines deep research with a commitment to - urban planning and social responsibility.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Commercial

- - - -

All our products and services are aimed at - providing customers with an extra relaxation and comfort. We are working hard to create an - environment which would be appreciated by everyone looking for the best quality services.

- - - -
- - - -
- - - - - -
-
- -
- -
-
- - - -
-
-
-
-

Flip Front

-

Lorem ipsum odor amet, consectetuer adipiscing elit. Odio sagittis sagittis iaculis. Faucibus gravida - proin dis? Urna est sem. Dictumst semper cursus integer. Diam praesent cursus mattis scelerisque. -

-
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis justo - pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis non - quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu interdum.

- -
-
-
- - - -
-
-
- -
- -
-
-
- -
- -
-
- -
- - - -
- - - -
- - - -

You agree to receive email communication from us by - submitting this form and understand that your contact information will be stored - with us.

- - - -
-
-
- -
- - - -
- -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- -
- -
-
- - - -
-
-
- -
- -
-
- -
-
Untitled Tab -
-
- -

adf

- -
-
- - - -
-
Untitled Tab -
-
- -

asdfasdf

- -
-
- -
-
- -
- - - -
- -
- -
- -
-
- - - -
-
-
- -
- -
-
- -
-
Accordion -
-
- -
- -
- -
asdf
-
-
- -

asdfasdf

- -
-
- -
- -
-
- - - -
-
Tabs
-
- -
-
- -
-
Untitled Tab
-
- -
-
- -
-
Untitled Tab
-
- -

sfasdf

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
-
- - - -
-
Untitled Tab
-
- -

wertwert

- -
-
- - - -
-
Untitled Tab
-
- -

ewrtwert

- -
-
- - - -
-
Untitled Tab
-
- -

wertwert

- -
-
- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
-
- -
- -
- -
-

asdfasdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
- - - -

asd

-
- - - -
-

fs

-
- - - -
-

df

-
- - - -
-

sdf

-
- -
- - - -
- -
-

asdfasdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
- - - -

asd

-
- - - -
-

fs

-
- - - -
-

df

-
- - - -
-

sdf

-
- -
- -
- -
-
- - - -
-
-
- -
- -
-
-
- -
- -

- Essential

- - - - $59 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- - - -
- -

- Business

- - - - $129 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- - - -
- -

- VIP

- - - - $199 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- -
-
- -
- -
-
- - - -
-
-
- -
- -
-
-
- -
- -
-
-
Skill -
-
- -
- - - -
- -
-
-
- Skill
-
-
- 50%
-
-
- -
- -
-
- -
- -
-
- - - -
-
-
- -
- -
- -
- -
a1
-
-
- -
-
- -
-
- Untitled Tab
-
- -
- -
- -
a2
-
-
- -
-
- -
-
Untitled Tab
-
- -
- -
- -
a3
-
-
- -
-
- -
-
- Untitled Tab -
-
- -
- -
- -
- a4 -
-
-
- -

adsad -

- -
-
- -
- -
-
- - - -
-
- Untitled Tab -
-
- -

- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
- Untitled Tab
-
- -

- -
-
- -
-
- -
-
- -
- -
- -
-
- -
- -
-
- - - -
- -
-
- -
-
Small Text
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc turpis tristique finibus. Ex lectus - donec parturient. Vel nulla varius ornare. Dolor viverra vulputate accumsan. Vitae felis ligula - parturient.

- -
-
- - - -
-
Big Picture
-
- -
-
- -
-
- -
-
- - - -
- - - -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Vitae gravida egestas sagittis sed magna sodales. - Dignissim feugiat in ac habitasse aptent. Sodales adipiscing scelerisque neque aliquet fames. Suscipit - tempus erat volutpat scelerisque ac natoque nec. Sem urna ultricies taciti blandit porttitor volutpat. - Faucibus blandit non curae. Ultrices penatibus integer vulputate porta eleifend dictum. Lectus consequat - facilisis scelerisque egestas. Neque praesent fermentum habitant nibh class neque. Volutpat dignissim - vehicula vestibulum tempor. Magna sagittis lectus phasellus lectus donec ex. Inceptos torquent lorem natoque - viverra quam. Felis mauris semper et nisl pharetra nascetur. Tempor condimentum convallis enim pretium - habitant. Congue curae ullamcorper dis proin facilisi tempus pellentesque. Hac condimentum venenatis - quisque.

- - - -

Vitae fringilla elit fusce. Laoreet quisque id dolor platea faucibus. Lacinia ligula pulvinar nascetur; - tellus purus vivamus odio. Justo in ante netus euismod. Tellus ac finibus etiam urna. Himenaeos ridiculus ut - lobortis adipiscing curabitur libero faucibus. Porttitor tortor quisque habitasse. Nullam euismod nec - dignissim eros. Primis non sodales vestibulum magnis lectus odio? Lobortis convallis dui nunc suspendisse. - Inceptos maecenas aenean auctor enim sodales. Hac lobortis enim interdum lectus. Diam inceptos etiam rutrum. - Taciti lacinia nam tempor morbi pretium. Quis consequat lacus semper condimentum vestibulum habitant - sodales. Quis torquent tristique dolor molestie enim. Quisque eros enim mauris montes taciti suscipit. Arcu - metus eleifend dictum himenaeos.

- - - -

Natoque at varius lacinia in tempor. Ad magna arcu morbi. Himenaeos lobortis diam ante. Quisque sem sed - condimentum ullamcorper pharetra sagittis. Quis pulvinar dictumst condimentum, quam tortor donec. Dignissim - volutpat finibus nec ex scelerisque lacinia. Dapibus ante blandit vivamus rutrum pellentesque dignissim? - Habitasse sagittis ante diam pharetra turpis. Tincidunt nisl parturient erat porta. Dictumst aliquam - fermentum quisque enim. Curabitur lacinia duis magna platea ridiculus. Habitasse habitasse quisque metus. - Adipiscing maximus purus litora quis. Lacus gravida dignissim tellus justo. Sociosqu proin sodales litora - nullam diam placerat. Nam est ultricies lacus orci varius ullamcorper. Suscipit consequat varius dolor - ultricies sit justo. Eleifend iaculis natoque arcu, malesuada hendrerit sem.

- -
- -
- - -
-
- - - -
- - - - - -
- -
- - - -
- - - -
- - - -
- -
- - - -
-
-
- -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- -
- - - -
- -
-
- -
- -
-
- - - -
- -
- - - -
- - - -
- - - -
- -
- -
- - - -
-
-
Pills 錠剤
-
65
-
-
- - - -
- - - - - - - -
-
-
Skill
-
-
- 50%
-
-
- - - -
-
Skill
-
-
- - - -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- - - -
- -
- -
dfd
-
-
- -

sdfdsfsd

- -
-
- -
- - - -
-
- -
-
Untitled Tab
-
- -

hey hey

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
- - - -
- - - - - - - - - - - -
- - - -
-
-
- -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean - sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit - iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet - dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; - tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. - Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus - egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra - gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam - malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean - sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit - iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet - dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; - tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. - Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus - egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra - gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam - malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

- -
- - - -
- -
-
- https://www.youtube.com/watch?v=67tT2PbiWcI -
-
- -
- -
-
- - - -
- -
-
Skill
-
-
- - - -
- -
- -
Circle
-
-
- -
-
Skill
-
-
- -
-
- -
- - - -
-
-
- -
- -
-
Skill
-
-
- -
- - - -
- -
-
Skill
-
-
- -
- - - -
- -
-
Skill
-
-
- -
- -
-
- - - -
-
- -
-
Test 1
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor - facilisis non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu - sociosqu interdum.

- -
-
- - - -
-
Circle
-
- -
-
Skill
-
-
- -
-
- -
-
- -
- - - -
-
- -
- - - -
- - - -
- - - -
- - - -
-
- - - -

You agree to receive email communication from us by submitting this form - and understand that your contact information will be stored with us.

- - - -
-
-
- - - -
- -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

Block Text - Different languages

- - - -

- Lorem ipsum odor amet, consectetuer adipiscing elit. Cursus dignissim ultricies - fusce fermentum feugiat, morbi ex nunc. Molestie mattis finibus morbi magnis semper. In orci - varius est inceptos congue. Facilisi metus est vulputate parturient pellentesque. Egestas - quis habitant vel nostra per. Potenti penatibus augue magnis cubilia etiam maximus lacinia. - -

- - - -

- Lorem ipsum odor amet, consectetuer adipiscing elit. Mauris sagittis posuere fringilla integer - tristique dolor. Nascetur dapibus ipsum fusce euismod himenaeos. Sociosqu tellus lacinia dolor. Donec hac - velit donec vitae justo congue. Rutrum fames aptent convallis, nibh habitant vulputate. Integer nec accumsan - lacus ut nostra habitasse risus. Mauris integer curae feugiat malesuada tellus congue dis. Maecenas mattis - sociosqu nibh. Varius phasellus phasellus fringilla torquent! Tempus iaculis aenean ante sodales. Porta - potenti curabitur ex pulvinar eu rhoncus. -

- - - -

前ホタ初室モコ払対10女へ投能作ゃ産療質ドぎるお曜計カム嫉他わひごき徹下ヘセ浮直くほめだ式直にろそト提紙おぽは報対ミ崩際タ棋花政エシ向掲ラ図費高壌ろんだ。 - 情ざつご目整ネワエス言出ヘヨレフ者授ま車56西区ゅぜで融通ざるイひ被見山さラとス争味ぐこづ場合ネカ惑堂ロ転熱か男見ねで全返トぱそ直断伐だほぴず。 -

- - - -

Лорем ипсум долор сит амет, цу вим поссе фиерент сцаевола, ат дуо видерер адмодум дигниссим. Яуо татион инвидунт - глориатур цу. Проприае рецусабо алияуандо ет хис. Луцилиус хендрерит диссентиет сит еу, денияуе - алияуандо еу ест. Ат менандри праесент еос. -

- - - -

전인 광야에서 보내는 봄바람이다, 과실이 대중을 오직 황금시대다. 수 끓는 때까지 거친 이성은 같지 우리는 것이다. 피부가 넣는 - 얼음에 것은 하였으며, 아름다우냐? 이는 인류의 열락의 내려온 약동하다. 이상의 되려니와. 우리는 우리 바이며. 가는 이것은 인간의 이상 것이다. -

- - - -

Λορεμ ιπσθμ δολορ σιτ αμετ, περcιπιτθρ vολθπτατιβθσ ναμ θτ, νε μει ηαβεο νοvθμ σεμπερ. - Ιδ σεμπερ μανδαμθσ σεα. Ποστεα cονστιτθαμ πρι ει. Αν εστ ερατ πριμα. Περτιναξ cονσθλατθ γλοριατθρ - ηασ εθ, cετερο νοστρθδ ιραcθνδια ατ εστ, εξ ναμ μαλισ περcιπιτθρ. Qθοτ σινγθλισ νε πρι, τε vελ qθανδο - πονδερθμ εφφιcιαντθρ, παρτεμ γραεcο εθ σεα. -

- - - -

--- ·--· ····· -- ··· ··-· ·--· -· -- ···-- ····- ·-· -·- - ····- ----· --- ·--· ···- ····- ·· - -·-· --·- -· --· ·---- ·-·-·- -·- · --- - ·-·· ··--·· -· ··· -·· ·-·· ·-·-·- ·--- -··- ----- -· -·- -· ·---- - ··--- ··--·· ·-- ··· - --·- -··- -

- - - -

करती खरिदने मानसिक यन्त्रालय शीघ्र हुआआदी कार्यसिधान्तो मजबुत जाने पासपाई अर्थपुर्ण - जानते काम ढांचा उनका उसीएक् मुश्किले आंतरकार्यक्षमता चुनने संभव एकत्रित पहोचाना आंतरकार्यक्षमता - देते विशेष भोगोलिक वार्तालाप कार्यसिधान्तो समजते है।अभी पहोचाना सुना -

- - - -

For Arabic the text must go fom right to left

- - - -

بقسوة السيء وباستثناء في لكل, من وقد الأجل الشمال حاملات. أمدها تحرّك أفريقيا ثم لكل, إبّان طوكيو - وحلفاؤها لان في. ٣٠ هامش الطرفين جهة, ومن مئات مرمى في, ٣٠ ضرب دارت لهذه. تعد تم إستعمل لليابان, لدحر - سليمان، تم حتى, على أهّل تكبّد المشتّتون هو. لكل الجو الإطلاق أن. حتى القادة الشرق، إذ, به، - وبدأت التاريخ، عل.

- -
- - - -
- -

- 10.000 -

- - - -

- 30,00 -

- - - -

-20 -

- - - -

- 1,000,000 -

- - - -

- 1,000,000.23 -

- - - -

+32.3%

- - - -

-33.28$

- -
- - - -
- -
-
Skill
-
-
- - - -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- - - - - - - - - -
-
- -
-
-
-
-
-
- - - -
-
-
Skill
-
-
- 50%
-
-
- - - -
-
- -
-
Untitled Tab
-
- -

- -
-
- -
-
- - - - - - - -
- -
- - - -
-
Skill
-
-
- - - -
- -
- -
Title1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet cubilia - sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti vivamus non lectus - hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis elementum vivamus aliquet morbi - nam faucibus cubilia.

- -
-
- - - -
- -
Title 2
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci - sagittis laoreet cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus - potenti vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Title 3
-
-
- -
- -
- -
Sub Title 1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Sub Title 2
-
-
- -

No more dogs to pet.

- -
-
- -
- -
-
- - - -
- -
Title 4
-
-
- -
- -
- -
Sub Title 1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Sub Title 2
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- -
- -
-
- -
- - - -
-
-
-
-
0
-
Day
-
-
-
:
-
sep
-
-
-
0
-
Hour
-
-
-
:
-
sep
-
-
-
0
-
Minute
-
-
-
:
-
sep
-
-
-
0
-
Second
-
-
-
-
- - - -
-
- -
-
Title 1
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- -
-
- - - -
-
Title 2
-
- -

- -
-
- - - -
-
Title 3
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- -
-
- -
-
- - - - - -
- -
-
-
- -
- -

- This is an overline

- - - -

- An amazing Hero Title

- - - - - - - -

This is a description for the hero section. Synergestic actionables. - Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? -

- - - -
- - - - - - - -
- -
- -
-
- - - -
-
-
- -
- -
- This is an overline
- - - -

- Amazing hero titleadsfasdf

- - - - - - - -
-
-
-
-

adfasdf

-

sadfasdf

-
-
-
- -

dasfdsafadsfasdf

- -
-
-
- - - -

This is a description for the hero section. Synergestic actionables. - Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? -

- - - -
- - - -
- -
- - - -
- -
-
- -
-
T1
-
- -

asdfasdf

- -
-
- - - -
-
T2
-
- -

dafasdfasdfasdf

- -
-
- -
-
- -
- -
-
- -
- - - - - -
-
- -
Test
- - - -
Test
- - - -
Test
- - - -
Test
- - - -
Лорем ипсум долор сит амет, нец пробо епицуреи
- - - -
結ソアヤキ経日ノ面争ードひぐ空
- - - -
सहयोग किया क्षमता जानकारी ढांचामात्रुभाषा रचना
- - - -
ببعض الصينية بعض قد, مع دنو وحتّى حاملات. هو الا - والكوري الانجليزية. ما ببعض لبولندا، استطاعوا لها, لم هاربر كانتا والتي بلا. به، مع لهذه الإثنان, و لغات - أملاً دول, تُصب وشعار وصافرات ثم قبل.
- - - -
- Help Text
- - - -

You agree to receive email communication from us by submitting this form - and understand that your contact information will be stored with us.

- - - -
-
-
- - - -

Nice to meet - you | はじめまして | Rất vui được gặp bạn

- - - -
-
-
Bussines Hours | Öffnungszeiten
-
- -
-
Monday
-
09:00 AM - 01:00 PM
-
- - - -
-
Tuesday
-
09:00 AM - 03:00 PM
-
- - - -
-
Wednesday | der Mittwoch
-
09:00 AM - 04:00 PM
-
- - - -
-
Thursday
-
09:00 AM - 05:00 PM
-
- - - -
-
Friday
-
09:00 AM - 06:00 PM
-
- - - -
-
Saturday
-
Closed
-
- - - -
-
Sunday
-
Closed
-
- -
-
-
- - - -
-
-
- -
- -
-
-
-
- - - - - -

- Urban & Civil

- - - -

Our Urban design studio offering a full range of - urban design solutions for solutions for urban development projects.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Workplace

- - - -

We focus on strategically masterplanning cities. - Around the world, our multidisciplinary teams help to re-imagine urban environments for future - generations and work with governments to implement forward thinking strategic planning - strategies.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Hospitality

- - - -

With offices in North America, Africa, - South-East Asia and Australia, we are passionate about creating environments that address local - issues and contribute to a better world.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Residential

- - - -

From masterplans to remodels, we deliver an - exceptional customer experience with every step of the design process.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Interiors

- - - -

A building is more than just a structure. It's - an experience, it's recreation, it's a reflection of the community around it and its - inhabitants. We have developed a design process that combines deep research with a commitment to - urban planning and social responsibility.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Commercial

- - - -

All our products and services are aimed at - providing customers with an extra relaxation and comfort. We are working hard to create an - environment which would be appreciated by everyone looking for the best quality services.

- - - -
- - - -
- - - - - -
-
- -
- -
-
- - - -
-
-
-
-

Flip Front

-

Lorem ipsum odor amet, consectetuer adipiscing elit. Odio sagittis sagittis iaculis. Faucibus gravida - proin dis? Urna est sem. Dictumst semper cursus integer. Diam praesent cursus mattis scelerisque. -

-
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis justo - pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis non - quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu interdum.

- -
-
-
- - - -
-
-
- -
- -
-
-
- -
- -
-
- -
- - - -
- - - -
- - - -

You agree to receive email communication from us by - submitting this form and understand that your contact information will be stored - with us.

- - - -
-
-
- -
- - - -
- -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- -
- -
-
- - - -
-
-
- -
- -
-
- -
-
Untitled Tab -
-
- -

adf

- -
-
- - - -
-
Untitled Tab -
-
- -

asdfasdf

- -
-
- -
-
- -
- - - -
- -
- -
- -
-
- - - -
-
-
- -
- -
-
- -
-
Accordion -
-
- -
- -
- -
asdf
-
-
- -

asdfasdf

- -
-
- -
- -
-
- - - -
-
Tabs
-
- -
-
- -
-
Untitled Tab
-
- -
-
- -
-
Untitled Tab
-
- -

sfasdf

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
-
- - - -
-
Untitled Tab
-
- -

wertwert

- -
-
- - - -
-
Untitled Tab
-
- -

ewrtwert

- -
-
- - - -
-
Untitled Tab
-
- -

wertwert

- -
-
- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
-
- -
- -
- -
-

asdfasdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
- - - -

asd

-
- - - -
-

fs

-
- - - -
-

df

-
- - - -
-

sdf

-
- -
- - - -
- -
-

asdfasdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
- - - -

asd

-
- - - -
-

fs

-
- - - -
-

df

-
- - - -
-

sdf

-
- -
- -
- -
-
- - - -
-
-
- -
- -
-
-
- -
- -

- Essential

- - - - $59 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- - - -
- -

- Business

- - - - $129 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- - - -
- -

- VIP

- - - - $199 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- -
-
- -
- -
-
- - - -
-
-
- -
- -
-
-
- -
- -
-
-
Skill -
-
- -
- - - -
- -
-
-
- Skill
-
-
- 50%
-
-
- -
- -
-
- -
- -
-
- - - -
-
-
- -
- -
- -
- -
a1
-
-
- -
-
- -
-
- Untitled Tab
-
- -
- -
- -
a2
-
-
- -
-
- -
-
Untitled Tab
-
- -
- -
- -
a3
-
-
- -
-
- -
-
- Untitled Tab -
-
- -
- -
- -
- a4 -
-
-
- -

adsad -

- -
-
- -
- -
-
- - - -
-
- Untitled Tab -
-
- -

- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
- Untitled Tab
-
- -

- -
-
- -
-
- -
-
- -
- -
- -
-
- -
- -
-
- - - -
- -
-
- -
-
Small Text
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc turpis tristique finibus. Ex lectus - donec parturient. Vel nulla varius ornare. Dolor viverra vulputate accumsan. Vitae felis ligula - parturient.

- -
-
- - - -
-
Big Picture
-
- -
-
- -
-
- -
-
- - - -
- - - -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Vitae gravida egestas sagittis sed magna sodales. - Dignissim feugiat in ac habitasse aptent. Sodales adipiscing scelerisque neque aliquet fames. Suscipit - tempus erat volutpat scelerisque ac natoque nec. Sem urna ultricies taciti blandit porttitor volutpat. - Faucibus blandit non curae. Ultrices penatibus integer vulputate porta eleifend dictum. Lectus consequat - facilisis scelerisque egestas. Neque praesent fermentum habitant nibh class neque. Volutpat dignissim - vehicula vestibulum tempor. Magna sagittis lectus phasellus lectus donec ex. Inceptos torquent lorem natoque - viverra quam. Felis mauris semper et nisl pharetra nascetur. Tempor condimentum convallis enim pretium - habitant. Congue curae ullamcorper dis proin facilisi tempus pellentesque. Hac condimentum venenatis - quisque.

- - - -

Vitae fringilla elit fusce. Laoreet quisque id dolor platea faucibus. Lacinia ligula pulvinar nascetur; - tellus purus vivamus odio. Justo in ante netus euismod. Tellus ac finibus etiam urna. Himenaeos ridiculus ut - lobortis adipiscing curabitur libero faucibus. Porttitor tortor quisque habitasse. Nullam euismod nec - dignissim eros. Primis non sodales vestibulum magnis lectus odio? Lobortis convallis dui nunc suspendisse. - Inceptos maecenas aenean auctor enim sodales. Hac lobortis enim interdum lectus. Diam inceptos etiam rutrum. - Taciti lacinia nam tempor morbi pretium. Quis consequat lacus semper condimentum vestibulum habitant - sodales. Quis torquent tristique dolor molestie enim. Quisque eros enim mauris montes taciti suscipit. Arcu - metus eleifend dictum himenaeos.

- - - -

Natoque at varius lacinia in tempor. Ad magna arcu morbi. Himenaeos lobortis diam ante. Quisque sem sed - condimentum ullamcorper pharetra sagittis. Quis pulvinar dictumst condimentum, quam tortor donec. Dignissim - volutpat finibus nec ex scelerisque lacinia. Dapibus ante blandit vivamus rutrum pellentesque dignissim? - Habitasse sagittis ante diam pharetra turpis. Tincidunt nisl parturient erat porta. Dictumst aliquam - fermentum quisque enim. Curabitur lacinia duis magna platea ridiculus. Habitasse habitasse quisque metus. - Adipiscing maximus purus litora quis. Lacus gravida dignissim tellus justo. Sociosqu proin sodales litora - nullam diam placerat. Nam est ultricies lacus orci varius ullamcorper. Suscipit consequat varius dolor - ultricies sit justo. Eleifend iaculis natoque arcu, malesuada hendrerit sem.

- -
- -
- - -
-
- - - -
- - - - - -
- -
- - - -
- - - -
- - - -
- -
- - - -
-
-
- -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec - auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis - dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. - Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, - condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. - Tristique natoque euismod rutrum massa nascetur.

- -
- - - -
- -
-
- -
- -
-
- - - -
- -
- - - -
- - - -
- - - -
- -
- -
- - - -
-
-
Pills 錠剤
-
65
-
-
- - - -
- - - - - - - -
-
-
Skill
-
-
- 50%
-
-
- - - -
-
Skill
-
-
- - - -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- - - -
- -
- -
dfd
-
-
- -

sdfdsfsd

- -
-
- -
- - - -
-
- -
-
Untitled Tab
-
- -

hey hey

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
- - - -
- - - - - - - - - - - -
- - - -
-
-
- -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean - sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit - iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet - dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; - tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. - Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus - egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra - gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam - malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean - sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit - iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet - dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; - tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. - Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus - egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra - gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam - malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

- -
- - - -
- -
-
- https://www.youtube.com/watch?v=67tT2PbiWcI -
-
- -
- -
-
- - - -
- -
-
Skill
-
-
- - - -
- -
- -
Circle
-
-
- -
-
Skill
-
-
- -
-
- -
- - - -
-
-
- -
- -
-
Skill
-
-
- -
- - - -
- -
-
Skill
-
-
- -
- - - -
- -
-
Skill
-
-
- -
- -
-
- - - -
-
- -
-
Test 1
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor - facilisis non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu - sociosqu interdum.

- -
-
- - - -
-
Circle
-
- -
-
Skill
-
-
- -
-
- -
-
- -
- - - -
-
- -
- - - -
- - - -
- - - -
- - - -
-
- - - -

You agree to receive email communication from us by submitting this form - and understand that your contact information will be stored with us.

- - - -
-
-
- - - -
- -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

- This is a speed test. See how it goes. -

- - - -

Block Text - Different languages

- - - -

- Lorem ipsum odor amet, consectetuer adipiscing elit. Cursus dignissim ultricies - fusce fermentum feugiat, morbi ex nunc. Molestie mattis finibus morbi magnis semper. In orci - varius est inceptos congue. Facilisi metus est vulputate parturient pellentesque. Egestas - quis habitant vel nostra per. Potenti penatibus augue magnis cubilia etiam maximus lacinia. - -

- - - -

- Lorem ipsum odor amet, consectetuer adipiscing elit. Mauris sagittis posuere fringilla integer - tristique dolor. Nascetur dapibus ipsum fusce euismod himenaeos. Sociosqu tellus lacinia dolor. Donec hac - velit donec vitae justo congue. Rutrum fames aptent convallis, nibh habitant vulputate. Integer nec accumsan - lacus ut nostra habitasse risus. Mauris integer curae feugiat malesuada tellus congue dis. Maecenas mattis - sociosqu nibh. Varius phasellus phasellus fringilla torquent! Tempus iaculis aenean ante sodales. Porta - potenti curabitur ex pulvinar eu rhoncus. -

- - - -

前ホタ初室モコ払対10女へ投能作ゃ産療質ドぎるお曜計カム嫉他わひごき徹下ヘセ浮直くほめだ式直にろそト提紙おぽは報対ミ崩際タ棋花政エシ向掲ラ図費高壌ろんだ。 - 情ざつご目整ネワエス言出ヘヨレフ者授ま車56西区ゅぜで融通ざるイひ被見山さラとス争味ぐこづ場合ネカ惑堂ロ転熱か男見ねで全返トぱそ直断伐だほぴず。 -

- - - -

Лорем ипсум долор сит амет, цу вим поссе фиерент сцаевола, ат дуо видерер адмодум дигниссим. Яуо татион инвидунт - глориатур цу. Проприае рецусабо алияуандо ет хис. Луцилиус хендрерит диссентиет сит еу, денияуе - алияуандо еу ест. Ат менандри праесент еос. -

- - - -

전인 광야에서 보내는 봄바람이다, 과실이 대중을 오직 황금시대다. 수 끓는 때까지 거친 이성은 같지 우리는 것이다. 피부가 넣는 - 얼음에 것은 하였으며, 아름다우냐? 이는 인류의 열락의 내려온 약동하다. 이상의 되려니와. 우리는 우리 바이며. 가는 이것은 인간의 이상 것이다. -

- - - -

Λορεμ ιπσθμ δολορ σιτ αμετ, περcιπιτθρ vολθπτατιβθσ ναμ θτ, νε μει ηαβεο νοvθμ σεμπερ. - Ιδ σεμπερ μανδαμθσ σεα. Ποστεα cονστιτθαμ πρι ει. Αν εστ ερατ πριμα. Περτιναξ cονσθλατθ γλοριατθρ - ηασ εθ, cετερο νοστρθδ ιραcθνδια ατ εστ, εξ ναμ μαλισ περcιπιτθρ. Qθοτ σινγθλισ νε πρι, τε vελ qθανδο - πονδερθμ εφφιcιαντθρ, παρτεμ γραεcο εθ σεα. -

- - - -

--- ·--· ····· -- ··· ··-· ·--· -· -- ···-- ····- ·-· -·- - ····- ----· --- ·--· ···- ····- ·· - -·-· --·- -· --· ·---- ·-·-·- -·- · --- - ·-·· ··--·· -· ··· -·· ·-·· ·-·-·- ·--- -··- ----- -· -·- -· ·---- - ··--- ··--·· ·-- ··· - --·- -··- -

- - - -

करती खरिदने मानसिक यन्त्रालय शीघ्र हुआआदी कार्यसिधान्तो मजबुत जाने पासपाई अर्थपुर्ण - जानते काम ढांचा उनका उसीएक् मुश्किले आंतरकार्यक्षमता चुनने संभव एकत्रित पहोचाना आंतरकार्यक्षमता - देते विशेष भोगोलिक वार्तालाप कार्यसिधान्तो समजते है।अभी पहोचाना सुना -

- - - -

For Arabic the text must go fom right to left

- - - -

بقسوة السيء وباستثناء في لكل, من وقد الأجل الشمال حاملات. أمدها تحرّك أفريقيا ثم لكل, إبّان طوكيو - وحلفاؤها لان في. ٣٠ هامش الطرفين جهة, ومن مئات مرمى في, ٣٠ ضرب دارت لهذه. تعد تم إستعمل لليابان, لدحر - سليمان، تم حتى, على أهّل تكبّد المشتّتون هو. لكل الجو الإطلاق أن. حتى القادة الشرق، إذ, به، - وبدأت التاريخ، عل.

- -
- - - -
- -

- 10.000 -

- - - -

- 30,00 -

- - - -

-20 -

- - - -

- 1,000,000 -

- - - -

- 1,000,000.23 -

- - - -

+32.3%

- - - -

-33.28$

- -
- - - -
- -
-
Skill
-
-
- - - -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- - - - - - - - - -
-
- -
-
-
-
-
-
- - - -
-
-
Skill
-
-
- 50%
-
-
- - - -
-
- -
-
Untitled Tab
-
- -

- -
-
- -
-
- - - - - - - -
- -
- - - -
-
Skill
-
-
- - - -
- -
- -
Title1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet cubilia - sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti vivamus non lectus - hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis elementum vivamus aliquet morbi - nam faucibus cubilia.

- -
-
- - - -
- -
Title 2
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci - sagittis laoreet cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus - potenti vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Title 3
-
-
- -
- -
- -
Sub Title 1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Sub Title 2
-
-
- -

No more dogs to pet.

- -
-
- -
- -
-
- - - -
- -
Title 4
-
-
- -
- -
- -
Sub Title 1
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- - - -
- -
Sub Title 2
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet - cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti - vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis - elementum vivamus aliquet morbi nam faucibus cubilia.

- -
-
- -
- -
-
- -
- - - -
-
-
-
-
0
-
Day
-
-
-
:
-
sep
-
-
-
0
-
Hour
-
-
-
:
-
sep
-
-
-
0
-
Minute
-
-
-
:
-
sep
-
-
-
0
-
Second
-
-
-
-
- - - -
-
- -
-
Title 1
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- -
-
- - - -
-
Title 2
-
- -

- -
-
- - - -
-
Title 3
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- - - -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis - justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis - non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu - interdum.

- -
-
- -
-
- - - - - -
- -
-
-
- -
- -

- This is an overline

- - - -

- An amazing Hero Title

- - - - - - - -

This is a description for the hero section. Synergestic actionables. - Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? -

- - - -
- - - - - - - -
- -
- -
-
- - - -
-
-
- -
- -
- This is an overline
- - - -

- Amazing hero titleadsfasdf

- - - - - - - -
-
-
-
-

adfasdf

-

sadfasdf

-
-
-
- -

dasfdsafadsfasdf

- -
-
-
- - - -

This is a description for the hero section. Synergestic actionables. - Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? -

- - - -
- - - -
- -
- - - -
- -
-
- -
-
T1
-
- -

asdfasdf

- -
-
- - - -
-
T2
-
- -

dafasdfasdfasdf

- -
-
- -
-
- -
- -
-
- -
- - - - - -
-
- -
Test
- - - -
Test
- - - -
Test
- - - -
Test
- - - -
Лорем ипсум долор сит амет, нец пробо епицуреи
- - - -
結ソアヤキ経日ノ面争ードひぐ空
- - - -
सहयोग किया क्षमता जानकारी ढांचामात्रुभाषा रचना
- - - -
ببعض الصينية بعض قد, مع دنو وحتّى حاملات. هو الا - والكوري الانجليزية. ما ببعض لبولندا، استطاعوا لها, لم هاربر كانتا والتي بلا. به، مع لهذه الإثنان, و لغات - أملاً دول, تُصب وشعار وصافرات ثم قبل.
- - - -
- Help Text
- - - -

You agree to receive email communication from us by submitting this form - and understand that your contact information will be stored with us.

- - - -
-
-
- - - -

Nice to meet - you | はじめまして | Rất vui được gặp bạn

- - - -
-
-
Bussines Hours | Öffnungszeiten
-
- -
-
Monday
-
09:00 AM - 01:00 PM
-
- - - -
-
Tuesday
-
09:00 AM - 03:00 PM
-
- - - -
-
Wednesday | der Mittwoch
-
09:00 AM - 04:00 PM
-
- - - -
-
Thursday
-
09:00 AM - 05:00 PM
-
- - - -
-
Friday
-
09:00 AM - 06:00 PM
-
- - - -
-
Saturday
-
Closed
-
- - - -
-
Sunday
-
Closed
-
- -
-
-
- - - -
-
-
- -
- -
-
-
-
- - - - - -

- Urban & Civil

- - - -

Our Urban design studio offering a full range of - urban design solutions for solutions for urban development projects.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Workplace

- - - -

We focus on strategically masterplanning cities. - Around the world, our multidisciplinary teams help to re-imagine urban environments for future - generations and work with governments to implement forward thinking strategic planning - strategies.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Hospitality

- - - -

With offices in North America, Africa, - South-East Asia and Australia, we are passionate about creating environments that address local - issues and contribute to a better world.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Residential

- - - -

From masterplans to remodels, we deliver an - exceptional customer experience with every step of the design process.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Interiors

- - - -

A building is more than just a structure. It's - an experience, it's recreation, it's a reflection of the community around it and its - inhabitants. We have developed a design process that combines deep research with a commitment to - urban planning and social responsibility.

- - - -
- - - -
- - - - - -
-
- - - - - - - -
-
-
-
- - - - - -

- Commercial

- - - -

All our products and services are aimed at - providing customers with an extra relaxation and comfort. We are working hard to create an - environment which would be appreciated by everyone looking for the best quality services.

- - - -
- - - -
- - - - - -
-
- -
- -
-
- - - -
-
-
-
-

Flip Front

-

Lorem ipsum odor amet, consectetuer adipiscing elit. Odio sagittis sagittis iaculis. Faucibus gravida - proin dis? Urna est sem. Dictumst semper cursus integer. Diam praesent cursus mattis scelerisque. -

-
-
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu - porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis justo - pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis non - quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu interdum.

- -
-
-
- - - -
-
-
- -
- -
-
-
- -
- -
-
- -
- - - -
- - - -
- - - -

You agree to receive email communication from us by - submitting this form and understand that your contact information will be stored - with us.

- - - -
-
-
- -
- - - -
- -
-
-
-
-
0
-
Day
-
-
-
0
-
Hour
-
-
-
0
-
Minute
-
-
-
0
-
Second
-
-
-
-
- -
- -
-
- - - -
-
-
- -
- -
-
- -
-
Untitled Tab -
-
- -

adf

- -
-
- - - -
-
Untitled Tab -
-
- -

asdfasdf

- -
-
- -
-
- -
- - - -
- -
- -
- -
-
- - - -
-
-
- -
- -
-
- -
-
Accordion -
-
- -
- -
- -
asdf
-
-
- -

asdfasdf

- -
-
- -
- -
-
- - - -
-
Tabs
-
- -
-
- -
-
Untitled Tab
-
- -
-
- -
-
Untitled Tab
-
- -

sfasdf

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
-
- - - -
-
Untitled Tab
-
- -

wertwert

- -
-
- - - -
-
Untitled Tab
-
- -

ewrtwert

- -
-
- - - -
-
Untitled Tab
-
- -

wertwert

- -
-
- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
-
- -
- -
- -
-

asdfasdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
- - - -

asd

-
- - - -
-

fs

-
- - - -
-

df

-
- - - -
-

sdf

-
- -
- - - -
- -
-

asdfasdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
-

asdf

-
- - - -
- - - -

asd

-
- - - -
-

fs

-
- - - -
-

df

-
- - - -
-

sdf

-
- -
- -
- -
-
- - - -
-
-
- -
- -
-
-
- -
- -

- Essential

- - - - $59 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- - - -
- -

- Business

- - - - $129 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- - - -
- -

- VIP

- - - - $199 - - - -

- Party snackwave four dollar toast tumeric cold-pressed.

- - - -
- - - -
- - - - - - - -
- - - -
- -
-

Custom Layouts - & Hooks

-
- - - -
-

Unlimited - Website Usage

-
- - - -
-

Risk-Free - Guarantee

-
- -
- - - - - -
- -
-
- -
- -
-
- - - -
-
-
- -
- -
-
-
- -
- -
-
-
Skill -
-
- -
- - - -
- -
-
-
- Skill
-
-
- 50%
-
-
- -
- -
-
- -
- -
-
- - - -
-
-
- -
- -
- -
- -
a1
-
-
- -
-
- -
-
- Untitled Tab
-
- -
- -
- -
a2
-
-
- -
-
- -
-
Untitled Tab
-
- -
- -
- -
a3
-
-
- -
-
- -
-
- Untitled Tab -
-
- -
- -
- -
- a4 -
-
-
- -

adsad -

- -
-
- -
- -
-
- - - -
-
- Untitled Tab -
-
- -

- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
Untitled Tab
-
- -

- -
-
- -
-
- -
-
- -
- -
-
- - - -
-
- Untitled Tab
-
- -

- -
-
- -
-
- -
-
- -
- -
- -
-
- -
- -
-
- - - -
- -
-
- -
-
Small Text
-
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Nunc turpis tristique finibus. Ex lectus - donec parturient. Vel nulla varius ornare. Dolor viverra vulputate accumsan. Vitae felis ligula - parturient.

- -
-
- - - -
-
Big Picture
-
- -
-
- -
-
- -
-
- - - -
- - - -
- -

Lorem ipsum odor amet, consectetuer adipiscing elit. Vitae gravida egestas sagittis sed magna sodales. - Dignissim feugiat in ac habitasse aptent. Sodales adipiscing scelerisque neque aliquet fames. Suscipit - tempus erat volutpat scelerisque ac natoque nec. Sem urna ultricies taciti blandit porttitor volutpat. - Faucibus blandit non curae. Ultrices penatibus integer vulputate porta eleifend dictum. Lectus consequat - facilisis scelerisque egestas. Neque praesent fermentum habitant nibh class neque. Volutpat dignissim - vehicula vestibulum tempor. Magna sagittis lectus phasellus lectus donec ex. Inceptos torquent lorem natoque - viverra quam. Felis mauris semper et nisl pharetra nascetur. Tempor condimentum convallis enim pretium - habitant. Congue curae ullamcorper dis proin facilisi tempus pellentesque. Hac condimentum venenatis - quisque.

- - - -

Vitae fringilla elit fusce. Laoreet quisque id dolor platea faucibus. Lacinia ligula pulvinar nascetur; - tellus purus vivamus odio. Justo in ante netus euismod. Tellus ac finibus etiam urna. Himenaeos ridiculus ut - lobortis adipiscing curabitur libero faucibus. Porttitor tortor quisque habitasse. Nullam euismod nec - dignissim eros. Primis non sodales vestibulum magnis lectus odio? Lobortis convallis dui nunc suspendisse. - Inceptos maecenas aenean auctor enim sodales. Hac lobortis enim interdum lectus. Diam inceptos etiam rutrum. - Taciti lacinia nam tempor morbi pretium. Quis consequat lacus semper condimentum vestibulum habitant - sodales. Quis torquent tristique dolor molestie enim. Quisque eros enim mauris montes taciti suscipit. Arcu - metus eleifend dictum himenaeos.

- - - -

Natoque at varius lacinia in tempor. Ad magna arcu morbi. Himenaeos lobortis diam ante. Quisque sem sed - condimentum ullamcorper pharetra sagittis. Quis pulvinar dictumst condimentum, quam tortor donec. Dignissim - volutpat finibus nec ex scelerisque lacinia. Dapibus ante blandit vivamus rutrum pellentesque dignissim? - Habitasse sagittis ante diam pharetra turpis. Tincidunt nisl parturient erat porta. Dictumst aliquam - fermentum quisque enim. Curabitur lacinia duis magna platea ridiculus. Habitasse habitasse quisque metus. - Adipiscing maximus purus litora quis. Lacus gravida dignissim tellus justo. Sociosqu proin sodales litora - nullam diam placerat. Nam est ultricies lacus orci varius ullamcorper. Suscipit consequat varius dolor - ultricies sit justo. Eleifend iaculis natoque arcu, malesuada hendrerit sem.

- -
- -
- \ No newline at end of file diff --git a/src/blocks/test/e2e/blocks/accordion.spec.js b/src/blocks/test/e2e/blocks/accordion.spec.js index 254f6e36c..0efd94b86 100644 --- a/src/blocks/test/e2e/blocks/accordion.spec.js +++ b/src/blocks/test/e2e/blocks/accordion.spec.js @@ -42,9 +42,6 @@ test.describe( 'Accordion Block', () => { const { clientId } = accordionBlock; const currentAccordionItems = accordionBlock.innerBlocks.length; - await page.click( `#block-${clientId}` ); - await page.getByRole( 'button', { name: 'Select Accordion' }).click(); - await page.getByRole( 'button', { name: 'Add Accordion Item' }).click(); accordionBlock = ( await editor.getBlocks() ).find( ( block ) => 'themeisle-blocks/accordion' === block.name ); diff --git a/src/blocks/test/e2e/blocks/animations.spec.js b/src/blocks/test/e2e/blocks/animations.spec.js index 69d570616..2269b0b3c 100644 --- a/src/blocks/test/e2e/blocks/animations.spec.js +++ b/src/blocks/test/e2e/blocks/animations.spec.js @@ -16,7 +16,7 @@ test.describe( 'Animations', () => { } }); - const box = await page.getByLabel( 'Paragraph block' ).boundingBox(); + const box = await page.getByRole( 'document', { name: 'Block: Paragraph' }).boundingBox(); // Select a text inside the paragraph block. await page.mouse.move( box.x + 10, box.y + 10 ); @@ -28,7 +28,73 @@ test.describe( 'Animations', () => { await page.getByRole( 'menuitem', { name: 'Typing Animation' }).click(); - expect( page.getByLabel( 'Paragraph block' ).locator( 'o-anim-typing' ).first() ).toBeTruthy(); - expect( page.getByLabel( 'Paragraph block' ).locator( '.o-typing-delay-500ms' ).first() ).toBeTruthy(); + await expect( page.getByLabel( 'Paragraph block' ).locator( 'o-anim-typing' ).first() ).toBeVisible(); + await expect( page.getByLabel( 'Paragraph block' ).locator( '.o-typing-delay-500ms' ).first() ).toBeVisible(); + }); + + test( 'add simple animation', async({ editor, page }) => { + await editor.insertBlock({ + name: 'core/paragraph', + attributes: { + content: 'Magna mollis sed ipsum convallis tellus donec. Maximus ligula nostra fusce inceptos in fermentum phasellus. Ante sollicitudin euismod ultrices nullam etiam eu. Himenaeos si ridiculus suscipit velit donec dui tristique. Habitant auctor ridiculus a consectetuer nisi volutpat magnis sed enim lacus. Quisque habitant litora sodales turpis montes.' + } + }); + + // Activate + await page.getByRole( 'button', { name: 'Block Tools options' }).click(); + await page.getByRole( 'menuitemcheckbox', { name: 'Show Animations' }).click(); + await page.getByRole( 'button', { name: 'Block Tools options' }).click(); + + // Open the animation panel. + await page.getByRole( 'button', { name: 'Animations' }).click(); + + // Select an animation + await page.getByRole( 'button', { name: 'None' }).click(); + await page.getByRole( 'menuitem', { name: 'Head Shake' }).click(); + + // Select a delay + await page.getByRole( 'combobox', { name: 'Delay' }).selectOption( 'delay-500ms' ); + + // Select a speed + await page.getByRole( 'combobox', { name: 'Speed' }).selectOption( 'slower' ); + + // Check the CSS classes. + await expect( page.locator( '.headShake' ).first() ).toBeVisible(); + await expect( page.locator( '.delay-500ms' ).first() ).toBeVisible(); + await expect( page.locator( '.slower' ).first() ).toBeVisible(); + }); + + test( 'add simple animation with custom values', async({ editor, page }) => { + await editor.insertBlock({ + name: 'core/paragraph', + attributes: { + content: 'Magna mollis sed ipsum convallis tellus donec. Maximus ligula nostra fusce inceptos in fermentum phasellus. Ante sollicitudin euismod ultrices nullam etiam eu. Himenaeos si ridiculus suscipit velit donec dui tristique. Habitant auctor ridiculus a consectetuer nisi volutpat magnis sed enim lacus. Quisque habitant litora sodales turpis montes.' + } + }); + + // Activate + await page.getByRole( 'button', { name: 'Block Tools options' }).click(); + await page.getByRole( 'menuitemcheckbox', { name: 'Show Animations' }).click(); + await page.getByRole( 'button', { name: 'Block Tools options' }).click(); + + // Open the animation panel. + await page.getByRole( 'button', { name: 'Animations' }).click(); + + // Select an animation + await page.getByRole( 'button', { name: 'None' }).click(); + await page.getByRole( 'menuitem', { name: 'Head Shake' }).click(); + + // Select a delay + await page.getByRole( 'combobox', { name: 'Delay' }).selectOption( 'o-anim-custom-delay' ); + await page.locator( '#inspector-input-control-0' ).fill( '2' ); + + // Select a speed + await page.getByRole( 'combobox', { name: 'Speed' }).selectOption( 'o-anim-custom-speed' ); + await page.locator( '#inspector-input-control-1' ).fill( '2' ); + + // Check the CSS classes. + await expect( page.locator( '.headShake' ).first() ).toBeVisible(); + await expect( page.locator( '.o-anim-custom-delay.o-anim-value-delay-2s' ).first() ).toBeVisible(); + await expect( page.locator( '.o-anim-custom-speed.o-anim-value-speed-2s' ).first() ).toBeVisible(); }); }); diff --git a/src/blocks/test/e2e/blocks/countdown.spec.js b/src/blocks/test/e2e/blocks/countdown.spec.js index 8a28e6064..8b554fc52 100644 --- a/src/blocks/test/e2e/blocks/countdown.spec.js +++ b/src/blocks/test/e2e/blocks/countdown.spec.js @@ -38,7 +38,7 @@ test.describe( 'Countdown Block', () => { await page.getByLabel( 'Year' ).press( 'Enter' ); // If everything is ok, the day label text should be changed to "Days". - await expect( page.getByText( 'Days' ) ).toBeVisible(); + await expect( page.getByText( 'Days', { exact: true }) ).toBeVisible(); await page.locator( '.editor-styles-wrapper' ).click(); const postId = await editor.publishPost(); @@ -48,7 +48,7 @@ test.describe( 'Countdown Block', () => { expect( ( await page.$eval( `#${otterId}`, ( el ) => el.getAttribute( 'data-date' ) ) ).startsWith( '2030-08-17' ) ).toBeTruthy(); // If everything is ok, the day label text should be changed to "Days". - await expect( page.getByText( 'Days' ) ).toBeVisible(); + await expect( page.getByText( 'Days', { exact: true }) ).toBeVisible(); // Capture the current value of the seconds. const currentValue = await page.locator( '.otter-countdown__display-area' ) @@ -59,7 +59,7 @@ test.describe( 'Countdown Block', () => { .innerHTML(); // Wait for 1 second for the seconds to change. - await page.waitForTimeout( 1000 ); + await page.waitForTimeout( 1300 ); // Capture the new value of the seconds. const newValue = await page.locator( '.otter-countdown__display-area' ) diff --git a/src/blocks/test/e2e/blocks/form.spec.js b/src/blocks/test/e2e/blocks/form.spec.js index 03fc9e309..d6463245f 100644 --- a/src/blocks/test/e2e/blocks/form.spec.js +++ b/src/blocks/test/e2e/blocks/form.spec.js @@ -47,9 +47,7 @@ test.describe( 'Form Block', () => { expect( formBlock ).toBeTruthy(); - const { clientId } = formBlock; - - await page.click( `#block-${clientId} > div > fieldset > ul > li:nth-child(1) > button` ); + await page.getByRole( 'button', { name: 'Contact form for clients' }).click(); // Check if the blocks has innerBlocks @@ -73,9 +71,7 @@ test.describe( 'Form Block', () => { expect( formBlock ).toBeTruthy(); - const { clientId } = formBlock; - - await page.click( `#block-${clientId} > div > fieldset > ul > li:nth-child(1) > button` ); + await page.getByRole( 'button', { name: 'Contact form for clients' }).click(); // Open the options panel await page.getByRole( 'button', { name: 'Form Options options' }).click(); @@ -145,7 +141,7 @@ test.describe( 'Form Block', () => { expect( otterId ).toBeTruthy(); - await page.click( `#block-${clientId} > div > fieldset > ul > li:nth-child(1) > button` ); + await page.getByRole( 'button', { name: 'Contact form for clients' }).click(); const postId = await editor.publishPost(); @@ -285,7 +281,7 @@ test.describe( 'Form Block', () => { const { clientId } = formBlock; - await page.click( `#block-${clientId} > div > fieldset > ul > li:nth-child(1) > button` ); + await page.getByRole( 'button', { name: 'Contact form for clients' }).click(); // Open the options panel await page.getByRole( 'button', { name: 'Form Options options' }).click(); @@ -334,9 +330,7 @@ test.describe( 'Form Block', () => { expect( formBlock ).toBeTruthy(); - const { clientId } = formBlock; - - await page.click( `#block-${clientId} > div > fieldset > ul > li:nth-child(1) > button` ); + await page.getByRole( 'button', { name: 'Contact form for clients' }).click(); await page.getByRole( 'button', { name: 'Marketing Integration' }).click(); @@ -363,7 +357,7 @@ test.describe( 'Form Block', () => { const { clientId } = formBlock; - await page.click( `#block-${clientId} > div > fieldset > ul > li:nth-child(1) > button` ); + await page.getByRole( 'button', { name: 'Contact form for clients' }).click(); // Open the options panel await page.getByRole( 'button', { name: 'Form Options options' }).click(); @@ -392,4 +386,118 @@ test.describe( 'Form Block', () => { expect( await saveBtn.isEnabled() ).toBeTruthy(); }); + + test( 'default values for fields', async({ page, editor }) => { + await editor.insertBlock( + { + name: 'themeisle-blocks/form', + innerBlocks: [ + { + name: 'themeisle-blocks/form-input', + attributes: { + label: 'Name', + defaultValue: 'John Doe' + } + }, + { + name: 'themeisle-blocks/form-textarea', + attributes: { + label: 'Message', + defaultValue: 'Hello World' + } + }, + { + name: 'themeisle-blocks/form-multiple-choice', + attributes: { + label: 'Checkbox', + type: 'checkbox', + options: [ + { isDefault: true, content: 'Checkbox Option 1' }, + { isDefault: true, content: 'Checkbox Option 2' }, + { isDefault: false, content: 'Checkbox Option 3' } + ] + } + }, + { + name: 'themeisle-blocks/form-multiple-choice', + attributes: { + label: 'Radio', + type: 'radio', + options: [ + { isDefault: false, content: 'Radio Option 1' }, + { isDefault: true, content: 'Radio Option 2' } + ] + } + }, { + name: 'themeisle-blocks/form-multiple-choice', + attributes: { + label: 'Select', + type: 'select', + options: [ + { isDefault: false, content: 'Select Option 1' }, + { isDefault: true, content: 'Select Option 2' } + ] + } + }, + { + name: 'themeisle-blocks/form-hidden-field', + attributes: { + label: 'Hidden Field Test', + paramName: 'test', + defaultValue: '123' + } + } + ] + } + ); + + const postId = await editor.publishPost(); + + await page.goto( `/?p=${postId}` ); + + // Text input. + expect( await page.getByLabel( 'Name' ).inputValue() ).toBe( 'John Doe' ); + + // Textarea. + expect( await page.getByLabel( 'Message' ).inputValue() ).toBe( 'Hello World' ); + + // Checkboxes. + expect( await page.getByLabel( 'Checkbox Option 1' ).isChecked() ).toBeTruthy(); + expect( await page.getByLabel( 'Checkbox Option 2' ).isChecked() ).toBeTruthy(); + expect( await page.getByLabel( 'Checkbox Option 3' ).isChecked() ).toBeFalsy(); + + // Radio. + expect( await page.getByLabel( 'Radio Option 1' ).isChecked() ).toBeFalsy(); + expect( await page.getByLabel( 'Radio Option 2' ).isChecked() ).toBeTruthy(); + + // Select. + expect( await page.getByRole( 'combobox' ).inputValue() ).toBe( 'select-option-2' ); + + // Hidden field. + expect( await page.locator( '.otter-form-input[type="hidden"]' ).inputValue() ).toBe( '123' ); + }); + + test( 'can export form data', async({ page, editor }) => { + let downloadTriggered = false; + let fileName = ''; + + await page.goto( '/wp-admin/edit.php?post_type=otter_form_record' ); + + page.on( 'download', async download => { + await download.path(); // Wait for download to complete. + downloadTriggered = true; + fileName = download.suggestedFilename(); + }); + + const exportBtn = page.getByRole( 'button', { name: 'Export' }); + + await expect( exportBtn ).toBeVisible(); + + await exportBtn.click(); + + await page.waitForTimeout( 1000 ); + + expect( downloadTriggered ).toBeTruthy(); + expect( fileName.startsWith( 'otter_form_submissions' ) ).toBeTruthy(); + }); }); diff --git a/src/blocks/test/e2e/blocks/heading.spec.js b/src/blocks/test/e2e/blocks/heading.spec.js index bdf648d54..0970c0419 100644 --- a/src/blocks/test/e2e/blocks/heading.spec.js +++ b/src/blocks/test/e2e/blocks/heading.spec.js @@ -26,11 +26,21 @@ test.describe( 'Advanced Heading Block', () => { name: 'themeisle-blocks/advanced-heading' }); + await page.getByRole( 'document', { name: 'Block: Advanced Heading' }).click(); + + const sidebarClass = await page.getByRole( 'button', { name: 'Settings', exact: true }).first().getAttribute( 'class' ); + if ( ! sidebarClass.includes( 'is-pressed' ) ) { + await page.getByRole( 'button', { name: 'Settings', exact: true }).first().click(); + } + // Open Style tab. await page.getByRole( 'button', { name: 'Style' }).click(); + // Open custom font size. + await page.getByRole( 'button', { name: 'Set custom size' }).click(); + // Select font size. - await page.getByRole( 'radio', { name: '16' }).click(); + await page.getByLabel( 'Custom', { exact: true }).fill( '16' ); // Open the menu for more options. await page.getByRole( 'button', { name: 'View options' }).click(); diff --git a/src/blocks/test/e2e/blocks/live-search.spec.js b/src/blocks/test/e2e/blocks/live-search.spec.js new file mode 100644 index 000000000..a12f656d4 --- /dev/null +++ b/src/blocks/test/e2e/blocks/live-search.spec.js @@ -0,0 +1,54 @@ +/** + * WordPress dependencies + */ +import { test, expect } from '@wordpress/e2e-test-utils-playwright'; + +test.describe( 'Live Search Block', () => { + test.beforeEach( async({ admin }) => { + await admin.createNewPost(); + }); + + test( 'can be created by typing "/live-search"', async({ editor, page }) => { + + // Create a Progress Block with the slash block shortcut. + await page.click( 'role=button[name="Add default block"i]' ); + await page.keyboard.type( '/live-search' ); + await page.keyboard.press( 'Enter' ); + + const blocks = await editor.getBlocks(); + + // Since Live Search is a variation of the Search block, we check for the Search block instead. + const hasSearch = blocks.some( ( block ) => 'core/search' === block.name ); + + expect( hasSearch ).toBeTruthy(); + }); + + test( 'add a live search block inside a Popup and check results rendering', async({ admin, editor, page }) => { + await editor.insertBlock({ + name: 'themeisle-blocks/popup', + innerBlocks: [ + { + name: 'core/search', + attributes: { + otterIsLive: true + } + } + ] + }); + + const postId = await editor.publishPost(); + + await page.goto( `/?p=${postId}` ); + + const input = page.locator( '.otter-popup__modal_body .o-live-search input' ); + + expect ( input ).toBeVisible(); + + await input.fill( 'u' ); + + // If the width is 0, it means the results are not rendered properly. + const container = page.locator( '.o-live-search .container-wrap' ); + let width = await container.evaluate( node => node.offsetWidth ); + expect( width ).toBeGreaterThan( 0 ); + }); +}); diff --git a/src/blocks/test/e2e/blocks/section.spec.js b/src/blocks/test/e2e/blocks/section.spec.js index 2c9dd7b8d..4c1a8da6e 100644 --- a/src/blocks/test/e2e/blocks/section.spec.js +++ b/src/blocks/test/e2e/blocks/section.spec.js @@ -54,10 +54,6 @@ test.describe( 'Section Block', () => { let sectionBlock = ( await editor.getBlocks() ).find( ( block ) => 'themeisle-blocks/advanced-columns' === block.name ); - const { clientId } = sectionBlock; - - await page.click( `#block-${clientId}` ); - const columnController = page.getByRole( 'spinbutton', { name: 'Columns' }); await columnController.click(); @@ -85,10 +81,6 @@ test.describe( 'Section Block', () => { let sectionBlock = ( await editor.getBlocks() ).find( ( block ) => 'themeisle-blocks/advanced-columns' === block.name ); - const { clientId } = sectionBlock; - - await page.click( `#block-${clientId}` ); - const columnController = page.getByRole( 'spinbutton', { name: 'Columns' }); await columnController.click(); diff --git a/src/blocks/test/e2e/global-setup.ts b/src/blocks/test/e2e/global-setup.ts index 31c11e236..a8a8788fb 100644 --- a/src/blocks/test/e2e/global-setup.ts +++ b/src/blocks/test/e2e/global-setup.ts @@ -14,17 +14,12 @@ async function globalSetup( config: FullConfig ) { const storageStatePath = 'string' === typeof storageState ? storageState : undefined; - console.log( `[INFO] Base URL Test Instance: ${baseURL}` ); - const requestContext = await request.newContext({ baseURL }); const r = await requestContext.head( baseURL ); - console.log( '[Info] Request Status', r.status() ); - console.log( '[INFO] Endpoint Link', r.headers().link ); - if ( r.headers().link === undefined ) { console.warn( '[Warning] No links header found. The connection might be invalid.' ); } diff --git a/src/blocks/test/e2e/performance/performance.spec.js b/src/blocks/test/e2e/performance/performance.spec.js deleted file mode 100644 index f21cf7522..000000000 --- a/src/blocks/test/e2e/performance/performance.spec.js +++ /dev/null @@ -1,267 +0,0 @@ -/** - * External dependencies - */ -import { average, median, standardDeviation, quantileRank } from 'simple-statistics'; -import { PuppeteerScreenRecorder } from 'puppeteer-screen-recorder'; -import path from 'path'; - -/** - * WordPress dependencies - */ -import { - createNewPost, - saveDraft, - insertBlock, - openGlobalBlockInserter, - closeGlobalBlockInserter, - openListView, - closeListView, - canvas -} from '@wordpress/e2e-test-utils'; - -/** - * Internal dependencies - */ -import { - readFile, - deleteFile, - saveResultsFile, - getTraceFilePath, - getTypingEventDurations, - getClickEventDurations, - getHoverEventDurations, - getSelectionEventDurations, - getLoadingDurations, - sum -} from '../utils'; - -import { mapValues } from 'lodash'; - -jest.setTimeout( 1000000 ); - -async function loadHtmlIntoTheBlockEditor( html ) { - await page.evaluate( ( _html ) => { - const { parse } = window.wp.blocks; - const { dispatch } = window.wp.data; - const blocks = parse( _html ); - - blocks.forEach( ( block ) => { - if ( 'core/image' === block.name ) { - delete block.attributes.id; - delete block.attributes.url; - } - }); - - dispatch( 'core/block-editor' ).resetBlocks( blocks ); - }, html ); -} - -async function load1000Paragraphs() { - await page.evaluate( () => { - const { createBlock } = window.wp.blocks; - const { dispatch } = window.wp.data; - const blocks = Array.from({ length: 1000 }).map( () => - createBlock( 'core/paragraph' ) - ); - dispatch( 'core/block-editor' ).resetBlocks( blocks ); - }); -} - -let screenRecorder; - -const savePathVideo = './artifacts/tests/'; - -const screenRecorderOptions = { - followNewTab: true, - fps: 25 -}; - - -describe( 'Post Editor Performance', () => { - const results = { - serverResponse: [], - firstPaint: [], - domContentLoaded: [], - loaded: [], - firstContentfulPaint: [], - firstBlock: [], - type: [], - focus: [], - listViewOpen: [], - inserterOpen: [], - inserterHover: [], - inserterSearch: [] - }; - const traceFilePath = getTraceFilePath(); - let traceResults; - - afterAll( async() => { - - const summary = Object.entries( results ).filter( ([ _, value ]) => 0 < value.length ).map( ([ key, value ]) => { - - const data = mapValues({ - 'average': average( value ).toFixed( 2 ), - 'standardDeviation': standardDeviation( value ).toFixed( 2 ), - 'median': median( value ).toFixed( 2 ), - 'quantileRank60': ( quantileRank( value, 60 ) * 100 ).toFixed( 2 ), - 'quantileRank80': ( quantileRank( value, 80 ) * 100 ).toFixed( 2 ) - }, parseFloat ); - - if ( 'type' === key ) { - data.above60 = value.map( ( x, i ) => ({ i, x, render: `${i} - ${x.toFixed( 2 )}` }) ).filter( ({ x }) => 60 < x ).map( ({ render }) => render ).join( ', ' ); - } - - return [ `${key}`, data ]; - }); - results.summary = Object.fromEntries( summary ); - - saveResultsFile( __filename, results ); - deleteFile( traceFilePath ); - }); - - beforeEach( async() => { - await createNewPost(); - - // Disable auto-save to avoid impacting the metrics. - await page.evaluate( () => { - window.wp.data.dispatch( 'core/editor' ).updateEditorSettings({ - autosaveInterval: 100000000000, - localAutosaveInterval: 100000000000 - }); - }); - }); - - // it( 'Loading', async() => { - - // await loadHtmlIntoTheBlockEditor( - // readFile( path.join( __dirname, '../assets/large-post.html' ) ) - // ); - - // await loadHtmlIntoTheBlockEditor( - // readFile( path.join( __dirname, '../assets/large-otter-post.html' ) ) - // ); - - // await saveDraft(); - // const draftURL = await page.url(); - - // // Number of sample measurements to take. - // const samples = 5; - - // // Number of throwaway measurements to perform before recording samples. - // // Having at least one helps ensure that caching quirks don't manifest in - // // the results. - // const throwaway = 1; - - // let i = throwaway + samples; - // while ( i-- ) { - // await page.close(); - // page = await browser.newPage(); - - // await page.goto( draftURL ); - // await page.waitForSelector( '.edit-post-layout', { - // timeout: 120000 - // }); - // await canvas().waitForSelector( '.wp-block', { timeout: 120000 }); - - // if ( i < samples ) { - // const { - // serverResponse, - // firstPaint, - // domContentLoaded, - // loaded, - // firstContentfulPaint, - // firstBlock - // } = await getLoadingDurations(); - - // results.serverResponse.push( serverResponse ); - // results.firstPaint.push( firstPaint ); - // results.domContentLoaded.push( domContentLoaded ); - // results.loaded.push( loaded ); - // results.firstContentfulPaint.push( firstContentfulPaint ); - // results.firstBlock.push( firstBlock ); - // } - // } - - // await saveDraft(); - // }); - - it( 'Typing', async() => { - - // screenRecorder = new PuppeteerScreenRecorder( page, screenRecorderOptions ); - // await screenRecorder.start( savePathVideo + 'typing-test.mp4' ); - - await loadHtmlIntoTheBlockEditor( - readFile( path.join( __dirname, '../assets/large-post.html' ) ) - ); - - await loadHtmlIntoTheBlockEditor( - readFile( path.join( __dirname, '../assets/large-otter-post.html' ) ) - ); - - await insertBlock( 'Paragraph' ); - let i = 20; - await page.tracing.start({ - path: traceFilePath, - screenshots: false, - categories: [ 'devtools.timeline' ] - }); - while ( i-- ) { - - // Wait for the browser to be idle before starting the monitoring. - // The timeout should be big enough to allow all async tasks tor run. - // And also to allow Rich Text to mark the change as persistent. - // eslint-disable-next-line no-restricted-syntax - await page.waitForTimeout( 2000 ); - await page.keyboard.type( 'x' ); - } - await page.tracing.stop(); - traceResults = JSON.parse( readFile( traceFilePath ) ); - const [ keyDownEvents, keyPressEvents, keyUpEvents ] = - getTypingEventDurations( traceResults ); - if ( - keyDownEvents.length === keyPressEvents.length && - keyPressEvents.length === keyUpEvents.length - ) { - - // The first character typed triggers a longer time (isTyping change) - // It can impact the stability of the metric, so we exclude it. - for ( let j = 1; j < keyDownEvents.length; j++ ) { - results.type.push( - keyDownEvents[ j ] + keyPressEvents[ j ] + keyUpEvents[ j ] - ); - } - } - - await saveDraft(); - - // await screenRecorder.stop(); - }); - - it( 'Selecting blocks', async() => { - await load1000Paragraphs(); - const paragraphs = await canvas().$$( '.wp-block' ); - await paragraphs[ 0 ].click(); - for ( let j = 1; 10 >= j; j++ ) { - - // Wait for the browser to be idle before starting the monitoring. - // eslint-disable-next-line no-restricted-syntax - await page.waitForTimeout( 1000 ); - await page.tracing.start({ - path: traceFilePath, - screenshots: false, - categories: [ 'devtools.timeline' ] - }); - await paragraphs[ j ].click(); - await page.tracing.stop(); - traceResults = JSON.parse( readFile( traceFilePath ) ); - const allDurations = getSelectionEventDurations( traceResults ); - results.focus.push( - allDurations.reduce( ( acc, eventDurations ) => { - return acc + sum( eventDurations ); - }, 0 ) - ); - } - - await saveDraft(); - }); -}); diff --git a/src/blocks/test/e2e/utils.js b/src/blocks/test/e2e/utils.js index c7029be19..e052e47c2 100644 --- a/src/blocks/test/e2e/utils.js +++ b/src/blocks/test/e2e/utils.js @@ -1,149 +1,70 @@ /** * External dependencies */ -import path from 'path'; -import { existsSync, readFileSync, unlinkSync, writeFileSync } from 'fs'; +import { existsSync, readFileSync, unlinkSync } from 'fs'; -export function readFile( filePath ) { - return existsSync( filePath ) ? - readFileSync( filePath, 'utf8' ).trim() : - ''; -} - -export function deleteFile( filePath ) { - if ( existsSync( filePath ) ) { - unlinkSync( filePath ); +export function sum( array ) { + if ( ! array || ! array.length ) { + return undefined; } -} -export function getTraceFilePath() { - return path.join( process.env.WP_ARTIFACTS_PATH, '/trace.json' ); + return array.reduce( ( a, b ) => a + b, 0 ); } -export function saveResultsFile( testFilename, results ) { - const resultsFilename = - process.env.RESULTS_FILENAME || - path.basename( testFilename, '.js' ) + '.performance-results.json'; - - return writeFileSync( - path.join( process.env.WP_ARTIFACTS_PATH, resultsFilename ), - JSON.stringify( results, null, 2 ) - ); -} - -function isEvent( item ) { - return ( - 'devtools.timeline' === item.cat && - 'EventDispatch' === item.name && - item.dur && - item.args && - item.args.data - ); -} - -function isKeyDownEvent( item ) { - return isEvent( item ) && 'keydown' === item.args.data.type; -} - -function isKeyPressEvent( item ) { - return isEvent( item ) && 'keypress' === item.args.data.type; -} - -function isKeyUpEvent( item ) { - return isEvent( item ) && 'keyup' === item.args.data.type; -} +export function average( array ) { + if ( ! array || ! array.length ) { + return undefined; + } -function isFocusEvent( item ) { - return isEvent( item ) && 'focus' === item.args.data.type; + return sum( array ) / array.length; } -function isFocusInEvent( item ) { - return isEvent( item ) && 'focusin' === item.args.data.type; -} +export function median( array ) { + if ( ! array || ! array.length ) { + return undefined; + } -function isClickEvent( item ) { - return isEvent( item ) && 'click' === item.args.data.type; -} + const numbers = [ ...array ].sort( ( a, b ) => a - b ); + const middleIndex = Math.floor( numbers.length / 2 ); -function isMouseOverEvent( item ) { - return isEvent( item ) && 'mouseover' === item.args.data.type; + if ( 0 === numbers.length % 2 ) { + return ( numbers[ middleIndex - 1 ] + numbers[ middleIndex ]) / 2; + } + return numbers[ middleIndex ]; } -function isMouseOutEvent( item ) { - return isEvent( item ) && 'mouseout' === item.args.data.type; -} +export function minimum( array ) { + if ( ! array || ! array.length ) { + return undefined; + } -function getEventDurationsForType( trace, filterFunction ) { - return trace.traceEvents - .filter( filterFunction ) - .map( ( item ) => item.dur / 1000 ); + return Math.min( ...array ); } -export function getTypingEventDurations( trace ) { - return [ - getEventDurationsForType( trace, isKeyDownEvent ), - getEventDurationsForType( trace, isKeyPressEvent ), - getEventDurationsForType( trace, isKeyUpEvent ) - ]; -} +export function maximum( array ) { + if ( ! array || ! array.length ) { + return undefined; + } -export function getSelectionEventDurations( trace ) { - return [ - getEventDurationsForType( trace, isFocusEvent ), - getEventDurationsForType( trace, isFocusInEvent ) - ]; + return Math.max( ...array ); } -export function getClickEventDurations( trace ) { - return [ getEventDurationsForType( trace, isClickEvent ) ]; -} +export function round( number, decimalPlaces = 2 ) { + const factor = Math.pow( 10, decimalPlaces ); -export function getHoverEventDurations( trace ) { - return [ - getEventDurationsForType( trace, isMouseOverEvent ), - getEventDurationsForType( trace, isMouseOutEvent ) - ]; + return Math.round( number * factor ) / factor; } -export async function getLoadingDurations() { - return await page.evaluate( () => { - const [ - { - requestStart, - responseStart, - responseEnd, - domContentLoadedEventEnd, - loadEventEnd - } - ] = performance.getEntriesByType( 'navigation' ); - const paintTimings = performance.getEntriesByType( 'paint' ); - return { - - // Server side metric. - serverResponse: responseStart - requestStart, - - // For client side metrics, consider the end of the response (the - // browser receives the HTML) as the start time (0). - firstPaint: - paintTimings.find( ({ name }) => 'first-paint' === name ) - .startTime - responseEnd, - domContentLoaded: domContentLoadedEventEnd - responseEnd, - loaded: loadEventEnd - responseEnd, - firstContentfulPaint: - paintTimings.find( - ({ name }) => 'first-contentful-paint' === name - ).startTime - responseEnd, - - // This is evaluated right after Puppeteer found the block selector. - firstBlock: performance.now() - responseEnd - }; - }); -} +export function readFile( filePath ) { + if ( ! existsSync( filePath ) ) { + throw new Error( `File does not exist: ${ filePath }` ); + } -export function sum( arr ) { - return arr.reduce( ( a, b ) => a + b, 0 ); + return readFileSync( filePath, 'utf8' ).trim(); } -export function sequence( start, length ) { - return Array.from({ length }, ( _, i ) => i + start ); +export function deleteFile( filePath ) { + if ( existsSync( filePath ) ) { + unlinkSync( filePath ); + } } diff --git a/src/blocks/test/e2e/assets/large-post.html b/src/blocks/test/performance/assets/large-post.html similarity index 55% rename from src/blocks/test/e2e/assets/large-post.html rename to src/blocks/test/performance/assets/large-post.html index 0103e22c8..f69f8cc67 100644 --- a/src/blocks/test/e2e/assets/large-post.html +++ b/src/blocks/test/performance/assets/large-post.html @@ -3048,2506 +3048,1355 @@

Satis est ad hoc responsum.

An tu me de L.

- -

Itaque hic ipse iam pridem est reiectus; Nummus in Croesi divitiis obscuratur, pars est tamen divitiarum. Sed non alienum est, quo facilius vis verbi intellegatur, rationem huius verbi faciendi Zenonis exponere. Nihil enim iam habes, quod ad corpus referas; Quamvis enim depravatae non sint, pravae tamen esse possunt. Cur tantas regiones barbarorum pedibus obiit, tot maria transmisit? Nunc agendum est subtilius. Optime, inquam.

- - - -

His similes sunt omnes, qui virtuti student levantur vitiis, levantur erroribus, nisi forte censes Ti. Est autem etiam actio quaedam corporis, quae motus et status naturae congruentis tenet; Incommoda autem et commoda-ita enim estmata et dustmata appello-communia esse voluerunt, paria noluerunt. Ita relinquet duas, de quibus etiam atque etiam consideret. Si sapiens, ne tum quidem miser, cum ab Oroete, praetore Darei, in crucem actus est. Quae autem natura suae primae institutionis oblita est? Quid, si etiam iucunda memoria est praeteritorum malorum? An ea, quae per vinitorem antea consequebatur, per se ipsa curabit? Sit sane ista voluptas. Aliter homines, aliter philosophos loqui putas oportere?

- - - -

Itaque contra est, ac dicitis; Dicam, inquam, et quidem discendi causa magis, quam quo te aut Epicurum reprehensum velim. Earum etiam rerum, quas terra gignit, educatio quaedam et perfectio est non dissimilis animantium. Sin tantum modo ad indicia veteris memoriae cognoscenda, curiosorum. Dici enim nihil potest verius. Hoc positum in Phaedro a Platone probavit Epicurus sensitque in omni disputatione id fieri oportere. Praeterea sublata cognitione et scientia tollitur omnis ratio et vitae degendae et rerum gerendarum. Tu quidem reddes; Aliter enim nosmet ipsos nosse non possumus.

- - - -

Nescio quo modo praetervolavit oratio. Servari enim iustitia nisi a forti viro, nisi a sapiente non potest. Quod cum ita sit, perspicuum est omnis rectas res atque laudabilis eo referri, ut cum voluptate vivatur. Zenonis est, inquam, hoc Stoici. Nunc haec primum fortasse audientis servire debemus. At iste non dolendi status non vocatur voluptas. Ne discipulum abducam, times.

- - - -

Habes, inquam, Cato, formam eorum, de quibus loquor, philosophorum. Istam voluptatem perpetuam quis potest praestare sapienti? Ut optime, secundum naturam affectum esse possit. Audeo dicere, inquit. Ut optime, secundum naturam affectum esse possit. Id mihi magnum videtur. A villa enim, credo, et: Si ibi te esse scissem, ad te ipse venissem. Sed tu istuc dixti bene Latine, parum plane. Cum autem in quo sapienter dicimus, id a primo rectissime dicitur. Equidem e Cn. Sed tamen est aliquid, quod nobis non liceat, liceat illis.

- - - -
Sed potestne rerum maior esse dissensio?
- - - -

Inde sermone vario sex illa a Dipylo stadia confecimus. Hinc ceteri particulas arripere conati suam quisque videro voluit afferre sententiam. Cupit enim dícere nihil posse ad beatam vitam deesse sapienti. Respondent extrema primis, media utrisque, omnia omnibus. Eam tum adesse, cum dolor omnis absit; Ait enim se, si uratur, Quam hoc suave! dicturum. Te enim iudicem aequum puto, modo quae dicat ille bene noris. Quid censes in Latino fore? Nam, ut sint illa vendibiliora, haec uberiora certe sunt.

- - - -

Quonam, inquit, modo?

- - - -

Quae cum dixisset paulumque institisset, Quid est? Sed fortuna fortis; Tubulo putas dicere? Non enim, si omnia non sequebatur, idcirco non erat ortus illinc. Sequitur disserendi ratio cognitioque naturae; Quaesita enim virtus est, non quae relinqueret naturam, sed quae tueretur.

- - - -
+ +
+ + + +
+ + + + +
+
+ +
+ + + +
+ +
+
+ + + +
+
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec + auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis + dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. + Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, + condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. + Tristique natoque euismod rutrum massa nascetur.

+ + + +

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec + auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis + dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. + Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, + condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. + Tristique natoque euismod rutrum massa nascetur.

+ + + +

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec + auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis + dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. + Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, + condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. + Tristique natoque euismod rutrum massa nascetur.

+ + + +

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec + auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis + dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. + Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, + condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. + Tristique natoque euismod rutrum massa nascetur.

+ + + +

Lorem ipsum odor amet, consectetuer adipiscing elit. Fames tristique et ultrices eleifend elit donec + auctor orci. In imperdiet mauris amet turpis tortor. Ullamcorper sagittis potenti justo mollis + dapibus integer maecenas varius nascetur. Ipsum sit platea consequat id, vitae sagittis proin. + Hendrerit senectus class sodales dictum imperdiet condimentum et eleifend. Feugiat fusce tellus, + condimentum eu sollicitudin urna. Elit neque justo sociosqu condimentum ornare libero vitae. + Tristique natoque euismod rutrum massa nascetur.

+
+ + + +
+
+
+
+ + + +
+
+ +
+ + + +
+ +
+
+
+ + + +
Pills 錠剤
65
+ + + +
+ + + + + + +
Skill
50%
+ + + +
Skill
+ + + +
0
Day
0
Hour
0
Minute
0
Second
+ + + +
+
dfd
+

sdfdsfsd

+
+
+ + + +
+
Untitled Tab
+

hey hey

+
+ + + +
Untitled Tab
+

+
+
+
+ + + +
+ + + + + + + + + +
+ + + +
+
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean + sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit + iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet + dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; + tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. + Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus + egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra + gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam + malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

+ + + +

Lorem ipsum odor amet, consectetuer adipiscing elit. Fusce habitasse suscipit egestas nunc aenean + sollicitudin ultrices proin. Porttitor nibh sociosqu pharetra, vehicula maximus scelerisque? Suscipit + iaculis habitant cras habitant porttitor torquent fusce semper. Aliquam leo litora iaculis ultrices amet + dolor. Ac placerat leo velit malesuada aptent, class netus nulla. Nullam fusce hac lacinia arcu et; + tristique gravida quam accumsan. Metus sagittis tristique aliquet curabitur nam porttitor cubilia dui. + Ullamcorper venenatis vestibulum mi est amet. Faucibus ac habitant diam sit elementum sollicitudin netus + egestas. Lacinia molestie pulvinar mollis feugiat, luctus eget mollis nulla euismod. Eleifend pharetra + gravida tempor vestibulum convallis curae, phasellus venenatis. Sit per vehicula eu ligula etiam + malesuada penatibus. Nisi erat justo vestibulum netus consectetur semper ut conubia.

+
+ + + +
+
+https://www.youtube.com/watch?v=67tT2PbiWcI +
+
+
+ + + +
+
Skill
+ + + +
+
Circle
+
Skill
+
+
+ + + +
+
+
Skill
+
+ + + +
+
Skill
+
+ + + +
+
Skill
+
+
+ + + +
+
Test 1
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu + porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis + justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor + facilisis non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu + sociosqu interdum.

+
+ + + +
Circle
+
Skill
+
+
+
+ + + +
+
+ + + +
+ + + +
+ + + +
+ + + +
+ + + +

You agree to receive email communication from us by submitting this form + and understand that your contact information will be stored with us.

+ + +
+ + + +

- At vero Epicurus una in domo, et ea quidem angusta, quam magnos quantaque amoris conspiratione consentientis tenuit amicorum greges! quod fit etiam nunc ab Epicureis. -

-
- - - -

Inde igitur, inquit, ordiendum est. At hoc in eo M. Multoque hoc melius nos veriusque quam Stoici. Ex quo, id quod omnes expetunt, beate vivendi ratio inveniri et comparari potest. Teneo, inquit, finem illi videri nihil dolere. Minime vero istorum quidem, inquit. Ex eorum enim scriptis et institutis cum omnis doctrina liberalis, omnis historia. Aliud igitur esse censet gaudere, aliud non dolere.

- - - -

Quamvis enim depravatae non sint, pravae tamen esse possunt. Curium putes loqui, interdum ita laudat, ut quid praeterea sit bonum neget se posse ne suspicari quidem. Miserum hominem! Si dolor summum malum est, dici aliter non potest. Sed erat aequius Triarium aliquid de dissensione nostra iudicare. Hanc ergo intuens debet institutum illud quasi signum absolvere. Non autem hoc: igitur ne illud quidem. Quibus ego vehementer assentior. An dolor longissimus quisque miserrimus, voluptatem non optabiliorem diuturnitas facit?

- - - -
Quae similitudo in genere etiam humano apparet.
- - - -

Nam adhuc, meo fortasse vitio, quid ego quaeram non perspicis. Suam denique cuique naturam esse ad vivendum ducem.

- - - -
Duo enim genera quae erant, fecit tria.
- - - -

Nam Metrodorum non puto ipsum professum, sed, cum appellaretur ab Epicuro, repudiare tantum beneficium noluisse; Eadem nunc mea adversum te oratio est. Ut alios omittam, hunc appello, quem ille unum secutus est. Itaque nostrum est-quod nostrum dico, artis est-ad ea principia, quae accepimus. Sed utrum hortandus es nobis, Luci, inquit, an etiam tua sponte propensus es? Ipse Epicurus fortasse redderet, ut Sextus Peducaeus, Sex.

- - - -

Quid est igitur, inquit, quod requiras? Ille enim occurrentia nescio quae comminiscebatur; Experiamur igitur, inquit, etsi habet haec Stoicorum ratio difficilius quiddam et obscurius. Cum salvum esse flentes sui respondissent, rogavit essentne fusi hostes.

+ This is a speed test. See how it goes. +

- -

Memini vero, inquam; Respondeat totidem verbis. Quae similitudo in genere etiam humano apparet. Ita fit cum gravior, tum etiam splendidior oratio. Unum nescio, quo modo possit, si luxuriosus sit, finitas cupiditates habere.

+ +

+ This is a speed test. See how it goes. +

- -
Quae cum dixisset paulumque institisset, Quid est?
- - - -

Quae cum ita sint, effectum est nihil esse malum, quod turpe non sit. Quo modo autem optimum, si bonum praeterea nullum est? Si de re disceptari oportet, nulla mihi tecum, Cato, potest esse dissensio. Apparet statim, quae sint officia, quae actiones. Istam voluptatem, inquit, Epicurus ignorat? Hoc ille tuus non vult omnibusque ex rebus voluptatem quasi mercedem exigit. Eam stabilem appellas. Sed eum qui audiebant, quoad poterant, defendebant sententiam suam. Haec dicuntur inconstantissime. Suo genere perveniant ad extremum; Sed ille, ut dixi, vitiose.

+ +

+ This is a speed test. See how it goes. +

- -

Quid de Platone aut de Democrito loquar? Sed haec in pueris; Utrum igitur tibi litteram videor an totas paginas commovere? Summum ením bonum exposuit vacuitatem doloris; Memini vero, inquam; Quis non odit sordidos, vanos, leves, futtiles?

+ +

+ This is a speed test. See how it goes. +

- -

Sed eum qui audiebant, quoad poterant, defendebant sententiam suam.

- - - -

Recte dicis; Sed haec in pueris; Quid ergo hoc loco intellegit honestum? Et quidem, inquit, vehementer errat; Prodest, inquit, mihi eo esse animo.

+ +

+ This is a speed test. See how it goes. +

- -

Quis istud, quaeso, nesciebat? Bonum integritas corporis: misera debilitas. Ut nemo dubitet, eorum omnia officia quo spectare, quid sequi, quid fugere debeant? Itaque sensibus rationem adiunxit et ratione effecta sensus non reliquit. Huius, Lyco, oratione locuples, rebus ipsis ielunior. Quod autem ratione actum est, id officium appellamus. Ergo hoc quidem apparet, nos ad agendum esse natos.

+ +

Block Text - Different languages

- -
- - - -

Suo genere perveniant ad extremum;

- - - -

Quod vestri non item. Rationis enim perfectio est virtus; Quaeque de virtutibus dicta sunt, quem ad modum eae semper voluptatibus inhaererent, eadem de amicitia dicenda sunt. Odium autem et invidiam facile vitabis. Minime vero, inquit ille, consentit. Neque solum ea communia, verum etiam paria esse dixerunt.

+ +

+ Lorem ipsum odor amet, consectetuer adipiscing elit. Cursus dignissim ultricies + fusce fermentum feugiat, morbi ex nunc. Molestie mattis finibus morbi magnis semper. In orci + varius est inceptos congue. Facilisi metus est vulputate parturient pellentesque. Egestas + quis habitant vel nostra per. Potenti penatibus augue magnis cubilia etiam maximus lacinia. + +

-

Sed haec quidem liberius ab eo dicuntur et saepius. Paria sunt igitur. Num quid tale Democritus? Nam Pyrrho, Aristo, Erillus iam diu abiecti. Quid ei reliquisti, nisi te, quoquo modo loqueretur, intellegere, quid diceret? Mihi enim satis est, ipsis non satis. Itaque contra est, ac dicitis; Duarum enim vitarum nobis erunt instituta capienda.

- - - -

- Quibus expositis facilis est coniectura ea maxime esse expetenda ex nostris, quae plurimum habent dignitatis, ut optimae cuiusque partis, quae per se expetatur, virtus sit expetenda maxime. -

-
- - - -

Atque adhuc ea dixi, causa cur Zenoni non fuisset, quam ob rem a superiorum auctoritate discederet. Quare conare, quaeso. Familiares nostros, credo, Sironem dicis et Philodemum, cum optimos viros, tum homines doctissimos.

- - - -

Paulum, cum regem Persem captum adduceret, eodem flumine invectio?

- - - -

Sin tantum modo ad indicia veteris memoriae cognoscenda, curiosorum. Vitae autem degendae ratio maxime quidem illis placuit quieta. Eiuro, inquit adridens, iniquum, hac quidem de re; Sed fortuna fortis; Quae duo sunt, unum facit. Uterque enim summo bono fruitur, id est voluptate. Quae qui non vident, nihil umquam magnum ac cognitione dignum amaverunt. Ita credo.

- - - -

Quo plebiscito decreta a senatu est consuli quaestio Cn. Quid est igitur, cur ita semper deum appellet Epicurus beatum et aeternum? Quia nec honesto quic quam honestius nec turpi turpius. Gracchum patrem non beatiorem fuisse quam fillum, cum alter stabilire rem publicam studuerit, alter evertere. Bestiarum vero nullum iudicium puto. Peccata paria. Et quidem, inquit, vehementer errat; Deprehensus omnem poenam contemnet. Haec igitur Epicuri non probo, inquam.

- - - -

Ergo omni animali illud, quod appetiti positum est in eo, quod naturae est accommodatum. Ita enim vivunt quidam, ut eorum vita refellatur oratio. Nam, ut sint illa vendibiliora, haec uberiora certe sunt. Quae quidem vel cum periculo est quaerenda vobis;

- - - -

Aliter enim nosmet ipsos nosse non possumus.

- - - -

Cur, nisi quod turpis oratio est? Vide, quantum, inquam, fallare, Torquate. Beatus sibi videtur esse moriens. Sic enim censent, oportunitatis esse beate vivere. Aut unde est hoc contritum vetustate proverbium: quicum in tenebris? Unum nescio, quo modo possit, si luxuriosus sit, finitas cupiditates habere.

- - - -

Sed quot homines, tot sententiae; Quod si ita sit, cur opera philosophiae sit danda nescio. Cur id non ita fit? Quorum altera prosunt, nocent altera. Quippe: habes enim a rhetoribus; Amicitiae vero locus ubi esse potest aut quis amicus esse cuiquam, quem non ipsum amet propter ipsum? Parvi enim primo ortu sic iacent, tamquam omnino sine animo sint. Restinguet citius, si ardentem acceperit. Quod autem principium officii quaerunt, melius quam Pyrrho;

- - - -

Idcirco enim non desideraret, quia, quod dolore caret, id in voluptate est.

- - - -

Qui enim existimabit posse se miserum esse beatus non erit. Tollenda est atque extrahenda radicitus. Ergo illi intellegunt quid Epicurus dicat, ego non intellego? Si de re disceptari oportet, nulla mihi tecum, Cato, potest esse dissensio. Nos paucis ad haec additis finem faciamus aliquando; Nosti, credo, illud: Nemo pius est, qui pietatem-; Si quicquam extra virtutem habeatur in bonis. An me, inquam, nisi te audire vellem, censes haec dicturum fuisse?

- - - -
    -
  • Pudebit te, inquam, illius tabulae, quam Cleanthes sane commode verbis depingere solebat.
  • - - - -
  • Huic mori optimum esse propter desperationem sapientiae, illi propter spem vivere.
  • - - - -
  • Quae hic rei publicae vulnera inponebat, eadem ille sanabat.
  • - - - -
  • Hoc est non modo cor non habere, sed ne palatum quidem.
  • -
- - - -

Haeret in salebra. Respondent extrema primis, media utrisque, omnia omnibus.

- - - -

Quis non odit sordidos, vanos, leves, futtiles? Post enim Chrysippum eum non sane est disputatum. Omnia contraria, quos etiam insanos esse vultis. Theophrastus mediocriterne delectat, cum tractat locos ab Aristotele ante tractatos? Sed ad haec, nisi molestum est, habeo quae velim. Simus igitur contenti his. Videmusne ut pueri ne verberibus quidem a contemplandis rebus perquirendisque deterreantur? Verum hoc idem saepe faciamus. In eo enim positum est id, quod dicimus esse expetendum. At enim hic etiam dolore.

- - - -

Nec vero sum nescius esse utilitatem in historia, non modo voluptatem. Huic mori optimum esse propter desperationem sapientiae, illi propter spem vivere.

- - - -

Oratio me istius philosophi non offendit; Is ita vivebat, ut nulla tam exquisita posset inveniri voluptas, qua non abundaret. Ita fit cum gravior, tum etiam splendidior oratio. Cur tantas regiones barbarorum pedibus obiit, tot maria transmisit? Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Nihilne est in his rebus, quod dignum libero aut indignum esse ducamus? Terram, mihi crede, ea lanx et maria deprimet.

- - - -

Duo enim genera quae erant, fecit tria. In quibus doctissimi illi veteres inesse quiddam caeleste et divinum putaverunt. Suam denique cuique naturam esse ad vivendum ducem. Dicet pro me ipsa virtus nec dubitabit isti vestro beato M. Intellegi quidem, ut propter aliam quampiam rem, verbi gratia propter voluptatem, nos amemus; Quae tamen a te agetur non melior, quam illae sunt, quas interdum optines. At ille pellit, qui permulcet sensum voluptate. Illi enim inter se dissentiunt.

- - - -

Quamvis enim depravatae non sint, pravae tamen esse possunt. Aut, Pylades cum sis, dices te esse Orestem, ut moriare pro amico? Nobis aliter videtur, recte secusne, postea; Quid iudicant sensus? Teneo, inquit, finem illi videri nihil dolere. Fortemne possumus dicere eundem illum Torquatum?

- - - -

Mihi enim satis est, ipsis non satis.

- - - -

Gloriosa ostentatio in constituendo summo bono. Nulla erit controversia. Nemo nostrum istius generis asotos iucunde putat vivere. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Ut pulsi recurrant? Negare non possum.

- - - -

Quae est igitur causa istarum angustiarum?

- - - -

Ut non sine causa ex iis memoriae ducta sit disciplina. Faceres tu quidem, Torquate, haec omnia; Eadem nunc mea adversum te oratio est. Sedulo, inquam, faciam. Recte, inquit, intellegis. Legimus tamen Diogenem, Antipatrum, Mnesarchum, Panaetium, multos alios in primisque familiarem nostrum Posidonium. Ego vero volo in virtute vim esse quam maximam;

- - - -
Heri, inquam, ludis commissis ex urbe profectus veni ad vesperum.
- - - -

Cupit enim dícere nihil posse ad beatam vitam deesse sapienti. Nondum autem explanatum satis, erat, quid maxime natura vellet. Quae sunt igitur communia vobis cum antiquis, iis sic utamur quasi concessis; Incommoda autem et commoda-ita enim estmata et dustmata appello-communia esse voluerunt, paria noluerunt. Quid me istud rogas? Nam et complectitur verbis, quod vult, et dicit plane, quod intellegam; Ergo opifex plus sibi proponet ad formarum quam civis excellens ad factorum pulchritudinem? Paulum, cum regem Persem captum adduceret, eodem flumine invectio? Potius ergo illa dicantur: turpe esse, viri non esse debilitari dolore, frangi, succumbere. Sit, inquam, tam facilis, quam vultis, comparatio voluptatis, quid de dolore dicemus?

- - - -

Pauca mutat vel plura sane;

- - - -

An eum discere ea mavis, quae cum plane perdidiceriti nihil sciat? Similiter sensus, cum accessit ad naturam, tuetur illam quidem, sed etiam se tuetur; Quis non odit sordidos, vanos, leves, futtiles? Negat esse eam, inquit, propter se expetendam. Quis Aristidem non mortuum diligit? Certe non potest.

- - - -

Ea possunt paria non esse. Quem ad modum quis ambulet, sedeat, qui ductus oris, qui vultus in quoque sit? Si longus, levis; Eodem modo is enim tibi nemo dabit, quod, expetendum sit, id esse laudabile. Itaque his sapiens semper vacabit. Alterum significari idem, ut si diceretur, officia media omnia aut pleraque servantem vivere. Sed ille, ut dixi, vitiose. Quis est enim, in quo sit cupiditas, quin recte cupidus dici possit?

- - - -

Collige omnia, quae soletis: Praesidium amicorum.

- - - -

An vero displicuit ea, quae tributa est animi virtutibus tanta praestantia? Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Quae contraria sunt his, malane? Oculorum, inquit Plato, est in nobis sensus acerrimus, quibus sapientiam non cernimus. Neminem videbis ita laudatum, ut artifex callidus comparandarum voluptatum diceretur. Iis igitur est difficilius satis facere, qui se Latina scripta dicunt contemnere. Nec vero sum nescius esse utilitatem in historia, non modo voluptatem. Itaque vides, quo modo loquantur, nova verba fingunt, deserunt usitata.

- - - -
Non laboro, inquit, de nomine.
- - - -

Ut optime, secundum naturam affectum esse possit. Si enim ad populum me vocas, eum. Quid de Platone aut de Democrito loquar?

- - - -
Quae quo sunt excelsiores, eo dant clariora indicia naturae.
- - - -

Itaque haec cum illis est dissensio, cum Peripateticis nulla sane. Piso igitur hoc modo, vir optimus tuique, ut scis, amantissimus. Laboro autem non sine causa; Aliter homines, aliter philosophos loqui putas oportere? Quid enim mihi potest esse optatius quam cum Catone, omnium virtutum auctore, de virtutibus disputare? Est, ut dicis, inquam. Collatio igitur ista te nihil iuvat. Sic consequentibus vestris sublatis prima tolluntur. Dolor ergo, id est summum malum, metuetur semper, etiamsi non aderit; Sed ille, ut dixi, vitiose.

- - - -
    -
  • Haec qui audierit, ut ridere non curet, discedet tamen nihilo firmior ad dolorem ferendum, quam venerat.
  • - - - -
  • Sic, et quidem diligentius saepiusque ista loquemur inter nos agemusque communiter.
  • - - - -
  • Nec vero sum nescius esse utilitatem in historia, non modo voluptatem.
  • - - - -
  • Laelius clamores sofòw ille so lebat Edere compellans gumias ex ordine nostros.
  • -
- - - -

Nam illud vehementer repugnat, eundem beatum esse et multis malis oppressum. Te enim iudicem aequum puto, modo quae dicat ille bene noris. Similiter sensus, cum accessit ad naturam, tuetur illam quidem, sed etiam se tuetur;

+ Lorem ipsum odor amet, consectetuer adipiscing elit. Mauris sagittis posuere fringilla integer + tristique dolor. Nascetur dapibus ipsum fusce euismod himenaeos. Sociosqu tellus lacinia dolor. Donec hac + velit donec vitae justo congue. Rutrum fames aptent convallis, nibh habitant vulputate. Integer nec accumsan + lacus ut nostra habitasse risus. Mauris integer curae feugiat malesuada tellus congue dis. Maecenas mattis + sociosqu nibh. Varius phasellus phasellus fringilla torquent! Tempus iaculis aenean ante sodales. Porta + potenti curabitur ex pulvinar eu rhoncus. +

- -
    -
  • Si enim ita est, vide ne facinus facias, cum mori suadeas.
  • - - - -
  • Quis Aristidem non mortuum diligit?
  • - - - -
  • Quos quidem tibi studiose et diligenter tractandos magnopere censeo.
  • - - - -
  • Sin te auctoritas commovebat, nobisne omnibus et Platoni ipsi nescio quem illum anteponebas?
  • -
- - - -

Ex ea difficultate illae fallaciloquae, ut ait Accius, malitiae natae sunt. Nec tamen ille erat sapiens quis enim hoc aut quando aut ubi aut unde? Quorum altera prosunt, nocent altera. An est aliquid per se ipsum flagitiosum, etiamsi nulla comitetur infamia? Itaque ad tempus ad Pisonem omnes. Disserendi artem nullam habuit. Et harum quidem rerum facilis est et expedita distinctio. Erat enim Polemonis. Huius ego nunc auctoritatem sequens idem faciam.

+ +

前ホタ初室モコ払対10女へ投能作ゃ産療質ドぎるお曜計カム嫉他わひごき徹下ヘセ浮直くほめだ式直にろそト提紙おぽは報対ミ崩際タ棋花政エシ向掲ラ図費高壌ろんだ。 + 情ざつご目整ネワエス言出ヘヨレフ者授ま車56西区ゅぜで融通ざるイひ被見山さラとス争味ぐこづ場合ネカ惑堂ロ転熱か男見ねで全返トぱそ直断伐だほぴず。 +

- -

Quem ad modum quis ambulet, sedeat, qui ductus oris, qui vultus in quoque sit?

- - -

Beatus autem esse in maximarum rerum timore nemo potest. Sed quid minus probandum quam esse aliquem beatum nec satis beatum? Quem si tenueris, non modo meum Ciceronem, sed etiam me ipsum abducas licebit. Themistocles quidem, cum ei Simonides an quis alius artem memoriae polliceretur, Oblivionis, inquit, mallem. Quorum sine causa fieri nihil putandum est. Illa argumenta propria videamus, cur omnia sint paria peccata. Nunc de hominis summo bono quaeritur; Quare attendo te studiose et, quaecumque rebus iis, de quibus hic sermo est, nomina inponis, memoriae mando; Hoc non est positum in nostra actione. Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare.

+

Лорем ипсум долор сит амет, цу вим поссе фиерент сцаевола, ат дуо видерер адмодум дигниссим. Яуо татион инвидунт + глориатур цу. Проприае рецусабо алияуандо ет хис. Луцилиус хендрерит диссентиет сит еу, денияуе + алияуандо еу ест. Ат менандри праесент еос. +

- -

Duarum enim vitarum nobis erunt instituta capienda. At enim sequor utilitatem. Et ille ridens: Video, inquit, quid agas; Post enim Chrysippum eum non sane est disputatum. Eadem nunc mea adversum te oratio est.

+ +

전인 광야에서 보내는 봄바람이다, 과실이 대중을 오직 황금시대다. 수 끓는 때까지 거친 이성은 같지 우리는 것이다. 피부가 넣는 + 얼음에 것은 하였으며, 아름다우냐? 이는 인류의 열락의 내려온 약동하다. 이상의 되려니와. 우리는 우리 바이며. 가는 이것은 인간의 이상 것이다. +

- -

Et quidem, inquit, vehementer errat;

- - - -

Omnis enim est natura diligens sui. Quid ad utilitatem tantae pecuniae? Graecis hoc modicum est: Leonidas, Epaminondas, tres aliqui aut quattuor; Hic ego: Pomponius quidem, inquam, noster iocari videtur, et fortasse suo iure. Modo etiam paulum ad dexteram de via declinavi, ut ad Pericli sepulcrum accederem. Sed ad rem redeamus; In eo enim positum est id, quod dicimus esse expetendum. At quicum ioca seria, ut dicitur, quicum arcana, quicum occulta omnia?

+ +

Λορεμ ιπσθμ δολορ σιτ αμετ, περcιπιτθρ vολθπτατιβθσ ναμ θτ, νε μει ηαβεο νοvθμ σεμπερ. + Ιδ σεμπερ μανδαμθσ σεα. Ποστεα cονστιτθαμ πρι ει. Αν εστ ερατ πριμα. Περτιναξ cονσθλατθ γλοριατθρ + ηασ εθ, cετερο νοστρθδ ιραcθνδια ατ εστ, εξ ναμ μαλισ περcιπιτθρ. Qθοτ σινγθλισ νε πρι, τε vελ qθανδο + πονδερθμ εφφιcιαντθρ, παρτεμ γραεcο εθ σεα. +

-

Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Immo vero, inquit, ad beatissime vivendum parum est, ad beate vero satis. Hic quoque suus est de summoque bono dissentiens dici vere Peripateticus non potest. Dolere malum est: in crucem qui agitur, beatus esse non potest. Ut proverbia non nulla veriora sint quam vestra dogmata. Nec tamen ullo modo summum pecudis bonum et hominis idem mihi videri potest.

+

--- ·--· ····· -- ··· ··-· ·--· -· -- ···-- ····- ·-· -·- - ····- ----· --- ·--· ···- ····- ·· + -·-· --·- -· --· ·---- ·-·-·- -·- · --- - ·-·· ··--·· -· ··· -·· ·-·· ·-·-·- ·--- -··- ----- -· -·- -· ·---- + ··--- ··--·· ·-- ··· - --·- -··- +

- -

Quod cum accidisset ut alter alterum necopinato videremus, surrexit statim. Pauca mutat vel plura sane; Nam et a te perfici istam disputationem volo, nec tua mihi oratio longa videri potest. Aut haec tibi, Torquate, sunt vituperanda aut patrocinium voluptatis repudiandum. Qui non moveatur et offensione turpitudinis et comprobatione honestatis? Nescio quo modo praetervolavit oratio. Ita ceterorum sententiis semotis relinquitur non mihi cum Torquato, sed virtuti cum voluptate certatio. Qui enim voluptatem ipsam contemnunt, iis licet dicere se acupenserem maenae non anteponere.

+ +

करती खरिदने मानसिक यन्त्रालय शीघ्र हुआआदी कार्यसिधान्तो मजबुत जाने पासपाई अर्थपुर्ण + जानते काम ढांचा उनका उसीएक् मुश्किले आंतरकार्यक्षमता चुनने संभव एकत्रित पहोचाना आंतरकार्यक्षमता + देते विशेष भोगोलिक वार्तालाप कार्यसिधान्तो समजते है।अभी पहोचाना सुना +

- -

Aliena dixit in physicis nec ea ipsa, quae tibi probarentur; Itaque et manendi in vita et migrandi ratio omnis iis rebus, quas supra dixi, metienda. An quod ita callida est, ut optime possit architectari voluptates? Qui enim voluptatem ipsam contemnunt, iis licet dicere se acupenserem maenae non anteponere.

+ +

For Arabic the text must go fom right to left

-

Non enim, si omnia non sequebatur, idcirco non erat ortus illinc. An ea, quae per vinitorem antea consequebatur, per se ipsa curabit? Tamen a proposito, inquam, aberramus. Ex rebus enim timiditas, non ex vocabulis nascitur. Ut in geometria, prima si dederis, danda sunt omnia. Reguli reiciendam;

- +

بقسوة السيء وباستثناء في لكل, من وقد الأجل الشمال حاملات. أمدها تحرّك أفريقيا ثم لكل, إبّان طوكيو + وحلفاؤها لان في. ٣٠ هامش الطرفين جهة, ومن مئات مرمى في, ٣٠ ضرب دارت لهذه. تعد تم إستعمل لليابان, لدحر + سليمان، تم حتى, على أهّل تكبّد المشتّتون هو. لكل الجو الإطلاق أن. حتى القادة الشرق، إذ, به، + وبدأت التاريخ، عل.

+
+ - -
+ +

- Illud urgueam, non intellegere eum quid sibi dicendum sit, cum dolorem summum malum esse dixerit. -

-
- - - -

Ergo adhuc, quantum equidem intellego, causa non videtur fuisse mutandi nominis.

- - - -

Hic Speusippus, hic Xenocrates, hic eius auditor Polemo, cuius illa ipsa sessio fuit, quam videmus. Poterat autem inpune; Nec enim ignoras his istud honestum non summum modo, sed etiam, ut tu vis, solum bonum videri. Praeclare hoc quidem. Iam enim adesse poterit. Scientiam pollicentur, quam non erat mirum sapientiae cupido patria esse cariorem. Aliter enim nosmet ipsos nosse non possumus. Restincta enim sitis stabilitatem voluptatis habet, inquit, illa autem voluptas ipsius restinctionis in motu est. At negat Epicurus-hoc enim vestrum lumen estquemquam, qui honeste non vivat, iucunde posse vivere.

+ 10.000 +

- -

Servari enim iustitia nisi a forti viro, nisi a sapiente non potest. Sint modo partes vitae beatae. Bestiarum vero nullum iudicium puto. Et certamen honestum et disputatio splendida! omnis est enim de virtutis dignitate contentio.

+ +

+ 30,00 +

- -

Non autem hoc: igitur ne illud quidem.

- - -

Ut optime, secundum naturam affectum esse possit. Nec vero alia sunt quaerenda contra Carneadeam illam sententiam. Non potes, nisi retexueris illa. Sit enim idem caecus, debilis. Ne amores quidem sanctos a sapiente alienos esse arbitrantur. Cur deinde Metrodori liberos commendas?

+

-20 +

- -
    -
  • Videmusne ut pueri ne verberibus quidem a contemplandis rebus perquirendisque deterreantur?
  • - - - -
  • Quod si ita se habeat, non possit beatam praestare vitam sapientia.
  • -
- - - -
Easdemne res?
- - - -

Videamus animi partes, quarum est conspectus illustrior; Cur igitur easdem res, inquam, Peripateticis dicentibus verbum nullum est, quod non intellegatur? Quod dicit Epicurus etiam de voluptate, quae minime sint voluptates, eas obscurari saepe et obrui. Est, ut dicis, inquit; Sed utrum hortandus es nobis, Luci, inquit, an etiam tua sponte propensus es? Itaque hic ipse iam pridem est reiectus; Illud dico, ea, quae dicat, praeclare inter se cohaerere. Sed videbimus. Est igitur officium eius generis, quod nec in bonis ponatur nec in contrariis. Quae cum essent dicta, discessimus.

- - - -

Comprehensum, quod cognitum non habet? Prave, nequiter, turpiter cenabat; Quae autem natura suae primae institutionis oblita est? Respondeat totidem verbis. Nec vero alia sunt quaerenda contra Carneadeam illam sententiam. Prave, nequiter, turpiter cenabat; Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Itaque hic ipse iam pridem est reiectus; Dicimus aliquem hilare vivere; Occultum facinus esse potuerit, gaudebit;

- - - -
- - - -

Tubulum fuisse, qua illum, cuius is condemnatus est rogatione, P. Profectus in exilium Tubulus statim nec respondere ausus; Ut in geometria, prima si dederis, danda sunt omnia. Omnia contraria, quos etiam insanos esse vultis. Quae similitudo in genere etiam humano apparet. Sed nimis multa. Hoc mihi cum tuo fratre convenit. Quid, quod homines infima fortuna, nulla spe rerum gerendarum, opifices denique delectantur historia? Quae est igitur causa istarum angustiarum?

- - - -

Est, ut dicis, inquam. Quid turpius quam sapientis vitam ex insipientium sermone pendere? Sed ad haec, nisi molestum est, habeo quae velim. At ille non pertimuit saneque fidenter: Istis quidem ipsis verbis, inquit; Cenasti in vita numquam bene, cum omnia in ista Consumis squilla atque acupensere cum decimano. Laboro autem non sine causa; Conferam avum tuum Drusum cum C. Cur post Tarentum ad Archytam? Quid de Pythagora? Quam ob rem tandem, inquit, non satisfacit?

- - - -

Tum mihi Piso: Quid ergo? Scio enim esse quosdam, qui quavis lingua philosophari possint; Sed finge non solum callidum eum, qui aliquid improbe faciat, verum etiam praepotentem, ut M. Igitur neque stultorum quisquam beatus neque sapientium non beatus. Mihi vero, inquit, placet agi subtilius et, ut ipse dixisti, pressius. Expectoque quid ad id, quod quaerebam, respondeas. Ita relinquet duas, de quibus etiam atque etiam consideret. Scaevola tribunus plebis ferret ad plebem vellentne de ea re quaeri. Ecce aliud simile dissimile. Hoc loco tenere se Triarius non potuit.

- - - -
Quae cum praeponunt, ut sit aliqua rerum selectio, naturam videntur sequi;
- - - -

Ego quoque, inquit, didicerim libentius si quid attuleris, quam te reprehenderim. Nihil enim hoc differt. Eaedem enim utilitates poterunt eas labefactare atque pervertere.

- - - -
-

- Nam quod ita positum est, quod dissolutum sit, id esse sine sensu, id eius modi est, ut non satis plane dicat quid sit dissolutum. -

-
- - - -

Ratio quidem vestra sic cogit.

- - - -

Quia voluptatem hanc esse sentiunt omnes, quam sensus accipiens movetur et iucunditate quadam perfunditur. Cum id quoque, ut cupiebat, audivisset, evelli iussit eam, qua erat transfixus, hastam. At cum de plurimis eadem dicit, tum certe de maximis. At iste non dolendi status non vocatur voluptas. Utinam quidem dicerent alium alio beatiorem! Iam ruinas videres. Quod idem cum vestri faciant, non satis magnam tribuunt inventoribus gratiam. Qua igitur re ab deo vincitur, si aeternitate non vincitur? Sic consequentibus vestris sublatis prima tolluntur.

- - - -

Ego vero volo in virtute vim esse quam maximam; Quodsi ipsam honestatem undique pertectam atque absolutam. Satis est tibi in te, satis in legibus, satis in mediocribus amicitiis praesidii. Quem ad modum quis ambulet, sedeat, qui ductus oris, qui vultus in quoque sit? Licet hic rursus ea commemores, quae optimis verbis ab Epicuro de laude amicitiae dicta sunt. Itaque ab his ordiamur. Dici enim nihil potest verius. Idem iste, inquam, de voluptate quid sentit? Illud dico, ea, quae dicat, praeclare inter se cohaerere. Quis est tam dissimile homini.

- - - -

Tertium autem omnibus aut maximis rebus iis, quae secundum naturam sint, fruentem vivere. Bonum patria: miserum exilium. Quid est, quod ab ea absolvi et perfici debeat? Habent enim et bene longam et satis litigiosam disputationem. Nondum autem explanatum satis, erat, quid maxime natura vellet. Egone quaeris, inquit, quid sentiam? Facillimum id quidem est, inquam. Nihil opus est exemplis hoc facere longius. Piso, familiaris noster, et alia multa et hoc loco Stoicos irridebat: Quid enim?

- - - -
    -
  • Quando enim Socrates, qui parens philosophiae iure dici potest, quicquam tale fecit?
  • - - - -
  • Ne vitationem quidem doloris ipsam per se quisquam in rebus expetendis putavit, nisi etiam evitare posset.
  • -
- - - -

Omnes enim iucundum motum, quo sensus hilaretur. Illa tamen simplicia, vestra versuta. Id mihi magnum videtur. Habes, inquam, Cato, formam eorum, de quibus loquor, philosophorum. At enim hic etiam dolore. Eaedem res maneant alio modo. Atque haec ita iustitiae propria sunt, ut sint virtutum reliquarum communia. Sapiens autem semper beatus est et est aliquando in dolore; Haeret in salebra. Ita graviter et severe voluptatem secrevit a bono. Quae cum dixisset paulumque institisset, Quid est?

- - - -

Quarum ambarum rerum cum medicinam pollicetur, luxuriae licentiam pollicetur. Ita enim vivunt quidam, ut eorum vita refellatur oratio. Utrum igitur tibi litteram videor an totas paginas commovere? Praeterea et appetendi et refugiendi et omnino rerum gerendarum initia proficiscuntur aut a voluptate aut a dolore. Nisi autem rerum natura perspecta erit, nullo modo poterimus sensuum iudicia defendere. Sed non sunt in eo genere tantae commoditates corporis tamque productae temporibus tamque multae. Hoc positum in Phaedro a Platone probavit Epicurus sensitque in omni disputatione id fieri oportere. Huius, Lyco, oratione locuples, rebus ipsis ielunior. Sic, et quidem diligentius saepiusque ista loquemur inter nos agemusque communiter.

- - - -

Ac tamen hic mallet non dolere.

- - - -

Perturbationes autem nulla naturae vi commoventur, omniaque ea sunt opiniones ac iudicia levitatis. Indicant pueri, in quibus ut in speculis natura cernitur. Nos commodius agimus. Quae duo sunt, unum facit. Tum ille: Tu autem cum ipse tantum librorum habeas, quos hic tandem requiris? Neque solum ea communia, verum etiam paria esse dixerunt. Verba tu fingas et ea dicas, quae non sentias?

- - - -

Ad corpus diceres pertinere-, sed ea, quae dixi, ad corpusne refers? Quonam, inquit, modo? Utilitatis causa amicitia est quaesita. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Hi autem ponunt illi quidem prima naturae, sed ea seiungunt a finibus et a summa bonorum;

- - - -

Quasi ego id curem, quid ille aiat aut neget.

- - - -

Honesta oratio, Socratica, Platonis etiam. Sapiens autem semper beatus est et est aliquando in dolore;

- - - -

Illis videtur, qui illud non dubitant bonum dicere -; Hoc non est positum in nostra actione. Quae diligentissime contra Aristonem dicuntur a Chryippo. Nec vero hoc oratione solum, sed multo magis vita et factis et moribus comprobavit. Tum mihi Piso: Quid ergo? Sed potestne rerum maior esse dissensio? Haec dicuntur fortasse ieiunius; Qualem igitur hominem natura inchoavit? Atqui iste locus est, Piso, tibi etiam atque etiam confirmandus, inquam; Quid turpius quam sapientis vitam ex insipientium sermone pendere?

- - - -

Ad eas enim res ab Epicuro praecepta dantur. Ita redarguitur ipse a sese, convincunturque scripta eius probitate ipsius ac moribus. Negat esse eam, inquit, propter se expetendam. Expectoque quid ad id, quod quaerebam, respondeas. Potius inflammat, ut coercendi magis quam dedocendi esse videantur. Prioris generis est docilitas, memoria; Nunc ita separantur, ut disiuncta sint, quo nihil potest esse perversius. Itaque hic ipse iam pridem est reiectus;

- - - -
    -
  • Philosophi autem in suis lectulis plerumque moriuntur.
  • - - - -
  • Bona autem corporis huic sunt, quod posterius posui, similiora.
  • - - - -
  • Quae in controversiam veniunt, de iis, si placet, disseramus.
  • -
- - - -
Rapior illuc, revocat autem Antiochus, nec est praeterea, quem audiamus.
- - - -

Quibus ego vehementer assentior. Licet hic rursus ea commemores, quae optimis verbis ab Epicuro de laude amicitiae dicta sunt. Cum id fugiunt, re eadem defendunt, quae Peripatetici, verba. Quae sunt igitur communia vobis cum antiquis, iis sic utamur quasi concessis; Mihi enim erit isdem istis fortasse iam utendum. Quantum Aristoxeni ingenium consumptum videmus in musicis? Si quae forte-possumus. Equidem etiam Epicurum, in physicis quidem, Democriteum puto. Quis negat? Equidem soleo etiam quod uno Graeci, si aliter non possum, idem pluribus verbis exponere.

- - - -

Tecum optime, deinde etiam cum mediocri amico. Bonum integritas corporis: misera debilitas. Mihi, inquam, qui te id ipsum rogavi? Ut enim consuetudo loquitur, id solum dicitur honestum, quod est populari fama gloriosum. Bonum incolumis acies: misera caecitas. Ut proverbia non nulla veriora sint quam vestra dogmata. Claudii libidini, qui tum erat summo ne imperio, dederetur. Non est enim vitium in oratione solum, sed etiam in moribus.

- - - -

Color egregius, integra valitudo, summa gratia, vita denique conferta voluptatum omnium varietate. Maximus dolor, inquit, brevis est. Nunc haec primum fortasse audientis servire debemus. Luxuriam non reprehendit, modo sit vacua infinita cupiditate et timore. Frater et T. Haec bene dicuntur, nec ego repugno, sed inter sese ipsa pugnant. Idem iste, inquam, de voluptate quid sentit?

- - - -

Unum nescio, quo modo possit, si luxuriosus sit, finitas cupiditates habere.

- - - -

Vos autem cum perspicuis dubia debeatis illustrare, dubiis perspicua conamini tollere. Maximas vero virtutes iacere omnis necesse est voluptate dominante. Nam si amitti vita beata potest, beata esse non potest. Memini vero, inquam; Quo modo autem optimum, si bonum praeterea nullum est? Satis est tibi in te, satis in legibus, satis in mediocribus amicitiis praesidii.

- - - -
    -
  • Zenonis est, inquam, hoc Stoici.
  • - - - -
  • Cum sciret confestim esse moriendum eamque mortem ardentiore studio peteret, quam Epicurus voluptatem petendam putat.
  • - - - -
  • Hoc loco discipulos quaerere videtur, ut, qui asoti esse velint, philosophi ante fiant.
  • - - - -
  • Polemoni et iam ante Aristoteli ea prima visa sunt, quae paulo ante dixi.
  • -
- - - -
-

- Maximeque eos videre possumus res gestas audire et legere velle, qui a spe gerendi absunt confecti senectute. -

-
- - - -

Nam Pyrrho, Aristo, Erillus iam diu abiecti. Equidem, sed audistine modo de Carneade? Et ille ridens: Video, inquit, quid agas; Nulla profecto est, quin suam vim retineat a primo ad extremum. Conferam tecum, quam cuique verso rem subicias; Nihil sane. Qui est in parvis malis. Quid enim me prohiberet Epicureum esse, si probarem, quae ille diceret?

- - - -

Restatis igitur vos; Ita graviter et severe voluptatem secrevit a bono. Equidem, sed audistine modo de Carneade? Sed in rebus apertissimis nimium longi sumus. Ecce aliud simile dissimile. Nulla profecto est, quin suam vim retineat a primo ad extremum.

- - - -

Iubet igitur nos Pythius Apollo noscere nosmet ipsos.

- - - -

Quantum Aristoxeni ingenium consumptum videmus in musicis? Itaque nostrum est-quod nostrum dico, artis est-ad ea principia, quae accepimus. Nam memini etiam quae nolo, oblivisci non possum quae volo. Cur, nisi quod turpis oratio est? Quam tu ponis in verbis, ego positam in re putabam. Quae cum ita sint, effectum est nihil esse malum, quod turpe non sit.

- - - -
-

- Nam quod ita positum est, quod dissolutum sit, id esse sine sensu, id eius modi est, ut non satis plane dicat quid sit dissolutum. -

-
- - - -

Ubi ut eam caperet aut quando? Sin kakan malitiam dixisses, ad aliud nos unum certum vitium consuetudo Latina traduceret. Videmusne ut pueri ne verberibus quidem a contemplandis rebus perquirendisque deterreantur? Parvi enim primo ortu sic iacent, tamquam omnino sine animo sint.

- - - -
    -
  • Quae rursus dum sibi evelli ex ordine nolunt, horridiores evadunt, asperiores, duriores et oratione et moribus.
  • - - - -
  • In ipsa enim parum magna vis inest, ut quam optime se habere possit, si nulla cultura adhibeatur.
  • - - - -
  • Nec vero intermittunt aut admirationem earum rerum, quae sunt ab antiquis repertae, aut investigationem novarum.
  • - - - -
  • Itaque ab his ordiamur.
  • -
- - - -
    -
  • Sic enim censent, oportunitatis esse beate vivere.
  • - - - -
  • Fortitudinis quaedam praecepta sunt ac paene leges, quae effeminari virum vetant in dolore.
  • - - - -
  • Quod si ita se habeat, non possit beatam praestare vitam sapientia.
  • - - - -
  • Quicquid enim a sapientia proficiscitur, id continuo debet expletum esse omnibus suis partibus;
  • -
- - - -

Ergo ita: non posse honeste vivi, nisi honeste vivatur? Aperiendum est igitur, quid sit voluptas; Itaque his sapiens semper vacabit. Sed ad haec, nisi molestum est, habeo quae velim. Ergo hoc quidem apparet, nos ad agendum esse natos. Quis est enim, in quo sit cupiditas, quin recte cupidus dici possit? In quo etsi est magnus, tamen nova pleraque et perpauca de moribus. Iam in altera philosophiae parte. De hominibus dici non necesse est.

- - - -
-

- Haec ego non possum dicere non esse hominis quamvis et belli et humani, sapientis vero nullo modo, physici praesertim, quem se ille esse vult, putare ullum esse cuiusquam diem natalem. -

-
- - - -
Qualem igitur hominem natura inchoavit?
- - - -

In qua si nihil est praeter rationem, sit in una virtute finis bonorum; Nec tamen ullo modo summum pecudis bonum et hominis idem mihi videri potest. Nulla profecto est, quin suam vim retineat a primo ad extremum.

- - - -

Tubulo putas dicere?

- - - -

Cum sciret confestim esse moriendum eamque mortem ardentiore studio peteret, quam Epicurus voluptatem petendam putat. Ergo illi intellegunt quid Epicurus dicat, ego non intellego? Qui igitur convenit ab alia voluptate dicere naturam proficisci, in alia summum bonum ponere? Teneo, inquit, finem illi videri nihil dolere. Quo minus animus a se ipse dissidens secumque discordans gustare partem ullam liquidae voluptatis et liberae potest.

- - - -

Et ille ridens: Video, inquit, quid agas;

- - - -

Certe nihil nisi quod possit ipsum propter se iure laudari. Et quidem, Cato, hanc totam copiam iam Lucullo nostro notam esse oportebit; Tamen a proposito, inquam, aberramus. Nam memini etiam quae nolo, oblivisci non possum quae volo. Amicitiae vero locus ubi esse potest aut quis amicus esse cuiquam, quem non ipsum amet propter ipsum? Satis est ad hoc responsum. De ingenio eius in his disputationibus, non de moribus quaeritur. Ab hoc autem quaedam non melius quam veteres, quaedam omnino relicta.

- - - -

Illum mallem levares, quo optimum atque humanissimum virum, Cn.

- - - -

Illi enim inter se dissentiunt. Quid, quod homines infima fortuna, nulla spe rerum gerendarum, opifices denique delectantur historia? Itaque his sapiens semper vacabit. Hunc vos beatum; Equidem e Cn. Verum enim diceret, idque Socratem, qui voluptatem nullo loco numerat, audio dicentem, cibi condimentum esse famem, potionis sitim. An haec ab eo non dicuntur? Collatio igitur ista te nihil iuvat. Si stante, hoc natura videlicet vult, salvam esse se, quod concedimus; Iam id ipsum absurdum, maximum malum neglegi. Vidit Homerus probari fabulam non posse, si cantiunculis tantus irretitus vir teneretur; Sensibus enim ornavit ad res percipiendas idoneis, ut nihil aut non multum adiumento ullo ad suam confirmationem indigerent;

- - - -

Istic sum, inquit. Nullus est igitur cuiusquam dies natalis. Inde sermone vario sex illa a Dipylo stadia confecimus. Nam de isto magna dissensio est. At enim hic etiam dolore. Nunc ita separantur, ut disiuncta sint, quo nihil potest esse perversius. Ergo infelix una molestia, fellx rursus, cum is ipse anulus in praecordiis piscis inventus est? Sed tamen intellego quid velit.

- - - -

Sed mehercule pergrata mihi oratio tua. Cur ipse Pythagoras et Aegyptum lustravit et Persarum magos adiit? Non pugnem cum homine, cur tantum habeat in natura boni; Cur igitur easdem res, inquam, Peripateticis dicentibus verbum nullum est, quod non intellegatur? At modo dixeras nihil in istis rebus esse, quod interesset. Non enim, si malum est dolor, carere eo malo satis est ad bene vivendum. Quaero igitur, quo modo hae tantae commendationes a natura profectae subito a sapientia relictae sint. Huic ego, si negaret quicquam interesse ad beate vivendum quali uteretur victu, concederem, laudarem etiam; Dolere malum est: in crucem qui agitur, beatus esse non potest. Nam quibus rebus efficiuntur voluptates, eae non sunt in potestate sapientis.

- - - -

Quare hoc videndum est, possitne nobis hoc ratio philosophorum dare. Omnia contraria, quos etiam insanos esse vultis. Quod autem satis est, eo quicquid accessit, nimium est; Res enim fortasse verae, certe graves, non ita tractantur, ut debent, sed aliquanto minutius. Si longus, levis; Quis est tam dissimile homini. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Non pugnem cum homine, cur tantum habeat in natura boni; Habes, inquam, Cato, formam eorum, de quibus loquor, philosophorum.

- - - -
Cur, nisi quod turpis oratio est?
- - - -

Ut nemo dubitet, eorum omnia officia quo spectare, quid sequi, quid fugere debeant? Non enim in selectione virtus ponenda erat, ut id ipsum, quod erat bonorum ultimum, aliud aliquid adquireret. Sit enim idem caecus, debilis. Expressa vero in iis aetatibus, quae iam confirmatae sunt. At, illa, ut vobis placet, partem quandam tuetur, reliquam deserit. Hoc dixerit potius Ennius: Nimium boni est, cui nihil est mali. Si quidem, inquit, tollerem, sed relinquo.

- - - -

Ego vero volo in virtute vim esse quam maximam;

- - - -

Virtutis, magnitudinis animi, patientiae, fortitudinis fomentis dolor mitigari solet. Cum id fugiunt, re eadem defendunt, quae Peripatetici, verba. Laboro autem non sine causa; Quod, inquit, quamquam voluptatibus quibusdam est saepe iucundius, tamen expetitur propter voluptatem. An hoc usque quaque, aliter in vita? Sed quot homines, tot sententiae; Ut necesse sit omnium rerum, quae natura vigeant, similem esse finem, non eundem. Confecta res esset. Ita fit cum gravior, tum etiam splendidior oratio.

- - - -

Mihi enim erit isdem istis fortasse iam utendum.

- - - -

Non potes, nisi retexueris illa. In contemplatione et cognitione posita rerum, quae quia deorum erat vitae simillima, sapiente visa est dignissima. Sed virtutem ipsam inchoavit, nihil amplius. Sedulo, inquam, faciam. Nam constitui virtus nullo modo potesti nisi ea, quae sunt prima naturae, ut ad summam pertinentia tenebit. Invidiosum nomen est, infame, suspectum.

- - - -
    -
  • Magni enim aestimabat pecuniam non modo non contra leges, sed etiam legibus partam.
  • - - - -
  • Erit enim mecum, si tecum erit.
  • - - - -
  • Ex rebus enim timiditas, non ex vocabulis nascitur.
  • -
- - - -
-

- Nihilne te delectat umquam -video, quicum loquar-, te igitur, Torquate, ipsum per se nihil delectat? -

-
- - - -

Et quidem iure fortasse, sed tamen non gravissimum est testimonium multitudinis. Non enim quaero quid verum, sed quid cuique dicendum sit. Honesta oratio, Socratica, Platonis etiam. Haec bene dicuntur, nec ego repugno, sed inter sese ipsa pugnant. Quare attende, quaeso. Tubulo putas dicere? Facillimum id quidem est, inquam.

- - - -

At quicum ioca seria, ut dicitur, quicum arcana, quicum occulta omnia? Et quidem saepe quaerimus verbum Latinum par Graeco et quod idem valeat; Virtutibus igitur rectissime mihi videris et ad consuetudinem nostrae orationis vitia posuisse contraria. Quae cum ita sint, effectum est nihil esse malum, quod turpe non sit. Summum ením bonum exposuit vacuitatem doloris; Itaque dicunt nec dubitant: mihi sic usus est, tibi ut opus est facto, fac. Mihi vero, inquit, placet agi subtilius et, ut ipse dixisti, pressius. Sed id ne cogitari quidem potest quale sit, ut non repugnet ipsum sibi. Fieri, inquam, Triari, nullo pacto potest, ut non dicas, quid non probes eius, a quo dissentias. Quippe: habes enim a rhetoribus; Sin aliud quid voles, postea. Non dolere, inquam, istud quam vim habeat postea videro;

- - - -
-

- Scripta sane et multa et polita, sed nescio quo pacto auctoritatem oratio non habet. -

-
- - - -
    -
  • Quamquam tu hanc copiosiorem etiam soles dicere.
  • - - - -
  • Hic ambiguo ludimur.
  • - - - -
  • Ipse Epicurus fortasse redderet, ut Sextus Peducaeus, Sex.
  • - - - -
  • Apparet statim, quae sint officia, quae actiones.
  • - - - -
  • Curium putes loqui, interdum ita laudat, ut quid praeterea sit bonum neget se posse ne suspicari quidem.
  • - - - -
  • Et non ex maxima parte de tota iudicabis?
  • -
- - - -
    -
  • Sin laboramus, quis est, qui alienae modum statuat industriae?
  • - - - -
  • Facit enim ille duo seiuncta ultima bonorum, quae ut essent vera, coniungi debuerunt;
  • - - - -
  • Qui non moveatur et offensione turpitudinis et comprobatione honestatis?
  • - - - -
  • Atqui reperies, inquit, in hoc quidem pertinacem;
  • -
- - - -

Mihi, inquam, qui te id ipsum rogavi? Id enim natura desiderat. Septem autem illi non suo, sed populorum suffragio omnium nominati sunt. Ex eorum enim scriptis et institutis cum omnis doctrina liberalis, omnis historia. Non dolere, inquam, istud quam vim habeat postea videro; Levatio igitur vitiorum magna fit in iis, qui habent ad virtutem progressionis aliquantum. Itaque et manendi in vita et migrandi ratio omnis iis rebus, quas supra dixi, metienda. Summum ením bonum exposuit vacuitatem doloris; Stoici scilicet. Eaedem res maneant alio modo.

- - - -

Tu quidem reddes; Haec para/doca illi, nos admirabilia dicamus. Idemne potest esse dies saepius, qui semel fuit? Quae contraria sunt his, malane? Nunc ita separantur, ut disiuncta sint, quo nihil potest esse perversius. Certe non potest. Mihi, inquam, qui te id ipsum rogavi? Hanc ergo intuens debet institutum illud quasi signum absolvere. Portenta haec esse dicit, neque ea ratione ullo modo posse vivi; Quid ergo attinet gloriose loqui, nisi constanter loquare?

- - - -

Quo studio Aristophanem putamus aetatem in litteris duxisse?

- - - -

Teneo, inquit, finem illi videri nihil dolere. Graece donan, Latine voluptatem vocant. Itaque his sapiens semper vacabit. At ille non pertimuit saneque fidenter: Istis quidem ipsis verbis, inquit; Qui ita affectus, beatum esse numquam probabis; Quid igitur, inquit, eos responsuros putas? Ergo opifex plus sibi proponet ad formarum quam civis excellens ad factorum pulchritudinem? Pauca mutat vel plura sane; At Zeno eum non beatum modo, sed etiam divitem dicere ausus est. Nobis aliter videtur, recte secusne, postea; Bestiarum vero nullum iudicium puto. At quicum ioca seria, ut dicitur, quicum arcana, quicum occulta omnia?

- - - -

Immo alio genere; Rationis enim perfectio est virtus; Eam si varietatem diceres, intellegerem, ut etiam non dicente te intellego; Nos cum te, M. Inde igitur, inquit, ordiendum est. Hoc tu nunc in illo probas. Dat enim intervalla et relaxat. At, illa, ut vobis placet, partem quandam tuetur, reliquam deserit.

- - - -

Maximus dolor, inquit, brevis est.

- - - -

Ergo, inquit, tibi Q. Nescio quo modo praetervolavit oratio. Quid de Pythagora? Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Quae quo sunt excelsiores, eo dant clariora indicia naturae. Beatus sibi videtur esse moriens. Aliter enim explicari, quod quaeritur, non potest. Iam enim adesse poterit.

- - - -

Aliter enim explicari, quod quaeritur, non potest. Eadem nunc mea adversum te oratio est. Te enim iudicem aequum puto, modo quae dicat ille bene noris. Respondent extrema primis, media utrisque, omnia omnibus. Bona autem corporis huic sunt, quod posterius posui, similiora. Quae si potest singula consolando levare, universa quo modo sustinebit?

- - - -
    -
  • Nisi enim id faceret, cur Plato Aegyptum peragravit, ut a sacerdotibus barbaris numeros et caelestia acciperet?
  • - - - -
  • Primum quid tu dicis breve?
  • - - - -
  • Quid enim me prohiberet Epicureum esse, si probarem, quae ille diceret?
  • - - - -
  • Conferam tecum, quam cuique verso rem subicias;
  • -
- - - -

Teneo, inquit, finem illi videri nihil dolere. Quasi vero aut concedatur in omnibus stultis aeque magna esse vitia, et eadem inbecillitate et inconstantia L. At ego quem huic anteponam non audeo dicere; Nam Pyrrho, Aristo, Erillus iam diu abiecti. Quos quidem tibi studiose et diligenter tractandos magnopere censeo. Sed emolumenta communia esse dicuntur, recte autem facta et peccata non habentur communia. Qui autem esse poteris, nisi te amor ipse ceperit? Res enim se praeclare habebat, et quidem in utraque parte.

- - - -

Qui autem de summo bono dissentit de tota philosophiae ratione dissentit.

- - - -

In his igitur partibus duabus nihil erat, quod Zeno commutare gestiret. Scaevola tribunus plebis ferret ad plebem vellentne de ea re quaeri. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Res enim se praeclare habebat, et quidem in utraque parte. Qua tu etiam inprudens utebare non numquam. Tanti autem aderant vesicae et torminum morbi, ut nihil ad eorum magnitudinem posset accedere. Primum in nostrane potestate est, quid meminerimus?

- - - -

His enim rebus detractis negat se reperire in asotorum vita quod reprehendat. At, si voluptas esset bonum, desideraret. Sint modo partes vitae beatae. Tecum optime, deinde etiam cum mediocri amico. Satisne vobis videor pro meo iure in vestris auribus commentatus?

- - - -

Vestri haec verecundius, illi fortasse constantius. Reguli reiciendam; Ita ne hoc quidem modo paria peccata sunt. Nunc omni virtuti vitium contrario nomine opponitur. Eorum enim est haec querela, qui sibi cari sunt seseque diligunt. Est tamen ea secundum naturam multoque nos ad se expetendam magis hortatur quam superiora omnia.

- - - -

Torquatus, is qui consul cum Cn. Tum ille: Tu autem cum ipse tantum librorum habeas, quos hic tandem requiris? Sed ea mala virtuti magnitudine obruebantur. Non autem hoc: igitur ne illud quidem. Vidit Homerus probari fabulam non posse, si cantiunculis tantus irretitus vir teneretur; Roges enim Aristonem, bonane ei videantur haec: vacuitas doloris, divitiae, valitudo; Est, ut dicis, inquam. Beatus sibi videtur esse moriens. Quorum altera prosunt, nocent altera. Ita graviter et severe voluptatem secrevit a bono. Quid ei reliquisti, nisi te, quoquo modo loqueretur, intellegere, quid diceret? Non quam nostram quidem, inquit Pomponius iocans;

- - - -

Cum id fugiunt, re eadem defendunt, quae Peripatetici, verba. Ita multa dicunt, quae vix intellegam. Si longus, levis dictata sunt. Si enim ita est, vide ne facinus facias, cum mori suadeas. Conferam tecum, quam cuique verso rem subicias; Si qua in iis corrigere voluit, deteriora fecit. Ita multo sanguine profuso in laetitia et in victoria est mortuus. Nulla profecto est, quin suam vim retineat a primo ad extremum. Haec quo modo conveniant, non sane intellego.

- - - -
    -
  • Ex eorum enim scriptis et institutis cum omnis doctrina liberalis, omnis historia.
  • - - - -
  • Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster?
  • - - - -
  • Quae dici eadem de ceteris virtutibus possunt, quarum omnium fundamenta vos in voluptate tamquam in aqua ponitis.
  • - - - -
  • Quae est igitur causa istarum angustiarum?
  • -
- - - -
-

- Quaerimus enim finem bonorum. -

-
- - - -
-

- Cuius similitudine perspecta in formarum specie ac dignitate transitum est ad honestatem dictorum atque factorum. -

-
- - - -
-

- Illi igitur antiqui non tam acute optabiliorem illam vitam putant, praestantiorem, beatiorem, Stoici autem tantum modo praeponendam in seligendo, non quo beatior ea vita sit, sed quod ad naturam accommodatior. -

-
- - - -
- - - -

Tum Torquatus: Prorsus, inquit, assentior; Sed fortuna fortis; Magni enim aestimabat pecuniam non modo non contra leges, sed etiam legibus partam. Haec para/doca illi, nos admirabilia dicamus. Eadem nunc mea adversum te oratio est. Atque hoc loco similitudines eas, quibus illi uti solent, dissimillimas proferebas.

- - - -

Omnes enim iucundum motum, quo sensus hilaretur. Quam ob rem tandem, inquit, non satisfacit? Quid enim de amicitia statueris utilitatis causa expetenda vides. Idem iste, inquam, de voluptate quid sentit? Nam, ut sint illa vendibiliora, haec uberiora certe sunt. Ut placet, inquit, etsi enim illud erat aptius, aequum cuique concedere.

- - - -

Quam ob rem tandem, inquit, non satisfacit? Itaque si aut requietem natura non quaereret aut eam posset alia quadam ratione consequi. Primum cur ista res digna odio est, nisi quod est turpis? Quodsi ipsam honestatem undique pertectam atque absolutam.

- - - -
    -
  • Non enim, si omnia non sequebatur, idcirco non erat ortus illinc.
  • - - - -
  • Respondent extrema primis, media utrisque, omnia omnibus.
  • - - - -
  • Ergo instituto veterum, quo etiam Stoici utuntur, hinc capiamus exordium.
  • - - - -
  • Mene ergo et Triarium dignos existimas, apud quos turpiter loquare?
  • - - - -
  • Atque etiam ad iustitiam colendam, ad tuendas amicitias et reliquas caritates quid natura valeat haec una cognitio potest tradere.
  • -
- - - -

Si stante, hoc natura videlicet vult, salvam esse se, quod concedimus; Cave putes quicquam esse verius. Sed haec in pueris; Sed hoc sane concedamus. Terram, mihi crede, ea lanx et maria deprimet. Sint modo partes vitae beatae. Ego vero volo in virtute vim esse quam maximam; Si quicquam extra virtutem habeatur in bonis. Est enim effectrix multarum et magnarum voluptatum. In quibus doctissimi illi veteres inesse quiddam caeleste et divinum putaverunt.

- - - -

Ipse Epicurus fortasse redderet, ut Sextus Peducaeus, Sex. Sed haec quidem liberius ab eo dicuntur et saepius. Itaque sensibus rationem adiunxit et ratione effecta sensus non reliquit. Mihi, inquam, qui te id ipsum rogavi? Uterque enim summo bono fruitur, id est voluptate. Cui Tubuli nomen odio non est?

- - - -

Beatus sibi videtur esse moriens. Nos cum te, M. Qua igitur re ab deo vincitur, si aeternitate non vincitur? Primum in nostrane potestate est, quid meminerimus? A mene tu? Illa tamen simplicia, vestra versuta. Neque enim disputari sine reprehensione nec cum iracundia aut pertinacia recte disputari potest. Quam ob rem tandem, inquit, non satisfacit?

- - - -

Nemo igitur esse beatus potest. Cui Tubuli nomen odio non est? Sed residamus, inquit, si placet. Illa argumenta propria videamus, cur omnia sint paria peccata. Quae cum praeponunt, ut sit aliqua rerum selectio, naturam videntur sequi; Dic in quovis conventu te omnia facere, ne doleas. Quo modo autem philosophus loquitur? Qui autem de summo bono dissentit de tota philosophiae ratione dissentit.

- - - -

Pugnant Stoici cum Peripateticis. Non laboro, inquit, de nomine. Tecum optime, deinde etiam cum mediocri amico. Quae cum essent dicta, discessimus. Ita cum ea volunt retinere, quae superiori sententiae conveniunt, in Aristonem incidunt; Id mihi magnum videtur.

- - - -

Nummus in Croesi divitiis obscuratur, pars est tamen divitiarum.

- - - -

Tum, Quintus et Pomponius cum idem se velle dixissent, Piso exorsus est. Quae duo sunt, unum facit. Paria sunt igitur. Et quod est munus, quod opus sapientiae? Bonum integritas corporis: misera debilitas. Nonne videmus quanta perturbatio rerum omnium consequatur, quanta confusio? Bonum integritas corporis: misera debilitas. Quamquam ab iis philosophiam et omnes ingenuas disciplinas habemus; Sed tamen est aliquid, quod nobis non liceat, liceat illis.

- - - -

Respondent extrema primis, media utrisque, omnia omnibus. Hoc etsi multimodis reprehendi potest, tamen accipio, quod dant. Quaesita enim virtus est, non quae relinqueret naturam, sed quae tueretur. Videamus animi partes, quarum est conspectus illustrior; Callipho ad virtutem nihil adiunxit nisi voluptatem, Diodorus vacuitatem doloris. Verba tu fingas et ea dicas, quae non sentias?

- - - -
    -
  • Utrum igitur tibi litteram videor an totas paginas commovere?
  • - - - -
  • Expressa vero in iis aetatibus, quae iam confirmatae sunt.
  • - - - -
  • Cuius etiam illi hortuli propinqui non memoriam solum mihi afferunt, sed ipsum videntur in conspectu meo ponere.
  • - - - -
  • Plane idem, inquit, et maxima quidem, qua fieri nulla maior potest.
  • -
- - - -

Mihi enim satis est, ipsis non satis. Atqui, inquam, Cato, si istud optinueris, traducas me ad te totum licebit. An hoc usque quaque, aliter in vita? Sed quod proximum fuit non vidit.

- - - -
    -
  • Tu vero, inquam, ducas licet, si sequetur;
  • - - - -
  • Quid iudicant sensus?
  • - - - -
  • Etenim nec iustitia nec amicitia esse omnino poterunt, nisi ipsae per se expetuntur.
  • - - - -
  • Si enim ad populum me vocas, eum.
  • - - - -
  • Nec tamen ille erat sapiens quis enim hoc aut quando aut ubi aut unde?
  • -
- - - -

Id Sextilius factum negabat. Philosophi autem in suis lectulis plerumque moriuntur.

- - - -
Rhetorice igitur, inquam, nos mavis quam dialectice disputare?
- - - -

Quamquam tu hanc copiosiorem etiam soles dicere. De hominibus dici non necesse est. Quid ergo attinet dicere: Nihil haberem, quod reprehenderem, si finitas cupiditates haberent? Et ille ridens: Video, inquit, quid agas; Collatio igitur ista te nihil iuvat. Sin aliud quid voles, postea.

- - - -
    -
  • Ergo adhuc, quantum equidem intellego, causa non videtur fuisse mutandi nominis.
  • - - - -
  • Profectus in exilium Tubulus statim nec respondere ausus;
  • - - - -
  • Legimus tamen Diogenem, Antipatrum, Mnesarchum, Panaetium, multos alios in primisque familiarem nostrum Posidonium.
  • - - - -
  • Verum tamen cum de rebus grandioribus dicas, ipsae res verba rapiunt;
  • -
- - - -

Ut in voluptate sit, qui epuletur, in dolore, qui torqueatur. Quis negat? Hi autem ponunt illi quidem prima naturae, sed ea seiungunt a finibus et a summa bonorum; Haec para/doca illi, nos admirabilia dicamus. Quod autem magnum dolorem brevem, longinquum levem esse dicitis, id non intellego quale sit. Istam voluptatem perpetuam quis potest praestare sapienti? Cur post Tarentum ad Archytam? Huic mori optimum esse propter desperationem sapientiae, illi propter spem vivere. Apud imperitos tum illa dicta sunt, aliquid etiam coronae datum; Nos commodius agimus.

- - - -
    -
  • In qua quid est boni praeter summam voluptatem, et eam sempiternam?
  • - - - -
  • Sin te auctoritas commovebat, nobisne omnibus et Platoni ipsi nescio quem illum anteponebas?
  • - - - -
  • Sed potestne rerum maior esse dissensio?
  • - - - -
  • Stoici scilicet.
  • - - - -
  • Cupit enim dícere nihil posse ad beatam vitam deesse sapienti.
  • -
- - - -

Sequitur disserendi ratio cognitioque naturae;

- - - -

Hos contra singulos dici est melius. An ea, quae per vinitorem antea consequebatur, per se ipsa curabit? Videmus igitur ut conquiescere ne infantes quidem possint. Sapiens autem semper beatus est et est aliquando in dolore; Duo enim genera quae erant, fecit tria. Inde igitur, inquit, ordiendum est.

- - - -

Itaque hic ipse iam pridem est reiectus; Hoc loco tenere se Triarius non potuit. Sed ad illum redeo. Quae duo sunt, unum facit. Nihil acciderat ei, quod nollet, nisi quod anulum, quo delectabatur, in mari abiecerat.

- - - -
Habent enim et bene longam et satis litigiosam disputationem.
- - - -

At, si voluptas esset bonum, desideraret. Maximus dolor, inquit, brevis est.

- - - -
    -
  • Compensabatur, inquit, cum summis doloribus laetitia.
  • - - - -
  • Tu vero, inquam, ducas licet, si sequetur;
  • - - - -
  • Addidisti ad extremum etiam indoctum fuisse.
  • - - - -
  • Deinde disputat, quod cuiusque generis animantium statui deceat extremum.
  • -
- - - -

Qui autem esse poteris, nisi te amor ipse ceperit? Si stante, hoc natura videlicet vult, salvam esse se, quod concedimus; An tu me de L. Si verbum sequimur, primum longius verbum praepositum quam bonum. Deinde disputat, quod cuiusque generis animantium statui deceat extremum. Ostendit pedes et pectus. Sed haec quidem liberius ab eo dicuntur et saepius. Nam, ut paulo ante docui, augendae voluptatis finis est doloris omnis amotio. Neque enim civitas in seditione beata esse potest nec in discordia dominorum domus;

- - - -
-

- Mihi, inquam, qui te id ipsum rogavi? -

-
- - - -
-

- Restant Stoici, qui cum a Peripateticis et Academicis omnia transtulissent, nominibus aliis easdem res secuti sunt. -

-
- - - -

Et hunc idem dico, inquieta sed ad virtutes et ad vitia nihil interesse.

- - - -

Quo modo autem optimum, si bonum praeterea nullum est? Ab hoc autem quaedam non melius quam veteres, quaedam omnino relicta. Aperiendum est igitur, quid sit voluptas; Quid autem habent admirationis, cum prope accesseris? Huius ego nunc auctoritatem sequens idem faciam. Videsne, ut haec concinant? Deinde disputat, quod cuiusque generis animantium statui deceat extremum.

- - - -

Et hunc idem dico, inquieta sed ad virtutes et ad vitia nihil interesse. Num igitur utiliorem tibi hunc Triarium putas esse posse, quam si tua sint Puteolis granaria? Sed haec ab Antiocho, familiari nostro, dicuntur multo melius et fortius, quam a Stasea dicebantur. Illud quaero, quid ei, qui in voluptate summum bonum ponat, consentaneum sit dicere. Nullum inveniri verbum potest quod magis idem declaret Latine, quod Graece, quam declarat voluptas. An me, inquam, nisi te audire vellem, censes haec dicturum fuisse?

- - - -

Nunc haec primum fortasse audientis servire debemus. Honesta oratio, Socratica, Platonis etiam.

- - - -

Nihil enim iam habes, quod ad corpus referas; Atqui reperies, inquit, in hoc quidem pertinacem; Summus dolor plures dies manere non potest? At ille pellit, qui permulcet sensum voluptate. Quis istud possit, inquit, negare?

- - - -
At iste non dolendi status non vocatur voluptas.
- - - -

Invidiosum nomen est, infame, suspectum. Quae cum dixisset paulumque institisset, Quid est? Quae fere omnia appellantur uno ingenii nomine, easque virtutes qui habent, ingeniosi vocantur. Nihil enim iam habes, quod ad corpus referas; Nihil opus est exemplis hoc facere longius. Atque haec ita iustitiae propria sunt, ut sint virtutum reliquarum communia. Atqui reperies, inquit, in hoc quidem pertinacem;

- - - -

Sed ad haec, nisi molestum est, habeo quae velim. Age, inquies, ista parva sunt. Quasi ego id curem, quid ille aiat aut neget. Et hunc idem dico, inquieta sed ad virtutes et ad vitia nihil interesse. Nos cum te, M. Ut id aliis narrare gestiant?

- - - -

Septem autem illi non suo, sed populorum suffragio omnium nominati sunt. Videmus igitur ut conquiescere ne infantes quidem possint. Rationis enim perfectio est virtus; Illa tamen simplicia, vestra versuta. Nihil enim iam habes, quod ad corpus referas; Quae animi affectio suum cuique tribuens atque hanc, quam dico. Item de contrariis, a quibus ad genera formasque generum venerunt. Illum mallem levares, quo optimum atque humanissimum virum, Cn. At hoc in eo M. Tum mihi Piso: Quid ergo? Respondeat totidem verbis.

- - - -

Aliter homines, aliter philosophos loqui putas oportere? Nam quibus rebus efficiuntur voluptates, eae non sunt in potestate sapientis. Si longus, levis dictata sunt. Itaque eos id agere, ut a se dolores, morbos, debilitates repellant. Quid, si non sensus modo ei sit datus, verum etiam animus hominis? Nihil opus est exemplis hoc facere longius. Non minor, inquit, voluptas percipitur ex vilissimis rebus quam ex pretiosissimis. Poterat autem inpune;

- - - -
Tamen a proposito, inquam, aberramus.
- - - -

Quod quidem nobis non saepe contingit. Quae cum magnifice primo dici viderentur, considerata minus probabantur. Quas enim kakaw Graeci appellant, vitia malo quam malitias nominare. Quodcumque in mentem incideret, et quodcumque tamquam occurreret. At certe gravius.

- - - -
Eam tum adesse, cum dolor omnis absit;
- - - -

Quae similitudo in genere etiam humano apparet. Sed quoniam et advesperascit et mihi ad villam revertendum est, nunc quidem hactenus; Ita multo sanguine profuso in laetitia et in victoria est mortuus. Atque hoc loco similitudines eas, quibus illi uti solent, dissimillimas proferebas. Sed tamen enitar et, si minus multa mihi occurrent, non fugiam ista popularia. Hoc mihi cum tuo fratre convenit. Quo modo autem philosophus loquitur? Vives, inquit Aristo, magnifice atque praeclare, quod erit cumque visum ages, numquam angere, numquam cupies, numquam timebis. Pauca mutat vel plura sane;

- - - -

His enim rebus detractis negat se reperire in asotorum vita quod reprehendat. Age sane, inquam. Ratio enim nostra consentit, pugnat oratio. Ait enim se, si uratur, Quam hoc suave! dicturum. His enim rebus detractis negat se reperire in asotorum vita quod reprehendat. Is es profecto tu. Dempta enim aeternitate nihilo beatior Iuppiter quam Epicurus; At miser, si in flagitiosa et vitiosa vita afflueret voluptatibus.

- - - -

Idque testamento cavebit is, qui nobis quasi oraculum ediderit nihil post mortem ad nos pertinere?

- - - -

Nam, ut sint illa vendibiliora, haec uberiora certe sunt. Septem autem illi non suo, sed populorum suffragio omnium nominati sunt. Etenim semper illud extra est, quod arte comprehenditur. An est aliquid, quod te sua sponte delectet? Solum praeterea formosum, solum liberum, solum civem, stultost; Quis istum dolorem timet?

- - - -

Compensabatur, inquit, cum summis doloribus laetitia. Duarum enim vitarum nobis erunt instituta capienda. Beatus autem esse in maximarum rerum timore nemo potest. Ut alios omittam, hunc appello, quem ille unum secutus est.

- - - -
    -
  • Quid, quod homines infima fortuna, nulla spe rerum gerendarum, opifices denique delectantur historia?
  • - - - -
  • Illo enim addito iuste fit recte factum, per se autem hoc ipsum reddere in officio ponitur.
  • - - - -
  • Quo igitur, inquit, modo?
  • - - - -
  • Sed est forma eius disciplinae, sicut fere ceterarum, triplex: una pars est naturae, disserendi altera, vivendi tertia.
  • -
- - - -

Num igitur dubium est, quin, si in re ipsa nihil peccatur a superioribus, verbis illi commodius utantur? Nihil sane. Si mala non sunt, iacet omnis ratio Peripateticorum. Tum mihi Piso: Quid ergo? Amicitiam autem adhibendam esse censent, quia sit ex eo genere, quae prosunt. Deinde disputat, quod cuiusque generis animantium statui deceat extremum. Atqui reperies, inquit, in hoc quidem pertinacem; Quid paulo ante, inquit, dixerim nonne meministi, cum omnis dolor detractus esset, variari, non augeri voluptatem? Tum Lucius: Mihi vero ista valde probata sunt, quod item fratri puto. Hic nihil fuit, quod quaereremus. Ratio quidem vestra sic cogit. Mihi enim satis est, ipsis non satis.

- - - -
    -
  • Nam et a te perfici istam disputationem volo, nec tua mihi oratio longa videri potest.
  • - - - -
  • Audax negotium, dicerem impudens, nisi hoc institutum postea translatum ad philosophos nostros esset.
  • - - - -
  • Sed in rebus apertissimis nimium longi sumus.
  • - - - -
  • Itaque dicunt nec dubitant: mihi sic usus est, tibi ut opus est facto, fac.
  • - - - -
  • Illi enim inter se dissentiunt.
  • - - - -
  • Sed haec omittamus;
  • -
- - - -
    -
  • Magni enim aestimabat pecuniam non modo non contra leges, sed etiam legibus partam.
  • - - - -
  • Nunc haec primum fortasse audientis servire debemus.
  • - - - -
  • Quodsi vultum tibi, si incessum fingeres, quo gravior viderere, non esses tui similis;
  • -
- - - -

Est enim effectrix multarum et magnarum voluptatum.

- - - -
- - - -

Quod ea non occurrentia fingunt, vincunt Aristonem; Negat esse eam, inquit, propter se expetendam. Hoc tu nunc in illo probas. Parvi enim primo ortu sic iacent, tamquam omnino sine animo sint. Quid enim de amicitia statueris utilitatis causa expetenda vides. Ergo illi intellegunt quid Epicurus dicat, ego non intellego? Quae qui non vident, nihil umquam magnum ac cognitione dignum amaverunt. Eiuro, inquit adridens, iniquum, hac quidem de re; Sic enim censent, oportunitatis esse beate vivere. An vero displicuit ea, quae tributa est animi virtutibus tanta praestantia?

- - - -

Mihi quidem Homerus huius modi quiddam vidisse videatur in iis, quae de Sirenum cantibus finxerit. Sic consequentibus vestris sublatis prima tolluntur. Summus dolor plures dies manere non potest? Egone non intellego, quid sit don Graece, Latine voluptas?

- - - -
-

- Nec enim absolvi beata vita sapientis neque ad exitum perduci poterit, si prima quaeque bene ab eo consulta atque facta ipsius oblivione obruentur. -

-
- - - -

Traditur, inquit, ab Epicuro ratio neglegendi doloris. Huius, Lyco, oratione locuples, rebus ipsis ielunior. Si longus, levis; Mene ergo et Triarium dignos existimas, apud quos turpiter loquare? Ut placet, inquit, etsi enim illud erat aptius, aequum cuique concedere. Eadem fortitudinis ratio reperietur. Si autem id non concedatur, non continuo vita beata tollitur. Equidem, sed audistine modo de Carneade? Tubulo putas dicere? Qui autem de summo bono dissentit de tota philosophiae ratione dissentit.

- - - -

Quo plebiscito decreta a senatu est consuli quaestio Cn. Utinam quidem dicerent alium alio beatiorem! Iam ruinas videres. Quare si potest esse beatus is, qui est in asperis reiciendisque rebus, potest is quoque esse. Ego vero isti, inquam, permitto. Consequens enim est et post oritur, ut dixi. Sed nimis multa. Videsne, ut haec concinant? Illa argumenta propria videamus, cur omnia sint paria peccata. Egone non intellego, quid sit don Graece, Latine voluptas? At coluit ipse amicitias.

- - - -

Re mihi non aeque satisfacit, et quidem locis pluribus.

- - - -

Qui autem de summo bono dissentit de tota philosophiae ratione dissentit. Sed videbimus. Expressa vero in iis aetatibus, quae iam confirmatae sunt. Hoc positum in Phaedro a Platone probavit Epicurus sensitque in omni disputatione id fieri oportere. Itaque his sapiens semper vacabit. Quae est igitur causa istarum angustiarum? Eam stabilem appellas.

- - - -

Mihi enim satis est, ipsis non satis. Tum mihi Piso: Quid ergo? Atqui reperies, inquit, in hoc quidem pertinacem; Stoici scilicet. Tum mihi Piso: Quid ergo? Equidem e Cn.

- - - -
Facillimum id quidem est, inquam.
- - - -

Potius inflammat, ut coercendi magis quam dedocendi esse videantur. Respondeat totidem verbis. Ex rebus enim timiditas, non ex vocabulis nascitur. Non pugnem cum homine, cur tantum habeat in natura boni; Prodest, inquit, mihi eo esse animo. Paria sunt igitur. Aliter enim nosmet ipsos nosse non possumus. Bonum incolumis acies: misera caecitas. Sed quae tandem ista ratio est? Similiter sensus, cum accessit ad naturam, tuetur illam quidem, sed etiam se tuetur;

- - - -

Similiter sensus, cum accessit ad naturam, tuetur illam quidem, sed etiam se tuetur;

- - - -

Est autem etiam actio quaedam corporis, quae motus et status naturae congruentis tenet; Erit enim mecum, si tecum erit. Ut optime, secundum naturam affectum esse possit. Quis istud, quaeso, nesciebat? Ita nemo beato beatior. At ille pellit, qui permulcet sensum voluptate. Ille incendat? De hominibus dici non necesse est. Dolor ergo, id est summum malum, metuetur semper, etiamsi non aderit;

- - - -

Quid, si etiam iucunda memoria est praeteritorum malorum?

- - - -

Hoc enim constituto in philosophia constituta sunt omnia. Nunc omni virtuti vitium contrario nomine opponitur. Illum mallem levares, quo optimum atque humanissimum virum, Cn. Ita ne hoc quidem modo paria peccata sunt. Si quae forte-possumus. Egone quaeris, inquit, quid sentiam? Piso, familiaris noster, et alia multa et hoc loco Stoicos irridebat: Quid enim? Laelius clamores sofòw ille so lebat Edere compellans gumias ex ordine nostros.

- - - -
    -
  • Sed ad haec, nisi molestum est, habeo quae velim.
  • - - - -
  • Quod cum ille dixisset et satis disputatum videretur, in oppidum ad Pomponium perreximus omnes.
  • - - - -
  • Nam neque virtute retinetur ille in vita, nec iis, qui sine virtute sunt, mors est oppetenda.
  • - - - -
  • Sed emolumenta communia esse dicuntur, recte autem facta et peccata non habentur communia.
  • -
- - - -
    -
  • Esse enim quam vellet iniquus iustus poterat inpune.
  • - - - -
  • Quod cum accidisset ut alter alterum necopinato videremus, surrexit statim.
  • - - - -
  • Quae duo sunt, unum facit.
  • - - - -
  • Nunc ita separantur, ut disiuncta sint, quo nihil potest esse perversius.
  • - - - -
  • Quod dicit Epicurus etiam de voluptate, quae minime sint voluptates, eas obscurari saepe et obrui.
  • - - - -
  • Tantum dico, magis fuisse vestrum agere Epicuri diem natalem, quam illius testamento cavere ut ageretur.
  • -
- - - -

Itaque fecimus. Non dolere, inquam, istud quam vim habeat postea videro; Et quidem, inquit, vehementer errat; Bonum valitudo: miser morbus. Sed ad rem redeamus; Suo enim quisque studio maxime ducitur. An ea, quae per vinitorem antea consequebatur, per se ipsa curabit? Sed nimis multa.

- - - -

Qualem igitur hominem natura inchoavit?

- - - -
- - - -

Suo enim quisque studio maxime ducitur. Si enim, ut mihi quidem videtur, non explet bona naturae voluptas, iure praetermissa est; Praeclare hoc quidem. Theophrastus mediocriterne delectat, cum tractat locos ab Aristotele ante tractatos? Idem etiam dolorem saepe perpetiuntur, ne, si id non faciant, incidant in maiorem. Si longus, levis;

- - - -

Ut enim consuetudo loquitur, id solum dicitur honestum, quod est populari fama gloriosum. Sed finge non solum callidum eum, qui aliquid improbe faciat, verum etiam praepotentem, ut M. Multoque hoc melius nos veriusque quam Stoici. Ut nemo dubitet, eorum omnia officia quo spectare, quid sequi, quid fugere debeant? Sit enim idem caecus, debilis. Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster? Qua tu etiam inprudens utebare non numquam.

- - - -
Quia dolori non voluptas contraria est, sed doloris privatio.
- - - -

At iam decimum annum in spelunca iacet. Bonum liberi: misera orbitas.

- - - -

Indicant pueri, in quibus ut in speculis natura cernitur. -, sed ut hoc iudicaremus, non esse in iis partem maximam positam beate aut secus vivendi. Itaque his sapiens semper vacabit. Quo plebiscito decreta a senatu est consuli quaestio Cn.

- - - -

Velut ego nunc moveor.

- - - -

Cur haec eadem Democritus? Ergo ita: non posse honeste vivi, nisi honeste vivatur? Ergo in utroque exercebantur, eaque disciplina effecit tantam illorum utroque in genere dicendi copiam. Idemne, quod iucunde? Et quod est munus, quod opus sapientiae?

- - - -
    -
  • Hoc Hieronymus summum bonum esse dixit.
  • - - - -
  • De malis autem et bonis ab iis animalibus, quae nondum depravata sint, ait optime iudicari.
  • - - - -
  • Ex eorum enim scriptis et institutis cum omnis doctrina liberalis, omnis historia.
  • - - - -
  • Hoc mihi cum tuo fratre convenit.
  • - - - -
  • Negat enim summo bono afferre incrementum diem.
  • - - - -
  • Omnia contraria, quos etiam insanos esse vultis.
  • -
- - - -
-

- Ex quo intellegitur officium medium quiddam esse, quod neque in bonis ponatur neque in contrariis. -

-
- - - -

Dat enim intervalla et relaxat. Tu enim ista lenius, hic Stoicorum more nos vexat. Hoc non est positum in nostra actione. Qui non moveatur et offensione turpitudinis et comprobatione honestatis? Contineo me ab exemplis. Si mala non sunt, iacet omnis ratio Peripateticorum. Nam quid possumus facere melius? Quod autem ratione actum est, id officium appellamus.

- - - -
Nunc omni virtuti vitium contrario nomine opponitur.
- - - -

Nam quid possumus facere melius? At multis se probavit. Illud non continuo, ut aeque incontentae. Oratio me istius philosophi non offendit; Quae in controversiam veniunt, de iis, si placet, disseramus. Haec bene dicuntur, nec ego repugno, sed inter sese ipsa pugnant.

- - - -
-

- Quam ob rem turpe putandum est, non dico dolere-nam id quidem est interdum necesse-, sed saxum illud Lemnium clamore Philocteteo funestare, Quod eiulatu, questu, gemitu, fremitibus Resonando mutum flebiles voces refert. -

-
- - - -
-

- Et quae per vim oblatum stuprum volontaria morte lueret inventa est et qui interficeret filiam, ne stupraretur. -

-
- - - -

Non est ista, inquam, Piso, magna dissensio. Te autem hortamur omnes, currentem quidem, ut spero, ut eos, quos novisse vis, imitari etiam velis. Nam adhuc, meo fortasse vitio, quid ego quaeram non perspicis. Aliter homines, aliter philosophos loqui putas oportere? Ita multo sanguine profuso in laetitia et in victoria est mortuus. Primum in nostrane potestate est, quid meminerimus? Moriatur, inquit. Non enim, si malum est dolor, carere eo malo satis est ad bene vivendum. Verba tu fingas et ea dicas, quae non sentias? Sic, et quidem diligentius saepiusque ista loquemur inter nos agemusque communiter. Sed fortuna fortis; Quae quidem sapientes sequuntur duce natura tamquam videntes;

- - - -

Quonam modo? Itaque eos id agere, ut a se dolores, morbos, debilitates repellant. Nam Pyrrho, Aristo, Erillus iam diu abiecti. Est, ut dicis, inquam. Ne in odium veniam, si amicum destitero tueri. Bonum incolumis acies: misera caecitas.

- - - -

Vos autem cum perspicuis dubia debeatis illustrare, dubiis perspicua conamini tollere. Vulgo enim dicitur: Iucundi acti labores, nec male Euripidesconcludam, si potero, Latine; Isto modo ne improbos quidem, si essent boni viri. Atque haec ita iustitiae propria sunt, ut sint virtutum reliquarum communia. Mihi, inquam, qui te id ipsum rogavi?

- - - -
Expressa vero in iis aetatibus, quae iam confirmatae sunt.
- - - -

Cum ageremus, inquit, vitae beatum et eundem supremum diem, scribebamus haec. Sunt enim quasi prima elementa naturae, quibus ubertas orationis adhiberi vix potest, nec equidem eam cogito consectari. Atque his de rebus et splendida est eorum et illustris oratio. Tamen aberramus a proposito, et, ne longius, prorsus, inquam, Piso, si ista mala sunt, placet. Istic sum, inquit. Quid affers, cur Thorius, cur Caius Postumius, cur omnium horum magister, Orata, non iucundissime vixerit? Haec dicuntur inconstantissime. Quis est tam dissimile homini. Non autem hoc: igitur ne illud quidem. Atqui eorum nihil est eius generis, ut sit in fine atque extrerno bonorum.

- - - -

Ut id aliis narrare gestiant? Octavio fuit, cum illam severitatem in eo filio adhibuit, quem in adoptionem D. Quod non faceret, si in voluptate summum bonum poneret.

- - - -

Nam si beatus umquam fuisset, beatam vitam usque ad illum a Cyro extructum rogum pertulisset. Si est nihil nisi corpus, summa erunt illa: valitudo, vacuitas doloris, pulchritudo, cetera. Num igitur utiliorem tibi hunc Triarium putas esse posse, quam si tua sint Puteolis granaria? Unum est sine dolore esse, alterum cum voluptate. Quid affers, cur Thorius, cur Caius Postumius, cur omnium horum magister, Orata, non iucundissime vixerit? Cur id non ita fit? Tanti autem aderant vesicae et torminum morbi, ut nihil ad eorum magnitudinem posset accedere.

- - - -

Non autem hoc: igitur ne illud quidem. Qui non moveatur et offensione turpitudinis et comprobatione honestatis? Dici enim nihil potest verius. At miser, si in flagitiosa et vitiosa vita afflueret voluptatibus. Tum ille: Ain tandem? Simus igitur contenti his. Easdemne res? Sine ea igitur iucunde negat posse se vivere?

- - - -

Et quidem, inquit, vehementer errat; Quid enim necesse est, tamquam meretricem in matronarum coetum, sic voluptatem in virtutum concilium adducere? Quid autem habent admirationis, cum prope accesseris? Res enim fortasse verae, certe graves, non ita tractantur, ut debent, sed aliquanto minutius. Non minor, inquit, voluptas percipitur ex vilissimis rebus quam ex pretiosissimis. Quod cum dixissent, ille contra.

- - - -
-

- Ipse negat, ut ante dixi, luxuriosorum vitam reprehendendam, nisi plane fatui sint, id est nisi aut cupiant aut metuant. -

-
- - - -
Equidem, sed audistine modo de Carneade?
- - - -

Unum nescio, quo modo possit, si luxuriosus sit, finitas cupiditates habere. Egone quaeris, inquit, quid sentiam? Sed residamus, inquit, si placet. Quae cum essent dicta, discessimus. An vero, inquit, quisquam potest probare, quod perceptfum, quod. At hoc in eo M. Bonum incolumis acies: misera caecitas. Cur id non ita fit?

- - - -

Scrupulum, inquam, abeunti; Quippe: habes enim a rhetoribus; Aliter enim nosmet ipsos nosse non possumus. Quasi vero, inquit, perpetua oratio rhetorum solum, non etiam philosophorum sit. An hoc usque quaque, aliter in vita? Non dolere, inquam, istud quam vim habeat postea videro; Itaque fecimus. Quamquam non negatis nos intellegere quid sit voluptas, sed quid ille dicat.

- - - -
Homines optimi non intellegunt totam rationem everti, si ita res se habeat.
- - - -

Quippe: habes enim a rhetoribus; Vitiosum est enim in dividendo partem in genere numerare. Omnia contraria, quos etiam insanos esse vultis. Compensabatur, inquit, cum summis doloribus laetitia. Quod cum dixissent, ille contra. Dolere malum est: in crucem qui agitur, beatus esse non potest. Quis istud possit, inquit, negare?

- - - -

Quid de Platone aut de Democrito loquar? Tria genera bonorum; Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster? Equidem soleo etiam quod uno Graeci, si aliter non possum, idem pluribus verbis exponere. Est, ut dicis, inquit; Post enim Chrysippum eum non sane est disputatum.

- - - -
Negabat igitur ullam esse artem, quae ipsa a se proficisceretur;
- - - -

Mihi quidem Antiochum, quem audis, satis belle videris attendere. Haec igitur Epicuri non probo, inquam. Ut nemo dubitet, eorum omnia officia quo spectare, quid sequi, quid fugere debeant? Ergo hoc quidem apparet, nos ad agendum esse natos. Illud non continuo, ut aeque incontentae.

- - - -

Ea possunt paria non esse. Ita multa dicunt, quae vix intellegam. Nunc omni virtuti vitium contrario nomine opponitur. Quantum Aristoxeni ingenium consumptum videmus in musicis? Ergo instituto veterum, quo etiam Stoici utuntur, hinc capiamus exordium. Cur tantas regiones barbarorum pedibus obiit, tot maria transmisit? Idemne, quod iucunde? Egone quaeris, inquit, quid sentiam?

- - - -

Quantum Aristoxeni ingenium consumptum videmus in musicis? Quid, quod res alia tota est? Sed ne, dum huic obsequor, vobis molestus sim. Transfer idem ad modestiam vel temperantiam, quae est moderatio cupiditatum rationi oboediens. Nescio quo modo praetervolavit oratio. Isto modo ne improbos quidem, si essent boni viri. Vide, ne etiam menses! nisi forte eum dicis, qui, simul atque arripuit, interficit. Id enim natura desiderat. Nulla profecto est, quin suam vim retineat a primo ad extremum. Quae quidem sapientes sequuntur duce natura tamquam videntes; Idemque diviserunt naturam hominis in animum et corpus. Quod autem ratione actum est, id officium appellamus.

- - - -

Dicimus aliquem hilare vivere; Quia dolori non voluptas contraria est, sed doloris privatio. Semper enim ex eo, quod maximas partes continet latissimeque funditur, tota res appellatur. Graece donan, Latine voluptatem vocant. Hoc enim constituto in philosophia constituta sunt omnia. Tu autem inter haec tantam multitudinem hominum interiectam non vides nec laetantium nec dolentium? Atqui iste locus est, Piso, tibi etiam atque etiam confirmandus, inquam;

- - - -

Cur, nisi quod turpis oratio est? Quare ad ea primum, si videtur; Quod autem principium officii quaerunt, melius quam Pyrrho; Dat enim intervalla et relaxat. Solum praeterea formosum, solum liberum, solum civem, stultost; Quod si ita se habeat, non possit beatam praestare vitam sapientia.

- - - -
-

- Id autem eius modi est, ut additum ad virtutem auctoritatem videatur habiturum et expleturum cumulate vitam beatam, de quo omnis haec quaestio est. -

-
- - - -

Suam denique cuique naturam esse ad vivendum ducem. Igitur neque stultorum quisquam beatus neque sapientium non beatus. Et quidem, inquit, vehementer errat; Sed finge non solum callidum eum, qui aliquid improbe faciat, verum etiam praepotentem, ut M. Nunc de hominis summo bono quaeritur; Atqui reperies, inquit, in hoc quidem pertinacem; Cur tantas regiones barbarorum pedibus obiit, tot maria transmisit? Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster? Ut necesse sit omnium rerum, quae natura vigeant, similem esse finem, non eundem. Non risu potius quam oratione eiciendum? Bestiarum vero nullum iudicium puto.

- - - -
-

- Nec vero sum nescius esse utilitatem in historia, non modo voluptatem. -

-
- - - -

Nam quibus rebus efficiuntur voluptates, eae non sunt in potestate sapientis.

- - - -

Cur haec eadem Democritus? Mihi, inquam, qui te id ipsum rogavi? Semper enim ex eo, quod maximas partes continet latissimeque funditur, tota res appellatur. Ego vero isti, inquam, permitto. Quis istud possit, inquit, negare? Quam illa ardentis amores excitaret sui! Cur tandem?

- - - -
Itaque vides, quo modo loquantur, nova verba fingunt, deserunt usitata.
- - - -

Quo studio cum satiari non possint, omnium ceterarum rerum obliti níhil abiectum, nihil humile cogitant; Sin kakan malitiam dixisses, ad aliud nos unum certum vitium consuetudo Latina traduceret. Nam et a te perfici istam disputationem volo, nec tua mihi oratio longa videri potest. Sapientem locupletat ipsa natura, cuius divitias Epicurus parabiles esse docuit. Tum mihi Piso: Quid ergo? Quarum ambarum rerum cum medicinam pollicetur, luxuriae licentiam pollicetur. Vide, quantum, inquam, fallare, Torquate. Est, ut dicis, inquam. Maximus dolor, inquit, brevis est.

- - - -
    -
  • Non modo carum sibi quemque, verum etiam vehementer carum esse?
  • - - - -
  • Et quoniam haec deducuntur de corpore quid est cur non recte pulchritudo etiam ipsa propter se expetenda ducatur?
  • - - - -
  • Cum autem venissemus in Academiae non sine causa nobilitata spatia, solitudo erat ea, quam volueramus.
  • -
- - - -
-

- Itaque omnis honos, omnis admiratio, omne studium ad virtutem et ad eas actiones, quae virtuti sunt consentaneae, refertur, eaque omnia, quae aut ita in animis sunt aut ita geruntur, uno nomine honesta dicuntur. -

-
- - - -

Polemoni et iam ante Aristoteli ea prima visa sunt, quae paulo ante dixi. Tum Quintus: Est plane, Piso, ut dicis, inquit. Igitur ne dolorem quidem. Ut in geometria, prima si dederis, danda sunt omnia. Luxuriam non reprehendit, modo sit vacua infinita cupiditate et timore. Nec enim, dum metuit, iustus est, et certe, si metuere destiterit, non erit; An vero displicuit ea, quae tributa est animi virtutibus tanta praestantia?

- - - -

Quis est tam dissimile homini. Hoc loco discipulos quaerere videtur, ut, qui asoti esse velint, philosophi ante fiant. In quibus doctissimi illi veteres inesse quiddam caeleste et divinum putaverunt. Quid nunc honeste dicit? Quam tu ponis in verbis, ego positam in re putabam.

- - - -

Oratio me istius philosophi non offendit; Hic ambiguo ludimur. Inde sermone vario sex illa a Dipylo stadia confecimus. Nam, ut sint illa vendibiliora, haec uberiora certe sunt. Nummus in Croesi divitiis obscuratur, pars est tamen divitiarum. Neutrum vero, inquit ille. Sed ad haec, nisi molestum est, habeo quae velim. Parvi enim primo ortu sic iacent, tamquam omnino sine animo sint.

- - - -

Deinde disputat, quod cuiusque generis animantium statui deceat extremum. Memini me adesse P. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Isto modo ne improbos quidem, si essent boni viri. His singulis copiose responderi solet, sed quae perspicua sunt longa esse non debent. Scrupulum, inquam, abeunti;

- - - -

Qui enim voluptatem ipsam contemnunt, iis licet dicere se acupenserem maenae non anteponere.

- - - -
- - - -

Nec enim, dum metuit, iustus est, et certe, si metuere destiterit, non erit; Partim cursu et peragratione laetantur, congregatione aliae coetum quodam modo civitatis imitantur; Ergo et avarus erit, sed finite, et adulter, verum habebit modum, et luxuriosus eodem modo. Quid enim? Eam tum adesse, cum dolor omnis absit;

- - - -

Nihil enim iam habes, quod ad corpus referas; Id est enim, de quo quaerimus. Quid autem habent admirationis, cum prope accesseris? Si mala non sunt, iacet omnis ratio Peripateticorum. Semovenda est igitur voluptas, non solum ut recta sequamini, sed etiam ut loqui deceat frugaliter. Sextilio Rufo, cum is rem ad amicos ita deferret, se esse heredem Q. An eum discere ea mavis, quae cum plane perdidiceriti nihil sciat? Nihilo magis. Sed emolumenta communia esse dicuntur, recte autem facta et peccata non habentur communia.

- - - -

Quo modo autem optimum, si bonum praeterea nullum est?

- - - -

Duae sunt enim res quoque, ne tu verba solum putes. Haec dicuntur inconstantissime. At ille pellit, qui permulcet sensum voluptate. Quod quidem iam fit etiam in Academia. Poterat autem inpune; Eaedem enim utilitates poterunt eas labefactare atque pervertere.

- - - -
-

- Lege laudationes, Torquate, non eorum, qui sunt ab Homero laudati, non Cyri, non Agesilai, non Aristidi aut Themistocli, non Philippi aut Alexandri, lege nostrorum hominum, lege vestrae familiae; -

-
- - - -

Neque enim disputari sine reprehensione nec cum iracundia aut pertinacia recte disputari potest. Hunc vos beatum; Callipho ad virtutem nihil adiunxit nisi voluptatem, Diodorus vacuitatem doloris. Ergo hoc quidem apparet, nos ad agendum esse natos. Hoc est non modo cor non habere, sed ne palatum quidem. Ipse Epicurus fortasse redderet, ut Sextus Peducaeus, Sex. Qui-vere falsone, quaerere mittimus-dicitur oculis se privasse; Cum autem negant ea quicquam ad beatam vitam pertinere, rursus naturam relinquunt. Bonum negas esse divitias, praeposìtum esse dicis?

- - - -
-

- An potest, inquit ille, quicquam esse suavius quam nihil dolere? -

-
- - - -

Tu quidem reddes; Efficiens dici potest. Et quidem, inquit, vehementer errat; Hoc sic expositum dissimile est superiori. Hic ego: Pomponius quidem, inquam, noster iocari videtur, et fortasse suo iure. A primo, ut opinor, animantium ortu petitur origo summi boni.

- - - -
    -
  • At ille non pertimuit saneque fidenter: Istis quidem ipsis verbis, inquit;
  • - - - -
  • Nulla profecto est, quin suam vim retineat a primo ad extremum.
  • - - - -
  • Pisone in eo gymnasio, quod Ptolomaeum vocatur, unaque nobiscum Q.
  • - - - -
  • Apud ceteros autem philosophos, qui quaesivit aliquid, tacet;
  • -
- - - -
    -
  • Sextilio Rufo, cum is rem ad amicos ita deferret, se esse heredem Q.
  • - - - -
  • Ergo id est convenienter naturae vivere, a natura discedere.
  • - - - -
  • Dici enim nihil potest verius.
  • -
- - - -

Putabam equidem satis, inquit, me dixisse. Et quidem Arcesilas tuus, etsi fuit in disserendo pertinacior, tamen noster fuit; Audax negotium, dicerem impudens, nisi hoc institutum postea translatum ad philosophos nostros esset. Nam quibus rebus efficiuntur voluptates, eae non sunt in potestate sapientis. Equidem, sed audistine modo de Carneade? Nam ante Aristippus, et ille melius. Sed tamen intellego quid velit.

- - - -
    -
  • Ex ea difficultate illae fallaciloquae, ut ait Accius, malitiae natae sunt.
  • - - - -
  • Sit hoc ultimum bonorum, quod nunc a me defenditur;
  • -
- - - -
    -
  • Quae cum magnifice primo dici viderentur, considerata minus probabantur.
  • - - - -
  • Satisne igitur videor vim verborum tenere, an sum etiam nunc vel Graece loqui vel Latine docendus?
  • -
- - - -

Quid affers, cur Thorius, cur Caius Postumius, cur omnium horum magister, Orata, non iucundissime vixerit? Videmusne ut pueri ne verberibus quidem a contemplandis rebus perquirendisque deterreantur? In his igitur partibus duabus nihil erat, quod Zeno commutare gestiret. Equidem soleo etiam quod uno Graeci, si aliter non possum, idem pluribus verbis exponere.

- - - -

Nos cum te, M. Ab his oratores, ab his imperatores ac rerum publicarum principes extiterunt. Esse enim, nisi eris, non potes. At hoc in eo M. Ab his oratores, ab his imperatores ac rerum publicarum principes extiterunt. An ea, quae per vinitorem antea consequebatur, per se ipsa curabit? Virtutibus igitur rectissime mihi videris et ad consuetudinem nostrae orationis vitia posuisse contraria. Illa sunt similia: hebes acies est cuipiam oculorum, corpore alius senescit;

- - - -
    -
  • Itaque nostrum est-quod nostrum dico, artis est-ad ea principia, quae accepimus.
  • - - - -
  • Quamquam haec quidem praeposita recte et reiecta dicere licebit.
  • - - - -
  • Aliter homines, aliter philosophos loqui putas oportere?
  • - - - -
  • Habent enim et bene longam et satis litigiosam disputationem.
  • - - - -
  • Sed non alienum est, quo facilius vis verbi intellegatur, rationem huius verbi faciendi Zenonis exponere.
  • - - - -
  • Tum Quintus: Est plane, Piso, ut dicis, inquit.
  • -
- - - -
    -
  • Bonum integritas corporis: misera debilitas.
  • - - - -
  • Tu quidem reddes;
  • -
- - - -
Neque enim disputari sine reprehensione nec cum iracundia aut pertinacia recte disputari potest.
- - - -

Laboro autem non sine causa; Quid ei reliquisti, nisi te, quoquo modo loqueretur, intellegere, quid diceret? Aperiendum est igitur, quid sit voluptas; Quid enim possumus hoc agere divinius? Theophrasti igitur, inquit, tibi liber ille placet de beata vita? Nec tamen ullo modo summum pecudis bonum et hominis idem mihi videri potest. Quid loquor de nobis, qui ad laudem et ad decus nati, suscepti, instituti sumus? Pauca mutat vel plura sane; Intellegi quidem, ut propter aliam quampiam rem, verbi gratia propter voluptatem, nos amemus;

- - - -
    -
  • Huic ego, si negaret quicquam interesse ad beate vivendum quali uteretur victu, concederem, laudarem etiam;
  • - - - -
  • Quod praeceptum quia maius erat, quam ut ab homine videretur, idcirco assignatum est deo.
  • - - - -
  • Videmusne ut pueri ne verberibus quidem a contemplandis rebus perquirendisque deterreantur?
  • - - - -
  • Scio enim esse quosdam, qui quavis lingua philosophari possint;
  • - - - -
  • Qua ex cognitione facilior facta est investigatio rerum occultissimarum.
  • -
- - - -

Mihi enim satis est, ipsis non satis.

- - - -

Quare conare, quaeso. Qui autem de summo bono dissentit de tota philosophiae ratione dissentit. Si longus, levis. Nam et complectitur verbis, quod vult, et dicit plane, quod intellegam; Cupiditates non Epicuri divisione finiebat, sed sua satietate.

- - - -

Si verbum sequimur, primum longius verbum praepositum quam bonum.

- - - -

Idemne, quod iucunde? Sin kakan malitiam dixisses, ad aliud nos unum certum vitium consuetudo Latina traduceret. Ac tamen hic mallet non dolere. Praeclare hoc quidem. Neque enim disputari sine reprehensione nec cum iracundia aut pertinacia recte disputari potest. Quicquid enim a sapientia proficiscitur, id continuo debet expletum esse omnibus suis partibus; Sed ad rem redeamus; Quasi vero, inquit, perpetua oratio rhetorum solum, non etiam philosophorum sit.

- - - -

Restincta enim sitis stabilitatem voluptatis habet, inquit, illa autem voluptas ipsius restinctionis in motu est. Illis videtur, qui illud non dubitant bonum dicere -; Tum Torquatus: Prorsus, inquit, assentior; Quis enim confidit semper sibi illud stabile et firmum permansurum, quod fragile et caducum sit? Vitae autem degendae ratio maxime quidem illis placuit quieta. Quantum Aristoxeni ingenium consumptum videmus in musicis?

- - - -

Rationis enim perfectio est virtus; Sed tu istuc dixti bene Latine, parum plane. At coluit ipse amicitias. Illa videamus, quae a te de amicitia dicta sunt. Tenent mordicus. Quamquam tu hanc copiosiorem etiam soles dicere.

- - - -
Respondent extrema primis, media utrisque, omnia omnibus.
- - - -

Istam voluptatem perpetuam quis potest praestare sapienti? Nam illud vehementer repugnat, eundem beatum esse et multis malis oppressum. Bonum incolumis acies: misera caecitas. Quae duo sunt, unum facit. Conferam avum tuum Drusum cum C.

- - - -

Primum divisit ineleganter; Sullae consulatum? Nam memini etiam quae nolo, oblivisci non possum quae volo. Ne amores quidem sanctos a sapiente alienos esse arbitrantur. Ex quo, id quod omnes expetunt, beate vivendi ratio inveniri et comparari potest. In his igitur partibus duabus nihil erat, quod Zeno commutare gestiret. Sed residamus, inquit, si placet. Vitae autem degendae ratio maxime quidem illis placuit quieta.

- - - -
Bona autem corporis huic sunt, quod posterius posui, similiora.
- - - -

Ergo instituto veterum, quo etiam Stoici utuntur, hinc capiamus exordium. Et harum quidem rerum facilis est et expedita distinctio. Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Tu autem negas fortem esse quemquam posse, qui dolorem malum putet.

- - - -

Atqui eorum nihil est eius generis, ut sit in fine atque extrerno bonorum. In quibus doctissimi illi veteres inesse quiddam caeleste et divinum putaverunt. Deinde prima illa, quae in congressu solemus: Quid tu, inquit, huc? Quod cum ille dixisset et satis disputatum videretur, in oppidum ad Pomponium perreximus omnes. Ut placet, inquit, etsi enim illud erat aptius, aequum cuique concedere. Nec vero sum nescius esse utilitatem in historia, non modo voluptatem. Tum ille timide vel potius verecunde: Facio, inquit. Idem iste, inquam, de voluptate quid sentit?

- - - -
Sed erat aequius Triarium aliquid de dissensione nostra iudicare.
- - - -

Negat enim summo bono afferre incrementum diem. Habent enim et bene longam et satis litigiosam disputationem. Aut haec tibi, Torquate, sunt vituperanda aut patrocinium voluptatis repudiandum. Ut proverbia non nulla veriora sint quam vestra dogmata. Fortitudinis quaedam praecepta sunt ac paene leges, quae effeminari virum vetant in dolore. Eam tum adesse, cum dolor omnis absit; Estne, quaeso, inquam, sitienti in bibendo voluptas? Negat esse eam, inquit, propter se expetendam.

- - - -

Etenim semper illud extra est, quod arte comprehenditur. Quid ei reliquisti, nisi te, quoquo modo loqueretur, intellegere, quid diceret? Experiamur igitur, inquit, etsi habet haec Stoicorum ratio difficilius quiddam et obscurius. Virtutis, magnitudinis animi, patientiae, fortitudinis fomentis dolor mitigari solet.

- - - -
    -
  • Sed quid ages tandem, si utilitas ab amicitia, ut fit saepe, defecerit?
  • - - - -
  • Sed nunc, quod agimus;
  • - - - -
  • Beatus autem esse in maximarum rerum timore nemo potest.
  • - - - -
  • An ea, quae per vinitorem antea consequebatur, per se ipsa curabit?
  • - - - -
  • Sedulo, inquam, faciam.
  • -
- - - -

Morbo gravissimo affectus, exul, orbus, egens, torqueatur eculeo: quem hunc appellas, Zeno? Ergo instituto veterum, quo etiam Stoici utuntur, hinc capiamus exordium. Restinguet citius, si ardentem acceperit. Hanc ergo intuens debet institutum illud quasi signum absolvere. Primum Theophrasti, Strato, physicum se voluit; Est enim effectrix multarum et magnarum voluptatum. Summus dolor plures dies manere non potest? Sed ille, ut dixi, vitiose.

- - - -

Quid ergo attinet gloriose loqui, nisi constanter loquare? Ut id aliis narrare gestiant? Inde sermone vario sex illa a Dipylo stadia confecimus. Graecis hoc modicum est: Leonidas, Epaminondas, tres aliqui aut quattuor; Non enim iam stirpis bonum quaeret, sed animalis. Rationis enim perfectio est virtus; Ita graviter et severe voluptatem secrevit a bono. Ostendit pedes et pectus. At modo dixeras nihil in istis rebus esse, quod interesset. Praeclarae mortes sunt imperatoriae; Eam stabilem appellas.

- - - -
    -
  • Ab his oratores, ab his imperatores ac rerum publicarum principes extiterunt.
  • - - - -
  • Quae sunt igitur communia vobis cum antiquis, iis sic utamur quasi concessis;
  • - - - -
  • Tamen aberramus a proposito, et, ne longius, prorsus, inquam, Piso, si ista mala sunt, placet.
  • - - - -
  • Sit hoc ultimum bonorum, quod nunc a me defenditur;
  • - - - -
  • Sed quid attinet de rebus tam apertis plura requirere?
  • - - - -
  • Nam si propter voluptatem, quae est ista laus, quae possit e macello peti?
  • -
- - - -

Verba tu fingas et ea dicas, quae non sentias? Praeclare hoc quidem. Quid ait Aristoteles reliquique Platonis alumni? Iam id ipsum absurdum, maximum malum neglegi. Sed tamen omne, quod de re bona dilucide dicitur, mihi praeclare dici videtur. Urgent tamen et nihil remittunt. Miserum hominem! Si dolor summum malum est, dici aliter non potest. Summum ením bonum exposuit vacuitatem doloris;

- - - -

Nam, ut sint illa vendibiliora, haec uberiora certe sunt. Transfer idem ad modestiam vel temperantiam, quae est moderatio cupiditatum rationi oboediens. Ergo id est convenienter naturae vivere, a natura discedere.

- - - -
Profectus in exilium Tubulus statim nec respondere ausus;
- - - -

Sed tu istuc dixti bene Latine, parum plane. Quae similitudo in genere etiam humano apparet. Semovenda est igitur voluptas, non solum ut recta sequamini, sed etiam ut loqui deceat frugaliter. An est aliquid per se ipsum flagitiosum, etiamsi nulla comitetur infamia? Quae in controversiam veniunt, de iis, si placet, disseramus. Quid iudicant sensus? Quonam, inquit, modo? Cur post Tarentum ad Archytam?

- - - -

Scaevolam M. Prodest, inquit, mihi eo esse animo. Est enim effectrix multarum et magnarum voluptatum. Aliter enim explicari, quod quaeritur, non potest. De quibus cupio scire quid sentias.

- - - -

Laboro autem non sine causa; Quis non odit sordidos, vanos, leves, futtiles? Sedulo, inquam, faciam. Summum a vobis bonum voluptas dicitur. Qui igitur convenit ab alia voluptate dicere naturam proficisci, in alia summum bonum ponere? Illi enim inter se dissentiunt. Qui ita affectus, beatum esse numquam probabis; Idemque diviserunt naturam hominis in animum et corpus.

- - - -

Quae cum essent dicta, discessimus. Laboro autem non sine causa; Duo enim genera quae erant, fecit tria. Hoc loco tenere se Triarius non potuit. Sed residamus, inquit, si placet. Falli igitur possumus. Torquatus, is qui consul cum Cn. Sit hoc ultimum bonorum, quod nunc a me defenditur; Ne discipulum abducam, times. Prodest, inquit, mihi eo esse animo. Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster?

- - - -
Quid ei reliquisti, nisi te, quoquo modo loqueretur, intellegere, quid diceret?
- - - -

Illud non continuo, ut aeque incontentae. Respondent extrema primis, media utrisque, omnia omnibus. Si mala non sunt, iacet omnis ratio Peripateticorum. Inde igitur, inquit, ordiendum est. Nonne igitur tibi videntur, inquit, mala? Quam ob rem tandem, inquit, non satisfacit? Est tamen ea secundum naturam multoque nos ad se expetendam magis hortatur quam superiora omnia. Itaque hic ipse iam pridem est reiectus;

- - - -
    -
  • Minime vero, inquit ille, consentit.
  • - - - -
  • Sunt enim quasi prima elementa naturae, quibus ubertas orationis adhiberi vix potest, nec equidem eam cogito consectari.
  • - - - -
  • At coluit ipse amicitias.
  • - - - -
  • Ex quo illud efficitur, qui bene cenent omnis libenter cenare, qui libenter, non continuo bene.
  • - - - -
  • Diodorus, eius auditor, adiungit ad honestatem vacuitatem doloris.
  • -
- - - -
- - - -
Quamquam te quidem video minime esse deterritum.
- - - -

At Zeno eum non beatum modo, sed etiam divitem dicere ausus est. Quid de Pythagora? Non enim quaero quid verum, sed quid cuique dicendum sit. Sint ista Graecorum; Non ego tecum iam ita iocabor, ut isdem his de rebus, cum L. Cupit enim dícere nihil posse ad beatam vitam deesse sapienti. Quodsi ipsam honestatem undique pertectam atque absolutam.

- - - -
-

- Quod cum dixissent, ille contra. -

-
- - - -

Eadem nunc mea adversum te oratio est. Oratio me istius philosophi non offendit; Totum genus hoc Zeno et qui ab eo sunt aut non potuerunt aut noluerunt, certe reliquerunt. Quacumque enim ingredimur, in aliqua historia vestigium ponimus. Expressa vero in iis aetatibus, quae iam confirmatae sunt. Ab his oratores, ab his imperatores ac rerum publicarum principes extiterunt. Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster? Quid igitur dubitamus in tota eius natura quaerere quid sit effectum? Que Manilium, ab iisque M. At multis malis affectus.

- - - -
    -
  • Traditur, inquit, ab Epicuro ratio neglegendi doloris.
  • - - - -
  • Sed tamen omne, quod de re bona dilucide dicitur, mihi praeclare dici videtur.
  • -
- - - -

Primum in nostrane potestate est, quid meminerimus?

- - - -

Et ille ridens: Video, inquit, quid agas; Si longus, levis dictata sunt. Hoc loco tenere se Triarius non potuit. Quid Zeno? Nam et a te perfici istam disputationem volo, nec tua mihi oratio longa videri potest. Estne, quaeso, inquam, sitienti in bibendo voluptas?

- - - -

Videamus animi partes, quarum est conspectus illustrior;

- - - -

Summum ením bonum exposuit vacuitatem doloris; At cum de plurimis eadem dicit, tum certe de maximis. Maximus dolor, inquit, brevis est. Qua tu etiam inprudens utebare non numquam. Universa enim illorum ratione cum tota vestra confligendum puto. Multa sunt dicta ab antiquis de contemnendis ac despiciendis rebus humanis; In omni enim arte vel studio vel quavis scientia vel in ipsa virtute optimum quidque rarissimum est. Maximas vero virtutes iacere omnis necesse est voluptate dominante.

- - - -

Tantum dico, magis fuisse vestrum agere Epicuri diem natalem, quam illius testamento cavere ut ageretur. Si stante, hoc natura videlicet vult, salvam esse se, quod concedimus; Ut in voluptate sit, qui epuletur, in dolore, qui torqueatur. Eaedem res maneant alio modo. Itaque si aut requietem natura non quaereret aut eam posset alia quadam ratione consequi.

- - - -

In eo enim positum est id, quod dicimus esse expetendum.

- - - -

Multoque hoc melius nos veriusque quam Stoici. Negat esse eam, inquit, propter se expetendam. Sed quanta sit alias, nunc tantum possitne esse tanta. Idemne potest esse dies saepius, qui semel fuit? At Zeno eum non beatum modo, sed etiam divitem dicere ausus est. Nemo nostrum istius generis asotos iucunde putat vivere. Deinde disputat, quod cuiusque generis animantium statui deceat extremum.

- - - -
Efficiens dici potest.
- - - -

Num igitur eum postea censes anxio animo aut sollicito fuisse? Nec vero pietas adversus deos nec quanta iis gratia debeatur sine explicatione naturae intellegi potest. Quod ea non occurrentia fingunt, vincunt Aristonem; Tecum optime, deinde etiam cum mediocri amico. Sed tamen enitar et, si minus multa mihi occurrent, non fugiam ista popularia. Isto modo ne improbos quidem, si essent boni viri. Non semper, inquam; Quid interest, nisi quod ego res notas notis verbis appello, illi nomina nova quaerunt, quibus idem dicant? Tecum optime, deinde etiam cum mediocri amico. Ergo in gubernando nihil, in officio plurimum interest, quo in genere peccetur.

- - - -
    -
  • Immo istud quidem, inquam, quo loco quidque, nisi iniquum postulo, arbitratu meo.
  • - - - -
  • Cur ipse Pythagoras et Aegyptum lustravit et Persarum magos adiit?
  • - - - -
  • Ergo illi intellegunt quid Epicurus dicat, ego non intellego?
  • -
- - - -

Sed in rebus apertissimis nimium longi sumus. Collige omnia, quae soletis: Praesidium amicorum. At ego quem huic anteponam non audeo dicere; Sed hoc sane concedamus. At iam decimum annum in spelunca iacet. Fatebuntur Stoici haec omnia dicta esse praeclare, neque eam causam Zenoni desciscendi fuisse. Vide, quantum, inquam, fallare, Torquate.

- - - -
Quae duo sunt, unum facit.
- - - -

Quid sequatur, quid repugnet, vident. Tu autem, si tibi illa probabantur, cur non propriis verbis ea tenebas? Piso, familiaris noster, et alia multa et hoc loco Stoicos irridebat: Quid enim? Cur deinde Metrodori liberos commendas?

- - - -
-

- Quod et posse fieri intellegimus et saepe etiam videmus, et perspicuum est nihil ad iucunde vivendum reperiri posse, quod coniunctione tali sit aptius. -

-
- - - -

Tu autem, si tibi illa probabantur, cur non propriis verbis ea tenebas? Portenta haec esse dicit, neque ea ratione ullo modo posse vivi; Sed hoc sane concedamus. Si alia sentit, inquam, alia loquitur, numquam intellegam quid sentiat; Vestri haec verecundius, illi fortasse constantius. Nam aliquando posse recte fieri dicunt nulla expectata nec quaesita voluptate. A quibus propter discendi cupiditatem videmus ultimas terras esse peragratas. Quid ergo hoc loco intellegit honestum? Propter nos enim illam, non propter eam nosmet ipsos diligimus.

- - - -

Faceres tu quidem, Torquate, haec omnia;

- - - -

Neque enim civitas in seditione beata esse potest nec in discordia dominorum domus; Si autem id non concedatur, non continuo vita beata tollitur. Nam Pyrrho, Aristo, Erillus iam diu abiecti. Aliter enim nosmet ipsos nosse non possumus. Idem iste, inquam, de voluptate quid sentit? Eam tum adesse, cum dolor omnis absit; Iam in altera philosophiae parte. At multis malis affectus. Quae cum ita sint, effectum est nihil esse malum, quod turpe non sit.

- - - -

Haec dicuntur inconstantissime. Nos paucis ad haec additis finem faciamus aliquando; Ut in geometria, prima si dederis, danda sunt omnia. At multis se probavit. Nam adhuc, meo fortasse vitio, quid ego quaeram non perspicis. Itaque his sapiens semper vacabit. Satis est ad hoc responsum. Ita enim vivunt quidam, ut eorum vita refellatur oratio.

- - - -

Quid censes in Latino fore? Superiores tres erant, quae esse possent, quarum est una sola defensa, eaque vehementer. Ego vero volo in virtute vim esse quam maximam; Neque solum ea communia, verum etiam paria esse dixerunt.

- - - -
    -
  • Et ais, si una littera commota sit, fore tota ut labet disciplina.
  • - - - -
  • Mihi enim satis est, ipsis non satis.
  • - - - -
  • Sic vester sapiens magno aliquo emolumento commotus cicuta, si opus erit, dimicabit.
  • - - - -
  • Satisne igitur videor vim verborum tenere, an sum etiam nunc vel Graece loqui vel Latine docendus?
  • - - - -
  • Tum Torquatus: Prorsus, inquit, assentior;
  • - - - -
  • Sed quoniam et advesperascit et mihi ad villam revertendum est, nunc quidem hactenus;
  • -
- - - -

Nam ista vestra: Si gravis, brevis; Hic Speusippus, hic Xenocrates, hic eius auditor Polemo, cuius illa ipsa sessio fuit, quam videmus. Laboro autem non sine causa; Recte, inquit, intellegis. Quare obscurentur etiam haec, quae secundum naturam esse dicimus, in vita beata;

- - - -
-

- Quibus autem in rebus tanta obscuratio non fit, fieri tamen potest, ut id ipsum, quod interest, non sit magnum. -

-
- - - -

Quamquam tu hanc copiosiorem etiam soles dicere. Et quidem iure fortasse, sed tamen non gravissimum est testimonium multitudinis. Atque hoc loco similitudines eas, quibus illi uti solent, dissimillimas proferebas. Eadem fortitudinis ratio reperietur. Age, inquies, ista parva sunt. Rationis enim perfectio est virtus; Etsi ea quidem, quae adhuc dixisti, quamvis ad aetatem recte isto modo dicerentur.

- - - -

Ergo id est convenienter naturae vivere, a natura discedere. Si de re disceptari oportet, nulla mihi tecum, Cato, potest esse dissensio. Quod si ita sit, cur opera philosophiae sit danda nescio. Conferam avum tuum Drusum cum C. Unum nescio, quo modo possit, si luxuriosus sit, finitas cupiditates habere. Facile est hoc cernere in primis puerorum aetatulis. Mihi quidem Antiochum, quem audis, satis belle videris attendere. Sed haec quidem liberius ab eo dicuntur et saepius. Sed non alienum est, quo facilius vis verbi intellegatur, rationem huius verbi faciendi Zenonis exponere. Duo enim genera quae erant, fecit tria. Sit sane ista voluptas.

- - - -

Quo tandem modo? Quos quidem tibi studiose et diligenter tractandos magnopere censeo. Eam tum adesse, cum dolor omnis absit; Sed tamen est aliquid, quod nobis non liceat, liceat illis. Quid est, quod ab ea absolvi et perfici debeat? Videamus animi partes, quarum est conspectus illustrior; Cui Tubuli nomen odio non est? Non est igitur summum malum dolor.

- - - -

Sed quid ages tandem, si utilitas ab amicitia, ut fit saepe, defecerit?

- - - -

Quod cum accidisset ut alter alterum necopinato videremus, surrexit statim. Ut non sine causa ex iis memoriae ducta sit disciplina. Satis est tibi in te, satis in legibus, satis in mediocribus amicitiis praesidii. Quo plebiscito decreta a senatu est consuli quaestio Cn. In his igitur partibus duabus nihil erat, quod Zeno commutare gestiret. Negat esse eam, inquit, propter se expetendam. Haec para/doca illi, nos admirabilia dicamus. Itaque nostrum est-quod nostrum dico, artis est-ad ea principia, quae accepimus.

- - - -

Aeque enim contingit omnibus fidibus, ut incontentae sint.

- - - -

Si verbum sequimur, primum longius verbum praepositum quam bonum. Dat enim intervalla et relaxat. Sed tamen enitar et, si minus multa mihi occurrent, non fugiam ista popularia. Scrupulum, inquam, abeunti; Atque haec ita iustitiae propria sunt, ut sint virtutum reliquarum communia. Et quidem iure fortasse, sed tamen non gravissimum est testimonium multitudinis. Quid, de quo nulla dissensio est? Paulum, cum regem Persem captum adduceret, eodem flumine invectio? An nisi populari fama? Transfer idem ad modestiam vel temperantiam, quae est moderatio cupiditatum rationi oboediens.

- - - -
    -
  • Nec enim, dum metuit, iustus est, et certe, si metuere destiterit, non erit;
  • - - - -
  • Ab hoc autem quaedam non melius quam veteres, quaedam omnino relicta.
  • - - - -
  • Si enim ita est, vide ne facinus facias, cum mori suadeas.
  • - - - -
  • Nec enim ignoras his istud honestum non summum modo, sed etiam, ut tu vis, solum bonum videri.
  • - - - -
  • Vos autem cum perspicuis dubia debeatis illustrare, dubiis perspicua conamini tollere.
  • - - - -
  • Idcirco enim non desideraret, quia, quod dolore caret, id in voluptate est.
  • -
- - - -

Nam cui proposito sit conservatio sui, necesse est huic partes quoque sui caras suo genere laudabiles. Mihi quidem Antiochum, quem audis, satis belle videris attendere.

- - - -

Tamen a proposito, inquam, aberramus. An hoc usque quaque, aliter in vita? Roges enim Aristonem, bonane ei videantur haec: vacuitas doloris, divitiae, valitudo; Nemo igitur esse beatus potest. Efficiens dici potest. Ut scias me intellegere, primum idem esse dico voluptatem, quod ille don. Nihil illinc huc pervenit.

- - - -
    -
  • Pisone in eo gymnasio, quod Ptolomaeum vocatur, unaque nobiscum Q.
  • - - - -
  • Non igitur bene.
  • -
- - - -

Videsne quam sit magna dissensio?

- - - -

Quare conare, quaeso. Ad corpus diceres pertinere-, sed ea, quae dixi, ad corpusne refers? Qualem igitur hominem natura inchoavit? Ait enim se, si uratur, Quam hoc suave! dicturum.

- - - -
-

- Cuius etiam illi hortuli propinqui non memoriam solum mihi afferunt, sed ipsum videntur in conspectu meo ponere. -

-
- - - -

Perge porro;

- - - -

Cur tantas regiones barbarorum pedibus obiit, tot maria transmisit? Tum Quintus: Est plane, Piso, ut dicis, inquit. Sextilio Rufo, cum is rem ad amicos ita deferret, se esse heredem Q. Etiam beatissimum? Certe nihil nisi quod possit ipsum propter se iure laudari. Bestiarum vero nullum iudicium puto. Dat enim intervalla et relaxat.

- - - -
-

- Restat locus huic disputationi vel maxime necessarius de amicitia, quam, si voluptas summum sit bonum, affirmatis nullam omnino fore. -

-
- - - -

Quid dubitas igitur mutare principia naturae?

- - - -

Torquatus, is qui consul cum Cn. Miserum hominem! Si dolor summum malum est, dici aliter non potest. Age sane, inquam. Ergo hoc quidem apparet, nos ad agendum esse natos. Qui potest igitur habitare in beata vita summi mali metus? Dolor ergo, id est summum malum, metuetur semper, etiamsi non aderit; Certe non potest. Graecis hoc modicum est: Leonidas, Epaminondas, tres aliqui aut quattuor;

- - - -

Illud non continuo, ut aeque incontentae.

- - - -

Non est enim vitium in oratione solum, sed etiam in moribus. An me, inquam, nisi te audire vellem, censes haec dicturum fuisse? Simus igitur contenti his. Multoque hoc melius nos veriusque quam Stoici. Proclivi currit oratio.

- - - -
Quid enim tanto opus est instrumento in optimis artibus comparandis?
- - - -

Ne in odium veniam, si amicum destitero tueri. At quanta conantur! Mundum hunc omnem oppidum esse nostrum! Incendi igitur eos, qui audiunt, vides. Tu vero, inquam, ducas licet, si sequetur; Et nunc quidem quod eam tuetur, ut de vite potissimum loquar, est id extrinsecus; Illa argumenta propria videamus, cur omnia sint paria peccata. Illa videamus, quae a te de amicitia dicta sunt. Sed nimis multa. Non autem hoc: igitur ne illud quidem. Sed residamus, inquit, si placet. Nam si beatus umquam fuisset, beatam vitam usque ad illum a Cyro extructum rogum pertulisset. Illud dico, ea, quae dicat, praeclare inter se cohaerere.

- - - -
-

- Quae possunt eadem contra Carneadeum illud summum bonum dici, quod is non tam, ut probaret, protulit, quam ut Stoicis, quibuscum bellum gerebat, opponeret. -

-
- - - -

Nihil sane. At multis se probavit. Sed est forma eius disciplinae, sicut fere ceterarum, triplex: una pars est naturae, disserendi altera, vivendi tertia. Potius inflammat, ut coercendi magis quam dedocendi esse videantur. Nihil opus est exemplis hoc facere longius. Minime id quidem, inquam, alienum, multumque ad ea, quae quaerimus, explicatio tua ista profecerit. Quibusnam praeteritis? Quae quidem sapientes sequuntur duce natura tamquam videntes;

- - - -
At quicum ioca seria, ut dicitur, quicum arcana, quicum occulta omnia?
- - - -

Hoc loco discipulos quaerere videtur, ut, qui asoti esse velint, philosophi ante fiant. Sint ista Graecorum; Si quae forte-possumus. Servari enim iustitia nisi a forti viro, nisi a sapiente non potest. Atqui reperies, inquit, in hoc quidem pertinacem; Piso, familiaris noster, et alia multa et hoc loco Stoicos irridebat: Quid enim?

- - - -
    -
  • Qua ex cognitione facilior facta est investigatio rerum occultissimarum.
  • - - - -
  • Sed quae tandem ista ratio est?
  • - - - -
  • Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster?
  • - - - -
  • Nihil minus, contraque illa hereditate dives ob eamque rem laetus.
  • -
- - - -
-

- Quis enim tam inimicus paene nomini Romano est, qui Ennii Medeam aut Antiopam Pacuvii spernat aut reiciat, quod se isdem Euripidis fabulis delectari dicat, Latinas litteras oderit? -

-
- - - -

Deinde qui fit, ut ego nesciam, sciant omnes, quicumque Epicurei esse voluerunt? Philosophi autem in suis lectulis plerumque moriuntur. Ergo adhuc, quantum equidem intellego, causa non videtur fuisse mutandi nominis.

- - - -

Non quam nostram quidem, inquit Pomponius iocans; Ergo ita: non posse honeste vivi, nisi honeste vivatur? Neque enim disputari sine reprehensione nec cum iracundia aut pertinacia recte disputari potest. Quae similitudo in genere etiam humano apparet.

- - - -
-

- Etsi dedit talem mentem, quae omnem virtutem accipere posset, ingenuitque sine doctrina notitias parvas rerum maximarum et quasi instituit docere et induxit in ea, quae inerant, tamquam elementa virtutis. -

-
- - - -

Equidem, sed audistine modo de Carneade? Si quicquam extra virtutem habeatur in bonis. Graece donan, Latine voluptatem vocant. Quorum sine causa fieri nihil putandum est. Quis animo aequo videt eum, quem inpure ac flagitiose putet vivere? Unum est sine dolore esse, alterum cum voluptate. Intellegi quidem, ut propter aliam quampiam rem, verbi gratia propter voluptatem, nos amemus; Iam quae corporis sunt, ea nec auctoritatem cum animi partibus, comparandam et cognitionem habent faciliorem.

- - - -

Gerendus est mos, modo recte sentiat.

- - - -

Ergo instituto veterum, quo etiam Stoici utuntur, hinc capiamus exordium. Immo vero, inquit, ad beatissime vivendum parum est, ad beate vero satis. Si stante, hoc natura videlicet vult, salvam esse se, quod concedimus; Rationis enim perfectio est virtus; Ut pulsi recurrant? Inde sermone vario sex illa a Dipylo stadia confecimus. Quae quidem sapientes sequuntur duce natura tamquam videntes; Ne discipulum abducam, times.

- - - -

Atqui iste locus est, Piso, tibi etiam atque etiam confirmandus, inquam; Tollenda est atque extrahenda radicitus. Bonum incolumis acies: misera caecitas. Nec vero alia sunt quaerenda contra Carneadeam illam sententiam.

- - - -
    -
  • Illa sunt similia: hebes acies est cuipiam oculorum, corpore alius senescit;
  • - - - -
  • Eodem modo is enim tibi nemo dabit, quod, expetendum sit, id esse laudabile.
  • - - - -
  • Quarum ambarum rerum cum medicinam pollicetur, luxuriae licentiam pollicetur.
  • -
- - - -

Quid turpius quam sapientis vitam ex insipientium sermone pendere? Quia dolori non voluptas contraria est, sed doloris privatio. Ne amores quidem sanctos a sapiente alienos esse arbitrantur.

- - - -

Quis hoc dicit? Quis est enim, in quo sit cupiditas, quin recte cupidus dici possit? Et harum quidem rerum facilis est et expedita distinctio. Dic in quovis conventu te omnia facere, ne doleas. An nisi populari fama? Idem iste, inquam, de voluptate quid sentit?

- - - -

Nos commodius agimus.

- - - -

Hanc in motu voluptatem -sic enim has suaves et quasi dulces voluptates appellat-interdum ita extenuat, ut M. Itaque rursus eadem ratione, qua sum paulo ante usus, haerebitis. Nonne videmus quanta perturbatio rerum omnium consequatur, quanta confusio? Maximus dolor, inquit, brevis est. Deprehensus omnem poenam contemnet. Hoc Hieronymus summum bonum esse dixit.

- - - -
- - - -

Compensabatur, inquit, cum summis doloribus laetitia. Urgent tamen et nihil remittunt. Tu vero, inquam, ducas licet, si sequetur; Sedulo, inquam, faciam.

- - - -

Quis enim confidit semper sibi illud stabile et firmum permansurum, quod fragile et caducum sit?

- - - -

Audax negotium, dicerem impudens, nisi hoc institutum postea translatum ad philosophos nostros esset. Sin autem eos non probabat, quid attinuit cum iis, quibuscum re concinebat, verbis discrepare? Nam quibus rebus efficiuntur voluptates, eae non sunt in potestate sapientis. Sin dicit obscurari quaedam nec apparere, quia valde parva sint, nos quoque concedimus; Conferam tecum, quam cuique verso rem subicias;

- - - -

Si quicquam extra virtutem habeatur in bonis. Qui bonum omne in virtute ponit, is potest dicere perfici beatam vitam perfectione virtutis; Vos autem cum perspicuis dubia debeatis illustrare, dubiis perspicua conamini tollere. His enim rebus detractis negat se reperire in asotorum vita quod reprehendat. Non quaero, quid dicat, sed quid convenienter possit rationi et sententiae suae dicere. Non enim iam stirpis bonum quaeret, sed animalis.

- - - -

Igitur neque stultorum quisquam beatus neque sapientium non beatus. Minime vero, inquit ille, consentit. Tum Quintus: Est plane, Piso, ut dicis, inquit. Quid autem habent admirationis, cum prope accesseris? Res enim concurrent contrariae. Satisne vobis videor pro meo iure in vestris auribus commentatus? Videmus in quodam volucrium genere non nulla indicia pietatis, cognitionem, memoriam, in multis etiam desideria videmus. Quis istud possit, inquit, negare?

- - - -

Quae quidem sapientes sequuntur duce natura tamquam videntes; Ita enim vivunt quidam, ut eorum vita refellatur oratio. De hominibus dici non necesse est. Eam tum adesse, cum dolor omnis absit; At enim sequor utilitatem. Quod autem principium officii quaerunt, melius quam Pyrrho;

- - - -
    -
  • Quaesita enim virtus est, non quae relinqueret naturam, sed quae tueretur.
  • - - - -
  • Plane idem, inquit, et maxima quidem, qua fieri nulla maior potest.
  • - - - -
  • Quod si ita est, sequitur id ipsum, quod te velle video, omnes semper beatos esse sapientes.
  • - - - -
  • A villa enim, credo, et: Si ibi te esse scissem, ad te ipse venissem.
  • -
- - - -

Sed potestne rerum maior esse dissensio?

- - - -

Indicant pueri, in quibus ut in speculis natura cernitur. Rem unam praeclarissimam omnium maximeque laudandam, penitus viderent, quonam gaudio complerentur, cum tantopere eius adumbrata opinione laetentur? Ait enim se, si uratur, Quam hoc suave! dicturum. Atqui eorum nihil est eius generis, ut sit in fine atque extrerno bonorum.

- - - -

At multis se probavit. Non est enim vitium in oratione solum, sed etiam in moribus. Invidiosum nomen est, infame, suspectum. Cetera illa adhibebat, quibus demptis negat se Epicurus intellegere quid sit bonum. Quam ob rem tandem, inquit, non satisfacit? An vero displicuit ea, quae tributa est animi virtutibus tanta praestantia? Atqui iste locus est, Piso, tibi etiam atque etiam confirmandus, inquam; Nunc vides, quid faciat. Frater et T. Tanti autem aderant vesicae et torminum morbi, ut nihil ad eorum magnitudinem posset accedere.

- - - -

Et ille ridens: Video, inquit, quid agas;

- - - -

Te enim iudicem aequum puto, modo quae dicat ille bene noris. Non est ista, inquam, Piso, magna dissensio. Ita cum ea volunt retinere, quae superiori sententiae conveniunt, in Aristonem incidunt; Ego quoque, inquit, didicerim libentius si quid attuleris, quam te reprehenderim. Que Manilium, ab iisque M. Sic, et quidem diligentius saepiusque ista loquemur inter nos agemusque communiter. Hoc est non modo cor non habere, sed ne palatum quidem. Nobis Heracleotes ille Dionysius flagitiose descivisse videtur a Stoicis propter oculorum dolorem.

- - - -

Tu autem negas fortem esse quemquam posse, qui dolorem malum putet. Portenta haec esse dicit, neque ea ratione ullo modo posse vivi; Nec vero alia sunt quaerenda contra Carneadeam illam sententiam. Ut proverbia non nulla veriora sint quam vestra dogmata. Qui autem esse poteris, nisi te amor ipse ceperit? Ego vero volo in virtute vim esse quam maximam; Cur fortior sit, si illud, quod tute concedis, asperum et vix ferendum putabit? Si stante, hoc natura videlicet vult, salvam esse se, quod concedimus;

- - - -
- - - -
-

- Quos ille, di inmortales, cum omnes artus ardere viderentur, cruciatus perferebat! nec tamen miser esse, quia summum id malum non erat, tantum modo laboriosus videbatur; -

-
- - - -

Intrandum est igitur in rerum naturam et penitus quid ea postulet pervidendum; Vide, quaeso, rectumne sit. Est enim tanti philosophi tamque nobilis audacter sua decreta defendere. Tum Piso: Quoniam igitur aliquid omnes, quid Lucius noster? Quae cum dixisset paulumque institisset, Quid est? Quae sequuntur igitur?

- - - -
    -
  • Eadem fortitudinis ratio reperietur.
  • - - - -
  • Quid, quod homines infima fortuna, nulla spe rerum gerendarum, opifices denique delectantur historia?
  • - - - -
  • Cum ageremus, inquit, vitae beatum et eundem supremum diem, scribebamus haec.
  • - - - -
  • Scientiam pollicentur, quam non erat mirum sapientiae cupido patria esse cariorem.
  • - - - -
  • Varietates autem iniurasque fortunae facile veteres philosophorum praeceptis instituta vita superabat.
  • - - - -
  • Quamquam tu hanc copiosiorem etiam soles dicere.
  • -
- \ No newline at end of file + +

+ 1,000,000 +

+ + + +

+ 1,000,000.23 +

+ + + +

+32.3%

+ + + +

-33.28$

+
+ + + +
+
Skill
+ + + +
0
Day
0
Hour
0
Minute
0
Second
+ + + + + + + + + +
+

Add your content.

+
+ + + +
Skill
50%
+ + + +
+
Untitled Tab
+

+
+
+ + + + + + + +
+
+ + + +
Skill
+ + + +
+
Title1
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet cubilia + sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti vivamus non lectus + hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis elementum vivamus aliquet morbi + nam faucibus cubilia.

+
+ + + +
Title 2
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci + sagittis laoreet cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus + potenti vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis + elementum vivamus aliquet morbi nam faucibus cubilia.

+
+ + + +
Title 3
+
+
Sub Title 1
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet + cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti + vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis + elementum vivamus aliquet morbi nam faucibus cubilia.

+
+ + + +
Sub Title 2
+

No more dogs to pet.

+
+
+
+ + + +
Title 4
+
+
Sub Title 1
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet + cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti + vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis + elementum vivamus aliquet morbi nam faucibus cubilia.

+
+ + + +
Sub Title 2
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Duis ridiculus at orci sagittis laoreet + cubilia sociosqu. Litora consectetur consequat conubia felis risus. Massa vivamus potenti + vivamus non lectus hendrerit dapibus sed. Diam fusce urna fusce ultrices cras. Venenatis + elementum vivamus aliquet morbi nam faucibus cubilia.

+
+
+
+
+ + + +
0
Day
:
sep
0
Hour
:
sep
0
Minute
:
sep
0
Second
+ + + +
+
Title 1
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu + porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis + justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis + non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu + interdum.

+
+ + + +
Title 2
+

+
+ + + +
Title 3
+

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu + porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis + justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis + non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu + interdum.

+ + + +

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu + porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis + justo pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis + non quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu + interdum.

+
+
+ + + + + +
+
+
+

+ This is an overline

+ + + +

+ An amazing Hero Title

+ + + + + + + +

This is a description for the hero section. Synergestic actionables. + Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? +

+ + + + +
+
+ + + +
+
+
+ This is an overline
+ + + +

+ Amazing hero titleadsfasdf

+ + + + + + + +

adfasdf

sadfasdf

+

dasfdsafadsfasdf

+
+ + + +

This is a description for the hero section. Synergestic actionables. + Organic growth deep dive but circle back or but what's the real problem we're trying to solve here? +

+ + + + +
+ + + +
+
+
T1
+

asdfasdf

+
+ + + +
T2
+

dafasdfasdfasdf

+
+
+
+
+
+ + + + + +
+
Test
+ + + +
Test
+ + + +
Test
+ + + +
Test
+ + + +
Лорем ипсум долор сит амет, нец пробо епицуреи
+ + + +
結ソアヤキ経日ノ面争ードひぐ空
+ + + +
सहयोग किया क्षमता जानकारी ढांचामात्रुभाषा रचना
+ + + +
ببعض الصينية بعض قد, مع دنو وحتّى حاملات. هو الا والكوري الانجليزية. ما ببعض لبولندا، استطاعوا لها, لم هاربر كانتا والتي بلا. به، مع لهذه الإثنان, و لغات أملاً دول, تُصب وشعار وصافرات ثم قبل.
+ + + +
Help Text
+ + + +

You agree to receive email communication from us by submitting this form + and understand that your contact information will be stored with us.

+ + +
+ + + +

Nice to meet + you | はじめまして | Rất vui được gặp bạn

+ + + +
Bussines Hours | Öffnungszeiten
+
Monday
09:00 AM - 01:00 PM
+ + + +
Tuesday
09:00 AM - 03:00 PM
+ + + +
Wednesday | der Mittwoch
09:00 AM - 04:00 PM
+ + + +
Thursday
09:00 AM - 05:00 PM
+ + + +
Friday
09:00 AM - 06:00 PM
+ + + +
Saturday
Closed
+ + + +
Sunday
Closed
+
+ + + +
+
+
+ + + + +

+ Urban & Civil

+ + + +

Our Urban design studio offering a full range of + urban design solutions for solutions for urban development projects.

+ + + + + + + + +
+ + + + + + + +
+ + + + +

+ Workplace

+ + + +

We focus on strategically masterplanning cities. + Around the world, our multidisciplinary teams help to re-imagine urban environments for future + generations and work with governments to implement forward thinking strategic planning + strategies.

+ + + + + + + + +
+ + + + + + + +
+ + + + +

+ Hospitality

+ + + +

With offices in North America, Africa, + South-East Asia and Australia, we are passionate about creating environments that address local + issues and contribute to a better world.

+ + + + + + + + +
+ + + + + + + +
+ + + + +

+ Residential

+ + + +

From masterplans to remodels, we deliver an + exceptional customer experience with every step of the design process.

+ + + + + + + + +
+ + + + + + + +
+ + + + +

+ Interiors

+ + + +

A building is more than just a structure. It's + an experience, it's recreation, it's a reflection of the community around it and its + inhabitants. We have developed a design process that combines deep research with a commitment to + urban planning and social responsibility.

+ + + + + + + + +
+ + + + + + + +
+ + + + +

+ Commercial

+ + + +

All our products and services are aimed at + providing customers with an extra relaxation and comfort. We are working hard to create an + environment which would be appreciated by everyone looking for the best quality services.

+ + + + + + + + +
+
+
+ + + +

Flip Front

Lorem ipsum odor amet, consectetuer adipiscing elit. Odio sagittis sagittis iaculis. Faucibus gravida proin dis? Urna est sem. Dictumst semper cursus integer. Diam praesent cursus mattis scelerisque.

+

Lorem ipsum odor amet, consectetuer adipiscing elit. Facilisis phasellus dignissim netus sociosqu + porttitor facilisi nam. Commodo faucibus elementum lacus venenatis eleifend vehicula massa duis justo + pharetra proin. Cras venenatis per ultrices ridiculus fusce maecenas erat. Sed dolor facilisis non + quisque congue feugiat habitasse. Ornare vestibulum montes sollicitudin sociosqu sociosqu interdum.

+
+ + + +
+
+
+
+
+
+ + + +
+ + + +
+ + + +

You agree to receive email communication from us by + submitting this form and understand that your contact information will be stored + with us.

+ + +
+
+ + + +
+
0
Day
0
Hour
0
Minute
0
Second
+
+
+ + + +
+
+
+
Untitled Tab
+

adf

+
+ + + +
Untitled Tab
+

asdfasdf

+
+
+
+ + + +
+
+
+
+ + + +
+
+
+
Accordion
+
+
asdf
+

asdfasdf

+
+
+
+ + + +
Tabs
+
+
Untitled Tab
+
+
Untitled Tab
+

sfasdf

+
+ + + +
Untitled Tab
+

+
+ + + +
Untitled Tab
+

+
+ + + +
Untitled Tab
+

+
+
+
+ + + +
Untitled Tab
+

wertwert

+
+ + + +
Untitled Tab
+

ewrtwert

+
+ + + +
Untitled Tab
+

wertwert

+
+
+
+
+
+
+ + + +
+
+
+

asdfasdf

+ + + +

asdf

+ + + +

asdf

+ + + +

asdf

+ + + +

asd

+ + + +

fs

+ + + +

df

+ + + +

sdf

+
+ + + +
+

asdfasdf

+ + + +

asdf

+ + + +

asdf

+ + + +

asdf

+ + + +

asd

+ + + +

fs

+ + + +

df

+ + + +

sdf

+
+
+
+ + + +
+
+
+
+

+ Essential

+ + + +$59 + + + +

+ Party snackwave four dollar toast tumeric cold-pressed.

+ + + + + + + + + + + +
+ + + +
+

Custom Layouts & Hooks

+ + + +

Unlimited Website Usage

+ + + +

Risk-Free Guarantee

+
+ + + + +
+ + + +
+

+ Business

+ + + +$129 + + + +

+ Party snackwave four dollar toast tumeric cold-pressed.

+ + + + + + + + + + + +
+ + + +
+

Custom Layouts & Hooks

+ + + +

Unlimited Website Usage

+ + + +

Risk-Free Guarantee

+
+ + + + +
+ + + +
+

+ VIP

+ + + +$199 + + + +

+ Party snackwave four dollar toast tumeric cold-pressed.

+ + + + + + + + + + + +
+ + + +
+

Custom Layouts & Hooks

+ + + +

Unlimited Website Usage

+ + + +

Risk-Free Guarantee

+
+ + + + +
+
+
+
+ + + +
+
+
+
+
Skill
+
+ + + +
+
Skill
50%
+
+
+
+
+ + + +
+
+
+
a1
+
+
Untitled Tab
+
+
a2
+
+
Untitled Tab
+
+
a3
+
+
Untitled Tab
+
+
a4
+

adsad +

+
+
+
+ + + +
Untitled Tab
+

+
+
+
+
+
+ + + +
Untitled Tab
+

+
+
+
+
+
+ + + +
Untitled Tab
+

+
+
+
+
+
+
+
+
+ \ No newline at end of file diff --git a/src/blocks/test/performance/assets/small-post-with-containers.html b/src/blocks/test/performance/assets/small-post-with-containers.html new file mode 100644 index 000000000..f5d320116 --- /dev/null +++ b/src/blocks/test/performance/assets/small-post-with-containers.html @@ -0,0 +1,77 @@ + +
+
+

Heading

+ + + +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + +
    +
  • one
  • + + + +
  • two
  • + + + +
  • three
  • +
+
+ + + +
+

Heading

+ + + +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + +
    +
  • one
  • + + + +
  • two
  • + + + +
  • three
  • +
+
+ + + +
+

Heading

+ + + +

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

+ + + +
    +
  • one
  • + + + +
  • two
  • + + + +
  • three
  • +
+
+
+ + + +

+ \ No newline at end of file diff --git a/src/blocks/test/performance/config/global-setup.ts b/src/blocks/test/performance/config/global-setup.ts new file mode 100644 index 000000000..d7ceb5e5c --- /dev/null +++ b/src/blocks/test/performance/config/global-setup.ts @@ -0,0 +1,42 @@ +/** + * External dependencies + */ +import { request } from '@playwright/test'; +import type { FullConfig } from '@playwright/test'; + +/** + * WordPress dependencies + */ +import { RequestUtils } from '@wordpress/e2e-test-utils-playwright'; + +async function globalSetup( config: FullConfig ) { + const { storageState, baseURL } = config.projects[ 0 ].use; + const storageStatePath = + 'string' === typeof storageState ? storageState : undefined; + + const requestContext = await request.newContext({ + baseURL + }); + + const requestUtils = new RequestUtils( requestContext, { + storageStatePath + }); + + // Authenticate and save the storageState to disk. + await requestUtils.setupRest(); + + // Reset the test environment before running the tests. + await Promise.all([ + requestUtils.activateTheme( 'twentytwentyone' ), + + // Disable this test plugin as it's conflicting with some of the tests. + // We already have reduced motion enabled and Playwright will wait for most of the animations anyway. + requestUtils.deleteAllPosts(), + requestUtils.deleteAllBlocks(), + requestUtils.resetPreferences() + ]); + + await requestContext.dispose(); +} + +export default globalSetup; diff --git a/src/blocks/test/performance/config/performance-reporter.ts b/src/blocks/test/performance/config/performance-reporter.ts new file mode 100644 index 000000000..ea6d59df5 --- /dev/null +++ b/src/blocks/test/performance/config/performance-reporter.ts @@ -0,0 +1,198 @@ +/** + * External dependencies + */ +import path from 'path'; +import { writeFileSync } from 'fs'; +import type { + Reporter, + FullResult, + TestCase, + TestResult +} from '@playwright/test/reporter'; + +/** + * Internal dependencies + */ +import { average, median, minimum, maximum, round } from '../utils'; + +export interface WPRawPerformanceResults { + timeToFirstByte: number[]; + largestContentfulPaint: number[]; + lcpMinusTtfb: number[]; + serverResponse: number[]; + firstPaint: number[]; + domContentLoaded: number[]; + loaded: number[]; + firstContentfulPaint: number[]; + firstBlock: number[]; + type: number[]; + typeContainer: number[]; + focus: number[]; + inserterOpen: number[]; + inserterSearch: number[]; + inserterHover: number[]; + listViewOpen: number[]; +} + +export interface WPPerformanceResults { + timeToFirstByte?: number; + largestContentfulPaint?: number; + lcpMinusTtfb?: number; + serverResponse?: number; + firstPaint?: number; + domContentLoaded?: number; + loaded?: number; + firstContentfulPaint?: number; + firstBlock?: number; + type?: number; + minType?: number; + maxType?: number; + typeContainer?: number; + minTypeContainer?: number; + maxTypeContainer?: number; + focus?: number; + minFocus?: number; + maxFocus?: number; + inserterOpen?: number; + minInserterOpen?: number; + maxInserterOpen?: number; + inserterSearch?: number; + minInserterSearch?: number; + maxInserterSearch?: number; + inserterHover?: number; + minInserterHover?: number; + maxInserterHover?: number; + listViewOpen?: number; + minListViewOpen?: number; + maxListViewOpen?: number; +} + +/** + * Curate the raw performance results. + * + * @param {WPRawPerformanceResults} results + * + * @return {WPPerformanceResults} Curated Performance results. + */ +export function curateResults( + results: WPRawPerformanceResults +): WPPerformanceResults { + const output = { + timeToFirstByte: median( results.timeToFirstByte ), + largestContentfulPaint: median( results.largestContentfulPaint ), + lcpMinusTtfb: median( results.lcpMinusTtfb ), + serverResponse: median( results.serverResponse ), + firstPaint: median( results.firstPaint ), + domContentLoaded: median( results.domContentLoaded ), + loaded: median( results.loaded ), + firstContentfulPaint: median( results.firstContentfulPaint ), + firstBlock: median( results.firstBlock ), + type: average( results.type ), + minType: minimum( results.type ), + maxType: maximum( results.type ), + typeContainer: average( results.typeContainer ), + minTypeContainer: minimum( results.typeContainer ), + maxTypeContainer: maximum( results.typeContainer ), + focus: average( results.focus ), + minFocus: minimum( results.focus ), + maxFocus: maximum( results.focus ), + inserterOpen: average( results.inserterOpen ), + minInserterOpen: minimum( results.inserterOpen ), + maxInserterOpen: maximum( results.inserterOpen ), + inserterSearch: average( results.inserterSearch ), + minInserterSearch: minimum( results.inserterSearch ), + maxInserterSearch: maximum( results.inserterSearch ), + inserterHover: average( results.inserterHover ), + minInserterHover: minimum( results.inserterHover ), + maxInserterHover: maximum( results.inserterHover ), + listViewOpen: average( results.listViewOpen ), + minListViewOpen: minimum( results.listViewOpen ), + maxListViewOpen: maximum( results.listViewOpen ) + }; + + return ( + Object.entries( output ) + + // Reduce the output to contain taken metrics only. + .filter( ([ _, value ]) => 'number' === typeof value ) + .reduce( + ( acc, [ key, value ]) => ({ + ...acc, + [ key ]: round( value ) + }), + {} + ) + ); +} +class PerformanceReporter implements Reporter { + private results: Record< string, WPPerformanceResults >; + + constructor() { + this.results = {}; + } + + onTestEnd( test: TestCase, result: TestResult ): void { + for ( const attachment of result.attachments ) { + if ( 'results' !== attachment.name ) { + continue; + } + + if ( ! attachment.body ) { + throw new Error( 'Empty results attachment' ); + } + + const testSuite = path.basename( test.location.file, '.spec.js' ); + const resultsId = process.env.RESULTS_ID || testSuite; + const resultsPath = process.env.WP_ARTIFACTS_PATH as string; + const resultsBody = attachment.body.toString(); + + // Save raw results to file. + writeFileSync( + path.join( + resultsPath, + `${ resultsId }.performance-results.raw.json` + ), + resultsBody + ); + + const curatedResults = curateResults( JSON.parse( resultsBody ) ); + + // Save curated results to file. + writeFileSync( + path.join( + resultsPath, + `${ resultsId }.performance-results.json` + ), + JSON.stringify( curatedResults, null, 2 ) + ); + + this.results[ testSuite ] = curatedResults; + } + } + + onEnd( result: FullResult ) { + if ( 'passed' !== result.status ) { + return; + } + + if ( process.env.CI ) { + return; + } + + // Print the results. + for ( const [ testSuite, results ] of Object.entries( this.results ) ) { + const printableResults: Record< string, { value: string } > = {}; + + for ( const [ key, value ] of Object.entries( results ) ) { + printableResults[ key ] = { value: `${ value } ms` }; + } + + // eslint-disable-next-line no-console + console.log( `\n${ testSuite }\n` ); + // eslint-disable-next-line no-console + console.table( printableResults ); + } + } +} + +export default PerformanceReporter; diff --git a/src/blocks/test/performance/fixtures/index.js b/src/blocks/test/performance/fixtures/index.js new file mode 100644 index 000000000..0f68fc563 --- /dev/null +++ b/src/blocks/test/performance/fixtures/index.js @@ -0,0 +1 @@ +export { PerfUtils } from './perf-utils'; diff --git a/src/blocks/test/performance/fixtures/perf-utils.ts b/src/blocks/test/performance/fixtures/perf-utils.ts new file mode 100644 index 000000000..393b4941c --- /dev/null +++ b/src/blocks/test/performance/fixtures/perf-utils.ts @@ -0,0 +1,180 @@ +/** + * WordPress dependencies + */ +import { expect } from '@wordpress/e2e-test-utils-playwright'; + +/** + * External dependencies + */ +import fs from 'fs'; +import path from 'path'; +import type { Locator, Page } from '@playwright/test'; + +/** + * Internal dependencies + */ +import { readFile } from '../utils.js'; + +type PerfUtilsConstructorProps = { + page: Page; +}; + +export class PerfUtils { + page: Page; + + constructor({ page }: PerfUtilsConstructorProps ) { + this.page = page; + } + + /** + * Returns the locator for the editor canvas element. This supports both the + * legacy and the iframed canvas. + * + * @return Locator for the editor canvas element. + */ + async getCanvas() { + return await Promise.any([ + ( async() => { + const legacyCanvasLocator = this.page.locator( + '.wp-block-post-content' + ); + await legacyCanvasLocator.waitFor({ + timeout: 120_000 + }); + return legacyCanvasLocator; + })(), + ( async() => { + const iframedCanvasLocator = this.page.frameLocator( + '[name=editor-canvas]' + ); + await iframedCanvasLocator + .locator( 'body' ) + .waitFor({ timeout: 120_000 }); + return iframedCanvasLocator; + })() + ]); + } + + /** + * Saves the post as a draft and returns its URL. + * + * @return URL of the saved draft. + */ + async saveDraft() { + await this.page + .getByRole( 'button', { name: 'Save draft' }) + .click({ timeout: 60_000 }); + await expect( + this.page.getByRole( 'button', { name: 'Saved' }) + ).toBeDisabled(); + + return this.page.url(); + } + + /** + * Disables the editor autosave function. + */ + async disableAutosave() { + await this.page.evaluate( () => { + return window.wp.data + .dispatch( 'core/editor' ) + .updateEditorSettings({ + autosaveInterval: 100000000000, + localAutosaveInterval: 100000000000 + }); + }); + + const { autosaveInterval } = await this.page.evaluate( () => { + return window.wp.data.select( 'core/editor' ).getEditorSettings(); + }); + + expect( autosaveInterval ).toBe( 100000000000 ); + } + + /** + * Enters the Site Editor's edit mode. + * + * @return Locator for the editor canvas element. + */ + async enterSiteEditorEditMode() { + const canvas = await this.getCanvas(); + + await canvas.locator( 'body' ).click(); + await canvas + .getByRole( 'document', { name: /Block:( Post)? Content/ }) + .click(); + + return canvas; + } + + /** + * Loads blocks from the small post with containers fixture into the editor + * canvas. + */ + async loadBlocksForSmallPostWithContainers() { + return await this.loadBlocksFromHtml( + path.join( + process.env.ASSETS_PATH!, + 'small-post-with-containers.html' + ) + ); + } + + /** + * Loads blocks from the large post fixture into the editor canvas. + */ + async loadBlocksForLargePost() { + return await this.loadBlocksFromHtml( + path.join( process.env.ASSETS_PATH!, 'large-post.html' ) + ); + } + + /** + * Loads blocks from an HTML fixture with given path into the editor canvas. + * + * @param filepath Path to the HTML fixture. + */ + async loadBlocksFromHtml( filepath: string ) { + if ( ! fs.existsSync( filepath ) ) { + throw new Error( `File not found: ${ filepath }` ); + } + + return await this.page.evaluate( ( html: string ) => { + const { parse } = window.wp.blocks; + const { dispatch } = window.wp.data; + const blocks = parse( html ); + + blocks.forEach( ( block: any ) => { + if ( 'core/image' === block.name ) { + delete block.attributes.id; + delete block.attributes.url; + } + }); + + dispatch( 'core/block-editor' ).resetBlocks( blocks ); + }, readFile( filepath ) ); + } + + /** + * Generates and loads a 1000 empty paragraphs into the editor canvas. + */ + async load1000Paragraphs() { + await this.page.evaluate( () => { + const { createBlock } = window.wp.blocks; + const { dispatch } = window.wp.data; + const blocks = Array.from({ length: 1000 }).map( () => + createBlock( 'core/paragraph' ) + ); + dispatch( 'core/block-editor' ).resetBlocks( blocks ); + }); + } + + async expectExpandedState( locator: Locator, state: 'true' | 'false' ) { + return await Promise.any([ + expect( locator ).toHaveAttribute( 'aria-expanded', state ), + + // Legacy selector. + expect( locator ).toHaveAttribute( 'aria-pressed', state ) + ]); + } +} diff --git a/src/blocks/test/performance/playwright.config.ts b/src/blocks/test/performance/playwright.config.ts new file mode 100644 index 000000000..afb308af2 --- /dev/null +++ b/src/blocks/test/performance/playwright.config.ts @@ -0,0 +1,68 @@ +/** + * External dependencies + */ +const path = require( 'path' ); +const { fileURLToPath } = require( 'url' ); +const { defineConfig, devices } = require( '@playwright/test' ); + +process.env.WP_ARTIFACTS_PATH ??= path.join( process.cwd(), 'artifacts' ); +process.env.STORAGE_STATE_PATH ??= path.join( + process.env.WP_ARTIFACTS_PATH, + 'storage-states/admin.json' +); + +process.env.ASSETS_PATH = path.join( __dirname, 'assets' ); + +const config = defineConfig({ + + // fullyParallel: false, + workers: 1, + testDir: fileURLToPath( new URL( './specs', 'file:' + __filename ).href ), + outputDir: path.join( process.env.WP_ARTIFACTS_PATH, 'test-results' ), + snapshotPathTemplate: + '{testDir}/{testFileDir}/__snapshots__/{arg}-{projectName}{ext}', + use: { + baseURL: process.env.WP_BASE_URL || 'http://localhost:8889', + headless: true, + viewport: { + width: 960, + height: 700 + }, + ignoreHTTPSErrors: true, + locale: 'en-US', + contextOptions: { + reducedMotion: 'reduce', + strictSelectors: true + }, + storageState: process.env.STORAGE_STATE_PATH, + actionTimeout: 10_000, // 10 seconds. + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + video: 'on-first-retry' + }, + webServer: { + command: 'npm run wp-env start', + port: 8889, + timeout: 120_000, // 120 seconds. + reuseExistingServer: true + }, + projects: [ + { + name: 'chromium', + use: { ...devices[ 'Desktop Chrome' ], video: 'off' } + } + ], + reporter: process.env.CI ? + './config/performance-reporter.ts' : + [[ 'list' ], [ './config/performance-reporter.ts' ]], + forbidOnly: !! process.env.CI, + fullyParallel: false, + retries: 0, + timeout: parseInt( process.env.TIMEOUT || '', 10 ) || 600_000, // Defaults to 10 minutes. + reportSlowTests: null, + globalSetup: fileURLToPath( + new URL( './config/global-setup.ts', 'file:' + __filename ).href + ) +}); + +export default config; diff --git a/src/blocks/test/performance/specs/post-editor.spec.js b/src/blocks/test/performance/specs/post-editor.spec.js new file mode 100644 index 000000000..b77f0c5d9 --- /dev/null +++ b/src/blocks/test/performance/specs/post-editor.spec.js @@ -0,0 +1,487 @@ +/** + * WordPress dependencies + */ +import { test, Metrics } from '@wordpress/e2e-test-utils-playwright'; + +/** + * Internal dependencies + */ +import { PerfUtils } from '../fixtures'; +import { sum } from '../utils.js'; + +// See https://github.com/WordPress/gutenberg/issues/51383#issuecomment-1613460429 +const BROWSER_IDLE_WAIT = 1000; + +const results = { + serverResponse: [], + firstPaint: [], + domContentLoaded: [], + loaded: [], + firstContentfulPaint: [], + firstBlock: [], + type: [], + typeContainer: [], + focus: [], + listViewOpen: [], + inserterOpen: [], + inserterHover: [], + inserterSearch: [] +}; + +test.describe( 'Post Editor Performance', () => { + test.use({ + perfUtils: async({ page }, use ) => { + await use( new PerfUtils({ page }) ); + }, + metrics: async({ page }, use ) => { + await use( new Metrics({ page }) ); + } + }); + + test.afterAll( async({}, testInfo ) => { + await testInfo.attach( 'results', { + body: JSON.stringify( results, null, 2 ), + contentType: 'application/json' + }); + }); + + test.describe( 'Loading', () => { + let draftURL = null; + + test( 'Setup the test post', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.loadBlocksForLargePost(); + draftURL = await perfUtils.saveDraft(); + }); + + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + for ( let i = 1; i <= iterations; i++ ) { + test( `Run the test (${ i } of ${ iterations })`, async({ + page, + perfUtils, + metrics + }) => { + + // Open the test draft. + await page.goto( draftURL ); + const canvas = await perfUtils.getCanvas(); + + // Wait for the first block. + await canvas.locator( '.wp-block' ).first().waitFor({ + timeout: 120_000 + }); + + // Get the durations. + const loadingDurations = await metrics.getLoadingDurations(); + + // Save the results. + if ( i > throwaway ) { + Object.entries( loadingDurations ).forEach( + ([ metric, duration ]) => { + if ( 'timeSinceResponseEnd' === metric ) { + results.firstBlock.push( duration ); + } else { + results[ metric ].push( duration ); + } + } + ); + } + }); + } + }); + + test.describe( 'Typing', () => { + let draftURL = null; + + test( 'Setup the test post', async({ admin, perfUtils, editor }) => { + await admin.createNewPost(); + await perfUtils.loadBlocksForLargePost(); + await editor.insertBlock({ name: 'core/paragraph' }); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + const canvas = await perfUtils.getCanvas(); + + const paragraph = canvas.getByRole( 'document', { + name: /Empty block/i + }).nth( 1 ); + + // The first character typed triggers a longer time (isTyping change). + // It can impact the stability of the metric, so we exclude it. It + // probably deserves a dedicated metric itself, though. + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + + // Start tracing. + await metrics.startTracing(); + + // Type the testing sequence into the empty paragraph. + await paragraph.type( 'x'.repeat( iterations ), { + delay: BROWSER_IDLE_WAIT, + + // The extended timeout is needed because the typing is very slow + // and the `delay` value itself does not extend it. + timeout: iterations * BROWSER_IDLE_WAIT * 2 // 2x the total time to be safe. + }); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const [ keyDownEvents, keyPressEvents, keyUpEvents ] = + metrics.getTypingEventDurations(); + + // Save the results. + for ( let i = throwaway; i < iterations; i++ ) { + results.type.push( + keyDownEvents[ i ] + keyPressEvents[ i ] + keyUpEvents[ i ] + ); + } + }); + }); + + test.describe( 'Typing within containers', () => { + let draftURL = null; + + test( 'Set up the test post', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.loadBlocksForSmallPostWithContainers(); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + const canvas = await perfUtils.getCanvas(); + + // Select the block where we type in. + const firstParagraph = canvas + .getByRole( 'document', { + name: /Paragraph block|Block: Paragraph/ + }) + .first(); + await firstParagraph.click(); + + // The first character typed triggers a longer time (isTyping change). + // It can impact the stability of the metric, so we exclude it. It + // probably deserves a dedicated metric itself, though. + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + + // Start tracing. + await metrics.startTracing(); + + // Start typing in the middle of the text. + await firstParagraph.type( 'x'.repeat( iterations ), { + delay: BROWSER_IDLE_WAIT, + + // The extended timeout is needed because the typing is very slow + // and the `delay` value itself does not extend it. + timeout: iterations * BROWSER_IDLE_WAIT * 2 // 2x the total time to be safe. + }); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const [ keyDownEvents, keyPressEvents, keyUpEvents ] = + metrics.getTypingEventDurations(); + + // Save the results. + for ( let i = throwaway; i < iterations; i++ ) { + results.typeContainer.push( + keyDownEvents[ i ] + keyPressEvents[ i ] + keyUpEvents[ i ] + ); + } + }); + }); + + test.describe( 'Selecting blocks', () => { + let draftURL = null; + + test( 'Set up the test post', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.load1000Paragraphs(); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + const canvas = await perfUtils.getCanvas(); + + const paragraphs = canvas.getByRole( 'document', { + name: /Empty block/i + }); + + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + for ( let i = 1; i <= iterations; i++ ) { + + // Wait for the browser to be idle before starting the monitoring. + // eslint-disable-next-line no-restricted-syntax + await page.waitForTimeout( BROWSER_IDLE_WAIT ); + + // Start tracing. + await metrics.startTracing(); + + // Click the next paragraph. + await paragraphs.nth( i ).click(); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const allDurations = metrics.getSelectionEventDurations(); + + // Save the results. + if ( i > throwaway ) { + results.focus.push( + allDurations.reduce( ( acc, eventDurations ) => { + return acc + sum( eventDurations ); + }, 0 ) + ); + } + } + }); + }); + + test.describe( 'Opening persistent List View', () => { + let draftURL = null; + + test( 'Set up the test page', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.load1000Paragraphs(); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + + const listViewToggle = page.getByRole( 'button', { + name: 'Document Overview' + }); + + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + for ( let i = 1; i <= iterations; i++ ) { + + // Wait for the browser to be idle before starting the monitoring. + // eslint-disable-next-line no-restricted-syntax + await page.waitForTimeout( BROWSER_IDLE_WAIT ); + + // Start tracing. + await metrics.startTracing(); + + // Open List View. + await listViewToggle.click(); + await perfUtils.expectExpandedState( listViewToggle, 'true' ); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const [ mouseClickEvents ] = metrics.getClickEventDurations(); + + // Save the results. + if ( i > throwaway ) { + results.listViewOpen.push( mouseClickEvents[ 0 ]); + } + + // Close List View + await listViewToggle.click(); + await perfUtils.expectExpandedState( listViewToggle, 'false' ); + } + }); + }); + + test.describe( 'Opening Inserter', () => { + let draftURL = null; + + test( 'Set up the test page', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.load1000Paragraphs(); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + + // Go to the test page. + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + const globalInserterToggle = page.getByRole( 'button', { + name: 'Toggle block inserter' + }); + + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + for ( let i = 1; i <= iterations; i++ ) { + + // Wait for the browser to be idle before starting the monitoring. + // eslint-disable-next-line no-restricted-syntax + await page.waitForTimeout( BROWSER_IDLE_WAIT ); + + // Start tracing. + await metrics.startTracing(); + + // Open Inserter. + await globalInserterToggle.click(); + await perfUtils.expectExpandedState( + globalInserterToggle, + 'true' + ); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const [ mouseClickEvents ] = metrics.getClickEventDurations(); + + // Save the results. + if ( i > throwaway ) { + results.inserterOpen.push( mouseClickEvents[ 0 ]); + } + + // Close Inserter. + await globalInserterToggle.click(); + await perfUtils.expectExpandedState( + globalInserterToggle, + 'false' + ); + } + }); + }); + + test.describe( 'Searching Inserter', () => { + let draftURL = null; + + test( 'Set up the test page', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.load1000Paragraphs(); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + + // Go to the test page. + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + const globalInserterToggle = page.getByRole( 'button', { + name: 'Toggle block inserter' + }); + + // Open Inserter. + await globalInserterToggle.click(); + await perfUtils.expectExpandedState( globalInserterToggle, 'true' ); + + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + for ( let i = 1; i <= iterations; i++ ) { + + // Wait for the browser to be idle before starting the monitoring. + // eslint-disable-next-line no-restricted-syntax + await page.waitForTimeout( BROWSER_IDLE_WAIT ); + + // Start tracing. + await metrics.startTracing(); + + // Type to trigger search. + await page.keyboard.type( 'p' ); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const [ keyDownEvents, keyPressEvents, keyUpEvents ] = + metrics.getTypingEventDurations(); + + // Save the results. + if ( i > throwaway ) { + results.inserterSearch.push( + keyDownEvents[ 0 ] + + keyPressEvents[ 0 ] + + keyUpEvents[ 0 ] + ); + } + + await page.keyboard.press( 'Backspace' ); + } + }); + }); + + test.describe( 'Hovering Inserter items', () => { + let draftURL = null; + + test( 'Set up the test page', async({ admin, perfUtils }) => { + await admin.createNewPost(); + await perfUtils.load1000Paragraphs(); + draftURL = await perfUtils.saveDraft(); + }); + + test( 'Run the test', async({ page, perfUtils, metrics }) => { + + // Go to the test page. + await page.goto( draftURL ); + await perfUtils.disableAutosave(); + + const globalInserterToggle = page.getByRole( 'button', { + name: 'Toggle block inserter' + }); + const paragraphBlockItem = page.locator( + '.block-editor-inserter__menu .editor-block-list-item-paragraph' + ); + const headingBlockItem = page.locator( + '.block-editor-inserter__menu .editor-block-list-item-heading' + ); + + // Open Inserter. + await globalInserterToggle.click(); + await perfUtils.expectExpandedState( globalInserterToggle, 'true' ); + + const samples = 10; + const throwaway = 1; + const iterations = samples + throwaway; + for ( let i = 1; i <= iterations; i++ ) { + + // Wait for the browser to be idle before starting the monitoring. + // eslint-disable-next-line no-restricted-syntax + await page.waitForTimeout( BROWSER_IDLE_WAIT ); + + // Start tracing. + await metrics.startTracing(); + + // Hover Inserter items. + await paragraphBlockItem.hover(); + await headingBlockItem.hover(); + + // Stop tracing. + await metrics.stopTracing(); + + // Get the durations. + const [ mouseOverEvents, mouseOutEvents ] = + metrics.getHoverEventDurations(); + + // Save the results. + if ( i > throwaway ) { + for ( let k = 0; k < mouseOverEvents.length; k++ ) { + results.inserterHover.push( + mouseOverEvents[ k ] + mouseOutEvents[ k ] + ); + } + } + } + }); + }); +}); diff --git a/src/blocks/test/performance/tsconfig.json b/src/blocks/test/performance/tsconfig.json new file mode 100644 index 000000000..12013e4cc --- /dev/null +++ b/src/blocks/test/performance/tsconfig.json @@ -0,0 +1,21 @@ +{ + "extends": "../../../../tsconfig.json", + "compilerOptions": { + "noEmit": true, + "emitDeclarationOnly": false, + "allowJs": true, + "checkJs": false, + "target": "esnext", + "module": "esnext", + "lib": [ "dom", "esnext" ], + "declaration": true, + "declarationMap": true, + "composite": true, + "isolatedModules": true, + "esModuleInterop": false, + "resolveJsonModule": true, + "allowSyntheticDefaultImports": true + }, + "include": [ "**/*" ], + "exclude": [] +} diff --git a/src/blocks/test/performance/utils.js b/src/blocks/test/performance/utils.js new file mode 100644 index 000000000..e052e47c2 --- /dev/null +++ b/src/blocks/test/performance/utils.js @@ -0,0 +1,70 @@ +/** + * External dependencies + */ +import { existsSync, readFileSync, unlinkSync } from 'fs'; + +export function sum( array ) { + if ( ! array || ! array.length ) { + return undefined; + } + + return array.reduce( ( a, b ) => a + b, 0 ); +} + +export function average( array ) { + if ( ! array || ! array.length ) { + return undefined; + } + + return sum( array ) / array.length; +} + +export function median( array ) { + if ( ! array || ! array.length ) { + return undefined; + } + + const numbers = [ ...array ].sort( ( a, b ) => a - b ); + const middleIndex = Math.floor( numbers.length / 2 ); + + if ( 0 === numbers.length % 2 ) { + return ( numbers[ middleIndex - 1 ] + numbers[ middleIndex ]) / 2; + } + return numbers[ middleIndex ]; +} + +export function minimum( array ) { + if ( ! array || ! array.length ) { + return undefined; + } + + return Math.min( ...array ); +} + +export function maximum( array ) { + if ( ! array || ! array.length ) { + return undefined; + } + + return Math.max( ...array ); +} + +export function round( number, decimalPlaces = 2 ) { + const factor = Math.pow( 10, decimalPlaces ); + + return Math.round( number * factor ) / factor; +} + +export function readFile( filePath ) { + if ( ! existsSync( filePath ) ) { + throw new Error( `File does not exist: ${ filePath }` ); + } + + return readFileSync( filePath, 'utf8' ).trim(); +} + +export function deleteFile( filePath ) { + if ( existsSync( filePath ) ) { + unlinkSync( filePath ); + } +} diff --git a/src/css/editor.js b/src/css/editor.js index cb34dea8b..105377434 100644 --- a/src/css/editor.js +++ b/src/css/editor.js @@ -95,6 +95,7 @@ const CSSEditor = ({ }); const onChange = () => { + window?.oTrk?.add({ feature: 'custom-css', featureComponent: 'used' }); clearTimeout( inputTimeout ); inputTimeout = setTimeout( () => { checkInput( editorRef.current ); diff --git a/src/dashboard/components/Header.js b/src/dashboard/components/Header.js index c47b2c5e9..71a47880b 100644 --- a/src/dashboard/components/Header.js +++ b/src/dashboard/components/Header.js @@ -17,6 +17,11 @@ const NAVIGATION_ITEMS = [ label: __( 'Dashboard', 'otter-blocks' ), visibility: true }, + { + slug: 'blocks', + label: __( 'Blocks', 'otter-blocks' ), + visibility: true + }, { slug: 'integrations', label: __( 'Integrations', 'otter-blocks' ), @@ -59,7 +64,7 @@ const Headers = ({ { NAVIGATION_ITEMS.map( item => item.visibility && ( + +
+ ) + } +
; +}; + +/** + * Dashboard Blocks component page. + */ +const Blocks = () => { + + const [ blocksStatus, setBlocksStatus ] = useState( otterBlocks ); + const [ canShowNotice, canShowNoticeSet ] = useState( false ); + + const { preferencesHiddenBlocks, isLoading } = useSelect( ( select ) => { + + /** + * Array of hidden block types. + * @type {Array|undefined} + */ + const hiddenBlocks = select( 'core/preferences' )?.get( 'core/edit-post', 'hiddenBlockTypes' ); + + const isResolving = select( 'core/preferences' ).isResolving( 'get', [ 'hiddenBlockTypes' ]); + + return { + preferencesHiddenBlocks: hiddenBlocks ? new Set( hiddenBlocks ) : undefined, + isLoading: isResolving + }; + }, [ blocksStatus ]); + + + /** + * Update the WP Option with the new value. + * @param {import('../../dashboard').BlocksToDisableList} blocks Blocks to be updated. + */ + const sendUpdates = ( blocks ) => { + + const newPreferencesHiddenBlocks = new Set(); + + // Copy the old preferences. + if ( preferencesHiddenBlocks ) { + preferencesHiddenBlocks.forEach( block => { + newPreferencesHiddenBlocks.add( block ); + }); + } + + // Add the new preferences. + blocks.forEach( block => { + if ( block.isDisabled ) { + newPreferencesHiddenBlocks.add( block.slug ); + } else { + newPreferencesHiddenBlocks.delete( block.slug ); + } + }); + + dispatch( 'core/preferences' ).set( 'core/edit-post', 'hiddenBlockTypes', [ ...newPreferencesHiddenBlocks ]); + }; + + /** + * Toggle the block status. + * @param {string} blockSlug Block slug. + */ + const toggleBlock = ( blockSlug ) => { + const updatedBlocksStatus = blocksStatus.map( block => { + if ( block.slug === blockSlug ) { + block.isDisabled = ! block.isDisabled; + } + + return block; + }); + + sendUpdates( updatedBlocksStatus ); + setBlocksStatus( updatedBlocksStatus ); + canShowNoticeSet( true ); + }; + + /** + * Disable all blocks and update the WP Option. + */ + const onDisableAll = () => { + const updatedBlocksStatus = blocksStatus.map( block => { + + if ( block.isPro && ! otterObj.hasPro ) { + return block; + } + + block.isDisabled = true; + + return block; + }); + + sendUpdates( updatedBlocksStatus ); + setBlocksStatus( updatedBlocksStatus ); + canShowNoticeSet( true ); + }; + + /** + * Enable all blocks and update the WP Option. + */ + const onEnableAll = () => { + const updatedBlocksStatus = blocksStatus.map( block => { + block.isDisabled = false; + + return block; + }); + + sendUpdates( updatedBlocksStatus ); + setBlocksStatus( updatedBlocksStatus ); + canShowNoticeSet( true ); + }; + + + /** + * Initiate the blocks' status. + */ + useEffect( () => { + if ( isLoading ) { + return; + } + + const updatedBlocksStatus = blocksStatus.map( block => { + if ( preferencesHiddenBlocks?.has( block.slug ) ) { + block.isDisabled = true; + } else { + block.isDisabled = false; + } + + return block; + }); + + setBlocksStatus( updatedBlocksStatus ); + }, [ isLoading ]); + + useEffect( () => { + if ( ! canShowNotice || isLoading ) { + return; + } + + dispatch?.( 'core/notices' )?.createNotice( 'info', __( 'Option Updated.', 'otter-blocks' ), { isDismissible: true, type: 'snackbar', id: 'saved-options' }); + canShowNoticeSet( false ); + }, [ canShowNotice, preferencesHiddenBlocks, isLoading ]); + + return ( + +
+
+ { + blocksStatus.map( block => { + return ( + toggleBlock( block.slug )} /> + ); + }) + } +
+ + ); +}; + +export default Blocks; diff --git a/src/dashboard/components/pages/Dashboard.js b/src/dashboard/components/pages/Dashboard.js index 1ea27e860..ceccec647 100644 --- a/src/dashboard/components/pages/Dashboard.js +++ b/src/dashboard/components/pages/Dashboard.js @@ -160,6 +160,7 @@ const Dashboard = () => { } ); + window.tiTrk?.with( 'otter' ).add({ feature: 'dashboard', featureComponent: 'regenerate-style' }); setRegeneratedDisabled( true ); setOpen( false ); }; diff --git a/src/dashboard/components/pages/Integrations.js b/src/dashboard/components/pages/Integrations.js index adab52fbe..976516746 100644 --- a/src/dashboard/components/pages/Integrations.js +++ b/src/dashboard/components/pages/Integrations.js @@ -194,7 +194,10 @@ const Integrations = () => { variant="secondary" isSecondary disabled={ 'saving' === status } - onClick={ () => updateOption( 'themeisle_stripe_api_key', stripeAPI ) } + onClick={ () => { + window.tiTrk?.with( 'otter' ).add({ feature: 'dashboard-integration', featureComponent: 'stripe' }); + updateOption( 'themeisle_stripe_api_key', stripeAPI ); + } } > { __( 'Save', 'otter-blocks' ) } @@ -239,7 +242,10 @@ const Integrations = () => { variant="secondary" isSecondary disabled={ 'saving' === status } - onClick={ () => updateOption( 'themeisle_open_ai_api_key', openAISecretKey ) } + onClick={ () => { + window.tiTrk?.with( 'otter' ).add({ feature: 'dashboard-integration', featureComponent: 'open-ai' }); + updateOption( 'themeisle_open_ai_api_key', openAISecretKey ); + } } > { __( 'Save', 'otter-blocks' ) } diff --git a/src/dashboard/dashboard.d.ts b/src/dashboard/dashboard.d.ts new file mode 100644 index 000000000..6a2194414 --- /dev/null +++ b/src/dashboard/dashboard.d.ts @@ -0,0 +1,22 @@ +type BlockToDisableData = { + slug: string, + name: string, + icon: string | ( () => JSX.Element ), + docLink?: string, + isPro?: boolean, + isDisabled?: boolean, +} + +export type BlocksToDisableList = BlockToDisableData[] + +export type BlockCardHeaderProps = { + blocks: BlocksToDisableList, + onDisableAll: () => void, + onEnableAll: () => void, +} + +export type BlockCardProps = { + block: BlockToDisableData, + isLoading: boolean, + onToggle: () => void, +} diff --git a/src/dashboard/index.js b/src/dashboard/index.js index 0679d055c..0f20192ab 100644 --- a/src/dashboard/index.js +++ b/src/dashboard/index.js @@ -24,8 +24,14 @@ if ( undefined === window.otterUtils ) { window.otterUtils.useSettings = useSettings; +function getInitialStateFromURLQuery() { + const hash = window.location.hash.slice( 1 ); // Remove the '#' at the start + return hash; +} + + const App = () => { - const [ currentTab, setTab ] = useState( 'dashboard' ); + const [ currentTab, setTab ] = useState( getInitialStateFromURLQuery() ); return ( diff --git a/src/dashboard/style.scss b/src/dashboard/style.scss index f28e8b52c..f94c21414 100644 --- a/src/dashboard/style.scss +++ b/src/dashboard/style.scss @@ -4,6 +4,14 @@ box-sizing: inherit; } +:root { + --o-dash-primary: #ED6F57; + --o-dash-block-icon: #313233; + --o-dash-block-text: #3c434a; + --o-dash-disable-opacity: 0.35; + --o-dash-secondary-text: #757575; +} + #wpbody-content > .error, #wpbody-content > .info, #wpbody-content > .notice { display: none !important; } @@ -31,7 +39,7 @@ .components-button { &.is-primary { - --wp-admin-theme-color: #ed6f57; + --wp-admin-theme-color: var(--o-dash-primary); --wp-admin-theme-color-darker-20: #d5654f; --wp-admin-theme-color-darker-10: #dd6851; } @@ -144,17 +152,23 @@ } .otter-main { - display: grid; - grid-template-columns: 2fr 1fr; - gap: 25px; margin-left: auto; margin-right: auto; max-width: 930px; - &.is-upsell { + display: grid; + grid-template-columns: 2fr 1fr; + gap: 25px; + + + &:is(.is-upsell, .is-blocks) { grid-template-columns: auto; } + &.is-blocks { + gap: 10px; + } + &.is-feedback .components-panel__body { height: max-content; } @@ -431,12 +445,12 @@ display: flex; align-items: center; justify-content: center; - color: #757575; + color: var(--o-dash-secondary-text); } .content { padding: 20px 40px; - color: #757575; + color: var(--o-dash-secondary-text); p { margin: 10px 0; @@ -448,7 +462,7 @@ align-items: center; h4 { - color: #313233; + color: var(--o-dash-block-text); margin: 10px 0; font-size: 20px; line-height: 1.2; @@ -581,6 +595,190 @@ padding-right: 16px; } +.o-blocks-header { + display: flex; + flex-direction: row; + margin: 20px 20px 0 20px; + + .o-blocks-header__left { + display: flex; + flex-direction: row; + + align-items: center; + flex-grow: 1; + + font-size: 21px; + font-style: normal; + font-weight: 600; + + h3 { + margin: 0; + } + } + + .o-blocks-header__right { + display: flex; + flex-direction: row; + + align-items: center; + + height: max-content; + + padding: 0; + + gap: 5px; + + button { + &.is-active { + color: white; + border-radius: 6px; + background: var(--o-dash-primary); + } + + &:disabled { + opacity: var(--o-dash-disable-opacity); + } + } + } +} + +.o-block-cards { + display: grid; + flex-wrap: wrap; + gap: 20px; + margin: 10px 20px; + + grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); + + @media ( min-width: 1024px ) { + grid-template-columns: repeat(3, minmax(250px, 1fr)); + } + + justify-content: center; +} + +.o-block-card { + display: flex; + padding: 16px; + flex-direction: row; + + flex-shrink: 0; + gap: 10px; + + border-radius: 10px; + border: 0.999px solid #E2E4E7; + background: #FFF; + + align-items: center; + justify-content: center; + + .o-block-card__icon { + display: flex; + min-width: 42px; + height: 42px; + justify-content: center; + align-items: center; + svg, span { + width: 100%; + height: 100%; + + color: var(--o-dash-block-text); + flex-shrink: 0; + } + + svg { + * { + fill: var(--o-dash-block-icon); // For icons that use fill for the shape. + } + + &[data-target*="generator"] * { + stroke: var(--o-dash-block-icon); // For icons that use stroke for the shape. + } + } + + &.is-disabled { + opacity: var(--o-dash-disable-opacity); + } + + span { + font-size: 42px; + } + + } + + .o-block-card__description { + flex-grow: 1; + + display: flex; + gap: 5px; + + flex-wrap: wrap; + + * { + margin: 0; + padding: 0; + } + + h3 { + font-family: sans-serif; + font-size: 15px; + font-style: normal; + font-weight: 600; + line-height: normal; + + color: var(--o-dash-block-text); + + flex-grow: 1; + width: 100%; + } + + a { + color: var(--o-dash-secondary-text); + text-decoration: none; + + font-family: sans-serif; + font-size: 13px; + font-style: normal; + font-weight: 400; + line-height: 140%; /* 18.2px */ + } + } + + .o-block-card__action { + display: flex; + align-items: center; + justify-content: center; + min-width: 50px; + + .components-h-stack { + gap: 0; + } + + .components-toggle-control { + margin: 0; + } + } + + .o-block-upsell { + display: inline-flex; + padding: 2px 8px; + align-items: center; + + border-radius: 3px; + background: var(--o-dash-primary); + + text-transform: uppercase; + + color: #FFF; + font-family: sans-serif; + font-size: 10px; + font-style: normal; + font-weight: 700; + line-height: 160%; /* 16px */ + letter-spacing: 0.4px; + } +} + .otter-deal { display: flex; align-items: center; diff --git a/src/pro/blocks/add-to-cart-button/edit.js b/src/pro/blocks/add-to-cart-button/edit.js index 450671918..01adc2d59 100644 --- a/src/pro/blocks/add-to-cart-button/edit.js +++ b/src/pro/blocks/add-to-cart-button/edit.js @@ -49,7 +49,11 @@ const Edit = ({ label={ __( 'Select Product', 'otter-blocks' ) } hideLabelFromVision value={ attributes.product || '' } - onChange={ product => setAttributes({ product: Number( product ) }) } + onChange={ product => { + window.oTrk?.add({ feature: 'add-to-cart', featureComponent: 'product-changed' }); + + setAttributes({ product: Number( product ) }); + } } /> ) } diff --git a/src/pro/blocks/business-hours/edit.js b/src/pro/blocks/business-hours/edit.js index 2dae44c12..c9438161c 100644 --- a/src/pro/blocks/business-hours/edit.js +++ b/src/pro/blocks/business-hours/edit.js @@ -40,10 +40,16 @@ const Edit = ({ attributes, setAttributes, isSelected, - clientId + clientId, + name }) => { useEffect( () => { const unsubscribe = blockInit( clientId, defaultAttributes ); + + if ( undefined === attributes.id ) { + window.oTrk?.add({ block: name, action: 'block-created', groupID: attributes.id }); + } + return () => unsubscribe( attributes.id ); }, [ attributes.id ]); diff --git a/src/pro/blocks/file/edit.js b/src/pro/blocks/file/edit.js index 18ea485a1..49296defd 100644 --- a/src/pro/blocks/file/edit.js +++ b/src/pro/blocks/file/edit.js @@ -38,15 +38,18 @@ const { attributes: defaultAttributes } = metadata; const Edit = ({ attributes, setAttributes, - clientId + clientId, + name }) => { useEffect( () => { const unsubscribe = blockInit( clientId, defaultAttributes ); if ( attributes.id === undefined ) { + window.oTrk?.add({ block: name, action: 'block-created', groupID: attributes.id }); // Set the default value for newly created blocks. setAttributes({ saveFiles: 'media-library' }); } + return () => unsubscribe( attributes.id ); }, [ attributes.id ]); diff --git a/src/pro/blocks/form-hidden-field/block.json b/src/pro/blocks/form-hidden-field/block.json index 1eb92d631..de3999112 100644 --- a/src/pro/blocks/form-hidden-field/block.json +++ b/src/pro/blocks/form-hidden-field/block.json @@ -27,6 +27,9 @@ }, "inputWidth": { "type": "number" + }, + "defaultValue": { + "type": "string" } }, "supports": { diff --git a/src/pro/blocks/form-hidden-field/edit.js b/src/pro/blocks/form-hidden-field/edit.js index 18a347dd7..ba8117fc5 100644 --- a/src/pro/blocks/form-hidden-field/edit.js +++ b/src/pro/blocks/form-hidden-field/edit.js @@ -25,11 +25,17 @@ const { attributes: defaultAttributes } = metadata; const Edit = ({ attributes, setAttributes, - clientId + clientId, + name }) => { useEffect( () => { const unsubscribe = blockInit( clientId, defaultAttributes ); + + if ( undefined === attributes.id ) { + window.oTrk?.add({ block: name, action: 'block-created', groupID: attributes.id }); + } + return () => unsubscribe( attributes.id ); }, [ attributes.id ]); @@ -80,6 +86,7 @@ const Edit = ({ required={ attributes.isRequired } disabled className="otter-form-input components-text-control__input" + value={ attributes.defaultValue } /> { attributes.helpText && ( diff --git a/src/pro/blocks/form-hidden-field/inspector.js b/src/pro/blocks/form-hidden-field/inspector.js index 13ca41c2e..b68cd94c7 100644 --- a/src/pro/blocks/form-hidden-field/inspector.js +++ b/src/pro/blocks/form-hidden-field/inspector.js @@ -83,6 +83,14 @@ const Inspector = ({ disabled={! Boolean( window?.otterPro?.isActive )} /> + setAttributes({ defaultValue }) } + placeholder={ __( 'e.g. medium', 'otter-blocks' ) } + disabled={! Boolean( window?.otterPro?.isActive )} + /> + diff --git a/src/pro/blocks/form-stripe-field/edit.js b/src/pro/blocks/form-stripe-field/edit.js index 641eac919..5f32ecfe3 100644 --- a/src/pro/blocks/form-stripe-field/edit.js +++ b/src/pro/blocks/form-stripe-field/edit.js @@ -33,11 +33,17 @@ const { attributes: defaultAttributes } = metadata; const Edit = ({ attributes, setAttributes, - clientId + clientId, + name }) => { useEffect( () => { const unsubscribe = blockInit( clientId, defaultAttributes ); + + if ( undefined === attributes.id ) { + window.oTrk?.add({ block: name, action: 'block-created', groupID: attributes.id }); + } + return () => unsubscribe( attributes.id ); }, [ attributes.id ]); diff --git a/src/pro/blocks/form-stripe-field/inspector.js b/src/pro/blocks/form-stripe-field/inspector.js index 9cbdef5f2..790e890ee 100644 --- a/src/pro/blocks/form-stripe-field/inspector.js +++ b/src/pro/blocks/form-stripe-field/inspector.js @@ -124,6 +124,7 @@ const Inspector = ({ ...productsList ] } onChange={ product => { + window.oTrk?.add({ feature: 'stripe-field', featureComponent: 'product-changed' }); setAttributes({ product: 'none' !== product ? product : undefined, price: undefined @@ -144,6 +145,7 @@ const Inspector = ({ ...pricesList ] } onChange={ price => { + window.oTrk?.add({ feature: 'stripe-field', featureComponent: 'price-changed' }); setAttributes({ price: 'none' !== price ? price : undefined }); } } /> diff --git a/src/pro/blocks/review-comparison/edit.js b/src/pro/blocks/review-comparison/edit.js index 2a9aea307..938b1f750 100644 --- a/src/pro/blocks/review-comparison/edit.js +++ b/src/pro/blocks/review-comparison/edit.js @@ -57,10 +57,16 @@ let tableLinks = []; const Edit = ({ attributes, setAttributes, - clientId + clientId, + name }) => { useEffect( () => { const unsubscribe = blockInit( clientId, defaultAttributes ); + + if ( undefined === attributes.id ) { + window.oTrk?.add({ block: name, action: 'block-created', groupID: attributes.id }); + } + return () => unsubscribe( attributes.id ); }, [ attributes.id ]); diff --git a/src/pro/blocks/review-comparison/index.js b/src/pro/blocks/review-comparison/index.js index 200aa6500..9d830a8f0 100644 --- a/src/pro/blocks/review-comparison/index.js +++ b/src/pro/blocks/review-comparison/index.js @@ -14,7 +14,7 @@ import metadata from './block.json'; import edit from './edit.js'; import Inactive from '../../components/inactive/index.js'; -const { reviewIcon: icon } = window.otterUtils.icons; +const { comparisonTableIcon: icon } = window.otterUtils.icons; const { name } = metadata; diff --git a/src/pro/components/webhook-editor/index.tsx b/src/pro/components/webhook-editor/index.tsx index e9fff0794..87d910b8c 100644 --- a/src/pro/components/webhook-editor/index.tsx +++ b/src/pro/components/webhook-editor/index.tsx @@ -25,7 +25,6 @@ import { arrowRight, closeSmall } from '@wordpress/icons'; */ import useSettings from '../../../blocks/helpers/use-settings'; - type WebhookEditorProps = { webhookId: string, onChange: ( webhookId: string ) => void, @@ -104,6 +103,7 @@ const WebhookEditor = ( props: WebhookEditorProps ) => { // Save to wp options setOption?.( 'themeisle_webhooks_options', [ ...webhooksToSave ], __( 'Webhooks saved.', 'otter-blocks' ), 'webhook', ( response ) => { setWebhooks( response?.['themeisle_webhooks_options'] ?? []); + window.oTrk?.add({ feature: 'webhook', featureComponent: 'saving' }); }); }; @@ -205,6 +205,7 @@ const WebhookEditor = ( props: WebhookEditorProps ) => { diff --git a/src/pro/plugins/countdown/index.tsx b/src/pro/plugins/countdown/index.tsx index 2779f4802..5dd2b101d 100644 --- a/src/pro/plugins/countdown/index.tsx +++ b/src/pro/plugins/countdown/index.tsx @@ -91,6 +91,7 @@ const CountdownProFeaturesSettings = ( Template: React.FC<{}>, { attributes, set attrs.endInterval = undefined; } + window.oTrk?.set( `${attributes.id}_type`, { feature: 'countdown', featureComponent: 'countdown-type', featureValue: value, groupID: attributes.id }); setAttributes( attrs ); } @@ -243,6 +244,7 @@ const CountdownProFeaturesEnd = ( Template: React.FC<{}>, { label={ __( 'On Expire', 'otter-blocks' ) } value={ attributes.behaviour } onChange={ behaviour => { + window.oTrk?.set( `${attributes.id}_beh`, { feature: 'countdown', featureComponent: 'countdown-behaviour', featureValue: behaviour, groupID: attributes.id }); if ( 'redirectLink' === behaviour ) { setAttributes({ behaviour, redirectLink: undefined }); } else { @@ -283,6 +285,7 @@ const CountdownProFeaturesEnd = ( Template: React.FC<{}>, { help={ __( 'Enable Hide/Show other blocks when the Countdown ends.', 'otter-blocks' ) } checked={ attributes.onEndAction !== undefined } onChange={ value => { + window.oTrk?.set( `${attributes.id}_hide`, { feature: 'countdown', featureComponent: 'countdown-hide', featureValue: value ? 'all' : 'none', groupID: attributes.id }); if ( value ) { setAttributes({ onEndAction: 'all' }); } else { diff --git a/src/pro/plugins/form/index.js b/src/pro/plugins/form/index.js index 010df03f9..bfab69af7 100644 --- a/src/pro/plugins/form/index.js +++ b/src/pro/plugins/form/index.js @@ -20,11 +20,13 @@ import { FieldInputWidth, HideFieldLabelToggle, mappedNameInfo } from '../../../ import { setSavedState } from '../../../blocks/helpers/helper-functions'; import AutoresponderBodyModal from '../../components/autoresponder/index.js'; import WebhookEditor from '../../components/webhook-editor'; +import attributes from '../../../blocks/blocks/lottie/attributes'; // +-------------- Autoresponder --------------+ const AutoresponderBody = ({ formOptions, setFormOption }) => { const onChange = body => { + window.oTrk?.add({ feature: 'form-autoresponder', featureComponent: 'body' }); setFormOption({ autoresponder: { ...formOptions.autoresponder, body }}); }; @@ -44,9 +46,10 @@ const helpMessages = { * @param {import('../../../blocks/blocks/form/type').FormOptions} formOptions The form options. * @param { (options: import('../../../blocks/blocks/form/type').FormOptions) => void } setFormOption The function to set the form options. * @param {any} config The form config. + * @param {import('../../../blocks/blocks/form/type').FormAttrs} attributes The form attributes. * @returns {JSX.Element} */ -const FormOptions = ( Options, formOptions, setFormOption, config ) => { +const FormOptions = ( Options, formOptions, setFormOption, config, attributes ) => { return ( <> @@ -62,7 +65,10 @@ const FormOptions = ( Options, formOptions, setFormOption, config ) => { setFormOption({ submissionsSaveLocation }) } + onChange={ submissionsSaveLocation => { + window.oTrk?.set( `${attributes.id}_save`, { feature: 'form-storing', featureComponent: 'save-location', featureValue: submissionsSaveLocation, groupID: attributes.id }); + setFormOption({ submissionsSaveLocation }); + } } options={ [ { label: __( 'Database', 'otter-blocks' ), value: 'database' }, @@ -104,14 +110,15 @@ const FormOptions = ( Options, formOptions, setFormOption, config ) => { 'otter-blocks' )} value={formOptions.autoresponder?.subject} - onChange={( subject ) => + onChange={( subject ) => { + window.oTrk?.add({ feature: 'form-autoresponder', featureComponent: 'subject', groupID: attributes.id }); setFormOption({ autoresponder: { ...formOptions.autoresponder, subject } - }) - } + }); + }} help={__( 'Enter the subject of the autoresponder email.', 'otter-blocks' @@ -150,7 +157,7 @@ const FormOptions = ( Options, formOptions, setFormOption, config ) => { )} formOptions.webhookId } + hasValue={() => formOptions?.webhookId } label={__( 'Webhook', 'otter-blocks' )} onDeselect={() => setFormOption({ webhookId: undefined })} > @@ -159,6 +166,7 @@ const FormOptions = ( Options, formOptions, setFormOption, config ) => { { + window.oTrk?.add({ feature: 'form-webhook', featureComponent: 'webhook-set', groupID: attributes.id }); setFormOption({ webhookId: webhookId }); @@ -273,6 +281,7 @@ const FormFileInspector = ( Template, { type="number" value={ ! isNaN( parseInt( attributes.maxFileSize ) ) ? attributes.maxFileSize : undefined } onChange={ maxFileSize => { + window.oTrk?.set( `${attributes.id}_size`, { feature: 'form-file', featureComponent: 'file-size', featureValue: maxFileSize, groupID: attributes.id }); setSavedState( attributes.id, true ); setAttributes({ maxFileSize: maxFileSize ? maxFileSize?.toString() : undefined }); } } @@ -283,6 +292,7 @@ const FormFileInspector = ( Template, { label={ __( 'Allowed File Types', 'otter-blocks' ) } value={ attributes.allowedFileTypes } onChange={ allowedFileTypes => { + window.oTrk?.set( `${attributes.id}_type`, { feature: 'form-file', featureComponent: 'file-type', featureValue: allowedFileTypes, groupID: attributes.id }); setSavedState( attributes.id, true ); setAttributes({ allowedFileTypes: allowedFileTypes ? allowedFileTypes.map( replaceJPGWithJPEG ) : undefined }); } } @@ -315,6 +325,7 @@ const FormFileInspector = ( Template, { label={ __( 'Allow multiple file uploads', 'otter-blocks' ) } checked={ Boolean( attributes.multipleFiles ) } onChange={ multipleFiles => { + window.oTrk?.add({ feature: 'form-file', featureComponent: 'enable-multiple-file', groupID: attributes.id }); setSavedState( attributes.id, true ); setAttributes({ multipleFiles: multipleFiles ? multipleFiles : undefined }); } } @@ -327,6 +338,7 @@ const FormFileInspector = ( Template, { type="number" value={ ! isNaN( parseInt( attributes.maxFilesNumber ) ) ? ( attributes.maxFilesNumber ) : undefined } onChange={ maxFilesNumber => { + window.oTrk?.set( `${attributes.id}_num`, { feature: 'form-file', featureComponent: 'multiple-file', featureValue: maxFilesNumber, groupID: attributes.id }); setSavedState( attributes.id, true ); setAttributes({ maxFilesNumber: maxFilesNumber ? maxFilesNumber?.toString() : undefined }); } } @@ -340,6 +352,7 @@ const FormFileInspector = ( Template, { help={ __( 'If enabled, the files will be saved to Media Library instead of adding them as attachments to email.', 'otter-blocks' ) } checked={ 'media-library' === attributes.saveFiles } onChange={ value => { + window.oTrk?.add({ feature: 'form-file', featureComponent: 'enable-media-saving', groupID: attributes.id }); setSavedState( attributes.id, true ); setAttributes({ saveFiles: value ? 'media-library' : undefined }); } } diff --git a/src/pro/plugins/live-search/edit.js b/src/pro/plugins/live-search/edit.js index 7326f555b..ee9c3b594 100644 --- a/src/pro/plugins/live-search/edit.js +++ b/src/pro/plugins/live-search/edit.js @@ -73,7 +73,14 @@ const Edit = ({ { + + if ( value ) { + window.oTrk?.add({ feature: 'live-search', featureComponent: 'enable' }); + } + + toggleLive(); + } } /> { props.attributes.otterIsLive && ( diff --git a/tests/bootstrap.php b/tests/bootstrap.php index deff6ffd3..96ff47338 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -21,7 +21,16 @@ // Start up the WP testing environment. require $_tests_dir . '/includes/bootstrap.php'; +if ( ! defined( 'OTTER_BLOCKS_VERSION' ) ) { + define('OTTER_BLOCKS_VERSION', '1.0.0'); +} + +require dirname( dirname( __FILE__ ) ) . '/tests/stripe-http-client-mock.php'; require dirname( dirname( __FILE__ ) ) . '/inc/css/class-css-utility.php'; +require dirname( dirname( __FILE__ ) ) . '/inc/plugins/class-block-conditions.php'; +require dirname( dirname( __FILE__ ) ) . '/inc/plugins/class-dynamic-content.php'; +require dirname( dirname( __FILE__ ) ) . '/plugins/otter-pro/inc/plugins/class-block-conditions.php'; +require dirname( dirname( __FILE__ ) ) . '/plugins/otter-pro/inc/plugins/class-dynamic-content.php'; global $current_user; $current_user = new WP_User( 1 ); diff --git a/tests/stripe-http-client-mock.php b/tests/stripe-http-client-mock.php new file mode 100644 index 000000000..7604c3f30 --- /dev/null +++ b/tests/stripe-http-client-mock.php @@ -0,0 +1,225 @@ +mockProductsList(), 200, null); + } + + if (preg_match('#^/v1/products/\w+$#', $path)) { + return array($this->mockSingleProduct(), 200, null); + } + + if ($path === '/v1/prices') { + return array($this->mockPricesList(), 200, null); + } + + if (preg_match('#^/v1/prices/\w+$#', $path)) { + return array($this->mockSinglePrice($path), 200, null); + } + + if ($path === '/v1/checkout/sessions') { + return array($this->mockCreateSession(), 200, null); + } + + if (preg_match('#^/v1/checkout/sessions/\w+/line_items$#', $path)) { + return array($this->mockSessionItems($path), 200, null); + } + + if (preg_match('#^/v1/checkout/sessions/\w+$#', $path)) { + return array($this->mockGetSession($path), 200, null); + } + + if (preg_match('#^/v1/subscriptions/\w+$#', $path)) { + return array($this->mockGetSubscription($path), 200, null); + } + + return [ + $this->mockProductsList(), + '200', + null + ]; + } + + private function mockProductsList() + { + return json_encode( + [ + 'object' => 'list', + 'data' => [ + [ + 'id' => 'prod_1', + 'name' => 'Laptop', + 'description' => 'High-performance laptop', + 'price' => 1200, + 'currency' => 'USD', + 'active' => true + ], + [ + 'id' => 'prod_2', + 'name' => 'Smartphone', + 'description' => 'Latest model smartphone', + 'price' => 800, + 'currency' => 'USD', + 'active' => true + ], + [ + 'id' => 'prod_3', + 'name' => 'Headphones', + 'description' => 'Noise-cancelling headphones', + 'price' => 300, + 'currency' => 'USD', + 'active' => false + ] + ], + 'has_more' => false + ] + ); + } + + private function mockSingleProduct() + { + return json_encode( + [ + 'id' => 'prod_1', + 'name' => 'Laptop', + 'description' => 'High-performance laptop', + 'price' => 1200, + 'currency' => 'USD', + 'active' => true, + 'object' => 'product' + ] + ); + } + + private function mockPricesList() + { + return json_encode( + [ + 'object' => 'list', + 'data' => [ + [ + 'id' => 'price_1', + 'product' => 'prod_1', + 'unit_amount' => 1000 + ], + [ + 'id' => 'price_2', + 'product' => 'prod_2', + 'unit_amount' => 2000 + ] + ] + ] + ); + } + + private function mockSinglePrice() + { + return json_encode( + [ + 'id' => 'price_1', + 'product' => 'prod_1', + 'unit_amount' => 1000, + 'currency' => 'USD', + 'object' => 'price', + 'active' => true, + 'billing_scheme' => 'per_unit', + ] + ); + } + + private function mockCreateSession() + { + return json_encode( + [ + 'object' => 'object', + 'data' => [ + 'id' => 'sess_1', + 'status' => 'created' + ] + ] + ); + } + + private function mockGetSession() + { + return json_encode( + [ + 'id' => 'sess_1', + 'status' => 'complete', + 'customer' => 'cus_1', + 'customer_details' => [ + 'email' => 'test@test.com' + ], + 'mode' => 'payment', + 'payment_status' => 'paid', + 'payment_intent' => 'pi_1', + 'object' => 'checkout.session', + 'success_url' => 'https://example.com/success?product_id=prod_1', + 'complete' => true + ] + ); + } + + private function mockSessionItems() + { + return json_encode( + [ + 'object' => 'list', + 'data' => [ + [ + 'id' => 'item_1', + 'quantity' => 1, + 'object' => 'item', + 'price' => [ + 'id' => 'price_1', + 'product' => 'prod_1', + 'unit_amount' => 1000, + 'currency' => 'USD', + 'object' => 'price', + 'active' => true, + 'billing_scheme' => 'per_unit', + ] + ], + [ + 'id' => 'item_2', + 'quantity' => 2, + 'object' => 'item', + 'price' => [ + 'id' => 'price_1', + 'product' => 'prod_1', + 'unit_amount' => 1000, + 'currency' => 'USD', + 'object' => 'price', + 'active' => true, + 'billing_scheme' => 'per_unit', + ] + ] + ] + ] + ); + } + + private function mockGetSubscription() + { + return json_encode(array( + 'id' => 'sub_1', + 'status' => 'active' + )); + } +} + diff --git a/tests/test-block-conditions.php b/tests/test-block-conditions.php new file mode 100644 index 000000000..66b27c3dc --- /dev/null +++ b/tests/test-block-conditions.php @@ -0,0 +1,594 @@ +block_conditions = new Block_Conditions(); + $this->otter_pro_blocks_conditions = new \ThemeIsle\OtterPro\Plugins\Block_Conditions(); + $this->user_id = wp_create_user( 'test_user_deletion', 'userlogin', 'test@userrecover.com' ); + + $this->block_conditions->init(); + + /** + * Create a test post. + */ + $this->post_id = $this->factory()->post->create(); + $this->category_slug = 'test-category'; + $this->category_id = $this->factory()->category->create( + array( + 'name' => 'Test Category', + 'slug' => $this->category_slug, + ) + ); + + wp_update_post( + array( + 'ID' => $this->post_id, + 'post_author' => $this->user_id, + 'post_type' => 'post', + 'post_category' => array( $this->category_id ), + ) + ); + + // Add some meta values to the post. + update_post_meta( $this->post_id, 'test_meta', 'test' ); + + // Add some meta to the user. + update_user_meta( $this->user_id, 'test_meta', 'test' ); + + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + } + + public function tear_down() + { + wp_delete_user( $this->user_id, true ); + wp_delete_post( $this->post_id, true ); + wp_delete_term( $this->category_id, 'category' ); + parent::tear_down(); + } + + /** + * Test logged-in user when user is logged in. + */ + public function test_logged_in_user_on_login() { + wp_set_current_user( $this->user_id ); + + $condition = array( + 'type' => 'loggedInUser', + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertTrue( $result ); + } + + /** + * Test logged-in user when user is not logged in. + */ + public function test_logged_in_user_on_logout() { + + $condition = array( + 'type' => 'loggedInUser', + ); + + wp_set_current_user( 0 ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertFalse( $result ); + } + + /** + * Test logged-out user when user is logged in. + */ + public function test_logged_out_user_on_login() { + wp_set_current_user( $this->user_id ); + + $condition = array( + 'type' => 'loggedOutUser', + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertFalse( $result ); + } + + /** + * Test logged-out user when user is not logged in. + */ + public function test_logged_out_user_on_logout() { + + $condition = array( + 'type' => 'loggedOutUser', + ); + + wp_set_current_user( 0 ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertTrue( $result ); + } + + /** + * Test user roles when user has the role. + */ + public function test_user_roles_has_role() { + wp_set_current_user( $this->user_id ); + $user = wp_get_current_user(); + $user->set_role( 'administrator' ); + + $condition = array( + 'type' => 'userRoles', + 'roles' => array( 'administrator' ), + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertTrue( $result ); + } + + /** + * Test user roles when user does not have the role. + */ + public function test_user_roles_does_not_have_role() { + wp_set_current_user( $this->user_id ); + $user = wp_get_current_user(); + $user->set_role( 'administrator' ); + + $condition = array( + 'type' => 'userRoles', + 'roles' => array( 'editor' ), + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertFalse( $result ); + } + + /** + * Test the post type condition. + */ + public function test_post_type() { + + $condition = array( + 'type' => 'postType', + 'post_types' => array( 'post' ), + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertTrue( $result ); + } + + /** + * Test the post type condition on invalid post type. + */ + public function test_post_type_on_invalid() { + + $condition = array( + 'type' => 'postType', + 'post_types' => array( 'test' ), + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertFalse( $result ); + } + + /** + * Test the post category condition. + */ + public function test_post_category() { + + $condition = array( + 'type' => 'postCategory', + 'categories' => array( $this->category_slug ), + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertTrue( $result ); + } + + /** + * Test the post category condition on invalid category. + */ + public function test_post_category_on_invalid() { + + $condition = array( + 'type' => 'postCategory', + 'categories' => array( 'invalid' ), + ); + + $result = $this->block_conditions->evaluate_condition( $condition ); + + $this->assertFalse( $result ); + } + + /** + * Test logged in user meta. + */ + public function test_logged_in_user_meta() { + wp_set_current_user( $this->user_id ); + + $condition = array( + 'type' => 'loggedInUserMeta', + 'meta_key' => 'test_meta', + 'meta_compare' => 'is_true', + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertTrue( $result ); + } + + /** + * Test logged in user meta. + */ + public function test_logged_in_user_meta_invalid() { + wp_set_current_user( $this->user_id ); + + $condition = array( + 'type' => 'loggedInUserMeta', + 'meta_key' => 'test_', + 'meta_compare' => 'is_true', + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertFalse( $result ); + } + + /** + * Test post meta. + */ + public function test_post_meta() { + wp_set_current_user( $this->user_id ); + + $condition = array( + 'type' => 'postMeta', + 'meta_key' => 'test_meta', + 'meta_compare' => 'is_true', + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertTrue( $result ); + } + + /** + * Test post meta. + */ + public function test_post_meta_invalid() { + wp_set_current_user( $this->user_id ); + + $condition = array( + 'type' => 'postMeta', + 'meta_key' => 'test_', + 'meta_compare' => 'is_true', + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertFalse( $result ); + } + + /** + * Test data range. + */ + public function test_date_range() { + + $condition = array( + 'type' => 'dateRange', + 'start_date' => '2020-01-01', + 'end_date' => '2030-12-31', + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertTrue( $result ); + } + + /** + * Test data range. + */ + public function test_date_range_invalid() { + + $condition = array( + 'type' => 'dateRange', + 'start_date' => '2020-01-01', + 'end_date' => '2020-12-31', + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertFalse( $result ); + } + + /** + * Test the date reccuring condition. + */ + public function test_date_recurring() { + $condition = array( + 'type' => 'dateRecurring', + 'days' => array( 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday' ), + ); + + $result = $this->otter_pro_blocks_conditions->evaluate_condition( true, $condition, true ); + + $this->assertTrue( $result ); + } + + /** + * Test multiple conditions. + */ + public function test_multiple_conditions() { + + $this->go_to( get_permalink( $this->post_id ) ); + wp_set_current_user( $this->user_id ); + + $collection = array( + array( + array( + 'type' => 'loggedInUser', + ), + array( + 'type' => 'postType', + 'post_types' => array( 'post' ), + ), + ) + ); + + $result = $this->block_conditions->evaluate_condition_collection( $collection ); + + $this->assertTrue( $result ); + } + + + /** + * Test multiple conditions. + */ + public function test_multiple_conditions__with_one_invalid() { + $this->go_to( get_permalink( $this->post_id ) ); + wp_set_current_user( 0 ); + + $collection = array( + array( + array( + 'type' => 'loggedInUser', + ), + array( + 'type' => 'postType', + 'post_types' => array( 'post' ), + ), + ), + ); + + $result = $this->block_conditions->evaluate_condition_collection( $collection ); + + $this->assertFalse( $result ); + } + + /** + * Test multiple conditions. + */ + public function test_multiple_conditions_with_all_invalid() { + $this->go_to( get_permalink( $this->post_id ) ); + wp_set_current_user( 0 ); + + $collection = array( + array( + array( + 'type' => 'loggedInUser', + ), + array( + 'type' => 'postType', + 'post_types' => array( 'test_17' ), + ), + ), + ); + + $result = $this->block_conditions->evaluate_condition_collection( $collection ); + + $this->assertFalse( $result ); + } + + /** + * Test OR collection. + */ + public function test_or_collection() { + $this->go_to( get_permalink( $this->post_id ) ); + + $collection = array( + array( + array( + 'type' => 'postType', + 'post_types' => array( 'post' ), + ), + ), + array( + array( + 'type' => 'postType', + 'post_types' => array( 'test_17' ), + ), + ), + ); + + $result = $this->block_conditions->evaluate_condition_collection( $collection ); + + $this->assertTrue( $result ); + } + + /** + * Test OR collection. All invalid + */ + public function test_or_collection_invalid() { + $this->go_to( get_permalink( $this->post_id ) ); + + $collection = array( + array( + array( + 'type' => 'postType', + 'post_types' => array( 'post_42' ), + ), + ), + array( + array( + 'type' => 'postType', + 'post_types' => array( 'test_17' ), + ), + ), + ); + + $result = $this->block_conditions->evaluate_condition_collection( $collection ); + + $this->assertFalse( $result ); + } + + public function test_hide_css_desktop_condition() { + $condition = array( + 'type' => 'test', + 'screen_sizes' => array( + 'desktop', + ), + ); + + $content = '

Test

'; + + $result = $this->block_conditions->should_add_hide_css_class( $condition, $content ); + + $this->assertEquals( '

Test

', $result ); + } + + public function test_hide_css_tablet_condition() { + $condition = array( + 'type' => 'test', + 'screen_sizes' => array( + 'tablet', + ), + ); + + $content = '

Test

'; + + $result = $this->block_conditions->should_add_hide_css_class( $condition, $content ); + + $this->assertEquals( '

Test

', $result ); + } + + public function test_hide_css_mobile_condition() { + $condition = array( + 'type' => 'test', + 'screen_sizes' => array( + 'mobile', + ), + ); + + $content = '

Test

'; + + $result = $this->block_conditions->should_add_hide_css_class( $condition, $content ); + + $this->assertEquals( '

Test

', $result ); + } + + public function test_hide_css_all_condition() { + $condition = array( + 'type' => 'test', + 'screen_sizes' => array( + 'desktop', + 'tablet', + 'mobile' + ), + ); + + $content = '

Test

'; + + $result = $this->block_conditions->should_add_hide_css_class( $condition, $content ); + + $this->assertEquals( '

Test

', $result ); + } + + public function test_get_css_hide_condition() { + $collection = array( + array( + array( + 'type' => 'postType', + 'post_types' => array( 'post_42' ), + ), + ), + array( + array( + 'type' => 'test', + 'screen_sizes' => array( + 'desktop', + 'tablet', + 'mobile' + ), + ), + ), + ); + + $result = $this->block_conditions->get_hide_css_condition( $collection ); + + // Check if screen_sizes exists. + $this->assertArrayHasKey( 'screen_sizes', $result ); + + // Check if screen_sizes is an array. + $this->assertIsArray( $result['screen_sizes'] ); + + // Check if screen_sizes has the correct values. + $this->assertEqualsCanonicalizing( array( 'desktop', 'tablet', 'mobile' ), $result['screen_sizes'] ); + } + + public function test_get_css_hide_condition_no_hide() { + $collection = array( + array( + array( + 'type' => 'postType', + 'post_types' => array( 'post_42' ), + ), + ), + ); + + $result = $this->block_conditions->get_hide_css_condition( $collection ); + + $this->assertFalse( $result ); + } +} diff --git a/tests/test-dynamic-content.php b/tests/test-dynamic-content.php new file mode 100644 index 000000000..8b008c72a --- /dev/null +++ b/tests/test-dynamic-content.php @@ -0,0 +1,687 @@ +dynamic_content = new Dynamic_Content(); + $this->dynamic_content_pro = new \ThemeIsle\OtterPro\Plugins\Dynamic_Content(); + $this->user_id = wp_create_user( 'test_user_deletion', 'userlogin', 'test@userrecover.com' ); + + + /** + * Create a test post. + */ + $this->post_id = $this->factory()->post->create(); + $this->category_slug = 'test-category'; + $this->category_id = $this->factory()->category->create( + array( + 'name' => 'Test Category', + 'slug' => $this->category_slug, + ) + ); + + wp_update_post( + array( + 'ID' => $this->post_id, + 'post_author' => $this->user_id, + 'post_type' => 'post', + 'post_category' => array( $this->category_id ), + 'post_title' => 'Test', + 'post_content' => 'Test', + 'post_status' => 'publish', + 'post_excerpt' => 'Test', + ) + ); + + // Add some meta values to the post. + update_post_meta( $this->post_id, 'test_meta', 'test' ); + + // Add some meta to the user. + update_user_meta( $this->user_id, 'test_meta', 'test' ); + + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + } + + /** + * Tear down the test. + */ + public function tear_down() { + wp_delete_user( $this->user_id, true ); + wp_delete_post( $this->post_id, true ); + wp_delete_term( $this->category_id, 'category' ); + parent::tear_down(); + } + + /** + * Test the Post ID query. + */ + public function test_post_id() { + + $post_id_query = '

Post ID

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_id_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postID', $result['type'] ); + } + + /** + * Test the Post Type query. + */ + public function test_post_type() { + $post_type_query = '

Post Type

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_type_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postType', $result['type'] ); + } + + /** + * Test the Post Title query. + */ + public function test_post_title() { + $post_title_query = '

Post Title

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_title_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postTitle', $result['type'] ); + } + + /** + * Test the Post Status query. + */ + public function test_post_status() { + $post_status_query = '

Post Status

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_status_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postStatus', $result['type'] ); + } + + /** + * Test the Post Content query. + */ + public function test_post_content() { + $post_content_query = '

Post Content

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_content_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postContent', $result['type'] ); + } + + /** + * Test the Post Excerpt query. + */ + public function test_post_excerpt() { + $post_excerpt_query = '

Advanced Custom Fields

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_excerpt_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postExcerpt', $result['type'] ); + $this->assertEquals( '500', $result['length'] ); + $this->assertEquals( 'before', $result['before'] ); + $this->assertEquals( 'after', $result['after'] ); + } + + /** + * Test the Post Date query. + */ + public function test_post_date() { + $post_date_query = '

Post Date

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_date_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postDate', $result['type'] ); + } + + /** + * Test the Post Time query. + */ + public function test_post_time() { + $post_time_query = '

Post Time

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_time_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postTime', $result['type'] ); + $this->assertEquals( 'modified', $result['timeType'] ); + $this->assertEquals( 'custom', $result['timeFormat'] ); + $this->assertEquals( 'H:i', $result['timeCustom'] ); + } + + /** + * Test the Post Terms query. + */ + public function test_post_terms() { + $post_terms_query = '

Post Terms

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_terms_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postTerms', $result['type'] ); + $this->assertEquals( 'custom', $result['termType'] ); + $this->assertEquals( 'categories', $result['taxonomy'] ); + $this->assertEquals( '-', $result['termSeparator'] ); + $this->assertEquals( 'before', $result['before'] ); + $this->assertEquals( 'after', $result['after'] ); + } + + /** + * Test the Post Meta query. + */ + public function test_post_meta() { + $post_meta_query = '

Post Custom Field

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $post_meta_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'postMeta', $result['type'] ); + $this->assertEquals( 'test', $result['metaKey'] ); + $this->assertEquals( 'before', $result['before'] ); + $this->assertEquals( 'after', $result['after'] ); + } + + /** + * Test the Advanced Custom Fields query. + */ + public function test_acf() { + $acf_query = '

Advanced Custom Fields

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $acf_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'acf', $result['type'] ); + $this->assertEquals( 'field_646f643a407bf', $result['metaKey'] ); + $this->assertEquals( 'before', $result['before'] ); + $this->assertEquals( 'after', $result['after'] ); + } + + /** + * Test the Site Title query. + */ + public function test_site_title() { + $site_title_query = '

Site Title

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $site_title_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'siteTitle', $result['type'] ); + } + + /** + * Test the Site Tagline query. + */ + public function test_site_tagline() { + $site_tagline_query = '

Site Tagline

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $site_tagline_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'siteTagline', $result['type'] ); + } + + /** + * Test the Author Name query. + */ + public function test_author_name() { + $author_name_query = '

Author Name

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $author_name_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'authorName', $result['type'] ); + } + + /** + * Test the Author Description query. + */ + public function test_author_description() { + $author_description_query = '

Author Description

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $author_description_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'authorDescription', $result['type'] ); + } + + /** + * Test the Author Meta query. + */ + public function test_author_meta() { + $author_meta_query = '

Author Meta

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $author_meta_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'authorMeta', $result['type'] ); + $this->assertEquals( 'display_name', $result['metaKey'] ); + } + + /** + * Test the Logged In User Name query. + */ + public function test_logged_in_user_name() { + $logged_in_user_name_query = '

Logged In User Name

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $logged_in_user_name_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'loggedInUserName', $result['type'] ); + } + + /** + * Test the Logged In User Description query. + */ + public function test_logged_in_user_description() { + $logged_in_user_description_query = '

Logged In User Description

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $logged_in_user_description_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'loggedInUserDescription', $result['type'] ); + } + + /** + * Test for the Logged In User Email query. + */ + public function test_logged_in_user_email() { + $logged_in_user_email_query = '

Logged In User Email

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $logged_in_user_email_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'loggedInUserEmail', $result['type'] ); + } + + /** + * Test the Logged In User Meta query. + */ + public function test_logged_in_user_meta() { + $logged_in_user_meta_query = '

Logged In User Meta

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $logged_in_user_meta_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'loggedInUserMeta', $result['type'] ); + $this->assertEquals( 'description', $result['metaKey'] ); + } + + /** + * Test the Archive Title query. + */ + public function test_archive_title() { + $archive_title_query = '

Archive Title

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $archive_title_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'archiveTitle', $result['type'] ); + } + + /** + * Test the Archive Description query. + */ + public function test_archive_description() { + $archive_description_query = '

Archive Description

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $archive_description_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'archiveDescription', $result['type'] ); + } + + /** + * Test the Date query. + */ + public function test_date() { + $date_query = '

Date

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $date_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'date', $result['type'] ); + $this->assertEquals( 'custom', $result['dateFormat'] ); + $this->assertEquals( 'l, F j, Y', $result['dateCustom'] ); + } + + /** + * Test the Time query. + */ + public function test_time() { + $time_query = '

Time

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $time_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'time', $result['type'] ); + $this->assertEquals( 'custom', $result['timeFormat'] ); + $this->assertEquals( 'H:i', $result['timeCustom'] ); + } + + /** + * Test the Query String query. + */ + public function test_query_string() { + $query_string_query = '

Query String

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $query_string_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'queryString', $result['type'] ); + $this->assertEquals( 'capitalize', $result['format'] ); + $this->assertEquals( 'action', $result['parameter'] ); + } + + /** + * Test the Country query. + */ + public function test_country() { + $country_query = '

Country

'; + + $result = array(); + $num = Dynamic_Content::parse_dynamic_content_query( $country_query, $result ); + $this->assertTrue( boolval( $num ) ); + $result = $result[0]; + + $this->assertEquals( 'country', $result['type'] ); + } + + /** + * Test the Post Id evaluation. + */ + public function test_post_id_evaluation() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $post_id_query = '

Post ID

'; + $result = $this->dynamic_content->apply_dynamic_content( $post_id_query ); + + $this->assertEquals( '

' . $this->post_id . '

', $result ); + } + + /** + * Test the Post Type evaluation. + */ + public function test_post_type_evaluation() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $post_type_query = '

Post Type

'; + $result = $this->dynamic_content->apply_dynamic_content( $post_type_query ); + + $this->assertEquals( '

post

', $result ); + } + + /** + * Test the Post Title evaluation. + */ + public function test_post_title_evaluation() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $post_title_query = '

Post Title

'; + $result = $this->dynamic_content->apply_dynamic_content( $post_title_query ); + + $this->assertEquals( '

Test

', $result ); + } + + /** + * Test the Post Status evaluation. + */ + public function test_post_status_evaluation() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $post_status_query = '

Post Status

'; + $result = $this->dynamic_content->apply_dynamic_content( $post_status_query ); + + $this->assertEquals( '

publish

', $result ); + } + + /** + * Test the Post Content evaluation. + */ + public function test_post_content_evaluation() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $post_content_query = '

Post Content

'; + $result = $this->dynamic_content->apply_dynamic_content( $post_content_query ); + + $this->assertStringContainsString( '

Test

', $result ); + } + + /** + * Test the Post Excerpt evaluation. + */ + public function test_post_excerpt_evaluation() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $post_excerpt_query = '

Advanced Custom Fields

'; + $result = $this->dynamic_content->apply_dynamic_content( $post_excerpt_query ); + + $this->assertEquals( '

before-Test…-after

', $result ); + } + + /** + * Test the Logger In User Name evaluation. + */ + public function test_logged_in_user_name_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $logged_in_user_name_query = '

Logged In User Name

'; + $result = $this->dynamic_content->apply_dynamic_content( $logged_in_user_name_query ); + + $this->assertEquals( '

test_user_deletion

', $result ); + } + + /** + * Test the Logger In User Description evaluation. + */ + public function test_logged_in_user_description_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $logged_in_user_description_query = '

Logged In User Description

'; + $result = $this->dynamic_content->apply_dynamic_content( $logged_in_user_description_query ); + + $this->assertEquals( '

', $result ); + } + + /** + * Test the Logger In User Email evaluation. + */ + public function test_logged_in_user_email_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $logged_in_user_email_query = '

Logged In User Email

'; + $result = $this->dynamic_content->apply_dynamic_content( $logged_in_user_email_query ); + + $this->assertEquals( '

test@userrecover.com

', $result ); + } + + /** + * Test he Date evaluation. + */ + public function test_date_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $date_query = '

Date

'; + $result = $this->dynamic_content->apply_dynamic_content( $date_query ); + + $this->assertEquals( '

' . date( 'l, F j, Y' ) . '

', $result ); + } + + /** + * Test the Time evaluation. + */ + public function test_time_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $time_query = '

Time

'; + $result = $this->dynamic_content->apply_dynamic_content( $time_query ); + + $this->assertEquals( '

' . date( 'H:i' ) . '

', $result ); + } + + /** + * Test the Author Name evaluation. + */ + public function test_author_name_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $author_name_query = '

Author Name

'; + $result = $this->dynamic_content->apply_dynamic_content( $author_name_query ); + + $this->assertEquals( '

test_user_deletion

', $result ); + } + + /** + * Test the Author Description evaluation. + */ + public function test_author_description_evaluation() { + // Set the user as the current user. + wp_set_current_user( $this->user_id ); + + $author_description_query = '

Author Description

'; + $result = $this->dynamic_content->apply_dynamic_content( $author_description_query ); + + $this->assertEquals( '

', $result ); + } + + /** + * Test multiple dynamic content queries. + */ + public function test_multiple_dynamic_content_queries() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $multiple_queries = '

This is Post ID

Post Type

'; + $result = $this->dynamic_content->apply_dynamic_content( $multiple_queries ); + + $this->assertEquals( '

This is ' . $this->post_id . '

post

', $result ); + } + + /** + * Test multiple dynamic content queries on a very long content. + */ + public function test_multiple_dynamic_content_queries_on_long_content() { + // Set the post as the current post. + $this->go_to( get_permalink( $this->post_id ) ); + + $padding = str_repeat( ' ', 10000 ); + $multiple_queries = '

This is Post ID' . $padding . '

Post Type

'; + $long_content = str_repeat( $multiple_queries, 100 ); + $result = $this->dynamic_content->apply_dynamic_content( $long_content ); + + $this->assertStringContainsString( '

This is ' . $this->post_id . $padding . '

post

', $result ); + } +} diff --git a/tests/test-patterns-class.php b/tests/test-patterns-class.php new file mode 100644 index 000000000..84089a020 --- /dev/null +++ b/tests/test-patterns-class.php @@ -0,0 +1,44 @@ + get_site_url(), + 'license_id' => $array_data['key'], + 'cache' => gmdate( 'u' ), + ), + 'https://api.themeisle.com/templates-cloud/otter-patterns' + ); + + $response = wp_remote_get( $url ); + $response = wp_remote_retrieve_body( $response ); + + $this->assertTrue( 2000 < strlen( $response ) ); + + $response = json_decode( $response, true ); + + $this->assertIsArray( $response ); + + $this->assertArrayHasKey( 'slug', $response[0] ); + } +} diff --git a/tests/test-stripe-api-class.php b/tests/test-stripe-api-class.php new file mode 100644 index 000000000..be8e62ee2 --- /dev/null +++ b/tests/test-stripe-api-class.php @@ -0,0 +1,112 @@ +stripe_api = new Stripe_API(); + } + + + /** + * Test Stripe products retrieval. + */ + public function test_retrieve_products() { + $products = $this->stripe_api->create_request( + 'products', + array( + 'active' => true, + 'limit' => 50, + ) + ); + + $this->assertIsArray( $products->data ); + } + + /** + * Test Stripe prices retrieval. + */ + public function test_retrieve_prices() { + $prices = $this->stripe_api->create_request( + 'prices', + array( + 'active' => true, + 'limit' => 50, + ) + ); + + $this->assertIsArray( $prices->data ); + } + + /** + * Test Stripe product retrieval. + */ + public function test_retrieve_product() { + $product = $this->stripe_api->create_request('product', 'prod_1' ); + + $this->assertTrue( 'prod_1' === $product['id'] ); + } + + /** + * Test Stripe price retrieval. + */ + public function test_retrieve_price() { + $price = $this->stripe_api->create_request('price', 'price_1' ); + + $this->assertTrue( 'price_1' === $price['id'] ); + } + + /** + * Test get customer email from session. + */ + public function test_retrieve_session_email() { + $this->assertTrue( 'test@test.com' === $this->stripe_api->get_session_email( 'sess_1' ) ); + } + + /** + * Test user purchase. + */ + public function test_user_purchase() { + wp_set_current_user( 1 ); + $this->stripe_api->save_customer_data( 'sess_1' ); + $data = $this->stripe_api->get_customer_data(); + + $this->assertFalse( empty( $data[0]['id'] ) ); + } + + /** + * Test status for price id. + */ + public function test_status_for_price_id() { + $status = $this->stripe_api->get_status_for_price_id( 'sess_1','price_1' ); + + $this->assertTrue( 'success' === $status ); + } +}