From bc8ef41b76b5ad443a15897dbc0ba4de60ee7566 Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 09:59:52 -0400 Subject: [PATCH 01/10] Include changes developed by rtCamp rtCamp provided: 1. Gutenberg support, provided by the JS files in the `block` directory 2. Unit testing of the plugin with `phpunit` 3. Updates to the Docker configuration 4. Updates to the README --- Dockerfile | 39 + README.md | 31 +- TESTING.md | 155 + assets/DocumentCloud-Block-Icon.svg | 10 + assets/css/settings-documentcloud.css | 4 + assets/screenshot-1.png | Bin 0 -> 308450 bytes bin/install-wp-tests.sh | 181 + blocks/.editorconfig | 18 + blocks/.eslintrc.json | 19 + blocks/.gitignore | 30 + blocks/__mocks__/@wordpress/block-editor.js | 7 + blocks/__mocks__/@wordpress/components.js | 53 + blocks/__mocks__/@wordpress/compose.js | 5 + blocks/__mocks__/@wordpress/core-data.js | 12 + blocks/__mocks__/@wordpress/data.js | 21 + blocks/__mocks__/@wordpress/element.js | 2 + blocks/__mocks__/@wordpress/i18n.js | 2 + blocks/__mocks__/svgMock.js | 2 + .../__tests__/__snapshots__/save.test.js.snap | 17 + blocks/__tests__/edit.test.js | 267 + blocks/__tests__/save.test.js | 61 + blocks/__tests__/utils.test.js | 146 + blocks/babel.config.cjs | 6 + blocks/build/blocks-manifest.php | 65 + blocks/build/documentcloud/block.json | 59 + blocks/build/documentcloud/index-rtl.css | 1 + blocks/build/documentcloud/index.asset.php | 1 + blocks/build/documentcloud/index.css | 1 + blocks/build/documentcloud/index.js | 1 + blocks/jest.config.js | 6 + blocks/package-lock.json | 17584 ++++++++++++++++ blocks/package.json | 34 + blocks/src/documentcloud/block.json | 59 + .../components/documentcloud-preview.js | 102 + blocks/src/documentcloud/edit.js | 696 + blocks/src/documentcloud/editor.scss | 101 + blocks/src/documentcloud/index.js | 29 + blocks/src/documentcloud/save.js | 36 + blocks/src/documentcloud/utils/constants.js | 61 + blocks/src/documentcloud/utils/utils.js | 375 + blocks/src/documentcloud/utils/validation.js | 135 + composer.json | 12 + composer.lock | 1770 ++ docker-compose.yml | 23 +- documentcloud.php | 324 +- inc/classes/blocks/class-document-cloud.php | 31 + inc/classes/class-blocks.php | 81 + inc/traits/trait-singleton.php | 93 + inc/utils/autoloader.php | 107 + phpunit.xml.dist | 14 + readme.txt | 36 +- tests/Test_WP_DocumentCloud.php | 235 + tests/bootstrap.php | 40 + 53 files changed, 23082 insertions(+), 118 deletions(-) create mode 100644 Dockerfile create mode 100644 TESTING.md create mode 100644 assets/DocumentCloud-Block-Icon.svg create mode 100644 assets/css/settings-documentcloud.css create mode 100644 assets/screenshot-1.png create mode 100755 bin/install-wp-tests.sh create mode 100644 blocks/.editorconfig create mode 100644 blocks/.eslintrc.json create mode 100644 blocks/.gitignore create mode 100644 blocks/__mocks__/@wordpress/block-editor.js create mode 100644 blocks/__mocks__/@wordpress/components.js create mode 100644 blocks/__mocks__/@wordpress/compose.js create mode 100644 blocks/__mocks__/@wordpress/core-data.js create mode 100644 blocks/__mocks__/@wordpress/data.js create mode 100644 blocks/__mocks__/@wordpress/element.js create mode 100644 blocks/__mocks__/@wordpress/i18n.js create mode 100644 blocks/__mocks__/svgMock.js create mode 100644 blocks/__tests__/__snapshots__/save.test.js.snap create mode 100644 blocks/__tests__/edit.test.js create mode 100644 blocks/__tests__/save.test.js create mode 100644 blocks/__tests__/utils.test.js create mode 100644 blocks/babel.config.cjs create mode 100644 blocks/build/blocks-manifest.php create mode 100644 blocks/build/documentcloud/block.json create mode 100644 blocks/build/documentcloud/index-rtl.css create mode 100644 blocks/build/documentcloud/index.asset.php create mode 100644 blocks/build/documentcloud/index.css create mode 100644 blocks/build/documentcloud/index.js create mode 100644 blocks/jest.config.js create mode 100644 blocks/package-lock.json create mode 100644 blocks/package.json create mode 100644 blocks/src/documentcloud/block.json create mode 100644 blocks/src/documentcloud/components/documentcloud-preview.js create mode 100644 blocks/src/documentcloud/edit.js create mode 100644 blocks/src/documentcloud/editor.scss create mode 100644 blocks/src/documentcloud/index.js create mode 100644 blocks/src/documentcloud/save.js create mode 100644 blocks/src/documentcloud/utils/constants.js create mode 100644 blocks/src/documentcloud/utils/utils.js create mode 100644 blocks/src/documentcloud/utils/validation.js create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 inc/classes/blocks/class-document-cloud.php create mode 100644 inc/classes/class-blocks.php create mode 100644 inc/traits/trait-singleton.php create mode 100644 inc/utils/autoloader.php create mode 100644 phpunit.xml.dist create mode 100644 tests/Test_WP_DocumentCloud.php create mode 100644 tests/bootstrap.php diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cacdbc9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,39 @@ +FROM php:8.2-cli + +# Install required tools and extensions +RUN apt-get update && apt-get install -y \ + git \ + unzip \ + curl \ + subversion \ + default-mysql-client \ + && docker-php-ext-install mysqli + +# Install NPM and Node.js +RUN curl -sL https://deb.nodesource.com/setup_20.x | bash - && \ + apt-get install -y nodejs +RUN npm install -g npm@latest + +# Install Xdebug for coverage +RUN pecl install xdebug && docker-php-ext-enable xdebug + +# Configure Xdebug +RUN echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" > /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ + && echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini \ + && echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + +# Install Composer +RUN curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer + +# Set working directory +WORKDIR /var/www/html + +# Install PHPUnit +RUN composer require --dev phpunit/phpunit:^9 --no-interaction + +# Add composer bin directory to PATH +ENV PATH="/var/www/html/vendor/bin:${PATH}" + +# Copy the local WordPress test suite installer script +COPY ./bin/install-wp-tests.sh /usr/local/bin/install-wp-tests.sh +RUN chmod +x /usr/local/bin/install-wp-tests.sh diff --git a/README.md b/README.md index 93fb030..5c2ea23 100644 --- a/README.md +++ b/README.md @@ -69,6 +69,24 @@ Here's the full list of embed options you can pass via shortcode attributes; som - `zoom` (boolean): Hide or show zoom slider. - `format` (string): Indicate to the theme that this is a wide asset by setting this to `wide`. Defaults `normal`. +Or as a Gutenberg Block : + + DocumentCloud +Icon - ![DocumentCloud Block Icon](assets/DocumentCloud-Block-Icon.svg) + +Here's the list of settings that can be used for the block: +- `WIDTH` (number): Sets the width of the document (optional) +- `HEIGHT` (number): Sets the height of the document (optional) +- `STYLE` (string): Adds additional style to the embedded document (optional) + +The following options can only be used for Documents: +- `Show Title` (toggle): Determines whether to show the title of the embedded document +- `Show FullScreen Button` (toggle): Determines whether to show a full screen icon on the document +- `Only Show Organization` (toggle): Determines whether to only show the organization name that published the document. +- `Show PDF Download Link` (toggle): Determines whether to show the download as pdf icon for documents. + +**Note** - The default width and height from the Settings does not work for the Gutenberg Block. + You can read more about publishing and embedding DocumentCloud resources on https://www.documentcloud.org/help/publishing. ## How the oEmbed endpoint is discovered @@ -90,6 +108,8 @@ If you find yourself absolutely needing to expire the cache, though, you have tw Docker is used to spin up a development and testing WordPress environment. +Unit tests are setup using PHPUnit and Jest, please refer to [Testing Setup ](./TESTING.md) for the setup steps + ### Install ```sh @@ -101,10 +121,19 @@ docker-compose exec wordpress chown -R www-data:www-data /var/www/html 1. Go to `localhost:8000` 2. Create an account. Save the username and password, then log in. -3. Go to the Plugins section, then activate the "Classic Editor" and "DocumentCloud" plugins. +3. Go to the Plugins section, then activate the "DocumentCloud" plugin. ## Changelog +### 0.6.0 +* Add Gutenberg block for embedding DocumentCloud documents resonating a functionality similar to the shortcode. +* Update the shortcode to support the following attributes + * `onlyshoworg` - When set to 1 it only displays the organization name + * `pdf` - When set to 1 it shows a pdf download icon + * `showfullscreen` - When set to 1 it displays a full screen icon. + * `title` - When set to 1 it displays the title of the document. +* Allow setting the query parameter attributes when directly embedding the url in Embed block. + ### 0.5.1 * Expand regex support to catch more DocumentCloud URLs diff --git a/TESTING.md b/TESTING.md new file mode 100644 index 0000000..5451461 --- /dev/null +++ b/TESTING.md @@ -0,0 +1,155 @@ +# **DocumentCloud Plugin โ€“ Unit Testing Guide** + +This document outlines the steps required to run unit tests for the DocumentCloud WordPress plugin. The testing suite includes both PHP unit tests for server-side functionality and JavaScript unit tests for the Gutenberg block component. + +--- + +## **๐Ÿ’ป Software Requirements** + +To run the unit tests for this plugin, ensure you have the following software installed: + +### General + +* Git + +* Composer + +* Node.js + +* npm + +### For PHP Unit Tests + +* PHP + +* PHPUnit (matching your PHP version) + +* MySQL or MariaDB + +* Subversion (`svn`) + +--- + +## **๐Ÿงช PHP Unit Testing Setup** + +The PHP unit tests use the [WordPress PHPUnit Test Suite](https://make.wordpress.org/core/handbook/testing/automated-testing/phpunit/). + +### **1\. Install Dependencies** + +From the root directory of the plugin, run: + +```bash +composer install +``` + +This will install all PHP dependencies, including PHPUnit and test configuration. + +### **2\. Setup WordPress Test Environment** + +The WordPress test suite is already included in the repository via the script at `bin/install-wp-tests.sh`. + +#### **Make the script executable:** + +```bash +chmod +x bin/install-wp-tests.sh +``` + +#### **Run the script with appropriate parameters:** + +```bash +./bin/install-wp-tests.sh [db-host] [wp-version] +``` + +* Replace ``, ``, `` with your local database credentials. + +* โš ๏ธ Note: Ensure that `svn` is installed on your system, as the script uses Subversion to fetch the WordPress core files. + +### **3\. Run the PHPUnit Tests** + +After successful setup: + +```bash +phpunit +``` + +To run with code coverage output: + +```bash +phpunit --coverage-text +``` + +๐Ÿ“Œ Ensure you are running this from the plugin root and have `phpunit.xml.dist` properly configured. + +--- + +## **๐Ÿงช Running PHPUnit Tests Inside Docker** + +If you are using Docker for your development environment, follow these steps to run PHPUnit tests inside the Docker container: + +### **1\. Start the Docker Containers** + +```bash +docker compose up --build +``` + +### **2\. Open Shell into the Testing Service** + +```bash +docker exec -it Testing bash +``` + +### **3\. Install the WordPress Test Suite** + +```bash +./bin/install-wp-tests.sh test root password db latest +``` + +### **4\. Run the PHPUnit Tests** + +```bash +./vendor/bin/phpunit +``` + +--- + +## **๐Ÿงช JavaScript Unit Testing Setup** + +The Gutenberg block of this plugin is tested using [Jest](https://jestjs.io/) and [React Testing Library](https://testing-library.com/docs/react-testing-library/intro/). + +### **1\. Navigate to the Blocks Directory** + +```bash +cd blocks/ +``` + +### **2\. Install JavaScript Dependencies** + +```bash +npm install +``` + +### **3\. Run the JS Tests** + +```bash +npm run test +``` + +or + +```bash +npx jest +``` + +### **4\. Test Directory Structure** + +* `__tests__/` โ€“ Contains all Jest test files. + +* `__mocks__/` โ€“ Includes mocks for WordPress-specific packages. + +* `__snapshots__/` โ€“ Stores Jest snapshot tests, for the `save` component of the block. + +โš ๏ธ If you've made changes to how the `save` function renders content, delete existing snapshots to regenerate them: + +```bash +rm -rf __snapshots__/ +``` \ No newline at end of file diff --git a/assets/DocumentCloud-Block-Icon.svg b/assets/DocumentCloud-Block-Icon.svg new file mode 100644 index 0000000..00a47d4 --- /dev/null +++ b/assets/DocumentCloud-Block-Icon.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/assets/css/settings-documentcloud.css b/assets/css/settings-documentcloud.css new file mode 100644 index 0000000..2bd4fec --- /dev/null +++ b/assets/css/settings-documentcloud.css @@ -0,0 +1,4 @@ +body.settings_page_documentcloud .wrap .notice.notice-success, +body.settings_page_documentcloud #setting-error-settings_updated { + margin: 5px 38px 15px 0; +} diff --git a/assets/screenshot-1.png b/assets/screenshot-1.png new file mode 100644 index 0000000000000000000000000000000000000000..844532eb46276062d697002d0f0299d072bfc5e0 GIT binary patch literal 308450 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 Bx1#_6 literal 0 HcmV?d00001 diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh new file mode 100755 index 0000000..c6f53dc --- /dev/null +++ b/bin/install-wp-tests.sh @@ -0,0 +1,181 @@ +#!/usr/bin/env bash + +if [ $# -lt 3 ]; then + echo "usage: $0 [db-host] [wp-version] [skip-database-creation]" + exit 1 +fi + +DB_NAME=$1 +DB_USER=$2 +DB_PASS=$3 +DB_HOST=${4-localhost} +WP_VERSION=${5-latest} +SKIP_DB_CREATE=${6-false} + +TMPDIR=${TMPDIR-/tmp} +TMPDIR=$(echo $TMPDIR | sed -e "s/\/$//") +WP_TESTS_DIR=${WP_TESTS_DIR-$TMPDIR/wordpress-tests-lib} +WP_CORE_DIR=${WP_CORE_DIR-$TMPDIR/wordpress} + +download() { + if [ `which curl` ]; then + curl -s "$1" > "$2"; + elif [ `which wget` ]; then + wget -nv -O "$2" "$1" + fi +} + +if [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+\-(beta|RC)[0-9]+$ ]]; then + WP_BRANCH=${WP_VERSION%\-*} + WP_TESTS_TAG="branches/$WP_BRANCH" + +elif [[ $WP_VERSION =~ ^[0-9]+\.[0-9]+$ ]]; then + WP_TESTS_TAG="branches/$WP_VERSION" +elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0-9]+ ]]; then + if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then + # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x + WP_TESTS_TAG="tags/${WP_VERSION%??}" + else + WP_TESTS_TAG="tags/$WP_VERSION" + fi +elif [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then + WP_TESTS_TAG="trunk" +else + # http serves a single offer, whereas https serves multiple. we only want one + download http://api.wordpress.org/core/version-check/1.7/ /tmp/wp-latest.json + grep '[0-9]+\.[0-9]+(\.[0-9]+)?' /tmp/wp-latest.json + LATEST_VERSION=$(grep -o '"version":"[^"]*' /tmp/wp-latest.json | sed 's/"version":"//') + if [[ -z "$LATEST_VERSION" ]]; then + echo "Latest WordPress version could not be found" + exit 1 + fi + WP_TESTS_TAG="tags/$LATEST_VERSION" +fi +set -ex + +install_wp() { + + if [ -d $WP_CORE_DIR ]; then + return; + fi + + mkdir -p $WP_CORE_DIR + + if [[ $WP_VERSION == 'nightly' || $WP_VERSION == 'trunk' ]]; then + mkdir -p $TMPDIR/wordpress-trunk + rm -rf $TMPDIR/wordpress-trunk/* + svn export --quiet https://core.svn.wordpress.org/trunk $TMPDIR/wordpress-trunk/wordpress + mv $TMPDIR/wordpress-trunk/wordpress/* $WP_CORE_DIR + else + if [ $WP_VERSION == 'latest' ]; then + local ARCHIVE_NAME='latest' + elif [[ $WP_VERSION =~ [0-9]+\.[0-9]+ ]]; then + # https serves multiple offers, whereas http serves single. + download https://api.wordpress.org/core/version-check/1.7/ $TMPDIR/wp-latest.json + if [[ $WP_VERSION =~ [0-9]+\.[0-9]+\.[0] ]]; then + # version x.x.0 means the first release of the major version, so strip off the .0 and download version x.x + LATEST_VERSION=${WP_VERSION%??} + else + # otherwise, scan the releases and get the most up to date minor version of the major release + local VERSION_ESCAPED=`echo $WP_VERSION | sed 's/\./\\\\./g'` + LATEST_VERSION=$(grep -o '"version":"'$VERSION_ESCAPED'[^"]*' $TMPDIR/wp-latest.json | sed 's/"version":"//' | head -1) + fi + if [[ -z "$LATEST_VERSION" ]]; then + local ARCHIVE_NAME="wordpress-$WP_VERSION" + else + local ARCHIVE_NAME="wordpress-$LATEST_VERSION" + fi + else + local ARCHIVE_NAME="wordpress-$WP_VERSION" + fi + download https://wordpress.org/${ARCHIVE_NAME}.tar.gz $TMPDIR/wordpress.tar.gz + tar --strip-components=1 -zxmf $TMPDIR/wordpress.tar.gz -C $WP_CORE_DIR + fi + + download https://raw.githubusercontent.com/markoheijnen/wp-mysqli/master/db.php $WP_CORE_DIR/wp-content/db.php +} + +install_test_suite() { + # portable in-place argument for both GNU sed and Mac OSX sed + if [[ $(uname -s) == 'Darwin' ]]; then + local ioption='-i.bak' + else + local ioption='-i' + fi + + # set up testing suite if it doesn't yet exist + if [ ! -d $WP_TESTS_DIR ]; then + # set up testing suite + mkdir -p $WP_TESTS_DIR + rm -rf $WP_TESTS_DIR/{includes,data} + svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/includes/ $WP_TESTS_DIR/includes + svn export --quiet --ignore-externals https://develop.svn.wordpress.org/${WP_TESTS_TAG}/tests/phpunit/data/ $WP_TESTS_DIR/data + fi + + if [ ! -f wp-tests-config.php ]; then + download https://develop.svn.wordpress.org/${WP_TESTS_TAG}/wp-tests-config-sample.php "$WP_TESTS_DIR"/wp-tests-config.php + # remove all forward slashes in the end + WP_CORE_DIR=$(echo $WP_CORE_DIR | sed "s:/\+$::") + sed $ioption "s:dirname( __FILE__ ) . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s:__DIR__ . '/src/':'$WP_CORE_DIR/':" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/youremptytestdbnamehere/$DB_NAME/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/yourusernamehere/$DB_USER/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s/yourpasswordhere/$DB_PASS/" "$WP_TESTS_DIR"/wp-tests-config.php + sed $ioption "s|localhost|${DB_HOST}|" "$WP_TESTS_DIR"/wp-tests-config.php + fi + +} + +recreate_db() { + shopt -s nocasematch + if [[ $1 =~ ^(y|yes)$ ]] + then + mysqladmin drop $DB_NAME -f --user="$DB_USER" --password="$DB_PASS"$EXTRA + create_db + echo "Recreated the database ($DB_NAME)." + else + echo "Leaving the existing database ($DB_NAME) in place." + fi + shopt -u nocasematch +} + +create_db() { + mysqladmin create $DB_NAME --user="$DB_USER" --password="$DB_PASS"$EXTRA +} + +install_db() { + + if [ ${SKIP_DB_CREATE} = "true" ]; then + return 0 + fi + + # parse DB_HOST for port or socket references + local PARTS=(${DB_HOST//\:/ }) + local DB_HOSTNAME=${PARTS[0]}; + local DB_SOCK_OR_PORT=${PARTS[1]}; + local EXTRA="" + + if ! [ -z $DB_HOSTNAME ] ; then + if [ $(echo $DB_SOCK_OR_PORT | grep -e '^[0-9]\{1,\}$') ]; then + EXTRA=" --host=$DB_HOSTNAME --port=$DB_SOCK_OR_PORT --protocol=tcp" + elif ! [ -z $DB_SOCK_OR_PORT ] ; then + EXTRA=" --socket=$DB_SOCK_OR_PORT" + elif ! [ -z $DB_HOSTNAME ] ; then + EXTRA=" --host=$DB_HOSTNAME --protocol=tcp" + fi + fi + + # create database + if [ $(mysql --user="$DB_USER" --password="$DB_PASS"$EXTRA --execute='show databases;' | grep ^$DB_NAME$) ] + then + echo "Reinstalling will delete the existing test database ($DB_NAME)" + read -p 'Are you sure you want to proceed? [y/N]: ' DELETE_EXISTING_DB + recreate_db $DELETE_EXISTING_DB + else + create_db + fi +} + +install_wp +install_test_suite +install_db diff --git a/blocks/.editorconfig b/blocks/.editorconfig new file mode 100644 index 0000000..b5df0fc --- /dev/null +++ b/blocks/.editorconfig @@ -0,0 +1,18 @@ +# This file is for unifying the coding style for different editors and IDEs +# editorconfig.org + +# WordPress Coding Standards +# https://make.wordpress.org/core/handbook/coding-standards/ + +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = tab + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 diff --git a/blocks/.eslintrc.json b/blocks/.eslintrc.json new file mode 100644 index 0000000..e4451cc --- /dev/null +++ b/blocks/.eslintrc.json @@ -0,0 +1,19 @@ +{ + "extends": [ + "plugin:@wordpress/eslint-plugin/recommended" +], + "parserOptions": { + "ecmaVersion": 2021, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } +}, + "env": { + "browser": true, + "es6": true +}, + "rules": { + // Any custom rules you want to add or override +} +} diff --git a/blocks/.gitignore b/blocks/.gitignore new file mode 100644 index 0000000..f66335e --- /dev/null +++ b/blocks/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Coverage directory used by tools like istanbul +coverage + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Output of `npm pack` +*.tgz + +# Output of `wp-scripts plugin-zip` +*.zip + +# dotenv environment variables file +.env diff --git a/blocks/__mocks__/@wordpress/block-editor.js b/blocks/__mocks__/@wordpress/block-editor.js new file mode 100644 index 0000000..8929ef9 --- /dev/null +++ b/blocks/__mocks__/@wordpress/block-editor.js @@ -0,0 +1,7 @@ +export const useBlockProps = jest.fn( () => ( {} ) ); // Default behavior for `edit.js` + +useBlockProps.save = jest.fn( () => ( { + className: 'wp-block-documentcloud', +} ) ); + +export const InspectorControls = ( { children } ) =>
{ children }
; diff --git a/blocks/__mocks__/@wordpress/components.js b/blocks/__mocks__/@wordpress/components.js new file mode 100644 index 0000000..0f297d4 --- /dev/null +++ b/blocks/__mocks__/@wordpress/components.js @@ -0,0 +1,53 @@ +export const PanelBody = ( { children } ) =>
{ children }
; +export const PanelRow = ( { children } ) =>
{ children }
; +export const TextControl = ( { + label, + value, + onChange, + placeholder, + help, +} ) => { + const id = label + ? `text-control-${ label.replace( /\s+/g, '-' ).toLowerCase() }` + : 'text-control-undefined'; + return ( +
+ { label && } + onChange( e.target.value ) } + type="text" + /> + { help && ( +

{ help }

+ ) } +
+ ); +}; +export const ToggleControl = ( { label, checked, onChange } ) => { + const id = `toggle-control-${ label.replace( /\s+/g, '-' ).toLowerCase() }`; + return ( +
+ + onChange( e.target.checked ) } + /> +
+ ); +}; +export const Placeholder = ( { children, instructions } ) => ( +
+ { instructions &&

{ instructions }

} + { children } +
+); +export const Button = ( { children, onClick } ) => ( + +); +export const Notice = ( { children } ) =>
{ children }
; +export const Spinner = () =>
Loading...
; diff --git a/blocks/__mocks__/@wordpress/compose.js b/blocks/__mocks__/@wordpress/compose.js new file mode 100644 index 0000000..c3c1914 --- /dev/null +++ b/blocks/__mocks__/@wordpress/compose.js @@ -0,0 +1,5 @@ +export const debounce = jest.fn( ( fn ) => { + const debouncedFn = ( ...args ) => fn( ...args ); + debouncedFn.cancel = jest.fn(); + return debouncedFn; +} ); diff --git a/blocks/__mocks__/@wordpress/core-data.js b/blocks/__mocks__/@wordpress/core-data.js new file mode 100644 index 0000000..35f013a --- /dev/null +++ b/blocks/__mocks__/@wordpress/core-data.js @@ -0,0 +1,12 @@ +export const store = 'core'; + +export const getEntityRecord = jest.fn( ( kind, name ) => { + if ( kind === 'root' && name === 'site' ) { + return { + documentcloud_default_height: '600', + documentcloud_default_width: '800', + documentcloud_full_width: '1200', + }; + } + return null; +} ); diff --git a/blocks/__mocks__/@wordpress/data.js b/blocks/__mocks__/@wordpress/data.js new file mode 100644 index 0000000..de69979 --- /dev/null +++ b/blocks/__mocks__/@wordpress/data.js @@ -0,0 +1,21 @@ +export const useSelect = jest.fn( ( selector ) => + selector( ( store ) => { + if ( store === 'core' ) { + return { + getEntityRecord: jest.fn( ( kind, name ) => { + if ( kind === 'root' && name === 'site' ) { + return { + documentcloud_default_height: '600', + documentcloud_default_width: '800', + documentcloud_full_width: '1200', + }; + } + return null; + } ), + }; + } + return {}; + } ) +); + +export const useDispatch = jest.fn( () => ( {} ) ); diff --git a/blocks/__mocks__/@wordpress/element.js b/blocks/__mocks__/@wordpress/element.js new file mode 100644 index 0000000..1d4c8f4 --- /dev/null +++ b/blocks/__mocks__/@wordpress/element.js @@ -0,0 +1,2 @@ +import React from 'react'; +export * from 'react'; diff --git a/blocks/__mocks__/@wordpress/i18n.js b/blocks/__mocks__/@wordpress/i18n.js new file mode 100644 index 0000000..f19339b --- /dev/null +++ b/blocks/__mocks__/@wordpress/i18n.js @@ -0,0 +1,2 @@ +// Mock __, just return the untranslated string. +export const __ = jest.fn( ( string ) => string ); diff --git a/blocks/__mocks__/svgMock.js b/blocks/__mocks__/svgMock.js new file mode 100644 index 0000000..b6b7ddd --- /dev/null +++ b/blocks/__mocks__/svgMock.js @@ -0,0 +1,2 @@ +export default 'SvgMock'; +export const ReactComponent = 'SvgMock'; diff --git a/blocks/__tests__/__snapshots__/save.test.js.snap b/blocks/__tests__/__snapshots__/save.test.js.snap new file mode 100644 index 0000000..ebefa9b --- /dev/null +++ b/blocks/__tests__/__snapshots__/save.test.js.snap @@ -0,0 +1,17 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`DocumentCloud Block Save Component matches the snapshot 1`] = ` +
+
+
+ ', + }; + + const { container } = render( save( { attributes } ) ); + + // Ensure the container is rendered with the correct className + expect( container.firstChild ).toHaveClass( 'wp-block-documentcloud' ); + // Ensure the embedded HTML is rendered inside the container + expect( + container.querySelector( '.documentcloud-embed' ) + ).toBeInTheDocument(); + expect( + container.querySelector( '.documentcloud-embed' ).innerHTML + ).toBe( + '' + ); + } ); + + // add snapshot test + it( 'matches the snapshot', () => { + const attributes = { + embeddedHtml: + '', + }; + + const { container } = render( save( { attributes } ) ); + + expect( container ).toMatchSnapshot(); + } ); +} ); diff --git a/blocks/__tests__/utils.test.js b/blocks/__tests__/utils.test.js new file mode 100644 index 0000000..eef784e --- /dev/null +++ b/blocks/__tests__/utils.test.js @@ -0,0 +1,146 @@ +import { + getDocumentCloudUrlType, + getEmbedUrl, + getOEmbedApiUrl, + parseDocumentCloudUrl, + cleanDocumentCloudUrl, +} from '../src/documentcloud/utils/utils'; + +describe( 'DocumentCloud Utils', () => { + // Tests for getDocumentCloudUrlType + describe( 'getDocumentCloudUrlType', () => { + it( 'should return "document" for an empty URL', () => { + // Verifies that an empty URL is treated as a standard document + expect( getDocumentCloudUrlType( '' ) ).toBe( 'document' ); + } ); + + it( 'should return "note" for a note URL', () => { + // Checks if a URL with a note fragment is identified as a "note" + const url = + 'https://www.documentcloud.org/documents/123#document/p1/a1'; + expect( getDocumentCloudUrlType( url ) ).toBe( 'note' ); + } ); + + it( 'should return "note" for a note URL with a different pattern', () => { + // Ensures that a note URL with an alternate structure is identified as a "note" + const url = + 'https://embed.documentcloud.org/documents/282753/annotations/42225/?embed=1'; + expect( getDocumentCloudUrlType( url ) ).toBe( 'note' ); + } ); + + it( 'should return "page" for a page URL', () => { + // Validates that a URL pointing to a specific page is identified as a "page" + const url = + 'https://www.documentcloud.org/documents/123#document/p1'; + expect( getDocumentCloudUrlType( url ) ).toBe( 'page' ); + } ); + + it( 'should return "document" for a standard document URL', () => { + // Confirms that a standard document URL is identified as "document" + const url = 'https://www.documentcloud.org/documents/123'; + expect( getDocumentCloudUrlType( url ) ).toBe( 'document' ); + } ); + } ); + + // Tests for getEmbedUrl + describe( 'getEmbedUrl', () => { + it( 'should return an empty string if no documentId or URL is provided', () => { + // Ensures that an empty string is returned when no parameters are provided + expect( getEmbedUrl( {} ) ).toBe( '' ); + } ); + + it( 'should generate an embed URL using documentId', () => { + // Verifies that an embed URL is correctly generated using a document ID + const params = { + useDocumentId: true, + documentId: '123', + title: true, + fullscreen: false, + onlyshoworg: false, + pdf: true, + style: 'custom-style', + responsive: true, + }; + expect( getEmbedUrl( params ) ).toBe( + 'https://www.documentcloud.org/documents/123?embed=1&title=1&fullscreen=0&onlyshoworg=0&pdf=1&style=custom-style&responsive=1' + ); + } ); + + it( 'should generate an embed URL using a URL', () => { + // Validates that an embed URL is correctly generated using a full URL + const params = { + useDocumentId: false, + url: 'https://embed.documentcloud.org/documents/24479621-24-03-13-epic-motion-to-enforce-injunction', + title: false, + fullscreen: true, + onlyshoworg: true, + pdf: false, + style: 'border: 1px solid #000;', + responsive: false, + }; + expect( getEmbedUrl( params ) ).toBe( + 'https://embed.documentcloud.org/documents/24479621-24-03-13-epic-motion-to-enforce-injunction?embed=1&title=0&fullscreen=1&onlyshoworg=1&pdf=0&style=border%3A%201px%20solid%20%23000%3B&responsive=0' + ); + } ); + } ); + + // Tests for getOEmbedApiUrl + describe( 'getOEmbedApiUrl', () => { + it( 'should return an empty string if no document URL is provided', () => { + // Ensures that an empty string is returned when no URL is provided + expect( getOEmbedApiUrl( '', '', '' ) ).toBe( '' ); + } ); + + it( 'should generate an oEmbed API URL with width and height', () => { + // Verifies that the oEmbed API URL is correctly generated with width and height + const url = 'https://www.documentcloud.org/documents/123'; + expect( getOEmbedApiUrl( url, '800', '600' ) ).toBe( + 'https://api.www.documentcloud.org/api/oembed/?url=https%3A%2F%2Fwww.documentcloud.org%2Fdocuments%2F123&format=json&dnt=1&maxwidth=800&maxheight=600' + ); + } ); + } ); + + // Tests for parseDocumentCloudUrl + describe( 'parseDocumentCloudUrl', () => { + it( 'should return an empty object for an empty URL', () => { + // Ensures that an empty object is returned for an empty URL + expect( parseDocumentCloudUrl( '' ) ).toEqual( {} ); + } ); + + it( 'should parse a standard document URL', () => { + // Validates that a standard document URL is parsed correctly + const url = + 'https://www.documentcloud.org/documents/282753-lefler-thesis'; + expect( parseDocumentCloudUrl( url ) ).toEqual( { + protocol: 'https', + dc_host: 'www.documentcloud.org', + document_slug: '282753-lefler-thesis', + } ); + } ); + + it( 'should parse a page URL', () => { + // Verifies that a URL pointing to a specific page is parsed correctly + const url = + 'https://www.documentcloud.org/documents/282753-lefler-thesis/#document/p13'; + expect( parseDocumentCloudUrl( url ) ).toEqual( { + protocol: 'https', + dc_host: 'www.documentcloud.org', + document_slug: '282753-lefler-thesis', + page_number: '13', + } ); + } ); + + it( 'should parse a note URL', () => { + // Ensures that a URL containing a note is parsed correctly + const url = + 'https://www.documentcloud.org/documents/282753-lefler-thesis/#document/p1/a53674'; + expect( parseDocumentCloudUrl( url ) ).toEqual( { + protocol: 'https', + dc_host: 'www.documentcloud.org', + document_slug: '282753-lefler-thesis', + note_id: '53674', + page_number: '1', + } ); + } ); + } ); +} ); diff --git a/blocks/babel.config.cjs b/blocks/babel.config.cjs new file mode 100644 index 0000000..0c07624 --- /dev/null +++ b/blocks/babel.config.cjs @@ -0,0 +1,6 @@ +module.exports = { + presets: [ + '@babel/preset-env', + ['@babel/preset-react', { runtime: 'automatic' }], + ], +}; \ No newline at end of file diff --git a/blocks/build/blocks-manifest.php b/blocks/build/blocks-manifest.php new file mode 100644 index 0000000..4fe3327 --- /dev/null +++ b/blocks/build/blocks-manifest.php @@ -0,0 +1,65 @@ + array( + '$schema' => 'https://schemas.wp.org/trunk/block.json', + 'apiVersion' => 3, + 'name' => 'documentcloud/documentcloud', + 'version' => '0.1.0', + 'title' => 'DocumentCloud', + 'category' => 'embed', + 'description' => 'Allows embedding the DocumentCloud documents, pages and notes on your page.', + 'example' => array( + + ), + 'attributes' => array( + 'url' => array( + 'type' => 'string', + 'default' => '' + ), + 'documentId' => array( + 'type' => 'string', + 'default' => '' + ), + 'useDocumentId' => array( + 'type' => 'boolean', + 'default' => false + ), + 'height' => array( + 'type' => 'string', + 'default' => '' + ), + 'width' => array( + 'type' => 'string', + 'default' => '' + ), + 'title' => array( + 'type' => 'boolean', + 'default' => true + ), + 'fullscreen' => array( + 'type' => 'boolean', + 'default' => true + ), + 'onlyshoworg' => array( + 'type' => 'boolean', + 'default' => false + ), + 'pdf' => array( + 'type' => 'boolean', + 'default' => null + ), + 'embeddedHtml' => array( + 'type' => 'string', + 'default' => '' + ) + ), + 'supports' => array( + 'html' => false, + 'align' => true + ), + 'textdomain' => 'documentcloud', + 'editorScript' => 'file:./index.js', + 'editorStyle' => 'file:./index.css' + ) +); diff --git a/blocks/build/documentcloud/block.json b/blocks/build/documentcloud/block.json new file mode 100644 index 0000000..6b53d88 --- /dev/null +++ b/blocks/build/documentcloud/block.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "documentcloud/documentcloud", + "version": "0.1.0", + "title": "DocumentCloud", + "category": "embed", + "description": "Allows embedding the DocumentCloud documents, pages and notes on your page.", + "example": {}, + "attributes": { + "url": { + "type": "string", + "default": "" + }, + "documentId": { + "type": "string", + "default": "" + }, + "useDocumentId": { + "type": "boolean", + "default": false + }, + "height": { + "type": "string", + "default": "" + }, + "width": { + "type": "string", + "default": "" + }, + "title": { + "type": "boolean", + "default": true + }, + "fullscreen": { + "type": "boolean", + "default": true + }, + "onlyshoworg": { + "type": "boolean", + "default": false + }, + "pdf": { + "type": "boolean", + "default": null + }, + "embeddedHtml": { + "type": "string", + "default": "" + } + }, + "supports": { + "html": false, + "align": true + }, + "textdomain": "documentcloud", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css" +} \ No newline at end of file diff --git a/blocks/build/documentcloud/index-rtl.css b/blocks/build/documentcloud/index-rtl.css new file mode 100644 index 0000000..5914be3 --- /dev/null +++ b/blocks/build/documentcloud/index-rtl.css @@ -0,0 +1 @@ +.wp-block-documentcloud-documentcloud .documentcloud-oembed{height:auto;width:auto}.wp-block-documentcloud-documentcloud .documentcloud-error-container .documentcloud-preview-footer{margin-top:10px}.wp-block-documentcloud-documentcloud .documentcloud-input-wrapper{width:inherit}.wp-block-documentcloud-documentcloud .documentcloud-input-row{display:flex;gap:10px}.wp-block-documentcloud-documentcloud .documentcloud-input-row button{height:32px;margin-top:0}.wp-block-documentcloud-documentcloud .documentcloud-input-row input{width:311px}@media(max-width:500px){.wp-block-documentcloud-documentcloud .documentcloud-input-row{flex-wrap:wrap;width:100%}.wp-block-documentcloud-documentcloud .documentcloud-input-row .components-base-control,.wp-block-documentcloud-documentcloud .documentcloud-input-row .components-base-control__field{width:100%}.wp-block-documentcloud-documentcloud .documentcloud-input-row input{position:relative;width:100%}.wp-block-documentcloud-documentcloud .documentcloud-input-row button{width:100%}}.wp-block-documentcloud-documentcloud .documentcloud-overlay{background:transparent;cursor:pointer;height:100%;right:0;position:absolute;top:0;width:100%;z-index:10}.wp-block-documentcloud-documentcloud .documentcloud-preview{position:relative}.block-editor-block-list__layout .wp-block-documentcloud-documentcloud.block-editor-block-list__block:not([contenteditable=true]):focus:after{left:-2px}.components-panel__row .components-base-control{width:100%} diff --git a/blocks/build/documentcloud/index.asset.php b/blocks/build/documentcloud/index.asset.php new file mode 100644 index 0000000..147ef6b --- /dev/null +++ b/blocks/build/documentcloud/index.asset.php @@ -0,0 +1 @@ + array('react', 'react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'd389acc9710d4bc5b62a'); diff --git a/blocks/build/documentcloud/index.css b/blocks/build/documentcloud/index.css new file mode 100644 index 0000000..6a5837f --- /dev/null +++ b/blocks/build/documentcloud/index.css @@ -0,0 +1 @@ +.wp-block-documentcloud-documentcloud .documentcloud-oembed{height:auto;width:auto}.wp-block-documentcloud-documentcloud .documentcloud-error-container .documentcloud-preview-footer{margin-top:10px}.wp-block-documentcloud-documentcloud .documentcloud-input-wrapper{width:inherit}.wp-block-documentcloud-documentcloud .documentcloud-input-row{display:flex;gap:10px}.wp-block-documentcloud-documentcloud .documentcloud-input-row button{height:32px;margin-top:0}.wp-block-documentcloud-documentcloud .documentcloud-input-row input{width:311px}@media(max-width:500px){.wp-block-documentcloud-documentcloud .documentcloud-input-row{flex-wrap:wrap;width:100%}.wp-block-documentcloud-documentcloud .documentcloud-input-row .components-base-control,.wp-block-documentcloud-documentcloud .documentcloud-input-row .components-base-control__field{width:100%}.wp-block-documentcloud-documentcloud .documentcloud-input-row input{position:relative;width:100%}.wp-block-documentcloud-documentcloud .documentcloud-input-row button{width:100%}}.wp-block-documentcloud-documentcloud .documentcloud-overlay{background:transparent;cursor:pointer;height:100%;left:0;position:absolute;top:0;width:100%;z-index:10}.wp-block-documentcloud-documentcloud .documentcloud-preview{position:relative}.block-editor-block-list__layout .wp-block-documentcloud-documentcloud.block-editor-block-list__block:not([contenteditable=true]):focus:after{right:-2px}.components-panel__row .components-base-control{width:100%} diff --git a/blocks/build/documentcloud/index.js b/blocks/build/documentcloud/index.js new file mode 100644 index 0000000..9d891a7 --- /dev/null +++ b/blocks/build/documentcloud/index.js @@ -0,0 +1 @@ +(()=>{"use strict";const e=window.wp.blocks,t=window.wp.i18n,n=window.wp.blockEditor,o=window.wp.components,c=window.wp.element,l=window.wp.compose,u="(https?):\\/\\/([\\w.-]*documentcloud\\.org)\\/documents\\/([0-9]+(?:-[\\w\\d%-]*)?)",d=[{type:"document",regex:new RegExp(`^${u}(\\.html)?$`)},{type:"page_hash",regex:new RegExp(`^${u}(\\.html)?\\/?\\??.*#document\\/p([0-9]+)$`),pageGroup:5},{type:"page_ext",regex:new RegExp(`^${u}\\/pages\\/([0-9]+)\\.(html|js)$`),pageGroup:4},{type:"page_no_ext",regex:new RegExp(`^${u}\\/pages\\/([0-9]+)\\/?\\??.*$`),pageGroup:4},{type:"note_annotations",regex:new RegExp(`^${u}\\/annotations\\/([0-9]+)\\.(html|js)$`),noteGroup:4},{type:"note_annotations_embed",regex:new RegExp(`^${u}\\/annotations\\/([0-9]+)\\/?\\??.*$`),noteGroup:4},{type:"note_hash_page",regex:new RegExp(`^${u}(\\.html)?\\/?\\??.*#document\\/p([0-9]+)\\/a([0-9]+)$`),pageGroup:5,noteGroup:6},{type:"note_hash_annotation",regex:new RegExp(`^${u}(\\.html)?\\/?\\??.*#annotation\\/a([0-9]+)(\\.[a-z]+)?$`),noteGroup:5}];function r(e){if(!e)return"document";const t=s(e);return t.note_id?"note":t.page_number?"page":e.includes("/annotations/")?"note":"document"}const s=e=>{if(!e)return{};const t=function(e){return e.includes("/pages/")?d.filter((e=>"page_ext"===e.type||"page_no_ext"===e.type)):e.includes("/annotations/")?d.filter((e=>"note_annotations"===e.type)):e.includes("#document/p")?e.includes("/a")?d.filter((e=>"note_hash_page"===e.type)):d.filter((e=>"page_hash"===e.type)):e.includes("#annotation/a")?d.filter((e=>"note_hash_annotation"===e.type)):d.filter((e=>"document"===e.type))}(e);for(const n of t){const t=e.match(n.regex);if(t){const e={protocol:t[1],dc_host:t[2],document_slug:t[3]};return n.pageGroup&&t[n.pageGroup]&&(e.page_number=t[n.pageGroup]),n.noteGroup&&t[n.noteGroup]&&(e.note_id=t[n.noteGroup]),e}}return{}},a=window.ReactJSXRuntime;function i({embeddedHtml:e,isLoading:l,fetchError:u,onChangeDocument:d}){const r=(0,c.useRef)(null),s=(0,n.useBlockProps)(),i=(0,c.useMemo)((()=>s.className?.includes("is-selected")),[s.className]);return null===l||l?(0,a.jsxs)("div",{className:"documentcloud-loading",children:[(0,a.jsx)(o.Spinner,{}),(0,a.jsx)("p",{children:(0,t.__)("Loading documentโ€ฆ","documentcloud")})]}):u?(0,a.jsxs)("div",{className:"documentcloud-error-container",children:[(0,a.jsx)(o.Notice,{status:"error",isDismissible:!1,children:u}),(0,a.jsx)(m,{onChangeDocument:d})]}):e?(0,a.jsxs)("div",{className:"documentcloud-preview",ref:r,children:[(0,a.jsx)("div",{className:"documentcloud-embed documentcloud-oembed",dangerouslySetInnerHTML:{__html:e}}),i?null:(0,a.jsx)("div",{className:"documentcloud-overlay"}),(0,a.jsx)(m,{onChangeDocument:d})]}):(0,a.jsxs)("div",{className:"documentcloud-preview",ref:r,children:[(0,a.jsx)("div",{className:"documentcloud-placeholder",children:(0,a.jsx)("p",{children:(0,t.__)("Document preview not available.","documentcloud")})}),(0,a.jsx)(m,{onChangeDocument:d})]})}function m({onChangeDocument:e}){return(0,a.jsx)("div",{className:"documentcloud-preview-footer",children:(0,a.jsx)(o.Button,{variant:"secondary",onClick:e,className:"documentcloud-clear-button",children:(0,t.__)("Change Document","documentcloud")})})}const h=window.React;var p,g;function _(){return _=Object.assign?Object.assign.bind():function(e){for(var t=1;t""===j),[j]),M="document"===I,O=(0,c.useCallback)(((e,t)=>{k((n=>({...n,[e]:t}))),u({[e]:t})}),[u]),z=(0,c.useCallback)((e=>{D(e),v("")}),[]),F=(0,c.useCallback)((e=>{/[^0-9]/.test(String(String(e).trim()))?v((0,t.__)("Document ID can only contain digits.","documentcloud")):(E(e),v(""))}),[]),q=(0,c.useCallback)((()=>{u({useDocumentId:!m}),v("")}),[m,u]),A=(0,c.useCallback)((e=>{e.preventDefault(),$(null);try{if(m){const e=R.trim(),n=e?{valid:!0,message:""}:{valid:!1,message:(0,t.__)("Please enter a DocumentCloud ID.","documentcloud")};v(n.message),n.valid&&(u({documentId:e,url:"",embeddedHtml:""}),B("document"),T(!1))}else{let e=C.trim();const n=(e=>{if(!e)return{valid:!1,message:(0,t.__)("Please enter a DocumentCloud URL.","documentcloud")};const n=e.trim(),o=new Set(["documentcloud.org","www.documentcloud.org","beta.documentcloud.org","embed.documentcloud.org","assets.documentcloud.org"]);try{const e=new URL(n);return"https:"!==e.protocol?{valid:!1,message:(0,t.__)("URL must use HTTPS protocol.","documentcloud")}:o.has(e.hostname)?{valid:!0,message:""}:{valid:!1,message:(0,t.__)("URL must be from a valid DocumentCloud domain.","documentcloud")}}catch(e){return{valid:!1,message:(0,t.__)("Please enter a valid URL.","documentcloud")}}})(e);if(v(n.message),n.valid){const t=r(e);if(B(t),"document"===t){const t=((e,t,n)=>{if(!e)return;const o=new URL(e);if(o)try{const e=o.searchParams,c=e.get("height");e.delete("height"),c&&t("height",c);const l=e.get("width");e.delete("width"),l&&t("width",l);const u=String(e.get("title"));e.delete("title"),["0","1"].includes(u)&&n({title:"1"===u});const d=String(e.get("onlyshoworg"));e.delete("onlyshoworg"),["0","1"].includes(d)&&n({onlyshoworg:"1"===d});const r=String(e.get("fullscreen"));e.delete("fullscreen"),["0","1"].includes(r)&&n({fullscreen:"1"===r});const s=String(e.get("pdf"));e.delete("pdf"),["0","1"].includes(s)&&n({pdf:"1"===s})}catch{}return o})(e,O,u);t&&(e=t.toString())}u({url:e,documentId:"",embeddedHtml:""}),T(!1)}}}catch(e){v((0,t.__)("An unexpected error occurred. Please try again.","documentcloud"))}}),[m,R,C,u,O]),J=(0,c.useCallback)((()=>{T(!0),v("")}),[]),W=(0,c.useCallback)((()=>{const e=0===String(N.width).length&&0===String(N.height).length;return(({useDocumentId:e,documentId:t,url:n,title:o,fullscreen:c,onlyshoworg:l,pdf:u,style:d,responsive:s=!0})=>{if(!(e?t:n))return"";let a="";e&&t?a=`https://www.documentcloud.org/documents/${encodeURIComponent(t.trim())}`:!e&&n&&(a=n.trim(),a.startsWith("https://")||(a=a.replace(/^http:\/\//,"https://")));const i=r(a);if(("page"===i||"note"===i)&&(a.includes("#document/p")||a.includes("#annotation/a"))){if(!a.includes("embed=1"))if(a.includes("?"))a=a.replace("?","?embed=1&");else{const e=a.indexOf("#");-1!==e?a=a.substring(0,e)+"?embed=1"+a.substring(e):a+="?embed=1"}return a}"boolean"!=typeof o&&(o=!0),"boolean"!=typeof c&&(c=!0);const m={embed:1,title:o?1:0,fullscreen:c?1:0,onlyshoworg:l?1:0,pdf:u?1:0,style:d||"",responsive:s?1:0},h=Object.entries(m).filter((([,e])=>""!==e)).map((([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`)).join("&");return h?`${a}?${h}`:a})({useDocumentId:m,documentId:s,url:d,title:g,fullscreen:_,onlyshoworg:f,pdf:x,width:N.width,height:N.height,responsive:e})}),[m,s,d,g,_,f,x,N]),V=(0,c.useCallback)((()=>((e,t,n)=>{if(!e)return"";const o=new URLSearchParams;if(o.append("url",e),o.append("format","json"),o.append("dnt","1"),t){const e=t.toString().replace(/[^0-9]/g,"");e&&o.append("maxwidth",e)}if(n){const e=n.toString().replace(/[^0-9]/g,"");e&&o.append("maxheight",e)}return`https://api.www.documentcloud.org/api/oembed/?${o.toString()}`})(W(),p,h)),[W,p,h]);(0,c.useEffect)((()=>(U.current=!0,()=>{U.current=!1})),[]),(0,c.useEffect)((()=>{H&&(D(d||""),E(s||""))}),[H,d,s]),(0,c.useEffect)((()=>{d&&U.current&&B(r(d))}),[d]),(0,c.useEffect)((()=>{U.current&&k({width:p||"",height:h||""})}),[p,h]),(0,c.useEffect)((()=>(L.current=(0,l.debounce)((async e=>{if(!e||H||!G||!U.current)return;$(!0),S("");const{html:t,error:n}=await(async e=>{try{const t=await fetch(e);if(!t.ok)throw new Error(`HTTP error! Status: ${t.status}`);return{html:(await t.json()).html||"",error:""}}catch(e){return{html:"",error:"Failed to load document preview."}}})(e);U.current&&(n&&S(n),u({embeddedHtml:t}),$(!1))}),700),()=>{L.current&&L.current.cancel()})),[H,G,u]),(0,c.useEffect)((()=>{const e=V();e&&!H&&G&&L.current&&L.current(e)}),[V,H,G]);const X=(0,n.useBlockProps)();return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n.InspectorControls,{children:[(0,a.jsxs)(o.PanelBody,{title:(0,t.__)("Document Settings","documentcloud"),initialOpen:!0,children:[(0,a.jsx)(o.PanelRow,{children:(0,a.jsx)(o.TextControl,{__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0,type:"number",label:(0,t.__)("Height","documentcloud"),value:N.height,onChange:e=>O("height",e),help:(0,t.__)("Set the height (Only numeric values allowed).","documentcloud")})}),(0,a.jsx)(o.PanelRow,{children:(0,a.jsx)(o.TextControl,{__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0,type:"number",label:(0,t.__)("Width","documentcloud"),value:N.width,onChange:e=>O("width",e),help:(0,t.__)("Set the width (Only Numberic Values are allowed).","documentcloud")})})]}),M&&(0,a.jsxs)(o.PanelBody,{title:(0,t.__)("Display Options","documentcloud"),initialOpen:!0,children:[(0,a.jsx)(o.PanelRow,{children:(0,a.jsx)(o.ToggleControl,{__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0,label:(0,t.__)("Show Title","documentcloud"),checked:g,onChange:()=>u({title:!g}),help:(0,t.__)("Show document title and contributor name.","documentcloud")})}),(0,a.jsx)(o.PanelRow,{children:(0,a.jsx)(o.ToggleControl,{__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0,label:(0,t.__)("Show Fullscreen Button","documentcloud"),checked:_,onChange:()=>u({fullscreen:!_}),help:(0,t.__)("Show fullscreen control.","documentcloud")})}),(0,a.jsx)(o.PanelRow,{children:(0,a.jsx)(o.ToggleControl,{__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0,label:(0,t.__)("Only Show Organization","documentcloud"),checked:f,onChange:()=>u({onlyshoworg:!f}),help:(0,t.__)("Show affiliation without username.","documentcloud")})}),(0,a.jsx)(o.PanelRow,{children:(0,a.jsx)(o.ToggleControl,{__next40pxDefaultSize:!0,__nextHasNoMarginBottom:!0,label:(0,t.__)("Show PDF Download Link","documentcloud"),checked:x,onChange:()=>u({pdf:!x}),help:(0,t.__)("Shows PDF download link.","documentcloud")})})]})]}),(0,a.jsx)("div",{...X,children:!H&&G?(0,a.jsx)(i,{embeddedHtml:b,isLoading:P,fetchError:y,urlType:I,width:p,height:h,onChangeDocument:J}):(0,a.jsxs)(o.Placeholder,{icon:(0,a.jsx)(w,{}),label:(0,t.__)("DocumentCloud","documentcloud"),instructions:m?(0,t.__)("Enter a DocumentCloud ID to embed a document.","documentcloud"):(0,t.__)("Enter a DocumentCloud URL to embed a document, page or note.","documentcloud"),children:[!G&&j&&(0,a.jsx)(o.Notice,{status:"error",isDismissible:!1,children:j}),(0,a.jsx)("form",{onSubmit:A,className:"documentcloud-form",children:(0,a.jsxs)("div",{className:"documentcloud-input-wrapper",children:[(0,a.jsx)(o.ToggleControl,{label:(0,t.__)("Use Document ID","documentcloud"),checked:m,onChange:q,help:(0,t.__)("Toggle between URL and Document ID input.","documentcloud")}),(0,a.jsxs)("div",{className:"documentcloud-input-row",children:[m?(0,a.jsx)(a.Fragment,{children:(0,a.jsx)(o.TextControl,{value:R,inputMode:"numeric",pattern:"[0-9]*",onChange:F,type:"text",placeholder:(0,t.__)("123456789","documentcloud"),className:!G&&R?"has-error":""})}):(0,a.jsx)(o.TextControl,{value:C,onChange:z,placeholder:(0,t.__)("https://www.documentcloud.org/documents/โ€ฆ","documentcloud"),className:!G&&C?"has-error":""}),(0,a.jsx)(o.Button,{variant:"primary",type:"submit",children:(0,t.__)("Embed","documentcloud")})]})]})})]})})]})},save:function({attributes:e}){const{embeddedHtml:t}=e,o=n.useBlockProps.save();return t?(0,a.jsx)("div",{...o,children:(0,a.jsx)("div",{className:"documentcloud-embed",dangerouslySetInnerHTML:{__html:t}})}):(0,a.jsx)("div",{...o})}})})(); \ No newline at end of file diff --git a/blocks/jest.config.js b/blocks/jest.config.js new file mode 100644 index 0000000..f75237c --- /dev/null +++ b/blocks/jest.config.js @@ -0,0 +1,6 @@ +module.exports = { + preset: '@wordpress/jest-preset-default', + moduleNameMapper: { + '\\.svg$': '__mocks__/svgMock.js', + }, +}; diff --git a/blocks/package-lock.json b/blocks/package-lock.json new file mode 100644 index 0000000..947a364 --- /dev/null +++ b/blocks/package-lock.json @@ -0,0 +1,17584 @@ +{ + "name": "documentcloud", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "documentcloud", + "version": "0.1.0", + "license": "GPL-2.0-or-later", + "devDependencies": { + "@babel/core": "^7.26.10", + "@babel/preset-env": "^7.26.9", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@wordpress/jest-preset-default": "^12.22.0", + "@wordpress/scripts": "^30.15.0", + "babel-jest": "^29.7.0", + "jest": "^29.7.0", + "jest-fetch-mock": "^3.0.3", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.2.tgz", + "integrity": "sha512-baYZExFpsdkBNuvGKTKWCwKH57HRZLVtycZS05WTQNVOiXVSeAki3nU35zlRbToeMW8aHlJfyS+1C4BOv27q0A==", + "dev": true + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.10", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/template": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.27.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.4", + "dev": true, + "license": "MIT", + "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/helper-member-expression-to-functions": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.26.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.26.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.26.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.26.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.26.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.26.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.27.0", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.25.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.26.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.26.8", + "@babel/helper-compilation-targets": "^7.26.5", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.26.8", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.26.5", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.26.3", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.26.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.26.6", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.26.8", + "@babel/plugin-transform-typeof-symbol": "^7.26.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.11.0", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.40.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.26.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.26.3", + "@babel/plugin-transform-typescript": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.27.0", + "@babel/types": "^7.27.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.27.0", + "@babel/parser": "^7.27.0", + "@babel/template": "^7.27.0", + "@babel/types": "^7.27.0", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "3.0.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@es-joy/jsdoccomment": { + "version": "0.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "comment-parser": "1.4.1", + "esquery": "^1.5.0", + "jsdoc-type-pratt-parser": "~4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "Python-2.0" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/intl-localematcher": "0.6.1", + "decimal.js": "^10.4.3", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.11.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "@formatjs/icu-skeleton-parser": "1.8.14", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "tslib": "^2.8.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^29.7.0", + "jest-util": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/core": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.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.7.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/environment": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "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.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@sinonjs/fake-timers": "^10.0.2", + "@types/node": "*", + "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.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@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", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.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.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", + "v8-to-istanbul": "^9.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { + "version": "6.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/reporters/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-result": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/console": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/test-result": "^29.7.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@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.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", + "write-file-atomic": "^4.0.2" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3" + } + }, + "node_modules/@keyv/serialize/node_modules/buffer": { + "version": "6.0.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@paulirish/trace_engine": { + "version": "0.0.50", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "third-party-web": "latest" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@playwright/test": { + "version": "1.51.1", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright": "1.51.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-html": "^0.0.9", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^4.2.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <5.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@sentry-internal/tracing": { + "version": "7.120.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/core": { + "version": "7.120.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/integrations": { + "version": "7.120.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/core": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/node": { + "version": "7.120.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry-internal/tracing": "7.120.3", + "@sentry/core": "7.120.3", + "@sentry/integrations": "7.120.3", + "@sentry/types": "7.120.3", + "@sentry/utils": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/types": { + "version": "7.120.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@sentry/utils": { + "version": "7.120.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@sentry/types": "7.120.3" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@stylistic/stylelint-plugin": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.1", + "@csstools/css-tokenizer": "^3.0.1", + "@csstools/media-query-list-parser": "^3.0.1", + "is-plain-object": "^5.0.0", + "postcss-selector-parser": "^6.1.2", + "postcss-value-parser": "^4.2.0", + "style-search": "^0.1.0", + "stylelint": "^16.8.2" + }, + "engines": { + "node": "^18.12 || >=20.9" + }, + "peerDependencies": { + "stylelint": "^16.8.0" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "peer": true, + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "peer": true + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.6.3.tgz", + "integrity": "sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==", + "dev": true, + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "9.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/express": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "5.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/express/node_modules/@types/express-serve-static-core": { + "version": "4.19.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/glob": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jsdom": { + "version": "20.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tough-cookie": "*", + "parse5": "^7.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/minimist": { + "version": "1.2.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.18", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/semver": { + "version": "7.7.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/send": { + "version": "0.17.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/stack-utils": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tapable": { + "version": "1.0.12", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uglify-js": { + "version": "3.17.5", + "dev": true, + "license": "MIT", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/webpack": { + "version": "4.41.40", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/ws": { + "version": "8.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.33", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/type-utils": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "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/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz", + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4" + }, + "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/scope-manager": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz", + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "6.21.0", + "@typescript-eslint/utils": "6.21.0", + "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/types": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.21.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/visitor-keys": "6.21.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "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" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz", + "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.21.0", + "@typescript-eslint/types": "6.21.0", + "@typescript-eslint/typescript-estree": "6.21.0", + "semver": "^7.5.4" + }, + "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" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.21.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "6.21.0", + "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/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.13.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.13.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.13.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.14.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webpack-cli/configtest": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/info": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + } + }, + "node_modules/@webpack-cli/serve": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.15.0" + }, + "peerDependencies": { + "webpack": "5.x.x", + "webpack-cli": "5.x.x" + }, + "peerDependenciesMeta": { + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/@wordpress/babel-preset-default": { + "version": "8.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/core": "7.25.7", + "@babel/plugin-transform-react-jsx": "7.25.7", + "@babel/plugin-transform-runtime": "7.25.7", + "@babel/preset-env": "7.25.7", + "@babel/preset-typescript": "7.25.7", + "@babel/runtime": "7.25.7", + "@wordpress/browserslist-config": "^6.22.0", + "@wordpress/warning": "^3.22.0", + "browserslist": "^4.21.10", + "core-js": "^3.31.0", + "react": "^18.3.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.7", + "@babel/helper-module-imports": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/types": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/preset-env": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7", + "@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.25.7", + "@babel/plugin-syntax-import-attributes": "^7.25.7", + "@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", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@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-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.25.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.7", + "@babel/plugin-transform-async-to-generator": "^7.25.7", + "@babel/plugin-transform-block-scoped-functions": "^7.25.7", + "@babel/plugin-transform-block-scoping": "^7.25.7", + "@babel/plugin-transform-class-properties": "^7.25.7", + "@babel/plugin-transform-class-static-block": "^7.25.7", + "@babel/plugin-transform-classes": "^7.25.7", + "@babel/plugin-transform-computed-properties": "^7.25.7", + "@babel/plugin-transform-destructuring": "^7.25.7", + "@babel/plugin-transform-dotall-regex": "^7.25.7", + "@babel/plugin-transform-duplicate-keys": "^7.25.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-dynamic-import": "^7.25.7", + "@babel/plugin-transform-exponentiation-operator": "^7.25.7", + "@babel/plugin-transform-export-namespace-from": "^7.25.7", + "@babel/plugin-transform-for-of": "^7.25.7", + "@babel/plugin-transform-function-name": "^7.25.7", + "@babel/plugin-transform-json-strings": "^7.25.7", + "@babel/plugin-transform-literals": "^7.25.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.7", + "@babel/plugin-transform-member-expression-literals": "^7.25.7", + "@babel/plugin-transform-modules-amd": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-modules-systemjs": "^7.25.7", + "@babel/plugin-transform-modules-umd": "^7.25.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7", + "@babel/plugin-transform-new-target": "^7.25.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7", + "@babel/plugin-transform-numeric-separator": "^7.25.7", + "@babel/plugin-transform-object-rest-spread": "^7.25.7", + "@babel/plugin-transform-object-super": "^7.25.7", + "@babel/plugin-transform-optional-catch-binding": "^7.25.7", + "@babel/plugin-transform-optional-chaining": "^7.25.7", + "@babel/plugin-transform-parameters": "^7.25.7", + "@babel/plugin-transform-private-methods": "^7.25.7", + "@babel/plugin-transform-private-property-in-object": "^7.25.7", + "@babel/plugin-transform-property-literals": "^7.25.7", + "@babel/plugin-transform-regenerator": "^7.25.7", + "@babel/plugin-transform-reserved-words": "^7.25.7", + "@babel/plugin-transform-shorthand-properties": "^7.25.7", + "@babel/plugin-transform-spread": "^7.25.7", + "@babel/plugin-transform-sticky-regex": "^7.25.7", + "@babel/plugin-transform-template-literals": "^7.25.7", + "@babel/plugin-transform-typeof-symbol": "^7.25.7", + "@babel/plugin-transform-unicode-escapes": "^7.25.7", + "@babel/plugin-transform-unicode-property-regex": "^7.25.7", + "@babel/plugin-transform-unicode-regex": "^7.25.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.6", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.38.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/preset-env/node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/preset-env/node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@wordpress/babel-preset-default/node_modules/@babel/preset-typescript": { + "version": "7.25.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.7", + "@babel/helper-validator-option": "^7.25.7", + "@babel/plugin-syntax-jsx": "^7.25.7", + "@babel/plugin-transform-modules-commonjs": "^7.25.7", + "@babel/plugin-transform-typescript": "^7.25.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@wordpress/base-styles": { + "version": "5.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/browserslist-config": { + "version": "6.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@wordpress/dependency-extraction-webpack-plugin": { + "version": "6.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "json2php": "^0.0.7" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/@wordpress/dependency-extraction-webpack-plugin/node_modules/json2php": { + "version": "0.0.7", + "dev": true, + "license": "BSD" + }, + "node_modules/@wordpress/e2e-test-utils-playwright": { + "version": "1.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "change-case": "^4.1.2", + "form-data": "^4.0.0", + "get-port": "^5.1.1", + "lighthouse": "^12.2.2", + "mime": "^3.0.0", + "web-vitals": "^4.2.1" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@playwright/test": ">=1" + } + }, + "node_modules/@wordpress/eslint-plugin": { + "version": "22.8.0", + "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.8.0.tgz", + "integrity": "sha512-VH39xtdnKqLag8PUhS+y4n0Ted4lPtUQ1vIr66DiFvGWMZ4+GfFl8IFOIWi41+6Obw8kgKuOUJhd0qSl+8tg1w==", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/eslint-parser": "7.25.7", + "@typescript-eslint/eslint-plugin": "^6.4.1", + "@typescript-eslint/parser": "^6.4.1", + "@wordpress/babel-preset-default": "^8.22.0", + "@wordpress/prettier-config": "^4.22.0", + "cosmiconfig": "^7.0.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-jest": "^27.4.3", + "eslint-plugin-jsdoc": "^46.4.6", + "eslint-plugin-jsx-a11y": "^6.5.1", + "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", + "requireindex": "^1.2.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@babel/core": ">=7", + "eslint": ">=8", + "prettier": ">=3", + "typescript": ">=5" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/globals": { + "version": "13.24.0", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wordpress/eslint-plugin/node_modules/type-fest": { + "version": "0.20.2", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@wordpress/jest-console": { + "version": "8.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/runtime": "7.25.7", + "jest-matcher-utils": "^29.6.2" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "jest": ">=29" + } + }, + "node_modules/@wordpress/jest-preset-default": { + "version": "12.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@wordpress/jest-console": "^8.22.0", + "babel-jest": "29.7.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@babel/core": ">=7", + "jest": ">=29" + } + }, + "node_modules/@wordpress/npm-package-json-lint-config": { + "version": "5.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "npm-package-json-lint": ">=6.0.0" + } + }, + "node_modules/@wordpress/postcss-plugins-preset": { + "version": "5.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@wordpress/base-styles": "^5.22.0", + "autoprefixer": "^10.4.20" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/@wordpress/prettier-config": { + "version": "4.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "prettier": ">=3" + } + }, + "node_modules/@wordpress/scripts": { + "version": "30.15.0", + "dev": true, + "license": "GPL-2.0-or-later", + "dependencies": { + "@babel/core": "7.25.7", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", + "@svgr/webpack": "^8.0.1", + "@wordpress/babel-preset-default": "^8.22.0", + "@wordpress/browserslist-config": "^6.22.0", + "@wordpress/dependency-extraction-webpack-plugin": "^6.22.0", + "@wordpress/e2e-test-utils-playwright": "^1.22.0", + "@wordpress/eslint-plugin": "^22.8.0", + "@wordpress/jest-preset-default": "^12.22.0", + "@wordpress/npm-package-json-lint-config": "^5.22.0", + "@wordpress/postcss-plugins-preset": "^5.22.0", + "@wordpress/prettier-config": "^4.22.0", + "@wordpress/stylelint-config": "^23.14.0", + "adm-zip": "^0.5.9", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", + "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": "^7.0.6", + "css-loader": "^6.2.0", + "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.6.2", + "jest-dev-server": "^10.1.4", + "jest-environment-jsdom": "^29.6.2", + "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", + "markdownlint-cli": "^0.31.1", + "merge-deep": "^3.0.3", + "mini-css-extract-plugin": "^2.9.2", + "minimist": "^1.2.0", + "npm-package-json-lint": "^6.4.0", + "npm-packlist": "^3.0.0", + "postcss": "^8.4.5", + "postcss-loader": "^6.2.1", + "prettier": "npm:wp-prettier@3.0.3", + "puppeteer-core": "^23.10.1", + "react-refresh": "^0.14.0", + "read-pkg-up": "^7.0.1", + "resolve-bin": "^0.4.0", + "rtlcss": "^4.3.0", + "sass": "^1.54.0", + "sass-loader": "^16.0.3", + "schema-utils": "^4.2.0", + "source-map-loader": "^3.0.0", + "stylelint": "^16.8.2", + "terser-webpack-plugin": "^5.3.10", + "url-loader": "^4.1.1", + "webpack": "^5.97.0", + "webpack-bundle-analyzer": "^4.9.1", + "webpack-cli": "^5.1.4", + "webpack-dev-server": "^4.15.1" + }, + "bin": { + "wp-scripts": "bin/wp-scripts.js" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "@playwright/test": "^1.51.1", + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@wordpress/scripts/node_modules/@babel/core": { + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@wordpress/stylelint-config": { + "version": "23.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@stylistic/stylelint-plugin": "^3.0.1", + "stylelint-config-recommended": "^14.0.1", + "stylelint-config-recommended-scss": "^14.1.0" + }, + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + }, + "peerDependencies": { + "stylelint": "^16.8.2", + "stylelint-scss": "^6.4.0" + } + }, + "node_modules/@wordpress/warning": { + "version": "3.22.0", + "dev": true, + "license": "GPL-2.0-or-later", + "engines": { + "node": ">=18.12.0", + "npm": ">=8.19.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/abab": { + "version": "2.0.6", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/accepts": { + "version": "1.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.1.0", + "acorn-walk": "^8.0.2" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/adm-zip": { + "version": "0.5.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.9", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/are-docs-informative": { + "version": "0.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/array-includes": { + "version": "3.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/async-function": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.10.3", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/b4a": { + "version": "1.6.7", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/babel-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/transform": "^29.7.0", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^29.6.3", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-loader": { + "version": "9.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.1.14", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.4", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.3", + "core-js-compat": "^3.40.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.4" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@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", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@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" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "babel-plugin-jest-hoist": "^29.6.3", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/bare-events": { + "version": "2.5.4", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "4.1.2", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.6.1", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.6.5", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + }, + "peerDependencies": { + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.3", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable": { + "version": "1.8.10", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.8.1", + "keyv": "^5.3.2" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.0.3" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "5.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001713", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/capital-case": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/change-case": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "capital-case": "^1.0.4", + "constant-case": "^3.0.4", + "dot-case": "^3.0.4", + "header-case": "^2.0.4", + "no-case": "^3.0.4", + "param-case": "^3.0.4", + "pascal-case": "^3.1.2", + "path-case": "^3.0.4", + "sentence-case": "^3.0.4", + "snake-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/check-node-version": { + "version": "4.2.1", + "dev": true, + "license": "Unlicense", + "dependencies": { + "chalk": "^3.0.0", + "map-values": "^1.0.1", + "minimist": "^1.2.0", + "object-filter": "^1.0.2", + "run-parallel": "^1.1.4", + "semver": "^6.3.0" + }, + "bin": { + "check-node-version": "bin.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/check-node-version/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/chrome-launcher": { + "version": "1.1.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/node": "*", + "escape-string-regexp": "^4.0.0", + "is-wsl": "^2.2.0", + "lighthouse-logger": "^2.0.1" + }, + "bin": { + "print-chrome-path": "bin/print-chrome-path.js" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/chromium-bidi": { + "version": "0.11.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.4.3", + "dev": true, + "license": "MIT" + }, + "node_modules/clean-webpack-plugin": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/webpack": "^4.4.31", + "del": "^4.1.1" + }, + "engines": { + "node": ">=8.9.0" + }, + "peerDependencies": { + "webpack": "*" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/clone-deep": { + "version": "0.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "for-own": "^0.1.3", + "is-plain-object": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^1.0.3", + "shallow-clone": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "dev": true, + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "dev": true, + "license": "MIT" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "12.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "compressible": "~2.0.18", + "debug": "2.6.9", + "negotiator": "~0.6.4", + "on-headers": "~1.0.2", + "safe-buffer": "5.2.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/configstore": { + "version": "5.0.1", + "dev": true, + "license": "BSD-2-Clause", + "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/make-dir": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "dev": true, + "license": "ISC", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/constant-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/array-union": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "12.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.41.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.41.0", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "dev": true, + "license": "MIT", + "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/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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.2.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz", + "integrity": "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==", + "dev": true, + "dependencies": { + "node-fetch": "^2.7.0" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/csp_evaluator": { + "version": "1.1.5", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-loader/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "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", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/cssom": { + "version": "0.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/cwd": { + "version": "0.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-pkg": "^0.1.2", + "fs-exists-sync": "^0.1.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/data-urls": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debounce": { + "version": "1.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/dedent": { + "version": "1.5.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "babel-plugin-macros": "^3.1.0" + }, + "peerDependenciesMeta": { + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/del": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/devtools-protocol": { + "version": "0.0.1436416", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/diff-sequences": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "peer": true + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domexception": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "5.0.3", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.136", + "dev": true, + "license": "ISC" + }, + "node_modules/emittery": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/enquirer": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/envinfo": { + "version": "7.14.0", + "dev": true, + "license": "MIT", + "bin": { + "envinfo": "dist/cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.23.9", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.0", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-regex": "^1.2.1", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.0", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.3", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.18" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.0", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.31.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.8", + "array.prototype.findlastindex": "^1.2.5", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.0", + "hasown": "^2.0.2", + "is-core-module": "^2.15.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.0", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.8", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "27.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz", + "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==", + "dev": true, + "license": "MIT", + "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 || ^7.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, + "license": "MIT", + "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": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "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, + "license": "MIT", + "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, + "license": "BSD-2-Clause", + "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, + "license": "MIT", + "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, + "license": "MIT", + "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-jest/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-jest/node_modules/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsdoc": { + "version": "46.10.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@es-joy/jsdoccomment": "~0.41.0", + "are-docs-informative": "^0.0.2", + "comment-parser": "1.4.1", + "debug": "^4.3.4", + "escape-string-regexp": "^4.0.0", + "esquery": "^1.5.0", + "is-builtin-module": "^3.2.1", + "semver": "^7.5.4", + "spdx-expression-parse": "^4.0.0" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-jsdoc/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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, + "license": "MIT", + "peerDependencies": { + "eslint": ">=7", + "eslint-plugin-jest": ">=25" + }, + "peerDependenciesMeta": { + "eslint-plugin-jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.6", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "dev": true, + "license": "MIT", + "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-scope": { + "version": "5.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/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, + "license": "Python-2.0" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exit": { + "version": "0.1.2", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expand-tilde": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "os-homedir": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expect": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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" + } + }, + "node_modules/expect-puppeteer": { + "version": "4.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/express": { + "version": "4.21.2", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "dev": true, + "license": "BSD-2-Clause", + "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/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.1", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-file-up": { + "version": "0.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-exists-sync": "^0.1.0", + "resolve-dir": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-parent-dir": { + "version": "0.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/find-pkg": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "find-file-up": "^0.1.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/find-process": { + "version": "1.4.10", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "~4.1.2", + "commander": "^12.1.0", + "loglevel": "^1.9.2" + }, + "bin": { + "find-process": "bin/find-process.js" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flat-cache/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/for-own": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-exists-sync": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "dev": true, + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/function-bind": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-port": { + "version": "5.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stdin": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "6.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/global-modules": { + "version": "0.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^0.1.4", + "is-windows": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix": { + "version": "0.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.0", + "ini": "^1.3.4", + "is-windows": "^0.2.0", + "which": "^1.2.12" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/header-case": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/homedir-polyfill": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "parse-passwd": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hookified": { + "version": "1.8.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/lru-cache": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hosted-git-info/node_modules/yallist": { + "version": "4.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-entities": { + "version": "2.6.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "dev": true, + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-link-header": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.10", + "dev": true, + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "dev": true, + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "4.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ignore-walk/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/ignore-walk/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/image-ssim": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/immediate": { + "version": "3.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "dev": true, + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "dev": true, + "license": "ISC" + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/intl-messageformat": { + "version": "10.7.16", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.4", + "@formatjs/fast-memoize": "2.2.7", + "@formatjs/icu-messageformat-parser": "2.11.2", + "tslib": "^2.8.0" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/is-builtin-module": { + "version": "3.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^3.3.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jest": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/core": "^29.7.0", + "@jest/types": "^29.6.3", + "import-local": "^3.0.2", + "jest-cli": "^29.7.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "execa": "^5.0.0", + "jest-util": "^29.7.0", + "p-limit": "^3.1.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-circus": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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": "^1.0.0", + "is-generator-fn": "^2.0.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.7.0", + "pure-rand": "^6.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-cli": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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", + "import-local": "^3.0.2", + "jest-config": "^29.7.0", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "yargs": "^17.3.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-config": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.11.6", + "@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.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.7.0", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "@types/node": "*", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-dev-server": { + "version": "10.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "cwd": "^0.10.0", + "find-process": "^1.4.7", + "prompts": "^2.4.2", + "spawnd": "^10.1.4", + "tree-kill": "^1.2.2", + "wait-on": "^8.0.1" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/jest-diff": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.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" + } + }, + "node_modules/jest-docblock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-each": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "chalk": "^4.0.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" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.7.0", + "jest-util": "^29.7.0", + "jsdom": "^20.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jest-environment-node": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/environment": "^29.7.0", + "@jest/fake-timers": "^29.7.0", + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-mock": "^29.7.0", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-fetch-mock": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/jest-fetch-mock/-/jest-fetch-mock-3.0.3.tgz", + "integrity": "sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==", + "dev": true, + "dependencies": { + "cross-fetch": "^3.0.4", + "promise-polyfill": "^8.1.3" + } + }, + "node_modules/jest-get-type": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.6.3", + "jest-util": "^29.7.0", + "jest-worker": "^29.7.0", + "micromatch": "^4.0.4", + "walker": "^1.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-leak-detector": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.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" + } + }, + "node_modules/jest-message-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@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.7.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-mock": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "jest-util": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "29.6.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^29.7.0", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^29.7.0", + "jest-validate": "^29.7.0", + "resolve": "^1.20.0", + "resolve.exports": "^2.0.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "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.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-runtime": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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.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" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "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/types": "^7.3.3", + "@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.7.0", + "graceful-fs": "^4.2.9", + "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.7.0", + "semver": "^7.5.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-validate": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^29.6.3", + "leven": "^3.1.0", + "pretty-format": "^29.7.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-watcher": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@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.7.0", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/jpeg-js": { + "version": "0.4.4", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/js-library-detector": { + "version": "6.7.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsdom": { + "version": "20.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.6", + "acorn": "^8.8.1", + "acorn-globals": "^7.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.2", + "decimal.js": "^10.4.2", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.1", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.2", + "parse5": "^7.1.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.1.2", + "w3c-xmlserializer": "^4.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^11.0.0", + "ws": "^8.11.0", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json2php": { + "version": "0.0.9", + "dev": true, + "license": "BSD" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/known-css-properties": { + "version": "0.35.0", + "dev": true, + "license": "MIT" + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/launch-editor": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lie": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lighthouse": { + "version": "12.5.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@paulirish/trace_engine": "0.0.50", + "@sentry/node": "^7.0.0", + "axe-core": "^4.10.3", + "chrome-launcher": "^1.1.2", + "configstore": "^5.0.1", + "csp_evaluator": "1.1.5", + "devtools-protocol": "0.0.1436416", + "enquirer": "^2.3.6", + "http-link-header": "^1.1.1", + "intl-messageformat": "^10.5.3", + "jpeg-js": "^0.4.4", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.1", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", + "lookup-closest-locale": "6.2.0", + "metaviewport-parser": "0.3.0", + "open": "^8.4.0", + "parse-cache-control": "1.0.1", + "puppeteer-core": "^24.4.0", + "robots-parser": "^3.0.1", + "semver": "^5.3.0", + "speedline-core": "^1.4.3", + "third-party-web": "^0.26.5", + "tldts-icann": "^6.1.16", + "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": ">=18.16" + } + }, + "node_modules/lighthouse-logger": { + "version": "2.0.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^2.6.9", + "marky": "^1.2.2" + } + }, + "node_modules/lighthouse-logger/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/lighthouse-logger/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/lighthouse-stack-packs": { + "version": "1.12.2", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/lighthouse/node_modules/@puppeteer/browsers": { + "version": "2.10.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.7.1", + "tar-fs": "^3.0.8", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/lighthouse/node_modules/@puppeteer/browsers/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core": { + "version": "24.6.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.10.0", + "chromium-bidi": "3.0.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1425554", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.1" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "mitt": "^3.0.1", + "zod": "^3.24.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1425554", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { + "version": "8.18.1", + "dev": true, + "license": "MIT", + "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", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/lighthouse/node_modules/ws": { + "version": "7.5.10", + "dev": true, + "license": "MIT", + "engines": { + "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/lighthouse/node_modules/zod": { + "version": "3.24.2", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/localforage": { + "version": "1.10.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loglevel": { + "version": "1.9.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/lookup-closest-locale": { + "version": "6.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/map-values": { + "version": "1.0.1", + "dev": true, + "license": "Public Domain" + }, + "node_modules/markdown-it": { + "version": "12.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/markdown-it/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "dev": true, + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/markdownlint": { + "version": "0.25.1", + "dev": true, + "license": "MIT", + "dependencies": { + "markdown-it": "12.3.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdownlint-cli": { + "version": "0.31.1", + "dev": true, + "license": "MIT", + "dependencies": { + "commander": "~9.0.0", + "get-stdin": "~9.0.0", + "glob": "~7.2.0", + "ignore": "~5.2.0", + "js-yaml": "^4.1.0", + "jsonc-parser": "~3.0.0", + "markdownlint": "~0.25.1", + "markdownlint-rule-helpers": "~0.16.0", + "minimatch": "~3.0.5", + "run-con": "~1.2.10" + }, + "bin": { + "markdownlint": "markdownlint.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/markdownlint-cli/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/markdownlint-cli/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/markdownlint-cli/node_modules/ignore": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/markdownlint-cli/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/markdownlint-cli/node_modules/minimatch": { + "version": "3.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/markdownlint-rule-helpers": { + "version": "0.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/marky": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "dev": true, + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "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" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-deep": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-union": "^3.1.0", + "clone-deep": "^0.2.4", + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/metaviewport-parser": { + "version": "0.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "dev": true, + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.2", + "dev": true, + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "9.0.3", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/is-plain-obj": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimist-options/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/mixin-object": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "for-in": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-object/node_modules/for-in": { + "version": "0.1.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-fetch": { + "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" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "dev": true, + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "dev": true, + "license": "BSD-2-Clause", + "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/normalize-package-data/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "dev": true, + "license": "ISC" + }, + "node_modules/npm-package-json-lint": { + "version": "6.4.0", + "dev": true, + "license": "MIT", + "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/jsonc-parser": { + "version": "3.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/npm-package-json-lint/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-package-json-lint/node_modules/type-fest": { + "version": "3.13.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-packlist": { + "version": "3.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nwsapi": { + "version": "2.2.20", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-filter": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-homedir": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-locate/node_modules/p-limit": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "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.6", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-cache-control": { + "version": "1.0.1", + "dev": true + }, + "node_modules/parse-json": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-passwd": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parse5": { + "version": "7.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^4.5.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "dev": true, + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "6.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/pkg-dir/node_modules/yocto-queue": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/playwright": { + "version": "1.51.1", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "playwright-core": "1.51.1" + }, + "bin": { + "playwright": "cli.js" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "fsevents": "2.3.2" + } + }, + "node_modules/playwright-core": { + "version": "1.51.1", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "playwright-core": "cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/plur": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "irregular-plurals": "^3.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "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": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.7.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "dev": true, + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "name": "wp-prettier", + "version": "3.0.3", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/progress": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/promise-polyfill": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.3.0.tgz", + "integrity": "sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==", + "dev": true + }, + "node_modules/prompts": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "dev": true, + "license": "MIT" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-agent": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "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.6", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/psl": { + "version": "1.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, + "node_modules/pump": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "23.11.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.11.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/devtools-protocol": { + "version": "0.0.1367902", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/pure-rand": { + "version": "6.1.0", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/dubzzz" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fast-check" + } + ], + "license": "MIT" + }, + "node_modules/qs": { + "version": "6.13.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "dev": true, + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "dev": true, + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.14.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "dev": true, + "license": "ISC" + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/rechoir": { + "version": "0.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "^1.20.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "6.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requireindex": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.5" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.10", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-bin": { + "version": "0.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "find-parent-dir": "~0.3.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-dir": { + "version": "0.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^1.2.2", + "global-modules": "^0.2.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve.exports": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "2.7.1", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/robots-parser": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/rtlcss": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-con": { + "version": "1.2.12", + "dev": true, + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~3.0.0", + "minimist": "^1.2.8", + "strip-json-comments": "~3.1.1" + }, + "bin": { + "run-con": "cli.js" + } + }, + "node_modules/run-con/node_modules/ini": { + "version": "3.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "dev": true, + "license": "MIT" + }, + "node_modules/sass": { + "version": "1.86.3", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-loader": { + "version": "16.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 18.12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/ajv-keywords": { + "version": "5.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/schema-utils/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/select-hose": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/sentence-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.16.2", + "dev": true, + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "dev": true, + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "0.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.1", + "kind-of": "^2.0.1", + "lazy-cache": "^0.2.3", + "mixin-object": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/kind-of": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-clone/node_modules/lazy-cache": { + "version": "0.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "dev": true, + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.8.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "socks": "^2.8.3" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/agent-base": { + "version": "7.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.13", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawnd": { + "version": "10.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "signal-exit": "^4.1.0", + "tree-kill": "^1.2.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/spawnd/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-correct/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.5.0", + "dev": true, + "license": "CC-BY-3.0" + }, + "node_modules/spdx-expression-parse": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.21", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/spdy": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/speedline-core": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "image-ssim": "^0.2.0", + "jpeg-js": "^0.4.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/streamx": { + "version": "2.22.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-length": { + "version": "4.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/style-search": { + "version": "0.1.0", + "dev": true, + "license": "ISC" + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylelint": { + "version": "16.18.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.3.7", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^10.0.7", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.3", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "14.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.6.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-scss": { + "version": "6.11.1", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.15.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.0.2" + } + }, + "node_modules/stylelint-scss/node_modules/mdn-data": { + "version": "2.21.0", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/stylelint/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/stylelint/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "10.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.8" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "6.1.8", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^1.8.9", + "flatted": "^3.3.3", + "hookified": "^1.8.1" + } + }, + "node_modules/stylelint/node_modules/global-modules": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/global-prefix": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/stylelint/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/which": { + "version": "1.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/svgo/node_modules/css-tree": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/svgo/node_modules/mdn-data": { + "version": "2.0.30", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/synckit": { + "version": "0.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/table": { + "version": "6.9.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar-fs": { + "version": "3.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^4.0.1", + "bare-path": "^3.0.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "dev": true, + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/terser": { + "version": "5.39.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.25", + "jest-worker": "^27.4.5", + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "dev": true, + "license": "MIT" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser/node_modules/source-map-support": { + "version": "0.5.21", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/text-decoder": { + "version": "1.2.3", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/third-party-web": { + "version": "0.26.6", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.6.tgz", + "integrity": "sha512-GsjP92xycMK8qLTcQCacgzvffYzEqe29wyz3zdKVXlfRD5Kz1NatCTOZEeDaSd6uCZXvGd2CNVtQ89RNIhJWvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/through": { + "version": "2.3.8", + "dev": true, + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts-core": { + "version": "6.1.86", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts-icann": { + "version": "6.1.86", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.86" + } + }, + "node_modules/tmpl": { + "version": "1.0.5", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/trim-repeated/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/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, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.21.3", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "dev": true, + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "dev": true, + "license": "MIT" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uc.micro": { + "version": "1.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upper-case": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "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/url-parse": { + "version": "1.5.10", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "dev": true, + "license": "ISC", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/validate-npm-package-name": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/wait-on": { + "version": "8.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "axios": "^1.8.2", + "joi": "^17.13.3", + "lodash": "^4.17.21", + "minimist": "^1.2.8", + "rxjs": "^7.8.2" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "node_modules/watchpack": { + "version": "2.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "dev": true, + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "4.2.4", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/webpack": { + "version": "5.99.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.1", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^4.3.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/ws": { + "version": "7.5.10", + "dev": true, + "license": "MIT", + "engines": { + "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/webpack-cli": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^2.1.1", + "@webpack-cli/info": "^2.0.2", + "@webpack-cli/serve": "^2.0.5", + "colorette": "^2.0.14", + "commander": "^10.0.1", + "cross-spawn": "^7.0.3", + "envinfo": "^7.7.3", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^3.1.1", + "rechoir": "^0.8.0", + "webpack-merge": "^5.7.3" + }, + "bin": { + "webpack-cli": "bin/cli.js" + }, + "engines": { + "node": ">=14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "5.x.x" + }, + "peerDependenciesMeta": { + "@webpack-cli/generators": { + "optional": true + }, + "webpack-bundle-analyzer": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + } + } + }, + "node_modules/webpack-cli/node_modules/commander": { + "version": "10.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "dev": true, + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "3.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-merge/node_modules/clone-deep": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-merge/node_modules/is-plain-object": { + "version": "2.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-merge/node_modules/kind-of": { + "version": "6.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-merge/node_modules/shallow-clone": { + "version": "3.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "11.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "4.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/ws": { + "version": "8.18.1", + "dev": true, + "license": "MIT", + "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/xdg-basedir": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/y18n": { + "version": "5.0.8", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.7.2", + "dev": true, + "license": "MIT", + "dependencies": { + "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": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/yauzl": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/blocks/package.json b/blocks/package.json new file mode 100644 index 0000000..bff322a --- /dev/null +++ b/blocks/package.json @@ -0,0 +1,34 @@ +{ + "name": "documentcloud", + "version": "0.1.0", + "description": "Example block scaffolded with Create Block tool.", + "author": "The WordPress Contributors", + "license": "GPL-2.0-or-later", + "main": "build/index.js", + "scripts": { + "build": "wp-scripts build --webpack-copy-php --blocks-manifest", + "format": "wp-scripts format", + "lint:css": "wp-scripts lint-style", + "lint:js": "wp-scripts lint-js", + "lint:css:fix": "wp-scripts lint-style --fix", + "lint:js:fix": "wp-scripts lint-js --fix", + "packages-update": "wp-scripts packages-update", + "plugin-zip": "wp-scripts plugin-zip", + "start": "wp-scripts start --webpack-copy-php --blocks-manifest", + "prod": "npm run build && wp i18n make-pot . languages/documentcloud.pot --exclude=node_modules,vendor,build/**.js --include=build/block.json,src/**.js", + "test": "wp-scripts test-unit-js" + }, + "devDependencies": { + "@babel/core": "^7.26.10", + "@babel/preset-env": "^7.26.9", + "@testing-library/jest-dom": "^6.6.3", + "@testing-library/react": "^16.3.0", + "@wordpress/jest-preset-default": "^12.22.0", + "@wordpress/scripts": "^30.15.0", + "babel-jest": "^29.7.0", + "jest": "^29.7.0", + "jest-fetch-mock": "^3.0.3", + "react": "^19.1.0", + "react-dom": "^19.1.0" + } +} diff --git a/blocks/src/documentcloud/block.json b/blocks/src/documentcloud/block.json new file mode 100644 index 0000000..7ec621c --- /dev/null +++ b/blocks/src/documentcloud/block.json @@ -0,0 +1,59 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "apiVersion": 3, + "name": "documentcloud/documentcloud", + "version": "0.1.0", + "title": "DocumentCloud", + "category": "embed", + "description": "Allows embedding the DocumentCloud documents, pages and notes on your page.", + "example": {}, + "attributes": { + "url": { + "type": "string", + "default": "" + }, + "documentId" : { + "type": "string", + "default": "" + }, + "useDocumentId" : { + "type": "boolean", + "default": false + }, + "height": { + "type": "string", + "default": "" + }, + "width": { + "type": "string", + "default": "" + }, + "title": { + "type": "boolean", + "default": true + }, + "fullscreen": { + "type": "boolean", + "default": true + }, + "onlyshoworg": { + "type": "boolean", + "default": false + }, + "pdf": { + "type": "boolean", + "default": null + }, + "embeddedHtml": { + "type": "string", + "default": "" + } + }, + "supports": { + "html": false, + "align": true + }, + "textdomain": "documentcloud", + "editorScript": "file:./index.js", + "editorStyle": "file:./index.css" +} diff --git a/blocks/src/documentcloud/components/documentcloud-preview.js b/blocks/src/documentcloud/components/documentcloud-preview.js new file mode 100644 index 0000000..a69e0f0 --- /dev/null +++ b/blocks/src/documentcloud/components/documentcloud-preview.js @@ -0,0 +1,102 @@ +/** + * WordPress dependencies. + */ +import { __ } from '@wordpress/i18n'; +import { Button, Notice, Spinner } from '@wordpress/components'; +import { useRef, useMemo } from '@wordpress/element'; +import { useBlockProps } from '@wordpress/block-editor'; + +/** + * Document Preview Component. + * + * @param {Object} props - Component properties. + * @param {string} props.embeddedHtml - The HTML to embed. + * @param {boolean} props.isLoading - Whether the document is loading. + * @param {string} props.fetchError - Error message if fetch failed. + * @param {Function} props.onChangeDocument - Callback when user wants to change document. + */ +export default function DocumentPreview( { + embeddedHtml, + isLoading, + fetchError, + onChangeDocument, +} ) { + const containerRef = useRef( null ); + + const blockProps = useBlockProps(); + + // Check if the block is selected + const isSelected = useMemo( () => { + return blockProps.className?.includes( 'is-selected' ); + }, [ blockProps.className ] ); + + if ( isLoading === null || isLoading ) { + return ( +
+ +

{ __( 'Loading documentโ€ฆ', 'documentcloud' ) }

+
+ ); + } + + if ( fetchError ) { + return ( +
+ + { fetchError } + + +
+ ); + } + + // For response containing IFrame directly set in a div. + if ( embeddedHtml ) { + return ( +
+
+ { /* only load the overlay if the block is not selected */ } + { isSelected ? null : ( +
+ ) } + +
+ ); + } + + // If none of the above conditions are suitable we need to return the document preview. + return ( +
+
+

+ { __( 'Document preview not available.', 'documentcloud' ) } +

+
+ +
+ ); +} + +/** + * Footer component for the document preview with action buttons. It is an inner component for private code reusability. + * + * @param {Object} props - Component properties. + * @param {Function} props.onChangeDocument - Callback when user wants to change document. + */ +function DocumentPreviewFooter( { onChangeDocument } ) { + return ( +
+ +
+ ); +} diff --git a/blocks/src/documentcloud/edit.js b/blocks/src/documentcloud/edit.js new file mode 100644 index 0000000..441d423 --- /dev/null +++ b/blocks/src/documentcloud/edit.js @@ -0,0 +1,696 @@ +/** + * WordPress dependencies. + */ +import { __ } from '@wordpress/i18n'; +import { useBlockProps, InspectorControls } from '@wordpress/block-editor'; +import { + PanelBody, + PanelRow, + TextControl, + ToggleControl, + Placeholder, + Button, + Notice, +} from '@wordpress/components'; +import { + useState, + useEffect, + useCallback, + useMemo, + useRef, +} from '@wordpress/element'; +import { debounce } from '@wordpress/compose'; + +/** + * Internal dependencies. + */ +import './editor.scss'; +import { + getEmbedUrl, + getOEmbedApiUrl, + getDocumentCloudUrlType, + fetchOEmbedData, + extractAttributesFromHTML, +} from './utils/utils'; +import { validateUrl, validateDocumentId } from './utils/validation'; + +import DocumentPreview from './components/documentcloud-preview'; +import { ReactComponent as DocumentIcon } from '../../../assets/DocumentCloud-Block-Icon.svg'; + +/** + * Edit component for the DocumentCloud block. + * + * This component manages the editor interface for the DocumentCloud block, allowing users to: + * - Enter a DocumentCloud URL or document ID + * - Configure display options (height, width etc.) + * - Preview the embedded document + * + * The component handles validation, API fetching, and state management. + * + * @param {Object} root0 The props provided by WordPress Block. + * @param {Object} root0.attributes The attributes of the Block. + * @param {Function} root0.setAttributes The function to change attributes. + */ +export default function Edit( { attributes, setAttributes } ) { + /** + * Destructure all block attributes for easier access. + * These attributes represent the persistent state of the block. + */ + const { + url, + documentId, + useDocumentId, + height, + width, + title, + fullscreen, + onlyshoworg, + pdf, + embeddedHtml, + } = attributes; + + /** + * State management section. + * + * The block uses multiple state variables to manage: + * - Form inputs and validation + * - API loading and errors + * - UI display modes + * - Temporary values before committing to block attributes + */ + // Validation and error states + const [ validationMessage, setValidationMessage ] = useState( '' ); + const [ fetchError, setFetchError ] = useState( '' ); + + // Temporary input values (before committing to block attributes) + const [ tempUrl, setTempUrl ] = useState( url || '' ); + const [ tempDocumentId, setTempDocumentId ] = useState( documentId || '' ); + const [ tempDimensions, setTempDimensions ] = useState( { + width: width || '', + height: height || '', + } ); + + // UI state + const [ isLoading, setIsLoading ] = useState( null ); + const [ urlType, setUrlType ] = useState( + url ? getDocumentCloudUrlType( url ) : 'document' + ); + const [ showEditorInput, setShowEditorInput ] = useState( + ! ( documentId || url ) + ); + + /** + * References section. + * + * Refs are used for: + * - Tracking component mount status to prevent updates after unmount + * - Storing debounced functions to ensure proper cleanup + */ + const isMounted = useRef( true ); + const debouncedFetchApi = useRef( null ); + + /** + * Derived state using useMemo. + * + * These values are computed from other state variables and + * will only recalculate when their dependencies change. + */ + // Check if the current input is valid (no validation message) + const isValid = useMemo( + () => validationMessage === '', + [ validationMessage ] + ); + + // Determine if display options should be shown based on URL type + const shouldShowDisplayOptions = urlType === 'document'; + + /** + * Event handlers section. + * + * Each handler is wrapped in useCallback to prevent unnecessary re-renders + * and ensure referential stability for dependencies. + */ + + /** + * Handles changes to dimension properties (width, height). + * Updates both temporary state and block attributes. + */ + const handleDimensionChange = useCallback( + ( property, value ) => { + setTempDimensions( ( prev ) => ( { + ...prev, + [ property ]: value, + } ) ); + setAttributes( { [ property ]: value } ); + }, + [ setAttributes ] + ); + + /** + * Handles changes to the URL input. + * Updates temporary state and clears any validation messages. + */ + const onChangeUrl = useCallback( ( newUrl ) => { + setTempUrl( newUrl ); + setValidationMessage( '' ); + }, [] ); + + /** + * Handles changes to the Document ID input. + * Validates that the input contains only digits and updates temporary state. + * Sets validation message if non-digit characters are found. + */ + const onChangeDocumentId = useCallback( ( newId ) => { + const hasNonDigit = /[^0-9]/.test( String( String( newId ).trim() ) ); + + if ( hasNonDigit ) { + setValidationMessage( + __( 'Document ID can only contain digits.', 'documentcloud' ) + ); + return; + } + setTempDocumentId( newId ); + setValidationMessage( '' ); + }, [] ); + + /** + * Toggles between URL and Document ID input modes. + * Updates the useDocumentId attribute and clears validation messages. + */ + const toggleInputType = useCallback( () => { + setAttributes( { useDocumentId: ! useDocumentId } ); + setValidationMessage( '' ); + }, [ useDocumentId, setAttributes ] ); + + /** + * Handles the embed form submission. + * Validates input based on the current mode (URL or Document ID). + * If valid, updates block attributes and hides the editor input. + * + * For URLs, it also: + * - Detects the URL type + * - Extracts attributes from HTML (if embedded code is pasted) + */ + const handleEmbed = useCallback( + ( event ) => { + event.preventDefault(); + setIsLoading( null ); + try { + if ( useDocumentId ) { + // Document ID validation and processing + const sanitizedId = tempDocumentId.trim(); + const validationResult = validateDocumentId( sanitizedId ); + setValidationMessage( validationResult.message ); + + if ( validationResult.valid ) { + setAttributes( { + documentId: sanitizedId, + url: '', + embeddedHtml: '', + } ); + setUrlType( 'document' ); + setShowEditorInput( false ); + } + } else { + // URL validation and processing + let sanitizedUrl = tempUrl.trim(); + const validationResult = validateUrl( sanitizedUrl ); + setValidationMessage( validationResult.message ); + + if ( validationResult.valid ) { + const detectedUrlType = + getDocumentCloudUrlType( sanitizedUrl ); + setUrlType( detectedUrlType ); + + if ( detectedUrlType === 'document' ) { + // Extract attributes from HTML if it's an embed code + const cleanURL = extractAttributesFromHTML( + sanitizedUrl, + handleDimensionChange, + setAttributes + ); + + if ( cleanURL ) { + sanitizedUrl = cleanURL.toString(); + } + } + + setAttributes( { + url: sanitizedUrl, + documentId: '', + embeddedHtml: '', + } ); + setShowEditorInput( false ); + } + } + } catch ( error ) { + setValidationMessage( + __( + 'An unexpected error occurred. Please try again.', + 'documentcloud' + ) + ); + } + }, + [ + useDocumentId, + tempDocumentId, + tempUrl, + setAttributes, + handleDimensionChange, + ] + ); + + /** + * Shows the editor input form to allow changing the document. + * Clears any validation messages. + */ + const displayEditorInput = useCallback( () => { + setShowEditorInput( true ); + setValidationMessage( '' ); + }, [] ); + + /** + * Generates the embed URL based on current attributes and settings. + * Determines if responsive layout should be used based on dimensions. + * + * This function is used for both preview and API fetching. + */ + const generateEmbedUrl = useCallback( () => { + const responsive = + String( tempDimensions.width ).length === 0 && + String( tempDimensions.height ).length === 0; + + return getEmbedUrl( { + useDocumentId, + documentId, + url, + title, + fullscreen, + onlyshoworg, + pdf, + width: tempDimensions.width, + height: tempDimensions.height, + responsive, + } ); + }, [ + useDocumentId, + documentId, + url, + title, + fullscreen, + onlyshoworg, + pdf, + tempDimensions, + ] ); + + /** + * Generates the oEmbed API URL using the embed URL. + * Used to fetch the HTML for embedding the document. + */ + const generateOEmbedApiUrl = useCallback( () => { + const documentUrl = generateEmbedUrl(); + return getOEmbedApiUrl( documentUrl, width, height ); + }, [ generateEmbedUrl, width, height ] ); + + /** + * Effects section. + * + * These useEffect hooks manage side effects for: + * - Component lifecycle + * - Synchronizing state + * - Debounced operations + * - API fetching + */ + + /** + * Component mount/unmount lifecycle effect. + * Sets up a ref to track mount status for preventing updates after unmount. + */ + useEffect( () => { + isMounted.current = true; + return () => { + isMounted.current = false; + }; + }, [] ); + + /** + * Syncs temporary input values when editor input visibility changes. + * Ensures input fields show current attribute values. + */ + useEffect( () => { + if ( showEditorInput ) { + setTempUrl( url || '' ); + setTempDocumentId( documentId || '' ); + } + }, [ showEditorInput, url, documentId ] ); + + /** + * Updates URL type when URL changes. + * This affects which options are displayed in the sidebar. + */ + useEffect( () => { + if ( url && isMounted.current ) { + setUrlType( getDocumentCloudUrlType( url ) ); + } + }, [ url ] ); + + /** + * Syncs temporary dimensions when block attributes change. + * Ensures the UI reflects the current block state. + */ + useEffect( () => { + if ( isMounted.current ) { + setTempDimensions( { + width: width || '', + height: height || '', + } ); + } + }, [ width, height ] ); + + /** + * Sets up debounced API fetching. + * + * Creates a function that waits 700ms before fetching oEmbed data. + * Handles loading state and errors. + * Only updates the embeddedHtml attribute if fetch succeeds. + * Properly cleans up the debounced function on unmount. + */ + useEffect( () => { + debouncedFetchApi.current = debounce( async ( apiUrl ) => { + if ( + ! apiUrl || + showEditorInput || + ! isValid || + ! isMounted.current + ) { + return; + } + + setIsLoading( true ); + setFetchError( '' ); + + const { html, error } = await fetchOEmbedData( apiUrl ); + + if ( isMounted.current ) { + if ( error ) { + setFetchError( error ); + } + + setAttributes( { embeddedHtml: html } ); + setIsLoading( false ); + } + }, 700 ); + + return () => { + if ( debouncedFetchApi.current ) { + debouncedFetchApi.current.cancel(); + } + }; + }, [ showEditorInput, isValid, setAttributes ] ); + + /** + * Triggers API fetch when relevant dependencies change. + * + * This effect runs when: + * - The API URL changes (due to changed attributes) + * - The editor input visibility changes + * - The input validation state changes + */ + useEffect( () => { + const apiUrl = generateOEmbedApiUrl(); + if ( + apiUrl && + ! showEditorInput && + isValid && + debouncedFetchApi.current + ) { + debouncedFetchApi.current( apiUrl ); + } + }, [ generateOEmbedApiUrl, showEditorInput, isValid ] ); + + /** + * Get block props for the main container. + * This adds required WordPress attributes to the block. + */ + const blockProps = useBlockProps(); + + return ( + <> + { /* + * Inspector Controls section. + * + * This renders in the block editor sidebar and contains: + * - Document settings (dimensions) + * - Display options (conditionally rendered based on URL type) + */ } + + { /* Document Settings Panel */ } + + { /* Height Setting */ } + + + handleDimensionChange( 'height', value ) + } + help={ __( + 'Set the height (Only numeric values allowed).', + 'documentcloud' + ) } + /> + + + { /* Width Setting */ } + + + handleDimensionChange( 'width', value ) + } + help={ __( + 'Set the width (Only Numberic Values are allowed).', + 'documentcloud' + ) } + /> + + + + { /* + * Display Options Panel. + * Only shown for document URLs, not for other types. + */ } + { shouldShowDisplayOptions && ( + + { /* Title Toggle */ } + + + setAttributes( { title: ! title } ) + } + help={ __( + 'Show document title and contributor name.', + 'documentcloud' + ) } + /> + + + { /* Fullscreen Toggle */ } + + + setAttributes( { + fullscreen: ! fullscreen, + } ) + } + help={ __( + 'Show fullscreen control.', + 'documentcloud' + ) } + /> + + + { /* Only Show Organization Toggle */ } + + + setAttributes( { + onlyshoworg: ! onlyshoworg, + } ) + } + help={ __( + 'Show affiliation without username.', + 'documentcloud' + ) } + /> + + + { /* PDF Download Toggle */ } + + + setAttributes( { pdf: ! pdf } ) + } + help={ __( + 'Shows PDF download link.', + 'documentcloud' + ) } + /> + + + ) } + + + { /* + * Main Block Content. + * + * Either displays: + * 1. Document Preview - when a valid document is embedded + * 2. Input Form - when no document is embedded or user is changing the document + */ } +
+ { ! showEditorInput && isValid ? ( + // Document Preview Component + + ) : ( + // Input Form Placeholder + } + label={ __( 'DocumentCloud', 'documentcloud' ) } + instructions={ + useDocumentId + ? __( + 'Enter a DocumentCloud ID to embed a document.', + 'documentcloud' + ) + : __( + 'Enter a DocumentCloud URL to embed a document, page or note.', + 'documentcloud' + ) + } + > + { /* Validation Error Notice */ } + { ! isValid && validationMessage && ( + + { validationMessage } + + ) } + + { /* Embed Form */ } +
+
+ { /* Toggle between URL and Document ID input */ } + + + { /* Conditional rendering of input field based on mode */ } +
+ { useDocumentId ? ( + // Document ID Input + <> + + + ) : ( + // URL Input + + ) } + { /* Embed Button */ } + +
+
+
+
+ ) } +
+ + ); +} diff --git a/blocks/src/documentcloud/editor.scss b/blocks/src/documentcloud/editor.scss new file mode 100644 index 0000000..0b49b50 --- /dev/null +++ b/blocks/src/documentcloud/editor.scss @@ -0,0 +1,101 @@ +/** + * DocumentCloud Block Editor Styles + */ + +/** + * DocumentCloud Block Editor Styles + */ + +.wp-block-documentcloud-documentcloud { + + .documentcloud-oembed { + width: auto; + height: auto; + } + + .documentcloud-error-container { + + .documentcloud-preview-footer { + margin-top: 10px; + } + } + + .documentcloud-input-wrapper { + width: inherit; + } + + .documentcloud-input-row { + display: flex; + gap: 10px; // Adds spacing between the input field and the button + + button { + margin-top: 0; // Ensures the button aligns vertically with the input field + height: 32px; // Adjusts the button height to match the input field + } + + input { + width: 311px; + } + + } + + // Responsive styles. + @media (max-width: 500px) { + + .documentcloud-input-row { + flex-wrap: wrap; + width: 100%; + + // Ensure the wrapper divs take up the full width + .components-base-control { + width: 100%; + } + + // Ensure the input field inside TextControl takes up the full width + .components-base-control__field { + width: 100%; + } + + input { + width: 100%; + position: relative; + } + + button { + width: 100%; + } + } + } + + // Styles for the iframe overlay. + .documentcloud-overlay { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: transparent; + z-index: 10; + cursor: pointer; + } + + .documentcloud-preview { + position: relative; + } + +} + +// Added style to fix the outline overflow issue when the block is selected. +.block-editor-block-list__layout .wp-block-documentcloud-documentcloud.block-editor-block-list__block:not([contenteditable="true"]):focus::after{ + right: -2px; +} + + +// Inspector Controls Styles + +.components-panel__row { + + .components-base-control { + width: 100%; + } +} diff --git a/blocks/src/documentcloud/index.js b/blocks/src/documentcloud/index.js new file mode 100644 index 0000000..ebd558e --- /dev/null +++ b/blocks/src/documentcloud/index.js @@ -0,0 +1,29 @@ +/** + * Registers a new block provided a unique name and an object defining its behavior. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/ + */ +import { registerBlockType } from '@wordpress/blocks'; + +/** + * Internal dependencies + */ +import Edit from './edit'; +import metadata from './block.json'; +import save from './save'; + +import { ReactComponent as DocumentIcon } from '../../../assets/DocumentCloud-Block-Icon.svg'; + +/** + * Every block starts by registering a new block type definition. + * + * @see https://developer.wordpress.org/block-editor/reference-guides/block-api/block-registration/ + */ +registerBlockType( metadata.name, { + icon: , + /** + * @see ./edit.js + */ + edit: Edit, + save, +} ); diff --git a/blocks/src/documentcloud/save.js b/blocks/src/documentcloud/save.js new file mode 100644 index 0000000..555ec6b --- /dev/null +++ b/blocks/src/documentcloud/save.js @@ -0,0 +1,36 @@ +/** + * WordPress dependencies. + */ +import { useBlockProps } from '@wordpress/block-editor'; + +/** + * Save component for the DocumentCloud block. + * + * @param {Object} props Block props. + * @param {Object} props.attributes Block attributes. + * @return {JSX.Element} Block save element. + */ +export default function Save( { attributes } ) { + const { embeddedHtml } = attributes; + + // Get block props + const blockProps = useBlockProps.save(); + + // If there's no embedded HTML yet, return empty container + if ( ! embeddedHtml ) { + return
; + } + + /** + * The embedded HTML is trusted code from the oEmbed endpoint so we can directly set it dangerously in the innerHTML. + * This allows the oEmbed code to directly embed in page from server and prevent nesting it inside an iframe. + */ + return ( +
+
+
+ ); +} diff --git a/blocks/src/documentcloud/utils/constants.js b/blocks/src/documentcloud/utils/constants.js new file mode 100644 index 0000000..a2a8c1e --- /dev/null +++ b/blocks/src/documentcloud/utils/constants.js @@ -0,0 +1,61 @@ +// Define the base document pattern with improved slug matching +const DOCUMENT_BASE = + '(https?):\\/\\/([\\w.-]*documentcloud\\.org)\\/documents\\/([0-9]+(?:-[\\w\\d%-]*)?)'; + +// Define pattern types and their associated regex patterns +export const PATTERN_CONFIGS = [ + { + type: 'document', + regex: new RegExp( `^${ DOCUMENT_BASE }(\\.html)?$` ), + }, + { + type: 'page_hash', + regex: new RegExp( + `^${ DOCUMENT_BASE }(\\.html)?\\/?\\??.*#document\\/p([0-9]+)$` + ), + pageGroup: 5, + }, + { + type: 'page_ext', + regex: new RegExp( + `^${ DOCUMENT_BASE }\\/pages\\/([0-9]+)\\.(html|js)$` + ), + pageGroup: 4, + }, + { + type: 'page_no_ext', + regex: new RegExp( + `^${ DOCUMENT_BASE }\\/pages\\/([0-9]+)\\/?\\??.*$` + ), + pageGroup: 4, + }, + { + type: 'note_annotations', + regex: new RegExp( + `^${ DOCUMENT_BASE }\\/annotations\\/([0-9]+)\\.(html|js)$` + ), + noteGroup: 4, + }, + { + type: 'note_annotations_embed', + regex: new RegExp( + `^${ DOCUMENT_BASE }\\/annotations\\/([0-9]+)\\/?\\??.*$` + ), + noteGroup: 4, + }, + { + type: 'note_hash_page', + regex: new RegExp( + `^${ DOCUMENT_BASE }(\\.html)?\\/?\\??.*#document\\/p([0-9]+)\\/a([0-9]+)$` + ), + pageGroup: 5, + noteGroup: 6, + }, + { + type: 'note_hash_annotation', + regex: new RegExp( + `^${ DOCUMENT_BASE }(\\.html)?\\/?\\??.*#annotation\\/a([0-9]+)(\\.[a-z]+)?$` + ), + noteGroup: 5, + }, +]; diff --git a/blocks/src/documentcloud/utils/utils.js b/blocks/src/documentcloud/utils/utils.js new file mode 100644 index 0000000..311ccef --- /dev/null +++ b/blocks/src/documentcloud/utils/utils.js @@ -0,0 +1,375 @@ +import { PATTERN_CONFIGS } from './constants'; + +/** + * Get the type of DocumentCloud URL. + * + * @param {string} url The URL to check + * @return {string} The URL type (document, note, page) + */ +export function getDocumentCloudUrlType( url ) { + if ( ! url ) { + return 'document'; + } + + // Parse the URL to extract components + const urlComponents = parseDocumentCloudUrl( url ); + + // Check for note ID - if present, it's a note URL + if ( urlComponents.note_id ) { + return 'note'; + } + + // Check for page number - if present, it's a page URL + if ( urlComponents.page_number ) { + return 'page'; + } + + // Direct check for annotation path in URL as a fallback + if ( url.includes( '/annotations/' ) ) { + return 'note'; + } + + // Default to document type + return 'document'; +} + +/** + * Generates the embed URL for a DocumentCloud document. + * + * @param {Object} params - Parameters for generating the URL. + * @param {boolean} params.useDocumentId - Whether to use document ID or URL. + * @param {string} params.documentId - The document ID. + * @param {string} params.url - The document URL. + * @param {boolean} params.title - Whether to show the title. + * @param {boolean} params.fullscreen - Whether to show fullscreen button. + * @param {boolean} params.onlyshoworg - Whether to only show organization. + * @param {boolean} params.pdf - Whether to show PDF download link. + * @param {string} params.style - Custom CSS style. + * @param {boolean} params.responsive - Should it be responsive. + * @return {string} The generated embed URL. + */ +export const getEmbedUrl = ( { + useDocumentId, + documentId, + url, + title, + fullscreen, + onlyshoworg, + pdf, + style, + responsive = true, +} ) => { + if ( ! ( useDocumentId ? documentId : url ) ) { + return ''; + } + + let baseUrl = ''; + + if ( useDocumentId && documentId ) { + const encodedId = encodeURIComponent( documentId.trim() ); + baseUrl = `https://www.documentcloud.org/documents/${ encodedId }`; + } else if ( ! useDocumentId && url ) { + baseUrl = url.trim(); + if ( ! baseUrl.startsWith( 'https://' ) ) { + baseUrl = baseUrl.replace( /^http:\/\//, 'https://' ); + } + } + + // Check if this is a page or note URL + const urlType = getDocumentCloudUrlType( baseUrl ); + const isSpecialUrl = urlType === 'page' || urlType === 'note'; + + // For page or note URLs, don't add query parameters if they already have a hash fragment + if ( + isSpecialUrl && + ( baseUrl.includes( '#document/p' ) || + baseUrl.includes( '#annotation/a' ) ) + ) { + // Just ensure it has embed=1 + if ( ! baseUrl.includes( 'embed=1' ) ) { + if ( baseUrl.includes( '?' ) ) { + baseUrl = baseUrl.replace( '?', '?embed=1&' ); + } else { + // Insert embed parameter before the hash + const hashIndex = baseUrl.indexOf( '#' ); + if ( hashIndex !== -1 ) { + baseUrl = + baseUrl.substring( 0, hashIndex ) + + '?embed=1' + + baseUrl.substring( hashIndex ); + } else { + baseUrl += '?embed=1'; + } + } + } + return baseUrl; + } + + if ( typeof title !== 'boolean' ) { + title = true; + } + + if ( typeof fullscreen !== 'boolean' ) { + fullscreen = true; + } + + // For regular document URLs, add the query parameters + const params = { + embed: 1, + title: title ? 1 : 0, + fullscreen: fullscreen ? 1 : 0, + onlyshoworg: onlyshoworg ? 1 : 0, + pdf: pdf ? 1 : 0, + style: style || '', + responsive: responsive ? 1 : 0, + }; + + const queryString = Object.entries( params ) + .filter( ( [ , value ] ) => value !== '' ) + .map( ( [ key, value ] ) => { + return `${ encodeURIComponent( key ) }=${ encodeURIComponent( + value + ) }`; + } ) + .join( '&' ); + + return queryString ? `${ baseUrl }?${ queryString }` : baseUrl; +}; + +/** + * Generates the oEmbed API URL for a DocumentCloud document. + * + * @param {string} documentUrl - The document URL. + * @param {string} width - The width of the embed. + * @param {string} height - The height of the embed. + * @return {string} The generated oEmbed API URL. + */ +export const getOEmbedApiUrl = ( documentUrl, width, height ) => { + if ( ! documentUrl ) { + return ''; + } + + const apiBaseUrl = 'https://api.www.documentcloud.org/api/oembed/'; + const params = new URLSearchParams(); + params.append( 'url', documentUrl ); + params.append( 'format', 'json' ); + params.append( 'dnt', '1' ); + + // Use maxwidth and maxheight for the oEmbed API + if ( width ) { + // Strip any non-numeric characters + const numericWidth = width.toString().replace( /[^0-9]/g, '' ); + if ( numericWidth ) { + params.append( 'maxwidth', numericWidth ); + } + } + + if ( height ) { + // Strip any non-numeric characters + const numericHeight = height.toString().replace( /[^0-9]/g, '' ); + if ( numericHeight ) { + params.append( 'maxheight', numericHeight ); + } + } + + return `${ apiBaseUrl }?${ params.toString() }`; +}; + +/** + * Parse a DocumentCloud URL into its components with optimized performance. + * + * @param {string} url The URL to parse + * @return {Object} The extracted URL components + */ +export const parseDocumentCloudUrl = ( url ) => { + if ( ! url ) { + return {}; + } + + // Early classification to reduce pattern testing + const patternSubset = getRelevantPatterns( url ); + + // Try each relevant pattern + for ( const patternConfig of patternSubset ) { + const match = url.match( patternConfig.regex ); + + if ( match ) { + // Extract the common parts + const elements = { + protocol: match[ 1 ], + dc_host: match[ 2 ], + document_slug: match[ 3 ], + }; + + // Extract page number if this pattern has one + if ( patternConfig.pageGroup && match[ patternConfig.pageGroup ] ) { + elements.page_number = match[ patternConfig.pageGroup ]; + } + + // Extract note ID if this pattern has one + if ( patternConfig.noteGroup && match[ patternConfig.noteGroup ] ) { + elements.note_id = match[ patternConfig.noteGroup ]; + } + + return elements; + } + } + + return {}; +}; + +/** + * Get a subset of patterns relevant to the URL format. + * This improves performance by reducing the number of regex tests. + * + * @param {string} url The URL to classify + * @return {Array} Subset of patterns to test + */ +function getRelevantPatterns( url ) { + // For page URLs + if ( url.includes( '/pages/' ) ) { + return PATTERN_CONFIGS.filter( + ( config ) => + config.type === 'page_ext' || config.type === 'page_no_ext' + ); + } + + // For annotation URLs + if ( url.includes( '/annotations/' ) ) { + return PATTERN_CONFIGS.filter( + ( config ) => config.type === 'note_annotations' + ); + } + + // For hash-based page references + if ( url.includes( '#document/p' ) ) { + if ( url.includes( '/a' ) ) { + return PATTERN_CONFIGS.filter( + ( config ) => config.type === 'note_hash_page' + ); + } + return PATTERN_CONFIGS.filter( + ( config ) => config.type === 'page_hash' + ); + } + + // For hash-based annotation references + if ( url.includes( '#annotation/a' ) ) { + return PATTERN_CONFIGS.filter( + ( config ) => config.type === 'note_hash_annotation' + ); + } + + // For basic document URLs (fallback) + return PATTERN_CONFIGS.filter( ( config ) => config.type === 'document' ); +} + +/** + * Fetches oEmbed data from a given API URL + * + * @param {string} apiUrl - The oEmbed API URL to fetch from + * @return {Promise<{html: string, error: string}>} - Promise resolving to object with html content and error + */ +export const fetchOEmbedData = async ( apiUrl ) => { + try { + const response = await fetch( apiUrl ); + if ( ! response.ok ) { + throw new Error( `HTTP error! Status: ${ response.status }` ); + } + + const data = await response.json(); + + // Extract the HTML content + const htmlContent = data.html || ''; + + return { + html: htmlContent, + error: '', + }; + } catch ( error ) { + return { + html: '', + error: 'Failed to load document preview.', + }; + } +}; + +/** + * Extracts configuration parameters from URL query string. + * This allows users to paste URLs with configuration already set. + * + * @param {string} rawURL - The raw URL potentially containing query parameters. + * @param {Function} handleDimensionChange - Function to update dimension attributes. + * @param {Function} onChangeStyle - Function to update style. + * @param {Function} setAttributes - Function to update block attributes. + * @return {URL|undefined} A cleaned URL object with parameters removed. + */ +export const extractAttributesFromHTML = ( + rawURL, + handleDimensionChange, + setAttributes +) => { + if ( ! rawURL ) { + return; + } + + // Parse the URL to access query parameters. + const parsedURL = new URL( rawURL ); + + if ( parsedURL ) { + try { + const searchParams = parsedURL.searchParams; + + // Extract height parameter. + const localHeight = searchParams.get( 'height' ); + searchParams.delete( 'height' ); + if ( localHeight ) { + handleDimensionChange( 'height', localHeight ); + } + + // Extract width parameter. + const localWidth = searchParams.get( 'width' ); + searchParams.delete( 'width' ); + if ( localWidth ) { + handleDimensionChange( 'width', localWidth ); + } + + // Extract title display parameter. + const localTitle = String( searchParams.get( 'title' ) ); + searchParams.delete( 'title' ); + if ( [ '0', '1' ].includes( localTitle ) ) { + const parsedTitle = localTitle === '1'; + setAttributes( { title: parsedTitle } ); + } + + // Extract organization display parameter. + const localOnlyShowOrg = String( + searchParams.get( 'onlyshoworg' ) + ); + searchParams.delete( 'onlyshoworg' ); + if ( [ '0', '1' ].includes( localOnlyShowOrg ) ) { + const parsedOnlyShowOrg = localOnlyShowOrg === '1'; + setAttributes( { onlyshoworg: parsedOnlyShowOrg } ); + } + + // Extract fullscreen button parameter. + const localFullScreen = String( searchParams.get( 'fullscreen' ) ); + searchParams.delete( 'fullscreen' ); + if ( [ '0', '1' ].includes( localFullScreen ) ) { + const parsedFullScreen = localFullScreen === '1'; + setAttributes( { fullscreen: parsedFullScreen } ); + } + + // Extract PDF download link parameter. + const localPdf = String( searchParams.get( 'pdf' ) ); + searchParams.delete( 'pdf' ); + if ( [ '0', '1' ].includes( localPdf ) ) { + const parsedPdf = localPdf === '1'; + setAttributes( { pdf: parsedPdf } ); + } + } catch { + // Silent error handling to prevent breaking the UI. + } + } + return parsedURL; +}; diff --git a/blocks/src/documentcloud/utils/validation.js b/blocks/src/documentcloud/utils/validation.js new file mode 100644 index 0000000..807f2d8 --- /dev/null +++ b/blocks/src/documentcloud/utils/validation.js @@ -0,0 +1,135 @@ +import { __ } from '@wordpress/i18n'; + +/** + * Validates a DocumentCloud URL. + * Checks for HTTPS protocol and valid DocumentCloud domains. + * + * @param {string} testUrl - The URL to validate. + * @return {Object} Object with valid (boolean) and message (string) properties. + */ +export const validateUrl = ( testUrl ) => { + // URL cannot be empty. + if ( ! testUrl ) { + return { + valid: false, + message: __( 'Please enter a DocumentCloud URL.', 'documentcloud' ), + }; + } + + const sanitizedUrl = testUrl.trim(); + + // List of valid DocumentCloud domains. + const validDomains = new Set( [ + 'documentcloud.org', + 'www.documentcloud.org', + 'beta.documentcloud.org', + 'embed.documentcloud.org', + 'assets.documentcloud.org', + ] ); + + try { + // Parse URL to validate and extract components. + const urlObj = new URL( sanitizedUrl ); + + // URL must use HTTPS protocol. + if ( 'https:' !== urlObj.protocol ) { + return { + valid: false, + message: __( 'URL must use HTTPS protocol.', 'documentcloud' ), + }; + } + + // URL hostname must be a valid DocumentCloud domain. + if ( validDomains.has( urlObj.hostname ) ) { + return { valid: true, message: '' }; + } + + return { + valid: false, + message: __( + 'URL must be from a valid DocumentCloud domain.', + 'documentcloud' + ), + }; + } catch ( e ) { + // Return error if URL parsing fails. + return { + valid: false, + message: __( 'Please enter a valid URL.', 'documentcloud' ), + }; + } +}; + +/** + * Validates a DocumentCloud Document ID. + * Currently only checks that ID is not empty. + * + * @param {string} id - The Document ID to validate. + * @return {Object} Object with valid (boolean) and message (string) properties. + */ +export const validateDocumentId = ( id ) => { + if ( ! id ) { + return { + valid: false, + message: __( 'Please enter a DocumentCloud ID.', 'documentcloud' ), + }; + } + return { valid: true, message: '' }; +}; + +/** + * Validates CSS style syntax. + * Performs basic validation to ensure style string has valid CSS format. + * + * @param {string} styleString - The CSS style string to validate. + * @return {Object} Object with valid (boolean) and message (string) properties. + */ +export const validateStyle = ( styleString ) => { + // Empty style is always valid. + if ( ! styleString || '' === styleString.trim() ) { + return { valid: true, message: '' }; + } + + try { + // If style doesn't have basic CSS syntax characters, it's valid. + if ( ! styleString.includes( ';' ) && ! styleString.includes( ':' ) ) { + return { valid: true, message: '' }; + } + + // Split style into individual declarations. + const styleEntries = styleString.split( ';' ).filter( Boolean ); + + // Validate each CSS declaration. + for ( const entry of styleEntries ) { + if ( entry.trim() && ! entry.includes( ':' ) ) { + continue; + } + + if ( entry.trim() && entry.includes( ':' ) ) { + const colonIndex = entry.indexOf( ':' ); + const property = entry.substring( 0, colonIndex ).trim(); + + // Property name cannot be empty. + if ( ! property ) { + return { + valid: false, + message: __( + 'Invalid CSS: Empty property name.', + 'documentcloud' + ), + }; + } + } + } + + return { valid: true, message: '' }; + } catch ( error ) { + // Return validation error if an exception occurs. + return { + valid: false, + message: `${ __( 'Invalid CSS:', 'documentcloud' ) } ${ + error.message + }`, + }; + } +}; diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..9df40b3 --- /dev/null +++ b/composer.json @@ -0,0 +1,12 @@ +{ + "name": "documentcloud/documentcloud", + "autoload": { + "psr-4": { + "Documentcloud\\Documentcloud\\": "src/" + } + }, + "require-dev": { + "phpunit/phpunit": "^11", + "yoast/phpunit-polyfills": "^4.0" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 0000000..701e3ac --- /dev/null +++ b/composer.lock @@ -0,0 +1,1770 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "e71772f75c26190a19f3c4b7f8903bb9", + "packages": [], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/024473a478be9df5fdaca2c793f2232fe788e414", + "reference": "024473a478be9df5fdaca2c793f2232fe788e414", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-02-12T12:17:51+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + }, + "time": "2024-12-30T11:07:19+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.2" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-25T13:26:39+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.17", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fd2e863a2995cdfd864fb514b5e0b28b09895b5c", + "reference": "fd2e863a2995cdfd864fb514b5e0b28b09895b5c", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.0", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.2", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.17" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-04-08T07:59:11+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-07T06:57:01+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "reference": "855f3ae0ab316bbafe1ba4e16e9f3c078d24a0c5", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:54:44+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-05T09:17:50+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:10:34+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-18T13:35:50+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "yoast/phpunit-polyfills", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", + "reference": "134921bfca9b02d8f374c48381451da1d98402f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/134921bfca9b02d8f374c48381451da1d98402f9", + "reference": "134921bfca9b02d8f374c48381451da1d98402f9", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0 || ^11.0 || ^12.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "yoast/yoastcs": "^3.1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + } + }, + "autoload": { + "files": [ + "phpunitpolyfills-autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Team Yoast", + "email": "support@yoast.com", + "homepage": "https://yoast.com" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" + } + ], + "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", + "keywords": [ + "phpunit", + "polyfill", + "testing" + ], + "support": { + "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", + "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy", + "source": "https://github.com/Yoast/PHPUnit-Polyfills" + }, + "time": "2025-02-09T18:58:54+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/docker-compose.yml b/docker-compose.yml index 53bf312..41e5920 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,11 +13,30 @@ services: WORDPRESS_TABLE_PREFIX: wp_ volumes: - ./src/wordpress:/var/www/html - - ./documentcloud.php:/var/www/html/wp-content/plugins/documentcloud/documentcloud.php + - ./:/var/www/html/wp-content/plugins/documentcloud + depends_on: - db networks: - wp_net + + testing: + build: + context: . + dockerfile: Dockerfile + container_name: Testing + volumes: + - .:/var/www/html + depends_on: + - db + networks: + - wp_net + environment: + MYSQL_HOST: db + MYSQL_USER: root + MYSQL_PASSWORD: password + MYSQL_DATABASE: wordpress_test + command: sh -c "composer install && tail -f /dev/null" phpmyadmin: depends_on: @@ -37,6 +56,8 @@ services: db: image: mariadb:latest container_name: db + ports: + - 3306:3306 volumes: - db_data:/var/lib/mysql environment: diff --git a/documentcloud.php b/documentcloud.php index af0dbaa..8fd90ee 100644 --- a/documentcloud.php +++ b/documentcloud.php @@ -3,11 +3,17 @@ * Plugin Name: DocumentCloud * Plugin URI: https://www.documentcloud.org/ * Description: Embed DocumentCloud resources in WordPress content. - * Version: 0.5.1 + * Version: 0.6.0 * Authors: Chris Amico, Justin Reese, Dylan Freedman + * Text Domain: documentcloud * License: GPLv2 -***/ -/* + * Requires at least: 5.0 + * Tested up to: 6.8 + * + * @package DocumentCloud + */ + +/** Copyright 2011 National Public Radio, Inc. Copyright 2015 DocumentCloud, Investigative Reporters & Editors Copyright 2021 MuckRock Foundation, Inc. @@ -24,60 +30,75 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + */ + +define( 'DOCUMENTCLOUD_BUILD_PATH', trailingslashit( plugin_dir_path( __FILE__ ) ) . 'blocks/build/' ); +define( 'DOCUMENTCLOUD_PATH', trailingslashit( plugin_dir_path( __FILE__ ) ) ); +define( 'DOCUMENTCLOUD_URL', trailingslashit( plugin_dir_url( __FILE__ ) ) ); + +require_once DOCUMENTCLOUD_PATH . 'inc/utils/autoloader.php'; +use DocumentCloud\Inc\Classes\Blocks; + +/** + * This class is the primary Plugin Entrypoint. + */ class WP_DocumentCloud { - // Plugin constants - const CACHING_ENABLED = true, - DEFAULT_EMBED_FULL_WIDTH = 940, - OEMBED_RESOURCE_DOMAIN = 'www.documentcloud.org', - OEMBED_PROVIDER = 'https://www.documentcloud.org/api/oembed.{format}', + // Plugin constants. + const CACHING_ENABLED = true, + DEFAULT_EMBED_FULL_WIDTH = 940, + OEMBED_RESOURCE_DOMAIN = 'www.documentcloud.org', + OEMBED_PROVIDER = 'https://www.documentcloud.org/api/oembed.{format}', DOCUMENT_PATTERN = '^(?Phttps?):\/\/(?P.*documentcloud\.org)\/documents\/(?P[0-9]+-[\p{L}\p{N}%-]+)', - CONTAINER_TEMPLATE_START = "
", - CONTAINER_TEMPLATE_END = "
", - BETA_ID_CUTOFF = 20000000, + CONTAINER_TEMPLATE_START = '
', + CONTAINER_TEMPLATE_END = '
', + BETA_ID_CUTOFF = 20000000, BETA_OEMBED_RESOURCE_DOMAIN = 'beta.documentcloud.org', BETA_OEMBED_DOMAIN_MATCH = '#https?://(www\.)?(beta|embed).documentcloud.org/.*#i', - BETA_OEMBED_PROVIDER = 'https://api.beta.documentcloud.org/api/oembed'; + BETA_OEMBED_PROVIDER = 'https://api.beta.documentcloud.org/api/oembed'; /** * Constructor. */ - function __construct() { + public function __construct() { // Check for conflicts with other DocumentCloud plugins. // Not needed on WordPress VIP since no other DocumentCloud plugins exist. if ( ! defined( 'WPCOM_IS_VIP_ENV' ) || ! WPCOM_IS_VIP_ENV ) { add_action( 'admin_init', array( $this, 'check_dc_plugin_conflict' ) ); } - // Register the oEmbed provider + // Register the oEmbed provider. add_action( 'init', array( $this, 'register_dc_oembed_provider' ) ); - // Set the textdomain for the plugin so it is translation compatible - add_action( 'plugins_loaded', array( $this, 'load_plugin_textdomain' ) ); + // Set the textdomain for the plugin so it is translation compatible. + add_action( 'init', array( $this, 'load_plugin_textdomain' ) ); - // Only called when `[documentcloud]` shortcode is used + // Only called when `[documentcloud]` shortcode is used. add_shortcode( 'documentcloud', array( $this, 'process_dc_shortcode' ) ); - // Called just before oEmbed endpoint is hit + // Called just before oEmbed endpoint is hit. add_filter( 'oembed_fetch_url', array( $this, 'prepare_oembed_fetch' ), 10, 3 ); - // Setup the settings page + // Setup the settings page. add_action( 'admin_menu', array( $this, 'add_options_page' ) ); add_action( 'admin_init', array( $this, 'settings_init' ) ); + + add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) ); + + Blocks::instance(); } /** * Load plugin textdomain. */ - function load_plugin_textdomain() { + public function load_plugin_textdomain(): void { load_plugin_textdomain( 'documentcloud' ); } /** * Check for conflicts with the Navis DocumentCloud plugin. */ - function check_dc_plugin_conflict() { + public function check_dc_plugin_conflict() { if ( is_plugin_active( 'navis-documentcloud/navis-documentcloud.php' ) ) { add_action( 'admin_notices', array( $this, 'dc_conflict_admin_notice' ) ); } @@ -86,7 +107,7 @@ function check_dc_plugin_conflict() { /** * Create an admin notice when conflicts exist with Navis DocumentCloud. */ - function dc_conflict_admin_notice() { + public function dc_conflict_admin_notice() { ?>

Warning! You have two conflicting DocumentCloud plugins activated. Please deactivate Navis DocumentCloud, which has been replaced by DocumentCloud.', 'documentcloud' ) ); ?>

@@ -99,7 +120,7 @@ function dc_conflict_admin_notice() { * resource to inspect it for an oEmbed link tag; we have to tell it what * our oEmbed endpoint looks like. */ - function register_dc_oembed_provider() { + public function register_dc_oembed_provider() { /* Hello developer. If you wish to test this plugin against your local installation of DocumentCloud (with its own testing @@ -111,18 +132,18 @@ function register_dc_oembed_provider() { add_filter( 'http_request_host_is_external', '__return_true'); */ - $oembed_resource_domain = apply_filters( 'documentcloud_oembed_resource_domain', WP_DocumentCloud::OEMBED_RESOURCE_DOMAIN ); - $oembed_provider = apply_filters( 'documentcloud_oembed_provider', WP_DocumentCloud::OEMBED_PROVIDER ); + $oembed_resource_domain = apply_filters( 'documentcloud_oembed_resource_domain', self::OEMBED_RESOURCE_DOMAIN ); + $oembed_provider = apply_filters( 'documentcloud_oembed_provider', self::OEMBED_PROVIDER ); - wp_oembed_add_provider( 'http://' . $oembed_resource_domain . '/documents/*', $oembed_provider ); - wp_oembed_add_provider( 'https://' . $oembed_resource_domain . '/documents/*', $oembed_provider ); + wp_oembed_add_provider( 'http://' . $oembed_resource_domain . '/documents/*', $oembed_provider ); + wp_oembed_add_provider( 'https://' . $oembed_resource_domain . '/documents/*', $oembed_provider ); - // Add oembed provider for the DocumentCloud beta - wp_oembed_add_provider( - WP_DocumentCloud::BETA_OEMBED_DOMAIN_MATCH, - WP_DocumentCloud::BETA_OEMBED_PROVIDER, - true - ); + // Add oembed provider for the DocumentCloud beta. + wp_oembed_add_provider( + self::BETA_OEMBED_DOMAIN_MATCH, + self::BETA_OEMBED_PROVIDER, + true + ); } /** @@ -130,17 +151,17 @@ function register_dc_oembed_provider() { * * @return array */ - function get_default_sizes() { + public function get_default_sizes() { $wp_embed_defaults = wp_embed_defaults(); - $height = intval( get_option( 'documentcloud_default_height', $wp_embed_defaults['height'] ) ); - $width = intval( get_option( 'documentcloud_default_width', $wp_embed_defaults['width'] ) ); - $full_width = intval( get_option( 'documentcloud_full_width', WP_DocumentCloud::DEFAULT_EMBED_FULL_WIDTH ) ); + $height = intval( get_option( 'documentcloud_default_height', $wp_embed_defaults['height'] ) ); + $width = intval( get_option( 'documentcloud_default_width', $wp_embed_defaults['width'] ) ); + $full_width = intval( get_option( 'documentcloud_full_width', self::DEFAULT_EMBED_FULL_WIDTH ) ); return array( - 'height' => $height, - 'width' => $width, - 'full_width' => $full_width, + 'height' => $height, + 'width' => $width, + 'full_width' => $full_width, ); } @@ -149,7 +170,7 @@ function get_default_sizes() { * * @return array */ - function get_default_atts() { + public function get_default_atts() { $default_sizes = $this->get_default_sizes(); return array( @@ -164,63 +185,94 @@ function get_default_atts() { 'responsive' => null, 'sidebar' => null, 'text' => null, - 'pdf' => null, + 'pdf' => 0, + 'onlyshoworg' => 0, + 'title' => null, + 'fullscreen' => 1, // The following defaults match the existing plugin, except // `height/width` are prefixed `max*` per the oEmbed spec. // You can still use `height/width` for backwards // compatibility, but they'll be mapped to `max*`. // Precedence (lower number == higher priority): - // 1. `width` on shortcode - // 2. `maxwidth` on shortcode - // 3. Settings > DocumentCloud > "Default embed width" - // 4. `wp_embed_defaults()['width']` + // 1. `width` on shortcode. + // 2. `maxwidth` on shortcode. + // 3. Settings > DocumentCloud > "Default embed width". + // 4. `wp_embed_defaults()['width']`. 'maxheight' => $default_sizes['height'], 'maxwidth' => $default_sizes['width'], 'format' => 'normal', + 'style' => null, ); } /** * Prepare the oEmbed fetch URL. * - * @param string $provider - * @param string $url - * @param array $args + * @param string $provider The oEmbed URL Provider. + * @param string $url The URL of the Embed. + * @param array $args The arguments to be passed to the endpoint. * @return string */ - function prepare_oembed_fetch( $provider, $url, $args ) { - // Merge actual args with default attributes so that defaults are always - // sent to oEmbed endpoint + public function prepare_oembed_fetch( $provider, $url, $args ) { + // Merge actual args with default attributes so that defaults are always sent to oEmbed endpoint. $default_atts = $this->get_default_atts(); - $atts = array_merge( $default_atts, $args ); + + // Parse the Embed URL and extract the query parameters. + $raw_query_args = wp_parse_url( $url, PHP_URL_QUERY ); + if ( ! empty( $raw_query_args ) ) { + $url_args = array(); + wp_parse_str( $raw_query_args, $url_args ); + + // Add the query parameters to allow whitelisting them in URL for Embed. + $args = array_merge( $args, $url_args ); + + // Set the width to maxwidth so that it can be added to the oEmbed endpoint instead of the actual URL. + if ( isset( $url_args['width'] ) ) { + $args['maxwidth'] = $url_args['width']; + } + + // Set the height to maxheight so that it can be added to the oEmbed endpoint instead of the actual URL. + if ( isset( $url_args['height'] ) ) { + $args['maxheight'] = $url_args['height']; + } + + // If the width is set from url we should set the responsive to false just like how the shortcode works. + if ( isset( $url_args['width'] ) && ! array_key_exists( 'responsive', $url_args ) ) { + $args['responsive'] = 0; + } + } + + $atts = wp_parse_args( $args, $default_atts ); // Some resources (like notes) have multiple possible // user-facing URLs. We recompose them into a single form. $url = $this->clean_dc_url( $url ); - // Send these to the oEmbed endpoint itself + // Send these to the oEmbed endpoint itself. $oembed_config_keys = array( 'maxheight', 'maxwidth' ); - // Specifically *don't* include these on the embed config itself + // Specifically *don't* include these on the embed config itself. $excluded_embed_config_keys = array( 'url', 'format', 'height', 'width', 'maxheight', 'maxwidth', 'discover' ); - // Clean and prepare arguments + // Clean and prepare arguments. foreach ( $atts as $key => $value ) { - if ( in_array( $key, $oembed_config_keys ) ) { + if ( in_array( $key, $oembed_config_keys, true ) ) { $provider = add_query_arg( $key, $value, $provider ); } - if ( ! in_array( $key, $excluded_embed_config_keys ) ) { - // Without this check, `add_query_arg()` will treat values - // that are actually ID selectors, like `container=#foo`, - // as URL fragments and throw them at the end of the URL. + if ( ! in_array( $key, $excluded_embed_config_keys, true ) ) { + /** + * Without this check, `add_query_arg()` will treat values + * that are actually ID selectors, like `container=#foo`, + * as URL fragments and throw them at the end of the URL. + */ if ( 0 === strpos( $value, '#' ) ) { - $value = urlencode( $value ); + $value = rawurlencode( $value ); } $url = add_query_arg( $key, $value, $url ); } } - $provider = add_query_arg( 'url', urlencode( $url ), $provider ); + $provider = add_query_arg( 'url', rawurlencode( $url ), $provider ); return $provider; } @@ -228,16 +280,16 @@ function prepare_oembed_fetch( $provider, $url, $args ) { /** * Create the DocumentCloud embed output from the shortcode. * - * @param array $atts + * @param array $atts Shortcode attributes. * @return string */ - function process_dc_shortcode( $atts ) { - $default_sizes = $this->get_default_sizes(); - $default_atts = $this->get_default_atts(); + public function process_dc_shortcode( $atts ) { + $default_sizes = $this->get_default_sizes(); + $default_atts = $this->get_default_atts(); // Smooshes together passed-in shortcode attrs with defaults // and filters to only those we accept. - $filtered_atts = shortcode_atts( $default_atts, $atts ); + $filtered_atts = shortcode_atts( $default_atts, $atts ); // Either the `url` or `id` attributes are required, but `id` // is only supported for backwards compatibility. If it's used, @@ -246,16 +298,16 @@ function process_dc_shortcode( $atts ) { if ( empty( $atts['url'] ) ) { if ( empty( $atts['id'] ) ) { return ''; + // Determine which URL on the basis of the DocumentCloud ID. + } elseif ( intval( $atts['id'] ) >= self::BETA_ID_CUTOFF ) { + // Populate beta URL. + // TODO: use only one URL after the switch. + $url = 'https://' . self::BETA_OEMBED_RESOURCE_DOMAIN . "/documents/{$atts['id']}.html"; + $filtered_atts['url'] = $url; } else { - // Determine which URL on the basis of the DocumentCloud ID - if (intval($atts['id']) >= WP_DocumentCloud::BETA_ID_CUTOFF) { - // Populate beta URL - // TODO: use only one URL after the switch - $url = $filtered_atts['url'] = 'https://' . WP_DocumentCloud::BETA_OEMBED_RESOURCE_DOMAIN . "/documents/{$atts['id']}.html"; - } else { - // Populate legacy URL - $url = $filtered_atts['url'] = 'https://' . WP_DocumentCloud::OEMBED_RESOURCE_DOMAIN . "/documents/{$atts['id']}.html"; - } + // Populate legacy URL. + $url = 'https://' . self::OEMBED_RESOURCE_DOMAIN . "/documents/{$atts['id']}.html"; + $filtered_atts['url'] = $url; } } @@ -272,7 +324,7 @@ function process_dc_shortcode( $atts ) { // hasn't otherwise specifically indicated `responsive='true'`, // it's safe to assume they expect us to respect the width, so // we disable the responsive flag. - if ( ( isset( $atts['width'] ) || isset( $atts['maxwidth'] ) ) && 'true' !== $atts['responsive'] ) { + if ( ( isset( $atts['width'] ) || isset( $atts['maxwidth'] ) ) && ( ! array_key_exists( 'responsive', $atts ) || 'true' !== $atts['responsive'] ) ) { $filtered_atts['responsive'] = 'false'; } @@ -287,35 +339,35 @@ function process_dc_shortcode( $atts ) { global $post; $is_wide = intval( $filtered_atts['maxwidth'] ) > $default_sizes['width']; - if ( apply_filters( 'documentcloud_caching_enabled', WP_DocumentCloud::CACHING_ENABLED ) ) { + if ( apply_filters( 'documentcloud_caching_enabled', self::CACHING_ENABLED ) ) { // This lets WordPress cache the result of the oEmbed call. // Thanks to http://bit.ly/1HykA0U for this pattern. global $wp_embed; - $url = $filtered_atts['url'] = $this->clean_dc_url( $atts['url'] ); - return WP_DocumentCloud::CONTAINER_TEMPLATE_START . $wp_embed->shortcode( $filtered_atts, $url ) . WP_DocumentCloud::CONTAINER_TEMPLATE_END; + $filtered_atts['url'] = $this->clean_dc_url( $filtered_atts['url'] ); + $url = $filtered_atts['url']; + return self::CONTAINER_TEMPLATE_START . $wp_embed->shortcode( $filtered_atts, $url ) . self::CONTAINER_TEMPLATE_END; } else { - return WP_DocumentCloud::CONTAINER_TEMPLATE_START . wp_oembed_get( $atts['url'], $filtered_atts ) . WP_DocumentCloud::CONTAINER_TEMPLATE_END; + return self::CONTAINER_TEMPLATE_START . wp_oembed_get( $filtered_atts['url'], $filtered_atts ) . self::CONTAINER_TEMPLATE_END; } - } /** * Parse the DocumentCloud URL into its components. * - * @param string $url + * @param string $url URL. * @return array */ - function parse_dc_url( $url ) { + public function parse_dc_url( $url ) { $patterns = array( - // Document - '{' . WP_DocumentCloud::DOCUMENT_PATTERN . '(\.html)?$}', - // Pages and page variants - '{' . WP_DocumentCloud::DOCUMENT_PATTERN . '(\.html)?#document\/p(?P[0-9]+)$}', - '{' . WP_DocumentCloud::DOCUMENT_PATTERN . '\/pages\/(?P[0-9]+)\.(html|js)$}', - // Notes and note variants - '{' . WP_DocumentCloud::DOCUMENT_PATTERN . '\/annotations\/(?P[0-9]+)\.(html|js)$}', - '{' . WP_DocumentCloud::DOCUMENT_PATTERN . '(\.html)?#document\/p([0-9]+)/a(?P[0-9]+)$}', - '{' . WP_DocumentCloud::DOCUMENT_PATTERN . '(\.html)?#annotation\/a(?P[0-9]+)(\.[a-z]+)?$}', + // Document. + '{' . self::DOCUMENT_PATTERN . '(\.html)?$}', + // Pages and page variants. + '{' . self::DOCUMENT_PATTERN . '(\.html)?#document\/p(?P[0-9]+)$}', + '{' . self::DOCUMENT_PATTERN . '\/pages\/(?P[0-9]+)\.(html|js)$}', + // Notes and note variants. + '{' . self::DOCUMENT_PATTERN . '\/annotations\/(?P[0-9]+)\.(html|js)$}', + '{' . self::DOCUMENT_PATTERN . '(\.html)?#document\/p([0-9]+)/a(?P[0-9]+)$}', + '{' . self::DOCUMENT_PATTERN . '(\.html)?#annotation\/a(?P[0-9]+)(\.[a-z]+)?$}', ); $elements = array(); @@ -332,16 +384,16 @@ function parse_dc_url( $url ) { /** * Clean the DocumentCloud URL. * - * @param string $url + * @param string $url URL. * @return string */ - function clean_dc_url( $url ) { + public function clean_dc_url( $url ) { $elements = $this->parse_dc_url( $url ); if ( isset( $elements['document_slug'] ) ) { $url = "{$elements['protocol']}://{$elements['dc_host']}/documents/{$elements['document_slug']}"; if ( isset( $elements['page_number'] ) ) { $url .= "/pages/{$elements['page_number']}"; - } else if ( isset( $elements['note_id'] ) ) { + } elseif ( isset( $elements['note_id'] ) ) { $url .= "/annotations/{$elements['note_id']}"; } $url .= '.html'; @@ -352,7 +404,7 @@ function clean_dc_url( $url ) { /** * Add the DocumentCloud options page. */ - function add_options_page() { + public function add_options_page() { if ( current_user_can( 'manage_options' ) ) { add_options_page( 'DocumentCloud', 'DocumentCloud', 'manage_options', 'documentcloud', array( $this, 'render_options_page' ) ); } @@ -361,13 +413,14 @@ function add_options_page() { /** * Render the DocumentCloud options page. */ - function render_options_page() { - // TODO: remove the responsive warning after the switch + public function render_options_page() { + // TODO: remove the responsive warning after the switch. ?> -

+

+

-

-

responsive="false" on an embed.', 'documentcloud' ) ) ?>

+

responsive="false" on an embed.', 'documentcloud' ) ); ?>

@@ -380,7 +433,7 @@ function render_options_page() { /** * Initialize settings for the DocumentCloud options page. */ - function settings_init() { + public function settings_init() { if ( current_user_can( 'manage_options' ) ) { add_settings_section( 'documentcloud', @@ -396,7 +449,14 @@ function settings_init() { 'documentcloud', 'documentcloud' ); - register_setting( 'documentcloud', 'documentcloud_default_height' ); + register_setting( + 'documentcloud', + 'documentcloud_default_height', + array( + 'show_in_rest' => true, + 'sanitize_callback' => 'sanitize_text_field', + ) + ); add_settings_field( 'documentcloud_default_width', @@ -405,7 +465,14 @@ function settings_init() { 'documentcloud', 'documentcloud' ); - register_setting( 'documentcloud', 'documentcloud_default_width' ); + register_setting( + 'documentcloud', + 'documentcloud_default_width', + array( + 'show_in_rest' => true, + 'sanitize_callback' => 'sanitize_text_field', + ) + ); add_settings_field( 'documentcloud_full_width', @@ -414,33 +481,62 @@ function settings_init() { 'documentcloud', 'documentcloud' ); - register_setting( 'documentcloud', 'documentcloud_full_width' ); + register_setting( + 'documentcloud', + 'documentcloud_full_width', + array( + 'show_in_rest' => true, + 'sanitize_callback' => 'sanitize_text_field', + ) + ); } } /** * Render the default height field. */ - function default_height_field() { + public function default_height_field() { $default_sizes = $this->get_default_sizes(); - echo ''; + echo ''; } /** * Render the default width field. */ - function default_width_field() { + public function default_width_field() { $default_sizes = $this->get_default_sizes(); - echo ''; + echo ''; } /** * Render the full width field. */ - function full_width_field() { + public function full_width_field() { $default_sizes = $this->get_default_sizes(); - echo ''; + echo ''; + } + + /** + * This function adds the admin styles for the plugin. + * + * @param string $hook The current admin page hook name. + * + * @return void + */ + public function enqueue_admin_styles( string $hook ) { + + if ( 'settings_page_documentcloud' === $hook ) { + + wp_register_style( + 'documentcloud-admin-styles', + DOCUMENTCLOUD_URL . 'assets/css/settings-documentcloud.css', + array(), + '1.0.0' + ); + + wp_enqueue_style( 'documentcloud-admin-styles' ); + } } } -new WP_DocumentCloud; +new WP_DocumentCloud(); diff --git a/inc/classes/blocks/class-document-cloud.php b/inc/classes/blocks/class-document-cloud.php new file mode 100644 index 0000000..fb83cda --- /dev/null +++ b/inc/classes/blocks/class-document-cloud.php @@ -0,0 +1,31 @@ +static_blocks = array( + DocumentCloud::BLOCK_NAME => DocumentCloud::instance(), + ); + + $this->setup_hooks(); + } + + /** + * Setup WordPress action and filter hooks. + * + * @since 1.0.0 + * + * @return void + */ + public function setup_hooks() { + add_action( 'init', array( $this, 'register_blocks' ) ); + } + + /** + * Register all custom Gutenberg blocks. + * + * Iterates through the dynamic_blocks array and registers each block. + * + * @since 1.0.0 + * + * @return void + */ + public function register_blocks() { + + // Register Static Blocks. + foreach ( $this->static_blocks as $block_key => $block_instance ) { + register_block_type( + trailingslashit( DOCUMENTCLOUD_BUILD_PATH ) . $block_key + ); + } + } +} diff --git a/inc/traits/trait-singleton.php b/inc/traits/trait-singleton.php new file mode 100644 index 0000000..37394d3 --- /dev/null +++ b/inc/traits/trait-singleton.php @@ -0,0 +1,93 @@ + + + + + ./tests/ + ./tests/test-sample.php + + + + + documentcloud.php + + + diff --git a/readme.txt b/readme.txt index feec2a0..37b2ea2 100644 --- a/readme.txt +++ b/readme.txt @@ -1,8 +1,8 @@ === DocumentCloud === Contributors: chrisamico, reefdog, freedmand Tags: documentcloud, documents, journalism, reporting, research -Requires at least: 3.5 -Tested up to: 5.5 +Requires at least: 5.0 +Tested up to: 6.8 Stable tag: trunk License: GPLv2 License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -66,6 +66,23 @@ Here's the full list of embed options you can pass via shortcode attributes; som - `zoom` (boolean): Hide or show zoom slider. - `format` (string): Indicate to the theme that this is a wide asset by setting this to `wide`. Defaults `normal`. +Or as a Gutenberg Block: + + DocumentCloud + +Here's the list of settings that can be used for the block: +- `WIDTH` (number): Sets the width of the document (optional) +- `HEIGHT` (number): Sets the height of the document (optional) +- `STYLE` (string): Adds additional style to the embedded document (optional) + +The following options can only be used for Documents: +- `Show Title` (toggle): Determines whether to show the title of the embedded document +- `Show FullScreen Button` (toggle): Determines whether to show a full screen icon on the document +- `Only Show Organization` (toggle): Determines whether to only show the organization name that published the document. +- `Show PDF Download Link` (toggle): Determines whether to show the download as pdf icon for documents. + +**Note** - The default width and height from the Settings does not work for the Gutenberg Block. + You can read more about publishing and embedding DocumentCloud resources on https://www.documentcloud.org/help/publishing. == Installation == @@ -79,6 +96,16 @@ You can read more about publishing and embedding DocumentCloud resources on http == Changelog == += 0.6.0 = +* Add Gutenberg block for embedding DocumentCloud documents resonating a functionality similar to the shortcode. +* Update the shortcode to support the following attributes + * `onlyshoworg` - When set to 1 it only displays the organization name + * `pdf` - When set to 1 it shows a pdf download icon + * `showfullscreen` - When set to 1 it displays a full screen icon. + * `title` - When set to 1 it displays the title of the document. +* Allow setting the query parameter attributes when directly embedding the url in Embed block. + + = 0.5.1 = * Expand regex support to catch more DocumentCloud URLs @@ -139,3 +166,8 @@ Adds support for embedding notes and enables caching. = 0.2 = Adds oEmbed support for future-proofing embed codes. Provides additional embed options like `default_page`. + + +== Screenshots == + +1. DocumentCloud Gutenberg Block in the Editor. diff --git a/tests/Test_WP_DocumentCloud.php b/tests/Test_WP_DocumentCloud.php new file mode 100644 index 0000000..cce4aef --- /dev/null +++ b/tests/Test_WP_DocumentCloud.php @@ -0,0 +1,235 @@ +dc = new WP_DocumentCloud(); + } + + /** + * Test the get_default_sizes method. + * + * Ensures the method returns an array with the correct keys and values. + */ + public function test_get_default_sizes() { + // Set options to test. + update_option( 'documentcloud_default_height', 500 ); + update_option( 'documentcloud_default_width', 800 ); + update_option( 'documentcloud_full_width', 1200 ); + + // Call the method. + $sizes = $this->dc->get_default_sizes(); + + // Assert the keys exist. + $this->assertArrayHasKey( 'height', $sizes ); + $this->assertArrayHasKey( 'width', $sizes ); + $this->assertArrayHasKey( 'full_width', $sizes ); + + // Assert the values are correct. + $this->assertEquals( 500, $sizes['height'] ); + $this->assertEquals( 800, $sizes['width'] ); + $this->assertEquals( 1200, $sizes['full_width'] ); + } + + /** + * Test the process_dc_shortcode method with no URL or ID. + * + * Ensures the method returns an empty string when no URL or ID is provided. + */ + public function test_process_dc_shortcode_no_url_or_id() { + $atts = array(); // No URL or ID provided. + $result = $this->dc->process_dc_shortcode( $atts ); + + // Assert that the result is an empty string. + $this->assertEquals( '', $result ); + } + + /** + * Test the process_dc_shortcode method with a valid URL. + * + * Ensures the method generates the correct embed code. + */ + public function test_process_dc_shortcode_with_url() { + $atts = array( + 'url' => 'https://www.documentcloud.org/documents/24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930', + 'width' => 800, + 'height' => 600, + ); + + $result = $this->dc->process_dc_shortcode( $atts ); + + // Assert that the result contains the expected embed code. + $this->assertStringContainsString( 'embed.documentcloud.org/documents/24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930', $result ); + } + + /** + * Test the process_dc_shortcode method with a valid ID. + * + * Ensures the method generates the correct embed code. + */ + public function test_process_dc_shortcode_with_id() { + $atts = array( + 'id' => '24475232', + 'width' => 800, + 'height' => 600, + ); + + $result = $this->dc->process_dc_shortcode( $atts ); + + // Assert that the result contains the expected embed code. + $this->assertStringContainsString( 'embed.documentcloud.org/documents/24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930', $result ); + } + + + /** + * Test the add_options_page method. + * + * Ensures the options page is added to the admin menu. + */ + public function test_add_options_page() { + // Mock current_user_can to return true. + add_filter( + 'user_has_cap', + function ( $allcaps ) { + $allcaps['manage_options'] = true; + return $allcaps; + } + ); + + // Call the method. + $this->dc->add_options_page(); + + // Assert that the options page is registered. + global $submenu; + $submenu_keys = array_column( $submenu['options-general.php'], 0 ); + $this->assertContains( 'DocumentCloud', $submenu_keys ); + } + + /** + * Test the check_dc_plugin_conflict method. + * + * Ensures the conflict check works as expected. + */ + public function test_check_dc_plugin_conflict() { + // Mock is_plugin_active to return true. + add_filter( + 'pre_option_active_plugins', + function () { + return array( 'navis-documentcloud/navis-documentcloud.php' ); + } + ); + + // Call the method. + $this->dc->check_dc_plugin_conflict(); + + // Assert that the admin notice is added. + $this->expectOutputRegex( '/You have two conflicting DocumentCloud plugins activated/' ); + do_action( 'admin_notices' ); + } + + /** + * Test the process_dc_shortcode method with various attributes. + * + * Ensures the shortcode processes attributes correctly. + */ + public function test_process_dc_shortcode_with_attributes() { + // Test with a valid URL and custom attributes. + $atts = array( + 'url' => 'https://www.documentcloud.org/documents/24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930/', + 'page' => 2, + 'zoom' => 150, + 'responsive' => 'true', + 'sidebar' => 'false', + 'width' => 1000, + 'height' => 700, + ); + + $result = $this->dc->process_dc_shortcode( $atts ); + + // Assert that the result contains the expected embed code. + $this->assertStringContainsString( 'embed.documentcloud.org/documents/24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930', $result ); + $this->assertStringContainsString( 'page=2', $result ); + $this->assertStringContainsString( 'zoom=150', $result ); + $this->assertStringContainsString( 'responsive=true', $result ); + $this->assertStringContainsString( 'sidebar=false', $result ); + $this->assertStringContainsString( 'width="1000"', $result ); + $this->assertStringContainsString( 'height="700"', $result ); + } + + /** + * Test the settings_init method. + * + * Ensures the settings for the DocumentCloud options page are registered correctly. + */ + public function test_settings_init() { + // Mock the current_user_can function to return true. + add_filter( + 'user_has_cap', + function ( $allcaps ) { + $allcaps['manage_options'] = true; + return $allcaps; + } + ); + + // Call the settings_init method. + $this->dc->settings_init(); + + // Assert that the settings section is registered. + global $wp_settings_sections; + $this->assertArrayHasKey( 'documentcloud', $wp_settings_sections ); + $this->assertArrayHasKey( 'documentcloud', $wp_settings_sections['documentcloud'] ); + + // Assert that the settings fields are registered. + global $wp_settings_fields; + $this->assertArrayHasKey( 'documentcloud', $wp_settings_fields ); + $this->assertArrayHasKey( 'documentcloud', $wp_settings_fields['documentcloud'] ); + + // Assert that the specific fields are registered. + $fields = $wp_settings_fields['documentcloud']['documentcloud']; + $this->assertArrayHasKey( 'documentcloud_default_height', $fields ); + $this->assertArrayHasKey( 'documentcloud_default_width', $fields ); + $this->assertArrayHasKey( 'documentcloud_full_width', $fields ); + + // Assert that the field callbacks are correct. + $this->assertEquals( array( $this->dc, 'default_height_field' ), $fields['documentcloud_default_height']['callback'] ); + $this->assertEquals( array( $this->dc, 'default_width_field' ), $fields['documentcloud_default_width']['callback'] ); + $this->assertEquals( array( $this->dc, 'full_width_field' ), $fields['documentcloud_full_width']['callback'] ); + } + + /** + * Test the parse_dc_url method. + * + * Ensures the method correctly parses a DocumentCloud URL into its components. + */ + public function test_parse_dc_url() { + // Define the test URL. + $url = 'https://www.documentcloud.org/documents/24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930'; + + // Call the method. + $result = $this->dc->parse_dc_url( $url ); + // Assert that the result contains the expected components. + $this->assertArrayHasKey( 'protocol', $result ); + $this->assertArrayHasKey( 'dc_host', $result ); + $this->assertArrayHasKey( 'document_slug', $result ); + + // Assert the values of the components. + $this->assertEquals( 'https', $result['protocol'] ); + $this->assertEquals( 'www.documentcloud.org', $result['dc_host'] ); + $this->assertEquals( '24475232-2024-03-08-rcfp-letter-to-nj-leg-re-sb-2930', $result['document_slug'] ); + } +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php new file mode 100644 index 0000000..e48d36c --- /dev/null +++ b/tests/bootstrap.php @@ -0,0 +1,40 @@ + Date: Thu, 29 May 2025 10:02:38 -0400 Subject: [PATCH 02/10] Moves plugin files into `src/documentcloud` --- .gitignore | 8 +- README.md | 24 +- docker-compose.yml | 11 +- phpunit.xml.dist | 8 +- .../assets}/DocumentCloud-Block-Icon.svg | 0 .../assets}/css/settings-documentcloud.css | 0 .../documentcloud/assets}/icon-128x128.png | Bin .../documentcloud/assets}/icon-256x256.png | Bin .../documentcloud/assets}/screenshot-1.png | Bin .../documentcloud/blocks}/.editorconfig | 0 .../documentcloud/blocks}/.eslintrc.json | 0 .../documentcloud/blocks}/.gitignore | 0 .../__mocks__/@wordpress/block-editor.js | 0 .../__mocks__/@wordpress/components.js | 0 .../blocks}/__mocks__/@wordpress/compose.js | 0 .../blocks}/__mocks__/@wordpress/core-data.js | 0 .../blocks}/__mocks__/@wordpress/data.js | 0 .../blocks}/__mocks__/@wordpress/element.js | 0 .../blocks}/__mocks__/@wordpress/i18n.js | 0 .../blocks}/__mocks__/svgMock.js | 0 .../__tests__/__snapshots__/save.test.js.snap | 0 .../blocks}/__tests__/edit.test.js | 0 .../blocks}/__tests__/save.test.js | 0 .../blocks}/__tests__/utils.test.js | 0 .../documentcloud/blocks}/babel.config.cjs | 0 .../blocks}/build/blocks-manifest.php | 0 .../blocks}/build/documentcloud/block.json | 0 .../blocks}/build/documentcloud/index-rtl.css | 0 .../build/documentcloud/index.asset.php | 0 .../blocks}/build/documentcloud/index.css | 0 .../blocks}/build/documentcloud/index.js | 0 .../documentcloud/blocks}/jest.config.js | 0 .../documentcloud/blocks}/package-lock.json | 0 .../documentcloud/blocks}/package.json | 0 .../blocks}/src/documentcloud/block.json | 0 .../components/documentcloud-preview.js | 0 .../blocks}/src/documentcloud/edit.js | 0 .../blocks}/src/documentcloud/editor.scss | 0 .../blocks}/src/documentcloud/index.js | 0 .../blocks}/src/documentcloud/save.js | 0 .../src/documentcloud/utils/constants.js | 0 .../blocks}/src/documentcloud/utils/utils.js | 0 .../src/documentcloud/utils/validation.js | 0 src/documentcloud/composer.json | 0 src/documentcloud/composer.lock | 1790 +++++++++++++++++ .../documentcloud/documentcloud.php | 0 .../classes/blocks/class-document-cloud.php | 0 .../inc}/classes/class-blocks.php | 0 .../inc}/traits/trait-singleton.php | 0 .../documentcloud/inc}/utils/autoloader.php | 0 .../tests}/Test_WP_DocumentCloud.php | 0 .../documentcloud/tests}/bootstrap.php | 0 52 files changed, 1830 insertions(+), 11 deletions(-) rename {assets => src/documentcloud/assets}/DocumentCloud-Block-Icon.svg (100%) rename {assets => src/documentcloud/assets}/css/settings-documentcloud.css (100%) rename {assets => src/documentcloud/assets}/icon-128x128.png (100%) rename {assets => src/documentcloud/assets}/icon-256x256.png (100%) rename {assets => src/documentcloud/assets}/screenshot-1.png (100%) rename {blocks => src/documentcloud/blocks}/.editorconfig (100%) rename {blocks => src/documentcloud/blocks}/.eslintrc.json (100%) rename {blocks => src/documentcloud/blocks}/.gitignore (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/block-editor.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/components.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/compose.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/core-data.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/data.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/element.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/@wordpress/i18n.js (100%) rename {blocks => src/documentcloud/blocks}/__mocks__/svgMock.js (100%) rename {blocks => src/documentcloud/blocks}/__tests__/__snapshots__/save.test.js.snap (100%) rename {blocks => src/documentcloud/blocks}/__tests__/edit.test.js (100%) rename {blocks => src/documentcloud/blocks}/__tests__/save.test.js (100%) rename {blocks => src/documentcloud/blocks}/__tests__/utils.test.js (100%) rename {blocks => src/documentcloud/blocks}/babel.config.cjs (100%) rename {blocks => src/documentcloud/blocks}/build/blocks-manifest.php (100%) rename {blocks => src/documentcloud/blocks}/build/documentcloud/block.json (100%) rename {blocks => src/documentcloud/blocks}/build/documentcloud/index-rtl.css (100%) rename {blocks => src/documentcloud/blocks}/build/documentcloud/index.asset.php (100%) rename {blocks => src/documentcloud/blocks}/build/documentcloud/index.css (100%) rename {blocks => src/documentcloud/blocks}/build/documentcloud/index.js (100%) rename {blocks => src/documentcloud/blocks}/jest.config.js (100%) rename {blocks => src/documentcloud/blocks}/package-lock.json (100%) rename {blocks => src/documentcloud/blocks}/package.json (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/block.json (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/components/documentcloud-preview.js (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/edit.js (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/editor.scss (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/index.js (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/save.js (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/utils/constants.js (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/utils/utils.js (100%) rename {blocks => src/documentcloud/blocks}/src/documentcloud/utils/validation.js (100%) create mode 100755 src/documentcloud/composer.json create mode 100644 src/documentcloud/composer.lock rename documentcloud.php => src/documentcloud/documentcloud.php (100%) rename {inc => src/documentcloud/inc}/classes/blocks/class-document-cloud.php (100%) rename {inc => src/documentcloud/inc}/classes/class-blocks.php (100%) rename {inc => src/documentcloud/inc}/traits/trait-singleton.php (100%) rename {inc => src/documentcloud/inc}/utils/autoloader.php (100%) rename {tests => src/documentcloud/tests}/Test_WP_DocumentCloud.php (100%) rename {tests => src/documentcloud/tests}/bootstrap.php (100%) diff --git a/.gitignore b/.gitignore index 94a5fbe..225b2d4 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,10 @@ .DS_Store # WordPress Dev Environment -src/wordpress \ No newline at end of file +src/wordpress + +# Composer +**/vendor + +# Testing +.phpunit.cache \ No newline at end of file diff --git a/README.md b/README.md index 5c2ea23..8b1e376 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ The DocumentCloud WordPress plugin lets you embed [DocumentCloud](https://www.do ## Installation -1. Upload the contents of the plugin to `wp-content/plugins/documentcloud` +1. Upload the contents of the `src/documentcloud` plugin to `wp-content/plugins/documentcloud` 2. Activate the plugin through the "Plugins" menu 3. In your posts, embed documents, pages, or notes using the DocumentCloud button or the `[documentcloud]` shortcode 4. Optional: Set a default width/height for all DocumentCloud embeds (which can be overridden on a per-embed basis with the `height/width` attributes) at Settings > DocumentCloud. (This default width will only be used if you set `responsive="false"` on an embed.) @@ -106,6 +106,8 @@ If you find yourself absolutely needing to expire the cache, though, you have tw ## Development +Plugin files are located in `src/documentcloud` + Docker is used to spin up a development and testing WordPress environment. Unit tests are setup using PHPUnit and Jest, please refer to [Testing Setup ](./TESTING.md) for the setup steps @@ -115,14 +117,30 @@ Unit tests are setup using PHPUnit and Jest, please refer to [Testing Setup ](./ ```sh # Start services docker compose up + # Fix permissions -docker-compose exec wordpress chown -R www-data:www-data /var/www/html +docker compose exec wordpress chown -R www-data:www-data /var/www/html ``` -1. Go to `localhost:8000` +1. Go to [`localhost:8000`](http://localhost:8000) 2. Create an account. Save the username and password, then log in. 3. Go to the Plugins section, then activate the "DocumentCloud" plugin. +### Test + +```sh +# 1. Open a shell into the testing service +docker compose exec -it testing bash + +# 2. Install the WordPress Test Suite anytime you rebuild the container +./bin/install-wp-tests.sh test root password db latest + +# 3. Now the container is ready to run PHPUnit Tests +phpunit +``` + +Advanced instructions in `TESTING.md` + ## Changelog ### 0.6.0 diff --git a/docker-compose.yml b/docker-compose.yml index 41e5920..1f0b053 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,7 +13,7 @@ services: WORDPRESS_TABLE_PREFIX: wp_ volumes: - ./src/wordpress:/var/www/html - - ./:/var/www/html/wp-content/plugins/documentcloud + - ./src/documentcloud:/var/www/html/wp-content/plugins/documentcloud depends_on: - db @@ -24,7 +24,6 @@ services: build: context: . dockerfile: Dockerfile - container_name: Testing volumes: - .:/var/www/html depends_on: @@ -36,7 +35,13 @@ services: MYSQL_USER: root MYSQL_PASSWORD: password MYSQL_DATABASE: wordpress_test - command: sh -c "composer install && tail -f /dev/null" + command: > + sh -c " + composer install && + alias phpunit='./src/documentcloud/vendor/bin/phpunit' && + echo 'alias phpunit=\"./src/documentcloud/vendor/bin/phpunit\"' >> ~/.bashrc && + tail -f /dev/null + " phpmyadmin: depends_on: diff --git a/phpunit.xml.dist b/phpunit.xml.dist index b4c9c9f..a0c91c4 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,14 +1,14 @@ - + - ./tests/ - ./tests/test-sample.php + src/documentcloud/tests/ + src/documentcloud/tests/test-sample.php - documentcloud.php + src/documentcloud/documentcloud.php diff --git a/assets/DocumentCloud-Block-Icon.svg b/src/documentcloud/assets/DocumentCloud-Block-Icon.svg similarity index 100% rename from assets/DocumentCloud-Block-Icon.svg rename to src/documentcloud/assets/DocumentCloud-Block-Icon.svg diff --git a/assets/css/settings-documentcloud.css b/src/documentcloud/assets/css/settings-documentcloud.css similarity index 100% rename from assets/css/settings-documentcloud.css rename to src/documentcloud/assets/css/settings-documentcloud.css diff --git a/assets/icon-128x128.png b/src/documentcloud/assets/icon-128x128.png similarity index 100% rename from assets/icon-128x128.png rename to src/documentcloud/assets/icon-128x128.png diff --git a/assets/icon-256x256.png b/src/documentcloud/assets/icon-256x256.png similarity index 100% rename from assets/icon-256x256.png rename to src/documentcloud/assets/icon-256x256.png diff --git a/assets/screenshot-1.png b/src/documentcloud/assets/screenshot-1.png similarity index 100% rename from assets/screenshot-1.png rename to src/documentcloud/assets/screenshot-1.png diff --git a/blocks/.editorconfig b/src/documentcloud/blocks/.editorconfig similarity index 100% rename from blocks/.editorconfig rename to src/documentcloud/blocks/.editorconfig diff --git a/blocks/.eslintrc.json b/src/documentcloud/blocks/.eslintrc.json similarity index 100% rename from blocks/.eslintrc.json rename to src/documentcloud/blocks/.eslintrc.json diff --git a/blocks/.gitignore b/src/documentcloud/blocks/.gitignore similarity index 100% rename from blocks/.gitignore rename to src/documentcloud/blocks/.gitignore diff --git a/blocks/__mocks__/@wordpress/block-editor.js b/src/documentcloud/blocks/__mocks__/@wordpress/block-editor.js similarity index 100% rename from blocks/__mocks__/@wordpress/block-editor.js rename to src/documentcloud/blocks/__mocks__/@wordpress/block-editor.js diff --git a/blocks/__mocks__/@wordpress/components.js b/src/documentcloud/blocks/__mocks__/@wordpress/components.js similarity index 100% rename from blocks/__mocks__/@wordpress/components.js rename to src/documentcloud/blocks/__mocks__/@wordpress/components.js diff --git a/blocks/__mocks__/@wordpress/compose.js b/src/documentcloud/blocks/__mocks__/@wordpress/compose.js similarity index 100% rename from blocks/__mocks__/@wordpress/compose.js rename to src/documentcloud/blocks/__mocks__/@wordpress/compose.js diff --git a/blocks/__mocks__/@wordpress/core-data.js b/src/documentcloud/blocks/__mocks__/@wordpress/core-data.js similarity index 100% rename from blocks/__mocks__/@wordpress/core-data.js rename to src/documentcloud/blocks/__mocks__/@wordpress/core-data.js diff --git a/blocks/__mocks__/@wordpress/data.js b/src/documentcloud/blocks/__mocks__/@wordpress/data.js similarity index 100% rename from blocks/__mocks__/@wordpress/data.js rename to src/documentcloud/blocks/__mocks__/@wordpress/data.js diff --git a/blocks/__mocks__/@wordpress/element.js b/src/documentcloud/blocks/__mocks__/@wordpress/element.js similarity index 100% rename from blocks/__mocks__/@wordpress/element.js rename to src/documentcloud/blocks/__mocks__/@wordpress/element.js diff --git a/blocks/__mocks__/@wordpress/i18n.js b/src/documentcloud/blocks/__mocks__/@wordpress/i18n.js similarity index 100% rename from blocks/__mocks__/@wordpress/i18n.js rename to src/documentcloud/blocks/__mocks__/@wordpress/i18n.js diff --git a/blocks/__mocks__/svgMock.js b/src/documentcloud/blocks/__mocks__/svgMock.js similarity index 100% rename from blocks/__mocks__/svgMock.js rename to src/documentcloud/blocks/__mocks__/svgMock.js diff --git a/blocks/__tests__/__snapshots__/save.test.js.snap b/src/documentcloud/blocks/__tests__/__snapshots__/save.test.js.snap similarity index 100% rename from blocks/__tests__/__snapshots__/save.test.js.snap rename to src/documentcloud/blocks/__tests__/__snapshots__/save.test.js.snap diff --git a/blocks/__tests__/edit.test.js b/src/documentcloud/blocks/__tests__/edit.test.js similarity index 100% rename from blocks/__tests__/edit.test.js rename to src/documentcloud/blocks/__tests__/edit.test.js diff --git a/blocks/__tests__/save.test.js b/src/documentcloud/blocks/__tests__/save.test.js similarity index 100% rename from blocks/__tests__/save.test.js rename to src/documentcloud/blocks/__tests__/save.test.js diff --git a/blocks/__tests__/utils.test.js b/src/documentcloud/blocks/__tests__/utils.test.js similarity index 100% rename from blocks/__tests__/utils.test.js rename to src/documentcloud/blocks/__tests__/utils.test.js diff --git a/blocks/babel.config.cjs b/src/documentcloud/blocks/babel.config.cjs similarity index 100% rename from blocks/babel.config.cjs rename to src/documentcloud/blocks/babel.config.cjs diff --git a/blocks/build/blocks-manifest.php b/src/documentcloud/blocks/build/blocks-manifest.php similarity index 100% rename from blocks/build/blocks-manifest.php rename to src/documentcloud/blocks/build/blocks-manifest.php diff --git a/blocks/build/documentcloud/block.json b/src/documentcloud/blocks/build/documentcloud/block.json similarity index 100% rename from blocks/build/documentcloud/block.json rename to src/documentcloud/blocks/build/documentcloud/block.json diff --git a/blocks/build/documentcloud/index-rtl.css b/src/documentcloud/blocks/build/documentcloud/index-rtl.css similarity index 100% rename from blocks/build/documentcloud/index-rtl.css rename to src/documentcloud/blocks/build/documentcloud/index-rtl.css diff --git a/blocks/build/documentcloud/index.asset.php b/src/documentcloud/blocks/build/documentcloud/index.asset.php similarity index 100% rename from blocks/build/documentcloud/index.asset.php rename to src/documentcloud/blocks/build/documentcloud/index.asset.php diff --git a/blocks/build/documentcloud/index.css b/src/documentcloud/blocks/build/documentcloud/index.css similarity index 100% rename from blocks/build/documentcloud/index.css rename to src/documentcloud/blocks/build/documentcloud/index.css diff --git a/blocks/build/documentcloud/index.js b/src/documentcloud/blocks/build/documentcloud/index.js similarity index 100% rename from blocks/build/documentcloud/index.js rename to src/documentcloud/blocks/build/documentcloud/index.js diff --git a/blocks/jest.config.js b/src/documentcloud/blocks/jest.config.js similarity index 100% rename from blocks/jest.config.js rename to src/documentcloud/blocks/jest.config.js diff --git a/blocks/package-lock.json b/src/documentcloud/blocks/package-lock.json similarity index 100% rename from blocks/package-lock.json rename to src/documentcloud/blocks/package-lock.json diff --git a/blocks/package.json b/src/documentcloud/blocks/package.json similarity index 100% rename from blocks/package.json rename to src/documentcloud/blocks/package.json diff --git a/blocks/src/documentcloud/block.json b/src/documentcloud/blocks/src/documentcloud/block.json similarity index 100% rename from blocks/src/documentcloud/block.json rename to src/documentcloud/blocks/src/documentcloud/block.json diff --git a/blocks/src/documentcloud/components/documentcloud-preview.js b/src/documentcloud/blocks/src/documentcloud/components/documentcloud-preview.js similarity index 100% rename from blocks/src/documentcloud/components/documentcloud-preview.js rename to src/documentcloud/blocks/src/documentcloud/components/documentcloud-preview.js diff --git a/blocks/src/documentcloud/edit.js b/src/documentcloud/blocks/src/documentcloud/edit.js similarity index 100% rename from blocks/src/documentcloud/edit.js rename to src/documentcloud/blocks/src/documentcloud/edit.js diff --git a/blocks/src/documentcloud/editor.scss b/src/documentcloud/blocks/src/documentcloud/editor.scss similarity index 100% rename from blocks/src/documentcloud/editor.scss rename to src/documentcloud/blocks/src/documentcloud/editor.scss diff --git a/blocks/src/documentcloud/index.js b/src/documentcloud/blocks/src/documentcloud/index.js similarity index 100% rename from blocks/src/documentcloud/index.js rename to src/documentcloud/blocks/src/documentcloud/index.js diff --git a/blocks/src/documentcloud/save.js b/src/documentcloud/blocks/src/documentcloud/save.js similarity index 100% rename from blocks/src/documentcloud/save.js rename to src/documentcloud/blocks/src/documentcloud/save.js diff --git a/blocks/src/documentcloud/utils/constants.js b/src/documentcloud/blocks/src/documentcloud/utils/constants.js similarity index 100% rename from blocks/src/documentcloud/utils/constants.js rename to src/documentcloud/blocks/src/documentcloud/utils/constants.js diff --git a/blocks/src/documentcloud/utils/utils.js b/src/documentcloud/blocks/src/documentcloud/utils/utils.js similarity index 100% rename from blocks/src/documentcloud/utils/utils.js rename to src/documentcloud/blocks/src/documentcloud/utils/utils.js diff --git a/blocks/src/documentcloud/utils/validation.js b/src/documentcloud/blocks/src/documentcloud/utils/validation.js similarity index 100% rename from blocks/src/documentcloud/utils/validation.js rename to src/documentcloud/blocks/src/documentcloud/utils/validation.js diff --git a/src/documentcloud/composer.json b/src/documentcloud/composer.json new file mode 100755 index 0000000..e69de29 diff --git a/src/documentcloud/composer.lock b/src/documentcloud/composer.lock new file mode 100644 index 0000000..e6784c0 --- /dev/null +++ b/src/documentcloud/composer.lock @@ -0,0 +1,1790 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "e71772f75c26190a19f3c4b7f8903bb9", + "packages": [], + "packages-dev": [ + { + "name": "myclabs/deep-copy", + "version": "1.13.1", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", + "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2025-04-29T12:36:36+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.4.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", + "reference": "447a020a1f875a434d62f2a401f53b82a396e494", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" + }, + "time": "2024-12-30T11:07:19+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "11.0.9", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^5.4.0", + "php": ">=8.2", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-text-template": "^4.0.1", + "sebastian/code-unit-reverse-lookup": "^4.0.1", + "sebastian/complexity": "^4.0.1", + "sebastian/environment": "^7.2.0", + "sebastian/lines-of-code": "^3.0.1", + "sebastian/version": "^5.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^11.5.2" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-02-25T13:26:39+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "5.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", + "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-27T05:02:59+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "5.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", + "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^11.0" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:07:44+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:08:43+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "7.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "security": "https://github.com/sebastianbergmann/php-timer/security/policy", + "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:09:35+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "11.5.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "d565e2cdc21a7db9dc6c399c1fc2083b8010f289" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d565e2cdc21a7db9dc6c399c1fc2083b8010f289", + "reference": "d565e2cdc21a7db9dc6c399c1fc2083b8010f289", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.13.1", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=8.2", + "phpunit/php-code-coverage": "^11.0.9", + "phpunit/php-file-iterator": "^5.1.0", + "phpunit/php-invoker": "^5.0.1", + "phpunit/php-text-template": "^4.0.1", + "phpunit/php-timer": "^7.0.1", + "sebastian/cli-parser": "^3.0.2", + "sebastian/code-unit": "^3.0.3", + "sebastian/comparator": "^6.3.1", + "sebastian/diff": "^6.0.2", + "sebastian/environment": "^7.2.1", + "sebastian/exporter": "^6.3.0", + "sebastian/global-state": "^7.0.2", + "sebastian/object-enumerator": "^6.0.1", + "sebastian/type": "^5.1.2", + "sebastian/version": "^5.0.2", + "staabm/side-effects-detector": "^1.0.5" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "11.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2025-05-21T12:35:00+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", + "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:41:36+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "security": "https://github.com/sebastianbergmann/code-unit/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-19T07:56:08+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", + "reference": "183a9b2632194febd219bb9246eee421dad8d45e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:45:54+00:00" + }, + { + "name": "sebastian/comparator", + "version": "6.3.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/diff": "^6.0", + "sebastian/exporter": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.4" + }, + "suggest": { + "ext-bcmath": "For comparing BcMath\\Number objects" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.3-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "security": "https://github.com/sebastianbergmann/comparator/security/policy", + "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-07T06:57:01+00:00" + }, + { + "name": "sebastian/complexity", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", + "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "security": "https://github.com/sebastianbergmann/complexity/security/policy", + "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:49:50+00:00" + }, + { + "name": "sebastian/diff", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", + "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "security": "https://github.com/sebastianbergmann/diff/security/policy", + "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:53:05+00:00" + }, + { + "name": "sebastian/environment", + "version": "7.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", + "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "https://github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "security": "https://github.com/sebastianbergmann/environment/security/policy", + "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://liberapay.com/sebastianbergmann", + "type": "liberapay" + }, + { + "url": "https://thanks.dev/u/gh/sebastianbergmann", + "type": "thanks_dev" + }, + { + "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", + "type": "tidelift" + } + ], + "time": "2025-05-21T11:55:47+00:00" + }, + { + "name": "sebastian/exporter", + "version": "6.3.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", + "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", + "shasum": "" + }, + "require": { + "ext-mbstring": "*", + "php": ">=8.2", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "security": "https://github.com/sebastianbergmann/exporter/security/policy", + "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-12-05T09:17:50+00:00" + }, + { + "name": "sebastian/global-state", + "version": "7.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", + "reference": "3be331570a721f9a4b5917f4209773de17f747d7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "7.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "https://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "security": "https://github.com/sebastianbergmann/global-state/security/policy", + "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:57:36+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "3.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^5.0", + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T04:58:38+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "6.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", + "reference": "f5b498e631a74204185071eb41f33f38d64608aa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "sebastian/object-reflector": "^4.0", + "sebastian/recursion-context": "^6.0" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:00:13+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "4.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:01:32+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "6.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", + "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "6.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-07-03T05:10:34+00:00" + }, + { + "name": "sebastian/type", + "version": "5.1.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "phpunit/phpunit": "^11.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "security": "https://github.com/sebastianbergmann/type/security/policy", + "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2025-03-18T13:35:50+00:00" + }, + { + "name": "sebastian/version", + "version": "5.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", + "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "security": "https://github.com/sebastianbergmann/version/security/policy", + "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-10-09T05:16:32+00:00" + }, + { + "name": "staabm/side-effects-detector", + "version": "1.0.5", + "source": { + "type": "git", + "url": "https://github.com/staabm/side-effects-detector.git", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", + "reference": "d8334211a140ce329c13726d4a715adbddd0a163", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": "^7.4 || ^8.0" + }, + "require-dev": { + "phpstan/extension-installer": "^1.4.3", + "phpstan/phpstan": "^1.12.6", + "phpunit/phpunit": "^9.6.21", + "symfony/var-dumper": "^5.4.43", + "tomasvotruba/type-coverage": "1.0.0", + "tomasvotruba/unused-public": "1.0.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "lib/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A static analysis tool to detect side effects in PHP code", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/staabm/side-effects-detector/issues", + "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" + }, + "funding": [ + { + "url": "https://github.com/staabm", + "type": "github" + } + ], + "time": "2024-10-20T05:08:20+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + }, + { + "name": "yoast/phpunit-polyfills", + "version": "4.0.0", + "source": { + "type": "git", + "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", + "reference": "134921bfca9b02d8f374c48381451da1d98402f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/134921bfca9b02d8f374c48381451da1d98402f9", + "reference": "134921bfca9b02d8f374c48381451da1d98402f9", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0 || ^11.0 || ^12.0" + }, + "require-dev": { + "php-parallel-lint/php-console-highlighter": "^1.0.0", + "php-parallel-lint/php-parallel-lint": "^1.4.0", + "yoast/yoastcs": "^3.1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "4.x-dev" + } + }, + "autoload": { + "files": [ + "phpunitpolyfills-autoload.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Team Yoast", + "email": "support@yoast.com", + "homepage": "https://yoast.com" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" + } + ], + "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", + "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", + "keywords": [ + "phpunit", + "polyfill", + "testing" + ], + "support": { + "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", + "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy", + "source": "https://github.com/Yoast/PHPUnit-Polyfills" + }, + "time": "2025-02-09T18:58:54+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": {}, + "prefer-stable": false, + "prefer-lowest": false, + "platform": {}, + "platform-dev": {}, + "plugin-api-version": "2.6.0" +} diff --git a/documentcloud.php b/src/documentcloud/documentcloud.php similarity index 100% rename from documentcloud.php rename to src/documentcloud/documentcloud.php diff --git a/inc/classes/blocks/class-document-cloud.php b/src/documentcloud/inc/classes/blocks/class-document-cloud.php similarity index 100% rename from inc/classes/blocks/class-document-cloud.php rename to src/documentcloud/inc/classes/blocks/class-document-cloud.php diff --git a/inc/classes/class-blocks.php b/src/documentcloud/inc/classes/class-blocks.php similarity index 100% rename from inc/classes/class-blocks.php rename to src/documentcloud/inc/classes/class-blocks.php diff --git a/inc/traits/trait-singleton.php b/src/documentcloud/inc/traits/trait-singleton.php similarity index 100% rename from inc/traits/trait-singleton.php rename to src/documentcloud/inc/traits/trait-singleton.php diff --git a/inc/utils/autoloader.php b/src/documentcloud/inc/utils/autoloader.php similarity index 100% rename from inc/utils/autoloader.php rename to src/documentcloud/inc/utils/autoloader.php diff --git a/tests/Test_WP_DocumentCloud.php b/src/documentcloud/tests/Test_WP_DocumentCloud.php similarity index 100% rename from tests/Test_WP_DocumentCloud.php rename to src/documentcloud/tests/Test_WP_DocumentCloud.php diff --git a/tests/bootstrap.php b/src/documentcloud/tests/bootstrap.php similarity index 100% rename from tests/bootstrap.php rename to src/documentcloud/tests/bootstrap.php From 64b16008f37b2f89ac51d7ee69ac66bf1c81b705 Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 18:07:15 -0400 Subject: [PATCH 03/10] Adds Jest testing steps --- README.md | 22 +++++++++- src/documentcloud/blocks/package-lock.json | 48 ++++++++++++---------- 2 files changed, 48 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index 8b1e376..bd27ee6 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,10 @@ docker compose exec wordpress chown -R www-data:www-data /var/www/html ### Test +Tests can be run in a separate container called `testing`. + +To test the PHP plugin, use `phpunit` command inside the testing container's `bash` shell after setting it up: + ```sh # 1. Open a shell into the testing service docker compose exec -it testing bash @@ -139,7 +143,23 @@ docker compose exec -it testing bash phpunit ``` -Advanced instructions in `TESTING.md` +To test the JS Gutenberg block, use `npm test` command inside the testing container's `bash` shell after setting it up: + +```sh +# 1. Open a shell into the testing service +docker compose exec -it testing bash + +# 2. Navigate to the blocks directory +cd src/documentcloud/blocks + +# 3. Install Node modules +npm i + +# 4. Now the container is ready to run Jest tests +npm test +``` + +Find more advanced instructions in `TESTING.md` ## Changelog diff --git a/src/documentcloud/blocks/package-lock.json b/src/documentcloud/blocks/package-lock.json index 947a364..830eed3 100644 --- a/src/documentcloud/blocks/package-lock.json +++ b/src/documentcloud/blocks/package-lock.json @@ -18,8 +18,8 @@ "babel-jest": "^29.7.0", "jest": "^29.7.0", "jest-fetch-mock": "^3.0.3", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "react": "^19.1.0", + "react-dom": "^19.1.0" } }, "node_modules/@adobe/css-tools": { @@ -4276,6 +4276,19 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@wordpress/babel-preset-default/node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@wordpress/base-styles": { "version": "5.22.0", "dev": true, @@ -14004,30 +14017,26 @@ } }, "node_modules/react": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", - "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "dev": true, "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", - "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "dev": true, "license": "MIT", "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" + "scheduler": "^0.26.0" }, "peerDependencies": { - "react": "^18.3.1" + "react": "^19.1.0" } }, "node_modules/react-is": { @@ -14616,14 +14625,11 @@ } }, "node_modules/scheduler": { - "version": "0.23.2", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", - "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.3.0", From 13a642a45d366a0a4296224e2d56e81fb1197aaa Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 18:39:07 -0400 Subject: [PATCH 04/10] Adds CI config --- .circleci/config.yml | 114 ++++++++++++++++++++ .github/workflows/phpcs_on_pull_request.yml | 22 ++++ .github/workflows/unit_tests.yml | 101 +++++++++++++++++ 3 files changed, 237 insertions(+) create mode 100644 .circleci/config.yml create mode 100644 .github/workflows/phpcs_on_pull_request.yml create mode 100644 .github/workflows/unit_tests.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..6f23a5d --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,114 @@ +workflows: + version: 2 + main: + jobs: + - php56-build + - php70-build + - php71-build + - php72-build + - php73-build + - php74-build + +version: 2 + +job-references: + mysql_image: &mysql_image + circleci/mysql:5.6 + + setup_environment: &setup_environment + name: "Setup Environment Variables" + command: | + echo "export PATH=$HOME/.composer/vendor/bin:$PATH" >> $BASH_ENV + source /home/circleci/.bashrc + + install_dependencies: &install_dependencies + name: "Install Dependencies" + command: | + sudo apt-get update && sudo apt-get install subversion + sudo -E docker-php-ext-install mysqli + sudo sh -c "printf '\ndeb http://ftp.us.debian.org/debian sid main\n' >> /etc/apt/sources.list" + sudo apt-get update && sudo apt-get install mysql-client-5.7 + + php_job: &php_job + environment: + - WP_TESTS_DIR: "/tmp/wordpress-tests-lib" + - WP_CORE_DIR: "/tmp/wordpress/" + steps: + - checkout + - run: *setup_environment + - run: *install_dependencies + - run: + name: "Run Tests" + command: | + composer global require "phpunit/phpunit=5.7.*" + composer global require wp-coding-standards/wpcs + phpcs --config-set installed_paths $HOME/.composer/vendor/wp-coding-standards/wpcs + phpcs + rm -rf $WP_TESTS_DIR $WP_CORE_DIR + bash bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 latest + phpunit + WP_MULTISITE=1 phpunit + +jobs: + php56-build: + <<: *php_job + docker: + - image: circleci/php:5.6 + - image: *mysql_image + steps: + - checkout + - run: *setup_environment + - run: *install_dependencies + - run: + name: "Run Tests" + command: | + composer global require "phpunit/phpunit=5.7.*" + composer global require wp-coding-standards/wpcs + phpcs --config-set installed_paths $HOME/.composer/vendor/wp-coding-standards/wpcs + phpcs + SKIP_DB_CREATE=false + rm -rf $WP_TESTS_DIR $WP_CORE_DIR + bash bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 3.5 $SKIP_DB_CREATE + phpunit + WP_MULTISITE=1 phpunit + SKIP_DB_CREATE=true + rm -rf $WP_TESTS_DIR $WP_CORE_DIR + bash bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 latest $SKIP_DB_CREATE + phpunit + WP_MULTISITE=1 phpunit + SKIP_DB_CREATE=true + rm -rf $WP_TESTS_DIR $WP_CORE_DIR + bash bin/install-wp-tests.sh wordpress_test root '' 127.0.0.1 trunk $SKIP_DB_CREATE + phpunit + WP_MULTISITE=1 phpunit + SKIP_DB_CREATE=true + + php70-build: + <<: *php_job + docker: + - image: circleci/php:7.0 + - image: *mysql_image + + php71-build: + <<: *php_job + docker: + - image: circleci/php:7.1 + - image: *mysql_image + + php72-build: + <<: *php_job + docker: + - image: circleci/php:7.2 + - image: *mysql_image + + php73-build: + <<: *php_job + docker: + - image: circleci/php:7.3 + - image: *mysql_image + + php74-build: + <<: *php_job + docker: + - image: circleci/php:7.4 + - image: *mysql_image diff --git a/.github/workflows/phpcs_on_pull_request.yml b/.github/workflows/phpcs_on_pull_request.yml new file mode 100644 index 0000000..04b1aa0 --- /dev/null +++ b/.github/workflows/phpcs_on_pull_request.yml @@ -0,0 +1,22 @@ +on: pull_request +name: Inspections +jobs: + runPHPCSInspection: + name: Run PHPCS inspection + # Change below line to: `runs-on: ubuntu-latest` if not using self-hosted runners or if it is a public repo. + runs-on: high-performance + steps: + - uses: actions/checkout@v4 + with: + ref: ${{ github.event.pull_request.head.sha }} + - name: Run PHPCS inspection + uses: rtCamp/action-phpcs-code-review@master + env: + SKIP_FOLDERS: "tests,.github,blocks" + PHPCS_SNIFFS_EXCLUDE: "WordPress.Files.FileName" + GH_BOT_TOKEN: ${{ secrets.RTBOT_TOKEN }} + with: + args: WordPress,WordPress-Core,WordPress-Docs + - name: Cleanup + if: ${{ always() }} + uses: rtCamp/action-cleanup@master diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml new file mode 100644 index 0000000..8bcdcab --- /dev/null +++ b/.github/workflows/unit_tests.yml @@ -0,0 +1,101 @@ +name: Unit Tests + +on: [pull_request] + +jobs: + test-wp: + name: Test WordPress Plugin + runs-on: high-performance + + strategy: + matrix: + php-version: ['7.4', '8.0', '8.1', '8.2', '8.3'] + wp-version: ['6.6', '6.7', 'latest'] + include: + - php-version: '7.4' + php-image: php:7.4-cli + - php-version: '8.0' + php-image: php:8.0-cli + - php-version: '8.1' + php-image: php:8.1-cli + - php-version: '8.2' + php-image: php:8.2-cli + - php-version: '8.3' + php-image: php:8.3-cli + + container: + image: ${{ matrix.php-image }} + options: --user root + + services: + mysql: + image: mysql:5.7 + env: + MYSQL_DATABASE: wordpress_test + MYSQL_ROOT_PASSWORD: root + options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 + + steps: + - uses: actions/checkout@v4 + + - name: Install tools and PHP extensions + run: | + apt-get update && apt-get install -y unzip git curl subversion default-mysql-client + docker-php-ext-install mysqli + if [ "${{ matrix.php-version }}" != "7.4" ]; then pecl install xdebug; fi + if [ "${{ matrix.php-version }}" != "7.4" ]; then docker-php-ext-enable xdebug; fi + + - name: Configure Xdebug for coverage + if: ${{ matrix.php-version != '7.4' }} + run: | + echo "zend_extension=$(find /usr/local/lib/php/extensions/ -name xdebug.so)" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + echo "xdebug.mode=coverage" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + echo "xdebug.start_with_request=yes" >> /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini + + - name: Install Composer + run: | + curl -sS https://getcomposer.org/installer | php + mv composer.phar /usr/local/bin/composer + + - name: Install dependencies + run: | + if [ "${{ matrix.php-version }}" = "7.4" ]; then composer require phpunit/phpunit:^9 --no-update --no-interaction; fi + if [ "${{ matrix.php-version }}" = "8.0" ] || [ "${{ matrix.php-version }}" = "8.1" ]; then composer require phpunit/phpunit:^9 --no-update --no-interaction; fi + composer update --no-interaction + + - name: Install WP test suite + run: | + mysql -u root -proot -h mysql -P 3306 -e "DROP DATABASE IF EXISTS wordpress_test;" + bash ./bin/install-wp-tests.sh wordpress_test root 'root' mysql ${{ matrix.wp-version }} + + - name: Run PHPUnit with coverage + run: | + if [ "${{ matrix.php-version }}" = "7.4" ]; then vendor/bin/phpunit --configuration phpunit.xml.dist; else vendor/bin/phpunit --configuration phpunit.xml.dist --coverage-clover=coverage.xml; fi + + - name: Cleanup + if: ${{ always() }} + uses: rtCamp/action-cleanup@master + test-npm: + name: Test Blocks + runs-on: ubuntu-latest + + container: + image: node:20 + options: --user root + + steps: + - uses: actions/checkout@v4 + + - name: Install npm dependencies + working-directory: ./blocks # Run npm commands from the blocks folder + run: | + npm install --force + + - name: Run npm tests + working-directory: ./blocks # Run npm tests from the blocks folder + run: | + npm run test + + - name: Cleanup + if: ${{ always() }} + uses: rtCamp/action-cleanup@master \ No newline at end of file From 42e089a920b78875e1b25b33a4ec1ee6e0bc745b Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 18:45:28 -0400 Subject: [PATCH 05/10] Updates plugin authors --- src/documentcloud/documentcloud.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/documentcloud/documentcloud.php b/src/documentcloud/documentcloud.php index 8fd90ee..2cfa1c4 100644 --- a/src/documentcloud/documentcloud.php +++ b/src/documentcloud/documentcloud.php @@ -4,7 +4,7 @@ * Plugin URI: https://www.documentcloud.org/ * Description: Embed DocumentCloud resources in WordPress content. * Version: 0.6.0 - * Authors: Chris Amico, Justin Reese, Dylan Freedman + * Authors: Allan Lasser, Chris Amico, Justin Reese, Dylan Freedman * Text Domain: documentcloud * License: GPLv2 * Requires at least: 5.0 From 82646435aa680db5b765e4985641c3fed16dd609 Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 18:51:37 -0400 Subject: [PATCH 06/10] Update test dir --- .github/workflows/unit_tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index 8bcdcab..c6d8f66 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -87,12 +87,12 @@ jobs: - uses: actions/checkout@v4 - name: Install npm dependencies - working-directory: ./blocks # Run npm commands from the blocks folder + working-directory: ./src/documentcloud/blocks # Run npm commands from the blocks folder run: | npm install --force - name: Run npm tests - working-directory: ./blocks # Run npm tests from the blocks folder + working-directory: ./src/documentcloud/blocks # Run npm tests from the blocks folder run: | npm run test From e6cfccdd0f1ed875ab1ec6f6ce9aa6090673404d Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 19:08:49 -0400 Subject: [PATCH 07/10] Fix runner --- .github/workflows/unit_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit_tests.yml b/.github/workflows/unit_tests.yml index c6d8f66..0bbceec 100644 --- a/.github/workflows/unit_tests.yml +++ b/.github/workflows/unit_tests.yml @@ -5,7 +5,7 @@ on: [pull_request] jobs: test-wp: name: Test WordPress Plugin - runs-on: high-performance + runs-on: ubuntu-latest strategy: matrix: From 3ef0f66dd1c1cc69e0753e88a5a77ecf64e3f817 Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Thu, 29 May 2025 19:10:13 -0400 Subject: [PATCH 08/10] remove phpcs task --- .github/workflows/phpcs_on_pull_request.yml | 22 --------------------- 1 file changed, 22 deletions(-) delete mode 100644 .github/workflows/phpcs_on_pull_request.yml diff --git a/.github/workflows/phpcs_on_pull_request.yml b/.github/workflows/phpcs_on_pull_request.yml deleted file mode 100644 index 04b1aa0..0000000 --- a/.github/workflows/phpcs_on_pull_request.yml +++ /dev/null @@ -1,22 +0,0 @@ -on: pull_request -name: Inspections -jobs: - runPHPCSInspection: - name: Run PHPCS inspection - # Change below line to: `runs-on: ubuntu-latest` if not using self-hosted runners or if it is a public repo. - runs-on: high-performance - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.event.pull_request.head.sha }} - - name: Run PHPCS inspection - uses: rtCamp/action-phpcs-code-review@master - env: - SKIP_FOLDERS: "tests,.github,blocks" - PHPCS_SNIFFS_EXCLUDE: "WordPress.Files.FileName" - GH_BOT_TOKEN: ${{ secrets.RTBOT_TOKEN }} - with: - args: WordPress,WordPress-Core,WordPress-Docs - - name: Cleanup - if: ${{ always() }} - uses: rtCamp/action-cleanup@master From eed8c39764fe197d17cd9ec11babe018e860a903 Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Sat, 31 May 2025 10:51:49 -0400 Subject: [PATCH 09/10] Fix location of vendor folder in bootstrap.php --- src/documentcloud/tests/bootstrap.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/documentcloud/tests/bootstrap.php b/src/documentcloud/tests/bootstrap.php index e48d36c..c1c959b 100644 --- a/src/documentcloud/tests/bootstrap.php +++ b/src/documentcloud/tests/bootstrap.php @@ -5,7 +5,7 @@ * @package Documentcloud */ - require_once __DIR__ . '/../vendor/autoload.php'; + require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/vendor/autoload.php'; $_tests_dir = getenv( 'WP_TESTS_DIR' ); From 6657ac4b3e8208d64d435d283f4735ecdb59e993 Mon Sep 17 00:00:00 2001 From: Allan Lasser Date: Tue, 3 Jun 2025 11:23:53 -0500 Subject: [PATCH 10/10] Fixes local testing --- docker-compose.yml | 4 +- phpunit.xml.dist | 6 +- src/documentcloud/composer.json | 0 src/documentcloud/composer.lock | 1790 ----------------- .../tests => tests}/Test_WP_DocumentCloud.php | 0 .../tests => tests}/bootstrap.php | 4 +- 6 files changed, 7 insertions(+), 1797 deletions(-) delete mode 100755 src/documentcloud/composer.json delete mode 100644 src/documentcloud/composer.lock rename {src/documentcloud/tests => tests}/Test_WP_DocumentCloud.php (100%) rename {src/documentcloud/tests => tests}/bootstrap.php (87%) diff --git a/docker-compose.yml b/docker-compose.yml index 1f0b053..bcb9293 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -38,8 +38,8 @@ services: command: > sh -c " composer install && - alias phpunit='./src/documentcloud/vendor/bin/phpunit' && - echo 'alias phpunit=\"./src/documentcloud/vendor/bin/phpunit\"' >> ~/.bashrc && + alias phpunit='./vendor/bin/phpunit' && + echo 'alias phpunit=\"./vendor/bin/phpunit\"' >> ~/.bashrc && tail -f /dev/null " diff --git a/phpunit.xml.dist b/phpunit.xml.dist index a0c91c4..fd2d9a1 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,9 +1,9 @@ - + - src/documentcloud/tests/ - src/documentcloud/tests/test-sample.php + tests/ + tests/test-sample.php diff --git a/src/documentcloud/composer.json b/src/documentcloud/composer.json deleted file mode 100755 index e69de29..0000000 diff --git a/src/documentcloud/composer.lock b/src/documentcloud/composer.lock deleted file mode 100644 index e6784c0..0000000 --- a/src/documentcloud/composer.lock +++ /dev/null @@ -1,1790 +0,0 @@ -{ - "_readme": [ - "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", - "This file is @generated automatically" - ], - "content-hash": "e71772f75c26190a19f3c4b7f8903bb9", - "packages": [], - "packages-dev": [ - { - "name": "myclabs/deep-copy", - "version": "1.13.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/1720ddd719e16cf0db4eb1c6eca108031636d46c", - "reference": "1720ddd719e16cf0db4eb1c6eca108031636d46c", - "shasum": "" - }, - "require": { - "php": "^7.1 || ^8.0" - }, - "conflict": { - "doctrine/collections": "<1.6.8", - "doctrine/common": "<2.13.3 || >=3 <3.2.2" - }, - "require-dev": { - "doctrine/collections": "^1.6.8", - "doctrine/common": "^2.13.3 || ^3.2.2", - "phpspec/prophecy": "^1.10", - "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" - }, - "type": "library", - "autoload": { - "files": [ - "src/DeepCopy/deep_copy.php" - ], - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "support": { - "issues": "https://github.com/myclabs/DeepCopy/issues", - "source": "https://github.com/myclabs/DeepCopy/tree/1.13.1" - }, - "funding": [ - { - "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", - "type": "tidelift" - } - ], - "time": "2025-04-29T12:36:36+00:00" - }, - { - "name": "nikic/php-parser", - "version": "v5.4.0", - "source": { - "type": "git", - "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/447a020a1f875a434d62f2a401f53b82a396e494", - "reference": "447a020a1f875a434d62f2a401f53b82a396e494", - "shasum": "" - }, - "require": { - "ext-ctype": "*", - "ext-json": "*", - "ext-tokenizer": "*", - "php": ">=7.4" - }, - "require-dev": { - "ircmaxell/php-yacc": "^0.0.7", - "phpunit/phpunit": "^9.0" - }, - "bin": [ - "bin/php-parse" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "PhpParser\\": "lib/PhpParser" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Nikita Popov" - } - ], - "description": "A PHP parser written in PHP", - "keywords": [ - "parser", - "php" - ], - "support": { - "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v5.4.0" - }, - "time": "2024-12-30T11:07:19+00:00" - }, - { - "name": "phar-io/manifest", - "version": "2.0.4", - "source": { - "type": "git", - "url": "https://github.com/phar-io/manifest.git", - "reference": "54750ef60c58e43759730615a392c31c80e23176" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", - "reference": "54750ef60c58e43759730615a392c31c80e23176", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-phar": "*", - "ext-xmlwriter": "*", - "phar-io/version": "^3.0.1", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", - "support": { - "issues": "https://github.com/phar-io/manifest/issues", - "source": "https://github.com/phar-io/manifest/tree/2.0.4" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:33:53+00:00" - }, - { - "name": "phar-io/version", - "version": "3.2.1", - "source": { - "type": "git", - "url": "https://github.com/phar-io/version.git", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", - "shasum": "" - }, - "require": { - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - }, - { - "name": "Sebastian Heuer", - "email": "sebastian@phpeople.de", - "role": "Developer" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "Developer" - } - ], - "description": "Library for handling version information and constraints", - "support": { - "issues": "https://github.com/phar-io/version/issues", - "source": "https://github.com/phar-io/version/tree/3.2.1" - }, - "time": "2022-02-21T01:04:05+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "11.0.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/14d63fbcca18457e49c6f8bebaa91a87e8e188d7", - "reference": "14d63fbcca18457e49c6f8bebaa91a87e8e188d7", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-libxml": "*", - "ext-xmlwriter": "*", - "nikic/php-parser": "^5.4.0", - "php": ">=8.2", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-text-template": "^4.0.1", - "sebastian/code-unit-reverse-lookup": "^4.0.1", - "sebastian/complexity": "^4.0.1", - "sebastian/environment": "^7.2.0", - "sebastian/lines-of-code": "^3.0.1", - "sebastian/version": "^5.0.2", - "theseer/tokenizer": "^1.2.3" - }, - "require-dev": { - "phpunit/phpunit": "^11.5.2" - }, - "suggest": { - "ext-pcov": "PHP extension that provides line coverage", - "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "11.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/11.0.9" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-02-25T13:26:39+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "5.1.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/118cfaaa8bc5aef3287bf315b6060b1174754af6", - "reference": "118cfaaa8bc5aef3287bf315b6060b1174754af6", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/5.1.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-08-27T05:02:59+00:00" - }, - { - "name": "phpunit/php-invoker", - "version": "5.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-invoker.git", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/c1ca3814734c07492b3d4c5f794f4b0995333da2", - "reference": "c1ca3814734c07492b3d4c5f794f4b0995333da2", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "ext-pcntl": "*", - "phpunit/phpunit": "^11.0" - }, - "suggest": { - "ext-pcntl": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Invoke callables with a timeout", - "homepage": "https://github.com/sebastianbergmann/php-invoker/", - "keywords": [ - "process" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-invoker/issues", - "security": "https://github.com/sebastianbergmann/php-invoker/security/policy", - "source": "https://github.com/sebastianbergmann/php-invoker/tree/5.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:07:44+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "reference": "3e0404dc6b300e6bf56415467ebcb3fe4f33e964", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-text-template/issues", - "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", - "source": "https://github.com/sebastianbergmann/php-text-template/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:08:43+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "7.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "reference": "3b415def83fbcb41f991d9ebf16ae4ad8b7837b3", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "security": "https://github.com/sebastianbergmann/php-timer/security/policy", - "source": "https://github.com/sebastianbergmann/php-timer/tree/7.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:09:35+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "11.5.21", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d565e2cdc21a7db9dc6c399c1fc2083b8010f289" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d565e2cdc21a7db9dc6c399c1fc2083b8010f289", - "reference": "d565e2cdc21a7db9dc6c399c1fc2083b8010f289", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "ext-xmlwriter": "*", - "myclabs/deep-copy": "^1.13.1", - "phar-io/manifest": "^2.0.4", - "phar-io/version": "^3.2.1", - "php": ">=8.2", - "phpunit/php-code-coverage": "^11.0.9", - "phpunit/php-file-iterator": "^5.1.0", - "phpunit/php-invoker": "^5.0.1", - "phpunit/php-text-template": "^4.0.1", - "phpunit/php-timer": "^7.0.1", - "sebastian/cli-parser": "^3.0.2", - "sebastian/code-unit": "^3.0.3", - "sebastian/comparator": "^6.3.1", - "sebastian/diff": "^6.0.2", - "sebastian/environment": "^7.2.1", - "sebastian/exporter": "^6.3.0", - "sebastian/global-state": "^7.0.2", - "sebastian/object-enumerator": "^6.0.1", - "sebastian/type": "^5.1.2", - "sebastian/version": "^5.0.2", - "staabm/side-effects-detector": "^1.0.5" - }, - "suggest": { - "ext-soap": "To be able to generate mocks based on WSDL files" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "11.5-dev" - } - }, - "autoload": { - "files": [ - "src/Framework/Assert/Functions.php" - ], - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.21" - }, - "funding": [ - { - "url": "https://phpunit.de/sponsors.html", - "type": "custom" - }, - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", - "type": "tidelift" - } - ], - "time": "2025-05-21T12:35:00+00:00" - }, - { - "name": "sebastian/cli-parser", - "version": "3.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/cli-parser.git", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/15c5dd40dc4f38794d383bb95465193f5e0ae180", - "reference": "15c5dd40dc4f38794d383bb95465193f5e0ae180", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for parsing CLI options", - "homepage": "https://github.com/sebastianbergmann/cli-parser", - "support": { - "issues": "https://github.com/sebastianbergmann/cli-parser/issues", - "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", - "source": "https://github.com/sebastianbergmann/cli-parser/tree/3.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:41:36+00:00" - }, - { - "name": "sebastian/code-unit", - "version": "3.0.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit.git", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "reference": "54391c61e4af8078e5b276ab082b6d3c54c9ad64", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the PHP code units", - "homepage": "https://github.com/sebastianbergmann/code-unit", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit/issues", - "security": "https://github.com/sebastianbergmann/code-unit/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit/tree/3.0.3" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-19T07:56:08+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/183a9b2632194febd219bb9246eee421dad8d45e", - "reference": "183a9b2632194febd219bb9246eee421dad8d45e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "support": { - "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "security": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/security/policy", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:45:54+00:00" - }, - { - "name": "sebastian/comparator", - "version": "6.3.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "reference": "24b8fbc2c8e201bb1308e7b05148d6ab393b6959", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/diff": "^6.0", - "sebastian/exporter": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.4" - }, - "suggest": { - "ext-bcmath": "For comparing BcMath\\Number objects" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.3-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "https://github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/comparator/issues", - "security": "https://github.com/sebastianbergmann/comparator/security/policy", - "source": "https://github.com/sebastianbergmann/comparator/tree/6.3.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-07T06:57:01+00:00" - }, - { - "name": "sebastian/complexity", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/ee41d384ab1906c68852636b6de493846e13e5a0", - "reference": "ee41d384ab1906c68852636b6de493846e13e5a0", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for calculating the complexity of PHP code units", - "homepage": "https://github.com/sebastianbergmann/complexity", - "support": { - "issues": "https://github.com/sebastianbergmann/complexity/issues", - "security": "https://github.com/sebastianbergmann/complexity/security/policy", - "source": "https://github.com/sebastianbergmann/complexity/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:49:50+00:00" - }, - { - "name": "sebastian/diff", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/b4ccd857127db5d41a5b676f24b51371d76d8544", - "reference": "b4ccd857127db5d41a5b676f24b51371d76d8544", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0", - "symfony/process": "^4.2 || ^5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff", - "udiff", - "unidiff", - "unified diff" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/diff/issues", - "security": "https://github.com/sebastianbergmann/diff/security/policy", - "source": "https://github.com/sebastianbergmann/diff/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:53:05+00:00" - }, - { - "name": "sebastian/environment", - "version": "7.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/a5c75038693ad2e8d4b6c15ba2403532647830c4", - "reference": "a5c75038693ad2e8d4b6c15ba2403532647830c4", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" - }, - "suggest": { - "ext-posix": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.2-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "https://github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/environment/issues", - "security": "https://github.com/sebastianbergmann/environment/security/policy", - "source": "https://github.com/sebastianbergmann/environment/tree/7.2.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - }, - { - "url": "https://liberapay.com/sebastianbergmann", - "type": "liberapay" - }, - { - "url": "https://thanks.dev/u/gh/sebastianbergmann", - "type": "thanks_dev" - }, - { - "url": "https://tidelift.com/funding/github/packagist/sebastian/environment", - "type": "tidelift" - } - ], - "time": "2025-05-21T11:55:47+00:00" - }, - { - "name": "sebastian/exporter", - "version": "6.3.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/3473f61172093b2da7de1fb5782e1f24cc036dc3", - "reference": "3473f61172093b2da7de1fb5782e1f24cc036dc3", - "shasum": "" - }, - "require": { - "ext-mbstring": "*", - "php": ">=8.2", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "https://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/exporter/issues", - "security": "https://github.com/sebastianbergmann/exporter/security/policy", - "source": "https://github.com/sebastianbergmann/exporter/tree/6.3.0" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-12-05T09:17:50+00:00" - }, - { - "name": "sebastian/global-state", - "version": "7.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/3be331570a721f9a4b5917f4209773de17f747d7", - "reference": "3be331570a721f9a4b5917f4209773de17f747d7", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "ext-dom": "*", - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "7.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "https://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "support": { - "issues": "https://github.com/sebastianbergmann/global-state/issues", - "security": "https://github.com/sebastianbergmann/global-state/security/policy", - "source": "https://github.com/sebastianbergmann/global-state/tree/7.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:57:36+00:00" - }, - { - "name": "sebastian/lines-of-code", - "version": "3.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "reference": "d36ad0d782e5756913e42ad87cb2890f4ffe467a", - "shasum": "" - }, - "require": { - "nikic/php-parser": "^5.0", - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "3.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library for counting the lines of code in PHP source code", - "homepage": "https://github.com/sebastianbergmann/lines-of-code", - "support": { - "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/3.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T04:58:38+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "6.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/f5b498e631a74204185071eb41f33f38d64608aa", - "reference": "f5b498e631a74204185071eb41f33f38d64608aa", - "shasum": "" - }, - "require": { - "php": ">=8.2", - "sebastian/object-reflector": "^4.0", - "sebastian/recursion-context": "^6.0" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/6.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:00:13+00:00" - }, - { - "name": "sebastian/object-reflector", - "version": "4.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "reference": "6e1a43b411b2ad34146dee7524cb13a068bb35f9", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Allows reflection of object attributes, including inherited and non-public ones", - "homepage": "https://github.com/sebastianbergmann/object-reflector/", - "support": { - "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "security": "https://github.com/sebastianbergmann/object-reflector/security/policy", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/4.0.1" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:01:32+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "6.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/694d156164372abbd149a4b85ccda2e4670c0e16", - "reference": "694d156164372abbd149a4b85ccda2e4670c0e16", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "6.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "https://github.com/sebastianbergmann/recursion-context", - "support": { - "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "security": "https://github.com/sebastianbergmann/recursion-context/security/policy", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/6.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-07-03T05:10:34+00:00" - }, - { - "name": "sebastian/type", - "version": "5.1.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/type.git", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "reference": "a8a7e30534b0eb0c77cd9d07e82de1a114389f5e", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "require-dev": { - "phpunit/phpunit": "^11.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.1-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Collection of value objects that represent the types of the PHP type system", - "homepage": "https://github.com/sebastianbergmann/type", - "support": { - "issues": "https://github.com/sebastianbergmann/type/issues", - "security": "https://github.com/sebastianbergmann/type/security/policy", - "source": "https://github.com/sebastianbergmann/type/tree/5.1.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2025-03-18T13:35:50+00:00" - }, - { - "name": "sebastian/version", - "version": "5.0.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c687e3387b99f5b03b6caa64c74b63e2936ff874", - "reference": "c687e3387b99f5b03b6caa64c74b63e2936ff874", - "shasum": "" - }, - "require": { - "php": ">=8.2" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "5.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "support": { - "issues": "https://github.com/sebastianbergmann/version/issues", - "security": "https://github.com/sebastianbergmann/version/security/policy", - "source": "https://github.com/sebastianbergmann/version/tree/5.0.2" - }, - "funding": [ - { - "url": "https://github.com/sebastianbergmann", - "type": "github" - } - ], - "time": "2024-10-09T05:16:32+00:00" - }, - { - "name": "staabm/side-effects-detector", - "version": "1.0.5", - "source": { - "type": "git", - "url": "https://github.com/staabm/side-effects-detector.git", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163", - "reference": "d8334211a140ce329c13726d4a715adbddd0a163", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.4 || ^8.0" - }, - "require-dev": { - "phpstan/extension-installer": "^1.4.3", - "phpstan/phpstan": "^1.12.6", - "phpunit/phpunit": "^9.6.21", - "symfony/var-dumper": "^5.4.43", - "tomasvotruba/type-coverage": "1.0.0", - "tomasvotruba/unused-public": "1.0.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "lib/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "A static analysis tool to detect side effects in PHP code", - "keywords": [ - "static analysis" - ], - "support": { - "issues": "https://github.com/staabm/side-effects-detector/issues", - "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5" - }, - "funding": [ - { - "url": "https://github.com/staabm", - "type": "github" - } - ], - "time": "2024-10-20T05:08:20+00:00" - }, - { - "name": "theseer/tokenizer", - "version": "1.2.3", - "source": { - "type": "git", - "url": "https://github.com/theseer/tokenizer.git", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": "^7.2 || ^8.0" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Arne Blankerts", - "email": "arne@blankerts.de", - "role": "Developer" - } - ], - "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", - "support": { - "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.3" - }, - "funding": [ - { - "url": "https://github.com/theseer", - "type": "github" - } - ], - "time": "2024-03-03T12:36:25+00:00" - }, - { - "name": "yoast/phpunit-polyfills", - "version": "4.0.0", - "source": { - "type": "git", - "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", - "reference": "134921bfca9b02d8f374c48381451da1d98402f9" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/134921bfca9b02d8f374c48381451da1d98402f9", - "reference": "134921bfca9b02d8f374c48381451da1d98402f9", - "shasum": "" - }, - "require": { - "php": ">=7.1", - "phpunit/phpunit": "^7.5 || ^8.0 || ^9.0 || ^11.0 || ^12.0" - }, - "require-dev": { - "php-parallel-lint/php-console-highlighter": "^1.0.0", - "php-parallel-lint/php-parallel-lint": "^1.4.0", - "yoast/yoastcs": "^3.1.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "4.x-dev" - } - }, - "autoload": { - "files": [ - "phpunitpolyfills-autoload.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Team Yoast", - "email": "support@yoast.com", - "homepage": "https://yoast.com" - }, - { - "name": "Contributors", - "homepage": "https://github.com/Yoast/PHPUnit-Polyfills/graphs/contributors" - } - ], - "description": "Set of polyfills for changed PHPUnit functionality to allow for creating PHPUnit cross-version compatible tests", - "homepage": "https://github.com/Yoast/PHPUnit-Polyfills", - "keywords": [ - "phpunit", - "polyfill", - "testing" - ], - "support": { - "issues": "https://github.com/Yoast/PHPUnit-Polyfills/issues", - "security": "https://github.com/Yoast/PHPUnit-Polyfills/security/policy", - "source": "https://github.com/Yoast/PHPUnit-Polyfills" - }, - "time": "2025-02-09T18:58:54+00:00" - } - ], - "aliases": [], - "minimum-stability": "stable", - "stability-flags": {}, - "prefer-stable": false, - "prefer-lowest": false, - "platform": {}, - "platform-dev": {}, - "plugin-api-version": "2.6.0" -} diff --git a/src/documentcloud/tests/Test_WP_DocumentCloud.php b/tests/Test_WP_DocumentCloud.php similarity index 100% rename from src/documentcloud/tests/Test_WP_DocumentCloud.php rename to tests/Test_WP_DocumentCloud.php diff --git a/src/documentcloud/tests/bootstrap.php b/tests/bootstrap.php similarity index 87% rename from src/documentcloud/tests/bootstrap.php rename to tests/bootstrap.php index c1c959b..533b593 100644 --- a/src/documentcloud/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -5,7 +5,7 @@ * @package Documentcloud */ - require_once dirname(dirname(dirname(dirname(__FILE__)))) . '/vendor/autoload.php'; +require_once __DIR__ . '/../vendor/autoload.php'; $_tests_dir = getenv( 'WP_TESTS_DIR' ); @@ -31,7 +31,7 @@ * Manually load the plugin being tested. */ function _manually_load_plugin() { - require dirname( dirname( __FILE__ ) ) . '/documentcloud.php'; + require dirname( dirname( __FILE__ ) ) . '/src/documentcloud/documentcloud.php'; } tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );